My slstatus configuration
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

преди 6 години
преди 6 години
преди 6 години
преди 6 години
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. /* See LICENSE file for copyright and license details. */
  2. #include <errno.h>
  3. #include <stdarg.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include "util.h"
  8. char *argv0;
  9. static void
  10. verr(const char *fmt, va_list ap)
  11. {
  12. if (argv0 && strncmp(fmt, "usage", sizeof("usage") - 1)) {
  13. fprintf(stderr, "%s: ", argv0);
  14. }
  15. vfprintf(stderr, fmt, ap);
  16. if (fmt[0] && fmt[strlen(fmt) - 1] == ':') {
  17. fputc(' ', stderr);
  18. perror(NULL);
  19. } else {
  20. fputc('\n', stderr);
  21. }
  22. }
  23. void
  24. warn(const char *fmt, ...)
  25. {
  26. va_list ap;
  27. va_start(ap, fmt);
  28. verr(fmt, ap);
  29. va_end(ap);
  30. }
  31. void
  32. die(const char *fmt, ...)
  33. {
  34. va_list ap;
  35. va_start(ap, fmt);
  36. verr(fmt, ap);
  37. va_end(ap);
  38. exit(1);
  39. }
  40. int
  41. esnprintf(char *str, size_t size, const char *fmt, ...)
  42. {
  43. va_list ap;
  44. int ret;
  45. va_start(ap, fmt);
  46. ret = vsnprintf(str, size, fmt, ap);
  47. va_end(ap);
  48. if (ret < 0) {
  49. warn("snprintf:");
  50. return -1;
  51. } else if ((size_t)ret >= size) {
  52. warn("snprintf: Output truncated");
  53. return -1;
  54. }
  55. return ret;
  56. }
  57. const char *
  58. bprintf(const char *fmt, ...)
  59. {
  60. va_list ap;
  61. int ret;
  62. va_start(ap, fmt);
  63. if ((ret = vsnprintf(buf, sizeof(buf), fmt, ap)) < 0) {
  64. warn("vsnprintf:");
  65. } else if ((size_t)ret >= sizeof(buf)) {
  66. warn("vsnprintf: Output truncated");
  67. }
  68. va_end(ap);
  69. return buf;
  70. }
  71. const char *
  72. fmt_human(size_t num, int base)
  73. {
  74. double scaled;
  75. size_t i, prefixlen;
  76. const char **prefix;
  77. const char *prefix_1000[] = { "", "k", "M", "G", "T", "P", "E", "Z", "Y" };
  78. const char *prefix_1024[] = { "", "Ki", "Mi", "Gi", "Ti", "Pi", "Ei",
  79. "Zi", "Yi" };
  80. switch (base) {
  81. case 1000:
  82. prefix = prefix_1000;
  83. prefixlen = LEN(prefix_1000);
  84. break;
  85. case 1024:
  86. prefix = prefix_1024;
  87. prefixlen = LEN(prefix_1024);
  88. break;
  89. default:
  90. warn("fmt_human: Invalid base");
  91. return NULL;
  92. }
  93. scaled = num;
  94. for (i = 0; i < prefixlen && scaled >= base; i++) {
  95. scaled /= base;
  96. }
  97. return bprintf("%.1f%s", scaled, prefix[i]);
  98. }
  99. int
  100. pscanf(const char *path, const char *fmt, ...)
  101. {
  102. FILE *fp;
  103. va_list ap;
  104. int n;
  105. if (!(fp = fopen(path, "r"))) {
  106. warn("fopen '%s':", path);
  107. return -1;
  108. }
  109. va_start(ap, fmt);
  110. n = vfscanf(fp, fmt, ap);
  111. va_end(ap);
  112. fclose(fp);
  113. return (n == EOF) ? -1 : n;
  114. }