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

View File

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

View File

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

View File

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

View File

@@ -10,7 +10,8 @@ typedef struct {
char* key;
union {
char* str;
int64_t num;
int64_t integ;
double numb;
bool flag;
};
} jkval_t;
@@ -24,9 +25,10 @@ typedef struct {
} jparser_t;
#define JVALTYPE_STR 0x01
#define JVALTYPE_NUM 0x02
#define JVALTYPE_BOOL 0x03
#define JVALTYPE_BLK 0x04
#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);

View File

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

View File

@@ -1 +1 @@
{"id":-123, "name" : "qwerty", "exists": true}
{"id":-123, "name": "qwerty", "size": -12345E3, "exists": true, "intarr": [ 11E1, 12, 13 ]}