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*, ...));
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;
+}
* 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;
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;
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;
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);
op->bufwrite = op->bufstart;
return (cnt);
}
+
+int vfprintf(FILE * op, const char *fmt, va_list ap)
+{
+ return _vfnprintf(op, ~0, fmt, ap);
+}