/* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Id$ */ /* PREPROCESSOR: INPUT SKIP FUNCTIONS */ #include "arith.h" #include "LLlex.h" #include "class.h" #include "input.h" #include "domacro.h" #include "error.h" extern int InputLevel; int skipspaces(register int ch, int skipnl) { register int nlseen = 0; for (;;) { while (class(ch) == STSKIP) ch = GetChar(); if (skipnl && class(ch) == STNL) { ch = GetChar(); LineNumber++; nlseen++; continue; } if (ch == TOKSEP && InputLevel) { ch = GetChar(); continue; } /* \\\n are handled by trigraph */ if (ch == '/') { ch = GetChar(); if (ch == '*' && !InputLevel) { skipcomment(); ch = GetChar(); } else if (ch == '/' && !InputLevel) { skiplinecomment(); ch = GetChar(); } else { UnGetChar(); return '/'; } } else if (nlseen && ch == '#') { domacro(); ch = GetChar(); } else return ch; } /* garbage */ return 0; } int SkipToNewLine(void) { register int ch; register int garbage = 0; register int delim = 0; while ((ch = GetChar()) != '\n') { if (delim) { if (ch == '\\') { if (GetChar() == '\n') break; } else if (ch == delim) { delim = 0; } continue; } else if (ch == '\'' || ch == '\"') { delim = ch; garbage = 1; } else if (ch == '/') { if (!InputLevel) { int nch = GetChar(); if (nch == '*') { skipcomment(); continue; } else if (nch == '/') { skiplinecomment(); continue; } else UnGetChar(); } } else if (ch == TOKSEP && InputLevel) { continue; } if (!is_wsp(ch)) garbage = 1; } if (delim) strict("unclosed opening %c", delim); ++LineNumber; return garbage; }