📄 mbstring.c
字号:
if (arg != PARSE_COOKIE) { efree(separator); } if (free_buffer) { efree(res); }}/* }}} *//* {{{ 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, elistsz, old_rg, argc; enum mbfl_no_encoding *elist; enum mbfl_no_encoding from_encoding, to_encoding; mbfl_string string, resvar, resval; mbfl_encoding_detector *identd; mbfl_buffer_converter *convd; 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; } separator = (char *)estrdup(PG(arg_separator).input); if (separator == NULL) { RETURN_FALSE; } convert_to_string_ex(arg_str); 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 = encstr; n = Z_STRLEN_PP(arg_str); while (n > 0) { char *p; for (p = separator; *p != '\0'; ++p) { if (*p == *var) { num++; } } var++; n--; } num *= 2; 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(encstr, separator, &strtok_buf); while (var && n < num) { val = strchr(var, '='); if (val) { /* have a value */ len_list[n] = php_url_decode(var, val-var); str_list[n] = var; n++; *val++ = '\0'; str_list[n] = val; len_list[n] = php_url_decode(val, strlen(val)); } else { len_list[n] = php_url_decode(var, strlen(var)); str_list[n] = var; n++; str_list[n] = ""; len_list[n] = 0; } n++; var = php_strtok_r(NULL, separator, &strtok_buf); } num = n; /* initialize converter */ to_encoding = MBSTRG(current_internal_encoding); elist = MBSTRG(http_input_list); elistsz = MBSTRG(http_input_list_size); if (elistsz <= 0) { from_encoding = mbfl_no_encoding_pass; } else if (elistsz == 1) { from_encoding = *elist; } else { /* auto detect */ from_encoding = mbfl_no_encoding_invalid; identd = mbfl_encoding_detector_new(elist, elistsz, 0); if (identd != NULL) { n = 0; while (n < num) { string.val = (unsigned char *)str_list[n]; string.len = len_list[n]; if (mbfl_encoding_detector_feed(identd, &string)) { break; } n++; } from_encoding = mbfl_encoding_detector_judge(identd); mbfl_encoding_detector_delete(identd); } if (from_encoding == mbfl_no_encoding_invalid) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to detect encoding"); from_encoding = mbfl_no_encoding_pass; } } convd = NULL; if (from_encoding != mbfl_no_encoding_pass) { convd = mbfl_buffer_converter_new(from_encoding, to_encoding, 0); if (convd != NULL) { 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_docref(NULL TSRMLS_CC, E_WARNING, "Unable to create converter"); } } /* convert encoding */ string.no_encoding = from_encoding; old_rg = PG(register_globals); if (argc == 1) { zend_alter_ini_entry("register_globals", sizeof("register_globals"), "1", sizeof("1")-1, PHP_INI_PERDIR, PHP_INI_STAGE_RUNTIME); } else { zend_alter_ini_entry("register_globals", sizeof("register_globals"), "0", sizeof("0")-1, PHP_INI_PERDIR, PHP_INI_STAGE_RUNTIME); } n = 0; while (n < num) { /* convert variable name */ string.val = str_list[n]; string.len = len_list[n]; if (convd != NULL && mbfl_buffer_converter_feed_result(convd, &string, &resvar) != NULL) { var = (char *)resvar.val; } else { var = str_list[n]; } 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 { 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 TSRMLS_CC); mbfl_string_clear(&resvar); mbfl_string_clear(&resval); } if (old_rg) { zend_alter_ini_entry("register_globals", sizeof("register_globals"), "1", sizeof("1")-1, PHP_INI_PERDIR, PHP_INI_STAGE_RUNTIME); } else { zend_alter_ini_entry("register_globals", sizeof("register_globals"), "0", sizeof("0")-1, PHP_INI_PERDIR, PHP_INI_STAGE_RUNTIME); } if (convd != NULL) { MBSTRG(illegalchars) += mbfl_buffer_illegalchars(convd); mbfl_buffer_converter_delete(convd); } 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;}/* }}} *//* {{{ proto string mb_output_handler(string contents, int status) Returns string in output buffer converted to the http_output encoding */PHP_FUNCTION(mb_output_handler){ char *arg_string; int arg_string_len; long arg_status; mbfl_string string, result; const char *charset; char *p; enum mbfl_no_encoding encoding; int last_feed, len; unsigned char send_text_mimetype = 0; char *s, *mimetype = NULL; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sl", &arg_string, &arg_string_len, &arg_status) == FAILURE) { WRONG_PARAM_COUNT; } encoding = MBSTRG(current_http_output_encoding); /* start phase only */ if ((arg_status & PHP_OUTPUT_HANDLER_START) != 0) { /* delete the converter just in case. */ if (MBSTRG(outconv)) { MBSTRG(illegalchars) += mbfl_buffer_illegalchars(MBSTRG(outconv)); mbfl_buffer_converter_delete(MBSTRG(outconv)); MBSTRG(outconv) = NULL; } if (encoding == mbfl_no_encoding_pass) { RETURN_STRINGL(arg_string, arg_string_len, 1); } /* analyze mime type */ if (SG(sapi_headers).mimetype && strncmp(SG(sapi_headers).mimetype, "text/", 5) == 0) { if ((s = strchr(SG(sapi_headers).mimetype,';')) == NULL){ mimetype = estrdup(SG(sapi_headers).mimetype); } else { mimetype = estrndup(SG(sapi_headers).mimetype,s-SG(sapi_headers).mimetype); } send_text_mimetype = 1; } else if (SG(sapi_headers).send_default_content_type) { mimetype = SG(default_mimetype) ? SG(default_mimetype) : SAPI_DEFAULT_MIMETYPE; } /* if content-type is not yet set, set it and activate the converter */ if (SG(sapi_headers).send_default_content_type || send_text_mimetype) { charset = mbfl_no2preferred_mime_name(encoding); if (charset) { len = spprintf( &p, 0, "Content-Type: %s; charset=%s", mimetype, charset ); if (sapi_add_header(p, len, 0) != FAILURE) { SG(sapi_headers).send_default_content_type = 0; } } /* activate the converter */ MBSTRG(outconv) = mbfl_buffer_converter_new(MBSTRG(current_internal_encoding), encoding, 0); if (send_text_mimetype){ efree(mimetype); } } } /* just return if the converter is not activated. */ if (MBSTRG(outconv) == NULL) { RETURN_STRINGL(arg_string, arg_string_len, 1); } /* flag */ last_feed = ((arg_status & PHP_OUTPUT_HANDLER_END) != 0); /* mode */ mbfl_buffer_converter_illegal_mode(MBSTRG(outconv), MBSTRG(current_filter_illegal_mode)); mbfl_buffer_converter_illegal_substchar(MBSTRG(outconv), MBSTRG(current_filter_illegal_substchar)); /* feed the string */ mbfl_string_init(&string); string.no_language = MBSTRG(current_language); string.no_encoding = MBSTRG(current_internal_encoding); string.val = (unsigned char *)arg_string; string.len = arg_string_len; mbfl_buffer_converter_feed(MBSTRG(outconv), &string); if (last_feed) { mbfl_buffer_converter_flush(MBSTRG(outconv)); } /* get the converter output, and return it */ mbfl_buffer_converter_result(MBSTRG(outconv), &result); RETVAL_STRINGL((char *)result.val, result.len, 0); /* the string is already strdup()'ed */ /* delete the converter if it is the last feed. */ if (last_feed) { MBSTRG(illegalchars) += mbfl_buffer_illegalchars(MBSTRG(outconv)); mbfl_buffer_converter_delete(MBSTRG(outconv)); MBSTRG(outconv) = NULL; }}/* }}} *//* {{{ proto int mb_strlen(string str [, string encoding]) Get character numbers of a string */PHP_FUNCTION(mb_strlen){ pval **arg1, **arg2; int n; mbfl_string string; n = ZEND_NUM_ARGS(); if ((n == 1 && zend_get_parameters_ex(1, &arg1) == FAILURE) || (n == 2 && zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) || n < 1 || n > 2) { WRONG_PARAM_COUNT; } if (Z_TYPE_PP(arg1) == IS_ARRAY || Z_TYPE_PP(arg1) == IS_OBJECT) { php_error_docref(NULL TSRMLS_CC, E_NOTICE, "arg1 is invalid."); RETURN_FALSE; } if (( n ==2 && Z_TYPE_PP(arg2) == IS_ARRAY) || ( n ==2 && Z_TYPE_PP(arg2) == IS_OBJECT)) { php_error_docref(NULL TSRMLS_CC, E_NOTICE, "arg2 is invalid."); RETURN_FALSE; } convert_to_string_ex(arg1); mbfl_string_init(&string); string.no_language = MBSTRG(current_language); string.no_encoding = MBSTRG(current_internal_encoding); string.val = (unsigned char *)Z_STRVAL_PP(arg1); string.len = Z_STRLEN_PP(arg1); if (n == 2) { convert_to_string_ex(arg2); string.no_encoding = mbfl_name2no_encoding(Z_STRVAL_PP(arg2)); if (string.no_encoding == mbfl_no_encoding_invalid) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown encoding \"%s\"", Z_STRVAL_PP(arg2)); RETURN_FALSE; } } n = mbfl_strlen(&string); if (n >= 0) { RETVAL_LONG(n); } else { RETVAL_FALSE; }}/* }}} *//* {{{ proto int mb_strpos(string haystack, string needle [, int offset [, string encoding]]) Find position of first occurrence of a string within another */PHP_FUNCTION(mb_strpos){ pval **arg1, **arg2, **arg3, **arg4; int offset, n, reverse = 0; mbfl_string haystack, needle; mbfl_string_init(&haystack); mbfl_string_init(&needle); haystack.no_language = MBSTRG(current_language); haystack.no_encoding = MBSTRG(current_internal_encoding); needle.no_language = MBSTRG(current_language); needle.no_encoding = MBSTRG(current_internal_encoding); offset = 0; switch (ZEND_NUM_ARGS()) { case 2: if (zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) { WRONG_PARAM_COUNT; } break; case 3: if (zend_get_parameters_ex(3, &arg1, &arg2, &arg3) == FAILURE) { WRONG_PARAM_COUNT; } convert_to_long_ex(arg3); offset = Z_LVAL_PP(arg3); break; case 4: if (zend_get_parameters_ex(4, &arg1, &arg2, &arg3, &arg4) == FAILURE) { WRONG_PARAM_COUNT; } convert_to_long_ex(arg3); offset = Z_LVAL_PP(arg3); convert_to_string_ex(arg4); haystack.no_encoding = needle.no_encoding = mbfl_name2no_encoding(Z_STRVAL_PP(arg4)); if (haystack.no_encoding == mbfl_no_encoding_invalid) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown encoding \"%s\"", Z_STRVAL_PP(arg4)); RETURN_FALSE; } break; default: WRONG_PARAM_COUNT; } convert_to_string_ex(arg1); convert_to_string_ex(arg2); if (offset < 0 || offset > Z_STRLEN_PP(arg1)) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Offset not contained in string."); RETURN_FALSE; } if (Z_STRLEN_PP(arg2) == 0) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Empty delimiter."); RETURN_FALSE; } haystack.val = (unsigned char *)Z_STRVAL_PP(arg1); haystack.len = Z_STRLEN_PP(arg1); needle.val = Z_STRVAL_PP(arg2); needle.len = Z_STRLEN_PP(arg2); n = mbfl_strpos(&haystack, &needle, offset, reverse); if (n >= 0) { RETVAL_LONG(n); } else { switch (-n) { case 1: break; case 2: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Needle has not positive length."); break; case 4: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown encoding or conversion error."); break; case 8: php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Argument is empty."); break; default: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown error in mb_strpos."); break; } RETVAL_FALSE; }}/* }}} *//* {{{ proto int mb_strrpos(string haystack, string needle [, string encoding]) Find the last occurrence of a character in a string within another */PHP_FUNCTION(mb_strrpos){ pval **arg1, **arg2, **arg3; int n; mbfl_string haystack, needle; mbfl_string_init(&hays
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -