*COMDECK SCANNER
      BEGIN 
 #
  *   SCAN ROUTINES FOR DBMSTRD AND CDCS         PAGE  1
  *   J. JAN JANIK                               DATE  20/27/75          MSCN 
  *   C F RICHARDS   COMDECK VERSION             DATE  12/12/78 
  DC  PURPOSE                                                            MSCN 
                                                                         MSCN 
      PERFORM LEXICAL SCAN OF INPUT CARDS FOR DBMSTRD.                   MSCN 
      ALSO USED FOR OPERATOR COMMANDS IN CDCS.
                                                                         MSCN 
  DC  ENTRY AND EXIT CONDITIONS                                          MSCN 
                                                                         MSCN 
      SEE INDIVIDUAL ROUTINE DOCUMENTATION FOR ENTRY/EXIT CONDITONS 
  
      THE SCANNER IS CONTAINED IN COMDECK *SCANNER*. THE CALLER OF THIS 
      COMDECK MUST SUPPLY A DEF OF *DFSCANNERTYP* TO A VALUE WHICH
      IDENTIFIES THE VERSION OF THE SCANNER BEING BUILT.
  
      THE FOLLOWING VALUES OF *DFSCANNERTYP* ARE IN USE - 
          = 0   MASTER DIRECTORY OR RECOVERY/RESTORE UTILITIES
          = 1   CDCS OPERATOR INTERFACE COMMANDS
 #                                                                       MSCN 
                                                                         MSCN 
                                                                         MSCN 
*CALL  MDABTDCLS                                                         MSCN 
# DEFINITIONS OF CODES RETURNED IN DB$CTYP AND DB$NTYP                 # MSCN 
                                                                         MSCN 
        DEF DFEOTCOD #12#;   # END-OF-TRANSMISSION CODE (EOF)          # MSCN 
        DEF DFKEYCOD #100#;  # KEYWORD CODE                            # MSCN 
        DEF DFNAMCOD #101#;  # DATA NAME CODE (30 CHAR STARTING W/ LET)# MSCN 
        DEF DFLITCOD #102#;  # LITERAL CODE (ENCLOSED IN "S)           # MSCN 
        DEF DFINTCOD #107#;  # INTEGER CODE                            # MSCN 
                                                                         MSCN 
# STATUS LIST FOR VALUES USED IN SETSTATUS                             # MSCN 
        STATUS CHARST DELM,PERIOD,QUOTE,MNUS,LTR,DGT,SC,TRCE;            MSCN 
                                                                         MSCN 
# XDEFS DEFINED IN THIS PROGRAM ARE #                                    MSCN 
                                                                         MSCN 
        XDEF                                                             MSCN 
          BEGIN                                                          MSCN 
          PROC DB$MINI;      # INITIALIZE SCAN ROUTINE                 # MSCN 
          PROC DB$SCAN;      # IDENTIFY NEXT SOURCE WORD               # MSCN 
          PROC DB$SSCN;      # SKIP TO NEXT RECORD AND IDENTIFY FIRST  # MSCN 
                             # WORD.  CALLED WHEN +SNC SPECIFIED.      # MSCN 
          END                                                            MSCN 
                                                                         MSCN 
# EXTERNAL REFERENCES NEED BY THIS PROGRAM                             # MSCN 
                                                                         MSCN 
        XREF                                                             MSCN 
          BEGIN                                                          MSCN 
                                                                         MSCN 
#                       P R O C S                                      # MSCN 
                                                                         MSCN 
          PROC DB$MABT;      # ABORT DBMSTRD RUN                       # MSCN 
          PROC DB$MILN;      # BUMP LINE COUNT FOR PRINTING #            MSCN 
          PROC DB$MRED;      # READ PARAMETER CARDS #                    MSCN 
                                                                         MSCN 
#                       I T E M S                                      # JJJ1230
                                                                         JJJ1230
          ITEM DB$MEOF;      # END OF FILE ON INPUT FILE FLAG          # MSCN 
          ITEM DB$MIRL;      # LENGTH IN CHARACTERS OF INPUT RECORD #    MSCN 
          ITEM DB$NLIN;      # NEW SOURCE RECORD IN PROGRESS           # MSCN 
                                                                         MSCN 
#                       A R R A Y S                                    # JJJ1230
                                                                         JJJ1230
          ARRAY DB$CHLS [79] S(1);  # CONTAINS THE INPUT RECORD, ONE   # JJJ1230
                               # CHARACTER PER WORD WITH THE           # JJJ1230
                               # CORRESPONDING STATUS                  # JJJ1230
            BEGIN                                                        JJJ1230
            ITEM LEXCHAR C(0,0,1) ; # THE CHARACTER                    # JJJ1230
            ITEM  SETSTATUS S:CHARST(0,42,18); # ITS STATUS            # JJJ1230
            END                                                          JJJ1230
                                                                         JJJ1230
          ARRAY DB$MWSA [9] S(1); # WSA FOR PARAMETER CARDS            # MSCN 
            BEGIN                                                        MSCN 
            ITEM CHAR0  C(0,00,1);                                       MSCN 
            ITEM CHAR1  C(0,06,1);                                       MSCN 
            ITEM CHAR2  C(0,12,1);                                       MSCN 
            ITEM CHAR3  C(0,18,1);                                       MSCN 
            ITEM CHAR4  C(0,24,1);                                       MSCN 
            ITEM CHAR5  C(0,30,1);                                       MSCN 
            ITEM CHAR6  C(0,36,1);                                       MSCN 
            ITEM CHAR7  C(0,42,1);                                       MSCN 
            ITEM CHAR8  C(0,48,1);                                       MSCN 
            ITEM CHAR9  C(0,54,1);                                       MSCN 
            ITEM INWORD C(0,0,10);                                       MSCN 
            END                                                          MSCN 
                                                                         MSCN 
          ARRAY LEXICON [0]; #LEXICON ARRAY FROM SYNGEN#                 MSCN 
            BEGIN                                                        MSCN 
            ITEM LEXENTRY U(0,0,60);  #NUMBER OF ENTRIES AND WHERE#      MSCN 
                                      #THEY START IN LEXWORDS#           MSCN 
            END                                                          MSCN 
                                                                         MSCN 
          ARRAY LEXWORDS [0];  #LEXWORD TABLE FROM SYNGEN#               MSCN 
            BEGIN                                                        MSCN 
            ITEM LEXWRD U(0,0,60);  #10 CHARACTERS OF KEYWORD #          MSCN 
            ITEM LEXID  I(0,0,15);  #ID FOR KEYWORD #                    MSCN 
            ITEM P1     I(0,15,15); #P1 ASSOC WITH KEYWORD #             MSCN 
            ITEM P2     I(0,30,15); #P2 ASSOC WITH KEYWORD #             MSCN 
            ITEM LEXSECT I(0,45,15); #SECTION ORDINAL ASSOC WITH KEYWRD# MSCN 
            END                                                          MSCN 
                                                                         MSCN 
          END                                                            MSCN 
                                                                         MSCN 
#                   LOCAL DECLARATIONS                                 # MSCN 
                                                                         MSCN 
