/* GetChar - get the next character */ int GetChar(ParseContext *c) { int ch; /* check for being in a comment */ if (c->inComment) { if (!SkipComment(c)) return EOF; c->inComment = VMFALSE; } /* loop until we find a non-comment character */ for (;;) { /* get the next character */ if ((ch = XGetC(c)) == EOF) return EOF; /* check for a comment */ else if (ch == '/') { if ((ch = XGetC(c)) == '/') { while ((ch = XGetC(c)) != EOF) ; } else if (ch == '*') { if (!SkipComment(c)) { c->inComment = VMTRUE; return EOF; } } else { UngetC(c); ch = '/'; break; } } /* handle a normal character */ else break; } /* return the character */ return ch; }
/* CharToken - get a character constant */ static int CharToken(ParseContext *c) { int ch = LiteralChar(c); if (XGetC(c) != '\'') ParseError(c,"Expecting a closing single quote"); c->token[0] = ch; c->token[1] = '\0'; c->value = ch; return T_NUMBER; }
/* SkipComment - skip characters up to the end of a comment */ static int SkipComment(ParseContext *c) { int lastch, ch; lastch = '\0'; while ((ch = XGetC(c)) != EOF) { if (lastch == '*' && ch == '/') return VMTRUE; lastch = ch; } return VMFALSE; }
/* LiteralChar - get a character from a literal string */ static int LiteralChar(ParseContext *c) { int ch; switch (ch = XGetC(c)) { case 'n': ch = '\n'; break; case 'r': ch = '\r'; break; case 't': ch = '\t'; break; case EOF: ch = '\\'; break; } return ch; }
/* StringToken - get a string */ static int StringToken(ParseContext *c) { int ch,len; char *p; /* collect the string */ p = c->token; len = 0; while ((ch = XGetC(c)) != EOF && ch != '"') { if (++len > MAXTOKEN) ParseError(c, "String too long"); *p++ = (ch == '\\' ? LiteralChar(c) : ch); } *p = '\0'; /* check for premature end of file */ if (ch != '"') ParseError(c, "unterminated string"); /* return the token */ return T_STRING; }