}
+/*
+ * string object
+ */
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)
+{
+ 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;
+ }
+}
+
/*
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);
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);
}
#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"
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)
}
#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++;
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;
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;
}
}
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;
}
/* }}} */
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);
}
}