summaryrefslogtreecommitdiff
path: root/core/parser.c
diff options
context:
space:
mode:
Diffstat (limited to 'core/parser.c')
-rw-r--r--core/parser.c52
1 files changed, 47 insertions, 5 deletions
diff --git a/core/parser.c b/core/parser.c
index 4779803..48640d8 100644
--- a/core/parser.c
+++ b/core/parser.c
@@ -58,6 +58,35 @@ static const char *toktab[] = {
[TT_U64] = qtok("u64")
};
+/*
+ * Push a token to the token buffer in the preprocessing stage
+ *
+ * @tokbuf: Token buffer to push to
+ * @tok: Token to push
+ *
+ * Returns zero on success
+ */
+static int
+preprocessor_push(struct tokbuf *tokbuf, struct token *tok)
+{
+ if (tokbuf == NULL || tok == NULL) {
+ return -1;
+ }
+
+ switch (tok->type) {
+ case TT_IFNDEF:
+ case TT_IFDEF:
+ case TT_DEFINE:
+ break;
+ default:
+ if (tokbuf_push(tokbuf, tok) < 0) {
+ return -1;
+ }
+ }
+
+ return 0;
+}
+
static int
parser_nom(struct cescal_state *state, struct token *res)
{
@@ -68,12 +97,24 @@ parser_nom(struct cescal_state *state, struct token *res)
return -1;
}
- if (lexer_nom(state, &tok) < 0) {
- return -1;
- }
+ switch (state->pass) {
+ case 0: /* Pre-processor */
+ if (lexer_nom(state, &tok) < 0) {
+ return -1;
+ }
- if (tokbuf_push(&state->tokbuf, &tok) < 0) {
- return -1;
+ printf("* %s\n", tokstr(&tok));
+ if (preprocessor_push(&state->tokbuf, &tok) < 0) {
+ return -1;
+ }
+
+ break;
+ case 1: /* Parse */
+ if (tokbuf_pop(&state->tokbuf, &tok) < 0) {
+ return -1;
+ }
+
+ break;
}
*res = tok;
@@ -94,5 +135,6 @@ parser_parse(struct cescal_state *state)
cc_trace("got token %s\n", tokstr(&tok));
}
+ ++state->pass;
return 0;
}