#                       I T E M S                                      # MSCN 
                                                                         MSCN 
        ITEM BLNKWRD C(10)="          ";  #USED TO INITIALIZE NEXWRD#    MSCN 
        ITEM I;              #INDEX FOR VARIOUS FOR LOOPS#               MSCN 
        CONTROL EJECT;                                                   MSCN 
                                                                         MSCN 
        PROC DB$MINI;                                                    MSCN 
 #                                                                       MSCN 
  *   DB$MINI - INITIALIZE SCAN ROUTINE          PAGE  1                 MSCN 
  *   J. JAN JANIK                               DATE  10/29/30          MSCN 
  DC  PURPOSE                                                            MSCN 
                                                                         MSCN 
      TO INITIALIZE VARIABLES USED BY SCANNER AND BEGIN READING A SET OF MSCN 
      INPUT CARDS.                                                       MSCN 
                                                                         MSCN 
  DC  ENTRY CONDITIONS                                                   MSCN 
                                                                         MSCN 
      THE INPUT FILE READ BY DB$MRED IS OPENED.                          MSCN 
                                                                         MSCN 
  DC  EXIT CONDITIONS                                                    MSCN 
                                                                         MSCN 
      THE FIRST WORD HAS BEEN IDENTIFIED AND THE NEXT ITEMS REFLECT ITS  MSCN 
      IDENTIFICATION.  DB$MEOF AND STATE = 0.                            MSCN 
                                                                         MSCN 
  DC  CALLING ROUTINES                                                   MSCN 
                                                                         MSCN 
      DB$DDVR - OPERATOR CONSOLE COMMAND DRIVER (CDCS). 
      DB$M10M - STARTING ROUTINE FOR OVERLAY 1,0                         MSCN 
                                                                         MSCN 
  DC  CALLED ROUTINES                                                    MSCN 
                                                                         MSCN 
      MOVENXT - INITIALIZE NEXT ITEMS.                                   MSCN 
      SCANNER - FINITE STATE AUTOMATON WHICH IDENTIFIES NEXT SOURCE WORD MSCN 
                                                                         MSCN 
  DC  DESCRIPTION                                                        MSCN 
                                                                         MSCN 
      INITIALIZE SYNTAX TRACE ITEMS.
      CALL MOVENXT TO ZERO NEXT ITEMS.  SET DB$MEOF TO 0.  SET DB$LEXP   MSCN 
      GREATER THAN DB$MIRL TO FORCE SCANNER TO READ A CARD.  CALL        MSCN 
      SCANNER TO IDENTIFY THE FIRST SOURCE WORD AND STORE ITS            MSCN 
      ATTRIBUTES IN NEXT ITEMS.  RETURN TO CALLER.                       MSCN 
 #                                                                       MSCN 
          BEGIN                                                          MSCN 
                                                                         MSCN 
# INITIALIZE NEXT ITEMS BY CALLING MOVENXT.  CURRENT ITEMS WILL NOT    # MSCN 
# CONTAIN VALID INFORMATION                                            # MSCN 
                                                                         MSCN 
          DB$TFLG = 0;             # PRESET TO NO SYNTAX TRACE         #
          MOVENXT;                                                       MSCN 
                                                                         MSCN 
          DB$MEOF = 0;       # CLEAR END-OF-FILE-FLAG                  # MSCN 
          DB$LEXP = DB$MIRL + 1; # SET SO NEW RECORD WILL BE READ      # MSCN 
          SCANNER;                                                       MSCN 
                                                                         MSCN 
          RETURN;                                                        MSCN 
                                                                         MSCN 
          END                                                            MSCN 
        CONTROL EJECT;                                                   MSCN 
                                                                         MSCN 
        PROC DB$SSCN ;                                                   MSCN 
 #                                                                       MSCN 
  *   DB$SSCN - SKIP TO NEW CARD AND SCAN        PAGE  1                 MSCN 
  *   J. JAN JANIK                               DATE  10/29/30          MSCN 
  DC  PURPOSE                                                            MSCN 
                                                                         MSCN 
      TO SKIP TO A NEW SOURCE RECORD AND IDENTIFY THE FIRST WORD.        MSCN 
                                                                         MSCN 
  DC  ENTRY CONDITIONS                                                   MSCN 
                                                                         MSCN 
      SCANNER HAS BEEN INITIALIZED.                                      MSCN 
                                                                         MSCN 
  DC  EXIT CONDITIONS                                                    MSCN 
                                                                         MSCN 
      A NEW SOURCE RECORD IS IN THE SCANNERS INPUT BUFFER.  THE FIRST    MSCN 
      WORD ON THE NEW RECORD HAS BEEN IDENTIFIED AND ITS ATTRIBUTES      MSCN 
      STORED IN NEXT ITEMS.  DB$NTYP = DFEOTCOD IF AN EOF IS DETECTED.   MSCN 
                                                                         MSCN 
  DC  CALLING ROUTINES                                                   MSCN 
                                                                         MSCN 
      DB$STD - SYNTAX TABLE DRIVER ON DETECTION OF A +SNC                MSCN 
                                                                         MSCN 
  DC  CALLED ROUTINES                                                    MSCN 
                                                                         MSCN 
      BUILDSTACK - GETS NEW SOURCE RECORD                                MSCN 
      DB$SCAN - IDENTIFY NEXT SOURCE WORD                                MSCN 
      MOVENXT - MOVES NEXT ITEMS TO CURRENT ITEMS                        MSCN 
                                                                         MSCN 
  DC  DESCRIPTION                                                        MSCN 
                                                                         MSCN 
      ON ENTRY BUILDSTACK IS CALLED TO GET A NEW SOURCE RECORD.  ON      MSCN 
      RETURN DB$MEOF IS CHECKED TO SEE IF AN EOF HAS BEEN DETECTED.  IF  MSCN 
      SO, MOVENXT IS CALLED TO MOVE NEXT ITEMS TO CURRENT ITEMS AND      MSCN 
      DB$NTYP IS SET TO DFEOTCOD.  IF NOT, DB$SCAN IS CALLED TO IDENTIFY MSCN 
      THE NEXT SOURCE WORD.  A RETURN IS MADE TO THE CALLER.             MSCN 
 #                                                                       MSCN 
                                                                         MSCN 
          BEGIN                                                          MSCN 
          BUILDSTACK;        # GET NEW SOURCE RECORD #                   MSCN 
                                                                         MSCN 
          IF DB$MEOF EQ 0                                                MSCN 
            THEN                                                         MSCN 
            DB$SCAN;         # IDENTIFY NEXT SOURCE WORD.              # MSCN 
                                                                         MSCN 
            ELSE             #EOF DETECTED#                              MSCN 
            BEGIN                                                        MSCN 
            MOVENXT;                                                     MSCN 
            DB$NTYP = DFEOTCOD;                                          MSCN 
            END                                                          MSCN 
                                                                         MSCN 
          RETURN;                                                        MSCN 
                                                                         MSCN 
          END                                                            MSCN 
        CONTROL EJECT;                                                   MSCN 
                                                                         MSCN 
        PROC DB$SCAN;                                                    MSCN 
 #                                                                       MSCN 
  *   DB$SCAN - IDENTIFY NEXT SOURCE WORD        PAGE  1                 MSCN 
  *   J. JAN JANIK                               DATE  10/29/30          MSCN 
  DC  PURPOSE                                                            MSCN 
                                                                         MSCN 
      TO IDENTIFY THE NEXT SOURCE WORD ON THE INPUT STREAM.              MSCN 
                                                                         MSCN 
  DC  ENTRY CONDITIONS                                                   MSCN 
                                                                         MSCN 
      SCANNER HAS BEEN INITIALIZED                                       MSCN 
                                                                         MSCN 
  DC  EXIT CONDITIONS                                                    MSCN 
                                                                         MSCN 
      NEXT WORD ON INPUT STREAM IS IDENTIFIED AND ITS ATTRIBUTES STORED  MSCN 
      IN NEXT ITEMS.                                                     MSCN 
                                                                         MSCN 
  DC  CALLING ROUTINES                                                   MSCN 
                                                                         MSCN 
      DB$SSNC - SKIP TO NEW RECORD AND SCAN                              MSCN 
      DB$STD - SYNTAX TABLE DRIVER                                       MSCN 
                                                                         MSCN 
  DC  CALLED ROUTINES                                                    MSCN 
                                                                         MSCN 
      DB$MILN - BUMP LINE NUMBER FOR OUTPUT LISTING                      MSCN 
      MOVENXT - MOVES NEXT ITEMS TO CURRENT ITEMS.                       MSCN 
      SCANNER - FINITE STATE AUTOMATON WHICH IDENTIFIES NEXT SOURCE WORD MSCN 
                                                                         MSCN 
  DC  DESCRIPTION                                                        MSCN 
                                                                         MSCN 
      ON ENTRY MOVENXT IS CALLED TO MOVE NEXT ITEMS TO CURRENT ITEMS.    MSCN 
      DB$NLIN IS CHECKED AND IF NON-ZERO IS SET TO ZERO AND DB$MILN IS   MSCN 
      CALLED TO BUMP THE LINE NUMBER.  IN EITHER CASE, SCANNER IS CALLED MSCN 
      TO IDENTIFY THE NEXT WORD.  A RETURN IS MADE TO THE CALLER.        MSCN 
 #                                                                       MSCN 
          BEGIN                                                          MSCN 
          MOVENXT;                                                       MSCN 
                                                                         MSCN 
          IF DB$NLIN NQ 0    # WORKING ON NEW CARD                     # MSCN 
            THEN             # YES #                                     MSCN 
            BEGIN                                                        MSCN 
            DB$NLIN = 0;                                                 MSCN 
            DB$MILN;         # BUMP LINE NUMBER #                        MSCN 
                                                                         MSCN 
            END                                                          MSCN 
          SCANNER;           #IDENTIFY NEXT SOURCE WORD#                 MSCN 
                                                                         MSCN 
          RETURN;                                                        MSCN 
                                                                         MSCN 
          END                                                            MSCN 
        CONTROL EJECT;                                                   MSCN 
                                                                         MSCN 
        PROC BUILDSTACK;                                                 MSCN 
 #                                                                       MSCN 
  *   BUILDSTACK - GET A NEW RECORD AND BUILD    PAGE  1                 MSCN 
  *                CHARACTER AND STATUS STACKS                           MSCN 
  *   J. JAN JANIK                               DATE  10/31/75          MSCN 
  DC  PURPOSE                                                            MSCN 
                                                                         MSCN 
      TO READ A NEW RECORD AND BUILD LEXCHAR AND SETSTATUS STACKS.       MSCN 
                                                                         MSCN 
  DC  ENTRY CONDITIONS                                                   MSCN 
                                                                         MSCN 
      INPUT FILE OPENED                                                  MSCN 
                                                                         MSCN 
  DC  EXIT CONDITIONS                                                    MSCN 
                                                                         MSCN 
      DB$MIRL = CHAR COUNT OF CARD - 1 OR 71 WHICHEVER IS SMALLER.       MSCN 
      DB$MWSA = CARD IMAGE.                                              MSCN 
      DB$CHLS CONTAINS ONE CHAR AND ITS STATUS FROM CHARST PER WORD.     MSCN 
      DB$LEXP = 0 (CHAR POINTER)                                         MSCN 
      IF EOF DETECTED, DB$CHLS, DB$MIRL, AND DB$LEXP ARE NOT MODIFIED.   MSCN 
                                                                         MSCN 
  DC  CALLING ROUTINES                                                   MSCN 
                                                                         MSCN 
      DB$SSCN - TO SKIP A RECORD AND IDENTIFY FIRST WORD                 MSCN 
      SCANNER - IDENTIFY NEXT WORD                                       MSCN 
                                                                         MSCN 
  DC  CALLED ROUTINES                                                    MSCN 
                                                                         MSCN 
      DB$MRED - READ A RECORD AND PRINT OLD ONE.                         MSCN 
 #                                                                       MSCN 
          BEGIN                                                          MSCN 
          DEF DFNUMCOL #72#;  # NUMBER OF COLUMNS USED ON INPUT RECORD # MSCN 
                                                                         MSCN 
          ITEM J;            #INDEX FOR FOR LOOP #                       MSCN 
                                                                         MSCN 
      CONTROL EJECT;
  
  
