*DECK S$GTTOK 
          PROC S$GTTOK(STRING$,COL$,TOKEN$,STATUS$);
  
#**       S$GTTOK - GET A TOKEN                                        #
#                                                                      #
#       CALLING SEQ -                                                  #
#         S$GTTOK(STRING$,COL$,TOKEN$,STATUS$):                        #
#       GIVEN -                                                        #
#         COL$= CURRENT COLUMN(POSITION) OF STRING(INPUT,OUTPUT)       #
#         STATUS$ = ERROR STATUS(OUTPUT)                               #
#         STRING$ = ARRAY CONTAINING THE STRING TO BE SEARCHED         #
#         TOKEN$ = ARRAY CONTINING A TOKEN AND THE TOKEN'S TYPE(OUTPUT)#
#       DOES -                                                         #
#         GIVEN A STARTING COLUMN POSITION(COL) WITHIN THE STRING, THIS#
#         PROC SEARCHES THE STRING, LOOKING AT SINGLE CHARACTERS, UNTIL#
#         IT DETERMINES WHAT THE TOKEN STARTING FROM COL IS AND THEN   #
#         SETS TOKEN$ APPROPRIATELY                                    #
#                                                                      #
  
          BEGIN 
  
*CALL A 
  
*CALL STRING$ 
  
*CALL STATUS$ 
  
*CALL CLPTYPE 
  
*CALL CLPARRA 
  
*CALL DEBUG 
  
  
  
          XREF
#??#          PROC S$PRTCD; 
  
#??#      ITEM MES   C(60);  # FOR S$PRTCD                             #
          ITEM ENDQUOT    B;
          ITEM EOS        B=FALSE;
          ITEM QUOTE      I=0;
          ITEM CHAR       C(1); 
          ITEM PAR     B=FALSE; # HAS A ( BEEN FOUND IN A $NAM TOKEN   #
          ITEM PART    C(5);    # A SMALL PORTION OF STRING$           #
  
  
#                                                                      #
  
          FUNC LETTER(CHAR) B;
#                                                                      #
#**       THIS FUNCTION DETERMINES IF A GIVEN CHARACTER IS A LETTER    #
#                                                                      #
          BEGIN 
          ITEM CHAR    C(1);    # SINGLE CHARACTER                     #
          IF (CHAR GQ "A" AND CHAR LQ "Z")  THEN
              LETTER = TRUE;
          ELSE
              LETTER = FALSE; 
          END # OF FUNC LETTER #
  
  
  
          FUNC DIGIT(CHAR) B; 
#                                                                      #
#**       THIS FUNCTION DETERMINES IF A GIVEN CHARACTER IS A DIGIT     #
#                                                                      #
          BEGIN 
          ITEM CHAR     C(1);    # SINGLE CHARACTER                    #
          IF (CHAR GQ "0"  AND  CHAR LQ "9")  THEN
              DIGIT = TRUE; 
          ELSE
              DIGIT = FALSE;
          END # OF FUNC DIGIT # 
  
#                                                                      #
  
  
CONTROL EJECT;
  
          ENDQUOT = FALSE;
          PREVCOL = COL;
          QUOTE = 0;
          EOS = FALSE;
  
  
#      GET THE NEXT CHARACTER OR ENCOUNTER E_O_S                       #
  
          IF COL GQ STRING$LEN  THEN
              BEGIN 
              $BEGIN
#??#          MES = "S$GTTOK-3";
#??#          S$PRTCD(MES); 
              FLUSH;
              $END
              TOKENTYPE = TYP"EOS"; 
#***#         RETURN; 
              END 
  
TOP:  
  
          CHAR = C<COL,1>STRING$C;
  
#      GIVEN 'CHAR' DETERMINE THE TOKEN_TYP AND TOKEN_VALUE            #
  
          IF LETTER(CHAR) THEN
              BEGIN 
              IF TOKENTYPE EQ TYP"NONE"  OR  PREVCOL EQ COL   THEN
                  BEGIN 
                  TOKENTYPE  = TYP"NAME"; 
#***#             GOTO BOTTOM;
                  END 
              ELSE
              IF TOKENTYPE EQ TYP"NAME" 
                OR TOKENTYPE EQ TYP"$NAM" THEN
