at work
This commit is contained in:
@@ -158,4 +158,3 @@ void cboolarr_free(cboolarr_t* array) {
|
||||
cboolarr_destroy(array);
|
||||
free(array);
|
||||
}
|
||||
|
||||
|
||||
@@ -83,6 +83,11 @@ void jlexer_init(jlexer_t * lexer, rcache_t * cache) {
|
||||
lexer->tokpos = 0;
|
||||
lexer->letter = EOF;
|
||||
lexer->rewind = false;
|
||||
lexer->jpos = 0;
|
||||
}
|
||||
|
||||
int jlexer_gettokbegin(jlexer_t * lexer) {
|
||||
return lexer->jpos - lexer->tokpos;
|
||||
}
|
||||
|
||||
int jlexer_gettoken(jlexer_t * lexer, char* token) {
|
||||
@@ -90,6 +95,7 @@ int jlexer_gettoken(jlexer_t * lexer, char* token) {
|
||||
while (true) {
|
||||
if (!lexer->rewind) {
|
||||
lexer->letter = rcache_getc(lexer->cache);
|
||||
lexer->jpos++;
|
||||
}
|
||||
lexer->rewind = false;
|
||||
int type = get_ltype(lexer->letter);
|
||||
|
||||
@@ -12,6 +12,7 @@ typedef struct {
|
||||
char letter;
|
||||
int tokpos;
|
||||
bool rewind;
|
||||
int jpos;
|
||||
} jlexer_t;
|
||||
|
||||
|
||||
@@ -35,6 +36,6 @@ typedef struct {
|
||||
void jlexer_init(jlexer_t * lexer, rcache_t * cache);
|
||||
int jlexer_gettoken(jlexer_t * lexer, char* token);
|
||||
void jlexer_destroy(jlexer_t * lexer);
|
||||
|
||||
int jlexer_gettokbegin(jlexer_t * lexer);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -31,7 +31,7 @@ void jparser_init(jparser_t * parser, jlexer_t * lexer) {
|
||||
|
||||
#define MAX_TOKEN_SIZE 1024
|
||||
|
||||
int jparser_parse_array(jparser_t * parser, char* arrname) {
|
||||
static int jparser_parse_array(jparser_t * parser, char* arrname) {
|
||||
jlexer_t* lex = parser->lexer;
|
||||
|
||||
char token[MAX_TOKEN_SIZE];
|
||||
@@ -39,18 +39,67 @@ int jparser_parse_array(jparser_t * parser, char* arrname) {
|
||||
|
||||
int pos = 0;
|
||||
|
||||
|
||||
while ((type = jlexer_gettoken(lex, token)) != JLEXTOK_END) {
|
||||
log_debug("pos %d tok 0x%02x: %s\n", pos, type, token);
|
||||
|
||||
if (type == JLEXTOK_ARRE) {
|
||||
return 1;
|
||||
log_debug("Array parser pos %d tok 0x%02x: %s", pos, type, token);
|
||||
switch (pos) {
|
||||
// POS 0
|
||||
case 0:{
|
||||
if (type == JLEXTOK_SEPAR) {
|
||||
break;
|
||||
}
|
||||
if (type == JLEXTOK_ARRE) {
|
||||
return 1;
|
||||
}
|
||||
if (type == JLEXTOK_INTEG) {
|
||||
char* val = strcopy(token);
|
||||
char* eptr = NULL;
|
||||
int64_t integ = (int64_t)strtol(val, &eptr, 10);;
|
||||
free(val);
|
||||
log_debug("Parser integer array element %s = %d", arrname, integ);
|
||||
}
|
||||
if (type == JLEXTOK_FLOAT) {
|
||||
char* val = strcopy(token);
|
||||
char* eptr = NULL;
|
||||
double numb = (double)strtod(val, &eptr);
|
||||
log_debug("Parser float array element %s = %f", arrname, numb);
|
||||
free(val);
|
||||
}
|
||||
if (type == JLEXTOK_RAWSTR) {
|
||||
char* val = strcopy(token);
|
||||
bool isbool = false;
|
||||
bool bval = false;
|
||||
if (strcmp(val, "true") == 0) {
|
||||
isbool = true;
|
||||
bval = true;
|
||||
}
|
||||
if (strcmp(val, "false") == 0) {
|
||||
isbool = true;
|
||||
bval = false;
|
||||
}
|
||||
free(val);
|
||||
if (isbool) {
|
||||
log_debug("Parser bool array element %s = %d", arrname, bval);
|
||||
break;
|
||||
}
|
||||
log_error("Wrong array value token: %s", token);
|
||||
return -1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 1:{
|
||||
if (type == JLEXTOK_ARRE) {
|
||||
return 1;
|
||||
}
|
||||
if (type == JLEXTOK_SEPAR) {
|
||||
pos = 0;
|
||||
break;
|
||||
}
|
||||
log_error("Wrong array value token: %s", token);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
return 1;
|
||||
|
||||
}
|
||||
|
||||
int jparser_parse(jparser_t * parser) {
|
||||
@@ -62,7 +111,7 @@ int jparser_parse(jparser_t * parser) {
|
||||
char* key = "";
|
||||
|
||||
while ((type = jlexer_gettoken(lex, token)) != JLEXTOK_END) {
|
||||
log_debug("pos %d tok 0x%02x: %s\n", pos, type, token);
|
||||
log_debug("Parser pos %d tok 0x%02x: %s", pos, type, token);
|
||||
switch (pos) {
|
||||
// POS 0
|
||||
case 0:{
|
||||
@@ -90,7 +139,7 @@ int jparser_parse(jparser_t * parser) {
|
||||
if (type == JLEXTOK_BLOCKE)
|
||||
return 0;
|
||||
if (type != JLEXTOK_WORD) {
|
||||
log_error("Wrong word token: %s", token);
|
||||
log_error("Wrong word token: %s in pos %d", token, jlexer_gettokbegin(lex));
|
||||
return -1;
|
||||
}
|
||||
key = strcopy(token);
|
||||
@@ -137,6 +186,11 @@ int jparser_parse(jparser_t * parser) {
|
||||
break;
|
||||
}
|
||||
if (type == JLEXTOK_INTEG) {
|
||||
if (strcmp(token, "-") == 0 || strcmp(token, "+") == 0) {
|
||||
log_error("Wrong integer token: %s in pos %d", token, jlexer_gettokbegin(lex));
|
||||
return -1;
|
||||
}
|
||||
|
||||
char* val = strcopy(token);
|
||||
jkval_t* kv = &(parser->kvalarr[parser->kvalsize]);
|
||||
kv->key = strcopy(key);
|
||||
@@ -145,26 +199,30 @@ int jparser_parse(jparser_t * parser) {
|
||||
kv->integ = (int64_t)strtol(val, &eptr, 10);;
|
||||
free(val);
|
||||
free(key);
|
||||
log_debug("Parser added integer key %s = %d", kv->key, kv->integ);
|
||||
log_debug("Parser added integer key-value %s = %d", kv->key, kv->integ);
|
||||
parser->kvalsize++;
|
||||
pos++;
|
||||
break;
|
||||
}
|
||||
if (type == JLEXTOK_FLOAT) {
|
||||
if (strcmp(token, "-") == 0 || strcmp(token, "+") == 0) {
|
||||
log_error("Wrong integer token: %s in pos %d", token, jlexer_gettokbegin(lex));
|
||||
return -1;
|
||||
}
|
||||
|
||||
char* val = strcopy(token);
|
||||
jkval_t* kv = &(parser->kvalarr[parser->kvalsize]);
|
||||
kv->key = strcopy(key);
|
||||
kv->type = JVALTYPE_FLOAT;
|
||||
char* eptr = NULL;
|
||||
kv->numb = (double)strtod(val, &eptr);
|
||||
log_debug("Parser added float key %s = %f", kv->key, kv->numb);
|
||||
log_debug("Parser added float key-value %s = %f", kv->key, kv->numb);
|
||||
free(val);
|
||||
free(key);
|
||||
parser->kvalsize++;
|
||||
pos++;
|
||||
break;
|
||||
}
|
||||
|
||||
if (type == JLEXTOK_RAWSTR) {
|
||||
char* val = strcopy(token);
|
||||
bool isbool = false;
|
||||
@@ -177,16 +235,20 @@ int jparser_parse(jparser_t * parser) {
|
||||
isbool = true;
|
||||
bval = false;
|
||||
}
|
||||
free(val);
|
||||
if (isbool) {
|
||||
jkval_t* kv = &(parser->kvalarr[parser->kvalsize]);
|
||||
kv->key = strcopy(key);
|
||||
log_debug("Parser added bool key %s = %d", kv->key, bval);
|
||||
log_debug("Parser added bool key-value %s = %d", kv->key, bval);
|
||||
kv->type = JVALTYPE_BOOL;
|
||||
kv->flag = bval;
|
||||
free(key);
|
||||
parser->kvalsize++;
|
||||
pos++;
|
||||
break;
|
||||
} else {
|
||||
log_error("Wrong bool token: %s in pos %d", token, jlexer_gettokbegin(lex));
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
if (type == JLEXTOK_ARRB) {
|
||||
@@ -200,7 +262,7 @@ int jparser_parse(jparser_t * parser) {
|
||||
pos++;
|
||||
break;
|
||||
}
|
||||
log_error("Wrong value token: %s", token);
|
||||
log_error("Uknown token: %s in pos %d", token, jlexer_gettokbegin(lex));
|
||||
return -1;
|
||||
|
||||
}
|
||||
@@ -216,7 +278,7 @@ int jparser_parse(jparser_t * parser) {
|
||||
//log_debug("Block ended: %s", token);
|
||||
return 0;
|
||||
} else if (type != JLEXTOK_NEXT && type != JLEXTOK_BLOCKE) {
|
||||
log_error("Wrong next token: %s", token);
|
||||
log_error("Wrong next token: %s in pos %d", token, jlexer_gettokbegin(lex));
|
||||
return -1;
|
||||
}
|
||||
pos = 1;
|
||||
|
||||
@@ -1 +1 @@
|
||||
{"id":-123, "name": "qwerty", "size": -12345E3, "exists": true, "intarr": [ 11E1, 12, 13 ], "a\"b.c": 567.123 }
|
||||
{"id": 123, "name": "qwerty", "size": -12345E3, "exists": true, "intarr": [ 11E1, 12, 13, true ], "a\"b.c": 567.123 }
|
||||
|
||||
Reference in New Issue
Block a user