diff options
author | Dmitry Stogov <dmitry@zend.com> | 2014-02-13 17:54:23 +0400 |
---|---|---|
committer | Dmitry Stogov <dmitry@zend.com> | 2014-02-13 17:54:23 +0400 |
commit | 40e053e7f333b5fc3f4c75c964600666810cc969 (patch) | |
tree | 3436d014c44e3eab00107e67b10229ec0262dbb6 /ext/standard/scanf.c | |
parent | 6306918ed2c9d87cf5fadc62d210a797a794926e (diff) | |
download | php-git-40e053e7f333b5fc3f4c75c964600666810cc969.tar.gz |
Use better data structures (incomplete)
Diffstat (limited to 'ext/standard/scanf.c')
-rw-r--r-- | ext/standard/scanf.c | 95 |
1 files changed, 48 insertions, 47 deletions
diff --git a/ext/standard/scanf.c b/ext/standard/scanf.c index d092bbcfcf..6ecc163a4b 100644 --- a/ext/standard/scanf.c +++ b/ext/standard/scanf.c @@ -118,7 +118,7 @@ typedef struct CharSet { static char *BuildCharSet(CharSet *cset, char *format); static int CharInSet(CharSet *cset, int ch); static void ReleaseCharSet(CharSet *cset); -static inline void scan_set_error_return(int numVars, zval **return_value); +static inline void scan_set_error_return(int numVars, zval *return_value); /* {{{ BuildCharSet @@ -577,15 +577,15 @@ error: */ PHPAPI int php_sscanf_internal( char *string, char *format, - int argCount, zval ***args, - int varStart, zval **return_value TSRMLS_DC) + int argCount, zval *args, + int varStart, zval *return_value TSRMLS_DC) { int numVars, nconversions, totalVars = -1; int i, result; long value; int objIndex; char *end, *baseString; - zval **current; + zval *current; char op = 0; int base = 0; int underflow = 0; @@ -624,7 +624,7 @@ PHPAPI int php_sscanf_internal( char *string, char *format, */ if (numVars) { for (i = varStart;i < argCount;i++){ - if ( ! PZVAL_IS_REF( *args[ i ] ) ) { + if ( ! Z_ISREF(args[ i ] ) ) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Parameter %d must be passed by reference", i); scan_set_error_return(numVars, return_value); return SCAN_ERROR_VAR_PASSED_BYVAL; @@ -637,15 +637,14 @@ PHPAPI int php_sscanf_internal( char *string, char *format, * are specified */ if (!numVars) { - zval *tmp; + zval tmp; /* allocate an array for return */ - array_init(*return_value); + array_init(return_value); for (i = 0; i < totalVars; i++) { - MAKE_STD_ZVAL(tmp); - ZVAL_NULL(tmp); - if (add_next_index_zval(*return_value, tmp) == FAILURE) { + ZVAL_NULL(&tmp); + if (add_next_index_zval(return_value, &tmp) == FAILURE) { scan_set_error_return(0, return_value); return FAILURE; } @@ -745,14 +744,15 @@ literal: } else if (numVars) { zend_uint refcount; - current = args[objIndex++]; - refcount = Z_REFCOUNT_PP(current); - zval_dtor( *current ); - ZVAL_LONG( *current, (long)(string - baseString) ); - Z_SET_REFCOUNT_PP(current, refcount); - Z_SET_ISREF_PP(current); + current = &args[objIndex++]; + refcount = Z_REFCOUNT_P(current); + zval_dtor(current); + ZVAL_LONG(current, (long)(string - baseString) ); + Z_SET_REFCOUNT_P(current, refcount); +//??? Z_SET_ISREF_P(current); + ZVAL_NEW_REF(current, current); } else { - add_index_long(*return_value, objIndex++, string - baseString); + add_index_long(return_value, objIndex++, string - baseString); } } nconversions++; @@ -869,14 +869,15 @@ literal: } else if (numVars) { zend_uint refcount; - current = args[objIndex++]; - refcount = Z_REFCOUNT_PP(current); - zval_dtor( *current ); - ZVAL_STRINGL( *current, string, end-string, 1); - Z_SET_REFCOUNT_PP(current, refcount); - Z_SET_ISREF_PP(current); + current = &args[objIndex++]; + refcount = Z_REFCOUNT_P(current); + zval_dtor( current ); + ZVAL_STRINGL( current, string, end-string); + Z_SET_REFCOUNT_P(current, refcount); +//??? Z_SET_ISREF_PP(current); + ZVAL_NEW_REF(current, current); } else { - add_index_stringl( *return_value, objIndex++, string, end-string, 1); + add_index_stringl(return_value, objIndex++, string, end-string, 1); } } string = end; @@ -913,11 +914,11 @@ literal: if (numVars && objIndex >= argCount) { break; } else if (numVars) { - current = args[objIndex++]; - zval_dtor( *current ); - ZVAL_STRINGL( *current, string, end-string, 1); + current = &args[objIndex++]; + zval_dtor( current ); + ZVAL_STRINGL( current, string, end-string); } else { - add_index_stringl(*return_value, objIndex++, string, end-string, 1); + add_index_stringl(return_value, objIndex++, string, end-string, 1); } } string = end; @@ -938,7 +939,7 @@ literal: zval_dtor(*current); ZVAL_STRINGL( *current, __buf, 1, 1); } else { - add_index_stringl(*return_value, objIndex++, &sch, 1, 1); + add_index_stringl(return_value, objIndex++, &sch, 1, 1); } } break; @@ -1067,21 +1068,21 @@ addToInt: break; } else if (numVars) { /* change passed value type to string */ - current = args[objIndex++]; - zval_dtor(*current); - ZVAL_STRING( *current, buf, 1 ); + current = &args[objIndex++]; + zval_dtor(current); + ZVAL_STRING(current, buf); } else { - add_index_string(*return_value, objIndex++, buf, 1); + add_index_string(return_value, objIndex++, buf, 1); } } else { if (numVars && objIndex >= argCount) { break; } else if (numVars) { - current = args[objIndex++]; - zval_dtor(*current); - ZVAL_LONG(*current, value); + current = &args[objIndex++]; + zval_dtor(current); + ZVAL_LONG(current, value); } else { - add_index_long(*return_value, objIndex++, value); + add_index_long(return_value, objIndex++, value); } } } @@ -1182,11 +1183,11 @@ addToFloat: if (numVars && objIndex >= argCount) { break; } else if (numVars) { - current = args[objIndex++]; - zval_dtor(*current); - ZVAL_DOUBLE(*current, dvalue); + current = &args[objIndex++]; + zval_dtor(current); + ZVAL_DOUBLE(current, dvalue); } else { - add_index_double( *return_value, objIndex++, dvalue ); + add_index_double(return_value, objIndex++, dvalue ); } } break; @@ -1201,8 +1202,8 @@ done: scan_set_error_return( numVars, return_value ); result = SCAN_ERROR_EOF; } else if (numVars) { - convert_to_long( *return_value ); - Z_LVAL_PP(return_value) = nconversions; + convert_to_long(return_value ); + Z_LVAL_P(return_value) = nconversions; } else if (nconversions < totalVars) { /* TODO: not all elements converted. we need to prune the list - cc */ } @@ -1211,14 +1212,14 @@ done: /* }}} */ /* the compiler choked when i tried to make this a macro */ -static inline void scan_set_error_return(int numVars, zval **return_value) /* {{{ */ +static inline void scan_set_error_return(int numVars, zval *return_value) /* {{{ */ { if (numVars) { - Z_TYPE_PP(return_value) = IS_LONG; - Z_LVAL_PP(return_value) = SCAN_ERROR_EOF; /* EOF marker */ + Z_TYPE_P(return_value) = IS_LONG; + Z_LVAL_P(return_value) = SCAN_ERROR_EOF; /* EOF marker */ } else { /* convert_to_null calls destructor */ - convert_to_null( *return_value ); + convert_to_null(return_value); } } /* }}} */ |