#     THE FOLLOWING SWITCH DEFINES THE ROLE EACH CHARACTER PLAYS IN THE#
#     TRANSITIONS DESCRIBED IN THE STATE TABLE. DIFFERENT SYNTAX FORMS #
#     MAY REQUIRE DIFFERENT SWITCH DEFINITIONS. THE VALUE OF           #
#     *DSCANNERTYP* IS SET BY THE CALLER OF THIS COMDECK TO IDENTIFY   #
#     WHICH VERSION OF THE SWITCH IS TO BE USED.                       #
  
  
CONTROL IFEQ DFSCANNERTYP,0;       # IF MD/DBU VERSION OF SCANNER      #
  
          SWITCH CHARSWITCH                                              MSCN 
                         SPECHAR,   # : #                                MSCN 
                         LETTER,    # A #                                MSCN 
                         LETTER,    # B #                                MSCN 
                         LETTER,    # C #                                MSCN 
                         LETTER,    # D #                                MSCN 
                         LETTER,    # E #                                MSCN 
                         LETTER,    # F #                                MSCN 
                         LETTER,    # G #                                MSCN 
                         LETTER,    # H #                                MSCN 
                         LETTER,    # I #                                MSCN 
                         LETTER,    # J #                                MSCN 
                         LETTER,    # K #                                MSCN 
                         LETTER,    # L #                                MSCN 
                         LETTER,    # M #                                MSCN 
                         LETTER,    # N #                                MSCN 
                         LETTER,    # O #                                MSCN 
                         LETTER,    # P #                                MSCN 
                         LETTER,    # Q #                                MSCN 
                         LETTER,    # R #                                MSCN 
                         LETTER,    # S #                                MSCN 
                         LETTER,    # T #                                MSCN 
                         LETTER,    # U #                                MSCN 
                         LETTER,    # V #                                MSCN 
                         LETTER,    # W #                                MSCN 
                         LETTER,    # X #                                MSCN 
                         LETTER,    # Y #                                MSCN 
                         LETTER,    # Z #                                MSCN 
                         DIGIT,     # 0 #                                MSCN 
                         DIGIT,     # 1 #                                MSCN 
                         DIGIT,     # 2 #                                MSCN 
                         DIGIT,     # 3 #                                MSCN 
                         DIGIT,     # 4 #                                MSCN 
                         DIGIT,     # 5 #                                MSCN 
                         DIGIT,     # 6 #                                MSCN 
                         DIGIT,     # 7 #                                MSCN 
                         DIGIT,     # 8 #                                MSCN 
                         DIGIT,     # 9 #                                MSCN 
                         SPECHAR,   # + #                                MSCN 
                         MINUS,     # - #                                MSCN 
                         SPECHAR,   # * #                                MSCN 
                         SPECHAR,   # / #                                MSCN 
                         SPECHAR,   # ( #                                MSCN 
                         SPECHAR,   # ) #                                MSCN 
                         SPECHAR,   # $ #                                MSCN 
                         TRACIND,   # = #                                MSCN 
                         DELMITR,   # BLANK #                            MSCN 
                         DELMITR,   # , #                                MSCN 
                         ENDCLSE,   # . #                                MSCN 
                         SPECHAR,   # EQUIV #                            MSCN 
                         SPECHAR,   # [ #                                MSCN 
                         SPECHAR,   # ] #                                MSCN 
                         SPECHAR,   # % #                                MSCN 
                         QUTE,      # QUOTE #                            MSCN 
                         SPECHAR,   # _ #                                MSCN 
                         SPECHAR,   # ! #                                MSCN 
                         SPECHAR,   # & #                                MSCN 
                         SPECHAR,   # ' #                                MSCN 
                         SPECHAR,   # ? #                                MSCN 
                         SPECHAR,   # < #                                MSCN 
                         SPECHAR,   # > #                                MSCN 
                         SPECHAR,   # @ #                                MSCN 
                         SPECHAR,   # \ #                                MSCN 
                         SPECHAR,   # ^ #                                MSCN 
                         DELMITR;   # SEMICOLON #                        MSCN 
  