#***#             GOTO BOTTOM;
              ELSE
              IF TOKENTYPE EQ  TYP"STRING" THEN 
                  BEGIN 
                  IF ENDQUOT THEN 
                      BEGIN 
                      TOKENC = C<PREVCOL,COL-PREVCOL>STRING$C;
#***#                 RETURN; 
                      END 
                  ELSE
#***#                 GOTO BOTTOM;
                  END 
              ELSE #IF NONE OF THE ABOVE TYPES WERE TRUE               #
                  BEGIN 
                  TOKENC = C<PREVCOL,COL-PREVCOL>STRING$C;
#***#             RETURN; 
                  END 
              END 
  
          ELSE
          IF DIGIT(CHAR) THEN 
              BEGIN 
              IF TOKENTYPE EQ TYP"NONE"  OR  PREVCOL EQ COL   THEN
                  BEGIN 
                  TOKENTYPE  = TYP"NUM";
#***#             GOTO BOTTOM;
                  END 
              ELSE
              IF TOKENTYPE EQ  TYP"NUM" OR TOKENTYPE EQ  TYP"$NAM"
                            OR TOKENTYPE EQ  TYP"NAME" THEN 
                  BEGIN 
#***#             GOTO BOTTOM;
                  END 
              ELSE
              IF TOKENTYPE EQ  TYP"STRING" THEN 
                  BEGIN 
                  IF ENDQUOT THEN 
                      BEGIN 
                      TOKENC = C<PREVCOL,COL-PREVCOL>STRING$C;
#***#                 RETURN; 
                      END 
                  ELSE
#***#                 GOTO BOTTOM;
                  END 
              ELSE # IF NONE OF THE ABOVE TYPES WERE TRUE              #
                  BEGIN 
                  TOKENC = C<PREVCOL,COL-PREVCOL>STRING$C;
#***#             RETURN; 
                  END 
              END 
  
          ELSE
          IF CHAR EQ "_"  # UNDERSCORE #  THEN
              BEGIN 
              IF TOKENTYPE EQ TYP"NONE" OR  PREVCOL EQ COL  THEN
                  BEGIN 
                  TOKENTYPE = TYP"ILLEGAL"; 
#***#             GOTO BOTTOM;
                  END 
              IF TOKENTYPE EQ TYP"NAME"  # BUT NOT $NAME#  THEN 
                  GOTO BOTTOM;
              ELSE
              IF TOKENTYPE EQ TYP"STRING"  THEN 
                  BEGIN 
                  IF ENDQUOT  THEN
                      BEGIN 
                      TOKENC = C<PREVCOL,COL-PREVCOL>STRING$C;
#***#                 RETURN; 
                      END 
                  ELSE
#***#                 GOTO BOTTOM;
                  END 
              ELSE   # IF NEITHER OF THESE TWO CONDITIONS HELD         #
                  BEGIN 
                  TOKENC = C<PREVCOL,COL-PREVCOL>STRING$C;
#***#             RETURN; 
                  END 
              END 
  
          ELSE
          IF CHAR EQ "#"  # POUND SIGN #  THEN
              BEGIN 
              IF TOKENTYPE EQ TYP"NONE" OR  PREVCOL EQ COL  THEN
                  BEGIN 
                  TOKENTYPE = TYP"ILLEGAL"; 
#***#             GOTO BOTTOM;
                  END 
              IF TOKENTYPE EQ TYP"NAME"  # BUT NOT $NAME#  THEN 
                  GOTO BOTTOM;
              ELSE
              IF TOKENTYPE EQ TYP"STRING"  THEN 
                  BEGIN 
                  IF ENDQUOT  THEN
                      BEGIN 
                      TOKENC = C<PREVCOL,COL-PREVCOL>STRING$C;
#***#                 RETURN; 
                      END 
                  ELSE
#***#                 GOTO BOTTOM;
                  END 
              ELSE   # IF NEITHER OF THESE TWO CONDITIONS HELD         #
                  BEGIN 
                  TOKENC = C<PREVCOL,COL-PREVCOL>STRING$C;
