Adjusted cc_macro.c formatting with astyle -A1tSxejz2fpUxV

This commit is contained in:
Jeremiah Orians 2021-01-05 22:22:33 -05:00
parent 63bb59404d
commit 0ab7cb78eb
No known key found for this signature in database
GPG Key ID: 6B3A3F198708F894
1 changed files with 291 additions and 266 deletions

View File

@ -18,332 +18,357 @@
#include "gcc_req.h" #include "gcc_req.h"
void require(int bool, char* error); void require(int bool, char* error);
int numerate_string(char *a); int numerate_string(char* a);
void line_error_token(struct token_list *); void line_error_token(struct token_list* list);
struct conditional_inclusion { struct conditional_inclusion
struct conditional_inclusion* prev; {
int include; /* 1 == include, 0 == skip */ struct conditional_inclusion* prev;
int previous_condition_matched; /* 1 == all subsequent conditions treated as FALSE */ int include; /* 1 == include, 0 == skip */
int previous_condition_matched; /* 1 == all subsequent conditions treated as FALSE */
}; };
struct conditional_inclusion *conditional_inclusion_top; struct conditional_inclusion* conditional_inclusion_top;
/* point where we are currently modifying the global_token list */ /* point where we are currently modifying the global_token list */
struct token_list* macro_token; struct token_list* macro_token;
void eat_current_token() void eat_current_token()
{ {
struct token_list* tmp; struct token_list* tmp;
if (NULL != macro_token->prev) if(NULL != macro_token->prev)
macro_token->prev->next = macro_token->next; {
else macro_token->prev->next = macro_token->next;
global_token = macro_token->next; }
else
{
global_token = macro_token->next;
}
/* update backlinks */ /* update backlinks */
if (NULL != macro_token->next) if(NULL != macro_token->next)
macro_token->next->prev = macro_token->prev; {
macro_token->next->prev = macro_token->prev;
}
tmp = macro_token; tmp = macro_token;
macro_token = macro_token->next; macro_token = macro_token->next;
free(tmp); free(tmp);
} }
void eat_newline_tokens() void eat_newline_tokens()
{ {
macro_token = global_token; macro_token = global_token;
while (TRUE) while(TRUE)
{ {
if (NULL == macro_token) if(NULL == macro_token) return;
return;
if(match("\n", macro_token->s)) if(match("\n", macro_token->s))
eat_current_token(); {
else eat_current_token();
macro_token = macro_token->next; }
} else
{
macro_token = macro_token->next;
}
}
} }
int macro_expression(); int macro_expression();
int macro_variable() int macro_variable()
{ {
eat_current_token(); eat_current_token();
return 0; return 0;
} }
int macro_number() int macro_number()
{ {
int result = numerate_string(macro_token->s); int result = numerate_string(macro_token->s);
eat_current_token(); eat_current_token();
return result; return result;
} }
int macro_primary_expr() int macro_primary_expr()
{ {
if ('-' == macro_token->s[0]) if('-' == macro_token->s[0])
{ {
eat_current_token(); eat_current_token();
return -macro_primary_expr(); return -macro_primary_expr();
} }
else if ('!' == macro_token->s[0]) else if('!' == macro_token->s[0])
{ {
eat_current_token(); eat_current_token();
return !macro_primary_expr(); return !macro_primary_expr();
} }
else if ('(' == macro_token->s[0]) else if('(' == macro_token->s[0])
{ {
eat_current_token(); eat_current_token();
return macro_expression(); return macro_expression();
} else if (in_set(macro_token->s[0], "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_")) }
return macro_variable(); else if(in_set(macro_token->s[0], "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_"))
else if (in_set(macro_token->s[0], "0123456789")) {
return macro_number(); return macro_variable();
else }
return 0; /* FIXME: error handling */ else if(in_set(macro_token->s[0], "0123456789"))
{
return macro_number();
}
else
{
return 0; /* FIXME: error handling */
}
} }
int macro_additive_expr() int macro_additive_expr()
{ {
int lhs = macro_primary_expr(); int lhs = macro_primary_expr();
if (match("+", macro_token->s)) if(match("+", macro_token->s))
{ {
eat_current_token(); eat_current_token();
return lhs + macro_additive_expr(); return lhs + macro_additive_expr();
} }
else if (match("-", macro_token->s)) else if(match("-", macro_token->s))
{ {
eat_current_token(); eat_current_token();
return lhs - macro_additive_expr(); return lhs - macro_additive_expr();
} }
else if (match("*", macro_token->s)) else if(match("*", macro_token->s))
{ {
eat_current_token(); eat_current_token();
return lhs * macro_additive_expr(); return lhs * macro_additive_expr();
} }
else if (match("/", macro_token->s)) else if(match("/", macro_token->s))
{ {
eat_current_token(); eat_current_token();
return lhs / macro_additive_expr(); return lhs / macro_additive_expr();
} }
else if (match("%", macro_token->s)) else if(match("%", macro_token->s))
{ {
eat_current_token(); eat_current_token();
return lhs % macro_additive_expr(); return lhs % macro_additive_expr();
} }
else if (match(">>", macro_token->s)) else if(match(">>", macro_token->s))
{ {
eat_current_token(); eat_current_token();
return lhs >> macro_additive_expr(); return lhs >> macro_additive_expr();
} }
else if (match("<<", macro_token->s)) else if(match("<<", macro_token->s))
{ {
eat_current_token(); eat_current_token();
return lhs << macro_additive_expr(); return lhs << macro_additive_expr();
} }
else else
{ {
return lhs; return lhs;
} }
} }
int macro_relational_expr() int macro_relational_expr()
{ {
int lhs = macro_additive_expr(); int lhs = macro_additive_expr();
if (match("<", macro_token->s)) if(match("<", macro_token->s))
{ {
eat_current_token(); eat_current_token();
return lhs < macro_relational_expr(); return lhs < macro_relational_expr();
} }
else if (match("<=", macro_token->s)) else if(match("<=", macro_token->s))
{ {
eat_current_token(); eat_current_token();
return lhs <= macro_relational_expr(); return lhs <= macro_relational_expr();
} }
else if (match(">=", macro_token->s)) else if(match(">=", macro_token->s))
{ {
eat_current_token(); eat_current_token();
return lhs >= macro_relational_expr(); return lhs >= macro_relational_expr();
} }
else if (match(">", macro_token->s)) else if(match(">", macro_token->s))
{ {
eat_current_token(); eat_current_token();
return lhs > macro_relational_expr(); return lhs > macro_relational_expr();
} }
else if (match("==", macro_token->s)) else if(match("==", macro_token->s))
{ {
eat_current_token(); eat_current_token();
return lhs == macro_relational_expr(); return lhs == macro_relational_expr();
} }
else if (match("!=", macro_token->s)) else if(match("!=", macro_token->s))
{ {
eat_current_token(); eat_current_token();
return lhs != macro_relational_expr(); return lhs != macro_relational_expr();
} }
else else
{ {
return lhs; return lhs;
} }
} }
int macro_bitwise_expr() int macro_bitwise_expr()
{ {
int rhs; int rhs;
int lhs = macro_relational_expr(); int lhs = macro_relational_expr();
if (match("&", macro_token->s)) if(match("&", macro_token->s))
{ {
eat_current_token(); eat_current_token();
return lhs & macro_bitwise_expr(); return lhs & macro_bitwise_expr();
} }
else if (match("&&", macro_token->s)) else if(match("&&", macro_token->s))
{ {
eat_current_token(); eat_current_token();
rhs = macro_bitwise_expr(); rhs = macro_bitwise_expr();
return lhs && rhs; return lhs && rhs;
} }
else if (match("|", macro_token->s)) else if(match("|", macro_token->s))
{ {
eat_current_token(); eat_current_token();
rhs = macro_bitwise_expr(); rhs = macro_bitwise_expr();
return lhs | rhs; return lhs | rhs;
} }
else if (match("||", macro_token->s)) else if(match("||", macro_token->s))
{ {
eat_current_token(); eat_current_token();
rhs = macro_bitwise_expr(); rhs = macro_bitwise_expr();
return lhs || rhs; return lhs || rhs;
} }
else if (match("^", macro_token->s)) else if(match("^", macro_token->s))
{ {
eat_current_token(); eat_current_token();
rhs = macro_bitwise_expr(); rhs = macro_bitwise_expr();
return lhs ^ rhs; return lhs ^ rhs;
} }
else else
{ {
return lhs; return lhs;
} }
} }
int macro_expression() int macro_expression()
{ {
return macro_bitwise_expr(); return macro_bitwise_expr();
} }
void macro_directive() void macro_directive()
{ {
struct conditional_inclusion *t; struct conditional_inclusion *t;
int result; int result;
/* FIXME: whitespace is allowed between "#"" and "if" */
if(match("#if", macro_token->s))
{
eat_current_token();
/* evaluate constant integer expression */
result = macro_expression();
/* push conditional inclusion */
t = calloc(1, sizeof(struct conditional_inclusion));
t->prev = conditional_inclusion_top;
conditional_inclusion_top = t;
t->include = TRUE;
if (FALSE == result)
{
t->include = FALSE;
}
t->previous_condition_matched = t->include;
}
else if (match("#elif", macro_token->s))
{
eat_current_token();
result = macro_expression();
conditional_inclusion_top->include = result && !conditional_inclusion_top->previous_condition_matched;
conditional_inclusion_top->previous_condition_matched =
conditional_inclusion_top->previous_condition_matched || conditional_inclusion_top->include;
}
else if (match("#else", macro_token->s))
{
eat_current_token();
conditional_inclusion_top->include = !conditional_inclusion_top->previous_condition_matched;
}
else if (match("#endif", macro_token->s))
{
if (NULL == conditional_inclusion_top)
{
line_error_token(macro_token);
file_print("unexpected #endif\n", stderr);
exit(EXIT_FAILURE);
}
eat_current_token();
/* pop conditional inclusion */
t = conditional_inclusion_top;
conditional_inclusion_top = conditional_inclusion_top->prev;
free(t);
}
else
{
/* unhandled macro directive; let's eat until a newline; om nom nom */
while (TRUE)
{
if (NULL == macro_token)
return;
if ('\n' == macro_token->s[0]) /* FIXME: whitespace is allowed between "#"" and "if" */
return; if(match("#if", macro_token->s))
{
eat_current_token();
/* evaluate constant integer expression */
result = macro_expression();
/* push conditional inclusion */
t = calloc(1, sizeof(struct conditional_inclusion));
t->prev = conditional_inclusion_top;
conditional_inclusion_top = t;
t->include = TRUE;
eat_current_token(); if(FALSE == result)
} {
} t->include = FALSE;
}
t->previous_condition_matched = t->include;
}
else if(match("#elif", macro_token->s))
{
eat_current_token();
result = macro_expression();
conditional_inclusion_top->include = result && !conditional_inclusion_top->previous_condition_matched;
conditional_inclusion_top->previous_condition_matched =
conditional_inclusion_top->previous_condition_matched || conditional_inclusion_top->include;
}
else if(match("#else", macro_token->s))
{
eat_current_token();
conditional_inclusion_top->include = !conditional_inclusion_top->previous_condition_matched;
}
else if(match("#endif", macro_token->s))
{
if(NULL == conditional_inclusion_top)
{
line_error_token(macro_token);
file_print("unexpected #endif\n", stderr);
exit(EXIT_FAILURE);
}
eat_current_token();
/* pop conditional inclusion */
t = conditional_inclusion_top;
conditional_inclusion_top = conditional_inclusion_top->prev;
free(t);
}
else
{
/* unhandled macro directive; let's eat until a newline; om nom nom */
while(TRUE)
{
if(NULL == macro_token)
{
return;
}
if('\n' == macro_token->s[0])
{
return;
}
eat_current_token();
}
}
} }
void preprocess() void preprocess()
{ {
int start_of_line = TRUE; int start_of_line = TRUE;
macro_token = global_token; macro_token = global_token;
while (NULL != macro_token) while(NULL != macro_token)
{ {
if(start_of_line && '#' == macro_token->s[0])
{
macro_directive();
if (start_of_line && '#' == macro_token->s[0]) if(macro_token)
{ {
macro_directive(); if('\n' != macro_token->s[0])
if (macro_token) {
{ line_error_token(macro_token);
if ('\n' != macro_token->s[0]) file_print("newline expected at end of macro directive\n", stderr);
{ file_print("found: '", stderr);
line_error_token(macro_token); file_print(macro_token->s, stderr);
file_print("newline expected at end of macro directive\n", stderr); file_print("'\n", stderr);
file_print("found: '", stderr); exit(EXIT_FAILURE);
file_print(macro_token->s, stderr); }
file_print("'\n", stderr); }
exit(EXIT_FAILURE); }
} else if('\n' == macro_token->s[0])
} {
} start_of_line = TRUE;
else if ('\n' == macro_token->s[0]) macro_token = macro_token->next;
{ }
start_of_line = TRUE; else
macro_token = macro_token->next; {
} start_of_line = FALSE;
else
{ if(NULL == conditional_inclusion_top)
start_of_line = FALSE; {
if (NULL == conditional_inclusion_top) macro_token = macro_token->next;
{ }
macro_token = macro_token->next; else if(!conditional_inclusion_top->include)
} {
else if (!conditional_inclusion_top->include) /* rewrite the token stream to exclude the current token */
{ eat_current_token();
/* rewrite the token stream to exclude the current token */ }
eat_current_token(); else
} {
else macro_token = macro_token->next;
{ }
macro_token = macro_token->next; }
} }
}
}
} }