// DATE 090622
// NOHALT
*
*** RUN MAINT.
*
// LOAD $MAINT,F1
// RUN
// COPY FROM-READER,TO-F1,RETAIN-R,LIBRARY-S,NAME-$LLST
       MACRO
       $LLST
.*
.*     5703-XM1 SCANS A LINE NUMBER LIST
.*
       TEXT
       TITLE 'SLLIST - SCANS A LINE NUMBER LIST'
***********************************************************************
* 5703-XM1  COPYRIGHT IBM CORP. 1970                                  *
*           REFER TO INSTRUCTIONS ON COPYRIGHT NOTICE  120-2083       *
*                                                                     *
***********************************************************************
*STATUS                                                               *
*   VERSION 1 MODIFICATION 0                                          *
*                                                                     *
*FUNCTION                                                             *
*   SLLIST SCANS ACROSS A LINE NUMBER LIST, CHECKING THE SYNTAX OF    *
*   THE LIST AND CONVERTING THE DECIMAL LINE NUMBERS TO BINARY.       *
*   THESE CONVERTED LINE NUMBERS ARE SAVED IN A BUFFER, SLLINE, WHICH *
*   CONTAINS A TWO-BYTE ENTRY FOR EACH LINE NUMBER AND A ONE-BYTE     *
*   LINE NUMBER RANGE INDICATOR (THE EBCDIC CODE, FOR A DASH) BETWEEN *
*   LINE NUMBERS OF A RANGE.  A CARRIAGE RETURN CODE TERMINATES       *
*   SLLINE.                                                           *
*                                                                     *
*ENTRY POINTS                                                         *
*   * THE ENTRY POINT IS SLLIST.  THE BASE REGISTER IS SAVED ON ENTRY *
*     AND RESTORED BEFORE EXIT TO THE CALLING ROUTINE.                *
*   * THE CALLING SEQUENCE IS AS FOLLOWS:                             *
*        B     SLLIST                                                 *
*                                                                     *
*INPUT                                                                *
*   THE INPUT TO SLLIST IS A LINE NUMBER LIST WHICH WILL BE SYNTAX    *
*   CHECKED AND CONVERTED.  SLLIST EXPECTS @XR TO POINT TO THE FIRST  *
*   CHARACTER TO BE TESTED.                                           *
*                                                                     *
*OUTPUT                                                               *
*   THE OUTPUT FROM SLLIST IS THE BUFFER, SLLINE, WHICH CONTAINS THE  *
*   CONVERTED LINE NUMBER LIST TERMINATED BY A CARRIAGE-RETURN CODE.  *
*                                                                     *
*EXTERNAL REFERENCES                                                  *
*   * $CAERR - NUCLEUS LOCATION FOR ERROR CODE.                       *
*   * SCANIT - ENTRY TO DELIMITER SCAN ROUTINE.                       *
*   * C4BIN2 - ENTRY TO ROUTINE TO CONVERT DECIMAL TO BINARY.         *
*                                                                     *
*EXITS,NORMAL                                                         *
*   NORMAL EXIT IS TO THE FIRST INSTRUCTION FOLLOWING THE BRANCH TO   *
*   SLLIST.  THE @PSR WILL BE SET TO THE BRANCH NOT LOW CONDITION TO  *
*   INDICATE A GOOD RETURN.                                           *
*                                                                     *
*EXITS,ERROR                                                          *
*   ERROR EXIT IS ALSO MADE TO THE FIRST INSTRUCTION FOLLOWING THE    *
*   BRANCH TO SLLIST.  IN THIS CASE, @PSR IS SET TO 'BRANCH LOW AND   *
*   $CAERR CONTAINS THE APPROPRIATE ERROR CODE.                       *
*                                                                     *
*TABLES/WORKAREAS                                                     *
*   SLLIST CREARES A BUFFER, SLLINE, WHICH HAS A MAXIMUM LENGTH OF    *
*   210 BYTES, IS DEFINED BY THE USER, AND CONTAINS THE BINARY        *
*   REPRESENTATION OF THE NUMBERS IN THE LINE-NUMBER LIST.  SINGLE    *
*   LINE NUMBERS REQUIRE A TWO-BYTE ENTRY AND LINE NUMBER RANGES      *
*   EACH REQUIRE FIVE BYTES (TWO BYTES FOR THE LOW LIMIT LINE NUMBER, *
*   ONE BYTE FOR THE EBCDIC CODE FOR A DASH, AND TWO BYTES FOR THE    *
*   HIGH LIMIT LINE NUMBER).  AN EOS CODE TERMINATES SLLINE.          *
*                                                                     *
*ATTRIBUTES                                                           *
*   SLLIST IS RELOCATABLE                                             *
*                                                                     *
*CHARACTER CODE DEPENDENCY                                            *
*   THE OPERATION OF THIS MODULE DOES NOT DEPEND ON ANY PARTICULAR    *
*   INTERNAL REPRESENTATION OF THE EXTERNAL CHARACTER SET.            *
*                                                                     *
*NOTES                                                                *
*   ERROR PROCEDURES                                                  *
*      SLLIST RETURNS TO THE CALLING RTN WITH THE PSR SET TO BRANCH   *
*      LOW IF AN ERROR CONDITION IS ENCOUNTERED. THE APPROPRIATE      *
*      ERROR CODE WILL BE SET IN $CAERR.                              *
*                                                                     *
*   REGISTER USAGE                                                    *
*      * UPON ENTRY TO SLLIST.  REGISTER 2 (@XR) MUST BE POINTING TO  *
*        THE FIRST LINE NUMBER TO BE CHECKED. UPON RETURN FROM SLLIST,*
*        @XR WILL BE POINTING TO THE INVALID CHARACTER IF AN ERROR IS *
*        DETECTED, TO THE CARRIAGE RETURN CHARACTER IF THE LIST IS    *
*        GOOD, OR TO THE NEXT CHARACTER FOLLOWING A VALID LIST IF     *
*        SLLIND IS SET TO RETURN (SLLRET MOVED TO SLLIND).            *
*      * REGISTER 1 (@BR) IS SAVED UPON ENTRY TO SLLIST AND IS USED   *
*        BY SLLIST TO CONTAIN THE CURRENT ADDRESS BEING REFERENCED IN *
*        SLLINE.                                                      *
*      * UPON ENTRY TO SLLIST, REGISTER 8 (@ARR) IS STORED AS THE     *
*        RETURN ADDRESS TO THE CALLING ROUTING AFTER CHECKING IS      *
*        COMPLETED.                                                   *
*                                                                     *
*   SAVE/RESTORED AREAS                                               *
*      NONE                                                           *
*                                                                     *
*   MODIFICATION CONSIDERATIONS                                       *
*      NONE                                                           *
*                                                                     *
*   REQUIRED MODULES                                                  *
*      * THE FOLLOWING EQUATE MODULES ARE USED IN SLLIST:             *
*         * @SYSEQ - COMMON SYSTEM EQUATES                            *
*         * @FXDEQ - NUCLEUS FIXED ADDRESS EQUATES                    *
*         * @ERMEQ - ERROR MESSAGE EQUATES (SELECTED ERROR CODES)     *
*      * THE FOLLOWING SOURCE MODULES ARE ALSO USED IN SLLIST:        *
*         * SCANIT - DELIMITER SCAN ROUTINE                           *
*         * C4BIN2 - ROUTINE TO CONVERT DECIMAL TO BINARY             *
*                                                                     *
*   OTHER                                                             *
*      IF THE CALLING ROUTINE DESIRES THAT A LINE-NUMBER LIST BE      *
*      CONSIDERED VALID IF IT IS FOLLOWED BY ANOTHER PARAMETER,       *
*      SLLRET SHOULD BE MOVED TO SLLRET BEFORE CALLING SLLIST.        *
***********************************************************************
       EJECT
