snprintf: first cut at snprintf and friends
authorAlan Cox <alan@linux.intel.com>
Fri, 13 Feb 2015 15:24:18 +0000 (15:24 +0000)
committerAlan Cox <alan@linux.intel.com>
Fri, 13 Feb 2015 15:24:18 +0000 (15:24 +0000)
Library/include/stdio.h
Library/libs/sprintf.c
Library/libs/vfprintf.c

index 79edc65..69d41bb 100644 (file)
@@ -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*, ...));
index 8c28f19..ec6ff98 100644 (file)
@@ -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;
+}
index 4323dcb..3e7a28a 100644 (file)
@@ -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);
+}