* 11/30/72 -- 09:00
* MODULE NAME: DSCRINT
* NUMBER: 32
* PURPOSE: INTERPRET COMMAND DESCRIPTORS
*
* ENTRY PARAMETERS:
*        X1 =BYTE ADDR OF FIRST CHAR TO CHECK
*        AC1 =DESCRIPTOR TYPE (1-12)
*        SRTN=RETURN ADDR
*
* EXIT PARAMETERS:
*        X1 =BYTE ADDR OF CHAR AFTER DESCRIPTOR, IF FOUND
*        AC2 =DESCRIPTOR, IF FOUND
*           =0 IF NOT FOUND
*        CMDSTA SET IF DESCRIPTOR IS FOUND
*
         SYSTEM   TEXTDEF
         SYSTEM   CMDDEF
         INVDSCR
         SYSTEM   ITEMDEF
         INVCMDSTA
*
         DEF      S32DSCR
*
*
         PAGE
*
*
*
         DEF      32P,32D
*
32P      EQU      %
         DATA     X'32'             MODULE NUMBER
         DATA     X'113072'         DATE
         DATA     X'0900'           TIME
*
*
*
         TITLE    '** DSCRINT(32) **'
*
S32DSCR  EQU      %
         STW,AC1  DSCRTYPE          SAVE DESCRIPTOR TYPE
*
         AI,AC1   ROUTINE           ADDR OF TRANSFER
         B        *AC1              DESCRIPTOR ROUTINE
*
*
*
*        DESCRIPTOR HANDLING ROUTINES
*
ROUTINE  EQU      %-1
         B        LNTEST
         B        RNTEST
         B        RNTEST
         B        DOCTEST
         B        DOCTEST
         B        DOCTEST
         B        PWTEST
         B        NMTEST
         B        DSTEST
         B        DSTEST
         B        DSTEST
         B        CS1TEST
         B        CS2TEST
         B        CS3TEST
*
*
*
         PAGE
* TEST FOR LN DESCRIPTOR
*
*
*
LNTEST   EQU      %
         SAVRTN
         LI,AC1   0                 INITIALIZE:
         STW,AC1  OSFLG                 OFFSET FLAG
         STW,AC1  WLN                   WHOLE LINE NUMBER
         STW,AC1  FLN                   INCREMENTAL LINE NUMBER
*
         BAL,SRTN S32DELLB          DELETE LEADING BLANKS
         LB,AC1   0,X1              GET FIRST CHARACTER
*
*
         PAGE
*
*        TEST FOR OFFSET
*
         CI,AC1   '-'               COMPARE TO MINUS
         BNE      PLUSCHK             NOT EQUAL, CHECK FOR PLUS
         MTH,-1   OSFLG               EQUAL, SET OSFLG
         B        OSFCFND
PLUSCHK  CI,AC1   '+'               COMPARE TO PLUS
         BNE      DPFCCHK             NOT EQUAL, CHECK FOR DEC. PT.
         MTH,1    OSFLG               EQUAL, SET OSFLG
         B        OSFCFND
*        TEST FOR FIRST CHARACTER DECIMAL POINT
*
DPFCCHK  EQU      %
         CI,AC1   '.'               COMPARE TO DECIMAL PT
         BE       DPFCFND             EQUAL
*
*        TEST FOR DIGIT STRING
*
         BAL,SRTN DSTEST            DIGIT STRING TEST
         CI,AC2   0                 TEST R9
         BEZ      LNRTN               NOT DIGIT STRING
         STH,AC2  WLN                 DIGIT STRING, STORE
*
         LB,AC1   0,X1              GET NEXT CHARACTER
         CI,AC1   '.'               TEST FOR DECIMAL POINT
         BNE      LNFIN               NOT DEC. PT.
         AI,X1    1                 INCREMENT CHAR PTR
         BAL,SRTN FLNTEST           DIGIT STRING TEST
         STH,AC2  FLN                 DIGIT STRING, STORE
         B        LNFIN             DONE
