diff options
Diffstat (limited to 'ext/json/json.c')
| -rw-r--r-- | ext/json/json.c | 49 | 
1 files changed, 40 insertions, 9 deletions
diff --git a/ext/json/json.c b/ext/json/json.c index e09027576b..b3049d002d 100644 --- a/ext/json/json.c +++ b/ext/json/json.c @@ -33,6 +33,7 @@  static PHP_MINFO_FUNCTION(json);  static PHP_FUNCTION(json_encode);  static PHP_FUNCTION(json_decode); +static PHP_FUNCTION(json_last_error);  static const char digits[] = "0123456789abcdef"; @@ -41,6 +42,8 @@ static const char digits[] = "0123456789abcdef";  #define PHP_JSON_HEX_APOS	(1<<2)  #define PHP_JSON_HEX_QUOT	(1<<3) +ZEND_DECLARE_MODULE_GLOBALS(json) +  /* {{{ arginfo */  ZEND_BEGIN_ARG_INFO_EX(arginfo_json_encode, 0, 0, 1)  	ZEND_ARG_INFO(0, value) @@ -51,15 +54,16 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_json_decode, 0, 0, 1)  	ZEND_ARG_INFO(0, json)  	ZEND_ARG_INFO(0, assoc)  ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO(arginfo_json_last_error, 0) +ZEND_END_ARG_INFO()  /* }}} */ -/* {{{ json_functions[] - * - * Every user visible function must have an entry in json_functions[]. - */ +/* {{{ json_functions[] */  static const function_entry json_functions[] = {  	PHP_FE(json_encode, arginfo_json_encode)  	PHP_FE(json_decode, arginfo_json_decode) +	PHP_FE(json_last_error, arginfo_json_last_error)  	{NULL, NULL, NULL}  };  /* }}} */ @@ -72,17 +76,29 @@ static PHP_MINIT_FUNCTION(json)  	REGISTER_LONG_CONSTANT("JSON_HEX_APOS", PHP_JSON_HEX_APOS, CONST_CS | CONST_PERSISTENT);  	REGISTER_LONG_CONSTANT("JSON_HEX_QUOT", PHP_JSON_HEX_QUOT, CONST_CS | CONST_PERSISTENT); +	REGISTER_LONG_CONSTANT("JSON_ERROR_NONE", PHP_JSON_ERROR_NONE, CONST_CS | CONST_PERSISTENT); +	REGISTER_LONG_CONSTANT("JSON_ERROR_DEPTH", PHP_JSON_ERROR_DEPTH, CONST_CS | CONST_PERSISTENT); +	REGISTER_LONG_CONSTANT("JSON_ERROR_STATE_MISMATCH", PHP_JSON_ERROR_STATE_MISMATCH, CONST_CS | CONST_PERSISTENT); +	REGISTER_LONG_CONSTANT("JSON_ERROR_CTRL_CHAR", PHP_JSON_ERROR_CTRL_CHAR, CONST_CS | CONST_PERSISTENT); +	REGISTER_LONG_CONSTANT("JSON_ERROR_SYNTAX", PHP_JSON_ERROR_SYNTAX, CONST_CS | CONST_PERSISTENT); +  	return SUCCESS;  }  /* }}} */ +/* {{{ PHP_GINIT_FUNCTION +*/ +static PHP_GINIT_FUNCTION(json) +{ +	json_globals->error_code = 0; +} +/* }}} */ +  /* {{{ json_module_entry   */  zend_module_entry json_module_entry = { -#if ZEND_MODULE_API_NO >= 20010901  	STANDARD_MODULE_HEADER, -#endif  	"json",  	json_functions,  	PHP_MINIT(json), @@ -90,10 +106,12 @@ zend_module_entry json_module_entry = {  	NULL,  	NULL,  	PHP_MINFO(json), -#if ZEND_MODULE_API_NO >= 20010901  	PHP_JSON_VERSION, -#endif -	STANDARD_MODULE_PROPERTIES +	PHP_MODULE_GLOBALS(json), +	PHP_GINIT(json), +	NULL, +	NULL, +	STANDARD_MODULE_PROPERTIES_EX  };  /* }}} */ @@ -533,10 +551,23 @@ static PHP_FUNCTION(json_decode)  	}  	FREE_ZVAL(z);  	efree(utf16); +	JSON_G(error_code) = jp->error_code;  	free_JSON_parser(jp);  }  /* }}} */ +/* {{{ proto int json_last_error() +   Returns the error code of the last json_decode(). */ +static PHP_FUNCTION(json_last_error) +{ +	if (zend_parse_parameters_none() == FAILURE) { +		return; +	} + +	RETURN_LONG(JSON_G(error_code)); +} +/* }}} */ +  /*   * Local variables:   * tab-width: 4  | 
