cvs: php4 /ext/mbstring mbfilter.c mbfilter.h mbstring.c mbstring.h

From: Date: Wed, 09 May 2001 11:18:12 +0000
Subject: cvs: php4 /ext/mbstring mbfilter.c mbfilter.h mbstring.c mbstring.h
Groups: php.cvs 
Request: Send a blank email to php-cvs+get-5612@lists.php.net to get a copy of this message
hirokawa Wed May 9 04:18:12 2001 EDT Modified files: /php4/ext/mbstring mbfilter.c mbfilter.h mbstring.c mbstring.h Log: remaked mb_gpc_handler as mb_parse_str() in mbstring.

Index: php4/ext/mbstring/mbfilter.c diff -u php4/ext/mbstring/mbfilter.c:1.5 php4/ext/mbstring/mbfilter.c:1.6 --- php4/ext/mbstring/mbfilter.c:1.5 Tue May 8 07:33:20 2001 +++ php4/ext/mbstring/mbfilter.c Wed May 9 04:18:11 2001 @@ -77,7 +77,7 @@ * */ -/* $Id: mbfilter.c,v 1.5 2001/05/08 14:33:20 hirokawa Exp $ */ +/* $Id: mbfilter.c,v 1.6 2001/05/09 11:18:11 hirokawa Exp $ */ #include <stdlib.h> @@ -2272,6 +2272,9 @@ } +/* + * string object + */ void mbfl_string_init(mbfl_string *string) { @@ -2283,6 +2286,29 @@ } } +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 @@ 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 @@ 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); } Index: php4/ext/mbstring/mbfilter.h diff -u php4/ext/mbstring/mbfilter.h:1.3 php4/ext/mbstring/mbfilter.h:1.4 --- php4/ext/mbstring/mbfilter.h:1.3 Tue May 8 07:33:20 2001 +++ php4/ext/mbstring/mbfilter.h Wed May 9 04:18:11 2001 @@ -84,7 +84,7 @@ * */ -/* $Id: mbfilter.h,v 1.3 2001/05/08 14:33:20 hirokawa Exp $ */ +/* $Id: mbfilter.h,v 1.4 2001/05/09 11:18:11 hirokawa Exp $ */ #ifndef MBFL_MBFILTER_H @@ -247,6 +247,8 @@ } 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_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); Index: php4/ext/mbstring/mbstring.c diff -u php4/ext/mbstring/mbstring.c:1.11 php4/ext/mbstring/mbstring.c:1.12 --- php4/ext/mbstring/mbstring.c:1.11 Tue May 8 07:33:20 2001 +++ php4/ext/mbstring/mbstring.c Wed May 9 04:18:11 2001 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: mbstring.c,v 1.11 2001/05/08 14:33:20 hirokawa Exp $ */ +/* $Id: mbstring.c,v 1.12 2001/05/09 11:18:11 hirokawa Exp $ */ /* * PHP4 Multibyte String module "mbstring" (currently only for Japanese) @@ -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 @@ 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 @@ } #endif -/* {{{ proto array mb_gpc_handler(string query, int type) - */ -PHP_FUNCTION(mb_gpc_handler) -{ - pval **arg_str; - char *var, *val, *strtok_buf, **val_list; - int n, num, *len_list, *elist, elistsz; +/* {{{ 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, **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 @@ 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 @@ 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 @@ 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 @@ 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); } } Index: php4/ext/mbstring/mbstring.h diff -u php4/ext/mbstring/mbstring.h:1.4 php4/ext/mbstring/mbstring.h:1.5 --- php4/ext/mbstring/mbstring.h:1.4 Tue May 1 16:44:20 2001 +++ php4/ext/mbstring/mbstring.h Wed May 9 04:18:11 2001 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: mbstring.h,v 1.4 2001/05/01 23:44:20 hirokawa Exp $ */ +/* $Id: mbstring.h,v 1.5 2001/05/09 11:18:11 hirokawa Exp $ */ /* * PHP4 Multibyte String module "mbstring" (currently only for Japanese) @@ -72,7 +72,7 @@ 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);
« previous php.cvs (#5612) next »