*
*
         PAGE
*
*        OFFSET FIRST CHARACTER FOUND
*
OSFCFND  EQU      %
         AI,X1    1                 INCREMENT CHAR PTR
         BAL,SRTN DSTEST            DIGIT STRING TEST
         CI,AC2   0                 TEST AC2
         BNEZ     OSFND               DIGIT STRING
         AI,X1    -1                  NOT DIGIT STRING, NOT LN
         B        LNRTN
*
OSFND    EQU      %
         MH,AC2   OSFLG             MULTIPLY # BY OFFSET SIGN
         LI,AC1   -1
         STB,AC1  AC2               SET BYTE 0 FOR OFFSET
         STW,AC2  OSFLG             STORE IN OFFSET FLAG
         B        LNFIN             DONE
*
*        DECIMAL PT IN FIRST CHAR FOUND
*
DPFCFND  EQU      %
         AI,X1    1
         BAL,SRTN FLNTEST           DIGIT STRING TEST
         CI,AC2   0                 TEST R9
         BNEZ     DPFND               DIGIT STRING
         AI,X1    -1                  NOT DIGIT STRING, NOT LN
         B        LNRTN
*
DPFND    EQU      %
         STH,AC2  FLN               STORE LN INCREMENT
         B        LNFIN             DONE
*
*
         PAGE
*
*        LINE NUMBER FOUND
*
LNFIN    EQU      %
         BAL,SRTN S32DELLB          DELETE TRAILING BLANKS
         MTW,0    OSFLG             TEST OFFSET FLAG
         BNEZ     STLNRTN             SET, STORE VALUE
*
REGLN    EQU      %
         LH,AC2   WLN               GET WHOLE LN IN ODD REG
         MI,AC2   1000              MULT. BY KEY INCREMENT
         AH,AC2   FLN               ADD FRACTIONAL PART
         LI,AC1   3
         STB,AC1  AC2               SET COUNT FOR KEY
*
*
*        RETURN FROM LN CHECK
*
STLNRTN  EQU      %
         LW,AC1   DSCRTYPE          TEST DESRIPTOR TYPE
         CI,AC1   LN                CHECK FOR LN TEST
         BNE      LNRTN               NO, RETURN
         LW,D2    AC2                 YES, STORE DESCRIPTOR
         PUT,D2   #LN
LNRTN    EQU      %
         RETURN
*
*
         PAGE
*
* FLNTEST -- FRACTIONAL LINE NUMBER TEST
*
FLNTEST  EQU      %
         SAVRTN
*
         LI,AC1   0                 INITIALIZE FOUND FLAG
         LI,AC2   0                 INITIALIZE FRACTIONAL LINE NUMBER
         LI,DX2   100               INITIALIZE MULTIPLIER
*
FLNLP    EQU      %
         LB,DX1   0,X1              GET NEXT CHAR
         AI,DX1   -'0'              SUBTRACT 0 CHAR (X'F0')
         BLZ      FLNRTN               NOT NUMBER, RETURN
         LI,AC1   -1                   NUMBER, SET FOUND FLAG
*
         MW,DX1   DX2               MULTPLY
         AW,AC2   DX1               ADD TO FRACTIONAL PART
         AI,X1    1                 INCREMENT POINTER
         DW,DX2   L(10)             DIVIDE MULTIPLIER BY 10
         BGZ      FLNLP             NON-ZERO, GET NEXT
*
FLNRTN   EQU      %
         STB,AC1  AC2               STORE FOUND FLAG
         RETURN
*
*
         PAGE
* TEST FOR RN DESCRIPTOR
*
*
RNTEST   EQU      %
         SAVRTN
*
         BAL,SRTN LNTEST            TEST FOR FIRST LN
         CI,AC2   0                 FOUND?
         BE       RNRTN               NO, NOT RN -- RETURN
*
*
         LW,D2    AC2               SAVE LN IN RN1
         PUT,D2   #RN1
