ack/lang/cem/cemcom/skip.c

93 lines
1.6 KiB
C
Raw Normal View History

/*
* (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
* See the copyright notice in the ACK home directory, in the file "Copyright".
*/
1986-03-10 13:07:55 +00:00
/* $Header$ */
/* PREPROCESSOR: INPUT SKIP FUNCTIONS */
#include "nopp.h"
#include "arith.h"
#include "LLlex.h"
#include "class.h"
#include "input.h"
#include "interface.h"
#ifndef NOPP
PRIVATE int
skipspaces(ch, skipnl)
1986-03-10 13:07:55 +00:00
register int ch;
{
/* skipspaces() skips any white space and returns the first
non-space character.
*/
register int nlseen = 0;
1986-03-10 13:07:55 +00:00
for (;;) {
while (class(ch) == STSKIP) {
nlseen = 0;
1986-03-10 13:07:55 +00:00
LoadChar(ch);
}
1988-07-29 19:22:48 +00:00
if (skipnl && class(ch) == STNL) {
LoadChar(ch);
LineNumber++;
nlseen++;
1988-07-29 19:22:48 +00:00
continue;
}
1986-03-10 13:07:55 +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
1986-03-10 13:07:55 +00:00
return ch;
}
}
#endif NOPP
PRIVATE
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) {
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... */
lexerror("unexpected EOF while skipping text");
PushBack();
}
}