CONTROL ENDIF;
  
  
CONTROL IFEQ DFSCANNERTYP,1;       # IF CDCS OPERATOR COMMAND VERSION  #
  
          SWITCH CHARSWITCH                                              MSCN 
                         SPECHAR,   # : #                                MSCN 
                         LETTER,    # A #                                MSCN 
                         LETTER,    # B #                                MSCN 
                         LETTER,    # C #                                MSCN 
                         LETTER,    # D #                                MSCN 
                         LETTER,    # E #                                MSCN 
                         LETTER,    # F #                                MSCN 
                         LETTER,    # G #                                MSCN 
                         LETTER,    # H #                                MSCN 
                         LETTER,    # I #                                MSCN 
                         LETTER,    # J #                                MSCN 
                         LETTER,    # K #                                MSCN 
                         LETTER,    # L #                                MSCN 
                         LETTER,    # M #                                MSCN 
                         LETTER,    # N #                                MSCN 
                         LETTER,    # O #                                MSCN 
                         LETTER,    # P #                                MSCN 
                         LETTER,    # Q #                                MSCN 
                         LETTER,    # R #                                MSCN 
                         LETTER,    # S #                                MSCN 
                         LETTER,    # T #                                MSCN 
                         LETTER,    # U #                                MSCN 
                         LETTER,    # V #                                MSCN 
                         LETTER,    # W #                                MSCN 
                         LETTER,    # X #                                MSCN 
                         LETTER,    # Y #                                MSCN 
                         LETTER,    # Z #                                MSCN 
                         DIGIT,     # 0 #                                MSCN 
                         DIGIT,     # 1 #                                MSCN 
                         DIGIT,     # 2 #                                MSCN 
                         DIGIT,     # 3 #                                MSCN 
                         DIGIT,     # 4 #                                MSCN 
                         DIGIT,     # 5 #                                MSCN 
                         DIGIT,     # 6 #                                MSCN 
                         DIGIT,     # 7 #                                MSCN 
                         DIGIT,     # 8 #                                MSCN 
                         DIGIT,     # 9 #                                MSCN 
                         SPECHAR,   # + #                                MSCN 
                         MINUS,     # - #                                MSCN 
                         SPECHAR,   # * #                                MSCN 
                         SPECHAR,   # / #                                MSCN 
                         SPECHAR,   # ( #                                MSCN 
                         SPECHAR,   # ) #                                MSCN 
                         SPECHAR,   # $ #                                MSCN 
                         SPECHAR,   # = # 
                         DELMITR,   # BLANK #                            MSCN 
                         DELMITR,   # , #                                MSCN 
                         ENDCLSE,   # . #                                MSCN 
                         SPECHAR,   # EQUIV #                            MSCN 
                         SPECHAR,   # [ #                                MSCN 
                         SPECHAR,   # ] #                                MSCN 
                         SPECHAR,   # % #                                MSCN 
                         QUTE,      # QUOTE #                            MSCN 
                         SPECHAR,   # _ #                                MSCN 
                         SPECHAR,   # ! #                                MSCN 
                         SPECHAR,   # & #                                MSCN 
                         SPECHAR,   # ' #                                MSCN 
                         SPECHAR,   # ? #                                MSCN 
                         SPECHAR,   # < #                                MSCN 
                         SPECHAR,   # > #                                MSCN 
                         SPECHAR,   # @ #                                MSCN 
                         SPECHAR,   # \ #                                MSCN 
                         SPECHAR,   # ^ #                                MSCN 
                         DELMITR;   # SEMICOLON #                        MSCN 
  
CONTROL ENDIF;
      CONTROL EJECT;                                                     MSCN 
                                                                         MSCN 
# START OF EXECUTABLE CODE FOR BUILDSTACK                              # MSCN 
                                                                         MSCN 
          DB$MRED;           #READ A CARD #                              MSCN 
                                                                         MSCN 
          IF DB$MEOF NQ 0 THEN RETURN;                                   MSCN 
                                                                         MSCN 
          DB$NLIN = 1;       # SET FLAG FOR NEW LINE                   # MSCN 
                                                                         MSCN 
# ADJUST DB$MIRL TO NUM OF COL - 1 OF A MAX OF DFNUMCOL - 1            # MSCN 
          IF DB$MIRL GR DFNUMCOL                                         MSCN 
            THEN DB$MIRL = DFNUMCOL - 1;                                 MSCN 
                                                                         MSCN 
            ELSE DB$MIRL = DB$MIRL -1;                                   MSCN 
                                                                         MSCN 
          FOR I = 0 STEP 1 UNTIL 7 DO                                    MSCN 
            BEGIN                                                        MSCN 
            J = I * 10;                                                  MSCN 
            LEXCHAR [J]   = CHAR0 [I];                                   MSCN 
            LEXCHAR [J+1] = CHAR1 [I];                                   MSCN 
            LEXCHAR [J+2] = CHAR2 [I];                                   MSCN 
            LEXCHAR [J+3] = CHAR3 [I];                                   MSCN 
            LEXCHAR [J+4] = CHAR4 [I];                                   MSCN 
            LEXCHAR [J+5] = CHAR5 [I];                                   MSCN 
            LEXCHAR [J+6] = CHAR6 [I];                                   MSCN 
            LEXCHAR [J+7] = CHAR7 [I];                                   MSCN 
            LEXCHAR [J+8] = CHAR8 [I];                                   MSCN 
            LEXCHAR [J+9] = CHAR9 [I];                                   MSCN 
            END                                                          MSCN 
                                                                         MSCN 
          FOR DB$LEXP = 0 STEP 1 UNTIL DB$MIRL DO                        MSCN 
            BEGIN                                                        MSCN 
                                                                         MSCN 
# JUMP TO ROUTINE WHICH SETS SETSTATUS TO PROPER VALUE FOR THE CHAR    # MSCN 
            GOTO CHARSWITCH [LEXCHAR [DB$LEXP]];                         MSCN 
                                                                         MSCN 
LETTER:                                                                  MSCN 
            SETSTATUS [DB$LEXP] = S"LTR";                                MSCN 
            TEST;                                                        MSCN 
                                                                         MSCN 
DIGIT:                                                                   MSCN 
            SETSTATUS [DB$LEXP] = S"DGT";                                MSCN 
            TEST;                                                        MSCN 
                                                                         MSCN 
MINUS:                                                                   MSCN 
            SETSTATUS [DB$LEXP] = S"MNUS";                               MSCN 
            TEST;                                                        MSCN 
                                                                         MSCN 
SPECHAR:                                                                 MSCN 
            SETSTATUS [DB$LEXP] = S"SC";                                 MSCN 
            TEST;                                                        MSCN 
                                                                         MSCN 
QUTE:                                                                    MSCN 
            SETSTATUS [DB$LEXP] = S"QUOTE";                              MSCN 
            TEST;                                                        MSCN 
                                                                         MSCN 
ENDCLSE:                                                                 MSCN 
            SETSTATUS [DB$LEXP] = S"PERIOD";                             MSCN 
            TEST;                                                        MSCN 
                                                                         MSCN 
TRACIND:                                                                 MSCN 
            SETSTATUS [DB$LEXP] = S"TRCE";                               MSCN 
            TEST;                                                        MSCN 
                                                                         MSCN 
DELMITR:                                                                 MSCN 
            SETSTATUS [DB$LEXP] = S"DELM";                               MSCN 
            END                                                          MSCN 
      IF DB$MIRL LS 71 THEN 
        BEGIN 
            SETSTATUS[DB$MIRL+1] = S"DELM"; 
        DB$MIRL = DB$MIRL + 1;
        END 
                                                                         MSCN 
          DB$LEXP = 0;       # POINT TO FIRST CHAR IN STACK            # MSCN 
          RETURN;                                                        MSCN 
                                                                         MSCN 
          END                                                            MSCN 
        CONTROL EJECT;                                                   MSCN 
                                                                         MSCN 
        PROC MOVENXT;                                                    MSCN 
 #                                                                       MSCN 
  *   MOVENXT - MOVE NEXT ITEMS TO CURRENT ITEMS PAGE  1                 MSCN 
  *             AND CLEAR NEXT ITEMS                                     MSCN 
  *   J. JAN JANIK                               DATE  10/31/75          MSCN 
  DC  PURPOSE                                                            MSCN 
                                                                         MSCN 
      TO MOVE ITEMS DESCRIBING THE NEXT SOURCE WORD TO ITEMS DESCRIBING  MSCN 
      CURRENT SOURCE WORD AND INITIALIZE NEXT ITEMS.                     MSCN 
                                                                         MSCN 
  DC  ENTRY CONDITIONS                                                   MSCN 
                                                                         MSCN 
      NEXT ITEMS DESCRIBE WORD ALREADY SCANNED.                          MSCN 
                                                                         MSCN 
  DC  EXIT CONDITIONS                                                    MSCN 
                                                                         MSCN 
      CURRENT ITEMS = NEXT ITEMS ON ENTRY FOR ALL PAIRS                  MSCN 
      NEXT ITEMS = 0 OR BLANK                                            MSCN 
                                                                         MSCN 
  DC  CALLING ROUTINES                                                   MSCN 
                                                                         MSCN 
      DB$SSCN - SKIP TO NEXT RECORD AND IDENTIFY WORD.                   MSCN 
      DB$SCAN - IDENTIFY NEXT SOURCE RECORD.                             MSCN 
 #                                                                       MSCN 
          BEGIN                                                          MSCN 
                                                                         MSCN 
# MOVE ALL NEXT ITEMS TO CURRENT ITEMS                                 # MSCN 
          DB$CLNG = DB$NLNG;                                             MSCN 
          DB$CLNW = DB$NLNW;                                             MSCN 
          DB$CXID = DB$NXID;                                             MSCN 
          DB$CP1  = DB$NP1 ;                                             MSCN 
          DB$CP2  = DB$NP2 ;                                             MSCN 
          DB$CTYP = DB$NTYP;                                             MSCN 
          DB$CCOL = DB$NCOL;                                             MSCN 
          DB$CSYN = DB$NSYN;                                             MSCN 
                                                                         MSCN 
# MOVE NEXT WORD ARRAY TO CURRENT AND CLEAR NEXT                       # MSCN 
          FOR I = 0 STEP 1 UNTIL 7 DO                                    MSCN 
            BEGIN                                                        MSCN 
            CURWORD [I] = NEXWRD [I];                                    MSCN 
            NEXWRD [I]  = BLNKWRD;                                       MSCN 
            END                                                          MSCN 
                                                                         MSCN 
# INITIALIZE NEXT ITEMS                                                # MSCN 
          DB$NLNG = 0;                                                   MSCN 
          DB$NLNW = 0;                                                   MSCN 
          DB$NXID = 0;                                                   MSCN 
          DB$NP1  = 0;                                                   MSCN 
          DB$NP2  = 0;                                                   MSCN 
          DB$NTYP = 0;                                                   MSCN 
          DB$NCOL = 0;                                                   MSCN 
          DB$NSYN = 0;                                                   MSCN 
          RETURN;                                                        MSCN 
                                                                         MSCN 
          END                                                            MSCN 
        CONTROL EJECT;                                                   MSCN 
                                                                         MSCN 
        PROC SCANNER;                                                    MSCN 
 #                                                                       MSCN 
  *   SCANNER - FINITE STATE AUTOMATON WHICH     PAGE  1                 MSCN 
  *             SCANS AND IDENTIFIES WORDS                               MSCN 
  *   J. JAN JANIK                               DATE  10/30/75          MSCN 
  DC  PURPOSE                                                            MSCN 
                                                                         MSCN 
      TO PERFORM A LEXICAL SCAN OF SOURCE STREAM AND IDENTIFY THE NEXT   MSCN 
      ELEMENT.                                                           MSCN 
                                                                         MSCN 
  DC  ENTRY CONDITIONS                                                   MSCN 
                                                                         MSCN 
      DB$CHLS = ARRAY WHICH CONTAINS CHARACTERS FROM THE SOURCE RECORD   MSCN 
                AND THEIR STATUS VALUES                                  MSCN 
      DB$LEXP = FIRST CHARACTER OF DB$CHLS TO BE EXAMINED                MSCN 
      DB$MIRL = LAST CHARACTER OF CURRENT RECORD IN DB$CHLS              MSCN 
      NEXT ITEMS ARE 0 (BLANK FOR NEXWRD)                                MSCN 
                                                                         MSCN 
  DC  EXIT CONDITIONS                                                    MSCN 
                                                                         MSCN 
      NEXT ITEMS REFLECT THE SOURCE WORD IDENTIFIED.  DB$LEXP POINTS TO  MSCN 
      NEXT CHARACTER TO BE EXAMINED.                                     MSCN 
                                                                         MSCN 
  DC  CALLING ROUTINES                                                   MSCN 
                                                                         MSCN 
      DB$MINI - INITIALIZE SCAN ROUTINE.                                 MSCN 
      DB$SCAN - GET NEXT SOURCE WORD                                     MSCN 
                                                                         MSCN 
  DC  CALLED ROUTINES                                                    MSCN 
                                                                         MSCN 
      BUILDSTACK - GET NEXT SOURCE RECORD                                MSCN 
      DB$MABT - ABORT DBMSTRD RUN                                        MSCN 
                                                                         MSCN 
  DC  DESCRIPTION                                                        MSCN 
                                                                         MSCN 
      SCANNER CONSISTS OF THE STATE TABLE STATETBLE, THE JUMP VECTOR     MSCN 
      SWITCH JMPVECTOR, THE PROCESSING ROUTINES JUMPED TO BY JMPVECTOR,  MSCN 
      AND A SHORT SECTION OF CODE, FROM CONTSCAN THRU STATEJMP WHICH     MSCN 
      GETS A NEW RECORD IF NECESSARY AND JUMPS TO THE PROPER ROUTINE.    MSCN 
                                                                         MSCN 
      SCANNER HAS A STRUCTURE BUT IT IS NOT A STRUCTURED PROGRAM.  SINCE MSCN 
      LEXICAL SCANNING USUALLY TAKES THE GREATEST AMOUNT OF TIME IN A    MSCN 
      COMPILATION, SCANNER WAS WRITTEN TO BE AS FAST AS POSIBLE.  ANY    MSCN 
      MAINTAINER SHOULD BE AWARE THAT THE PROCESSING ROUTINES INTERACT   MSCN 
      AND ADDITIONS AND CHANGES SHOULD BE MADE WITH CARE.                MSCN 
                                                                         MSCN 
      CONTSCAN IS USED AS A CONTINUATION POINT FOR ALL PROCESSING        MSCN 
      ROUTINES WHICH HAVE NOT FULLY IDENTIFIED A SOURCE WORD.  CONTSCAN  MSCN 
      THRU STATEJMP GETS A NEW RECORD IF NEEDED AND IF EOF WAS DETECTED, MSCN 
      SETS DB$NTYP TO DFEOTCOD AND RETURNS TO THE CALLER.                MSCN 
                                                                         MSCN 
      STATEJMP JUMPS TO THE PROPER PROCESSING ROUTINE.  THE ROUTINE IS   MSCN 
      DETERMINED AS FOLLOWS.  STATE IS A VARIABLE WHICH POINTS TO WHICH  MSCN 
      CHARACTER IN A WORD OF STATETBLE IS TO BE USED.  IT TAKES ON THE   MSCN 
      VALUES 0,6,12,18,...,48,54.  THE WORD TO BE USED IS DETERMINED BY  MSCN 
      THE VALUE IN SETSTATUS WHICH CORRESPONDS TO THE CHARACTER BEING    MSCN 
      EXAMINED.  SETSTATUS IS SET UP IN ROUTINE BUILDSTACK.  THE         MSCN 
      CHARACTER EXTRACTED FROM STATETBLE IS USED AS THE SWITCH VALUE FOR MSCN 
      JMPVECTOR.                                                         MSCN 
                                                                         MSCN 
      THE ROUTINES AND A BRIEF DESCRIPTION FOLLOWS.                      MSCN 
        DELMSKIP - SKIPS DELIMETER CHARACTERS UNTIL NON-DELIMETER FOUND, MSCN 
                   THEN JUMPS TO STATEJMP.  BUILDSTACK IS CALLED IF      MSCN 
                   NECESSARY TO GET A NEW RECORD.                        MSCN 
        ENDCLAUSE- SETS STATE TO 6 AND GOES TO STORCHAR.                 MSCN 
        LIT      - SETS STATE TO 12 AND GOES TO NEXTCHAR (DOESNT STORE). MSCN 
        GARBAGE  - SETS STATE TO 18 AND GOES TO STORCHAR.                MSCN 
        KEYORDATA- SETS STATE TO 24 AND GOES TO STORCHAR.                MSCN 
        INTEGER  - SETS STATE TO 36 AND GOES TO STORCHAR.                MSCN 
        LITERALOUT-IF NEXT CHAR IS A QUOTE, BUMPS DB$LEXP AND GOES       MSCN 
                   TO STORCHAR. IF NOT SETS DB$NTYP TO DFLITCOD AND GOES MSCN 
                   TO SCANEXIT.                                          MSCN 
        HYPHEN   - SETS STATE TO 30 AND GOES TO STORCHAR.                MSCN 
                   TO SCANEXIT1.                                         MSCN 
        INTSTOR  - BUMPS DB$LEXP, SETS DB$NTYP TO DFINTCOD AND GOES      MSCN 
                   TO SCANEXIT1.                                         MSCN 
        INTSTOR1 - SAME AS INTSTOR BUT DOES NOT BUMP DB$LEXP.            MSCN 
        STORCHAR - STORES CHARACTER IN NEXWRD AND GOES TO NEXTCHAR.  IF  MSCN 
                   NEXWRD GETS FILLED (80 CHAR), CHARACTERS ARE SKIPPED  MSCN 
                   UNTIL A PERIOD IS FOUND OR THE WHOLE RECORD IS        MSCN 
                   SKIPPED.                                              MSCN 
        SCANKEY  - BUMPS DB$LEXP AND CHECKS WORD IN NEXWRD AGAINST       MSCN 
                   LEXICON, AN ARRAY CONTAINING KEY WORDS.  IF IT FINDS  MSCN 
                   A WORD, DB$NTYP IS SET TO DFKEYCOD AND DB$NXID,       MSCN 
                   DB$NSYN, DB$NP1, AND DB$NP2 ARE SET TO THE VALUES     MSCN 
                   DEFINED FOR THE KEYWORD.  IF NOT, DB$NTYP IS SET TO   MSCN 
                   DFNAMCOD.  CONTROL IS TRANSFERED TO SCANEXIT1.        MSCN 
        SCANKEY1 - SAME AS SCANKEY BUT DOES NOT BUMP DB$LEXP             MSCN 
        SCANEXIT - BUMPS DB$LEXP, SETS DB$NLNW AND DB$NCOL PROPERLY      MSCN 
                   AND RETURNS TO THE CALLER OF SCANNER.                 MSCN 
        SCANEXIT1- SAME AS SCANEXIT BUT DOES NOT BUMP DB$LEXP            MSCN 
        TRACSWT  - BUMPS DB$TFLG BY 1 AND GOES TO NEXTCHAR.              MSCN 
                                                                         MSCN 
      NEXTCHAR MERELY BUMPS DB$LEXP AND JUMPS TO CONTSCAN.               MSCN 
 #                                                                       MSCN 
          BEGIN                                                          MSCN 
                                                                         MSCN 
