number type splitted to integer (int64_t) and float (double)
This commit is contained in:
+9
-3
@@ -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
@@ -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
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
+7
-5
@@ -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;
|
||||||
@@ -23,10 +24,11 @@ typedef struct {
|
|||||||
jlexer_t* lexer;
|
jlexer_t* lexer;
|
||||||
} 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
@@ -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
@@ -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