From: Alan Cox Date: Fri, 13 Feb 2015 15:24:18 +0000 (+0000) Subject: snprintf: first cut at snprintf and friends X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=a12ddc277bff2cd637cb0ea8f4bacd1e4d028b8f;p=FUZIX.git snprintf: first cut at snprintf and friends --- diff --git a/Library/include/stdio.h b/Library/include/stdio.h index 79edc650..69d41bbe 100644 --- a/Library/include/stdio.h +++ b/Library/include/stdio.h @@ -125,10 +125,13 @@ extern int fsetpos __P((FILE *fp, fpos_t *pos)); extern int printf __P((const char*, ...)); extern int fprintf __P((FILE*, const char*, ...)); extern int sprintf __P((char*, const char*, ...)); +extern int snprintf __P((char*, size_t, const char*, ...)); extern int vprintf __P((const char*, va_list)); extern int vfprintf __P((FILE*, const char*, va_list)); +extern int _vfnprintf __P((FILE*, size_t, const char*, va_list)); extern int vsprintf __P((char*, const char*, va_list)); +extern int vsnprintf __P((char*, size_t, const char*, va_list)); extern int scanf __P((const char*, ...)); extern int fscanf __P((FILE*, const char*, ...)); diff --git a/Library/libs/sprintf.c b/Library/libs/sprintf.c index 8c28f198..ec6ff980 100644 --- a/Library/libs/sprintf.c +++ b/Library/libs/sprintf.c @@ -30,8 +30,41 @@ int sprintf(char *sp, const char *fmt, ...) va_start(ptr, fmt); string->bufpos = (unsigned char *) sp; - rv = vfprintf(string, fmt, ptr); + rv = _vfnprintf(string, ~0, fmt, ptr); va_end(ptr); *(string->bufpos) = 0; return rv; } + +int snprintf(char *sp, size_t size, const char *fmt, ...) +{ + va_list ptr; + int rv; + + va_start(ptr, fmt); + string->bufpos = (unsigned char *) sp; + rv = _vfnprintf(string, size, fmt, ptr); + va_end(ptr); + *(string->bufpos) = 0; + return rv; +} + +int vsnprintf(char *sp, size_t size, const char *fmt, va_list ptr) +{ + int rv; + + string->bufpos = (unsigned char *) sp; + rv = _vfnprintf(string, size, fmt, ptr); + *(string->bufpos) = 0; + return rv; +} + +int vsprintf(char *sp, const char *fmt, va_list ptr) +{ + int rv; + + string->bufpos = (unsigned char *) sp; + rv = _vfnprintf(string, ~0, fmt, ptr); + *(string->bufpos) = 0; + return rv; +} diff --git a/Library/libs/vfprintf.c b/Library/libs/vfprintf.c index 4323dcb8..3e7a28a8 100644 --- a/Library/libs/vfprintf.c +++ b/Library/libs/vfprintf.c @@ -22,7 +22,7 @@ extern void _fnum(double val, char fmt, int prec, char *ptmp); * Output the given field in the manner specified by the arguments. Return * the number of characters output. */ -static int prtfld(FILE * op, unsigned char *buf, int ljustf, char sign, +static int prtfld(FILE * op, size_t maxlen, size_t ct, unsigned char *buf, int ljustf, char sign, char pad, int width, int preci, int buffer_mode) { register unsigned char ch; @@ -59,14 +59,15 @@ static int prtfld(FILE * op, unsigned char *buf, int ljustf, char sign, ch = pad; /* right padding */ --width; } - putc(ch, op); + if (ct++ < maxlen) + putc(ch, op); if (ch == '\n' && buffer_mode == _IOLBF) fflush(op); } return (cnt); } -int vfprintf(FILE * op, const char *fmt, va_list ap) +int _vfnprintf(FILE * op, size_t maxlen, const char *fmt, va_list ap) { register int i, ljustf, lval, preci, dpoint, width, radix, cnt = 0; char pad, sign, hash; @@ -223,7 +224,7 @@ int vfprintf(FILE * op, const char *fmt, va_list ap) chrpad:sign = '\0'; printit:cnt += - prtfld(op, (unsigned char *) ptmp, + prtfld(op, maxlen, cnt, (unsigned char *) ptmp, ljustf, sign, pad, width, preci, buffer_mode); break; @@ -249,8 +250,10 @@ int vfprintf(FILE * op, const char *fmt, va_list ap) goto charout; } } else { - charout:putc(*fmt, op); - /* normal char out */ + charout: + /* normal char out */ + if (cnt < maxlen) + putc(*fmt, op); ++cnt; if (*fmt == '\n' && buffer_mode == _IOLBF) fflush(op); @@ -264,3 +267,8 @@ int vfprintf(FILE * op, const char *fmt, va_list ap) op->bufwrite = op->bufstart; return (cnt); } + +int vfprintf(FILE * op, const char *fmt, va_list ap) +{ + return _vfnprintf(op, ~0, fmt, ap); +}