da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/***********************************************************************
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* This software is part of the ast package *
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz* Copyright (c) 1986-2009 AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* and is licensed under the *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Common Public License, Version 1.0 *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* by AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* A copy of the License is available at *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* http://www.opensource.org/licenses/cpl1.0.txt *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Information and Software Systems Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* AT&T Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Florham Park NJ *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Glenn Fowler <gsf@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin***********************************************************************/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#pragma prototyped
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * Glenn Fowler
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * AT&T Research
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * preprocessor and proto lexical analyzer fsm
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * define PROTOMAIN for standalone proto
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "pplib.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "ppfsm.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * lexical FSM encoding
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * derived from a standalone ansi cpp by Dennis Ritchie
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * modified for libpp by Glenn Fowler
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * fsm[] is initialized from fsminit[]. The encoding is blown out into
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * fsm[] for time efficiency. When in state state, and one of the
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * characters in ch arrives, enter nextstate. States >= TERMINAL are
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * either final, or at least require special action. In fsminit[] there
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * is a line for each <state,charset,nextstate>. Early entries are
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * overwritten by later ones. C_XXX is the universal set and should
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * always be first. Some of the fsminit[] entries are templates for
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * groups of states. The OP entries trigger the state copies. States
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * above TERMINAL are represented in fsm[] as negative values. S_TOK and
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * S_TOKB encode the resulting token type in the upper bits. These actions
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * differ in that S_TOKB has a lookahead char.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * fsm[] has three start states:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * PROTO proto (ANSI -> K&R,C++,ANSI)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * QUICK standalone ppcpp()
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * TOKEN tokenizing pplex()
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * If the next state remains the same then the fsm[] transition value is 0.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * MAX+1 is a power of 2 so that fsm[state][EOF==MAX+1] actually accesses
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * fsm[state+1][0] which is ~S_EOB for all states. This preserves the
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * power of 2 fsm[] row size for efficient array indexing. Thanks to
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * D. G. Korn for the last two observations. The pseudo non-terminal state
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * fsm[TERMINAL][state+1] is used to differentiate EOB from EOF.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * The bit layout is:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * TERM arg SPLICE next
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * 15 14-8 7 6-0
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * NOTE: these must be `control' characters for all native codesets
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * currently ok for {ascii,ebcdic1,ebcdic2,ebcdic3}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define C_DEC 001
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define C_EOF 002
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define C_HEX 003
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define C_LET 021
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define C_OCT 022
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define C_XXX 023
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define OP (-1)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define END 0
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define COPY 1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define copy(t,f) (memcpy(&fsm[t][1],&fsm[f][1],(MAX+1)*sizeof(short)),fsm[TERMINAL][(t)+1]=fsm[TERMINAL][(f)+1])
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstruct fsminit /* fsm initialization row */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int state; /* if in this state */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin unsigned char ch[4]; /* and see one of these */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int nextstate; /* enter this state if <TERMINAL*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin};
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic struct fsminit fsminit[] =
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* proto start state */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { PROTO, { C_XXX }, S_CHR, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { PROTO, { C_EOF }, S_EOF, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { PROTO, { C_DEC }, BAD1, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { PROTO, { '.' }, DOT, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { PROTO, { C_LET }, NID, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { PROTO, { 'L' }, LIT, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { PROTO, { 'd', 'e', 'f', 'i' }, RES1, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { PROTO, { 'r', 's', 't', 'v' }, RES1, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { PROTO, { 'w', 'N' }, RES1, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { PROTO, { '"', '\'' }, S_LITBEG, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { PROTO, { '/' }, COM1, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { PROTO, { '\n' }, S_NL, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { PROTO, { ' ','\t','\f','\v' }, WS1, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* proto {do,else,extern,for,if,inline,return,static,typedef,va_start,void,while,NoN} */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { RES1, { C_XXX }, S_MACRO, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { RES1, { C_LET, C_DEC }, NID, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { RES1, { 'a' }, RES1a, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { RES1, { 'e' }, RES1e, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { RES1, { 'f' }, RES1f, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { RES1, { 'h' }, RES1h, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { RES1, { 'l' }, RES1l, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { RES1, { 'n' }, RES1n, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { RES1, { 'o' }, RES1o, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { RES1, { 't' }, RES1t, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { RES1, { 'x' }, RES1x, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { RES1, { 'y' }, RES1y, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* proto reserved {va_start} */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { RES1a, { C_XXX }, S_RESERVED, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { RES1a, { C_LET, C_DEC }, NID, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { RES1a, { '_','s','t','a' }, RES1a, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { RES1a, { 'r' }, RES1a, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* proto reserved {return} */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { RES1e, { C_XXX }, S_RESERVED, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { RES1e, { C_LET, C_DEC }, NID, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { RES1e, { 't','u','r','n' }, RES1e, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* proto reserved {if} */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { RES1f, { C_XXX }, S_RESERVED, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { RES1f, { C_LET, C_DEC }, NID, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* proto reserved {while} */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { RES1h, { C_XXX }, S_RESERVED, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { RES1h, { C_LET, C_DEC }, NID, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { RES1h, { 'i','l','e' }, RES1h, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* proto reserved {else} */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { RES1l, { C_XXX }, S_RESERVED, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { RES1l, { C_LET, C_DEC }, NID, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { RES1l, { 's','e' }, RES1l, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* proto reserved {inline} */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { RES1n, { C_XXX }, S_RESERVED, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { RES1n, { C_LET, C_DEC }, NID, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { RES1n, { 'l','i','n','e' }, RES1n, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* proto reserved {do,for,void} */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { RES1o, { C_XXX }, S_RESERVED, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { RES1o, { C_LET, C_DEC }, NID, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { RES1o, { 'r','i','d','N' }, RES1o, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* proto reserved {static} */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { RES1t, { C_XXX }, S_RESERVED, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { RES1t, { C_LET, C_DEC }, NID, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { RES1t, { 'a','t','i','c' }, RES1t, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* proto reserved {extern} */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { RES1x, { C_XXX }, S_RESERVED, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { RES1x, { C_LET, C_DEC }, NID, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { RES1x, { 't','e','r','n' }, RES1x, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* proto reserved {typedef} */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { RES1y, { C_XXX }, S_RESERVED, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { RES1y, { C_LET, C_DEC }, NID, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { RES1y, { 'p','e','d','f' }, RES1y, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* saw /, perhaps start of comment */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { COM1, { C_XXX }, S_CHRB, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { COM1, { '*' }, COM2, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if PROTOMAIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { COM1, { '/' }, COM5, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* saw / *, start of comment */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { COM2, { C_XXX }, COM2, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { COM2, { '\n', C_EOF }, S_COMMENT, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { COM2, { '/' }, COM4, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { COM2, { '*' }, COM3, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { COM2, { '#', ';', ')' }, QUAL(COM2), },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* saw the * possibly ending a comment */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { COM3, { C_XXX }, COM2, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { COM3, { '\n', C_EOF }, S_COMMENT, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { COM3, { '#', ';', ')' }, QUAL(COM2), },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { COM3, { '*' }, COM3, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { COM3, { '/' }, S_COMMENT, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* saw / in / * comment, possible malformed nest */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { COM4, { C_XXX }, COM2, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { COM4, { '*', '\n', C_EOF }, S_COMMENT, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { COM4, { '/' }, COM4, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* saw / /, start of comment */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { COM5, { C_XXX }, COM5, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { COM5, { '\n', C_EOF }, S_COMMENT, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { COM5, { '/' }, COM6, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { COM5, { '*' }, COM7, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* saw / in / / comment, possible malformed nest */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { COM6, { C_XXX }, COM5, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { COM6, { '*', '\n', C_EOF }, S_COMMENT, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { COM6, { '/' }, COM6, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* saw * in / /, possible malformed nest */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { COM7, { C_XXX }, COM5, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { COM7, { '\n', C_EOF }, S_COMMENT, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { COM7, { '*' }, COM7, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { COM7, { '/' }, S_COMMENT, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* normal identifier -- always a macro candidate */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { NID, { C_XXX }, S_MACRO, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { NID, { C_LET, C_DEC }, NID, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* saw ., operator or dbl constant */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { DOT, { C_XXX }, S_CHRB, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { DOT, { '.' }, DOT2, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { DOT, { C_DEC }, BAD1, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* saw .., possible ... */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { DOT2, { C_XXX }, BACK(T_INVALID), },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { DOT2, { '.' }, KEEP(T_VARIADIC), },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* saw L (possible start of normal wide literal) */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { LIT, { C_XXX }, S_MACRO, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { LIT, { C_LET, C_DEC }, NID, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { LIT, { '"', '\'' }, QUAL(LIT1), },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* saw " or ' beginning literal */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { LIT1, { C_XXX }, LIT1, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { LIT1, { '"', '\'' }, S_LITEND, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { LIT1, { '\n', C_EOF }, S_LITEND, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { LIT1, { '\\' }, LIT2, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* saw \ in literal */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { LIT2, { C_XXX }, S_LITESC, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { LIT2, { '\n', C_EOF }, S_LITEND, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* eat malformed numeric constant */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { BAD1, { C_XXX }, BACK(T_INVALID), },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { BAD1, { C_LET, C_DEC, '.' }, BAD1, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { BAD1, { 'e', 'E' }, BAD2, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* eat malformed numeric fraction|exponent */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { BAD2, { C_XXX }, BACK(T_INVALID), },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { BAD2, { C_LET, C_DEC, '.' }, BAD1, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { BAD2, { '+', '-' }, BAD1, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* saw white space, eat it up */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { WS1, { C_XXX }, S_WS, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { WS1, { ' ', '\t' }, WS1, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { WS1, { '\f', '\v' }, S_VS, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if !PROTOMAIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* quick template */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { QUICK, { C_XXX }, QTOK, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { QUICK, { C_EOF, MARK }, S_CHRB, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { QUICK, { C_LET, C_DEC }, QID, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { QUICK, { 'L' }, LIT0, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { QUICK, { '"', '\'' }, S_LITBEG, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { QUICK, { '/' }, S_CHRB, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { QUICK, { '*' }, QCOM, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { QUICK, { '#' }, SHARP1, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { QUICK, { '\n' }, S_NL, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { QUICK, { '\f', '\v' }, S_VS, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* copy QUICK to QUICK+1 through MAC0+1 */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { OP, {QUICK,QUICK+1,MAC0+1}, COPY, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* quick start state */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { QUICK, { C_EOF }, S_EOF, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { QUICK, { C_DEC }, QNUM, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { QUICK, { MARK }, QTOK, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { QUICK, { '/' }, COM1, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { QUICK, { ' ', '\t' }, QUICK, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* grab non-macro tokens */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { QTOK, { C_DEC }, QNUM, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* grab numeric and invalid tokens */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { QNUM, { C_LET, C_DEC, '.' }, QNUM, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { QNUM, { 'e', 'E' }, QEXP, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* grab exponent token */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { QEXP, { C_LET, C_DEC, '.' }, QNUM, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { QEXP, { '+', '-' }, QNUM, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* saw *, grab possible bad comment terminator */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { QCOM, { C_DEC }, QNUM, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { QCOM, { '/' }, S_COMMENT, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* saw L (possible start of wide string or first macro char) */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { MAC0, { 'L' }, QID, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { MAC0, { '"', '\'' }, QUAL(LIT1), },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* macro candidate template */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { MAC0+1, { 'L' }, QID, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* copy MAC0+1 to MAC0+2 through MACN */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { OP, {MAC0+1,MAC0+2,MACN}, COPY },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* saw L (possible start of wide string or macro L) */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { HIT0, { C_XXX }, S_MACRO, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { HIT0, { C_LET, C_DEC }, QID, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { HIT0, { '"', '\'' }, QUAL(LIT1), },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* macro hit template */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { HIT0+1, { C_XXX }, S_MACRO, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { HIT0+1, { C_LET, C_DEC }, QID, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* copy HIT0+1 to HIT0+2 through HITN */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { OP, {HIT0+1,HIT0+2,HITN}, COPY },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* saw L (possible start of wide literal) */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { LIT0, { C_XXX }, S_MACRO, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { LIT0, { C_LET, C_DEC }, QID, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { LIT0, { '"', '\'' }, QUAL(LIT1), },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* (!PROTOMAIN COM1) saw /, perhaps start of comment or /= */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { COM1, { '=' }, KEEP(T_DIVEQ), },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* normal start state */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { TOKEN, { C_XXX }, S_HUH, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { TOKEN, { C_EOF }, S_EOF, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { TOKEN, { C_DEC }, DEC1, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { TOKEN, { '0' }, OCT1, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { TOKEN, { '.' }, DOT1, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { TOKEN, { C_LET }, NID, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { TOKEN, { 'L' }, LIT, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { TOKEN, { '"', '\'', '<' }, S_LITBEG, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { TOKEN, { '/' }, COM1, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { TOKEN, { '\n' }, S_NL, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { TOKEN, { ' ', '\t' }, WS1, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { TOKEN, { '\f', '\v' }, S_VS, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { TOKEN, { '#' }, SHARP1, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { TOKEN, { ':' }, COLON1, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { TOKEN, { '%' }, PCT1, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { TOKEN, { '&' }, AND1, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { TOKEN, { '*' }, STAR1, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { TOKEN, { '+' }, PLUS1, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { TOKEN, { '-' }, MINUS1, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { TOKEN, { '=' }, EQ1, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { TOKEN, { '!' }, NOT1, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { TOKEN, { '>' }, GT1, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { TOKEN, { '^' }, CIRC1, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { TOKEN, { '|' }, OR1, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { TOKEN, { '(', ')', '[', ']' }, S_CHR, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { TOKEN, { '{', '}', ',', ';' }, S_CHR, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { TOKEN, { '~', '?' }, S_CHR, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* saw 0, possible oct|hex|dec|dbl constant */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { OCT1, { C_XXX }, BACK(T_DECIMAL), },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { OCT1, { C_LET, C_DEC }, BAD1, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { OCT1, { C_OCT }, OCT2, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { OCT1, { 'e', 'E' }, DBL2, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { OCT1, { 'l', 'L', 'u', 'U' }, QUAL(DEC2), },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { OCT1, { 'x', 'X' }, HEX1, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { OCT1, { '.' }, DBL1, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* saw 0<oct>, oct constant */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { OCT2, { C_XXX }, BACK(T_OCTAL), },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { OCT2, { C_LET, C_DEC }, BAD1, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { OCT2, { C_OCT }, OCT2, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { OCT2, { 'e', 'E' }, DBL2, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { OCT2, { 'l', 'L', 'u', 'U' }, QUAL(OCT3), },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { OCT2, { '.' }, DBL1, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* oct constant qualifier */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { OCT3, { C_XXX }, BACK(T_OCTAL), },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { OCT3, { C_LET, C_DEC, '.' }, BAD1, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { OCT3, { 'l', 'L', 'u', 'U' }, QUAL(OCT3), },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* saw 0 [xX], hex constant */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { HEX1, { C_XXX }, BACK(T_HEXADECIMAL), },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { HEX1, { C_LET }, BAD1, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { HEX1, { C_HEX }, HEX1, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { HEX1, { 'e', 'E' }, HEX3, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { HEX1, { 'l', 'L', 'u', 'U' }, QUAL(HEX2), },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { HEX1, { '.' }, HEX4, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { HEX1, { 'p', 'P' }, HEX5, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* hex constant qualifier */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { HEX2, { C_XXX }, BACK(T_HEXADECIMAL), },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { HEX2, { C_LET, C_DEC, '.' }, BAD1, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { HEX2, { 'l', 'L', 'u', 'U' }, QUAL(HEX2), },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* hex [eE][-+] botch */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { HEX3, { C_XXX }, BACK(T_HEXADECIMAL), },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { HEX3, { C_LET, '.', '-', '+'},BAD1, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { HEX3, { C_HEX }, HEX1, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { HEX3, { 'e', 'E' }, HEX3, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { HEX3, { 'l', 'L', 'u', 'U' }, QUAL(HEX2), },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* hex dbl fraction */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { HEX4, { C_XXX }, BACK(T_HEXDOUBLE), },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { HEX4, { C_LET, '.' }, BAD1, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { HEX4, { C_HEX }, HEX4, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { HEX4, { 'p', 'P' }, HEX5, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { HEX4, { 'f', 'F', 'l', 'L' }, QUAL(HEX8), },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* optional hex dbl exponent sign */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { HEX5, { C_XXX }, BACK(T_INVALID), },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { HEX5, { C_LET, '.' }, BAD1, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { HEX5, { '+', '-' }, HEX6, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { HEX5, { C_DEC }, HEX7, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* mandatory hex dbl exponent first digit */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { HEX6, { C_XXX }, BACK(T_INVALID), },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { HEX6, { C_LET, '.' }, BAD1, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { HEX6, { C_DEC }, HEX7, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* hex dbl exponent digits */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { HEX7, { C_XXX }, BACK(T_HEXDOUBLE), },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { HEX7, { C_LET, '.' }, BAD1, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { HEX7, { C_DEC }, HEX7, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { HEX7, { 'f', 'F', 'l', 'L' }, QUAL(HEX8), },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* hex dbl constant qualifier */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { HEX8, { C_XXX }, BACK(T_HEXDOUBLE), },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { HEX8, { C_LET, '.' }, BAD1, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { HEX8, { 'f', 'F', 'l', 'L' }, QUAL(HEX8), },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* saw <dec>, dec constant */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { DEC1, { C_XXX }, BACK(T_DECIMAL), },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { DEC1, { C_LET }, BAD1, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { DEC1, { C_DEC }, DEC1, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { DEC1, { 'e', 'E' }, DBL2, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { DEC1, { 'l', 'L', 'u', 'U' }, QUAL(DEC2), },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { DEC1, { '.' }, DBL1, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* dec constant qualifier */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { DEC2, { C_XXX }, BACK(T_DECIMAL), },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { DEC2, { C_LET, C_DEC }, BAD1, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { DEC2, { 'l', 'L', 'u', 'U' }, QUAL(DEC2), },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* saw ., operator or dbl constant */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { DOT1, { C_XXX }, S_CHRB, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { DOT1, { '.' }, DOT2, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { DOT1, { C_DEC }, DBL1, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* dbl fraction */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { DBL1, { C_XXX }, BACK(T_DOUBLE), },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { DBL1, { C_LET, '.' }, BAD1, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { DBL1, { C_DEC }, DBL1, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { DBL1, { 'e', 'E' }, DBL2, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { DBL1, { 'f', 'F', 'l', 'L' }, QUAL(DBL5), },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* optional dbl exponent sign */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { DBL2, { C_XXX }, BACK(T_INVALID), },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { DBL2, { C_LET, '.' }, BAD1, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { DBL2, { '+', '-' }, DBL3, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { DBL2, { C_DEC }, DBL4, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* mandatory dbl exponent first digit */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { DBL3, { C_XXX }, BACK(T_INVALID), },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { DBL3, { C_LET, '.' }, BAD1, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { DBL3, { C_DEC }, DBL4, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* dbl exponent digits */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { DBL4, { C_XXX }, BACK(T_DOUBLE), },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { DBL4, { C_LET, '.' }, BAD1, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { DBL4, { C_DEC }, DBL4, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { DBL4, { 'f', 'F', 'l', 'L' }, QUAL(DBL5), },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* dbl constant qualifier */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { DBL5, { C_XXX }, BACK(T_DOUBLE), },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { DBL5, { C_LET, '.' }, BAD1, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { DBL5, { 'f', 'F', 'l', 'L' }, QUAL(DBL5), },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* saw < starting include header */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { HDR1, { C_XXX }, HDR1, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { HDR1, { '>', '\n', C_EOF }, S_LITEND, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* saw <binop><space> expecting = */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { BIN1, { C_XXX }, S_HUH, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { BIN1, { ' ', '\t' }, BIN1, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* 2-char ops */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { SHARP1, { C_XXX }, S_SHARP, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { PCT1, { C_XXX }, S_CHRB, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { PCT1, { '=' }, KEEP(T_MODEQ), },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { AND1, { C_XXX }, S_CHRB, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { AND1, { '=' }, KEEP(T_ANDEQ), },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { AND1, { '&' }, KEEP(T_ANDAND), },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { STAR1, { C_XXX }, S_CHRB, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { STAR1, { '=' }, KEEP(T_MPYEQ), },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { STAR1, { '/' }, S_COMMENT, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { PLUS1, { C_XXX }, S_CHRB, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { PLUS1, { '=' }, KEEP(T_ADDEQ), },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { PLUS1, { '+' }, KEEP(T_ADDADD), },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { MINUS1, { C_XXX }, S_CHRB, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { MINUS1, { '=' }, KEEP(T_SUBEQ), },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { MINUS1, { '-' }, KEEP(T_SUBSUB), },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { MINUS1, { '>' }, KEEP(T_PTRMEM), },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { COLON1, { C_XXX }, S_CHRB, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { COLON1, { '=', '>' }, S_HUH, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { LT1, { C_XXX }, S_CHRB, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { LT1, { '=' }, KEEP(T_LE), },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { LT1, { '<' }, LSH1, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { EQ1, { C_XXX }, S_CHRB, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { EQ1, { '=' }, KEEP(T_EQ), },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { NOT1, { C_XXX }, S_CHRB, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { NOT1, { '=' }, KEEP(T_NE), },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { GT1, { C_XXX }, S_CHRB, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { GT1, { '=' }, KEEP(T_GE), },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { GT1, { '>' }, RSH1, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { CIRC1, { C_XXX }, S_CHRB, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { CIRC1, { '=' }, KEEP(T_XOREQ), },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { OR1, { C_XXX }, S_CHRB, },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { OR1, { '=' }, KEEP(T_OREQ), },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { OR1, { '|' }, KEEP(T_OROR), },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* 3-char ops */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { ARROW1, { C_XXX }, BACK(T_PTRMEM), },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { ARROW1, { '*' }, KEEP(T_PTRMEMREF), },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { LSH1, { C_XXX }, BACK(T_LSHIFT), },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { LSH1, { '=' }, KEEP(T_LSHIFTEQ), },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { RSH1, { C_XXX }, BACK(T_RSHIFT), },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { RSH1, { '=' }, KEEP(T_RSHIFTEQ), },
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* end */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { OP, { 0 }, END, }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin};
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinshort fsm[TERMINAL+1][MAX+1];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinchar trigraph[MAX+1];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if PROTOMAIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic char spl[] = { '\\', '\r', 0 };
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic char aln[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_$@";
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic char spl[] = { MARK, '?', '\\', '\r', CC_sub, 0 };
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic char aln[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_";
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic char* let = &aln[10];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic char hex[] = "fedcbaFEDCBA9876543210";
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic char* dec = &hex[12];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic char* oct = &hex[14];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * runtime FSM modifications
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * ppfsm(FSM_INIT,0) must be called first
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinvoid
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinppfsm(int op, register char* s)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int i;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register short* rp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register struct fsminit* fp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if !PROTOMAIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char* t;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int x;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin switch (op)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if !PROTOMAIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case FSM_IDADD:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (c = *s++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!ppisid(c))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (fsm[TOKEN][c] == ~S_HUH)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin setid(c);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (i = 0; i < TERMINAL; i++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fsm[i][c] = IDSTATE(fsm[i]['_']);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else error(2, "%c: cannot add to identifier set", c);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case FSM_IDDEL:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (c = *s++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (ppisid(c))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin clrid(c);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (i = 0; i < TERMINAL; i++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fsm[i][c] = ~S_HUH;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case FSM_INIT:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (fp = fsminit;; fp++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((n = fp->nextstate) >= TERMINAL) n = ~n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (fp->state == OP)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if !PROTOMAIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin switch (n)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case COPY:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = fp->ch[0];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = fp->ch[2];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (i = fp->ch[1]; i <= n; i++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin copy(i, c);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin default:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin rp = fsm[fp->state];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (i = 0; i < sizeof(fp->ch) && (c = fp->ch[i]); i++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin switch (c)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case C_XXX:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (c = 0; c <= MAX; c++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin rp[c] = n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /*FALLTHROUGH*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case C_EOF:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fsm[TERMINAL][fp->state+1] = n < 0 ? ~n : n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case C_LET:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s = let;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case C_HEX:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s = hex;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case C_DEC:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s = dec;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case C_OCT:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s = oct;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin default:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin rp[c] = n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (c = *s++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin rp[c] = n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * install splice special cases
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * and same non-terminal transitions
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (i = 0; i < TERMINAL; i++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin rp = fsm[i];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s = spl;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (c = *s++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (c != MARK || !INCOMMENT(rp))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (rp[c] >= 0) rp[c] = ~rp[c];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin rp[c] &= ~SPLICE;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin rp[EOB] = ~S_EOB;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (c = 0; c <= MAX; c++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (rp[c] == i)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin rp[c] = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fsm[TERMINAL][0] = ~S_EOB;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if !PROTOMAIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * default character types
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s = let;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (c = *s++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin setid(c);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s = dec;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (c = *s++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin setdig(c);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s = spl;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin do setsplice(c = *s++); while (c);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * trigraph map
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin trigraph['='] = '#';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin trigraph['('] = '[';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin trigraph['/'] = '\\';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin trigraph[')'] = ']';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin trigraph['\''] = '^';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin trigraph['<'] = '{';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin trigraph['!'] = '|';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin trigraph['>'] = '}';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin trigraph['-'] = '~';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if !PROTOMAIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case FSM_PLUSPLUS:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (pp.option & PLUSPLUS)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fsm[COLON1][':'] = ~KEEP(T_SCOPE);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fsm[DOT1]['*'] = ~KEEP(T_DOTREF);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fsm[MINUS1]['>'] = ARROW1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fsm[COM1]['/'] = COM5;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin t = "%<:";
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (i = 0; i < TERMINAL; i++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin rp = fsm[i];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!INCOMMENT(rp) && !INQUOTE(rp))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s = t;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (c = *s++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (rp[c] > 0) rp[c] = ~rp[c];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (!rp[c]) rp[c] = ~i;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin rp[c] &= ~SPLICE;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s = t;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (c = *s++) setsplice(c);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fsm[COLON1][':'] = ~S_CHRB;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fsm[DOT1]['*'] = ~S_CHRB;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fsm[MINUS1]['>'] = ~KEEP(T_PTRMEM);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fsm[COM1]['/'] = (pp.option & PLUSCOMMENT) ? COM5 : ~S_CHRB;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if COMPATIBLE
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case FSM_COMPATIBILITY:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (pp.state & COMPATIBILITY)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fsm[HEX1]['e'] = HEX1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fsm[HEX1]['E'] = HEX1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fsm[QNUM]['e'] = QNUM;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fsm[QNUM]['E'] = QNUM;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fsm[QNUM]['u'] = ~QUAL(QNUM);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fsm[QNUM]['U'] = ~QUAL(QNUM);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fsm[HEX1]['e'] = HEX3;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fsm[HEX1]['E'] = HEX3;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fsm[QNUM]['e'] = QEXP;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fsm[QNUM]['E'] = QEXP;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fsm[QNUM]['u'] = QNUM;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fsm[QNUM]['U'] = QNUM;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case FSM_QUOTADD:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (c = *s++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (fsm[TOKEN][c] == ~S_HUH)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (i = 0; i < TERMINAL; i++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fsm[i][c] = fsm[i]['"'];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else error(2, "%c: cannot add to quote set", c);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case FSM_QUOTDEL:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (c = *s++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (c != '"' && fsm[TOKEN][c] == fsm[TOKEN]['"'])
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (i = 0; i < TERMINAL; i++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fsm[i][c] = fsm[i]['_'];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case FSM_OPSPACE:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = s ? BIN1 : ~S_CHRB;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fsm[COM1][' '] = fsm[COM1]['\t'] = n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fsm[AND1][' '] = fsm[AND1]['\t'] = n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fsm[STAR1][' '] = fsm[STAR1]['\t'] = n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fsm[PCT1][' '] = fsm[PCT1]['\t'] = n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fsm[PLUS1][' '] = fsm[PLUS1]['\t'] = n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fsm[MINUS1][' '] = fsm[MINUS1]['\t'] = n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fsm[CIRC1][' '] = fsm[CIRC1]['\t'] = n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fsm[OR1][' '] = fsm[OR1]['\t'] = n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fsm[LSH1][' '] = fsm[LSH1]['\t'] = s ? BIN1 : ~BACK(T_LSHIFT);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fsm[RSH1][' '] = fsm[RSH1]['\t'] = s ? BIN1 : ~BACK(T_RSHIFT);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case FSM_MACRO:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (pp.truncate && strlen(s) >= pp.truncate)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin x = s[pp.truncate];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s[pp.truncate] = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else x = -1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin i = MAC0 + ((c = *s++) != 'L');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((n = fsm[QUICK][c]) != (i + NMAC))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = i;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!*s) n += NMAC;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (fsm[QUICK][c] != n)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fsm[QUICK][c] = fsm[QCOM][c] = fsm[QTOK][c] = n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (c = *s++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (;;)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((i = n) < HIT0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (n < MACN) n++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!*s)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n += NMAC;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (fsm[i][c] < HIT0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fsm[i][c] = n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (fsm[i + NMAC][c] < HIT0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fsm[i + NMAC][c] = n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (n < HITN) n++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!*s) break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (fsm[i][c] < HIT0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n -= NMAC;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fsm[i][c] = n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = *s++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (x >= 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *s = x;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (n = CHAR_MIN; n <= CHAR_MAX; n++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (ppisidig(n))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fsm[HITN][n] = HITN;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = HITN;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (fsm[i][c] < n)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fsm[i][c] = n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (i < HIT0 && fsm[i + NMAC][c] < n)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fsm[i + NMAC][c] = n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if !PROTOMAIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * file buffer refill
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * c is current input char
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinvoid
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinrefill(register int c)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (pp.in->flags & IN_eof)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.in->nextchr--;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *((pp.in->nextchr = pp.in->buffer + PPBAKSIZ) - 1) = c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c =
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if PROTOTYPE
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (pp.in->flags & IN_prototype) ? pppread(pp.in->nextchr) :
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin read(pp.in->fd, pp.in->nextchr, PPBUFSIZ);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (c > 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (pp.in->nextchr[c - 1] == '\n') pp.in->flags |= IN_newline;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else pp.in->flags &= ~IN_newline;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if PROTOTYPE
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(pp.in->flags & IN_prototype))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (c < PPBUFSIZ && (pp.in->flags & IN_regular))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.in->flags |= IN_eof;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin close(pp.in->fd);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.in->fd = -1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (c < 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error(ERROR_SYSTEM|3, "read error");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if ((pp.in->flags ^ pp.in->prev->flags) & IN_c)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin static char ket[] = { 0, '}', '\n', 0 };
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.in->flags ^= IN_c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.in->nextchr = ket + 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = 2;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.in->flags |= IN_eof;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if CHECKPOINT
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.in->buflen = c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.in->nextchr[c] = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin debug((-7, "refill(\"%s\") = %d = \"%-.*s%s\"", error_info.file, c, (c > 32 ? 32 : c), pp.in->nextchr, c > 32 ? "..." : ""));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (pp.test & 0x0080)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sfstderr, "===== refill(\"%s\") = %d =====\n%s\n===== eob(\"%s\") =====\n", error_info.file, c, pp.in->nextchr, error_info.file);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif