/* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $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 int skipspaces(ch, skipnl) register int ch; { /* skipspaces() skips any white space and returns the first non-space character. */ register int nlseen = 0; for (;;) { while (class(ch) == STSKIP) { nlseen = 0; LoadChar(ch); } if (skipnl && class(ch) == STNL) { LoadChar(ch); LineNumber++; nlseen++; continue; } /* 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 return ch; } } #endif /* NOPP */ 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 (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; } 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(); } }