ack/lang/cem/cemcom/skip.c

115 lines
2 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 */
1986-03-10 13:07:55 +00:00
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) {
1993-11-15 09:25:32 +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;
}
1986-03-10 13:07:55 +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... */
lexerror("unexpected EOF while skipping text");
PushBack();
}
}