number type splitted to integer (int64_t) and float (double)

This commit is contained in:
2024-01-01 20:44:45 +02:00
parent 6e85ed7602
commit 789c9706f3
6 changed files with 84 additions and 20 deletions
+9 -3
View File
@@ -65,11 +65,11 @@ static int get_ltype(char letter) {
case '8': case '8':
case '9': case '9':
case '0': case '0':
case '+':
case '-':
case '.': case '.':
case 'E': case 'E':
case 'e': case 'e':
case '+':
case '-':
return JLEXTYPE_NUM; return JLEXTYPE_NUM;
default: default:
return JLEXTYPE_CHAR; return JLEXTYPE_CHAR;
@@ -194,7 +194,13 @@ int jlexer_gettoken(jlexer_t * lexer, char* token) {
token[lexer->tokpos++] = '\0'; token[lexer->tokpos++] = '\0';
lexer->rewind = true; lexer->rewind = true;
lexer->context = JLEXCONT_UNDEF; 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; lexer->context = newcontext;
token[lexer->tokpos++] = lexer->letter; token[lexer->tokpos++] = lexer->letter;
+4 -3
View File
@@ -22,9 +22,10 @@ typedef struct {
#define JLEXTOK_SEPAR 0x03 #define JLEXTOK_SEPAR 0x03
#define JLEXTOK_UNDEF 0x04 #define JLEXTOK_UNDEF 0x04
#define JLEXTOK_WORD 0x05 #define JLEXTOK_WORD 0x05
#define JLEXTOK_NUMB 0x06 #define JLEXTOK_INTEG 0x06
#define JLEXTOK_RAWSTR 0x07 #define JLEXTOK_FLOAT 0x07
#define JLEXTOK_NEXT 0x08 #define JLEXTOK_RAWSTR 0x08
#define JLEXTOK_NEXT 0x09
#define JLEXTOK_ARRB 0x10 #define JLEXTOK_ARRB 0x10
#define JLEXTOK_ARRE 0x11 #define JLEXTOK_ARRE 0x11
#define JLEXTOK_END 0x99 #define JLEXTOK_END 0x99
+55 -7
View File
@@ -31,6 +31,26 @@ void jparser_init(jparser_t * parser, jlexer_t * lexer) {
#define MAX_TOKEN_SIZE 1024 #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) { int jparser_parse(jparser_t * parser) {
jlexer_t* lex = parser->lexer; jlexer_t* lex = parser->lexer;
@@ -115,20 +135,35 @@ int jparser_parse(jparser_t * parser) {
pos++; pos++;
break; break;
} }
if (type == JLEXTOK_NUMB) { if (type == JLEXTOK_INTEG) {
char* val = strcopy(token); char* val = strcopy(token);
jkval_t* kv = &(parser->kvalarr[parser->kvalsize]); jkval_t* kv = &(parser->kvalarr[parser->kvalsize]);
kv->key = strcopy(key); kv->key = strcopy(key);
//log_debug("Parser added key %s", kv->key); kv->type = JVALTYPE_INTEG;
kv->type = JVALTYPE_NUM;
char* eptr = NULL; 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(val);
free(key); free(key);
parser->kvalsize++; parser->kvalsize++;
pos++; pos++;
break; break;
} }
if (type == JLEXTOK_RAWSTR) { if (type == JLEXTOK_RAWSTR) {
char* val = strcopy(token); char* val = strcopy(token);
bool isbool = false; bool isbool = false;
@@ -153,6 +188,17 @@ int jparser_parse(jparser_t * parser) {
break; 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); log_error("Wrong value token: %s", token);
return -1; 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 (strcmp(kv->key, key) == 0) {
if (kv->type == JVALTYPE_STR) { if (kv->type == JVALTYPE_STR) {
*(char**)(ref) = strcopy(kv->str); *(char**)(ref) = strcopy(kv->str);
} else if (kv->type == JVALTYPE_NUM) { } else if (kv->type == JVALTYPE_INTEG) {
*(int*)(ref) = kv->num; *(int64_t*)(ref) = kv->integ;
} else if (kv->type == JVALTYPE_FLOAT) {
*(double*)(ref) = kv->numb;
} else if (kv->type == JVALTYPE_BOOL) { } else if (kv->type == JVALTYPE_BOOL) {
*(bool*)(ref) = kv->num; *(bool*)(ref) = kv->flag;
} }
return 0; return 0;
} }
+6 -4
View File
@@ -10,7 +10,8 @@ typedef struct {
char* key; char* key;
union { union {
char* str; char* str;
int64_t num; int64_t integ;
double numb;
bool flag; bool flag;
}; };
} jkval_t; } jkval_t;
@@ -24,9 +25,10 @@ typedef struct {
} jparser_t; } jparser_t;
#define JVALTYPE_STR 0x01 #define JVALTYPE_STR 0x01
#define JVALTYPE_NUM 0x02 #define JVALTYPE_INTEG 0x02
#define JVALTYPE_BOOL 0x03 #define JVALTYPE_FLOAT 0x03
#define JVALTYPE_BLK 0x04 #define JVALTYPE_BOOL 0x04
#define JVALTYPE_BLK 0x05
void jparser_init(jparser_t* parser, jlexer_t* lexer); void jparser_init(jparser_t* parser, jlexer_t* lexer);
+8 -1
View File
@@ -36,11 +36,17 @@ int main(void) {
} }
int64_t id = 0; 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"); log_error("cannot bind id variable\n");
return 1; 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 = ""; char* name = "";
if (jparser_bind(&parser, JVALTYPE_STR, "name", (void *)&name) < 0) { if (jparser_bind(&parser, JVALTYPE_STR, "name", (void *)&name) < 0) {
log_error("cannot bind name variable\n"); log_error("cannot bind name variable\n");
@@ -53,6 +59,7 @@ int main(void) {
printf("id = %ld\n", id); printf("id = %ld\n", id);
printf("size = %f\n", size);
printf("name = %s\n", name); printf("name = %s\n", name);
printf("exists = %d\n", exists); printf("exists = %d\n", exists);
+1 -1
View File
@@ -1 +1 @@
{"id":-123, "name" : "qwerty", "exists": true} {"id":-123, "name": "qwerty", "size": -12345E3, "exists": true, "intarr": [ 11E1, 12, 13 ]}