ref: bf7035e84c924246113e6d6033b3513bd224f559
parent: 3a4b6eedd35f30fc914d7e21270f659e11d1a318
author: Roberto E. Vargas Caballero <k0ga@shike2.com>
date: Thu May 21 18:20:42 EDT 2015
Simplify readline() function This function had a rally complex status machine, when it was not needed. This new implementation is short and clear.
--- a/cc1/lex.c
+++ b/cc1/lex.c
@@ -29,9 +29,8 @@
unsigned short yylen;
static unsigned lex_ns = NS_IDEN;
-static int safe;
+static int safe, eof, incomment;
static Input *input;
-static int eof;
bool
addinput(char *fname)
@@ -112,7 +111,7 @@
return input->nline;
}
-static int
+static char
readchar(void)
{
int c;
@@ -121,8 +120,11 @@
repeat:
while (feof(input->fp) && !eof)
delinput();
- if (eof)
- return EOF;
+ if (eof) {
+ if (incomment)
+ error("unterminated comment");
+ return '\0';
+ }
fp = input->fp;
if ((c = getc(fp)) == '\\') {
@@ -133,57 +135,55 @@
} else if (c == EOF) {
goto repeat;
} else if (c == '\n' && ++input->nline == 0) {
- die("input file '%s' too long", getfname());
+ die("error:input file '%s' too long", getfname());
}
return c;
}
static void
+comment(char c)
+{
+ /* TODO: Ensure that incomment == 0 after a recovery */
+ incomment = 1;
+ if (c == '*') {
+ for (;;) {
+ while (readchar() != '*')
+ /* nothing */;
+ if (readchar() == '/')
+ break;
+ }
+ } else {
+ while (readchar() != '\n')
+ /* nothing */;
+ }
+ incomment = 0;
+}
+
+static void
readline(void)
{
- int comment = 0, commentline = 0;
char *bp, *lim;
- int c;
+ char c, peekc = 0;
- bp = input->line;
- lim = bp + INPUTSIZ-1;
-
- for (;;) {
- c = readchar();
- nextchar:
- if (c == EOF)
+ lim = input->line + INPUTSIZ;
+ for (bp = input->line; bp != lim; *bp++ = c) {
+ c = (peekc) ? peekc : readchar();
+ peekc = 0;
+ if (c == '\n' || c == '\0')
break;
- if (comment) {
- if (c != '*')
- continue;
- if ((c = readchar()) != '/')
- goto nextchar;
- comment = 0;
+ if (c != '/')
+ continue;
+ if ((c = readchar()) != '*' && c != '/') {
+ peekc = c;
+ c = '/';
+ } else {
+ comment(c);
c = ' ';
- } else if (commentline) {
- if (c != '\n')
- continue;
- commentline = 0;
- c = ' ';
}
- if (c == '\n')
- break;
- if (bp == lim)
- die("line %u too big in file '%s'",
- getfline(), getfname());
- if (c == '/') {
- if ((c = readchar()) == '*') {
- comment = 1;
- continue;
- } else if (c == '/') {
- commentline = 1;
- continue;
- }
- *bp++ = '/';
- goto nextchar;
- }
- *bp++ = c;
}
+
+ if (bp == lim)
+ error("line %u too big in file '%s'", getfline(), getfname());
*bp = '\0';
}