*DECK DB$TBSR                                                            TBSR 
      FUNC DB$TBSR(GOAL,GOALSIZ,TABPNTR,TABSIZ,ENTSIZ,WOFF,COFF,MTENT);  TBSR 
 #                                                                       TBSR 
  *   DB$TBSR - TABLE SEARCH FUNCTION            PAGE  1                 TBSR 
  *   J. JAN JANIK                               DATE  12/02/75          TBSR 
  DC  PURPOSE                                                            TBSR 
                                                                         TBSR 
      TO SEARCH A TABLE FOR A MATCH OF THE GOAL, RETURNING THE ORDINAL   TBSR 
      IF FOUND, 0 IF NOT.  THE FUNCTION ALSO RETURNS ORDINAL OF FIRST    TBSR 
      EMPTY ENTRY IN MTENT.  AN EMPTY ENTRY IS ONE IN WHICH THE FIRST    TBSR 
      SIX BITS OF THE SEARCHED FIELD IS 0.  ORDINALS START AT 1.         TBSR 
                                                                         TBSR 
  DC  ENTRY CONDITIONS                                                   TBSR 
                                                                         TBSR 
      GOAL AND GOALSIZ - FIELD AND ITS SIZE IN CHARACTERS.  SIZE LQ 30.  TBSR 
      TABPNTR - ADDRESS OF THE START OF THE TABLE IN RIGHT 18 BITS. 
      TABSIZ - NUMBER OF ENTRIES IN THE TABLE.                           TBSR 
      ENTSIZ - SIZE IN WORDS OF EACH ENTRY IN THE TABLE.                 TBSR 
      WOFF - WORD WITHIN ENTRY WHERE GOAL STARTS (0 TO ENTSIZ - 1)       TBSR 
      COFF - CHARACTER WITHIN WOFF WHERE GOAL STARTS.  GOAL IS OFFSET    TBSR 
             BY THE SAME AMOUNT WITHIN GOAL.                             TBSR 
                                                                         TBSR 
  DC  EXIT CONDITIONS                                                    TBSR 
                                                                         TBSR 
      VALUE OF THE FUNCTION IS ORDINAL OF MATCH OR 0 IF NO MATCH         TBSR 
      MTENT = ORDINAL OF FIRST EMPTY ENTRY IF ONE IS DETECTED BEFORE A   TBSR 
              MATCH IS FOUND.  0 IF NONE FOUND.                          TBSR 
                                                                         TBSR 
  DC  CALLING ROUTINES                                                   TBSR 
                                                                         TBSR 
      DB$SR07 - BUILD AND VERIFY A SCHEMA ENTRY IN CORE 
 #                                                                       TBSR 
      CONTROL EJECT;                                                     TBSR 
      BEGIN                                                              TBSR 
#     FORMAL PARAMETERS #                                                TBSR 
      ITEM GOAL C(40);       # CHARACTER STRING TO BE MATCHED          # TBSR 
      ITEM GOALSIZ I;        # SIZE OF GOAL IN CHARACTERS              # TBSR 
      ITEM TABPNTR I;        # ADDRESS OF TABLE TO BE SEARCHED         # TBSR 
      ITEM TABSIZ I;         # NUMBER OF ENTRIES IN THE TABLE          # TBSR 
      ITEM ENTSIZ I;         # SIZE OF EACH ENTRY IN WORDS             # TBSR 
      ITEM WOFF I;           # WORD WITHIN ENTRY WHERE GOAL STARTS     # TBSR 
      ITEM COFF I;           # CHARACTER WITHIN WOFF WHERE GOAL STARTS # TBSR 
      ITEM MTENT I;          # CELL WHICH WILL CONTAIN FIRST EMPTY       TBSR 
                               ENTRY ENCOUNTERED                       # TBSR 
                                                                         TBSR 
#     LOCAL VARIABLES  #                                                 TBSR 
      ITEM BOFF I;           # USED TO DETERMINE BIT OFFSET FOR MT TEST# TBSR 
      ITEM ENTINDX I;        # USED TO EVALUATE SUBSCRIPT FOR SRCHITM  # TBSR 
      ITEM FOUNDINDX I;      # SET TO ORDINAL OF MATCH                 # TBSR 
      ITEM INDEX I;          # INDUCTION VARIABLE FOR FOR LOOP         # TBSR 
                                                                         TBSR 
      BASED ARRAY SEARCHTAB S(1);                                        TBSR 
        BEGIN                                                            TBSR 
        ITEM SRCHITM C(0,0,40);  # 1ST WORD OF STRING TO BE EXAMINED   # TBSR 
        END                                                              TBSR 
 #                                                                       TBSR 
                                                                         TBSR 
  DC  DESCRIPTION                                                        TBSR 
                                                                         TBSR 
      START OF EXECUTABLE CODE FOR DB$TBSR.                              TBSR 
      INITIALIZE MTENT AND FOUNDINDX.  POINT SEARCHTAB TO TABLE.         TBSR 
 #                                                                       TBSR 
      MTENT =0;                                                          TBSR 
      FOUNDINDX = 0;                                                     TBSR 
      P<SEARCHTAB> = B<42,18> TABPNTR; # USE ONLY 18-BIT ADDRESS PART#
 #                                                                       TBSR 
      SEARCH TABLE UNTIL WHOLE TABLE SEARCHED OR FOUNDINDX IS NON-ZERO. 
 #                                                                       TBSR 
      BOFF = COFF * 6;                                                   TBSR 
      ENTINDX = WOFF - ENTSIZ;  # SET UP ENTINDX FOR USE IN FOR LOOP   # TBSR 
                                # ENTINDX=(INDEX-1)*ENTSIZ+WOFF IN LOOP#
                                                                         TBSR 
      FOR INDEX = 1 STEP 1 WHILE INDEX LQ TABSIZ AND FOUNDINDX EQ 0 DO   TBSR 
        BEGIN                                                            TBSR 
        ENTINDX = ENTINDX + ENTSIZ;                                      TBSR 
        IF B<BOFF,6>SRCHITM [ENTINDX] NQ 0                               TBSR 
          THEN                                                           TBSR 
          BEGIN                                                          TBSR 
          IF C<COFF,GOALSIZ>SRCHITM[ENTINDX] EQ C<COFF,GOALSIZ>GOAL      TBSR 
                                                                         TBSR 
            THEN             # MATCH FOUND           #                   TBSR 
            BEGIN                                                        TBSR 
            FOUNDINDX = INDEX;                                           TBSR 
            END                                                          TBSR 
                                                                         TBSR 
          END                                                            TBSR 
                                                                         TBSR 
          ELSE               # EMPTY ENTRY        #                      TBSR 
          BEGIN                                                          TBSR 
          IF MTENT EQ 0  THEN  MTENT = INDEX;                            TBSR 
          END                                                            TBSR 
                                                                         TBSR 
        END                                                              TBSR 
                                                                         TBSR 
      DB$TBSR = FOUNDINDX;                                               TBSR 
      RETURN;                                                            TBSR 
                                                                         TBSR 
      END                                                                TBSR 
      TERM                                                               TBSR 
