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

📄 mbstring.c

📁 php-4.4.7学习linux时下载的源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
	} else {		WRONG_PARAM_COUNT;	}}/* }}} *//* {{{ proto bool|array mb_detect_order([mixed encoding-list])   Sets the current detect_order or Return the current detect_order as a array */PHP_FUNCTION(mb_detect_order){	pval **arg1;	int n, size;	enum mbfl_no_encoding *list, *entry;	char *name;	if (ZEND_NUM_ARGS() == 0) {		if (array_init(return_value) == FAILURE) {			RETURN_FALSE;		}		entry = MBSTRG(current_detect_order_list);		n = MBSTRG(current_detect_order_list_size);		while (n > 0) {			name = (char *)mbfl_no_encoding2name(*entry);			if (name) {				add_next_index_string(return_value, name, 1);			}			entry++;			n--;		}	} else if (ZEND_NUM_ARGS() == 1 && zend_get_parameters_ex(1, &arg1) != FAILURE) {		list = NULL;		size = 0;		switch (Z_TYPE_PP(arg1)) {		case IS_ARRAY:			if (!php_mb_parse_encoding_array(*arg1, &list, &size, 0 TSRMLS_CC)) {				if (list) {					efree(list);				}				RETURN_FALSE;			}			break;		default:			convert_to_string_ex(arg1);			if (!php_mb_parse_encoding_list(Z_STRVAL_PP(arg1), Z_STRLEN_PP(arg1), &list, &size, 0 TSRMLS_CC)) {				if (list) {					efree(list);				}				RETURN_FALSE;			}			break;		}		if (list == NULL) {			RETVAL_FALSE;		} else {			if (MBSTRG(current_detect_order_list)) {				efree(MBSTRG(current_detect_order_list));			}			MBSTRG(current_detect_order_list) = list;			MBSTRG(current_detect_order_list_size) = size;			RETVAL_TRUE;		}	} else {		WRONG_PARAM_COUNT;	}}/* }}} *//* {{{ proto mixed mb_substitute_character([mixed substchar])   Sets the current substitute_character or returns the current substitute_character */PHP_FUNCTION(mb_substitute_character){	pval **arg1;	if (ZEND_NUM_ARGS() == 0) {		if (MBSTRG(current_filter_illegal_mode) == MBFL_OUTPUTFILTER_ILLEGAL_MODE_NONE) {			RETVAL_STRING("none", 1);		} else if (MBSTRG(current_filter_illegal_mode) == MBFL_OUTPUTFILTER_ILLEGAL_MODE_LONG) {			RETVAL_STRING("long", 1);		} else {			RETVAL_LONG(MBSTRG(current_filter_illegal_substchar));		}	} else if (ZEND_NUM_ARGS() == 1 && zend_get_parameters_ex(1, &arg1) != FAILURE) {		RETVAL_TRUE;		switch (Z_TYPE_PP(arg1)) {		case IS_STRING:			if (strcasecmp("none", Z_STRVAL_PP(arg1)) == 0) {				MBSTRG(current_filter_illegal_mode) = MBFL_OUTPUTFILTER_ILLEGAL_MODE_NONE;			} else if (strcasecmp("long", Z_STRVAL_PP(arg1)) == 0) {				MBSTRG(current_filter_illegal_mode) = MBFL_OUTPUTFILTER_ILLEGAL_MODE_LONG;			} else {				convert_to_long_ex(arg1);				if (Z_LVAL_PP(arg1)< 0xffff && Z_LVAL_PP(arg1)> 0x0) {					MBSTRG(current_filter_illegal_mode) = MBFL_OUTPUTFILTER_ILLEGAL_MODE_CHAR;					MBSTRG(current_filter_illegal_substchar) = Z_LVAL_PP(arg1);				} else {					php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown character.");					  					RETVAL_FALSE;									}			}			break;		default:			convert_to_long_ex(arg1);			if (Z_LVAL_PP(arg1)< 0xffff && Z_LVAL_PP(arg1)> 0x0) {				MBSTRG(current_filter_illegal_mode) = MBFL_OUTPUTFILTER_ILLEGAL_MODE_CHAR;				MBSTRG(current_filter_illegal_substchar) = Z_LVAL_PP(arg1);			} else {				php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown character.");				RETVAL_FALSE;			}			break;		}	} else {		WRONG_PARAM_COUNT;	}}/* }}} *//* {{{ proto string mb_preferred_mime_name(string encoding)   Return the preferred MIME name (charset) as a string */PHP_FUNCTION(mb_preferred_mime_name){	pval **arg1;	enum mbfl_no_encoding no_encoding;	const char *name;	if (ZEND_NUM_ARGS() == 1 && zend_get_parameters_ex(1, &arg1) != FAILURE) {		convert_to_string_ex(arg1);		no_encoding = mbfl_name2no_encoding(Z_STRVAL_PP(arg1));		if (no_encoding == mbfl_no_encoding_invalid) {			php_error_docref1(NULL TSRMLS_CC, Z_STRVAL_PP(arg1), E_WARNING, "Unknown encoding");			RETVAL_FALSE;		} else {			name = mbfl_no2preferred_mime_name(no_encoding);			if (name == NULL || *name == '\0') {				php_error_docref1(NULL TSRMLS_CC, Z_STRVAL_PP(arg1), E_WARNING, "No MIME preferred name corresponding to that encoding");				RETVAL_FALSE;			} else {				RETVAL_STRING((char *)name, 1);			}		}	} else {		WRONG_PARAM_COUNT;	}}/* }}} *//* {{{ static void php_mbstr_encoding_handler() */static enum mbfl_no_encodingphp_mbstr_encoding_handler(const php_mb_encoding_handler_info_t *info, zval *arg, char *res TSRMLS_DC){	char *var, *val;	const char *s1, *s2;	char *strtok_buf = NULL, **val_list;	zval *array_ptr = (zval *) arg;	int n, num, val_len, *len_list;	enum mbfl_no_encoding from_encoding;	mbfl_string string, resvar, resval;	mbfl_encoding_detector *identd = NULL; 	mbfl_buffer_converter *convd = NULL;	mbfl_string_init_set(&string, info->to_language, info->to_encoding);	mbfl_string_init_set(&resvar, info->to_language, info->to_encoding);	mbfl_string_init_set(&resval, info->to_language, info->to_encoding);	if (!res || *res == '\0') {		return mbfl_no_encoding_invalid;	}		/* count the variables(separators) contained in the "res".	 * separator may contain multiple separator chars.	 * separaror chars are set in php.ini (arg_separator.input)	 */	num = 1;	for (s1=res; *s1 != '\0'; s1++) {		for (s2=info->separator; *s2 != '\0'; s2++) {			if (*s1 == *s2) {				num++;			}			}	}	num *= 2; /* need space for variable name and value */		val_list = (char **)ecalloc(num, sizeof(char *));	len_list = (int *)ecalloc(num, sizeof(int));	/* split and decode the query */	n = 0;	strtok_buf = NULL;	var = php_strtok_r(res, info->separator, &strtok_buf);	while (var)  {		val = strchr(var, '=');		if (val) { /* have a value */			len_list[n] = php_url_decode(var, val-var);			val_list[n] = var;			n++;						*val++ = '\0';			val_list[n] = val;			len_list[n] = php_url_decode(val, strlen(val));		} else {			len_list[n] = php_url_decode(var, strlen(var));			val_list[n] = var;			n++;						val_list[n] = "";			len_list[n] = 0;		}		n++;		var = php_strtok_r(NULL, info->separator, &strtok_buf);	} 	num = n; /* make sure to process initilized vars only */		/* initialize converter */	if (info->num_from_encodings <= 0) {		from_encoding = mbfl_no_encoding_pass;	} else if (info->num_from_encodings == 1) {		from_encoding = info->from_encodings[0];	} else {		/* auto detect */		from_encoding = mbfl_no_encoding_invalid;		identd = mbfl_encoding_detector_new(				(enum mbfl_no_encoding *)info->from_encodings,				info->num_from_encodings, 0);		if (identd) {			n = 0;			while (n < num) {				string.val = (unsigned char *)val_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) {			from_encoding = mbfl_no_encoding_pass;		}	}	convd = NULL;	if (from_encoding != mbfl_no_encoding_pass) {		convd = mbfl_buffer_converter_new(from_encoding, info->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 {			if (info->report_errors) {				php_error_docref(NULL TSRMLS_CC, E_WARNING,						"Unable to create converter");			}		}	}	/* convert encoding */	string.no_encoding = from_encoding;	n = 0;	while (n < num) {		string.val = (unsigned char *)val_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 = val_list[n];		}		n++;		string.val = val_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 = val_list[n];			val_len = len_list[n];		}		n++;		/* add variable to symbol table */		php_register_variable_safe(var, val, val_len, array_ptr TSRMLS_CC);		if (convd != NULL){			mbfl_string_clear(&resvar);			mbfl_string_clear(&resval);		}	}	if (convd != NULL) {		MBSTRG(illegalchars) += mbfl_buffer_illegalchars(convd);		mbfl_buffer_converter_delete(convd);	}	if (val_list != NULL) {		efree((void *)val_list);	}	if (len_list != NULL) {		efree((void *)len_list);	}	return from_encoding;}/* }}} *//* {{{ SAPI_POST_HANDLER_FUNC(php_mbstr_post_handler) */SAPI_POST_HANDLER_FUNC(php_mbstr_post_handler){	enum mbfl_no_encoding detected;	php_mb_encoding_handler_info_t info;	MBSTRG(http_input_identify_post) = mbfl_no_encoding_invalid;	info.data_type              = PARSE_POST;	info.separator              = "&";	info.report_errors          = 0;	info.to_encoding            = MBSTRG(internal_encoding);	info.to_language            = MBSTRG(language);	info.from_encodings         = MBSTRG(http_input_list);	info.num_from_encodings     = MBSTRG(http_input_list_size); 	info.from_language          = MBSTRG(language);	detected = php_mbstr_encoding_handler(&info, arg, SG(request_info).post_data TSRMLS_CC);	MBSTRG(http_input_identify) = detected;	if (detected != mbfl_no_encoding_invalid) {		MBSTRG(http_input_identify_post) = detected;	}}/* }}} */#define IS_SJIS1(c) ((((c)>=0x81 && (c)<=0x9f) || ((c)>=0xe0 && (c)<=0xf5)) ? 1 : 0)#define IS_SJIS2(c) ((((c)>=0x40 && (c)<=0x7e) || ((c)>=0x80 && (c)<=0xfc)) ? 1 : 0)/* {{{ MBSTRING_API SAPI_TREAT_DATA_FUNC(mbstr_treat_data) * http input processing */MBSTRING_API SAPI_TREAT_DATA_FUNC(mbstr_treat_data){	char *res = NULL, *separator=NULL;	const char *c_var;	pval *array_ptr;	int free_buffer=0;	enum mbfl_no_encoding detected;	php_mb_encoding_handler_info_t info;	switch (arg) {		case PARSE_POST:		case PARSE_GET:		case PARSE_COOKIE:			ALLOC_ZVAL(array_ptr);			array_init(array_ptr);			INIT_PZVAL(array_ptr);			switch (arg) {				case PARSE_POST:					PG(http_globals)[TRACK_VARS_POST] = array_ptr;					break;				case PARSE_GET:					PG(http_globals)[TRACK_VARS_GET] = array_ptr;					break;				case PARSE_COOKIE:					PG(http_globals)[TRACK_VARS_COOKIE] = array_ptr;					break;			}			break;		default:			array_ptr=destArray;			break;	}	if (arg==PARSE_POST) { 		sapi_handle_post(array_ptr TSRMLS_CC);		return;	}	if (arg == PARSE_GET) {		/* GET data */		c_var = SG(request_info).query_string;		if (c_var && *c_var) {			res = (char *) estrdup(c_var);			free_buffer = 1;		} else {			free_buffer = 0;		}	} else if (arg == PARSE_COOKIE) {		/* Cookie data */		c_var = SG(request_info).cookie_data;		if (c_var && *c_var) {			res = (char *) estrdup(c_var);			free_buffer = 1;		} else {			free_buffer = 0;		}	} else if (arg == PARSE_STRING) {		/* String data */		res = str;		free_buffer = 1;	}	if (!res) {		return;	}	switch (arg) {	case PARSE_POST:	case PARSE_GET:	case PARSE_STRING:		separator = (char *) estrdup(PG(arg_separator).input);		break;	case PARSE_COOKIE:		separator = ";\0";		break;	}		switch(arg) {	case PARSE_POST:		MBSTRG(http_input_identify_post) = mbfl_no_encoding_invalid;		break;	case PARSE_GET:		MBSTRG(http_input_identify_get) = mbfl_no_encoding_invalid;		break;	case PARSE_COOKIE:		MBSTRG(http_input_identify_cookie) = mbfl_no_encoding_invalid;		break;	case PARSE_STRING:		MBSTRG(http_input_identify_string) = mbfl_no_encoding_invalid;		break;	}	info.data_type              = arg;	info.separator              = separator; 	info.report_errors          = 0;	info.to_encoding            = MBSTRG(internal_encoding);	info.to_language            = MBSTRG(language);	info.from_encodings         = MBSTRG(http_input_list);	info.num_from_encodings     = MBSTRG(http_input_list_size); 	info.from_language          = MBSTRG(language);	MBSTRG(illegalchars) = 0;	detected = php_mbstr_encoding_handler(&info, array_ptr, res TSRMLS_CC);	MBSTRG(http_input_identify) = detected;	if (detected != mbfl_no_encoding_invalid) {		switch(arg){		case PARSE_POST:			MBSTRG(http_input_identify_post) = detected;			break;		case PARSE_GET:			MBSTRG(http_input_identify_get) = detected;			break;		case PARSE_COOKIE:			MBSTRG(http_input_identify_cookie) = detected;			break;		case PARSE_STRING:			MBSTRG(http_input_identify_string) = detected;			break;		}	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -