[ENVIRONMENT] MODULE Table_Parser; CONST TPA$K_COUNT0 = 8; TPA$M_BLANKS = 1; TPA$M_ABBREV = 2; TPA$M_ABBRFM = 4; TPA$M_AMBIG = 65536; TPA$K_LENGTH0 = 36; TPA$C_LENGTH0 = 36; LIB$_SYNTAXERR = 1409668; LIB$_INVTYPE = 1409676; TYPE TPA_Stat_Type = (NORMAL,SYNTAX_ERROR,INVALID_TYPE,OTHER); Table_Type = UNSIGNED; TPA_Type = RECORD CASE INTEGER OF 1 : ( TPA$L_COUNT : UNSIGNED; TPA$R_OPTIONS_OVERLAY : [BYTE(4)] RECORD END; TPA$L_STRINGCNT : UNSIGNED; TPA$L_STRINGPTR : UNSIGNED; TPA$L_TOKENCNT : UNSIGNED; TPA$L_TOKENPTR : UNSIGNED; TPA$R_CHAR_OVERLAY : [BYTE(4)] RECORD END; TPA$L_NUMBER : UNSIGNED; TPA$L_PARAM : UNSIGNED; ); 2 : ( TPA$L_OPTIONS : [POS(32)] UNSIGNED; TPA$L_CHAR : [POS(192)] UNSIGNED; ); 3 : ( TPA$B_CHAR : [POS(192),BYTE] 0..255; ); 4 : ( TPA$V_BLANKS : [POS(32),BIT] BOOLEAN; TPA$V_ABBREV : [POS(33),BIT] BOOLEAN; TPA$V_ABBRFM : [POS(34),BIT] BOOLEAN; TPA$V_AMBIG : [POS(48),BIT] BOOLEAN; ); 5 : ( TPA$B_MCOUNT : [POS(56)] 0..255; ); END; Mask_Bit_Pos_Type = RECORD CASE INTEGER OF 1 : ( value : [LONG] UNSIGNED; ); 2 : ( bit1 : [POS(0),BIT] BOOLEAN; bit2 : [POS(1),BIT] BOOLEAN; bit4 : [POS(2),BIT] BOOLEAN; bit8 : [POS(3),BIT] BOOLEAN; bit16 : [POS(4),BIT] BOOLEAN; bit32 : [POS(5),BIT] BOOLEAN; bit64 : [POS(6),BIT] BOOLEAN; bit128 : [POS(7),BIT] BOOLEAN; bit256 : [POS(8),BIT] BOOLEAN; bit512 : [POS(9),BIT] BOOLEAN; bit1024 : [POS(10),BIT] BOOLEAN; bit2048 : [POS(11),BIT] BOOLEAN; bit4096 : [POS(12),BIT] BOOLEAN; bit8192 : [POS(13),BIT] BOOLEAN; bit16384 : [POS(14),BIT] BOOLEAN; bit32768 : [POS(15),BIT] BOOLEAN; ); END; VAR TPA_Stat : INTEGER; TPA : TPA_Type; [HIDDEN] FUNCTION LIB$TPARSE ( %REF arg_blk : TPA_Type; %REF state_tbl : Table_Type; %REF key_tbl : Table_Type ) : INTEGER; EXTERNAL; FUNCTION Table_Parse( string : VARYING[u1] OF CHAR; VAR State : Table_Type; VAR Key : Table_Type ) : TPA_Stat_Type; BEGIN TPA.TPA$L_COUNT := TPA$K_COUNT0; TPA.TPA$L_STRINGCNT := string.length; TPA.TPA$L_STRINGPTR := IADDRESS(string.body); TPA_Stat := LIB$TPARSE(TPA,State,Key); IF ODD(TPA_Stat) THEN BEGIN Table_Parse := NORMAL; END ELSE BEGIN CASE TPA_Stat OF LIB$_SYNTAXERR : Table_Parse := SYNTAX_ERROR; LIB$_INVTYPE : Table_Parse := INVALID_TYPE; OTHERWISE Table_Parse := OTHER; END; END; END; { Table_Parse } END.