]> granicus.if.org Git - php/commitdiff
- Add [v]slprintf to overcome the returnvalues issue of snprintf
authorMarcus Boerger <helly@php.net>
Sat, 24 Feb 2007 18:20:46 +0000 (18:20 +0000)
committerMarcus Boerger <helly@php.net>
Sat, 24 Feb 2007 18:20:46 +0000 (18:20 +0000)
main/snprintf.c
main/snprintf.h

index d0376a6ce5bdda321953f26af8c6403a5d149b7b..8cbd88b112bb446d483242e7044cf7d4eaac2596 100644 (file)
@@ -1161,6 +1161,34 @@ static void strx_printv(int *ccp, char *buf, size_t len, const char *format,
 }
 
 
+PHPAPI int ap_php_slprintf(char *buf, size_t len, const char *format,...)
+{
+       int cc;
+       va_list ap;
+
+       va_start(ap, format);
+       strx_printv(&cc, buf, len, format, ap);
+       va_end(ap);
+       if (cc >= len) {
+               cc = len -1;
+               buf[cc] = '\0';
+       }
+       return cc;
+}
+
+
+PHPAPI int ap_php_vslprintf(char *buf, size_t len, const char *format, va_list ap)
+{
+       int cc;
+
+       strx_printv(&cc, buf, len, format, ap);
+       if (cc >= len) {
+               cc = len -1;
+               buf[cc] = '\0';
+       }
+       return cc;
+}
+
 PHPAPI int ap_php_snprintf(char *buf, size_t len, const char *format,...)
 {
        int cc;
index 8e66c458baafa2c07348556b2e102ee0451f6720..ef6757d1665cb533d576973f15f1b3e2b44ef002 100644 (file)
@@ -21,7 +21,7 @@
 
 /*
 
-Comparing: sprintf, snprintf, spprintf 
+Comparing: sprintf, snprintf, slprintf, spprintf 
 
 sprintf  offers the ability to make a lot of failures since it does not know
          the size of the buffer it uses. Therefore usage of sprintf often
@@ -36,6 +36,11 @@ snprintf knows the buffers size and will not write behind it. But you will
          A bad thing is having a big maximum while in most cases you would
          only need a small buffer. If the size of the resulting string is 
          longer or equal to the buffer size than the buffer is not terminated.
+         The function also returns the number of chars not including the 
+         terminating \0 that were needed to fully comply to the print request.
+
+slprintf same as snprintf with the difference that it actually returns the 
+         length printed not including the terminating \0.
 
 spprintf is the dynamical version of snprintf. It allocates the buffer in size
          as needed and allows a maximum setting as snprintf (turn this feature
@@ -73,6 +78,8 @@ typedef enum {
 
 
 BEGIN_EXTERN_C()
+PHPAPI int ap_php_slprintf(char *buf, size_t len, const char *format,...) PHP_ATTRIBUTE_FORMAT(printf, 3, 4);
+PHPAPI int ap_php_vslprintf(char *buf, size_t len, const char *format, va_list ap) PHP_ATTRIBUTE_FORMAT(printf, 3, 0);
 PHPAPI int ap_php_snprintf(char *, size_t, const char *, ...) PHP_ATTRIBUTE_FORMAT(printf, 3, 4);
 PHPAPI int ap_php_vsnprintf(char *, size_t, const char *, va_list ap) PHP_ATTRIBUTE_FORMAT(printf, 3, 0);
 PHPAPI int php_sprintf (char* s, const char* format, ...) PHP_ATTRIBUTE_FORMAT(printf, 2, 3);
@@ -82,6 +89,16 @@ PHPAPI char * php_conv_fp(register char format, register double num,
 
 END_EXTERN_C()
 
+#ifdef slprintf
+#undef slprintf
+#endif
+#define slprintf ap_php_slprintf
+
+#ifdef vslprintf
+#undef vslprintf
+#endif
+#define vslprintf ap_php_vslprintf
+
 #ifdef snprintf
 #undef snprintf
 #endif