⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mbstring.c

📁 php-4.4.7学习linux时下载的源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
	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 + -