#                       I T E M S                                      # MSCN 
                                                                         MSCN 
        ITEM BITPOS;         # BIT POSITION IN NEXWORD                 # MSCN 
        ITEM BLNKREC;        # A FLAG THAT INDICATES A BLANK RECORD HAS#
                             # BEEN PROCESSED. IF ZERO THEN BLANK REC. #
        ITEM DATAFLG B;      #FLAG FOR DATANAME (T) OR KEYWORD (F)#      MSCN 
        ITEM ENTRIES;        # NUMBER OF ENTRIES IN LEXWORDS WITH SAME # MSCN 
                             # FIRST CHARACTER #                         MSCN 
        ITEM LEXBYTE;        # INDEX TO LEXICON                        # MSCN 
        ITEM LPTR;           # POINTER TO BE USED WITH LEXICON         # MSCN 
        ITEM STATE;          # INDEX INTO THE STATE TRANSITION TABLE   # MSCN 
        ITEM WRDPTR;         #POINTER TO START OF SCAN IN LEXWORDS #     MSCN 
      CONTROL EJECT;
                                                                         MSCN 
#                       A R R A Y S                                    # MSCN 
                                                                         MSCN 
  
  
#     THE FOLLOWING ARRAY DEFINES THE ACTIONS TAKEN (SEE JMPVECTOR)    #
#     FOR EACH KIND OF CHARACTER ROLE (SEE CHARSWITCH) ENCOUNTERED IN  #
#     THE CHARACTER BY CHARACTER ANALYSIS OF THE NEW *NEXT* TOKEN.     #
#     DIFFERENT SYNTAX FORMS MAY REQUIRE DIFFERENT ACTIONS. THE VALUE  #
#     OF *DFSCANNERTYP* IS SET BY THE CALLER OF THIS COMDECK TO        #
#     IDENTIFY WHICH VERSION OF THIS ARRAY IS TO BE USED.              #
  
  
CONTROL IFEQ DFSCANNERTYP,0;       # IF MD/DBU VERSION OF SCANNER      #
  
        ARRAY STATETRANS [7];  # STATE TRANSITION TABLE (SEE JMPVECTOR)# MSCN 
          BEGIN                                                          MSCN 
          ITEM STATETBLE U(0,0,60) =   ["AKGIKINQQQ",  #DELM#            MSCN 
                                        "BDGJLJOQQQ",  #PERIOD#          MSCN 
                                        "CDHGDDDQQQ",  #QUOTE#           MSCN 
                                        "DDGGMDMQQQ",  #MNUS#            MSCN 
                                        "EDGGGEEQQQ",  #LTR#             MSCN 
                                        "FDGGGEGQQQ",  #DGT#             MSCN 
                                        "DDGGDDDQQQ",  #SC#              MSCN 
                                        "PDGGDDDQQQ"]; #TRCE#            MSCN 
          END                                                            MSCN 
  
CONTROL ENDIF;
  
  
CONTROL IFEQ DFSCANNERTYP,1;       # IF CDCS OPERATOR COMMAND VERSION  #
  
        ARRAY STATETRANS [7];  # STATE TRANSITION TABLE (SEE JMPVECTOR)# MSCN 
          BEGIN                                                          MSCN 
          ITEM STATETBLE U(0,0,60) =   ["ALQQLJOQQQ",  #DELM# 
                                        "BLQQLJOQQQ",  #PERIOD# 
                                        "QLQQQQQQQQ",  #QUOTE#
                                        "BLQQMIMQQQ",  #MNUS# 
                                        "ELQQGEEQQQ",  #LTR#
                                        "FLQQGEGQQQ",  #DGT#
                                        "BLQQLJLQQQ",  #SC# 
                                        "PPPPPPPQQQ"]; #TRCE# 
          END                                                            MSCN 
  
CONTROL ENDIF;
      CONTROL EJECT;
