diff options
author | kdx <kdx@42l.fr> | 2023-03-17 02:26:25 +0100 |
---|---|---|
committer | kdx <kdx@42l.fr> | 2023-03-17 02:26:25 +0100 |
commit | 4160e9650bcfe7449beb150cdf8196b768a92eb3 (patch) | |
tree | 14d4e2d4131d3c7a198466ba899efa5978808686 /token.c | |
parent | a60f03db9ef3eb65b8898a9bf0ad70fbc2d2cc53 (diff) | |
download | golem-4160e9650bcfe7449beb150cdf8196b768a92eb3.tar.gz |
extract scope
Diffstat (limited to 'token.c')
-rw-r--r-- | token.c | 31 |
1 files changed, 26 insertions, 5 deletions
@@ -24,8 +24,10 @@ token_destroy(Token *token) { while (token != NULL) { Token *next = token->next; - if (token->type == TOK_GROUP) + if (token->type == TOK_GROUP) { token_destroy(token->group.tokens); + token_destroy(token->group.scope); + } free(token); token = next; } @@ -39,9 +41,7 @@ token_append(Token **list, Token *elem) return *list; } - Token *end = *list; - while (end->next != NULL) - end = end->next; + Token *end = token_last(*list); end->next = elem; elem->prev = end; return *list; @@ -50,13 +50,22 @@ token_append(Token **list, Token *elem) void token_delete(Token **list, Token *elem) { + token_extract(list, elem); + free(elem); +} + +Token * +token_extract(Token **list, Token *elem) +{ if (elem->prev != NULL) elem->prev->next = elem->next; if (elem->next != NULL) elem->next->prev = elem->prev; if (*list == elem) *list = elem->next; - free(elem); + elem->prev = NULL; + elem->next = NULL; + return elem; } Token * @@ -97,6 +106,8 @@ token_print(Token *token, int recurse, int depth) if (token->type == TOK_GROUP) { printf("type: TOK_GROUP group.type: %c\n", token->group.type); + if (token->group.scope != NULL) + token_print(token->group.scope, 1, depth); token_print(token->group.tokens, 1, depth + 1); } else { printf("type: %c slice: ", token->type); @@ -125,3 +136,13 @@ token_len(Token *token) } return len; } + +Token * +token_last(Token *token) +{ + if (token == NULL) + return NULL; + while (token->next != NULL) + token = token->next; + return token; +} |