This commit is contained in:
2024-01-02 03:28:26 +02:00
parent b10e8b8827
commit 43e4d63d5b
10 changed files with 167 additions and 99 deletions

View File

@@ -158,4 +158,3 @@ void cboolarr_free(cboolarr_t* array) {
cboolarr_destroy(array);
free(array);
}

View File

@@ -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);

View File

@@ -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

View File

@@ -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;

View File

@@ -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 }