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 lexical analyzer definitions
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifndef _PPFSM_H
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define _PPFSM_H
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define BITSTATE 16 /* bitsof(state) */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define BITNONTERM 7 /* bitsof(non-terminal-state) */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define BITTERM 7 /* bitsof(terminal-state) */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define NMAC 19 /* number of MAC states */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SPLICE (1<<BITTERM)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define CODE(tok,act) ((((tok)-N_PP)<<(BITTERM+1))|(act))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define TERM(st) ((st)&((1<<(BITTERM+1))-1))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define NEXT(st) (((st)>>(BITTERM+1))&((1<<BITNONTERM)-1))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define QUAL(st) (((st)<<(BITTERM+1))|(S_QUAL))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define TYPE(st) (NEXT(st)+N_PP)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define BACK(tok) CODE(tok,S_TOKB)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define KEEP(tok) CODE(tok,S_TOK)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef MAX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define MAX 255
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef EOB
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define EOB 0
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef EOF
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define EOF (MAX+1)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * FSM states
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * NOTE: preserve the ranges
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define INDEX(p) (((p)-fsm[0])/(MAX+1))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define IDSTATE(x) (((x)>=0&&INQMACRO(fsm[x]))?QID:(x))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define INCOMMENT(p) ((p)>=fsm[COM2]&&(p)<=fsm[COM7])
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define INCOMMENTXX(p) ((p)>=fsm[COM5]&&(p)<=fsm[COM7])
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define INQMACRO(p) ((p)>=fsm[MAC0]&&(p)<=fsm[LIT0])
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define INTMACRO(p) ((p)>=fsm[NID]&&(p)<=fsm[LIT])
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define INQUOTE(p) ((p)>=fsm[LIT1]&&(p)<=fsm[LIT2])
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define INOPSPACE(p) ((p)==fsm[BIN1])
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define INSPACE(p) ((p)==fsm[WS1])
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * proto non-terminal states
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define PROTO 0
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define RES1 (PROTO+1)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define RES1a (PROTO+2)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define RES1e (PROTO+3)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define RES1f (PROTO+4)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define RES1h (PROTO+5)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define RES1l (PROTO+6)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define RES1n (PROTO+7)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define RES1o (PROTO+8)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define RES1t (PROTO+9)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define RES1x (PROTO+10)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define RES1y (PROTO+11)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define COM1 (PROTO+12)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define COM2 (PROTO+13)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define COM3 (PROTO+14)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define COM4 (PROTO+15)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define COM5 (PROTO+16)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define COM6 (PROTO+17)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define COM7 (PROTO+18)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define NID (PROTO+19)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define LIT (PROTO+20)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define LIT1 (PROTO+21)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define LIT2 (PROTO+22)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define BAD1 (PROTO+23)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define BAD2 (PROTO+24)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define DOT (PROTO+25)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define DOT2 (PROTO+26)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define WS1 (PROTO+27)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if PROTOMAIN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define TERMINAL (PROTO+28) /* PROTOMAIN */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * quick non-terminal states
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define QUICK (PROTO+28)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define QTOK (QUICK+1)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define QNUM (QUICK+2)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define QEXP (QUICK+3)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define QCOM (QUICK+4)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define QID (QUICK+5)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define MAC0 (QUICK+6)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define MACN (MAC0+NMAC-1)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define HIT0 (MACN+1)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define HITN (HIT0+NMAC-1)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define LIT0 (HITN+1)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SHARP1 (HITN+2)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * tokenize non-terminal states
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define TOKEN (HITN+3)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define OCT1 (TOKEN+1)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define OCT2 (TOKEN+2)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define OCT3 (TOKEN+3)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define NOT1 (TOKEN+4)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define PCT1 (TOKEN+5)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define AND1 (TOKEN+6)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define STAR1 (TOKEN+7)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define PLUS1 (TOKEN+8)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define MINUS1 (TOKEN+9)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define ARROW1 (TOKEN+10)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define COLON1 (TOKEN+11)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define LT1 (TOKEN+12)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define LSH1 (TOKEN+13)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define EQ1 (TOKEN+14)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define RSH1 (TOKEN+15)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define GT1 (TOKEN+16)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define CIRC1 (TOKEN+17)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define OR1 (TOKEN+18)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define DEC1 (TOKEN+19)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define DEC2 (TOKEN+20)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define HEX1 (TOKEN+21)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define HEX2 (TOKEN+22)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define HEX3 (TOKEN+23)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define HEX4 (TOKEN+24)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define HEX5 (TOKEN+25)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define HEX6 (TOKEN+26)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define HEX7 (TOKEN+27)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define HEX8 (TOKEN+28)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define DBL1 (TOKEN+29)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define DBL2 (TOKEN+30)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define DBL3 (TOKEN+31)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define DBL4 (TOKEN+32)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define DBL5 (TOKEN+33)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define DOT1 (TOKEN+34)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define HDR1 (TOKEN+35)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define BIN1 (TOKEN+36)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define TERMINAL (TOKEN+37)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * quick terminal states grouped together
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define S_CHRB (TERMINAL+0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define S_COMMENT (TERMINAL+1)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define S_EOB (TERMINAL+2)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define S_LITBEG (TERMINAL+3)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define S_LITEND (TERMINAL+4)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define S_LITESC (TERMINAL+5)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define S_MACRO (TERMINAL+6)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define S_NL (TERMINAL+7)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define S_QUAL (TERMINAL+8)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define S_SHARP (TERMINAL+9)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define S_VS (TERMINAL+10)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * and the remaining terminal states
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define S_CHR (TERMINAL+11)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define S_HUH (TERMINAL+12)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define S_TOK (TERMINAL+13)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define S_TOKB (TERMINAL+14)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define S_WS (TERMINAL+15)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define S_RESERVED (S_HUH)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * the last terminal state (for tracing)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define LAST (S_WS)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * pseudo terminal states
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define S_EOF (0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * common lex macros
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * NOTE: common local variable names assumed
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define GET(p,c,tp,xp) \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin do \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((c = GETCHR()) == EOB && pp.in->type == IN_FILE) \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin FGET(p, c, tp, xp); \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin } while (0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define FGET(p,c,tp,xp) \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin do \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (op > xp + PPTOKSIZ) \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!INCOMMENT(rp) && !(pp.state & (NOTEXT|SKIPCONTROL))) \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error(2, "long token truncated"); \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op = xp + PPTOKSIZ; \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin } \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((pp.in->flags & IN_flush) && pp.level == 1 && !INMACRO(rp) && (!pp.comment || !INCOMMENT(rp)) && (c = op - pp.outbuf) > 0 && *(op - 1) == '\n') \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PPWRITE(c); \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op = tp = pp.outp = pp.outbuf; \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin } \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin SYNCIN(); \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin refill(p); \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin CACHEIN(); \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((c = GETCHR()) == EOB) BACKIN(); \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin } while (0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define POP() \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin do \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin debug((-7, "POP in=%s next=%s state=%s", ppinstr(cur), pptokchr(*prv->nextchr), pplexstr(INDEX(rp)))); \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ip = (pp.in = prv)->nextchr; \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin } while (0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * fsm implementaion globals
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define fsm _pp_fsmtab
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define refill _pp_refill
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define trigraph _pp_trigraph
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * first index is state, second is char, value is next state
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * except for fsm[TERMINAL] where second is state+1 for EOF transition
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern short fsm[TERMINAL+1][MAX+1];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * the index is char, value is trigraph value for <?><?><char>, 0 if invalid
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern char trigraph[MAX+1];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern void refill(int);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif