From: Rui Hirokawa Date: Wed, 9 May 2001 11:18:11 +0000 (+0000) Subject: remaked mb_gpc_handler as mb_parse_str() in mbstring. X-Git-Tag: php-4.0.6RC1~58 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=223eca31fbcab7b02962168bca5aaa67e3c4976d;p=php remaked mb_gpc_handler as mb_parse_str() in mbstring. --- diff --git a/ext/mbstring/mbfilter.c b/ext/mbstring/mbfilter.c index 08673f40f6..2eb1bf19a0 100644 --- a/ext/mbstring/mbfilter.c +++ b/ext/mbstring/mbfilter.c @@ -2272,6 +2272,9 @@ mbfl_wchar_device_output(int c, void *data) } +/* + * string object + */ void mbfl_string_init(mbfl_string *string) { @@ -2283,6 +2286,29 @@ mbfl_string_init(mbfl_string *string) } } +void +mbfl_string_init_set(mbfl_string *string, enum mbfl_no_language no_language, enum mbfl_no_encoding no_encoding) +{ + if (string) { + string->no_language = no_language; + string->no_encoding = no_encoding; + string->val = (unsigned char*)0; + string->len = 0; + } +} + +void +mbfl_string_clear(mbfl_string *string) +{ + if (string) { + if (string->val != (unsigned char*)0) { + mbfl_free(string->val); + } + string->val = (unsigned char*)0; + string->len = 0; + } +} + /* @@ -5685,28 +5711,53 @@ mbfl_buffer_converter_feed(mbfl_buffer_converter *convd, mbfl_string *string) return 0; } -mbfl_string * -mbfl_buffer_converter_result(mbfl_buffer_converter *convd, mbfl_string *result) +int +mbfl_buffer_converter_flush(mbfl_buffer_converter *convd) { + if (convd == NULL) { + return -1; + } + if (convd->filter1 != NULL) { mbfl_convert_filter_flush(convd->filter1); } if (convd->filter2 != NULL) { mbfl_convert_filter_flush(convd->filter2); } - return mbfl_memory_device_result(&convd->device, result); + + return 0; } mbfl_string * -mbfl_buffer_converter_feed_getbuffer(mbfl_buffer_converter *convd, mbfl_string *string, mbfl_string *result) +mbfl_buffer_converter_getbuffer(mbfl_buffer_converter *convd, mbfl_string *result) { - mbfl_buffer_converter_feed(convd, string); + if (convd != NULL && result != NULL && convd->device.buffer != NULL) { + result->no_encoding = convd->to->no_encoding; + result->val = convd->device.buffer; + result->len = convd->device.pos; + } else { + result = NULL; + } + + return result; +} + +mbfl_string * +mbfl_buffer_converter_result(mbfl_buffer_converter *convd, mbfl_string *result) +{ + if (convd == NULL || result == NULL) { + return NULL; + } + result->no_encoding = convd->to->no_encoding; return mbfl_memory_device_result(&convd->device, result); } mbfl_string * mbfl_buffer_converter_feed_result(mbfl_buffer_converter *convd, mbfl_string *string, mbfl_string *result) { + if (convd == NULL || string == NULL || result == NULL) { + return NULL; + } mbfl_buffer_converter_feed(convd, string); if (convd->filter1 != NULL) { mbfl_convert_filter_flush(convd->filter1); @@ -5714,6 +5765,7 @@ mbfl_buffer_converter_feed_result(mbfl_buffer_converter *convd, mbfl_string *str if (convd->filter2 != NULL) { mbfl_convert_filter_flush(convd->filter2); } + result->no_encoding = convd->to->no_encoding; return mbfl_memory_device_result(&convd->device, result); } diff --git a/ext/mbstring/mbfilter.h b/ext/mbstring/mbfilter.h index 54a5737259..2b7f17cf46 100644 --- a/ext/mbstring/mbfilter.h +++ b/ext/mbstring/mbfilter.h @@ -247,6 +247,8 @@ typedef struct _mbfl_string { } mbfl_string; void mbfl_string_init(mbfl_string *string); +void mbfl_string_init_set(mbfl_string *string, enum mbfl_no_language no_language, enum mbfl_no_encoding no_encoding); +void mbfl_string_clear(mbfl_string *string); /* @@ -399,8 +401,9 @@ int mbfl_buffer_converter_illegal_mode(mbfl_buffer_converter *convd, int mode); int mbfl_buffer_converter_illegal_substchar(mbfl_buffer_converter *convd, int substchar); int mbfl_buffer_converter_strncat(mbfl_buffer_converter *convd, const unsigned char *p, int n); int mbfl_buffer_converter_feed(mbfl_buffer_converter *convd, mbfl_string *string); +int mbfl_buffer_converter_flush(mbfl_buffer_converter *convd); +mbfl_string * mbfl_buffer_converter_getbuffer(mbfl_buffer_converter *convd, mbfl_string *result); mbfl_string * mbfl_buffer_converter_result(mbfl_buffer_converter *convd, mbfl_string *result); -mbfl_string * mbfl_buffer_converter_feed_getbuffer(mbfl_buffer_converter *convd, mbfl_string *string, mbfl_string *result); mbfl_string * mbfl_buffer_converter_feed_result(mbfl_buffer_converter *convd, mbfl_string *string, mbfl_string *result); diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index 72e7a7c2c6..2b9dc8d6a0 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -46,6 +46,7 @@ #include "php.h" #include "php_ini.h" #include "php_config.h" +#include "php_variables.h" #include "mbstring.h" #include "ext/standard/php_string.h" #include "ext/standard/php_mail.h" @@ -90,7 +91,7 @@ function_entry mbstring_functions[] = { PHP_FE(mb_http_output, NULL) PHP_FE(mb_detect_order, NULL) PHP_FE(mb_substitute_character, NULL) - PHP_FE(mb_gpc_handler, NULL) + PHP_FE(mb_parse_str, second_arg_force_ref) PHP_FE(mb_output_handler, NULL) PHP_FE(mb_preferred_mime_name, NULL) PHP_FE(mb_strlen, NULL) @@ -1066,65 +1067,95 @@ void mbstr_treat_data(int arg, char *str, zval* destArray ELS_DC PLS_DC SLS_DC) } #endif -/* {{{ proto array mb_gpc_handler(string query, int type) - */ -PHP_FUNCTION(mb_gpc_handler) +/* {{{ proto bool mb_parse_str(string encoded_string, [array result]) + Parses GET/POST/COOKIE data and sets global variables */ +PHP_FUNCTION(mb_parse_str) { - pval **arg_str; - char *var, *val, *strtok_buf, **val_list; - int n, num, *len_list, *elist, elistsz; + pval **arg_str, **arg_array, *track_vars_array; + char *var, *val, *encstr, *strtok_buf, **str_list, *separator; + int n, num, val_len, *len_list, *elist, elistsz, old_rg, argc; enum mbfl_no_encoding from_encoding, to_encoding; - mbfl_string string, result, *ret; + mbfl_string string, resvar, resval; mbfl_encoding_detector *identd; mbfl_buffer_converter *convd; + PLS_FETCH(); MBSTRLS_FETCH(); - if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg_str) == FAILURE) { + track_vars_array = NULL; + argc = ZEND_NUM_ARGS(); + if (argc == 1) { + if (zend_get_parameters_ex(1, &arg_str) == FAILURE) { + WRONG_PARAM_COUNT; + } + } else if (argc == 2) { + if (zend_get_parameters_ex(2, &arg_str, &arg_array) == FAILURE) { + WRONG_PARAM_COUNT; + } + /* Clear out the array */ + zval_dtor(*arg_array); + array_init(*arg_array); + track_vars_array = *arg_array; + } else { WRONG_PARAM_COUNT; } - if (array_init(return_value) == FAILURE) { + separator = (char *)estrdup(PG(arg_separator).input); + if (separator == NULL) { RETURN_FALSE; } - convert_to_string_ex(arg_str); - mbfl_string_init(&string); - mbfl_string_init(&result); - string.no_language = MBSTRG(current_language); - string.no_encoding = MBSTRG(current_internal_encoding); + encstr = estrndup(Z_STRVAL_PP(arg_str), Z_STRLEN_PP(arg_str)); + if (encstr == NULL) { + efree((void *)separator); + RETURN_FALSE; + } + mbfl_string_init_set(&string, MBSTRG(current_language), MBSTRG(current_internal_encoding)); + mbfl_string_init_set(&resvar, MBSTRG(current_language), MBSTRG(current_internal_encoding)); + mbfl_string_init_set(&resval, MBSTRG(current_language), MBSTRG(current_internal_encoding)); /* count the variables contained in the query */ num = 1; - var = Z_STRVAL_PP(arg_str); + var = encstr; n = Z_STRLEN_PP(arg_str); while (n > 0) { - if (*var == '&') { + if (*var == *separator) { num++; } var++; n--; } num *= 2; - val_list = (char **)ecalloc(num, sizeof(char *)); + str_list = (char **)ecalloc(num, sizeof(char *)); + if (str_list == NULL) { + efree((void *)separator); + efree((void *)encstr); + RETURN_FALSE; + } len_list = (int *)ecalloc(num, sizeof(int)); + if (len_list == NULL) { + efree((void *)separator); + efree((void *)encstr); + efree((void *)str_list); + RETURN_FALSE; + } /* split and decode the query */ n = 0; strtok_buf = NULL; - var = php_strtok_r(Z_STRVAL_PP(arg_str), "&", &strtok_buf); + var = php_strtok_r(encstr, separator, &strtok_buf); while (var && n < num) { val = strchr(var, '='); if (val) { /* have a value */ *val++ = '\0'; - val_list[n] = var; + str_list[n] = var; len_list[n] = php_url_decode(var, strlen(var)); n++; - val_list[n] = val; + str_list[n] = val; len_list[n] = php_url_decode(val, strlen(val)); } else { - val_list[n] = var; + str_list[n] = var; len_list[n] = php_url_decode(var, strlen(var)); n++; - val_list[n] = NULL; + str_list[n] = NULL; len_list[n] = 0; } n++; @@ -1147,7 +1178,7 @@ PHP_FUNCTION(mb_gpc_handler) if (identd != NULL) { n = 0; while (n < num) { - string.val = val_list[n]; + string.val = str_list[n]; string.len = len_list[n]; if (mbfl_encoding_detector_feed(identd, &string)) { break; @@ -1158,6 +1189,7 @@ PHP_FUNCTION(mb_gpc_handler) mbfl_encoding_detector_delete(identd); } if (from_encoding == mbfl_no_encoding_invalid) { + php_error(E_WARNING, "Unable to detect encoding in mb_parse_str()"); from_encoding = mbfl_no_encoding_pass; } } @@ -1168,36 +1200,57 @@ PHP_FUNCTION(mb_gpc_handler) mbfl_buffer_converter_illegal_mode(convd, MBSTRG(current_filter_illegal_mode)); mbfl_buffer_converter_illegal_substchar(convd, MBSTRG(current_filter_illegal_substchar)); } else { - php_error(E_WARNING, "Unable to create converter in mb_gpc_handler()"); + php_error(E_WARNING, "Unable to create converter in mb_parse_str()"); } } /* convert encoding */ string.no_encoding = from_encoding; + old_rg = PG(register_globals); + if(argc == 1) { + PG(register_globals) = 1; + } else { + PG(register_globals) = 0; + } n = 0; while (n < num) { - string.val = val_list[n]; + /* convert variable name */ + string.val = str_list[n]; string.len = len_list[n]; - ret = NULL; - if (convd) { - ret = mbfl_buffer_converter_feed_result(convd, &string, &result); + if (convd != NULL && mbfl_buffer_converter_feed_result(convd, &string, &resvar) != NULL) { + var = resvar.val; + } else { + var = str_list[n]; } - if (ret != NULL) { - add_next_index_stringl(return_value, ret->val, ret->len, 0); + n++; + /* convert value */ + string.val = str_list[n]; + string.len = len_list[n]; + if (convd != NULL && mbfl_buffer_converter_feed_result(convd, &string, &resval) != NULL) { + val = resval.val; + val_len = resval.len; } else { - add_next_index_stringl(return_value, val_list[n], len_list[n], 1); + val = str_list[n]; + val_len = len_list[n]; } n++; + /* add variable to symbol table */ + php_register_variable_safe(var, val, val_len, track_vars_array ELS_CC PLS_CC); + mbfl_string_clear(&resvar); + mbfl_string_clear(&resval); } + PG(register_globals) = old_rg; + if (convd != NULL) { mbfl_buffer_converter_delete(convd); } - if (val_list != NULL) { - efree((void *)val_list); - } - if (len_list != NULL) { - efree((void *)len_list); - } + efree((void *)str_list); + efree((void *)len_list); + efree((void *)encstr); + efree((void *)separator); + MBSTRG(http_input_identify) = from_encoding; + MBSTRG(http_input_identify_string) = from_encoding; + RETURN_TRUE; } /* }}} */ @@ -1234,9 +1287,12 @@ PHP_FUNCTION(mb_output_handler) string.val = Z_STRVAL_PP(arg_string); string.len = Z_STRLEN_PP(arg_string); if ((Z_LVAL_PP(arg_status) & PHP_OUTPUT_HANDLER_END) != 0) { - ret = mbfl_buffer_converter_feed_result(MBSTRG(outconv), &string, &result); + mbfl_buffer_converter_feed(MBSTRG(outconv), &string); + mbfl_buffer_converter_flush(MBSTRG(outconv)); + ret = mbfl_buffer_converter_result(MBSTRG(outconv), &result); } else { - ret = mbfl_buffer_converter_feed_getbuffer(MBSTRG(outconv), &string, &result); + mbfl_buffer_converter_feed(MBSTRG(outconv), &string); + ret = mbfl_buffer_converter_result(MBSTRG(outconv), &result); } } diff --git a/ext/mbstring/mbstring.h b/ext/mbstring/mbstring.h index 0fe06b5ccc..8445540e07 100644 --- a/ext/mbstring/mbstring.h +++ b/ext/mbstring/mbstring.h @@ -72,7 +72,7 @@ PHP_FUNCTION(mb_http_output); PHP_FUNCTION(mb_detect_order); PHP_FUNCTION(mb_substitute_character); PHP_FUNCTION(mb_preferred_mime_name); -PHP_FUNCTION(mb_gpc_handler); +PHP_FUNCTION(mb_parse_str); PHP_FUNCTION(mb_output_handler); PHP_FUNCTION(mb_strlen); PHP_FUNCTION(mb_strpos);