helly           Sat Sep 13 12:49:26 2003 EDT

  Modified files:              
    /php-src/main       snprintf.c spprintf.c 
  Log:
  - Fix %p to prepend '0x' as suggested by C99.
  - Add 'z' prefix.
  # Now you can use '%zd' in [v]spprintf() and everything that utilizes it
  # like error messages BUT you still cannot rely on it in [v]s[n]printf() 
  # calls.
  
  
Index: php-src/main/snprintf.c
diff -u php-src/main/snprintf.c:1.27 php-src/main/snprintf.c:1.28
--- php-src/main/snprintf.c:1.27        Fri Aug  8 15:48:33 2003
+++ php-src/main/snprintf.c     Sat Sep 13 12:49:24 2003
@@ -16,7 +16,7 @@
   +----------------------------------------------------------------------+
 */
 
-/* $Id: snprintf.c,v 1.27 2003/08/08 19:48:33 helly Exp $ */
+/* $Id: snprintf.c,v 1.28 2003/09/13 16:49:24 helly Exp $ */
 
 /* ====================================================================
  * Copyright (c) 1995-1998 The Apache Group.  All rights reserved.
@@ -578,6 +578,7 @@
         * Flag variables
         */
        boolean_e is_long;
+       boolean_e is_size_t;
        boolean_e alternate_form;
        boolean_e print_sign;
        boolean_e print_blank;
@@ -670,9 +671,16 @@
                         */
                        if (*fmt == 'l') {
                                is_long = YES;
+                               is_size_t = NO;
                                fmt++;
-                       } else
+                       } else if (*fmt == 'z') {
+                               is_size_t = YES;
+                               is_long = NO;
+                               fmt++;
+                       } else {
+                               is_size_t = NO;
                                is_long = NO;
+                       }
 
                        /*
                         * Argument extraction and printing.
@@ -689,6 +697,8 @@
                                case 'u':
                                        if (is_long)
                                                i_num = va_arg(ap, u_wide_int);
+                                       else if (is_size_t)
+                                               i_num = (wide_int) va_arg(ap, size_t);
                                        else
                                                i_num = (wide_int) va_arg(ap, unsigned 
int);
                                        /*
@@ -703,6 +713,8 @@
                                        if ((*fmt) != 'u') {
                                                if (is_long)
                                                        i_num = va_arg(ap, wide_int);
+                                               else if (is_size_t)
+                                                       i_num = (wide_int) va_arg(ap, 
size_t);
                                                else
                                                        i_num = (wide_int) va_arg(ap, 
int);
                                        };
@@ -724,6 +736,8 @@
                                case 'o':
                                        if (is_long)
                                                ui_num = va_arg(ap, u_wide_int);
+                                       else if (is_size_t)
+                                               ui_num = (u_wide_int) va_arg(ap, 
size_t);
                                        else
                                                ui_num = (u_wide_int) va_arg(ap, 
unsigned int);
                                        s = ap_php_conv_p2(ui_num, 3, *fmt,
@@ -740,6 +754,8 @@
                                case 'X':
                                        if (is_long)
                                                ui_num = (u_wide_int) va_arg(ap, 
u_wide_int);
+                                       else if (is_size_t)
+                                               ui_num = (u_wide_int) va_arg(ap, 
size_t);
                                        else
                                                ui_num = (u_wide_int) va_arg(ap, 
unsigned int);
                                        s = ap_php_conv_p2(ui_num, 4, *fmt,
@@ -848,12 +864,16 @@
                                         * we print "%p" to indicate that we don't 
handle "%p".
                                         */
                                case 'p':
