From 921b16fa6a839b10d1b4a11743852f69806f8bde Mon Sep 17 00:00:00 2001 From: Filipe David Manana Date: Thu, 31 Mar 2011 23:28:24 +0100 Subject: [PATCH] Use yajl error messages --- c_src/decode.c | 48 +++---------------- test/cases/array_close.erl | 2 +- test/cases/bogus_char.erl | 2 +- test/cases/invalid_utf8.erl | 2 +- test/cases/leading_zero_in_number.erl | 2 +- test/cases/lonely_minus_sign.erl | 2 +- test/cases/map_close.erl | 2 +- .../missing_integer_after_decimal_point.erl | 2 +- test/cases/missing_integer_after_exponent.erl | 2 +- test/cases/non_utf8_char_in_string.erl | 2 +- test/cases/string_invalid_escape.erl | 2 +- test/cases/string_invalid_hex_char.erl | 2 +- test/cases/string_with_invalid_newline.erl | 2 +- 13 files changed, 19 insertions(+), 53 deletions(-) diff --git a/c_src/decode.c b/c_src/decode.c index 1f4fca7..bb131b3 100644 --- a/c_src/decode.c +++ b/c_src/decode.c @@ -18,62 +18,28 @@ typedef struct { #define CONTINUE 1 #define CANCEL 0 -static const char* LEX_ERRORS[] = -{ - "ok", - "invalid_utf8", - "invalid_escaped_char", - "invalid_json_char", - "invalid_hex_char", - "invalid_char", - "invalid_string", - "missing_integer_after_decimal", - "missing_integer_after_exponent", - "missing_integer_after_minus", - "unallowed_comment" -}; - -static const char* PARSE_ERRORS[] = -{ - "ok", - "client_cancelled", - "integer_overflow", - "numeric_overflow", - "invalid_token", - "internal_invalid_token", - "key_must_be_string", - "pair_missing_colon", - "bad_token_after_map_value", - "bad_token_after_array_value" -}; - static ERL_NIF_TERM make_error(yajl_handle handle, ErlNifEnv* env) { - ERL_NIF_TERM atom; - - yajl_parser_error pe = handle->parserError; - yajl_lex_error le = yajl_lex_get_error(handle->lexer); + char* yajlError = (char*) yajl_get_error(handle, 0, NULL, 0); + ERL_NIF_TERM errMsg; - if(le != yajl_lex_e_ok) - { - atom = enif_make_atom(env, LEX_ERRORS[le]); - } - else if(pe != yajl_parser_e_ok) + if(yajlError != NULL) { - atom = enif_make_atom(env, PARSE_ERRORS[pe]); + errMsg = enif_make_string(env, yajlError, ERL_NIF_LATIN1); + yajl_free_error(handle, (unsigned char*) yajlError); } else { - atom = enif_make_atom(env, "unknown"); + errMsg = enif_make_string(env, "unknown parse error", ERL_NIF_LATIN1); } return enif_make_tuple(env, 2, enif_make_atom(env, "error"), enif_make_tuple(env, 2, enif_make_uint(env, handle->bytesConsumed), - atom + errMsg ) ); } diff --git a/test/cases/array_close.erl b/test/cases/array_close.erl index d46a7a5..ee5d062 100644 --- a/test/cases/array_close.erl +++ b/test/cases/array_close.erl @@ -1 +1 @@ -{error,{1,invalid_token}}. \ No newline at end of file +{error,{1,"parse error: unallowed token at this point in JSON text\n"}}. diff --git a/test/cases/bogus_char.erl b/test/cases/bogus_char.erl index 5f2e870..479f5ca 100644 --- a/test/cases/bogus_char.erl +++ b/test/cases/bogus_char.erl @@ -1 +1 @@ -{error,{97,invalid_string}}. \ No newline at end of file +{error,{97,"lexical error: invalid string in json text.\n"}}. diff --git a/test/cases/invalid_utf8.erl b/test/cases/invalid_utf8.erl index dd5ff61..202451d 100644 --- a/test/cases/invalid_utf8.erl +++ b/test/cases/invalid_utf8.erl @@ -1 +1 @@ -{error,{11,invalid_utf8}}. +{error,{11,"lexical error: invalid bytes in UTF8 string.\n"}}. diff --git a/test/cases/leading_zero_in_number.erl b/test/cases/leading_zero_in_number.erl index bf3f310..64f295e 100644 --- a/test/cases/leading_zero_in_number.erl +++ b/test/cases/leading_zero_in_number.erl @@ -1 +1 @@ -{error,{16,bad_token_after_map_value}}. +{error,{16,"parse error: after key and value, inside map, I expect ',' or '}'\n"}}. diff --git a/test/cases/lonely_minus_sign.erl b/test/cases/lonely_minus_sign.erl index 31dbfe8..c1826e1 100644 --- a/test/cases/lonely_minus_sign.erl +++ b/test/cases/lonely_minus_sign.erl @@ -1 +1 @@ -{error,{82,missing_integer_after_minus}}. +{error,{82,"lexical error: malformed number, a digit is required after the minus sign.\n"}}. diff --git a/test/cases/map_close.erl b/test/cases/map_close.erl index 01f3bff..ee5d062 100644 --- a/test/cases/map_close.erl +++ b/test/cases/map_close.erl @@ -1 +1 @@ -{error,{1,invalid_token}}. +{error,{1,"parse error: unallowed token at this point in JSON text\n"}}. diff --git a/test/cases/missing_integer_after_decimal_point.erl b/test/cases/missing_integer_after_decimal_point.erl index 665c3a7..115eb0b 100644 --- a/test/cases/missing_integer_after_decimal_point.erl +++ b/test/cases/missing_integer_after_decimal_point.erl @@ -1 +1 @@ -{error,{3,missing_integer_after_decimal}}. \ No newline at end of file +{error,{3,"lexical error: malformed number, a digit is required after the decimal point.\n"}}. diff --git a/test/cases/missing_integer_after_exponent.erl b/test/cases/missing_integer_after_exponent.erl index b7f7981..3f6eaba 100644 --- a/test/cases/missing_integer_after_exponent.erl +++ b/test/cases/missing_integer_after_exponent.erl @@ -1 +1 @@ -{error,{3,missing_integer_after_exponent}}. \ No newline at end of file +{error,{3,"lexical error: malformed number, a digit is required after the exponent.\n"}}. diff --git a/test/cases/non_utf8_char_in_string.erl b/test/cases/non_utf8_char_in_string.erl index 98be119..171a4ba 100644 --- a/test/cases/non_utf8_char_in_string.erl +++ b/test/cases/non_utf8_char_in_string.erl @@ -1 +1 @@ -{error,{125,invalid_utf8}}. +{error,{125,"lexical error: invalid bytes in UTF8 string.\n"}}. diff --git a/test/cases/string_invalid_escape.erl b/test/cases/string_invalid_escape.erl index 2f99d21..955c775 100644 --- a/test/cases/string_invalid_escape.erl +++ b/test/cases/string_invalid_escape.erl @@ -1 +1 @@ -{error,{62,invalid_escaped_char}}. +{error,{62,"lexical error: inside a string, '\\' occurs before a character which it may not.\n"}}. diff --git a/test/cases/string_invalid_hex_char.erl b/test/cases/string_invalid_hex_char.erl index 68eef89..f103cf0 100644 --- a/test/cases/string_invalid_hex_char.erl +++ b/test/cases/string_invalid_hex_char.erl @@ -1 +1 @@ -{error,{44,invalid_hex_char}}. +{error,{44,"lexical error: invalid (non-hex) character occurs after '\\u' inside string.\n"}}. diff --git a/test/cases/string_with_invalid_newline.erl b/test/cases/string_with_invalid_newline.erl index 628bff6..76956d2 100644 --- a/test/cases/string_with_invalid_newline.erl +++ b/test/cases/string_with_invalid_newline.erl @@ -1 +1 @@ -{error,{66,invalid_json_char}}. +{error,{66,"lexical error: invalid character inside string.\n"}}.