# SWITCH USED TO JUMP TO PROPER PROCESSING ROUTINE                     # MSCN 
        SWITCH JMPVECTOR ERR,         #NEVER HAPPEN #                    MSCN 
                         DELMSKIP,    #A#                                MSCN 
                         ENDCLAUSE,   #B#                                MSCN 
                         LIT,         #C#                                MSCN 
                         GARBAGE,     #D#                                MSCN 
                         KEYORDATA,   #E#                                MSCN 
                         INTEGER,     #F#                                MSCN 
                         STORCHAR,    #G#                                MSCN 
                         LITERALOUT,  #H#                                MSCN 
                         SCANEXIT,    #I - GARBAGE #                     MSCN 
                         SCANEXIT1,   #J - GARBAGE #                     MSCN 
                         SCANKEY,     #K#                                MSCN 
                         SCANKEY1,    #L#                                MSCN 
                         HYPHEN,      #M#                                MSCN 
                         INTSTOR,     #N#                                MSCN 
                         INTSTOR1,    #O#                                MSCN 
                         TRACSWT,     #P#                                MSCN 
                         ERR;         #Q - NEVER HAPPEN#                 MSCN 
      CONTROL EJECT;                                                     MSCN 
                                                                         MSCN 
# START OF EXECUTABLE CODE FOR SCANNER                                 # MSCN 
                                                                         MSCN 
          STATE = 0;         #SET STATE TO INITIAL VALUE#                MSCN 
          BITPOS = -6;       #INITIALIZE BIT POSITION #                  MSCN 
                                                                         MSCN 
CONTSCAN:                    #USED AS CONTINUATION POINT FOR SCAN#       MSCN 
          IF DB$LEXP GR DB$MIRL                                          MSCN 
            THEN             # WE NEED A NEW RECORD                    # MSCN 
            BEGIN                                                        MSCN 
            BUILDSTACK;      #GET NEW SOURCE RECORD #                    MSCN 
                                                                         MSCN 
            IF DB$MEOF NQ 0                                              MSCN 
              THEN           # END-OF-FILE ON INPUT                    # MSCN 
              BEGIN                                                      MSCN 
              DB$NTYP = DFEOTCOD;                                        MSCN 
              RETURN;        #RETURN WITH EOF STATUS #                   MSCN 
                                                                         MSCN 
              END                                                        MSCN 
                                                                         MSCN 
            END                                                          MSCN 
                                                                         MSCN 
# JUMP TO PROCESSING ROUTINE DEPENDING ON STATE AND STATUS. #            MSCN 
# ALL PROCESSING ROUTINES EITHER CONTINUE BY JUMPING TO CONTSCAN OR    # MSCN 
# RETURN TO THE CALLER OF SCANNER AFTER IDENTIFYING THE SOURCE WORD.   # MSCN 
                                                                         MSCN 
STATEJMP:                                                                MSCN 
          GOTO JMPVECTOR [B<STATE,6> STATETBLE [SETSTATUS [DB$LEXP]]];   MSCN 
                                                                         MSCN 
DELMSKIP:                    # SKIP TO NEXT NON-DELIMITER #              MSCN 
          BLNKREC = DB$LEXP;
          FOR DB$LEXP = DB$LEXP + 1 STEP 1 UNTIL DB$MIRL DO              MSCN 
            BEGIN                                                        MSCN 
            IF SETSTATUS [DB$LEXP] NQ S"DELM" THEN GOTO STATEJMP;        MSCN 
                                                                         MSCN 
            END                                                          MSCN 
          IF BLNKREC LS 1 THEN
            DB$MILN;  # BUMP LINE NUMBER.                              #
# DONE WITH THIS RECORD AND STILL NO NON-DELIM.  READ ANOTHER.         # MSCN 
          BUILDSTACK;                                                    MSCN 
                                                                         MSCN 
          IF DB$MEOF NQ 0                                                MSCN 
            THEN             # EOF DETECTED ON INPUT                   # MSCN 
            BEGIN                                                        MSCN 
            DB$NTYP = DFEOTCOD;                                          MSCN 
            RETURN;          #RETURN WITH EOF STATUS#                    MSCN 
                                                                         MSCN 
            END                                                          MSCN 
                                                                         MSCN 
          DB$LEXP = DB$LEXP - 1;  # DECREMENT SINCE DELMSKIP FOR LOOP  # MSCN 
                                  # BUMPS IT AND WE WANT FIRST CHAR    # MSCN 
          GOTO DELMSKIP;     # CONTINUE SKIPPING DELIMETERS #            MSCN 
                                                                         MSCN 
ENDCLAUSE:                   #GOT A PERIOD AS THE FIRST CHAR.#           MSCN 
          STATE = 6;         #NEXT CHAR MUST BE DELIMITER OR GARBAGE#    MSCN 
          GOTO  STORCHAR;                                                MSCN 
                                                                         MSCN 
LIT:                         #GOT A QUOTE AS FIRST CHAR.#                MSCN 
          STATE = 12;        #WORKING ON NONNUMERIC LITERAL #            MSCN 
          GOTO  NEXTCHAR;                                                MSCN 
                                                                         MSCN 
GARBAGE:                                                                 MSCN 
          STATE = 18;        #ITS GARBAGE. GO TO DELIMITER OR PERIOD#    MSCN 
          GOTO STORCHAR;                                                 MSCN 
                                                                         MSCN 
KEYORDATA:                   #LETTER AS FIRST CHAR#                      MSCN 
          STATE = 24;        #ITS A KEYWORD OR DATA NAME SO FAR#         MSCN 
          GOTO  STORCHAR;                                                MSCN 
                                                                         MSCN 
INTEGER:                     # DIGIT IS FIRST                          # MSCN 
          STATE = 36;        #ITS AN INTEGER SO FAR#                     MSCN 
          GOTO STORCHAR;                                                 MSCN 
                                                                         MSCN 
LITERALOUT:                  # GOT A QUOTE WHILE WORKING ON LIT        # MSCN 
          IF SETSTATUS [DB$LEXP + 1] EQ S"QUOTE"                         MSCN 
            THEN                                                         MSCN 
            BEGIN                 # CHARACTER FOLLOWING QUOTE IS A #     MSCN 
            DB$LEXP = DB$LEXP + 1;  # QUOTE SO STORE A QUOTE           # MSCN 
            GOTO  STORCHAR;                                              MSCN 
                                                                         MSCN 
            END                                                          MSCN 
                                                                         MSCN 
          DB$NTYP = DFLITCOD; # SYNTACTIC TYPE FOR LITERAL             # MSCN 
          GOTO SCANEXIT;                                                 MSCN 
                                                                         MSCN 
SCANKEY:                     # BUMP POINTER TO REMOVE DELIMITER #        MSCN 
          DB$LEXP = DB$LEXP + 1;                                         MSCN 
                                                                         MSCN 
SCANKEY1:                    # PERIOD IS RETAINED FOR NEXT SCAN #        MSCN 
          IF DB$NLNW GR 2 
            THEN GOTO SCANEXIT1;  #GREATER THAN 30 CHAR NAME IS GARBAGE# MSCN 
                                                                         MSCN 
            ELSE             #LENGTH IN WORDS IS 3 OR LESS, SO IT #      MSCN 
                             #COULD BE A KEYWORD #                       MSCN 
            BEGIN            #START OF SCAN#                             MSCN 
            DATAFLG = TRUE;  #SET FALSE WHEN A KEYWORD IS DETECTED #     MSCN 
            LPTR = B<0,6> NEXWRD [0];  #USE 1ST CHAR OF NAME AS INDEX#   MSCN 
                                       #INTO LEXICON UNLESS NOT ALPHA#   MSCN 
                                                                         MSCN 
            IF LPTR GR O"32" THEN LPTR = 0;  #NON-ALPHA SO USE 0 #       MSCN 
                                                                         MSCN 
            LEXBYTE = DB$NLNW * 18;  #0 FOR 1 TO 10 CHAR, 18 FOR 11    # MSCN 
                                     #TO 20 CHAR AND 36 FOR 21 TO 30#    MSCN 
                                     #CHAR KEYWORDS#                     MSCN 
                                                                         MSCN 
# ENTRIES IS THE NUMBER OF KEYWORDS TO SEARCH #                          MSCN 
            ENTRIES = B<LEXBYTE,6>LEXENTRY[LPTR];                        MSCN 
                                                                         MSCN 
