ref: f5199492fb98c0b6c2034041e6865de4dabaac33
parent: 1ae4a875f9b9215126fd406329cbfd267271492d
author: Roberto E. Vargas Caballero <k0ga@shike2.com>
date: Sat May 9 13:21:56 EDT 2015
Add cpp.c file The preprocessor and the lexer are different things, so it is better to separate them
--- 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
--- a/cc1/cc1.h
+++ b/cc1/cc1.h
@@ -278,6 +278,9 @@
/* expr.c */
extern Node *expr(void), *negate(Node *np);
+/* cpp.c */
+extern char *preprocessor(char *s);
+
/*
* Definition of global variables
*/
--- /dev/null
+++ b/cc1/cpp.c
@@ -1,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");
+}
+
--- a/cc1/lex.c
+++ b/cc1/lex.c
@@ -91,84 +91,6 @@
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)
{