Added handling numerical states
This commit is contained in:
parent
43630526dc
commit
b0e527ee76
@ -95,12 +95,12 @@
|
|||||||
"-x",
|
"-x",
|
||||||
"c",
|
"c",
|
||||||
"-o",
|
"-o",
|
||||||
"/tmp/main-759cce.o",
|
"/tmp/main-d954cc.o",
|
||||||
"src/main.c"
|
"src/main.c"
|
||||||
],
|
],
|
||||||
"directory": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json",
|
"directory": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json",
|
||||||
"file": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json/src/main.c",
|
"file": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json/src/main.c",
|
||||||
"output": "/tmp/main-759cce.o"
|
"output": "/tmp/main-d954cc.o"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"arguments": [
|
"arguments": [
|
||||||
@ -162,11 +162,11 @@
|
|||||||
"-x",
|
"-x",
|
||||||
"c",
|
"c",
|
||||||
"-o",
|
"-o",
|
||||||
"/tmp/lexer_states-c32084.o",
|
"/tmp/lexer_states-f7dff6.o",
|
||||||
"src/lexer/lexer_states.c"
|
"src/lexer/lexer_states.c"
|
||||||
],
|
],
|
||||||
"directory": "/mnt/3A5CDF785CDF2CFF/Users/abdoo/dev/say_it_in_json",
|
"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",
|
"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
|
// OBJECT STATES
|
||||||
LEXER_STATE_KEY,
|
LEXER_STATE_KEY,
|
||||||
// NUMBER STATES
|
// NUMBER STATES
|
||||||
LEXER_STATE_NUMBER_START,
|
|
||||||
LEXER_STATE_DECIMAL,
|
LEXER_STATE_DECIMAL,
|
||||||
LEXER_STATE_NUMBER,
|
LEXER_STATE_NUMBER,
|
||||||
LEXER_STATE_FRACTION,
|
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(char input);
|
||||||
lexer_state_t handle_string_end(lexer_t *lexer, 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_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) {
|
bool validate_json(char *json) {
|
||||||
lexer_t lexer = {0};
|
lexer_t lexer = {0};
|
||||||
@ -144,21 +150,26 @@ void lexer_state_machine(lexer_t *lexer, char input) {
|
|||||||
case LEXER_STATE_KEY:
|
case LEXER_STATE_KEY:
|
||||||
lexer->current = handle_key(lexer);
|
lexer->current = handle_key(lexer);
|
||||||
break;
|
break;
|
||||||
case LEXER_STATE_NUMBER_START:
|
|
||||||
break;
|
|
||||||
case LEXER_STATE_DECIMAL:
|
case LEXER_STATE_DECIMAL:
|
||||||
|
lexer->current = handle_decimal(input);
|
||||||
break;
|
break;
|
||||||
case LEXER_STATE_NUMBER:
|
case LEXER_STATE_NUMBER:
|
||||||
|
lexer->current = handle_number(lexer, input);
|
||||||
break;
|
break;
|
||||||
case LEXER_STATE_FRACTION:
|
case LEXER_STATE_FRACTION:
|
||||||
|
lexer->current = handle_fraction(lexer, input);
|
||||||
break;
|
break;
|
||||||
case LEXER_STATE_EXPONENT:
|
case LEXER_STATE_EXPONENT:
|
||||||
|
lexer->current = handle_exponent(input);
|
||||||
break;
|
break;
|
||||||
case LEXER_STATE_EXP_SIGN:
|
case LEXER_STATE_EXP_SIGN:
|
||||||
|
lexer->current = handle_exp_sign(input);
|
||||||
break;
|
break;
|
||||||
case LEXER_STATE_POWER:
|
case LEXER_STATE_POWER:
|
||||||
|
lexer->current = handle_power(lexer, input);
|
||||||
break;
|
break;
|
||||||
case LEXER_STATE_NUMBER_END:
|
case LEXER_STATE_NUMBER_END:
|
||||||
|
lexer->current = handle_number_end(lexer, input);
|
||||||
break;
|
break;
|
||||||
case LEXER_STATE_STRING:
|
case LEXER_STATE_STRING:
|
||||||
lexer->current = handle_string(input);
|
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) {
|
lexer_state_t handle_array(lexer_t *lexer, char input) {
|
||||||
if (isspace(input)) {
|
if (isspace(input)) {
|
||||||
return LEXER_STATE_ARRAY;
|
return LEXER_STATE_ARRAY;
|
||||||
} else if (input == '"') {
|
|
||||||
stack_push(&(lexer->stack), LEXER_STATE_VALUE);
|
|
||||||
|
|
||||||
return LEXER_STATE_STRING;
|
|
||||||
} else if (input == ']') {
|
} else if (input == ']') {
|
||||||
return handle_collection_end(lexer, 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; }
|
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) {
|
lexer_state_t handle_value(lexer_t *lexer, char input) {
|
||||||
if (isspace(input)) {
|
if (isspace(input)) {
|
||||||
return LEXER_STATE_VALUE;
|
return LEXER_STATE_VALUE;
|
||||||
|
} else if (isdigit(input) && input != '0') {
|
||||||
|
return LEXER_STATE_NUMBER;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (input) {
|
switch (input) {
|
||||||
@ -332,3 +341,88 @@ lexer_state_t handle_escape_sequence(char input) {
|
|||||||
|
|
||||||
return LEXER_STATE_ERROR;
|
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",
|
"useJSP": "false",
|
||||||
"jspListTemplate": "listTemplate.jsp",
|
"jspListTemplate": "listTemplate.jsp",
|
||||||
"jspFileTemplate": "articleTemplate.jsp",
|
"jspFileTemplate": "articleTemplate.jsp",
|
||||||
"cachePackageTagsTrack": "200",
|
"cachePackageTagsTrack": 200,
|
||||||
"cachePackageTagsStore": "200",
|
"cachePackageTagsStore": 200,
|
||||||
"cachePackageTagsRefresh": "60",
|
"cachePackageTagsRefresh": 60,
|
||||||
"cacheTemplatesTrack": "100",
|
"cacheTemplatesTrack": 100,
|
||||||
"cacheTemplatesStore": "50",
|
"cacheTemplatesStore": 50,
|
||||||
"cacheTemplatesRefresh": "15",
|
"cacheTemplatesRefresh": 15,
|
||||||
"cachePagesTrack": "200",
|
"cachePagesTrack": 200,
|
||||||
"cachePagesStore": "100",
|
"cachePagesStore": 100,
|
||||||
"cachePagesRefresh": "10",
|
"cachePagesRefresh": 10,
|
||||||
"cachePagesDirtyRead": "10",
|
"cachePagesDirtyRead": 10,
|
||||||
"searchEngineListTemplate": "forSearchEnginesList.htm",
|
"searchEngineListTemplate": "forSearchEnginesList.htm",
|
||||||
"searchEngineFileTemplate": "forSearchEngines.htm",
|
"searchEngineFileTemplate": "forSearchEngines.htm",
|
||||||
"searchEngineRobotsDb": "WEB-INF/robots.db",
|
"searchEngineRobotsDb": "WEB-INF/robots.db",
|
||||||
@ -42,11 +42,11 @@
|
|||||||
"dataStorePassword": "dataStoreTestQuery",
|
"dataStorePassword": "dataStoreTestQuery",
|
||||||
"dataStoreTestQuery": "SET NOCOUNT ON;select test='test';",
|
"dataStoreTestQuery": "SET NOCOUNT ON;select test='test';",
|
||||||
"dataStoreLogFile": "/usr/local/tomcat/logs/datastore.log",
|
"dataStoreLogFile": "/usr/local/tomcat/logs/datastore.log",
|
||||||
"dataStoreInitConns": "10",
|
"dataStoreInitConns": 10,
|
||||||
"dataStoreMaxConns": "100",
|
"dataStoreMaxConns": 100,
|
||||||
"dataStoreConnUsageLimit": "100",
|
"dataStoreConnUsageLimit": 100,
|
||||||
"dataStoreLogLevel": "debug",
|
"dataStoreLogLevel": "debug",
|
||||||
"maxUrlLength": "500"
|
"maxUrlLength": 500
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -70,17 +70,17 @@
|
|||||||
"servlet-class": "org.cofax.cms.CofaxToolsServlet",
|
"servlet-class": "org.cofax.cms.CofaxToolsServlet",
|
||||||
"init-param": {
|
"init-param": {
|
||||||
"templatePath": "toolstemplates/",
|
"templatePath": "toolstemplates/",
|
||||||
"log": "1",
|
"log": 1,
|
||||||
"logLocation": "/usr/local/tomcat/logs/CofaxTools.log",
|
"logLocation": "/usr/local/tomcat/logs/CofaxTools.log",
|
||||||
"logMaxSize": "",
|
"logMaxSize": "",
|
||||||
"dataLog": "1",
|
"dataLog": 1,
|
||||||
"dataLogLocation": "/usr/local/tomcat/logs/dataLog.log",
|
"dataLogLocation": "/usr/local/tomcat/logs/dataLog.log",
|
||||||
"dataLogMaxSize": "",
|
"dataLogMaxSize": "",
|
||||||
"removePageCache": "/content/admin/remove?cache=pages&id=",
|
"removePageCache": "/content/admin/remove?cache=pages&id=",
|
||||||
"removeTemplateCache": "/content/admin/remove?cache=templates&id=",
|
"removeTemplateCache": "/content/admin/remove?cache=templates&id=",
|
||||||
"fileTransferFolder": "/usr/local/tomcat/webapps/content/fileTransferFolder",
|
"fileTransferFolder": "/usr/local/tomcat/webapps/content/fileTransferFolder",
|
||||||
"lookInContext": "1",
|
"lookInContext": 1,
|
||||||
"adminGroupID": "4",
|
"adminGroupID": 4,
|
||||||
"betaServer": "true"
|
"betaServer": "true"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user