Xinqi Bao's Git
1 /* See LICENSE file for copyright and license details. */
14 verr(const char *fmt
, va_list ap
)
16 if (argv0
&& strncmp(fmt
, "usage", sizeof("usage") - 1)) {
17 fprintf(stderr
, "%s: ", argv0
);
20 vfprintf(stderr
, fmt
, ap
);
22 if (fmt
[0] && fmt
[strlen(fmt
) - 1] == ':') {
31 warn(const char *fmt
, ...)
41 die(const char *fmt
, ...)
53 evsnprintf(char *str
, size_t size
, const char *fmt
, va_list ap
)
57 ret
= vsnprintf(str
, size
, fmt
, ap
);
62 } else if ((size_t)ret
>= size
) {
63 warn("vsnprintf: Output truncated");
71 esnprintf(char *str
, size_t size
, const char *fmt
, ...)
77 ret
= evsnprintf(str
, size
, fmt
, ap
);
84 bprintf(const char *fmt
, ...)
90 ret
= evsnprintf(buf
, sizeof(buf
), fmt
, ap
);
93 return (ret
< 0) ? NULL
: buf
;
97 fmt_human(uintmax_t num
, int base
)
102 const char *prefix_1000
[] = { "", "k", "M", "G", "T", "P", "E", "Z",
104 const char *prefix_1024
[] = { "", "Ki", "Mi", "Gi", "Ti", "Pi", "Ei",
109 prefix
= prefix_1000
;
110 prefixlen
= LEN(prefix_1000
);
113 prefix
= prefix_1024
;
114 prefixlen
= LEN(prefix_1024
);
117 warn("fmt_human: Invalid base");
122 for (i
= 0; i
< prefixlen
&& scaled
>= base
; i
++) {
126 return bprintf("%.1f%s", scaled
, prefix
[i
]);
130 pscanf(const char *path
, const char *fmt
, ...)
136 if (!(fp
= fopen(path
, "r"))) {
137 warn("fopen '%s':", path
);
141 n
= vfscanf(fp
, fmt
, ap
);
145 return (n
== EOF
) ? -1 : n
;