Xinqi Bao's Git
5936a6de0f78fff57e522702c129b57824e0f6dd
1 /* See LICENSE file for copyright and license details. */
13 verr(const char *fmt
, va_list ap
)
15 if (argv0
&& strncmp(fmt
, "usage", sizeof("usage") - 1)) {
16 fprintf(stderr
, "%s: ", argv0
);
19 vfprintf(stderr
, fmt
, ap
);
21 if (fmt
[0] && fmt
[strlen(fmt
) - 1] == ':') {
30 warn(const char *fmt
, ...)
40 die(const char *fmt
, ...)
52 esnprintf(char *str
, size_t size
, const char *fmt
, ...)
58 ret
= vsnprintf(str
, size
, fmt
, ap
);
64 } else if ((size_t)ret
>= size
) {
65 warn("snprintf: Output truncated");
73 bprintf(const char *fmt
, ...)
79 if ((ret
= vsnprintf(buf
, sizeof(buf
), fmt
, ap
)) < 0) {
81 } else if ((size_t)ret
>= sizeof(buf
)) {
82 warn("vsnprintf: Output truncated");
90 fmt_human_2(size_t num
, char *unit
)
94 const char *prefix
[] = { "", "Ki", "Mi", "Gi", "Ti", "Pi", "Ei",
98 for (i
= 0; i
< LEN(prefix
) && scaled
>= 1024; i
++) {
102 return bprintf("%.1f%s%s", scaled
, prefix
[i
], unit
);
106 fmt_human_10(size_t num
, char *unit
)
110 const char *prefix
[] = { "", "K", "M", "G", "T", "P", "E",
114 for (i
= 0; i
< LEN(prefix
) && scaled
>= 1000; i
++) {
118 return bprintf("%.1f%s%s", scaled
, prefix
[i
], unit
);
122 pscanf(const char *path
, const char *fmt
, ...)
128 if (!(fp
= fopen(path
, "r"))) {
129 warn("fopen '%s':", path
);
133 n
= vfscanf(fp
, fmt
, ap
);
137 return (n
== EOF
) ? -1 : n
;