// DATE 210620
// NOHALT
*
*** RUN MAINT.
*
// LOAD $MAINT,F1
// RUN
// COPY FROM-READER,TO-F1,RETAIN-R,LIBRARY-S,NAME-$UFFE
       MACRO
       $UFFE
.*
.*     5703-XM1 SEARCH FOR VOLUME ID
.*
       TEXT
       TITLE 'SUFFER - FILE SPECIFICATION CHECKER'
***********************************************************************
* 5703-XM1  COPYRIGHT IBM CORP. 1970                                  *
*           REFER TO INSTRUCTIONS ON COPYRIGHT NOTICE  120-2083       *
*                                                                     *
***********************************************************************
*STATUS                                                               *
*   VERSION 1 MODIFICATION 0                                          *
*                                                                     *
*FUNCTION                                                             *
*   THE FUNCTION OF SUFFER IS TO SYNTAX CHECK A FILE SPECIFICATION    *
*   AND SCAN TO THE FIRST NON-DELIMITER FOLLOWING A VALID ONE.        *
*   A SPECIFICATION CAN CONSIST OF ANY OF THE FOLLOWING:              *
*   *  FILENAME / PASSWORD / VOL-D                                    *
*   *  FILENAME / PASSWORD                                            *
*   *  FILENAME                                                       *
*   *  **FILENAME / VOL-ID                                            *
*   *  **FILENAME                                                     *
*   *  *FILENAME / VOL-ID                                             *
*   *  *FILENAME                                                      *
*                                                                     *
*ENTRY POINTS                                                         *
*   SUFFER - FIRST LOCATION IN PROGRAM. SUFFER EXPECTS INDEX          *
*            REGISTER 2 (@XR) TO BE ADDRESSING THE LEFTMOST CHARACTER *
*            OF THE FILE SPECIFICATION. THE CALLING SEQUENCE IS:      *
*                    B     SUFFER                                     *
*                                                                     *
*INPUT                                                                *
*   INPUT TO SUFFER IS INDE, REGISTER 2 (@XR) ADDRESSING THE LEFTMOST *
*   CHARACTER OF THE FILE-SPECIFICATION TO BE SYNTAX CHECKED.         *
*                                                                     *
*OUTPUT                                                               *
*   OUTPUT FROM SUFFER UPON NORMAL EXIT IS INDEX REGISTER 2 (@XR)     *
*   ADDRESSING THE FIRST NON-DELIMITER FOLLOWING THE FILE SPECIFICA-  *
*   TION. THE FILENAME WILL BE SAVED IN SMFNAM IN TSMLES. THE PASS-   *
*   WORD IF SPECIFIED WILL BE SAVED IN SMPSWD 1N TSMLES, OTHERWISE IT *
*   WILL BE BLANKS. (NOTE: ** OR * FILENAMES, WHEN SPECIFIED, WILL    *
*   CAUSE THE *'S TO BE SAVED IN SMPSWD). THE VOL-ID, IF SPECIFIED,   *
*   WILL BE SAVED IN SMVOID IN TSMLES, OTHERWISE A BLANK IS MOVED     *
*   TO SMVOID AS AN INDICATOR.                                        *
*   OUTPUT FROM SUFFER UPON ERROR EXIT IS INDEX REGISTER 2 (@XR)      *
*   ADDRESSING THE INVALID CHARACTER (SEE EXITS,ERROR). THE PROGRAM   *
*   STATUS REGISTER (@PSR) WILL CONTAIN A LOW CONDITION CODE.         *
*                                                                     *
*EXTERNAL REFERENCES                                                  *
*        SALPHR - ADDR IN SALPHA - SYNTAX CHECKED PARAMETER           *
*        SALPH6 - ENTRY TO SALPHA - SYNTAX CHECK VOL-ID               *
*        SALPH8 - ENTRY TO SALPHA - SYNTAX CHECK PASSWORD; FILENAME   *
*        SAL375 - SAVE AREA IN SALPHA - ERROR POINTER SAVE AREA       *
*        SCANIT - DELIMITER SCAN MODULE                               *
*        SCAMMA - SWITCH IN SCANIT - DELIMITER SCAN TYPE INDR         *
*        SCACOF - MASK IN SCANIT TO BYPASS BLANKS ONLY                *
*        SCACOM - MASK IN SCANIT - BYPASS 1 COMMA                     *
*        SCACNT - COUNTER IN SCANIT - NUMBER OF SCANNED BLANKS        *
*        TSMLES - DATA MANAGEMENT COMMUNICATIONS REGIONS              *
*        $CAERR - ADDR IN SYSTEM NUCLEUS-ERROR CODE SAVE AREA         *
*                                                                     *
*EXITS, NORMAL                                                        *
*   NEXT SEQUENTIAL INSTRUCTION IN CALL ROUTINE. INDEX REGISTER       *
*   2 (@XR) WILL BE ADDRESSING THE FIRST NON-DELIMITER FOLLOWING      *
*   THE FILE SPECIFICATION. THE PROGRAM STATUS REGISTER (@PSR)        *
*   WILL CONTAIN A NON-LOW CONDITION CODE.                            *
*                                                                     *
*EXITS, ERROR                                                         *
*   NEXT SEQUENTIAL INSTRUCTION IN CALL ROUTINE. INDEX REGISTER       *
*   2 (@XR) WILL BE ADDRESSING THE LEFTMOST BYTE OF AN INVALID        *
*   PARAMETER OR WILL BE ADDRESSING AN INVALID DELIMITER IN THE       *
*   FILE SPECIFICATION. THE PROGRAM STATUS REGISTER (@PSR)            *
*   WILL CONTAIN A LOW CONDITION CODE.                                *
*                                                                     *
*TABLES/WORK AREAS                                                    *
*   SUFFER DOES NOT CONTAIN ANY TABLES OR WORK AREAS.                 *
*                                                                     *
*ATTRIBUTES                                                           *
*   RELOCATABLE,REUSABLE                                              *
*                                                                     *
*CHARACTER CODE DEPENDENCY                                            *
*   CHARACTER CODE DEPENDENCY CLASS - C                               *
*   THE OPERATION OF THIS MODULE DEPENDS UPON AN INTERNAL REPRESENTA- *
*   TION OF THE EXTERNAL CHARACTER SET WHICH IS EQUIVALENT TO THE     *
*   USED AT ASSEMBLY TIME. THE CODING HAS BEEN ARRANGED SO  THAT RE-  *
*   DEFINITION OF CHARACTER CONSTANTS, BY REASSEMBLY, WILL RESULT IN  *
*   A CORRECT MODULE FOR THE NEW DEFINITIONS. THE FOLLOWING ARE THE   *
*   SPECIAL CONSIDERATIONS FOR THIS MODULE:                           *
*      * @ASTER - PART OF @SYSEQ                                      *
*      * @SLASH - PART OF @SYSEQ                                      *
*      * @COMMA - PART OF @SYSEQ                                      *
*      * @EOS   - PART OF @SYSEQ                                      *
*      * @BLANK - PART OF @SYSEQ                                      *
*      * CHARACTER LEFT PARENTHESIS - C'('                            *
*                                                                     *
*NOTES                                                                *
*   ERROR PROCEDURES                                                  *
*      THE FOLLOWING ERROR CONDITIONS WILL CAUSE SUFFER TO RETURN A   *
*      LOW CONDITION CODE TO THE CALL ROUTINE AND INDEX REGISTER 2    *
*      (@XR) ADDRESSING THE ERROR:                                    *
*         * ANY ERROR RETURNED FROM SALPHA (NOTE SALPHA ERRORS).      *
*         * ANY ERROR RETURNED FROM SCANIT (NOTE SCANIT ERRORS).      *
*         * ANY INVALID DELIMITER FOLLOWING THE SPECIFICATION         *
*         * ANY INVALID PARAMETER WITHIN THE SPECIFICATION.           *
*         NOTE MODIFICATION CONSIDERATIONS.                           *
*                                                                     *
*   REGISTER USAGE                                                    *
*      INDEX RESISTER 1 (@BR) IS SAVED AND RESTORED FOR THE CALL      *
*      ROUTINE AND USED AS A BASE FOR ADDRESSING WITHIN THE MODULE.   *
*      INDEX REGISTER 2 (@XR) IS USED AS AN INDEX TO SCAN THE FILE    *
*      SPECIFICATION.                                                 *
*                                                                     *
*   SAVED/RESTORED AREAS                                              *
*      N/A                                                            *
*                                                                     *
*   MODIFICATION CONSIDERATIONS                                       *
*      SUFFER'S NORMAL DELIMITER SCAN UPON EXIT ALLOWS ONLY BLANKS    *
*      AND 1 COMMA FOLLOWING THE FILE-SPECIFICATION. AN EXCEPTION     *
*      TO THIS USE (UTILIZED BY THE MODULE KALLOC) IS THE OPTION OF   *
*      HAVING A LEFT PARENTHESIS IE. '(' FOLLOWING THE FILE SPECI-    *
*      FICATION INSTEAD OF A COMMA. THIS USE IS EFFECTED BY           *
*      MODIFYING THE Q-CODE OF THE INSTRUCTION LABELED SUF625 WITH A  *
*      BRANCH EQUAL CONDITION CODE.                                   *
*                                                                     *
*   REQUIRED MODULES                                                  *
*      SALPHA - FILENAME, PASSWORD, VOL-ID ALPHAMERIC SYNTAX CHECKER  *
*      SCANIT - DELIMITER SCAN ROLTINE                                *
*      TSMLES - DATA MANAGEMENT COMMUNICATION REGIONS                 *
*      @DIREQ - SYSTEM LIBRARY DIRECTORY EQUATES                      *
*      @ERMEQ - ERROR MESSAGE EQUATES                                 *
*      @FXDEQ - COMMON CORE LOCATIONS WITHIN THE SYSTEM NUCLEUS       *
*      @SYSEQ - COMMON SYSTEM SOFTWARE EQUATES                        *
*                                                                     *
*   OTHER                                                             *
*      N/A                                                            *
***********************************************************************
       EJECT
***********************************************************************
*
*            INITIALIZATION OF MODULE
*
***********************************************************************
*
*SUFFER ENTER BASE=SUFBSE,EXIT=SUFND,@BR,,@ARR
       USING SUFBSE,@BR                BASE ADDRESS SPECIFICATION
SUFFER EQU   *                         MODULE ENTRY POINT
       ST    SUFND0+@OP1,@BR           SAVE @BR
       LA    SUFBSE,@BR                LOAD BASE REGISTER
       ST    SUFND2+@OP1(,@BR),@ARR    SAVE RETURN ADDRESS
*** END OF EXPANSION ***
       SPACE
***********************************************************************
*
*            INITIALIZE FIELDS IN TSMLES
*
***********************************************************************
*
       MVI   SMPSWD,@BLANK             BLANK ALL OF PASSWORD FIELD
       MVC   SMPSWD-@B1(##LPEN-@B1),SMPSWD
       MVI   SMVOID-@VOLID+@B1,@BLANK  BLANK FIRST BYTE OR VOL-1D
       SPACE
***********************************************************************
*
*            CHECK FOR AND PROCESS POOLED AND IBM FILENAMES
*
***********************************************************************
*
       CLI   @ZERO(,@XR),@ASTER        ASTERISK IN FILENAME ?
       JNE   SUF100                    NO, PROCESS FILENAME
       MVI   SMPSWD-##DPEN,@ASTER      SAVE * IN SMPSWD
       LA    @B1(,@XR),@XR             INCREMENT XR BY ONE
       CLI   @ZERO(,@XR),@ASTER        ASTERISK IN FILENAME ?
       JNE   SUF100                    NO, PROCESS FILENAME
       MVI   SMPSWD-##DPEN+@B1,@ASTER  SAVE * IN SMPSWD
       LA    @B1(,@XR),@XR             INCREMENT XR BY ONE
       SPACE
***********************************************************************
*
*            PROCESS FILENAME
*
***********************************************************************
*
SUFBSE EQU   *                         BASE ADDR IN MODULE
SUF100 MVI   SCAMMA,SCACOF             PRIME SCANIT
       B     SALPH8                    SYNTAX CHECK FILENAME
       BL    SUF750(,@BR)              TAKE ERROR EXIT
       MVC   SMFNAM(##LUEN),SALPHR+##DUEN  SAVE FILENAME
       CLI   @ZERO(,@XR),@SLASH        IS A SLASH DELIMITER PRESENT ?
       JNE   SUF600                    NO, RETURN TO USER
       CLI   SMPSWD-##DPEN,@ASTER      SHOULD A PASSWORD BE CHECKED?
       JE    SUF200                    NO, CHECK VOL-ID
       SPACE
***********************************************************************
*
*            PROCESS PASSWORD
*
***********************************************************************
*
       LA    @B1(,@XR),@XR             INCREMENT XR BY ONE
       B     SCANIT                    BYPASS BLANKS
       B     SALPH8                    SYNTAX CHECK PASSWORD
       BL    SUF750(,@BR)              TAKE ERROR EXIT
       MVC   SMPSWD(##LPEN),SALPHR+##DPEN  SAVE PASSWORD
       CLI   @ZERO(,@XR),@SLASH        IS SLASH DELIMITER PRESENT ?
       JNE   SUF600                    NO, RETURN TO USER
       SPACE
***********************************************************************
*
*            PROCESS VOL-ID
*
***********************************************************************
*
SUF200 LA    @B1(,@XR),@XR             INCREMENT XR BY ONE
       B     SCANIT                    BYPASS BLANKS
       B     SALPH6                    SYNTAX CHECK VOL-ID
SUF400 BL    SUF750(,@BR)              TAKE ERROR EXIT
       MVC   SMVOID(@VOLID),SALPHR+@VOLID-@B1  SAVE VALID
SUF600 CLI   @ZERO(,@XR),C'('          IS THIS '(' ?
SUF625 JC    SUF800,@NOP               JUMP IF '(' VALID ADJACENT
       CLI   SCACNT,@ZERO              ANY BLANKS SCANNED ?
       JNE   SUF650                    YES, CONTINUE DELIMITER SCAN
       CLI   @ZERO(,@XR),@EOS          IS IT EOS ?
       JE    SUF800                    YES, RETURN
       CLI   @ZERO(,@XR),@COMMA        IS IT A COMMA ?
       JNE   SUF680                    NO, ERROR EXIT
*
SUF650 ST    SAL375+@OP1,@XR           SAVE ERROR POINTER
       MVI   SCAMMA,SCACOM             MODIFY SCANIT TO BYPASS COMMA
       B     SCANIT                    BYPASS DELIMITERS
       JL    SUF750                    ERROR - RETURN
       SPACE
***********************************************************************
*
*            MODIFY PSR FOR ERROR INDICATION
*
***********************************************************************
*
       CLI   @ZERO(,@XR),C'('          IS IT '(' ?
       JNE   SUF800                    NO, RETURN
       MVI   SUF680+@Q(,@BR),@@E139    INVALID DELIMITER
SUF680 MVI   $CAERR,*-*                ERROR CODE
       ORG   SUF680                    INITIALIZE INSTRUCTION
       MVI   $CAERR,@@E131             INVALID PARAMETER
*
       L     SAL375+@OP1,@XR           RESTORE ERROR POINTER
SUF750 L     SUF400+@Q(,@BR),@PSR         LOAD CONDITION LOW INTO PSR
SUF780 J     SUFND0                    ERROR EXIT
       SPACE
***********************************************************************
*
*            END OF MODULE PROCESSING
*
***********************************************************************
*
SUF800 L     SUF780+@Q(,@BR),@PSR      LOAD CODE FOR NORMAL EXIT
*SUFND  EXIT  @BR,,RETURN
SUFND0 LA    *-*,@BR                   RESTORE @BR
SUFND2 B     *-*                       RETURN TO CALLING PROGRAM
*** END OF EXPANSION ***
***                       END OF SUFFER                             ***
       MEND
// CEND
// END
*
// READER CONSOLE