*
*        TEST FOR RANGE OF LINE NUMBERS
*
         LB,AC1   0,X1              TEST NEXT CHAR FOR RANGE
         CI,AC1   '-'               - TEST
         BE       TLN2
         LW,AC3   DSCRTYPE          GET DESCRIPTOR TYPE
         CI,AC3   RN2               CHECK FOR RN2 TEST
         BE       RNRTN                YES, RETURN
         CI,AC1   ';'               ; TEST
         BNE      RNRTN             NOT RANGE, RETURN
*
*
         PAGE
*
*        TEST FOR SECOND LN IN RANGE
*
TLN2     EQU      %
         AI,X1    1                 INCREMENT CHARACTER POINTER
         BAL,SRTN LNTEST            TEST FOR LN
         CI,AC2   0                 FOUND?
         BNE      FLN2                YES, SET UP LN2
         AI,X1    -1                  NO, DECREMENT CHAR PTR
         GET,D2   #RN1              SET AC2 TO RN1
         LW,AC2   D2
         B        RNRTN             RETURN
FLN2     EQU      %
         LW,D2    AC2               SAVE LN IN RN2
         PUT,D2   #RN2
*
RNRTN    EQU      %
         RETURN
*
*
         PAGE
*
* TEST FOR DIGIT STRING DESCRIPTORS
*
DSTEST   EQU      %
         SAVRTN
*
         LW,AC3   DSCRTYPE          GET DESCRIPTOR TYPE
         CI,AC3   DS3               TEST FOR DIGIT STRING TYPE
         BG       INITDS               NO, GO INITIALIZE
         BAL,SRTN S32DELLB             YES, DELETE LEADING BLANKS
*
INITDS   EQU      %
         LI,AC2   0                 INITIALIZE DIGIT STRING
         LI,AC3   0                 INITIALIZE FOUND FLAG
DSLP     EQU      %
         LB,AC1   0,X1              GET NEXT CHAR
         CI,AC1   '0'               TEST FOR DIGIT 0-9
         BL       DSRTN               NOT DIGIT, RETURN
         LI,AC3   -1                SET FOUND FLAG
         AI,AC1   -'0'                DIGIT, GET BINARY VALUE (-X'F0')
         MI,AC2   10
         AW,AC2   AC1               ADD TO PREVIOUS VALUE
         AI,X1    1                 INCREMENT CHAR POINTER
         B        DSLP
*
*
         PAGE
*
*
DSRTN    EQU      %
         STB,AC3  AC2               STORE FOUND FLAG IN AC2
         LW,X2    DSCRTYPE          TEST DESCRIPTOR TYPE
         CI,X2    DS3               CHECK FOR DS TEST
         BG       NDSTST              NO, RETURN
         BAL,SRTN S32DELLB          DELETE TRAILING BLANKS
         AI,X2    -DS1+1              YES, GET TABLE INDEX
         BLEZ     NDSTST              <0, NO DS TEST
         LW,D2    AC2               DS TEST, SET CMDSTA
         PUT,D2   #DS,X2
*
NDSTST   EQU      %
         RETURN
*
         PAGE
*
* TEST FOR PW DESCRIPTOR
*
*
PWTEST   EQU      %
         LI,AC1   8                 SET MAX SIZE
         LI,AC3   PWFIN             SET RETURN
         B        NMT2              CHECK FOR TERM. CHARS
*
PWFIN    EQU      %
         CI,AC1   PW                TEST DESCRIPTOR TYPE
         BNE      NMRTN             NOT PW, RETURN
         LW,D2    AC2               PW, SET CMDSTA
         BEZ      NMRTN
         PUT,D2   #NCPW
         LW,D2    NMFC
         PUT,D2   #PW
         B        NMRTN
*
*
         PAGE
*
* TEST FOR NAME DESCRIPTOR
*
*
NMTEST   EQU      %
         LI,AC1   31                SET MAX SIZE
         LI,AC3   NMFIN             SET RETURN
