Added handling numerical states
This commit is contained in:
		| @@ -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" | ||||
|   } | ||||
| ] | ||||
|   | ||||
| @@ -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; | ||||
| } | ||||
|   | ||||
| @@ -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" | ||||
| 				} | ||||
| 			} | ||||
|   | ||||
		Reference in New Issue
	
	Block a user