ack/util/cpp/skip.c

107 lines
1.9 KiB
C
Raw Normal View History

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
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.
*/
register int nlseen = 0;
1987-01-06 15:16:53 +00:00
for (;;) {
while (class(ch) == STSKIP) {
nlseen = 0;
1987-01-06 15:16:53 +00:00
LoadChar(ch);
}
if (skipnl && class(ch) == STNL) {
LoadChar(ch);
++LineNumber;
nlseen++;
continue;
}
1987-01-06 15:16:53 +00:00
/* How about "\\\n"????????? */
if (ch == '/') {
LoadChar(ch);
if (ch == '*') {
skipcomment();
LoadChar(ch);
}
else {
PushBack();
return '/';
}
}
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();
}
}