99 #define INT_SPACE ((CHAR_BIT * sizeof(long)) / 2)
100 #define DBL_SPACE ((CHAR_BIT * sizeof(double)) / 2 + DBL_MAX_10_EXP)
101 #define PTR_SPACE ((CHAR_BIT * sizeof(char *)) / 2)
108 #define VBUF_SNPRINTF(bp, sz, fmt, arg) do { \
110 if (VBUF_SPACE((bp), (sz)) != 0) \
112 _ret = snprintf((char *) (bp)->ptr, (bp)->cnt, (fmt), (arg)); \
114 msg_panic("%s: output error for '%s'", myname, mystrdup(fmt)); \
115 if (_ret >= (bp)->cnt) \
116 msg_panic("%s: output for '%s' exceeds space %ld", \
117 myname, mystrdup(fmt), (long) (bp)->cnt); \
121 #define VBUF_SNPRINTF(bp, sz, fmt, arg) do { \
122 if (VBUF_SPACE((bp), (sz)) != 0) \
124 sprintf((char *) (bp)->ptr, (fmt), (arg)); \
129 #define VBUF_SKIP(bp) do { \
130 while ((bp)->cnt > 0 && *(bp)->ptr) \
131 (bp)->ptr++, (bp)->cnt--; \
134 #define VSTRING_ADDNUM(vp, n) do { \
135 VBUF_SNPRINTF(&(vp)->vbuf, INT_SPACE, "%d", n); \
138 #define VBUF_STRCAT(bp, s) do { \
139 unsigned char *_cp = (unsigned char *) (s); \
141 while ((_ch = *_cp++) != 0) \
142 VBUF_PUT((bp), _ch); \
149 const char *myname =
"vbuf_print";
157 int saved_errno = errno;
169 for (cp = (
unsigned char *) format; *cp; cp++) {
172 }
else if (cp[1] ==
'%') {
197 width = va_arg(ap,
int);
199 msg_warn(
"%s: bad width %d in %.50s",
200 myname, width, format);
206 for (width = 0; ch = *cp,
ISDIGIT(ch); cp++) {
207 int digit = ch -
'0';
209 if (width > INT_MAX / 10
210 || (width *= 10) > INT_MAX - digit)
211 msg_panic(
"%s: bad width %d... in %.50s",
212 myname, width, format);
220 prec = va_arg(ap,
int);
222 msg_warn(
"%s: bad precision %d in %.50s",
223 myname, prec, format);
229 for (prec = 0; ch = *cp,
ISDIGIT(ch); cp++) {
230 int digit = ch -
'0';
232 if (prec > INT_MAX / 10
233 || (prec *= 10) > INT_MAX - digit)
234 msg_panic(
"%s: bad precision %d... in %.50s",
235 myname, prec, format);
243 if ((long_flag = (*cp ==
'l')) != 0)
259 msg_panic(
"%s: %%l%c is not supported", myname, *cp);
260 s = va_arg(ap,
char *);
261 if (prec >= 0 || (width > 0 && width > strlen(s))) {
270 msg_panic(
"%s: %%l%c is not supported", myname, *cp);
297 msg_panic(
"%s: %%l%c is not supported", myname, *cp);
302 msg_panic(
"vbuf_print: unknown format type: %c", *cp);
317 int main(
int argc,
char **argv)
327 if (args->
argc == 0 || *(cp = args->
argv[0]) ==
'#') {
329 }
else if (args->
argc != 2 || *cp !=
'%') {
336 cp += strspn(cp,
"+-*0123456789.");
337 if ((lflag = (*cp ==
'l')) != 0)
340 msg_warn(
"bad format: \"%s\"", fmt);
343 char *val = args->
argv[1];
346 #ifdef CA_VSTRING_CTL_EXACT
372 msg_warn(
"bad format: \"%s\"", fmt);
#define vstring_fgets_nonl(s, p)
#define CA_VSTRING_CTL_END
ARGV * argv_free(ARGV *argvp)
NORETURN msg_panic(const char *fmt,...)
int main(int argc, char **argv)
void vstring_ctl(VSTRING *vp,...)
#define VSTRING_TERMINATE(vp)
#define VSTRING_ADDCH(vp, ch)
#define VSTRING_RESET(vp)
void msg_warn(const char *fmt,...)
VSTRING * vstring_alloc(ssize_t len)
VSTRING * vstring_sprintf(VSTRING *vp, const char *format,...)
#define VBUF_STRCAT(bp, s)
#define CA_VSTRING_CTL_EXACT
ARGV * argv_split(const char *, const char *)
VBUF * vbuf_print(VBUF *bp, const char *format, va_list ap)
#define VBUF_SNPRINTF(bp, sz, fmt, arg)
VSTRING * vstring_free(VSTRING *vp)
#define VSTRING_ADDNUM(vp, n)
void msg_vstream_init(const char *name, VSTREAM *vp)
void msg_info(const char *fmt,...)