SLLIST EQU   *                         ENTRY POINT TO THIS SUBROUTINE
*
       ST    SLL220+@OP1,@BR           SAVE BASE REGISTER
       ST    SLL230+@OP1,@ARR          SAVE RETURN ADDRESS
       LA    SLLINE-SLLLN2,@BR         INITIALIZE SLLINE POINTER
*
SLL100 B     C4BIN2                    CONVERT LINE NO. TO BINARY
       JL    SLL210                    IF ERR IN C4BIN2, CALL ERR PROG
       JZ    SLL180                    CHECK FOR EOS IF NO NUMBER FOUND
*
*            INTEGER WAS FOUND
*
       MVC   SLL003(,@BR),C4BVAL(SLLLN2) MOVE INTEGER TO BFR
SLL110 JC    SLL115,@NOP+*-*           UCB EXCEPT FOR FIRST LINE NO.
       MVI   SLL110+@Q,@UCB            SET OFF 'FIRST' INDR
       J     SLL120                    GO CHECK FOR DELIMITERS
       SPACE
SLL115 CLC   SLL001(,@BR),SLL003(SLLLN2,@BR) THIS INTG > LAST INTG ?
       JL    SLL120                    YES, GO CHECK FOR DELIMITERS
       MVI   SLL165+@Q,@UCB            SET SW TO TAKE ERR IF VALID INTG
       MVC   SLL200+@OP1(SLLLN2),C4BSAV  SET PTR TO THIS NUMBER
SLL120 LA    SLL002(,@BR),@BR          POINT BR PTR TO THIS ENTRY
       B     SCANIT                    BYPASS BLANKS
       CLI   0(,@XR),SLLDSH            CHAR AFTER INTG = '-' ?
       JNE   SLL150                    NO, CHECK FOR COMMA
*
*            LINE NUMBER FOLLOWED BY A DASH
*
       LA    1(,@XR),@XR               PT XR PAST DASH
       MVC   SLL125+@OP1,C4BSAV(@REGL) SAVE PTR TO FIRST NO. IN RANGE
       B     SCANIT                    BYPASS BLANKS
       B     C4BIN2                    CONVEFT NO. TO BINARY
       JL    SLL210                    ERR IF MORE THAN 4 DIGITS FOUND
       JNZ   SLL130                    JUMP IN INTG FOUND
