Minor refactor to parsing and testing cleanup
This commit is contained in:
33
src/parse.c
33
src/parse.c
@@ -57,7 +57,7 @@ struct ucl_object *ucl_token_next(const char **curr_src) {
|
||||
str[0] = **curr_src;
|
||||
str[1] = '\0';
|
||||
(*curr_src)++;
|
||||
return ucl_cell_create(ucl_symbol_create(str), NULL);
|
||||
return ucl_symbol_create(str);
|
||||
case QUOTE_CHAR:
|
||||
// skip beginning quote
|
||||
(*curr_src)++;
|
||||
@@ -69,20 +69,22 @@ struct ucl_object *ucl_token_next(const char **curr_src) {
|
||||
(*curr_src)++;
|
||||
// -2 for removing start/end quotes
|
||||
str = strndup(start + 1, *curr_src - start - 2);
|
||||
return ucl_cell_create(ucl_string_create(str), NULL);
|
||||
// TODO: free
|
||||
return ucl_string_create(str);
|
||||
case '0'...'9': {
|
||||
// TODO: Add support for negative integers
|
||||
char *end = NULL;
|
||||
long value = strtol(*curr_src, &end, 0);
|
||||
*curr_src = end;
|
||||
return ucl_cell_create(ucl_int_create(value), NULL);
|
||||
return ucl_int_create(value);
|
||||
}
|
||||
default:
|
||||
while (!ucl_is_delimiter(**curr_src)) {
|
||||
(*curr_src)++;
|
||||
}
|
||||
// TODO: Free
|
||||
str = strndup(start, *curr_src - start);
|
||||
return ucl_cell_create(ucl_symbol_create(str), NULL);
|
||||
return ucl_symbol_create(str);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -92,12 +94,12 @@ struct ucl_object *ucl_token_next(const char **curr_src) {
|
||||
}
|
||||
|
||||
struct ucl_object *ucl_tokenize(const char *source) {
|
||||
struct ucl_object *tokens = NULL, *curr_token = NULL, **next_token = &tokens;
|
||||
struct ucl_object *tokens = ucl_nil_create();
|
||||
struct ucl_object *curr_token = NULL;
|
||||
const char *curr_src = source;
|
||||
|
||||
while ((curr_token = ucl_token_next(&curr_src)) != NULL) {
|
||||
*next_token = curr_token;
|
||||
next_token = &curr_token->cell.cdr;
|
||||
ucl_list_append(tokens, curr_token);
|
||||
}
|
||||
|
||||
return tokens;
|
||||
@@ -197,9 +199,9 @@ static struct ucl_object *ucl_parse_tokens_recursive(struct ucl_object **token_i
|
||||
// parse_tokens_recursive -> error on EOF)
|
||||
|
||||
struct ucl_object *ucl_parse_tokens(struct ucl_object *tokens) {
|
||||
struct ucl_object* resultl = NULL;
|
||||
struct ucl_object* result = ucl_nil_create();
|
||||
struct ucl_object* result_tail = result;
|
||||
struct ucl_object** token_iter = &tokens;
|
||||
struct ucl_object** next_cell = &resultl;
|
||||
|
||||
while (*token_iter != NULL) {
|
||||
struct ucl_object *new_sexp = ucl_parse_tokens_recursive(token_iter);
|
||||
@@ -207,25 +209,18 @@ struct ucl_object *ucl_parse_tokens(struct ucl_object *tokens) {
|
||||
return new_sexp;
|
||||
}
|
||||
|
||||
*next_cell = ucl_cell_create(new_sexp, NULL);
|
||||
next_cell = &(*next_cell)->cell.cdr;
|
||||
ucl_list_append(result_tail, new_sexp);
|
||||
}
|
||||
|
||||
if (resultl == NULL) {
|
||||
return ucl_cell_create(NULL, NULL);
|
||||
}
|
||||
|
||||
return resultl;
|
||||
return result;
|
||||
}
|
||||
|
||||
// TODO: Should the parse a single sexp (return the last-parsed position), or
|
||||
// all sexps in the source (return a list of sexps)?
|
||||
struct ucl_object *ucl_parse(const char *source) {
|
||||
struct ucl_object *tokens = ucl_tokenize(source);
|
||||
if (tokens == NULL) {
|
||||
tokens = ucl_nil_create();
|
||||
}
|
||||
UCL_RET_IF_ERROR(tokens);
|
||||
|
||||
struct ucl_object *sexp = ucl_parse_tokens(tokens);
|
||||
if (sexp == NULL) {
|
||||
return ucl_nil_create();
|
||||
|
||||
@@ -116,7 +116,7 @@ struct ucl_object *ucl_list_append(struct ucl_object *list, struct ucl_object *o
|
||||
|
||||
if (list->cell.car == NULL) {
|
||||
list->cell.car = obj;
|
||||
return list;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
while (iter->cell.cdr != NULL) {
|
||||
@@ -124,7 +124,7 @@ struct ucl_object *ucl_list_append(struct ucl_object *list, struct ucl_object *o
|
||||
}
|
||||
iter->cell.cdr = ucl_cell_create(obj, NULL);
|
||||
|
||||
return list;
|
||||
return iter->cell.cdr;
|
||||
}
|
||||
|
||||
void ucl_print_obj(struct ucl_object *obj) {
|
||||
|
||||
Reference in New Issue
Block a user