[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.
