summaryrefslogtreecommitdiff
path: root/token.c
diff options
context:
space:
mode:
Diffstat (limited to 'token.c')
-rw-r--r--token.c31
1 files changed, 26 insertions, 5 deletions
diff --git a/token.c b/token.c
index 05808f1..25223c0 100644
--- a/token.c
+++ b/token.c
@@ -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;
+}