sas             Sat Sep 21 11:08:59 2002 EDT

  Modified files:              
    /php4/ext/standard  formatted_print.c 
  Log:
  Add '+' modifier.
  
         +      A sign (+ or -) always be placed  before  a  number
                produced by a signed conversion.  By default a sign
                is used only for negative numbers. A + overrides  a
                space if both are used.
  
  
  
Index: php4/ext/standard/formatted_print.c
diff -u php4/ext/standard/formatted_print.c:1.52 
php4/ext/standard/formatted_print.c:1.53
--- php4/ext/standard/formatted_print.c:1.52    Fri Aug 23 21:19:28 2002
+++ php4/ext/standard/formatted_print.c Sat Sep 21 11:08:59 2002
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: formatted_print.c,v 1.52 2002/08/24 01:19:28 helly Exp $ */
+/* $Id: formatted_print.c,v 1.53 2002/09/21 15:08:59 sas Exp $ */
 
 #include <math.h>                              /* modf() */
 #include "php.h"
@@ -200,7 +200,8 @@
 
 inline static void
 php_sprintf_appendint(char **buffer, int *pos, int *size, long number,
-                                               int width, char padding, int alignment)
+                                               int width, char padding, int 
+alignment, 
+                                               int always_sign)
 {
        char numbuf[NUM_BUF_SIZE];
        register unsigned long magn, nmagn;
@@ -229,6 +230,8 @@
        while (magn > 0 && i > 0);
        if (neg) {
                numbuf[--i] = '-';
+       } else if (always_sign) {
+               numbuf[--i] = '+';
        }
        PRINTF_DEBUG(("sprintf: appending %d as \"%s\", i=%d\n",
                                  number, &numbuf[i], i));
@@ -240,7 +243,7 @@
 inline static void
 php_sprintf_appenduint(char **buffer, int *pos, int *size,
                                           unsigned long number,
-                                          int width, char padding, int alignment)
+                                          int width, char padding, int alignment, int 
+always_sign)
 {
        char numbuf[NUM_BUF_SIZE];
        register unsigned long magn, nmagn;
@@ -260,8 +263,10 @@
 
                numbuf[--i] = (unsigned char)(magn - (nmagn * 10)) + '0';
                magn = nmagn;
-       }
-       while (magn > 0 && i > 0);
+       } while (magn > 0 && i > 0);
+
+       if (always_sign)
+               numbuf[--i] = '+';
        PRINTF_DEBUG(("sprintf: appending %d as \"%s\", i=%d\n", number, &numbuf[i], 
i));
        php_sprintf_appendstring(buffer, pos, size, &numbuf[i], width, 0,
                                                         padding, alignment, 
(NUM_BUF_SIZE - 1) - i, 0, 0);
@@ -272,7 +277,8 @@
                                                 int *size, double number,
                                                 int width, char padding,
                                                 int alignment, int precision,
-                                                int adjust, char fmt)
+                                                int adjust, char fmt,
+                                                int always_sign)
 {
        char numbuf[NUM_BUF_SIZE];
        char *cvt;
@@ -313,6 +319,8 @@
 
        if (sign) {
                numbuf[i++] = '-';
+       } else if (always_sign) {
+               numbuf[i++] = '+';
        }
 
        if (fmt == 'f') {
@@ -405,6 +413,7 @@
  *  "-"   left adjusted field
  *   n    field size
  *  "."n  precision (floats only)
+ *  "+"   Always place a sign (+ or -) in front of a number
  *
  * Type specifiers:
  *
@@ -426,6 +435,7 @@
        int argc, size = 240, inpos = 0, outpos = 0, temppos;
        int alignment, width, precision, currarg, adjusting, argnum;
        char *format, *result, padding;
+       int always_sign;
 
        argc = ZEND_NUM_ARGS();
 
@@ -482,6 +492,7 @@
                        alignment = ALIGN_RIGHT;
                        adjusting = 0;
                        padding = ' ';
+                       always_sign = 0;
                        inpos++;                        /* skip the '%' */
 
                        PRINTF_DEBUG(("sprintf: first looking at '%c', inpos=%d\n",
@@ -521,6 +532,8 @@
                                        } else if (format[inpos] == '-') {
                                                alignment = ALIGN_LEFT;
                                                /* space padding, the default */
+                                       } else if (format[inpos] == '+') {
+                                               always_sign = 1;
                                        } else if (format[inpos] == '\'') {
                                                padding = format[++inpos];
                                        } else {
@@ -583,14 +596,16 @@
                                        convert_to_long_ex(args[argnum]);
                                        php_sprintf_appendint(&result, &outpos, &size,
                                                                                  
Z_LVAL_PP(args[argnum]),
-                                                                                 
width, padding, alignment);
+                                                                                 
+width, padding, alignment,
+                                                                                 
+always_sign);
                                        break;
 
                                case 'u':
                                        convert_to_long_ex(args[argnum]);
                                        php_sprintf_appenduint(&result, &outpos, &size,
                                                                                  
Z_LVAL_PP(args[argnum]),
-                                                                                 
width, padding, alignment);
+                                                                                 
+width, padding, alignment,
+                                                                                 
+always_sign);
                                        break;
 
                                case 'e':
@@ -601,7 +616,7 @@
                                                                                       
  Z_DVAL_PP(args[argnum]),
                                                                                       
  width, padding, alignment,
                                                                                       
  precision, adjusting,
-                                                                                      
  format[inpos]);
+                                                                                      
+  format[inpos], always_sign);
                                        break;
 
                                case 'c':



-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to