#***#             RETURN; 
                  END 
              END 
  
          ELSE
          IF CHAR EQ "@"  # COMMERCIAL 'AT' SIGN #  THEN
              BEGIN 
              IF TOKENTYPE EQ TYP"NONE" OR  PREVCOL EQ COL  THEN
                  BEGIN 
                  TOKENTYPE = TYP"ILLEGAL"; 
#***#             GOTO BOTTOM;
                  END 
              IF TOKENTYPE EQ TYP"NAME"  # BUT NOT $NAME#  THEN 
                  GOTO BOTTOM;
              ELSE
              IF TOKENTYPE EQ TYP"STRING"  THEN 
                  BEGIN 
                  IF ENDQUOT  THEN
                      BEGIN 
                      TOKENC = C<PREVCOL,COL-PREVCOL>STRING$C;
#***#                 RETURN; 
                      END 
                  ELSE
#***#                 GOTO BOTTOM;
                  END 
              ELSE   # IF NEITHER OF THESE TWO CONDITIONS HELD         #
                  BEGIN 
                  TOKENC = C<PREVCOL,COL-PREVCOL>STRING$C;
#***#             RETURN; 
                  END 
              END 
  
          ELSE
          IF CHAR EQ "(" THEN 
              BEGIN 
              IF TOKENTYPE EQ TYP"NONE"  OR  PREVCOL EQ COL   THEN
                  BEGIN 
                  TOKENTYPE  = TYP"LP"; 
#***#             GOTO BOTTOM;
                  END 
              ELSE
              IF TOKENTYPE EQ  TYP"STRING" THEN 
                  BEGIN 
                  IF ENDQUOT THEN 
                      BEGIN 
                      TOKENC = C<PREVCOL,COL-PREVCOL>STRING$C;
#***#                 RETURN; 
                      END 
                  ELSE
#***#                 GOTO BOTTOM;
                  END 
              ELSE
              IF TOKENTYPE EQ  TYP"$NAM"  THEN
                  BEGIN 
                  IF PAR  THEN
                      BEGIN 
                      TOKENC = C<PREVCOL,COL-PREVCOL>STRING$C;
#***#                 RETURN; 
                      END 
                  ELSE  # SINCE PAR = FALSE A ( HAS NOT BEEN FOUND YET #
                      BEGIN 
                      PART = C<COL-5,COL-PREVCOL>STRING$C;
                      IF PART EQ "$CHAR"  THEN
                          BEGIN 
                          PAR = TRUE; 
#***#                     GOTO BOTTOM;
                          END 
                      IF PART NQ "$CHAR"  THEN
                          BEGIN 
                          TOKENC = C<PREVCOL,COL-PREVCOL>STRING$C;
#***#                     RETURN; 
                          END 
                      END 
                  END 
              ELSE # IF NONE OF THE ABOVE TYPES WERE TRUE              #
                  BEGIN 
                  TOKENC = C<PREVCOL,COL-PREVCOL>STRING$C;
#***#             RETURN; 
                  END 
              END 
  
          ELSE
          IF CHAR EQ ")" THEN 
              BEGIN 
              IF TOKENTYPE EQ TYP"NONE"  OR  PREVCOL EQ COL   THEN
                  BEGIN 
                  TOKENTYPE  = TYP"RP"; 
#***#             GOTO BOTTOM;
                  END 
              ELSE
              IF TOKENTYPE EQ  TYP"STRING" THEN 
                  BEGIN 
                  IF ENDQUOT THEN 
                      BEGIN 
                      TOKENC = C<PREVCOL,COL-PREVCOL>STRING$C;
#***#                 RETURN; 
                      END 
                  ELSE
#***#                 GOTO BOTTOM;
                  END 
              ELSE
              IF TOKENTYPE EQ TYP"$NAM"  THEN 
                  BEGIN 
                  IF PAR  THEN
                      BEGIN 
                      PAR = FALSE;
#***#                 GOTO BOTTOM;
                      END 
                  ELSE  # PAR HAS NOT BEEN SET                         #
                      BEGIN 
                      TOKENC = C<PREVCOL,COL-PREVCOL>STRING$C;
#***#                 RETURN; 
                      END 
                  END 
              ELSE # IF NONE OF THE ABOVE TYPES WERE TRUE              #
                  BEGIN 
                  TOKENC = C<PREVCOL,COL-PREVCOL>STRING$C;