*
NMT2     EQU      %
         SAVRTN
         STW,AC1  NMPWMAX           SAVE MAX SIZE
         STW,X1   NMFC              SAVE STARTING CHARACTER
         LI,AC2   0
*
NMLP     LB,AC1   0,X1              LOOP FOR TERMINAL CHARACTER TEST
         LI,X2    SZTCNM            SIZE OF TERMINAL CHARACTER TABLE
         CB,AC1   TCNM,X2           TEST FOR TERMINAL CHARACTER
         BE       TCFND                 FOUND
         BDR,X2   %-2                   NOT FOUND, TEST AGAIN
*
         AI,AC2   1                 INCREMENT NAME CHARACTER COUNTER
         AI,X1    1                 INCREMENT CHARACTER POINTER
         CW,AC2   NMPWMAX           TEST FOR MAX CHARS
         BGE      TCFND
         B        NMLP
*
*
TCFND    EQU      %
         CI,AC2   0                 ANY NAME CHARACTERS FOUND?
         BE       NMRTN                 NO, RETURN
         LW,AC1   DSCRTYPE
         B        *AC3              NAME OR PW RETURN
*
*
         PAGE
*
*
NMFIN    EQU      %
         CI,AC1   NM                TEST FOR NAME DESCR.
         BNE      NMRTN               NO, RETURN
         LW,D2    AC2               GET RESULT
         BEZ      NMRTN
         PUT,D2   #NCNM             STORE NUMBER OF CHARS IN CMDSTA
         LW,D2    NMFC
         PUT,D2   #NM               STORE STARTING CHAR IN CMDSTA
*
NMRTN    EQU      %
         RETURN
*
*
TCNM     EQU      %
         DATA,1   ' '               FIRST CHAR NOT TESTED
         DATA,1   #CR,#LF,#ATTN     ACTIVATION CHARS
         DATA,1   ' ','.','(',')',';','/',','
SZTCNM   EQU      BA(%)-BA(TCNM)-1
         BOUND    4
*
         PAGE
*
*        TEST FOR CHARACTER STRING DESCRIPTOR
*
*
CS1TEST  EQU      %
         SAVRTN
         LI,AC1   0                 NO SEMI-COLON ALLOWED
         B        CSTEST
*
CS2TEST  EQU      %
         SAVRTN
         LI,AC1   1                 SEMI-COLON ALLOWED
         B        CSTEST
*
CS3TEST  EQU      %
         SAVRTN
         LI,AC1   0                 ALLOWED IN FIRST CHAR
         LB,AC2   0,X1              TEST FIRST CHAR
         CI,AC2   ';'               FOR SEMI-COLON
         BNE      CSTEST            NO
         STW,X1   CSFC              SAVE FIRST CHAR ADDR
         LI,AC2   1                 SET CS COUNT
         AI,X1    1                 INCREMENT CHAR POINTER
         B        STSCFLG
*
*
         PAGE
*
*
CSTEST   EQU      %
         LI,AC2   0                 INITIALIZE CS COUNT
         STW,X1   CSFC              SAVE FIRST CHAR ADDR
STSCFLG  EQU      %
         STW,AC1  SCFLG             SEMI-COLON FLAG
*
CSLP     EQU      %
         LB,AC1   0,X1              GET NEXT CHAR
         CI,AC1   ';'               TEST FOR SEMI-COLON
         BE       SCFND
         CI,AC1   #ATTN             TEST FOR ATTN
         BE       CSFIN
         CI,AC1   #CR               TEST FOR CR
         BE       CSFIN
*
INCTR    EQU      %
         AI,AC2   1                 INCR CHAR COUNTER
         AI,X1    1                 INCR POINTER
         B        CSLP              GET NEXT CHAR
*
*
         PAGE
*
*
SCFND    EQU      %
         MTW,0    SCFLG             TEST SC FLAG
         BGZ      INCTR             SEMI-COLON ALLOWED
