diff --git a/compile_commands.json b/compile_commands.json index 9b5faf5..9883399 100644 --- a/compile_commands.json +++ b/compile_commands.json @@ -95,12 +95,12 @@ "-x", "c", "-o", - "/tmp/main-759cce.o", + "/tmp/main-d954cc.o", "src/main.c" ], "directory": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json", "file": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json/src/main.c", - "output": "/tmp/main-759cce.o" + "output": "/tmp/main-d954cc.o" }, { "arguments": [ @@ -162,11 +162,11 @@ "-x", "c", "-o", - "/tmp/lexer_states-c32084.o", + "/tmp/lexer_states-f7dff6.o", "src/lexer/lexer_states.c" ], "directory": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json", "file": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json/src/lexer/lexer_states.c", - "output": "/tmp/lexer_states-c32084.o" + "output": "/tmp/lexer_states-f7dff6.o" } ] diff --git a/src/lexer/lexer_states.c b/src/lexer/lexer_states.c index 5b5a696..e62b358 100644 --- a/src/lexer/lexer_states.c +++ b/src/lexer/lexer_states.c @@ -25,7 +25,6 @@ typedef enum { // OBJECT STATES LEXER_STATE_KEY, // NUMBER STATES - LEXER_STATE_NUMBER_START, LEXER_STATE_DECIMAL, LEXER_STATE_NUMBER, LEXER_STATE_FRACTION, @@ -70,6 +69,13 @@ lexer_state_t handle_value(lexer_t *lexer, char input); lexer_state_t handle_string(char input); lexer_state_t handle_string_end(lexer_t *lexer, char input); lexer_state_t handle_escape_sequence(char input); +lexer_state_t handle_decimal(char input); +lexer_state_t handle_number(lexer_t *lexer, char input); +lexer_state_t handle_fraction(lexer_t *lexer, char input); +lexer_state_t handle_exponent(char input); +lexer_state_t handle_exp_sign(char input); +lexer_state_t handle_power(lexer_t *lexer, char input); +lexer_state_t handle_number_end(lexer_t *lexer, char input); bool validate_json(char *json) { lexer_t lexer = {0}; @@ -144,21 +150,26 @@ void lexer_state_machine(lexer_t *lexer, char input) { case LEXER_STATE_KEY: lexer->current = handle_key(lexer); break; - case LEXER_STATE_NUMBER_START: - break; case LEXER_STATE_DECIMAL: + lexer->current = handle_decimal(input); break; case LEXER_STATE_NUMBER: + lexer->current = handle_number(lexer, input); break; case LEXER_STATE_FRACTION: + lexer->current = handle_fraction(lexer, input); break; case LEXER_STATE_EXPONENT: + lexer->current = handle_exponent(input); break; case LEXER_STATE_EXP_SIGN: + lexer->current = handle_exp_sign(input); break; case LEXER_STATE_POWER: + lexer->current = handle_power(lexer, input); break; case LEXER_STATE_NUMBER_END: + lexer->current = handle_number_end(lexer, input); break; case LEXER_STATE_STRING: lexer->current = handle_string(input); @@ -241,15 +252,11 @@ lexer_state_t handle_object(lexer_t *lexer, char input) { lexer_state_t handle_array(lexer_t *lexer, char input) { if (isspace(input)) { return LEXER_STATE_ARRAY; - } else if (input == '"') { - stack_push(&(lexer->stack), LEXER_STATE_VALUE); - - return LEXER_STATE_STRING; } else if (input == ']') { return handle_collection_end(lexer, input); } - return LEXER_STATE_VALUE; + return handle_value(lexer, input); } lexer_state_t handle_key(lexer_t *lexer) { return LEXER_STATE_STRING; } @@ -257,6 +264,8 @@ lexer_state_t handle_key(lexer_t *lexer) { return LEXER_STATE_STRING; } lexer_state_t handle_value(lexer_t *lexer, char input) { if (isspace(input)) { return LEXER_STATE_VALUE; + } else if (isdigit(input) && input != '0') { + return LEXER_STATE_NUMBER; } switch (input) { @@ -332,3 +341,88 @@ lexer_state_t handle_escape_sequence(char input) { return LEXER_STATE_ERROR; } + +lexer_state_t handle_decimal(char input) { + if (input == '.') { + return LEXER_STATE_FRACTION; + } + + return LEXER_STATE_ERROR; +} + +lexer_state_t handle_number(lexer_t *lexer, char input) { + if (isdigit(input)) { + return LEXER_STATE_NUMBER; + } else if (input == '.') { + return LEXER_STATE_FRACTION; + } else if (input == '}' || input == ']') { + return handle_collection_end(lexer, input); + } else if (input == ',') { + return lexer->stack.stack[lexer->stack.size - 1]; + } else if (isspace(input)) { + return LEXER_STATE_NUMBER_END; + } + + return LEXER_STATE_ERROR; +} + +lexer_state_t handle_fraction(lexer_t *lexer, char input) { + if (isdigit(input)) { + return LEXER_STATE_FRACTION; + } else if (input == '}' || input == ']') { + return handle_collection_end(lexer, input); + } else if (input == 'e' || input == 'E') { + return LEXER_STATE_EXPONENT; + } else if (input == ',') { + return lexer->stack.stack[lexer->stack.size - 1]; + } else if (isspace(input)) { + return LEXER_STATE_NUMBER_END; + } + + return LEXER_STATE_ERROR; +} + +lexer_state_t handle_exponent(char input) { + if (isdigit(input)) { + return LEXER_STATE_POWER; + } else if (input == '+' || input == '-') { + return LEXER_STATE_EXP_SIGN; + } + + return LEXER_STATE_ERROR; +} + +lexer_state_t handle_exp_sign(char input) { + if (isdigit(input)) { + return LEXER_STATE_POWER; + } + + return LEXER_STATE_ERROR; +} + +lexer_state_t handle_power(lexer_t *lexer, char input) { + if (isdigit(input)) { + return LEXER_STATE_POWER; + } else if (input == '}' || input == ']') { + return handle_collection_end(lexer, input); + } else if (input == ',') { + return lexer->stack.stack[lexer->stack.size - 1]; + } else if (isspace(input)) { + return LEXER_STATE_NUMBER_END; + } + + return LEXER_STATE_ERROR; +} + +lexer_state_t handle_number_end(lexer_t *lexer, char input) { + if (isspace(input)) { + return LEXER_STATE_NUMBER_END; + } else if (input == ',') { + return lexer->stack.stack[lexer->stack.size - 1]; + } + + bool collection_end = input == '}' || input == ']'; + + return collection_end ? handle_collection_end(lexer, input) + : LEXER_STATE_ERROR; +} diff --git a/test_files/webapp.json b/test_files/webapp.json index 62811e3..23a7c0b 100644 --- a/test_files/webapp.json +++ b/test_files/webapp.json @@ -19,16 +19,16 @@ "useJSP": "false", "jspListTemplate": "listTemplate.jsp", "jspFileTemplate": "articleTemplate.jsp", - "cachePackageTagsTrack": "200", - "cachePackageTagsStore": "200", - "cachePackageTagsRefresh": "60", - "cacheTemplatesTrack": "100", - "cacheTemplatesStore": "50", - "cacheTemplatesRefresh": "15", - "cachePagesTrack": "200", - "cachePagesStore": "100", - "cachePagesRefresh": "10", - "cachePagesDirtyRead": "10", + "cachePackageTagsTrack": 200, + "cachePackageTagsStore": 200, + "cachePackageTagsRefresh": 60, + "cacheTemplatesTrack": 100, + "cacheTemplatesStore": 50, + "cacheTemplatesRefresh": 15, + "cachePagesTrack": 200, + "cachePagesStore": 100, + "cachePagesRefresh": 10, + "cachePagesDirtyRead": 10, "searchEngineListTemplate": "forSearchEnginesList.htm", "searchEngineFileTemplate": "forSearchEngines.htm", "searchEngineRobotsDb": "WEB-INF/robots.db", @@ -42,11 +42,11 @@ "dataStorePassword": "dataStoreTestQuery", "dataStoreTestQuery": "SET NOCOUNT ON;select test='test';", "dataStoreLogFile": "/usr/local/tomcat/logs/datastore.log", - "dataStoreInitConns": "10", - "dataStoreMaxConns": "100", - "dataStoreConnUsageLimit": "100", + "dataStoreInitConns": 10, + "dataStoreMaxConns": 100, + "dataStoreConnUsageLimit": 100, "dataStoreLogLevel": "debug", - "maxUrlLength": "500" + "maxUrlLength": 500 } }, { @@ -70,17 +70,17 @@ "servlet-class": "org.cofax.cms.CofaxToolsServlet", "init-param": { "templatePath": "toolstemplates/", - "log": "1", + "log": 1, "logLocation": "/usr/local/tomcat/logs/CofaxTools.log", "logMaxSize": "", - "dataLog": "1", + "dataLog": 1, "dataLogLocation": "/usr/local/tomcat/logs/dataLog.log", "dataLogMaxSize": "", "removePageCache": "/content/admin/remove?cache=pages&id=", "removeTemplateCache": "/content/admin/remove?cache=templates&id=", "fileTransferFolder": "/usr/local/tomcat/webapps/content/fileTransferFolder", - "lookInContext": "1", - "adminGroupID": "4", + "lookInContext": 1, + "adminGroupID": 4, "betaServer": "true" } }