# SET WRDPTR TO PROPER POSITION IN LEXWORDS                            # MSCN 
            WRDPTR = B<LEXBYTE+6,12> LEXENTRY[LPTR];                     MSCN 
                                                                         MSCN 
# WE NOW STEP THRU LEXICON TABLE USING WRDPTR AS THE STARTING POINT #    MSCN 
# AND ENTRIES AS THE NUMBER TO SCAN. FOR LOOP TERMINATES WHEN KEYWORD #  MSCN 
# DETECTED OR (ENTRIES) KEYWORDS SCANNED #                               MSCN 
            FOR I = 1 STEP 1 WHILE DATAFLG AND I LQ ENTRIES DO           MSCN 
              BEGIN                                                      MSCN 
              IF NEXWRD[0] EQ LEXWRD[WRDPTR]                             MSCN 
                THEN                                                     MSCN 
                BEGIN        #FIRST 10 CHARS MATCH#                      MSCN 
                IF DB$NLNW EQ 0                                          MSCN 
                  THEN DATAFLG = FALSE; #FOUND A KEYWORD#                MSCN 
                                                                         MSCN 
                  ELSE                                                   MSCN 
                  BEGIN      #KEYWORD 2 OR 3 WORDS LONG #                MSCN 
                  IF NEXWRD[1] EQ LEXWRD[WRDPTR + 1]                     MSCN 
                    THEN                                                 MSCN 
                    BEGIN    #FIRST 20 CHARS MATCH#                      MSCN 
                    IF DB$NLNW EQ 1                                      MSCN 
                      THEN DATAFLG = FALSE; #FOUND A KEYWORD#            MSCN 
                                                                         MSCN 
                      ELSE                                               MSCN 
                      BEGIN  #KEYWORD 3 WORDS LONG #                     MSCN 
                      IF NEXWRD[2] EQ LEXWRD[WRDPTR+2]                   MSCN 
                        THEN DATAFLG = FALSE; #FOUND A KEYWORD#          MSCN 
                      END                                                MSCN 
                                                                         MSCN 
                    END      #1ST 20 MATCH#                              MSCN 
                  END        #KEYWORD 2 OR 3 WORDS LONG#                 MSCN 
                END          #1ST 10 MATCH#                              MSCN 
                                                                         MSCN 
              WRDPTR = WRDPTR + 2 + DB$NLNW;  #POINT TO NEXT ENTRY     # MSCN 
              END            #END OF FOR LOOP #                          MSCN 
                                                                         MSCN 
            END              #END OF SCAN #                              MSCN 
                                                                         MSCN 
          IF DATAFLG                                                     MSCN 
            THEN DB$NTYP = DFNAMCOD; #SYNTACTIC TYPE FOR DATA NAME     # MSCN 
                                                                         MSCN 
            ELSE                                                         MSCN 
            BEGIN                                                        MSCN 
            DB$NTYP = DFKEYCOD; # SYNTACTIC TYPE FOR KEYWORD           # MSCN 
            WRDPTR = WRDPTR - 1;                                         JJJ0112
                                                                         MSCN 
# SET NEXT ITEMS TO VALUES FOR THE FOUND KEYWORD                       # MSCN 
            DB$NP1  = P1 [WRDPTR];                                       MSCN 
            DB$NP2  = P2 [WRDPTR];                                       MSCN 
            DB$NXID = LEXID [WRDPTR];                                    MSCN 
            DB$NSYN = LEXSECT [WRDPTR];                                  MSCN 
            END                                                          MSCN 
                                                                         MSCN 
          GOTO SCANEXIT1;                                                MSCN 
                                                                         MSCN 
HYPHEN:                      #GOT HYPHEN, COULD BE KEY OR NAME#          MSCN 
          STATE = 30;        #NEXT CHAR MUST BE LETTER OR DIGIT#         MSCN 
          GOTO STORCHAR;                                                 MSCN 
                                                                         MSCN 
INTSTOR:                                                                 MSCN 
          DB$LEXP = DB$LEXP + 1;                                         MSCN 
                                                                         MSCN 
INTSTOR1:                                                                MSCN 
          DB$NTYP = DFINTCOD;  # EXIT WITH SYNTACTIC TYPE INTEGER      # MSCN 
          GOTO SCANEXIT1;                                                MSCN 
                                                                         MSCN 
TRACSWT:                     #GOT AN = FIRST, IN OR OUT OF TRACE MODE#   MSCN 
          DB$TFLG = DB$TFLG + 1;                                         MSCN 
          GOTO NEXTCHAR;                                                 MSCN 
                                                                         MSCN 
STORCHAR:                    #STORE AWAY CHAR IF ROOM#                   MSCN 
          DB$NLNG = DB$NLNG + 1;                                         MSCN 
          BITPOS = BITPOS + 6; #INCREMENT BIT POSITION TO NEXT CHAR#     MSCN 
          IF BITPOS GR 54    #HAVE WE FILLED A WORD #                    MSCN 
            THEN             #YES, GO TO NEW WORD#                       MSCN 
            BEGIN                                                        MSCN 
            BITPOS = 0;                                                  MSCN 
            DB$NLNW = DB$NLNW + 1;                                       MSCN 
            IF DB$NLNW GR 7  # IS SOURCE WORD LONGER THAN A CARD       # MSCN 
              THEN           #YES, THROW AWAY CHARS UNTIL SEPERATOR #    MSCN 
              BEGIN                                                      MSCN 
              DB$NLNW = DB$NLNW - 1;                                     MSCN 
              DB$NLNG = DB$NLNG - 1;                                     MSCN 
              FOR DB$LEXP = DB$LEXP + 1 STEP 1 UNTIL DB$MIRL DO          MSCN 
                BEGIN                                                    MSCN 
                IF SETSTATUS [DB$LEXP] LQ S"PERIOD"                      MSCN 
                  THEN GOTO SCANEXIT1;  #GOT A SEPERATOR#                MSCN 
                                                                         MSCN 
                END                                                      MSCN 
                                                                         MSCN 
              DB$LEXP = DB$MIRL + 1; # WE WILL READ A NEW CARD ON THE  # MSCN 
                                     # NEXT CALL TO DB$SCAN            # MSCN 
              GOTO SCANEXIT1; #EVEN THOUGH NO SEPERATOR FOUND, WE #      MSCN 
                              #WONT THROW AWAY MORE THAN A CARD #        MSCN 
              END                                                        MSCN 
            END              # END OF NEW WORD CODE                    # MSCN 
                                                                         MSCN 
# STORE CHARACTER #                                                      MSCN 
          B<BITPOS,6> NEXWRD [DB$NLNW] = B<0,6> LEXCHAR [DB$LEXP];       MSCN 
                                                                         MSCN 
NEXTCHAR:                                                                MSCN 
# ENTER STATE TABLE FOR NEXT CHAR #                                      MSCN 
          DB$LEXP = DB$LEXP + 1;                                         MSCN 
          GOTO CONTSCAN;     #GO BACK, CHECK IF NEW RECORD, AND #        MSCN 
                             #CONTINUE THE SCAN. #                       MSCN 
                                                                         MSCN 
SCANEXIT:                                                                MSCN 
          DB$LEXP = DB$LEXP + 1;                                         MSCN 
                                                                         MSCN 
SCANEXIT1:                                                               MSCN 
          DB$NLNW = DB$NLNW + 1;                                         MSCN 
          DB$NCOL = DB$LEXP -(DB$NLNG + 1);                              MSCN 
          RETURN;                                                        MSCN 
                                                                         MSCN 
# THIS SHOULD NEVER HAPPEN.  IF IT DOES ABORT THE RUN.                 # MSCN 
ERR:                                                                     MSCN 
          DB$MABT (DFRNGABT,"DB$SCAN   ");  # ABORT RUN WITH RANGE ERR # MSCN 
                                                                         MSCN 
          END                                                            MSCN 
                                                                         MSCN 
      END 
