1987-03-09 19:15:41 +00:00
|
|
|
/*
|
|
|
|
* (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
|
|
|
|
* See the copyright notice in the ACK home directory, in the file "Copyright".
|
|
|
|
*/
|
1987-01-06 15:16:53 +00:00
|
|
|
/* $Header$ */
|
|
|
|
/* PREPROCESSOR: INPUT SKIP FUNCTIONS */
|
|
|
|
|
|
|
|
#include "LLlex.h"
|
|
|
|
#include "class.h"
|
|
|
|
#include "input.h"
|
|
|
|
|
|
|
|
int
|
1988-07-29 18:38:25 +00:00
|
|
|
skipspaces(ch, skipnl)
|
1987-01-06 15:16:53 +00:00
|
|
|
register int ch;
|
|
|
|
{
|
|
|
|
/* skipspaces() skips any white space and returns the first
|
|
|
|
non-space character.
|
|
|
|
*/
|
1989-10-12 11:16:02 +00:00
|
|
|
register int nlseen = 0;
|
|
|
|
|
1987-01-06 15:16:53 +00:00
|
|
|
for (;;) {
|
1989-10-12 11:16:02 +00:00
|
|
|
while (class(ch) == STSKIP) {
|
|
|
|
nlseen = 0;
|
1987-01-06 15:16:53 +00:00
|
|
|
LoadChar(ch);
|
1989-10-12 11:16:02 +00:00
|
|
|
}
|
1988-07-29 18:38:25 +00:00
|
|
|
if (skipnl && class(ch) == STNL) {
|
|
|
|
LoadChar(ch);
|
|
|
|
++LineNumber;
|
1989-10-12 11:16:02 +00:00
|
|
|
nlseen++;
|
1988-07-29 18:38:25 +00:00
|
|
|
continue;
|
|
|
|
}
|
1987-01-06 15:16:53 +00:00
|
|
|
/* How about "\\\n"????????? */
|
|
|
|
if (ch == '/') {
|
|
|
|
LoadChar(ch);
|
|
|
|
if (ch == '*') {
|
|
|
|
skipcomment();
|
|
|
|
LoadChar(ch);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
PushBack();
|
|
|
|
return '/';
|
|
|
|
}
|
|
|
|
}
|
1989-10-12 11:16:02 +00:00
|
|
|
else if (nlseen && ch == '#') {
|
|
|
|
domacro();
|
|
|
|
LoadChar(ch);
|
|
|
|
/* ch is the first character of a line. This means
|
|
|
|
* that nlseen will still be true.
|
|
|
|
*/
|
|
|
|
} else
|
1987-01-06 15:16:53 +00:00
|
|
|
return ch;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
skipline()
|
|
|
|
{
|
|
|
|
/* skipline() skips all characters until a newline character
|
|
|
|
is seen, not escaped by a '\\'.
|
|
|
|
Any comment is skipped.
|
|
|
|
*/
|
|
|
|
register int c;
|
|
|
|
|
|
|
|
LoadChar(c);
|
|
|
|
while (class(c) != STNL && c != EOI) {
|
1993-11-15 09:29:39 +00:00
|
|
|
if (class(c) == STSTR || class(c) == STCHAR) {
|
|
|
|
register int stopc = c;
|
|
|
|
int escaped;
|
|
|
|
do {
|
|
|
|
escaped = 0;
|
|
|
|
LoadChar(c);
|
|
|
|
if (class(c) == STNL || c == EOI) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
if (c == '\\') {
|
|
|
|
LoadChar(c);
|
|
|
|
if (c == '\n') {
|
|
|
|
++LineNumber;
|
|
|
|
}
|
|
|
|
else escaped = 1;
|
|
|
|
}
|
|
|
|
} while (escaped || c != stopc);
|
|
|
|
if (class(c) != STNL && c != EOI) {
|
|
|
|
LoadChar(c);
|
|
|
|
}
|
|
|
|
continue;
|
|
|
|
}
|
1987-01-06 15:16:53 +00:00
|
|
|
if (c == '\\') {
|
|
|
|
LoadChar(c);
|
|
|
|
if (class(c) == STNL)
|
|
|
|
++LineNumber;
|
|
|
|
}
|
|
|
|
if (c == '/') {
|
|
|
|
LoadChar(c);
|
|
|
|
if (c == '*')
|
|
|
|
skipcomment();
|
|
|
|
else
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
LoadChar(c);
|
|
|
|
}
|
|
|
|
++LineNumber;
|
|
|
|
if (c == EOI) { /* garbage input... */
|
|
|
|
error("unexpected EOF while skipping text");
|
|
|
|
PushBack();
|
|
|
|
}
|
|
|
|
}
|