scc

Simple C99 Compiler
Log | Files | Refs | README | LICENSE

commit f5199492fb98c0b6c2034041e6865de4dabaac33
parent 1ae4a875f9b9215126fd406329cbfd267271492d
Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
Date:   Sat,  9 May 2015 17:21:56 +0200

Add cpp.c file

The preprocessor and the lexer are different things, so it is better to separate
them

Diffstat:
cc1/Makefile | 2+-
cc1/cc1.h | 3+++
cc1/cpp.c | 88+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
cc1/lex.c | 78------------------------------------------------------------------------------
4 files changed, 92 insertions(+), 79 deletions(-)

diff --git a/cc1/Makefile b/cc1/Makefile @@ -1,6 +1,6 @@ OBJS = types.o decl.o lex.o error.o symbol.o main.o expr.o \ - code.o stmt.o + code.o stmt.o cpp.o LIBS = -lcc diff --git a/cc1/cc1.h b/cc1/cc1.h @@ -278,6 +278,9 @@ extern void freetree(Node *np); /* expr.c */ extern Node *expr(void), *negate(Node *np); +/* cpp.c */ +extern char *preprocessor(char *s); + /* * Definition of global variables */ diff --git a/cc1/cpp.c b/cc1/cpp.c @@ -0,0 +1,88 @@ + +#include <ctype.h> +#include <inttypes.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "../inc/cc.h" +#include "cc1.h" + +/* TODO: preprocessor error must not rise recover */ +char * +include(char *s) +{ + char fname[FILENAME_MAX], delim, c, *p; + size_t len; + + if ((c = *s++) == '>') + delim = '>'; + else if (c == '"') + delim = '"'; + else + goto bad_include; + + for (p = s; (c = *p) && c != delim; ++p) + /* nothing */; + if (c == '\0') + goto bad_include; + + len = p - s; + if (delim == '"') { + if (len >= FILENAME_MAX) + goto too_long; + strncpy(fname, s, len); + fname[len] = '\0'; + if (!addinput(fname)) + goto not_found; + } else { + abort(); + } + + return p+1; + +not_found: + error("included file '%s' not found", fname); +too_long: + error("file name in include too long"); +bad_include: + error("#include expects \"FILENAME\" or <FILENAME>"); +} + +char * +preprocessor(char *p) +{ + char *q; + unsigned short n; + static char **bp, *cmds[] = { + "include", + NULL + }; + static char *(*funs[])(char *) = { + include + }; + + while (isspace(*p)) + ++p; + if (*p != '#') + return p; + for (++p; isspace(*p); ++p) + /* nothing */; + for (q = p; isalpha(*q); ++q) + /* nothing */; + n = q - p; + while (isspace(*q)) + ++q; + for (bp = cmds; *bp; ++bp) { + if (strncmp(*bp, p, n)) + continue; + q = (*funs[bp - cmds])(q); + while (isspace(*q++)) + /* nothing */; + if (*q != '\0') + error("trailing characters after preprocessor directive"); + return NULL; + } + error("incorrect preprocessor directive"); +} + diff --git a/cc1/lex.c b/cc1/lex.c @@ -91,84 +91,6 @@ fileline(void) return input->nline; } -/* TODO: preprocessor error must not rise recover */ -char * -include(char *s) -{ - char fname[FILENAME_MAX], delim, c, *p; - size_t len; - - if ((c = *s++) == '>') - delim = '>'; - else if (c == '"') - delim = '"'; - else - goto bad_include; - - for (p = s; (c = *p) && c != delim; ++p) - /* nothing */; - if (c == '\0') - goto bad_include; - - len = p - s; - if (delim == '"') { - if (len >= FILENAME_MAX) - goto too_long; - strncpy(fname, s, len); - fname[len] = '\0'; - if (!addinput(fname)) - goto not_found; - } else { - abort(); - } - - return p+1; - -not_found: - error("included file '%s' not found", fname); -too_long: - error("file name in include too long"); -bad_include: - error("#include expects \"FILENAME\" or <FILENAME>"); -} - -static char * -preprocessor(char *p) -{ - char str[IDENTSIZ+1], *q; - unsigned short n; - static char **bp, *cmds[] = { - "include", - NULL - }; - static char *(*funs[])(char *) = { - include - }; - - while (isspace(*p)) - ++p; - if (*p != '#') - return p; - for (++p; isspace(*p); ++p) - /* nothing */; - for (q = p; isalpha(*q); ++q) - /* nothing */; - n = q - p; - while (isspace(*q)) - ++q; - for (bp = cmds; *bp; ++bp) { - if (strncmp(*bp, p, n)) - continue; - q = (*funs[bp - cmds])(q); - while (isspace(*q++)) - /* nothing */; - if (*q != '\0') - error("trailing characters after preprocessor directive"); - return NULL; - } - error("incorrect preprocessor directive"); -} - static int readchar(void) {