@@ -70,6 +70,7 @@ static PHP_GINIT_FUNCTION(json)
7070static PHP_RINIT_FUNCTION (json )
7171{
7272 JSON_G (error_code ) = 0 ;
73+ JSON_G (error_pos ) = 0 ;
7374 return SUCCESS ;
7475}
7576
@@ -133,6 +134,7 @@ PHP_JSON_API zend_result php_json_encode_ex(smart_str *buf, zval *val, int optio
133134
134135 return_code = php_json_encode_zval (buf , val , options , & encoder );
135136 JSON_G (error_code ) = encoder .error_code ;
137+ JSON_G (error_pos ) = encoder .error_pos ;
136138
137139 return return_code ;
138140}
@@ -156,7 +158,11 @@ static const char *php_json_get_error_msg(php_json_error_code error_code) /* {{{
156158 case PHP_JSON_ERROR_CTRL_CHAR :
157159 return "Control character error, possibly incorrectly encoded" ;
158160 case PHP_JSON_ERROR_SYNTAX :
159- return "Syntax error" ;
161+ char * msg ;
162+ spprintf (& msg , 0 , "Syntax error at character %zu" , JSON_G (error_pos ));
163+ return msg ;
164+ //efree(msg);
165+ //return "Syntax error";
160166 case PHP_JSON_ERROR_UTF8 :
161167 return "Malformed UTF-8 characters, possibly incorrectly encoded" ;
162168 case PHP_JSON_ERROR_RECURSION :
@@ -185,11 +191,15 @@ PHP_JSON_API zend_result php_json_decode_ex(zval *return_value, const char *str,
185191
186192 if (php_json_yyparse (& parser )) {
187193 php_json_error_code error_code = php_json_parser_error_code (& parser );
194+ size_t error_pos = php_json_parser_error_pos (& parser );
195+
188196 if (!(options & PHP_JSON_THROW_ON_ERROR )) {
189197 JSON_G (error_code ) = error_code ;
198+ JSON_G (error_pos ) = error_pos ;
190199 } else {
191200 zend_throw_exception (php_json_exception_ce , php_json_get_error_msg (error_code ), error_code );
192201 }
202+
193203 RETVAL_NULL ();
194204 return FAILURE ;
195205 }
@@ -208,7 +218,9 @@ PHP_JSON_API bool php_json_validate_ex(const char *str, size_t str_len, zend_lon
208218
209219 if (php_json_yyparse (& parser )) {
210220 php_json_error_code error_code = php_json_parser_error_code (& parser );
221+ size_t error_pos = php_json_parser_error_pos (& parser );
211222 JSON_G (error_code ) = error_code ;
223+ JSON_G (error_pos ) = error_pos ;
212224 return false;
213225 }
214226
@@ -238,6 +250,7 @@ PHP_FUNCTION(json_encode)
238250
239251 if (!(options & PHP_JSON_THROW_ON_ERROR ) || (options & PHP_JSON_PARTIAL_OUTPUT_ON_ERROR )) {
240252 JSON_G (error_code ) = encoder .error_code ;
253+ JSON_G (error_pos ) = encoder .error_pos ;
241254 if (encoder .error_code != PHP_JSON_ERROR_NONE && !(options & PHP_JSON_PARTIAL_OUTPUT_ON_ERROR )) {
242255 smart_str_free (& buf );
243256 RETURN_FALSE ;
0 commit comments