Insert expansions of macro functions.
This commit is contained in:
parent
04906fd5b0
commit
d577e56fb9
77
cc_macro.c
77
cc_macro.c
|
@ -88,6 +88,32 @@ void eat_newline_tokens()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct token_list* lookup_token(struct token_list* token, struct token_list* arguments)
|
||||||
|
{
|
||||||
|
char *s;
|
||||||
|
if(NULL == token)
|
||||||
|
{
|
||||||
|
fputs("null token received in token\n", stderr);
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct token_list* hold = arguments;
|
||||||
|
|
||||||
|
while (NULL != hold)
|
||||||
|
{
|
||||||
|
if (match(token->s, hold->s))
|
||||||
|
{
|
||||||
|
/* found! */
|
||||||
|
return hold->expansion;
|
||||||
|
}
|
||||||
|
|
||||||
|
hold = hold->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* not found! */
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/* returns the first token inserted; inserts *before* point */
|
/* returns the first token inserted; inserts *before* point */
|
||||||
struct token_list* insert_tokens(struct token_list* point, struct token_list* token)
|
struct token_list* insert_tokens(struct token_list* point, struct token_list* token)
|
||||||
{
|
{
|
||||||
|
@ -126,6 +152,27 @@ struct token_list* insert_tokens(struct token_list* point, struct token_list* to
|
||||||
return first;
|
return first;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* returns the first token inserted; inserts *before* point */
|
||||||
|
struct token_list* copy_list(struct token_list* token)
|
||||||
|
{
|
||||||
|
struct token_list* copy;
|
||||||
|
struct token_list* prev = NULL;
|
||||||
|
|
||||||
|
while (NULL != token)
|
||||||
|
{
|
||||||
|
copy = calloc(1, sizeof(struct token_list));
|
||||||
|
copy->s = token->s;
|
||||||
|
|
||||||
|
copy->next = prev;
|
||||||
|
copy->prev = prev;
|
||||||
|
prev = copy;
|
||||||
|
token = token->next;
|
||||||
|
}
|
||||||
|
copy = reverse_list(copy);
|
||||||
|
|
||||||
|
return copy;
|
||||||
|
}
|
||||||
|
|
||||||
struct macro_list* lookup_macro(struct token_list* token)
|
struct macro_list* lookup_macro(struct token_list* token)
|
||||||
{
|
{
|
||||||
if(NULL == token)
|
if(NULL == token)
|
||||||
|
@ -743,6 +790,31 @@ void macro_directive()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct token_list* expand_macro_functions(struct token_list* expansion, struct token_list* arguments)
|
||||||
|
{
|
||||||
|
struct token_list* expanded_token;
|
||||||
|
struct token_list* head;
|
||||||
|
struct token_list* hold; /* Same as head unless head == NULL */
|
||||||
|
head = copy_list(expansion);
|
||||||
|
while(NULL != head)
|
||||||
|
{
|
||||||
|
expanded_token = lookup_token(head, arguments);
|
||||||
|
hold = head;
|
||||||
|
if(NULL != expanded_token)
|
||||||
|
{
|
||||||
|
insert_tokens(head, expanded_token);
|
||||||
|
hold = head->prev;
|
||||||
|
head = eat_token(head);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
head = head->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while(NULL != hold->prev) hold = hold->prev;
|
||||||
|
return hold;
|
||||||
|
}
|
||||||
|
|
||||||
struct token_list* maybe_expand(struct token_list* token)
|
struct token_list* maybe_expand(struct token_list* token)
|
||||||
{
|
{
|
||||||
if(NULL == token)
|
if(NULL == token)
|
||||||
|
@ -805,9 +877,10 @@ struct token_list* maybe_expand(struct token_list* token)
|
||||||
hold->arguments = hold3;
|
hold->arguments = hold3;
|
||||||
token = eat_token(token);
|
token = eat_token(token);
|
||||||
}
|
}
|
||||||
hold4 = insert_tokens(token, hold->expansion);
|
hold4 = expand_macro_functions(hold->expansion, hold->arguments);
|
||||||
|
hold4 = insert_tokens(token, hold4);
|
||||||
|
|
||||||
return hold4->next;
|
return hold4;
|
||||||
}
|
}
|
||||||
|
|
||||||
void preprocess()
|
void preprocess()
|
||||||
|
|
Loading…
Reference in New Issue