]> granicus.if.org Git - php/commitdiff
Implement fprintf() and vfprintf().
authorWez Furlong <wez@php.net>
Thu, 9 Jan 2003 17:29:31 +0000 (17:29 +0000)
committerWez Furlong <wez@php.net>
Thu, 9 Jan 2003 17:29:31 +0000 (17:29 +0000)
Add a couple of tests.

ext/standard/basic_functions.c
ext/standard/basic_functions.h
ext/standard/formatted_print.c
tests/strings/002.phpt

index 70054b93c7fd81b28f5c920a483130a72ef5efe8..1dbeaf5d9d7f67e61fdb9af4959e9ffae53014c5 100644 (file)
@@ -387,6 +387,8 @@ function_entry basic_functions[] = {
        PHP_NAMED_FE(printf,                    PHP_FN(user_printf),                                    NULL)
        PHP_FE(vprintf,                                                                                                                 NULL)
        PHP_FE(vsprintf,                                                                                                                NULL)
+       PHP_FE(fprintf,                                                                                                                 NULL)
+       PHP_FE(vfprintf,                                                                                                                NULL)
        PHP_FE(sscanf,                                  third_and_rest_force_ref)
        PHP_FE(fscanf,                                  third_and_rest_force_ref)
        PHP_FE(parse_url,                                                                                                               NULL)
index a1d86ce2fd60ff4dfaee72aa4b873dc88783a2ce..1ed6ff05d6fd3824ad4c98cdd2f61d9ff371e269 100644 (file)
@@ -83,6 +83,8 @@ PHP_FUNCTION(set_include_path);
 PHP_FUNCTION(restore_include_path);
 
 PHP_FUNCTION(print_r);
+PHP_FUNCTION(fprintf);
+PHP_FUNCTION(vfprintf);
 
 PHP_FUNCTION(connection_aborted);
 PHP_FUNCTION(connection_status);
index 84c96d2751e44dd42dc094565204842200c39171..d5bd95c4b79d93416b016092d4b1112c35820392 100644 (file)
@@ -452,9 +452,9 @@ php_sprintf_getnumber(char *buffer, int *pos)
  *
  */
 static char *
-php_formatted_print(int ht, int *len, int use_array TSRMLS_DC)
+php_formatted_print(int ht, int *len, int use_array, int format_offset TSRMLS_DC)
 {
-       zval ***args, **z_format, **array;
+       zval ***args, **z_format;
        int argc, size = 240, inpos = 0, outpos = 0, temppos;
        int alignment, width, precision, currarg, adjusting, argnum;
        char *format, *result, padding;
@@ -462,39 +462,49 @@ php_formatted_print(int ht, int *len, int use_array TSRMLS_DC)
 
        argc = ZEND_NUM_ARGS();
 
+       /* verify the number of args */
+       if ((use_array && argc != (2 + format_offset)) 
+                       || (!use_array && argc < (1 + format_offset))) {
+               WRONG_PARAM_COUNT_WITH_RETVAL(NULL);
+       }
+       args = (zval ***)emalloc(argc * sizeof(zval *));
+
+       if (zend_get_parameters_array_ex(argc, args) == FAILURE) {
+               efree(args);
+               WRONG_PARAM_COUNT_WITH_RETVAL(NULL);
+       }
+       
        if (use_array) {
                int i = 1;
+               zval ***newargs;
+               zval **array;
 
-               if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(argc, &z_format, &array) == FAILURE) {
-                       WRONG_PARAM_COUNT_WITH_RETVAL(NULL);
-               }
+               z_format = args[format_offset];
+               array = args[1 + format_offset];
+               
                SEPARATE_ZVAL(array);
                convert_to_array_ex(array);
+               
                argc = 1 + zend_hash_num_elements(Z_ARRVAL_PP(array));
-               args = (zval ***)emalloc(argc * sizeof(zval *));
-               args[0] = z_format;
+               newargs = (zval ***)emalloc(argc * sizeof(zval *));
+               newargs[0] = z_format;
+               
                for (zend_hash_internal_pointer_reset(Z_ARRVAL_PP(array));
-                        zend_hash_get_current_data(Z_ARRVAL_PP(array), (void **)&args[i++]) == SUCCESS;
+                        zend_hash_get_current_data(Z_ARRVAL_PP(array), (void **)&newargs[i++]) == SUCCESS;
                         zend_hash_move_forward(Z_ARRVAL_PP(array)));
-       } else {
-               if (argc < 1) {
-                       WRONG_PARAM_COUNT_WITH_RETVAL(NULL);
-               }
-
-               args = (zval ***)emalloc(argc * sizeof(zval *));
 
-               if (zend_get_parameters_array_ex(argc, args) == FAILURE) {
-                       efree(args);
-                       WRONG_PARAM_COUNT_WITH_RETVAL(NULL);
-               }
+               efree(args);
+               args = newargs;
+               format_offset = 0;
        }
-       convert_to_string_ex(args[0]);
-       format = Z_STRVAL_PP(args[0]);
+       
+       convert_to_string_ex(args[format_offset]);
+       format = Z_STRVAL_PP(args[format_offset]);
        result = emalloc(size);
 
        currarg = 1;
 
-       while (inpos<Z_STRLEN_PP(args[0])) {
+       while (inpos<Z_STRLEN_PP(args[format_offset])) {
                int expprec = 0;
 
                PRINTF_DEBUG(("sprintf: format[%d]='%c'\n", inpos, format[inpos]));
@@ -538,6 +548,9 @@ php_formatted_print(int ht, int *len, int use_array TSRMLS_DC)
                                } else {
                                        argnum = currarg++;
                                }
+
+                               argnum += format_offset;
+                               
                                if (argnum >= argc) {
                                        efree(result);
                                        efree(args);
@@ -596,7 +609,7 @@ php_formatted_print(int ht, int *len, int use_array TSRMLS_DC)
                                PRINTF_DEBUG(("sprintf: precision=%d\n", precision));
                        } else {
                                width = precision = 0;
-                               argnum = currarg++;
+                               argnum = currarg++ + format_offset;
                        }
 
                        if (format[inpos] == 'l') {
@@ -708,11 +721,10 @@ PHP_FUNCTION(user_sprintf)
        char *result;
        int len;
        
-       if ((result=php_formatted_print(ht, &len, 0 TSRMLS_CC))==NULL) {
+       if ((result=php_formatted_print(ht, &len, 0, 0 TSRMLS_CC))==NULL) {
                RETURN_FALSE;
        }
-       RETVAL_STRINGL(result, len, 1);
-       efree(result);
+       RETVAL_STRINGL(result, len, 0);
 }
 /* }}} */
 
@@ -723,11 +735,10 @@ PHP_FUNCTION(vsprintf)
        char *result;
        int len;
        
-       if ((result=php_formatted_print(ht, &len, 1 TSRMLS_CC))==NULL) {
+       if ((result=php_formatted_print(ht, &len, 1, 0 TSRMLS_CC))==NULL) {
                RETURN_FALSE;
        }
-       RETVAL_STRINGL(result, len, 1);
-       efree(result);
+       RETVAL_STRINGL(result, len, 0);
 }
 /* }}} */
 
@@ -738,7 +749,7 @@ PHP_FUNCTION(user_printf)
        char *result;
        int len;
        
-       if ((result=php_formatted_print(ht, &len, 0 TSRMLS_CC))==NULL) {
+       if ((result=php_formatted_print(ht, &len, 0, 0 TSRMLS_CC))==NULL) {
                RETURN_FALSE;
        }
        PHPWRITE(result, len);
@@ -753,7 +764,7 @@ PHP_FUNCTION(vprintf)
        char *result;
        int len;
        
-       if ((result=php_formatted_print(ht, &len, 1 TSRMLS_CC))==NULL) {
+       if ((result=php_formatted_print(ht, &len, 1, 0 TSRMLS_CC))==NULL) {
                RETURN_FALSE;
        }
        PHPWRITE(result, len);
@@ -761,6 +772,68 @@ PHP_FUNCTION(vprintf)
 }
 /* }}} */
 
+/* {{{ proto int fprintf(resource stream, string format [, mixed arg1 [, mixed ...]])
+   Output a formatted string into a stream */
+PHP_FUNCTION(fprintf)
+{
+       php_stream *stream;
+       zval **arg1;
+       char *result;
+       int len;
+       
+       if (ZEND_NUM_ARGS() < 2) {
+               WRONG_PARAM_COUNT;
+       }
+       
+       if (zend_get_parameters_ex(1, &arg1)==FAILURE) {
+               RETURN_FALSE;
+       }
+       
+       php_stream_from_zval(stream, arg1);
+
+       if ((result=php_formatted_print(ht, &len, 0, 1 TSRMLS_CC))==NULL) {
+               RETURN_FALSE;
+       }
+
+       php_stream_write(stream, result, len);
+
+       efree(result);
+
+       RETVAL_LONG(len - 1);
+}
+
+/* {{{ proto int vfprintf(resource stream, string format, array args)
+   Output a formatted string into a stream */
+PHP_FUNCTION(vfprintf)
+{
+       php_stream *stream;
+       zval **arg1;
+       char *result;
+       int len;
+       
+       if (ZEND_NUM_ARGS() != 3) {
+               WRONG_PARAM_COUNT;
+       }
+       
+       if (zend_get_parameters_ex(1, &arg1)==FAILURE) {
+               RETURN_FALSE;
+       }
+       
+       php_stream_from_zval(stream, arg1);
+
+       if ((result=php_formatted_print(ht, &len, 1, 1 TSRMLS_CC))==NULL) {
+               RETURN_FALSE;
+       }
+
+       php_stream_write(stream, result, len);
+
+       efree(result);
+
+       RETVAL_LONG(len - 1);
+}
+
+
+
 /*
  * Local variables:
  * tab-width: 4
index 4b89506b7b95d2b6c924792217e4578113660352..cadb5b0eb5aa16fe4c31b8825512b5c894cbf2a2 100644 (file)
@@ -39,6 +39,13 @@ printf("printf test 27:%3\$d %d %d\n", 1, 2, 3);
 printf("printf test 28:%2\$02d %1\$2d\n", 1, 2);
 printf("printf test 29:%2\$-2d %1\$2d\n", 1, 2);
 print("printf test 30:"); printf("%0\$s", 1); print("x\n");
+vprintf("vprintf test 1:%2\$-2d %1\$2d\n", array(1, 2));
+
+$fp = fopen("php://stdout", "w") or die("Arrggsgg!!");
+$x = fprintf($fp, "fprintf test 1:%.5s\n", "abcdefghij");
+var_dump($x);
+fclose($fp);
+
 
 ?>
 --EXPECT--
@@ -74,3 +81,6 @@ printf test 27:3 1 2
 printf test 28:02  1
 printf test 29:2   1
 printf test 30:x
+vprintf test 1:2   1
+fprintf test 1:abcde
+int(20)