diff --git a/clib/jlexer.c b/clib/jlexer.c index 1d76684..3a89a36 100644 --- a/clib/jlexer.c +++ b/clib/jlexer.c @@ -65,11 +65,11 @@ static int get_ltype(char letter) { case '8': case '9': case '0': + case '+': + case '-': case '.': case 'E': case 'e': - case '+': - case '-': return JLEXTYPE_NUM; default: return JLEXTYPE_CHAR; @@ -194,7 +194,13 @@ int jlexer_gettoken(jlexer_t * lexer, char* token) { token[lexer->tokpos++] = '\0'; lexer->rewind = true; lexer->context = JLEXCONT_UNDEF; - return JLEXTOK_NUMB; + for (int i = 0; i < strlen(token); i++) { + if (token[i] == 'E' || token[i] == 'e' || token[i] == '.') { + return JLEXTOK_FLOAT; + } + + } + return JLEXTOK_INTEG; } lexer->context = newcontext; token[lexer->tokpos++] = lexer->letter; diff --git a/clib/jlexer.h b/clib/jlexer.h index bd13db3..dc64945 100644 --- a/clib/jlexer.h +++ b/clib/jlexer.h @@ -22,9 +22,10 @@ typedef struct { #define JLEXTOK_SEPAR 0x03 #define JLEXTOK_UNDEF 0x04 #define JLEXTOK_WORD 0x05 -#define JLEXTOK_NUMB 0x06 -#define JLEXTOK_RAWSTR 0x07 -#define JLEXTOK_NEXT 0x08 +#define JLEXTOK_INTEG 0x06 +#define JLEXTOK_FLOAT 0x07 +#define JLEXTOK_RAWSTR 0x08 +#define JLEXTOK_NEXT 0x09 #define JLEXTOK_ARRB 0x10 #define JLEXTOK_ARRE 0x11 #define JLEXTOK_END 0x99 diff --git a/clib/jparser.c b/clib/jparser.c index eeddd60..4287f7f 100644 --- a/clib/jparser.c +++ b/clib/jparser.c @@ -31,6 +31,26 @@ void jparser_init(jparser_t * parser, jlexer_t * lexer) { #define MAX_TOKEN_SIZE 1024 +int jparser_parse_array(jparser_t * parser, char* arrname) { + jlexer_t* lex = parser->lexer; + + char token[MAX_TOKEN_SIZE]; + int type = 0; + + 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; + } + + + } + return 1; + +} int jparser_parse(jparser_t * parser) { jlexer_t* lex = parser->lexer; @@ -115,20 +135,35 @@ int jparser_parse(jparser_t * parser) { pos++; break; } - if (type == JLEXTOK_NUMB) { + if (type == JLEXTOK_INTEG) { char* val = strcopy(token); jkval_t* kv = &(parser->kvalarr[parser->kvalsize]); kv->key = strcopy(key); - //log_debug("Parser added key %s", kv->key); - kv->type = JVALTYPE_NUM; + kv->type = JVALTYPE_INTEG; char* eptr = NULL; - kv->num = (int64_t)strtol(val, &eptr, 10);; + kv->integ = (int64_t)strtol(val, &eptr, 10);; + free(val); + free(key); + log_debug("Parser added integer key %s = %d", kv->key, kv->integ); + parser->kvalsize++; + pos++; + break; + } + if (type == JLEXTOK_FLOAT) { + 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); free(val); free(key); parser->kvalsize++; pos++; break; } + if (type == JLEXTOK_RAWSTR) { char* val = strcopy(token); bool isbool = false; @@ -153,6 +188,17 @@ int jparser_parse(jparser_t * parser) { break; } } + if (type == JLEXTOK_ARRB) { + jkval_t* kv = &(parser->kvalarr[parser->kvalsize]); + kv->key = strcopy(key); + log_debug("Parser added array key %s", kv->key); + if (jparser_parse_array(parser, kv->key) < 0) { + log_error("Wrong array: %s", key); + return -1; + } + pos++; + break; + } log_error("Wrong value token: %s", token); return -1; @@ -196,10 +242,12 @@ int jparser_bind(jparser_t* parser, int type, char* key, void* ref) { if (strcmp(kv->key, key) == 0) { if (kv->type == JVALTYPE_STR) { *(char**)(ref) = strcopy(kv->str); - } else if (kv->type == JVALTYPE_NUM) { - *(int*)(ref) = kv->num; + } else if (kv->type == JVALTYPE_INTEG) { + *(int64_t*)(ref) = kv->integ; + } else if (kv->type == JVALTYPE_FLOAT) { + *(double*)(ref) = kv->numb; } else if (kv->type == JVALTYPE_BOOL) { - *(bool*)(ref) = kv->num; + *(bool*)(ref) = kv->flag; } return 0; } diff --git a/clib/jparser.h b/clib/jparser.h index 52c3e96..19e52dc 100644 --- a/clib/jparser.h +++ b/clib/jparser.h @@ -10,7 +10,8 @@ typedef struct { char* key; union { char* str; - int64_t num; + int64_t integ; + double numb; bool flag; }; } jkval_t; @@ -23,10 +24,11 @@ typedef struct { jlexer_t* lexer; } jparser_t; -#define JVALTYPE_STR 0x01 -#define JVALTYPE_NUM 0x02 -#define JVALTYPE_BOOL 0x03 -#define JVALTYPE_BLK 0x04 +#define JVALTYPE_STR 0x01 +#define JVALTYPE_INTEG 0x02 +#define JVALTYPE_FLOAT 0x03 +#define JVALTYPE_BOOL 0x04 +#define JVALTYPE_BLK 0x05 void jparser_init(jparser_t* parser, jlexer_t* lexer); diff --git a/clib/jparser_test.c b/clib/jparser_test.c index 03d7477..436382f 100644 --- a/clib/jparser_test.c +++ b/clib/jparser_test.c @@ -36,11 +36,17 @@ int main(void) { } int64_t id = 0; - if (jparser_bind(&parser, JVALTYPE_NUM, "id", (void *)&id) < 0) { + if (jparser_bind(&parser, JVALTYPE_INTEG, "id", (void *)&id) < 0) { log_error("cannot bind id variable\n"); return 1; } + double size = 0; + if (jparser_bind(&parser, JVALTYPE_FLOAT, "size", (void *)&size) < 0) { + log_error("cannot bind size variable\n"); + return 1; + } + char* name = ""; if (jparser_bind(&parser, JVALTYPE_STR, "name", (void *)&name) < 0) { log_error("cannot bind name variable\n"); @@ -53,6 +59,7 @@ int main(void) { printf("id = %ld\n", id); + printf("size = %f\n", size); printf("name = %s\n", name); printf("exists = %d\n", exists); diff --git a/clib/test.json b/clib/test.json index 6d9185a..2af663e 100644 --- a/clib/test.json +++ b/clib/test.json @@ -1 +1 @@ -{"id":-123, "name" : "qwerty", "exists": true} +{"id":-123, "name": "qwerty", "size": -12345E3, "exists": true, "intarr": [ 11E1, 12, 13 ]}