static int scanpp(void) { int c, t; if (Rejected != -1) { t = Rejected; Rejected = -1; strcpy(Text, Rejtext); Value = Rejval; return t; } for (;;) { Value = 0; c = skip(); memset(Text, 0, 4); Text[0] = c; switch (c) { case '!': if ((c = next()) == '=') { Text[1] = '='; return NOTEQ; } else { putback(c); return XMARK; } case '%': if ((c = next()) == '=') { Text[1] = '='; return ASMOD; } else { putback(c); return MOD; } case '&': if ((c = next()) == '&') { Text[1] = '&'; return LOGAND; } else if ('=' == c) { Text[1] = '='; return ASAND; } else { putback(c); return AMPER; } case '(': return LPAREN; case ')': return RPAREN; case '*': if ((c = next()) == '=') { Text[1] = '='; return ASMUL; } else { putback(c); return STAR; } case '+': if ((c = next()) == '+') { Text[1] = '+'; return INCR; } else if ('=' == c) { Text[1] = '='; return ASPLUS; } else { putback(c); return PLUS; } case ',': return COMMA; case '-': if ((c = next()) == '-') { Text[1] = '-'; return DECR; } else if ('=' == c) { Text[1] = '='; return ASMINUS; } else if ('>' == c) { Text[1] = '>'; return ARROW; } else { putback(c); return MINUS; } case '/': if ((c = next()) == '=') { Text[1] = '='; return ASDIV; } else { putback(c); return SLASH; } case ':': return COLON; case ';': return SEMI; case '<': if ((c = next()) == '<') { Text[1] = '<'; if ((c = next()) == '=') { Text[2] = '='; return ASLSHIFT; } else { putback(c); return LSHIFT; } } else if ('=' == c) { Text[1] = '='; return LTEQ; } else { putback(c); return LESS; } case '=': if ((c = next()) == '=') { Text[1] = '='; return EQUAL; } else { putback(c); return ASSIGN; } case '>': if ((c = next()) == '>') { Text[1] = '>'; if ((c = next()) == '=') { Text[1] = '='; return ASRSHIFT; } else { putback(c); return RSHIFT; } } else if ('=' == c) { Text[1] = '='; return GTEQ; } else { putback(c); return GREATER; } case '?': return QMARK; case '[': return LBRACK; case ']': return RBRACK; case '^': if ((c = next()) == '=') { Text[1] = '='; return ASXOR; } else { putback(c); return CARET; } case '{': return LBRACE; case '|': if ((c = next()) == '|') { Text[1] = '|'; return LOGOR; } else if ('=' == c) { Text[1] = '='; return ASOR; } else { putback(c); return PIPE; } case '}': return RBRACE; case '~': return TILDE; case EOF: strcpy(Text, "<EOF>"); return XEOF; case '\'': Text[1] = Value = scanch(); if ((c = next()) != '\'') error( "expected '\\'' at end of char literal", NULL); Text[2] = '\''; return INTLIT; case '"': Value = scanstr(Text); return STRLIT; case '#': Text[0] = '#'; scanident(next(), &Text[1], TEXTLEN-1); if ((t = keyword(Text)) != 0) return t; error("unknown preprocessor command: %s", Text); return IDENT; case '.': if ((c = next()) == '.') { Text[1] = Text[2] = '.'; Text[3] = 0; if ((c = next()) == '.') return ELLIPSIS; putback(c); error("incomplete '...'", NULL); return ELLIPSIS; } putback(c); return DOT; default: if (isdigit(c)) { Value = scanint(c); return INTLIT; } else if (isalpha(c) || '_' == c) { Value = scanident(c, Text, TEXTLEN); if (Expandmac && macro(Text)) break; if ((t = keyword(Text)) != 0) return t; return IDENT; } else { cerror("funny input character: %s", c); break; } } } }
// scan the next symbol void nextsym() { // continue until symbol found bool symfnd; do { symfnd = true; skipsep(); symptr = inptr; if (inLetters( ch)) // ident or reserved word { scanident(); } else { if (inDigits( ch)) // number scannum(); else { switch( ch) { case '"': strToMatch = '"'; scanstr(); break; case '\'': strToMatch = '\''; scanstr(); break; case '.': sym = per; nextchar(); if ( ch == '.') { sym = doubledot; nextchar(); } break; case ':': idassign(); break; case '<': // fall through to case '>', both call relop case '>': idrelop(); break; case '(': // check for comment nextchar(); if ( ch != '*') sym = lparen; else // now we know it's a comment { symfnd = false; nextchar(); rcomment(); } break; case EOF: sym = eof_sym; break; default: // then should be in one of the "special" chars (star, slash, etc.) sym = spsym[ ch]; nextchar(); break; } // end switch } // end if } // end do } while (!symfnd); // TODO //writesym(); } // end nextsym