-                                       ui_num = (u_wide_int) va_arg(ap, char *);
-
-                                       if (sizeof(char *) <= sizeof(u_wide_int))
-                                                s = ap_php_conv_p2(ui_num, 4, 'x',
-                                                                        
&num_buf[NUM_BUF_SIZE], &s_len);
-                                       else {
+                                       if (sizeof(char *) <= sizeof(u_wide_int)) {
+                                               ui_num = (u_wide_int) va_arg(ap, char 
*);
+                                               s = ap_php_conv_p2(ui_num, 4, 'x', 
+                                                               
&num_buf[NUM_BUF_SIZE], &s_len);
+                                               if (i_num != 0) {
+                                                       *--s = 'x';
+                                                       *--s = '0';
+                                                       s_len += 2;
+                                               }
+                                       } else {
                                                s = "%p";
                                                s_len = 2;
                                        }
Index: php-src/main/spprintf.c
diff -u php-src/main/spprintf.c:1.16 php-src/main/spprintf.c:1.17
--- php-src/main/spprintf.c:1.16        Tue Jun 10 16:03:42 2003
+++ php-src/main/spprintf.c     Sat Sep 13 12:49:24 2003
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: spprintf.c,v 1.16 2003/06/10 20:03:42 imajes Exp $ */
+/* $Id: spprintf.c,v 1.17 2003/09/13 16:49:24 helly Exp $ */
 
 /* This is the spprintf implementation.
  * It has emerged from apache snprintf. See original header:
@@ -187,6 +187,7 @@
         * Flag variables
         */
        boolean_e is_long;
+       boolean_e is_size_t;
        boolean_e alternate_form;
        boolean_e print_sign;
        boolean_e print_blank;
@@ -276,9 +277,16 @@
                         */
                        if (*fmt == 'l') {
                                is_long = YES;
+                               is_size_t = NO;
                                fmt++;
-                       } else
+                       } else if (*fmt == 'z') {
+                               is_size_t = YES;
+                               is_long = NO;
+                               fmt++;
+                       } else {
+                               is_size_t = NO;
                                is_long = NO;
+                       }
 
                        /*
                         * Argument extraction and printing.
@@ -295,6 +303,8 @@
                                case 'u':
                                        if (is_long)
                                                i_num = va_arg(ap, u_wide_int);
+                                       else if (is_size_t)
+                                               i_num = (wide_int) va_arg(ap, size_t);
                                        else
                                                i_num = (wide_int) va_arg(ap, unsigned 
int);
                                        /*
@@ -309,6 +319,8 @@
                                        if ((*fmt) != 'u') {
                                                if (is_long)
                                                        i_num = va_arg(ap, wide_int);
+                                               else if (is_size_t)
+                                                       i_num = (wide_int) va_arg(ap, 
size_t);
                                                else
                                                        i_num = (wide_int) va_arg(ap, 
int);
                                        };
@@ -330,6 +342,8 @@
                                case 'o':
                                        if (is_long)
                                                ui_num = va_arg(ap, u_wide_int);
+                                       else if (is_size_t)
+                                               ui_num = (u_wide_int) va_arg(ap, 
size_t);
                                        else
                                                ui_num = (u_wide_int) va_arg(ap, 
unsigned int);
                                        s = ap_php_conv_p2(ui_num, 3, *fmt,
@@ -344,8 +358,13 @@
 
                                case 'x':
                                case 'X':
+                                       /*
+                                        * Get the arg if we haven't already.
+                                        */
                                        if (is_long)
                                                ui_num = (u_wide_int) va_arg(ap, 
u_wide_int);
+                                       else if (is_size_t)
+                                               ui_num = (u_wide_int) va_arg(ap, 
size_t);
                                        else
                                                ui_num = (u_wide_int) va_arg(ap, 
unsigned int);
                                        s = ap_php_conv_p2(ui_num, 4, *fmt,
@@ -454,11 +473,16 @@
                                         * we print "%p" to indicate that we don't 
handle "%p".
                                         */
                                case 'p':
-                                       ui_num = (u_wide_int) va_arg(ap, char *);
-
-                                       if (sizeof(char *) <= sizeof(u_wide_int))
-                                               s = ap_php_conv_p2(ui_num, 4, 'x', 
&num_buf[NUM_BUF_SIZE], &s_len);
-                                       else {
+                                       if (sizeof(char *) <= sizeof(u_wide_int)) {
+                                               ui_num = (u_wide_int) va_arg(ap, char 
*);
+                                               s = ap_php_conv_p2(ui_num, 4, 'x', 
+                                                               
&num_buf[NUM_BUF_SIZE], &s_len);
+                                               if (i_num != 0) {
+                                                       *--s = 'x';
+                                                       *--s = '0';
+                                                       s_len += 2;
+                                               }
+                                       } else {
                                                s = "%p";
                                                s_len = 2;
                                        }

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

Reply via email to