ref: 3f1b9619b57cbd1e479f281c86f8ed3fabe2b024
parent: 5c310c3237029d9a2f22a4c616fcc8015ed01c3b
author: Roberto E. Vargas Caballero <[email protected]>
date: Fri May 8 19:08:04 EDT 2015
Allow comments multi file If a comment begins in a file it can continue in the next file, so it is needed global variables which affect to the state of the comment parser.
--- a/cc1/lex.c
+++ b/cc1/lex.c
@@ -32,8 +32,7 @@
uint8_t yytoken;
struct yystype yylval;
char yytext[IDENTSIZ + 1];
-static uint8_t safe;
-
+static uint8_t safe, comment, commentline;
static Input *input;
bool
@@ -208,11 +207,27 @@
}
static int
+readchar(void)
+{
+ int c;
+ FILE *fp = input->fp;
+
+repeat:
+ if ((c = getc(fp)) == '\\') {
+ if ((c = getc(fp)) == '\n')
+ goto repeat;
+ ungetc(c, fp);
+ c = '\\';
+ }
+ return c;
+}
+
+static int
readline(void)
{
char *bp, *ptr;
- uint8_t n, eol, block;
- int back, c;
+ uint8_t n;
+ int c;
FILE *fp;
repeat:
@@ -221,7 +236,7 @@
fp = input->fp;
if (!input->line)
input->line = xmalloc(INPUTSIZ);
- ptr = input->line;
+ bp = ptr = input->ptr = input->line;
while ((c = getc(fp)) != EOF && isspace(c)) {
if (c == '\n')
@@ -232,58 +247,46 @@
goto repeat;
}
ungetc(c, fp);
- back = eol = block = 0;
- for (bp = ptr; (c = getc(fp)) != EOF; ) {
- switch (c) {
- case '\\':
- if ((c = getc(fp)) == '\n')
- continue;
- back = c;
- c = '\\';
+ for (;;) {
+ c = readchar();
+ nextchar:
+ if (c == EOF)
break;
- case '/':
- if ((c = getc(fp)) == '/')
- eol = 1;
- else if (c == '*')
- block = 1;
- else
- back = c;
- c = '/';
- break;
- case '\n':
- if (eol)
- c = ' ';
- else if (!block)
- goto end_line;
- break;
- case '*':
- if (block) {
- if ((c = getc(fp)) == '/') {
- block = 0;
- c = ' ';
- } else {
- back = c;
- c = '*';
- }
- }
- break;
+ if (comment) {
+ if (c != '*')
+ continue;
+ if ((c = readchar()) != '/')
+ goto nextchar;
+ comment = 0;
+ c = ' ';
+ } else if (commentline) {
+ if (c != '\n')
+ continue;
+ commentline = 0;
+ c = ' ';
}
- if (eol || block)
- continue;
- if (back) {
- ungetc(back, fp);
- back = 0;
- }
- if (bp == &ptr[INPUTSIZ])
+ if (c == '\n')
+ break;
+ if (bp == &ptr[INPUTSIZ-1])
die("line %d too big in file '%s'",
input->nline, input->fname);
- *bp++ = c;
+ if (c == '/') {
+ if ((c = readchar()) == '*') {
+ comment = 1;
+ continue;
+ } else if (c == '/') {
+ commentline = 1;
+ continue;
+ }
+ *bp++ = '/';
+ goto nextchar;
+ }
+ *bp++ = c;
}
-end_line:
+
*bp = ' ';
input->cnt = bp - ptr;
- input->ptr = ptr;
if ((c = *input->ptr++) == '#') {
*bp = '\0';