*
CSFIN    EQU      %
         LW,X2    DSCRTYPE          GET DESCRIPTOR TYPE
         CI,X2    CS3               CHECK FOR CS TEST
         BG       CSRTN               NO,RETURN
         AI,X2    -CS1+1              YES, GET TABLE INDEX
         BLEZ     CSRTN               <0, NO CS TEST
*
         LW,D2    AC2               CS DESCRIPTOR, SET CMDSTA
         BEZ      CSRTN
         PUT,D2      #NCCS,X2
         LW,D2    CSFC
         PUT,D2      #CS,X2
*
CSRTN    EQU      %
         RETURN
         PAGE
*
* TEST FOR DOCUMENT DESCRIPTORS
*
* DSCRTYPE = 4 FOR 'GET'
*            5 FOR 'STORE'
*            6 FOR 'DELETE'
*
DOCTEST  EQU      %
         SAVRTN
         STW,X1   DOCFC             SAVE STARTING CHARACTER
         LI,AC2   0                 INITIALIZE CHAR COUNTER
         STW,AC2  DOCCTR
*
         BAL,SRTN NMTEST            TEST FOR DOCUMENT NAME (REQUIRED)
         LW,D2    AC2               GET NUMBER OF CHARS
         BEZ      DOCFIN            NAME NOT FOUND, RETURN
         PUT,D2   #NCDOCNM
         LW,D2    DOCFC             NAME FOUND, SET CMDSTA ENTRIES
         PUT,D2   #DOCNM
*
         AWM,AC2  DOCCTR            UPDATE DESCRIPTOR COUNTER
         PAGE
*
*        TEST FOR ACCOUNT NUMBER IF 'GET' DESCRIPTOR
*
         LW,AC1   DSCRTYPE          GET DESCRIPTOR TYPE
         CI,AC1   GD                TEST FOR 'GET' DESCRIPTOR
         BNE      TSTDOCID              NO, GO TEST FOR OP ID
         LB,AC1   0,X1              GET NEXT CHAR
         CI,AC1   '.'               TEST FOR PERIOD
         BNE      TSTDOCID              NO, NOT ACCOUNT NUMBER
         AI,X1    1                 INCREMENT CHAR POINTER
         STW,X1   DOCFC             SAVE FIRST CHAR
*
         BAL,SRTN PWTEST            TEST FOR ACCOUNT NUMBER
         LW,D2    AC2
         BNEZ     FNDACCT               FOUND
         AI,X1    -1                    NOT FOUND, DECREMENT CHAR PTR
         B        DOCFIN
*
FNDACCT  EQU      %
         PUT,D2   #NCACCT
         LW,D2    DOCFC             SET CMDSTA ENTRIES
         PUT,D2   #ACCT
*
         AI,AC2   1                 UPDATE DESCRIPTOR COUNTER
         AWM,AC2  DOCCTR
*
*
         PAGE
*
*        TEST FOR DOCUMENT ID IF 'STORE' DESCRIPTOR
*
TSTDOCID EQU      %
         LW,AC1   DSCRTYPE
         CI,AC1   SD                TEST FOR 'STORE' DESCRIPTOR
         BNE      TSTGETPW              NO, GO TEST FOR GET PASSWORD
*
         LB,AC1   0,X1              GET NEXT CHAR
         CI,AC1   ';'               TEST FOR SEMI-COLON
         BNE      DOCFIN                NO, NOT DOCUMENT ID
         AI,X1    1                 INCREMENT CHAR POINTER
         STW,X1   DOCFC             SAVE FIRST CHAR
*
         BAL,SRTN CS1TEST           TEST FOR DOCUMENT ID
         LW,D2    AC2
         BLEZ     TSTGETPW             NOT FOUND, TEST FOR GET PW
*
FNDDOCID EQU      %
         PUT,D2   #NCDOCID
         LW,D2    DOCFC             SET CMDSTA ENTRIES
         PUT,D2   #DOCID
*
         AI,AC2   1
         AWM,AC2  DOCCTR            UPDATE  DESCRIPTOR COUNTER
*
*
         PAGE
