number type splitted to integer (int64_t) and float (double)
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -1 +1 @@
|
||||
{"id":-123, "name" : "qwerty", "exists": true}
|
||||
{"id":-123, "name": "qwerty", "size": -12345E3, "exists": true, "intarr": [ 11E1, 12, 13 ]}
|
||||
|
||||
Reference in New Issue
Block a user