COMPILETIME TPA$K_UNAMES = 0, TPA$K_KEYNUMB = -1, TPA$K_KEYFLAG = 0, TPA$K_SUBEXPR = 0, TPA$K_TYPEVAL = 0, TPA$K_FINAL = 0; LITERAL TPA$K_MAXKEY = 220; LITERAL TPA$M_CODEFLAG = 256, TPA$M_EXTRAFLAG = 512, TPA$M_LASTFLAG = 1024, TPA$M_EXTFLAG = 2048, TPA$M_TRANFLAG = 4096, TPA$M_MASKFLAG = 8192, TPA$M_ADDRFLAG = 16384, TPA$M_ACTFLAG = 32768, TPA$M_PARMFLAG = 65536; LITERAL TPA$_KEYWORD = 256, TPA$_EXIT = -1, TPA$_FAIL = -2, TPA$_NODE_ACS = 487, TPA$_NODE_PRIMARY = 488, TPA$_NODE = 489, TPA$_FILESPEC = 490, TPA$_UIC = 491, TPA$_IDENT = 492, TPA$_ANY = 493, TPA$_ALPHA = 494, TPA$_DIGIT = 495, TPA$_STRING = 496, TPA$_SYMBOL = 497, TPA$_BLANK = 498, TPA$_DECIMAL = 499, TPA$_OCTAL = 500, TPA$_HEX = 501, TPA$_LAMBDA = 502, TPA$_EOS = 503, TPA$_SUBEXPR = 504; MACRO $INIT_STATE (START_STATE, KEY_TABLE, PSECT_ARG) = %ASSIGN (TPA$K_KEYNUMB, -1) %IF %DECLARED (%QUOTE %QUOTE TPA$PSECT_STATE) %THEN UNDECLARE %QUOTE %QUOTE TPA$PSECT_STATE; %FI %IF %DECLARED (%QUOTE %QUOTE TPA$PSECT_KEY0) %THEN UNDECLARE %QUOTE %QUOTE TPA$PSECT_KEY0; %FI %IF %DECLARED (%QUOTE %QUOTE TPA$PSECT_KEY1) %THEN UNDECLARE %QUOTE %QUOTE TPA$PSECT_KEY1; %FI MACRO TPA$PSECT_STATE (OWN_GLOBAL) = PSECT OWN_GLOBAL = %IF %NULL (PSECT_ARG) %THEN _LIB$STATE$ %ELSE %NAME (PSECT_ARG, '_STATE') %FI (NOWRITE, SHARE, PIC, EXECUTE, ALIGN (1)) %QUOTE %; MACRO TPA$PSECT_KEY0 (OWN_GLOBAL) = PSECT OWN_GLOBAL = %IF %NULL (PSECT_ARG) %THEN _LIB$KEY0$ %ELSE %NAME (PSECT_ARG, '_KEY0') %FI (NOWRITE, SHARE, PIC, EXECUTE, ALIGN (1)) %QUOTE %; MACRO TPA$PSECT_KEY1 (OWN_GLOBAL) = PSECT OWN_GLOBAL = %IF %NULL (PSECT_ARG) %THEN _LIB$KEY1$ %ELSE %NAME (PSECT_ARG, '_KEY1') %FI (NOWRITE, SHARE, PIC, EXECUTE, ALIGN (1)) %QUOTE %; TPA$PSECT_KEY0 (GLOBAL); TPA$PSECT_KEY0 (OWN); GLOBAL KEY_TABLE : VECTOR [0]; %ASSIGN (TPA$K_UNAMES, %SWITCHES (UNAMES)) SWITCHES UNAMES; %IF %DECLARED (TPA$KEY0) %THEN UNDECLARE TPA$KEY0; %FI OWN TPA$KEY0 : VECTOR [0]; %IF NOT TPA$K_UNAMES %THEN SWITCHES NOUNAMES; %FI TPA$PSECT_STATE (GLOBAL); GLOBAL START_STATE : VECTOR [0]; PSECT GLOBAL = $GLOBAL$; PSECT OWN = $OWN$; %; MACRO $STATE (STATE_LABEL) = TPA$PSECT_STATE (OWN); %IF NOT %NULL (STATE_LABEL) %THEN OWN STATE_LABEL : ALIGN (0) VECTOR [0]; %FI %ASSIGN (TPA$K_KEYFLAG, 0) $STATE_ITEMS (%REMAINING) %IF TPA$K_KEYFLAG %THEN TPA$PSECT_KEY1 (OWN); %ASSIGN (TPA$K_UNAMES, %SWITCHES (UNAMES)) SWITCHES UNAMES; OWN TPA$KEYFILL : VECTOR [1,BYTE] ALIGN (0) INITIAL (BYTE (255)); %IF NOT TPA$K_UNAMES %THEN SWITCHES NOUNAMES; %FI UNDECLARE TPA$KEYFILL; %FI PSECT OWN = $OWN$; %; MACRO $STATE_ITEMS [ELEMENT] = %ASSIGN (TPA$K_UNAMES, %SWITCHES (UNAMES)) SWITCHES UNAMES; %ASSIGN (TPA$K_FINAL, %NULL (%REMAINING)) TPA$MAKE_TRAN (TPA$K_FINAL, %REMOVE (ELEMENT)) %IF NOT TPA$K_UNAMES %THEN SWITCHES NOUNAMES; %FI %; MACRO TPA$MAKE_TRAN (TPA$K_FINAL, TYPE, TARGET, ACTION, MASK, ADDR, PARAM) = %ASSIGN (TPA$K_SUBEXPR, 0) %IF TPA$IFSUBEXPR (TYPE) %THEN %ASSIGN (TPA$K_TYPEVAL, TPA$_SUBEXPR) %ASSIGN (TPA$K_SUBEXPR, 1) %ELSE %IF TPA$IFKEYWORD (TYPE) %THEN %ASSIGN (TPA$K_KEYNUMB, TPA$K_KEYNUMB+1) %IF TPA$K_KEYNUMB GEQU TPA$K_MAXKEY %THEN %ERROR ('Maximum number of keywords exceeded') %FI %IF %CHARCOUNT (TYPE) GTRU 65535 %THEN %ERROR ('Keyword longer than 65535 characters') %FI TPA$PSECT_KEY1 (OWN); OWN TPA$KEYST0 : VECTOR [0] ALIGN (0); TPA$PSECT_KEY0 (OWN); OWN TPA$KEY : LONG INITIAL (TPA$KEYST0 - TPA$KEY0); TPA$PSECT_KEY1 (OWN); OWN TPA$KEYST : VECTOR [%CHARCOUNT (TPA$KEY_STRING (TYPE)) + 1, BYTE] ALIGN (0) INITIAL (BYTE (TPA$KEY_STRING (TYPE), 255)); UNDECLARE TPA$KEY, TPA$KEYST, TPA$KEYST0; TPA$PSECT_STATE (OWN); %ASSIGN (TPA$K_TYPEVAL, TPA$_KEYWORD + TPA$K_KEYNUMB) %ASSIGN (TPA$K_KEYFLAG, 1) %ELSE %ASSIGN (TPA$K_TYPEVAL, TYPE) %FI %FI OWN TPA$TYPE : WORD ALIGN (0) INITIAL (TPA$K_TYPEVAL + TPA$K_SUBEXPR*TPA$M_EXTFLAG %IF NOT %NULL (PARAM) %THEN +TPA$M_EXTRAFLAG %FI %IF NOT %NULL (ACTION) %THEN +TPA$M_ACTFLAG %FI %IF NOT %NULL (MASK) %THEN +TPA$M_MASKFLAG %IF %NULL (ADDR) %THEN %ERROR ('Mask address missing') %FI %FI %IF NOT %NULL (ADDR) %THEN +TPA$M_ADDRFLAG %FI %IF NOT %NULL (TARGET) %THEN +TPA$M_TRANFLAG %FI + TPA$K_FINAL*TPA$M_LASTFLAG ); UNDECLARE TPA$TYPE; %IF NOT %NULL (PARAM) %THEN OWN TPA$FLAGS2 : BYTE ALIGN (0) INITIAL (TPA$M_PARMFLAG/65536); UNDECLARE TPA$FLAGS2; %FI %IF TPA$K_SUBEXPR %THEN TPA$MAKE_SUB (%REMOVE (TYPE)) %FI %IF NOT %NULL (PARAM) %THEN OWN TPA$PARAM : LONG ALIGN (0) INITIAL (PARAM); UNDECLARE TPA$PARAM; %FI %IF NOT %NULL (ACTION) %THEN OWN TPA$ACTION : LONG ALIGN (0) INITIAL (ACTION-TPA$ACTION-4); UNDECLARE TPA$ACTION; %FI %IF NOT %NULL (ADDR) %THEN OWN TPA$ADDR : LONG ALIGN (0) INITIAL (ADDR-TPA$ADDR-4); UNDECLARE TPA$ADDR; %FI %IF NOT %NULL (MASK) %THEN OWN TPA$MASK : LONG ALIGN (0) INITIAL (MASK); UNDECLARE TPA$MASK; %FI %IF NOT %NULL (TARGET) %THEN %IF NOT %DECLARED (TARGET) %THEN FORWARD TARGET : VECTOR [0]; %FI OWN TPA$TARGET : WORD ALIGN (0) INITIAL (%IF %IDENTICAL (TARGET, TPA$_EXIT) OR %IDENTICAL (TARGET, TPA$_FAIL) %THEN TARGET %ELSE TARGET - TPA$TARGET - 2 %FI ); UNDECLARE TPA$TARGET; %FI %; MACRO TPA$MAKE_SUB (SUBNAME) = %IF NOT %DECLARED (SUBNAME) %THEN FORWARD SUBNAME : VECTOR [0]; %FI OWN TPA$SUBEXP : WORD ALIGN(0) INITIAL (SUBNAME - TPA$SUBEXP-2); UNDECLARE TPA$SUBEXP; %; MACRO TPA$IFKEYWORD (TYPE) = %IDENTICAL (TYPE, %STRING (TYPE)) AND %CHARCOUNT (%STRING (TYPE)) GTRU 1 %; MACRO TPA$IFSUBEXPR (TYPE) = NOT %IDENTICAL (TYPE, %REMOVE (TYPE)) %; MACRO TPA$KEY_STRING (TYPE) = %IF %CHARCOUNT (TYPE) EQL 2 %THEN TPA$ONE_STRING (%EXPLODE (TYPE)) %ELSE TYPE %FI %; MACRO TPA$ONE_STRING (A, B) = %IF B EQL '*' %THEN A %ELSE %STRING (A, B) %FI %;