Improve int parsing and allow negatives

This commit is contained in:
2022-11-16 09:52:03 -05:00
parent 41bebd1472
commit 542366f74e
2 changed files with 47 additions and 1 deletions

View File

@@ -9,6 +9,7 @@
#include <assert.h> #include <assert.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <errno.h>
#define START_LIST_CHAR '(' #define START_LIST_CHAR '('
#define END_LIST_CHAR ')' #define END_LIST_CHAR ')'
@@ -71,14 +72,24 @@ struct ucl_object *ucl_token_next(const char **curr_src) {
str = strndup(start + 1, *curr_src - start - 2); str = strndup(start + 1, *curr_src - start - 2);
// TODO: free // TODO: free
return ucl_string_create(str); return ucl_string_create(str);
case '-':
case '+':
case '0'...'9': { case '0'...'9': {
// TODO: Add support for negative integers
char *end = NULL; char *end = NULL;
errno = 0;
long value = strtol(*curr_src, &end, 0); long value = strtol(*curr_src, &end, 0);
if (errno || *curr_src == end) {
goto symbol_case;
}
*curr_src = end; *curr_src = end;
if (!ucl_is_delimiter(*end)) {
return ucl_error_create("Integer value contained non-digits");
}
return ucl_int_create(value); return ucl_int_create(value);
} }
default: default:
symbol_case:
while (!ucl_is_delimiter(**curr_src)) { while (!ucl_is_delimiter(**curr_src)) {
(*curr_src)++; (*curr_src)++;
} }
@@ -100,6 +111,7 @@ struct ucl_object *ucl_tokenize(const char *source) {
const char *curr_src = source; const char *curr_src = source;
while ((curr_token = ucl_token_next(&curr_src)) != NULL) { while ((curr_token = ucl_token_next(&curr_src)) != NULL) {
UCL_RET_IF_ERROR(curr_token);
tokens_tail = ucl_list_append(tokens_tail, curr_token); tokens_tail = ucl_list_append(tokens_tail, curr_token);
} }

View File

@@ -320,6 +320,35 @@ static void test_parse_mismatched_closed(void) {
TEST_ASSERT_OBJ_ERROR(response); TEST_ASSERT_OBJ_ERROR(response);
} }
static void test_parse_int(void) {
response = ucl_parse("123");
TEST_ASSERT_OBJ_INT_V(response->cell.car, 123);
}
static void test_parse_int_hex(void) {
response = ucl_parse("0xa");
TEST_ASSERT_OBJ_INT_V(response->cell.car, 0xa);
}
static void test_parse_int_neg(void) {
response = ucl_parse("-7");
TEST_ASSERT_OBJ_INT_V(response->cell.car, -7);
}
static void test_parse_int_plus(void) {
response = ucl_parse("+7");
TEST_ASSERT_OBJ_INT_V(response->cell.car, 7);
}
static void test_parse_int_garbled(void) {
response = ucl_parse("+1234g7");
TEST_ASSERT_OBJ_ERROR(response);
}
int main(void) { int main(void) {
UNITY_BEGIN(); UNITY_BEGIN();
@@ -348,5 +377,10 @@ int main(void) {
RUN_TEST(test_parse_nested); RUN_TEST(test_parse_nested);
RUN_TEST(test_parse_mismatched_open); RUN_TEST(test_parse_mismatched_open);
RUN_TEST(test_parse_mismatched_closed); RUN_TEST(test_parse_mismatched_closed);
RUN_TEST(test_parse_int);
RUN_TEST(test_parse_int_hex);
RUN_TEST(test_parse_int_neg);
RUN_TEST(test_parse_int_plus);
RUN_TEST(test_parse_int_garbled);
return UNITY_END(); return UNITY_END();
} }