#***#             RETURN; 
                  END 
              END 
  
          ELSE
          IF CHAR EQ "$" THEN 
              BEGIN 
              IF TOKENTYPE EQ TYP"NONE"  OR  PREVCOL EQ COL   THEN
                  BEGIN 
                  TOKENTYPE  = TYP"$NAM"; 
#***#             GOTO BOTTOM;
                  END 
              ELSE
              IF TOKENTYPE EQ  TYP"NAME" THEN 
                  BEGIN 
#***#             GOTO BOTTOM;
                  END 
              ELSE
              IF TOKENTYPE EQ  TYP"$NAM" THEN 
#***#             GOTO BOTTOM;
              ELSE
              IF TOKENTYPE EQ  TYP"STRING" THEN 
                  BEGIN 
                  IF ENDQUOT THEN 
                      BEGIN 
                      TOKENC = C<PREVCOL,COL-PREVCOL>STRING$C;
#***#                 RETURN; 
                      END 
                  ELSE
#***#                 GOTO BOTTOM;
                  END 
              ELSE # IF NONE OF THE ABOVE TYPES WERE TRUE              #
                  BEGIN 
                  TOKENC = C<PREVCOL,COL-PREVCOL>STRING$C;
#***#             RETURN; 
                  END 
              END 
  
          ELSE
          IF CHAR EQ "=" THEN 
              BEGIN 
              IF TOKENTYPE EQ TYP"NONE"  OR  PREVCOL EQ COL   THEN
                  BEGIN 
                  TOKENTYPE  = TYP"EQUALS"; 
#***#             GOTO BOTTOM;
                  END 
              ELSE
              IF TOKENTYPE EQ  TYP"STRING" THEN 
                  BEGIN 
                  IF ENDQUOT THEN 
                      BEGIN 
                      TOKENC = C<PREVCOL,COL-PREVCOL>STRING$C;
#***#                 RETURN; 
                      END 
                  ELSE
#***#                 GOTO BOTTOM;
                  END 
              ELSE # IF NONE OF THE ABOVE TYPES WERE TRUE              #
                  BEGIN 
                  TOKENC = C<PREVCOL,COL-PREVCOL>STRING$C;
#***#             RETURN; 
                  END 
              END 
  
          ELSE
          IF CHAR EQ "'"  # SINGLE APOSTROPHE #  THEN 
              BEGIN 
              IF TOKENTYPE EQ TYP"NONE"  OR  PREVCOL EQ COL   THEN
                  BEGIN 
                  QUOTE = 1;
                  TOKENTYPE  = TYP"STRING"; 
#***#             GOTO BOTTOM;
                  END 
              ELSE
              IF TOKENTYPE EQ  TYP"STRING" THEN 
                  BEGIN 
                  QUOTE = QUOTE + 1;
                  IF QUOTE EQ 2 OR QUOTE EQ 4 THEN
#                     AN EVEN NUMBER OF QUOTES WERE FOUND              #
                      BEGIN 
                      ENDQUOT = TRUE; 
#***#                 GOTO BOTTOM;
                      END 
                  IF QUOTE EQ 3 THEN
#                     QUOTE SIGNS ARE AS YET UNMATCHED                 #
                      BEGIN 
                      ENDQUOT = FALSE;
#***#                 GOTO BOTTOM;
                      END 
                  IF QUOTE LS 2 OR QUOTE GR 4 THEN
                      BEGIN 
                      TOKENTYPE  = TYP"ILLEGAL";
#***#                 RETURN; 
                      END 
                  END 
              ELSE # IF NONE OF THE ABOVE TYPES WERE TRUE              #
                  BEGIN 
                      TOKENC = C<PREVCOL,COL-PREVCOL>STRING$C;
#***#             RETURN; 
                  END 
              END 
  
          ELSE
          IF CHAR EQ " " #SPACE# THEN 
              BEGIN 
              IF TOKENTYPE EQ TYP"NONE"  OR  PREVCOL EQ COL   THEN
                  BEGIN 
                  TOKENTYPE  = TYP"SPACE";
#***#             GOTO BOTTOM;
                  END 
              ELSE
              IF TOKENTYPE EQ  TYP"STRING" THEN 
                  BEGIN 
                  IF ENDQUOT THEN 
                      BEGIN 
                      TOKENC = C<PREVCOL,COL-PREVCOL>STRING$C;