*
*        TEST FOR GET PASSWORD IF 'GET' OR 'STORE' DESCRIPTOR
*
TSTGETPW EQU      %
         LW,AC1   DSCRTYPE
         CI,AC1   DD                TEST FOR DELETE DESCRIPTOR
         BE       TSTDELPW              YES, GO TEST FOR DEL PASSWORD
*
         LB,AC1   0,X1              GET NEXT CHAR
         CI,AC1   ';'               TEST FOR SEMI-COLON
         BNE      DOCFIN                NO, DESCRIPTOR DONE
         AI,X1    1                     YES, INCREMENT CHAR POINTER
         STW,X1   DOCFC             SAVE FIRST CHAR
*
         BAL,SRTN PWTEST            TEST FOR PASSWORD
         LW,D2    AC2
         BNEZ     FNDGETPW              FOUND
         AI,X1    -1                    NOT FOUND, DECREMENT CHAR PTR
         B        DOCFIN
*
FNDGETPW EQU      %
         PUT,D2   #NCGETPW
         LW,D2    DOCFC             SET CMDSTA ENTRIES
         PUT,D2   #GETPW
*
         AI,AC2   1
         AWM,AC2  DOCCTR            UPDATE DESCRIPTOR COUNTER
*
*
         PAGE
*
*        TEST FOR DELETE PASSWORD IF 'STORE' OR 'DELETE' DESCRIPTOR
*
TSTDELPW EQU      %
         LW,AC1   DSCRTYPE
         CI,AC1   GD                TEST FOR 'GET' DESCRIPTOR
         BE       DOCFIN                YES, SKIP DEL PW TEST
*
         LB,AC1   0,X1              GET NEXT CHAR
         CI,AC1   ';'               TEST FOR SEMI-COLON
         BNE      DOCFIN                NO, DESCRIPTOR DONE
         AI,X1    1                     YES, INCREMENT CHAR POINTER
         STW,X1   DOCFC             SAVE FIRST CHAR
*
         BAL,SRTN PWTEST            TEST FOR PASSWORD
         LW,D2    AC2
         BNEZ     FNDDELPW              FOUND
         AI,X1    -1                    NOT FOUND, DECREMENT CHAR PTR
         B        DOCFIN
*
FNDDELPW EQU      %
         PUT,D2   #NCDELPW
         LW,D2    DOCFC             SET CMDSTA ENTRIES
         PUT,D2   #DELPW
*
         AI,AC2   1
         AWM,AC2  DOCCTR            UPDATE DESCRIPTOR COUNTER
*
*
*
DOCFIN   EQU      %
         LW,AC2   DOCCTR
         RETURN
*
         PAGE
*
* S32DELLB -- DELETE LEADING OR TRAILING BLANKS
*
*
S32DELLB EQU      %
         SAVRTN
*
         LI,AC3   #BLANK            GET BLANK FOR COMPARE
TSTLBLP  EQU      %
         CB,AC3   0,X1              TEST NEXT CHAR FOR BLANK
         BNE      RTNDELLB             NO, RETURN
         AI,X1    1                    YES, INCR POINTER
         B        TSTLBLP           TEST NEXT CHAR
*
RTNDELLB EQU      %
         RETURN
*
*
*
*
*
32D      CSECT    0                 START OF LOCALS
*
DSCRTYPE RES      1                 DESCRIPTOR TYPE
*
OSFLG    RES      1                 OFFSET FLAG
WLN      RES      1                 WHOLE LINE NUMBER
FLN      RES      1                 LINE NUMBER INCREMENT
*
CSFC     RES      1
SCFLG    RES      1                 SEMI-COLON FLAG
*
NMFC     RES      1                 NM FIRST CHAR
NMPWMAX  RES      1                 MAX SIZE FOR NAME/PW
*
DOCFC    RES      1                 FIRST CHAR ADDR FOR GD,SD,DD
DOCCTR   RES      1                 CHAR COUNTER FOR GD,SD,DD
*
         USECT    #PLOC
         END