*
       CLI   0(,@XR),@EOS              IS THIS AN OPEN RANGE ?
       JE    SLL125                    YES, SET OPEN RANGE ERR CODE
       CLI   0(,@XR),@COMMA            IS THIS AN OPEN RANGE ?
       JNE   SLL195                    NO, INV CHAR IN LINE NO. ERRO
*
SLL125 LA    *-*,@XR                   RESTORE XR TO FIRST NO. IN RANGE
       MVI   $CAERR,@@E123             ERR, UNBALANCED LINE NO. SERIES
       J     SLL215                    ERROR EXIT
       EJECT
*
*            MOVE DASH AND HIGH LIMIT TO SLLINE
*
SLL130 MVI   SLL002(,@BR),SLLDSH       SET DASH IN SLLINE
       MVC   SLL003+1(,@BR),C4BVAL(SLLLN2)  MOVE IN HIGH LIMIT OF RANGE
       CLC   SLL001(,@BR),SLL003+1(SLLLN2,@BR)  HIGH LIMIT > LOW LIMIT ?
       JL    SLL140                    YES, GO INCR POINTER
       CLI   SLL165+@Q,@UCB            OUT OF ORD PAIR FOUND ALREADY ?
       JE    SLL140                    YES, DON'T SET SWITCH AGAIN
       MVI   SLL165+@Q,@UCB            ELSE, SET SW TO TAKE ERR EXIT
       MVC   SLL200+@OP1(SLLLN2),C4BSAV  SET PTR TO SECOND NO. IN RANGE
SLL140 LA    SLL003(,@BR),@BR          INCR PTR TO NEXT ENTRY
       B     SCANIT                    BYPASS BLANKS
SLL150 CLI   0(,@XR),@COMMA            INTG FOLLOWED BY COMMA ?
       JNE   SLL160                    NO, TEST FOR A BLANK
*
*            LINE NUMBER FOLLOWED BY COMMA
*
       LA    1(,@XR),@XR               PT XR PAST COMMA
       B     SCANIT                    BYPASS BLANKS
       CLI   0(,@XR),@EOS              COMMA FOLLOWED BY EOS ?
       JE    SLL215                    YES, ERR - DANGLING COMMA
       J     SLL165                    ELSE, G0 CHECK INTEGERS ASCENDING
       SPACE
SLL160 CLI   SCACNT,@ZERO              WERE ANY DELIMITERS FOUND ?
       JNZ   SLL165                    YES, GO CHECK FOR PROPER ORDER
       CLI   0(,@XR),@EOS              ELSE, IS XR REF AN EOS
       JNE   SLL195                    NO. ERR - INY CHAR IN LINE NO.
SLL165 JC    SLL200,@NOP+*-*           UCB IF THIS INTG < LAST INTG
       B     SLL100                    CHECK NEXT INTG
*
*            INTEGER NOT FOUND BY C4BIN2
*
SLL180 MVI   SLL002(,@BR),@SCTSZ-1     MOVE AN 'EOS' TO SLLINE
       CLI   SLL000(,@XR),@EOS         IS NEXT CHAR IN INPUT LINE EOS ?
SLL190 JC    SLL220,@BE+*-*            IF YES OR SLLIND IS ON. RETURN
*
SLL195 MVI   $CAERR,@@E120             SET ERR CODE FOR 'NON-NUNERIC
*                                      * CHAR IN LINE NO. OR INTO'
       J     SLL210                    RESTORE XR. SET PSR,AND RETURN
*
*            ERROR EXIT
*
SLL200 LA    *-*,@XR                   PT XR TO CORRECT LINE NUMBER
       MVI   $CAERR,@@E124             SET ERROR CODE FOR PARAMS NOT
       J     SLL215                    * IN ASCENDING ORDER
SLL210 L     C4BSAV,@XR                RETURN POINTER TO FIRST OF NO.
SLL215 L     SLLBLW,@PSR               SET PSR TO BRANCH LOW
*
*            RETURN TO CALLING PROGRAM
*
SLL220 LA    *-*,@BR                   RESTORE CALLERS' BASE REGISTER
SLL230 B     *-*                       RETURN TO CALLER
       EJECT
*
*            EQUATES USED IN SLLIST
*
SLL000 EQU   0                         DISP OF '0' FOR XR OR PTR
SLL001 EQU   1                         DISP OF '1' FOR XR OR PTR
SLL002 EQU   2                         DISP OF '2' FOR XR OR PTR
SLL003 EQU   3                         DISP OF '3' FOR PTR TO SLLINE
SLLLN2 EQU   2                         BINARY LENGTH OF TWO BYTES
SLLDSH EQU   C'-'                      HYPHEN SEPARATING RANGES
*
SLLIND EQU   SLL190+@Q                 LOC FOR SETTING SLLRET
SLLRET EQU   X'87'                     CODE FOR RETURN IF NOT EOS
*
*            CONSTANTS AND SAVE AREAS
*
SLLBLW DC    XL2'82'                   PSR CODE TO BRANCH LOW
       SPACE
***********************************************************************
***                       END OF SLLIST                             ***
       MEND
// CEND
// END
*
// READER CONSOLE