#***#                 RETURN; 
                      END 
                  ELSE
#***#                 GOTO BOTTOM;
                  END 
              ELSE # IF NONE OF THE ABOVE TYPES WERE TRUE              #
                  BEGIN 
                  TOKENC = C<PREVCOL,COL-PREVCOL>STRING$C;
#***#             RETURN; 
                  END 
              END 
  
          ELSE
          IF CHAR EQ "," THEN 
              BEGIN 
              IF TOKENTYPE EQ TYP"NONE"  OR  PREVCOL EQ COL   THEN
                  BEGIN 
                  TOKENTYPE  = TYP"COMMA";
#***#             GOTO BOTTOM;
                  END 
              ELSE
              IF TOKENTYPE EQ  TYP"STRING" THEN 
                  BEGIN 
                  IF ENDQUOT THEN 
                      BEGIN 
                      TOKENC = C<PREVCOL,COL-PREVCOL>STRING$C;
#***#                 RETURN; 
                      END 
                  ELSE
#***#                 GOTO BOTTOM;
                  END 
              ELSE # IF NONE OF THE ABOVE TYPES WERE TRUE              #
                  BEGIN 
                  TOKENC = C<PREVCOL,COL-PREVCOL>STRING$C;
#***#             RETURN; 
                  END 
              END 
  
          ELSE
          IF CHAR EQ "." THEN 
              BEGIN 
              IF TOKENTYPE EQ TYP"NONE"  OR  PREVCOL EQ COL   THEN
                  BEGIN 
                  TOKENTYPE  = TYP"DOT";
#***#             GOTO BOTTOM;
                  END 
              ELSE
              IF TOKENTYPE EQ  TYP"DOT" THEN
                  BEGIN 
                  TOKENTYPE  = TYP"ELLIPSIS"; 
#***#             GOTO BOTTOM;
                  END 
              ELSE
              IF TOKENTYPE EQ  TYP"STRING" THEN 
                  BEGIN 
                  IF ENDQUOT THEN 
                      BEGIN 
                      TOKENC = C<PREVCOL,COL-PREVCOL>STRING$C;
#***#                 RETURN; 
                      END 
                  ELSE
#***#                 GOTO BOTTOM;
                  END 
              ELSE # IF NONE OF THE ABOVE TYPES WERE TRUE              #
                  BEGIN 
                  TOKENC = C<PREVCOL,COL-PREVCOL>STRING$C;
#***#             RETURN; 
                  END 
              END 
  
          ELSE # IF NONE OF THE ABOVE CHARACTERS WERE ENCOUNTERED      #
              BEGIN 
              $BEGIN
#??#          MES = "S$GTTOK-8";
#??#          S$PRTCD(MES); 
              FLUSH;
              $END
              IF TOKENTYPE EQ TYP"NONE"  OR  PREVCOL EQ COL   THEN
                  BEGIN 
                  TOKENTYPE  = TYP"ILLEGAL";
#***#             GOTO BOTTOM;
                  END 
              ELSE #THOUGH NEXT CALL TO GTTOKN RETURNS TYP=ILLEGAL     #
              IF TOKENTYPE EQ  TYP"STRING" THEN 
                  BEGIN 
                  IF ENDQUOT THEN 
                      BEGIN 
                      TOKENC = C<PREVCOL,COL-PREVCOL>STRING$C;
#***#                 RETURN; 
                      END 
                  ELSE
#***#                 GOTO BOTTOM;
                  END 
              ELSE #IF NONE OF THE ABOVE TYPES WERE TRUE               #
                  BEGIN 
                  TOKENC = C<PREVCOL,COL-PREVCOL>STRING$C;
#***#             RETURN; 
                  END 
              END 
  
BOTTOM: 
  
          COL = COL + 1;
#             LOOK AT ANOTHER CHARARCTER OF STRING$                    #
          IF  COL LS STRING$LEN  THEN 
#***#         GOTO TOP; 
          ELSE
              BEGIN 
              TOKENC = C<PREVCOL,COL-PREVCOL+1>STRING$C;
#***#         RETURN; 
              END 
          END   # S$GTTOKN #
  
          TERM
