// DATE 210620
// NOHALT
*
*** RUN MAINT.
*
// LOAD $MAINT,F1
// RUN
// COPY FROM-READER,TO-F1,RETAIN-R,LIBRARY-S,NAME-$ALPH
       MACRO
       $ALPH
.*
.*     5703-XM1 SYNTAX CHECK MODULE
.*
       TEXT
       TITLE 'SALPHA - SYNTAX CHECKER MODULE'
***********************************************************************
*  5703-XM1    COPYRIGHT IBM CORP. 1970                               *
*              REFER TO INSTRUCTIONS ON COPYRIGHT NOTICE, 120-2083    *
*                                                                     *
***********************************************************************
*STATUS                                                               *
*   VERSION 1 MODIFICATION 0                                          *
*                                                                     *
*FUNCTION                                                             *
*   THE FUNCTION OF SALPHA IS TO SYNTAX CHECK AN 8 CHARACTER OR 6     *
*   CHARACTER ALPHAMERIC PARAMETER DETERMINED BY THE ENTRY POINT,     *
*   SALPH8 OR SALPH6 RESPECTIVELY. ENTRY AT SALPHA IMPLIES A REQUEST  *
*   THAT THE FIRST CHARACTER BE ALPHABETIC. A SYNTACTICALLY CORRECT   *
*   PARAMETER WILL BE SAVED AT SALPHR (LEFTMOST BYTE ADDRESS), THE    *
*   COUNT OF THE NUMBER OF VALID CMARACTERS, IF NEEDED, IS FOOD IN    *
*   SALCNT. UPON ENTRY, SALPHA REQUIRES INDEX RESISTER 2 (OM TO BE    *
*   ADDRESSING THE FIRST CHARACTER 0, THE PARAMETER TO BE SYNTAX      *
*   CHECKED. UPON NORMAL RETURN INDEX REGISTER 2 (@XR) WILL BE        *
*   ADDRESSING THE FIRST NON-DELIMITER FOLLOWING THE PARAMETER (NOTE  *
*   INPUT),                                                           *
*                                                                     *
*ENTRY POINTS                                                         *
*   * SALPH8 - ENTRY POINT TO SYNTAX CHECK AN EIGHT CHARACTER         *
*              ALPHAMERIC PARAMETER WHOSE FIRST CHARACTER MUST BE     *
*              ALPHABETIC.                                            *
*   * SALPH6 - ENTRY POINT TO SYNTAX CHECK A SIX CHARACTER            *
*              ALPHAMERIC PARAMETER WHICH HAS NO RESTRICTIONS ON      *
*              THE TYPE OF THE FIRST CHARACTER. (NOTE MODIFICA-       *
*              TION CONSIDERATIONS)                                   *
*                                                                     *
*INPUT                                                                *
*   UPON ENTRY TO SALPHA, AT EITHER ENTRY POINT, INDEX REGISTER 2     *
*   (@XR) SHOULD BE ADDRESSING THE LEFTMOST CHARACTER OF THE PARAMETER*
*   TO BE SYNTAX CHECKED. ALSO, THE SWITCH 'SCAMMA' IN SCANIT SHOULD  *
*   BE SET FOR THE TYPE OF DELIMITER SCAN REQUESTED AFTER THE SYNTAX  *
*   CHECK. (IE. BLANKS ONLY OR BLANKS WITH 1 COMMA).                  *
*                                                                     *
*OUTPUT                                                               *
*   OUTPUT FROM SALPHA INCLUDES THE SYNTAX CHECKED PARAMETER AT SALPHR*
*   (LEFTMOST BYTE OF SAVE AREA) AND THE COUNT OF VALID CHARACTERS    *
*   IN SALCNT, AND INDEX REGISTER 2 (@XR) WILL BE POINTING AT THE     *
*   FIRST NON-DELIMITER AFTER THE PARAMETER. THE ONLY EXCEPTION TO    *
*   THIS IS UPON DETECTION OF AN ERROR (SEE ERROR EXITS AND PROC.)    *
*                                                                     *
*EXTERNAL REFERENCES                                                  *
*        SCANIT - DELIMITER SCAN MODULE                               *
*        $CAERR - ADDR IN SYSTEM NUCLEUS-ERROR CODE SAVE AREA         *
*                                                                     *
*EXITS, NORMAL                                                        *
*   NEXT SEQUENTIAL INSTRUCTION IN CALL ROUTINE WITH INDEX            *
*   REGISTER 2 (@XR) POINTING TO THE NEXT NON-DELIMITER               *
*   FOLLOWING THE PARAMETER AND WITH A NON-LOW CONDITION CODE         *
*   IN THE PROGRAM STATUS RESISTER (@PSR),                            *
*                                                                     *
*EXITS, ERROR                                                         *
*   NEXT SEQUENTIAL INSTRUCTION IN CALL ROUTINE WILH INDEX            *
*   REGISTER 2 (@XR) POINTING TO THE LEFTMOST CHARACTER OF THE        *
*   INVALID PARAMETER AND WITH A LOW CONDITION CODE IN THE            *
*   PROGRAM STATUS REGISTER (@PSR),                                   *
*                                                                     *
*TABLES/WORK AREAS                                                    *
*   ALL OF THE CONSTANTS AND WORK AREAS IN SALPHA ARE LOCATED AT THE  *
*   END OF THE MODULE AND ARE ADDRESSED BY INDEX REGISTER 1 (RBR).    *
*                                                                     *
*ATTRIBUTES                                                           *
*   REUSABLE, RELOCATABLE                                             *
*                                                                     *
*CHARACTER CODE DEPENDENCY                                            *
*   CHARACTER CODE DEPENDENCY CLASS - E                               *
*   THE OPERATION OF THIS MODULE DEPENDS UPON THE FOLLOWING PROPERTIES*
*   OF THE INTERNAL REPRESENTATION OF THE EXTERNAL CHARACTER SET:     *
*   * THE FOLLOWING SPECIAL ALPHABETIC CHARACTERS ARE PART OF         *
*     @SYSEQ AND ARE SPECIFICALLY COMPARED FOR:                       *
*       * @DOLAR                                                      *
*       * @NUMBR                                                      *
*       * @ASIGN                                                      *
*   * THE REMAINING-ALPHABETIC CHARACTERS ARE DEFINED TO BE           *
*     INCLUSIVELY IN THE RANGE DEFINED BY THE FOLLOWING IN @SYSEQ:    *
*       * @CHARA                                                      *
*       * @CHARZ                                                      *
*                                                                     *
*   THE DECIMAL NUMBERS FALL INTO THE CATEGORY OF BEING GREATER       *
*   THAN AN @CHARZ (IE. THIS IS DEFAULTED TO BY CHECKING METHOD)      *
*   THE SPECIFIC INSTRUCTIONS WHICH REQUIRE MODIFICATION IF THESE     *
*   PROPERTIES OF THE CHARACTER SET ARE CHANGED MAY BE IDENTIFIED BY: *
*     * SAL200 - FOR THE THREE SPECIAL CHARACTERS                     *
*     * SAL250 - FOR THE REMAINING ALPHABETIC RANGE                   *
*     * SAL425 - BRANCHES 'TO' THIS LOCATION IMPLY DEFAULT TO NUMERIC *
*                                                                     *
*NOTES                                                                *
*   ERROR PROCEDURES                                                  *
*      THE FOLLOWING ERROR CONDITIONS WILL RESULT IN AN ERROR CODE    *
*      BEING SET IN $CAERR AND AN ERROR EXIT BEING MADE (SEE EDITS,   *
*      ERROR):                                                        *
*      * A NON-ALPHABETIC FIRST CHARACTER WHEN ENTRY WAS AT           *
*        SALPH8.                                                      *
*      * A NON-ALPHAMERIC CHARACTER EMBEDDED IN A PARAMETER WHICH     *
*        SALPH8 WAS CALLED TO CHECK.                                  *
*      * A NON-ALPHAMERIC CHARACTER BEING FIRST OR EMBEDDED IN A      *
*        PARAMETER WHICH SALPH6 WAS CALLED TO CHECK.                  *
*      * A PARAMETER OF GREATER THAN EIGHT CHARACTERS WHEN ENTRY      *
*        WAS AT SALPH8.                                               *
*      * A PARAMETER OF GREATER THAN SIX CHARACTERS WHEN ENTRY        *
*        WAS AT SALPH6.                                               *
*                                                                     *
*   REGISTER USAGE                                                    *
*      INDEX REGISTER 1 (@BR) IS USED AS A BASE REGISTER THROUGHOUT   *
*      THE EXEQUTION OF THE MODULE. IT IS SAVED FOR THE CALL PROGRAM  *
*      UPON ENTRY AND RESTORED UPON EXIT.                             *
*      INDEX REGISTER 2 (@XR) IS USED AS A PARAMETER PASSING REGISTER.*
*      UPON ENTRY IT CONTAINS THE ADDRESS OF THE LEFTMOST BYTE OF     *
*      PARAMETER TO BE SYNTAX CHECKED AND UPON EXIT IT CONTAINS THE   *
*      ADDRESS OR THE FIRST NON-DELIMITER FOLLOWING THE PARAMETEP.    *
*      (NOTE ERROR EXITS AND PROCEDURES),                             *
*                                                                     *
*   SAVED/RESTORED AREAS                                              *
*      NONE                                                           *
*                                                                     *
*   MODIFICATION CONSIDERATIONS                                       *
*      BECAUSE OF ITS CHARACTER CODE DEPENDENCY AND PARAMETER LENGTH  *
*      QUALIFICATIONS, ONE MUST TAKE SPECIAL CARE IN MODIFYING SALPHA,*
*      ESPECIALLY THE CONSTANTS AND WORK AREAS AND THEIR RE-INITIAL,  *
*      IZATION. SALPHA IS MOST COMMONLY USED TO SYNTAX FILENAMES,     *
*      PASSWORDS, AND VOL-IDS AND IS THEREFORE USED BY THE MODULE     *
*      SUFFER (FILE SPECIFICATION SYNTAX CHECKER). THEREFORE, ANY     *
*      SIGNIFICANT CHANGE IN SALPHA WILL REQUIRE AN INVESTIGATION     *
*      INTO ITS USE AND IMPACT ON SUFFER.                             *
*        SPECIAL NOTE: AN IRREGULAR USE OF SALPHA WHICH CAN BE        *
*        EFFECTED IS THE SYNTAY CHECK OF A PARAMETER WITH A MAXIMUM   *
*        OF 10 CHARACTERS. THIS IS DONE BY MODIFYING THE Q-CODE OF    *
*        THE INSTRUCTION AT SAL450 PRIOR TO ENTRANCE AT SALPH6, WITH  *
*        X'0A' OR ITS EQUIVALENT. (NOTE: ONE SUCH MODULE WHICH        *
*        USES THIS OPTION IS UINITL)                                  *
*                                                                     *
*   REQUIRED MODULES                                                  *
*      SCANIT - DELIMITER SCAN ROUTINE                                *
*      @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                                                            *
***********************************************************************
       SPACE 2
***********************************************************************
*                                                                     *
*                  SALPHA MODULE EQUATES                              *
*                                                                     *
***********************************************************************
SALCT8 EQU   ##LUEN                    COUNT COMPARE FIELD
*
SALCT6 EQU   @VOLID                    COUNT COMPARE FIELD
       SPACE
***********************************************************************
*                                                                     *
*                  INITIALIZATION OF MODULE                           *
*                                                                     *
***********************************************************************
       SPACE
*SALPH8 ENTER CHECK                     FILENAME OR PASSWORD
SALPH8 EQU   *                         MODULE ENTRY POINT
*** END OF EXPANSION ***
       SPACE
       SBN   SALIDR,SAL008             SET ON SALPH8 INDR
*
*SALPH6 ENTER BASE-SALBSE,EXIT-SALND,@BR,,@ARR  VOL-ID CHECK
       USING SALBSE,@BR                BASE ADDRESS SPECIFICATION
SALPH6 EQU   *                         MODULE ENTRY POINT
       ST    SALND0+@OP1,@BR           SAVE ABA
       LA    SALBSE,@BR                LOAD BASE RESISTER
       ST    SALND2+@OP1(,@BR),@ARR    SAVE RETURN ADDRESS
*** END OF EXPANSION ***
       SPACE
       ST    SAL375+@OP1(,@BR),@XR     SAVE ERROR POINTER
       SPACE
***********************************************************************
*                                                                     *
*                  INITIALIZE WORK AREAS AND VARIABLE INSTRUCTIONS    *
*                                                                     *
***********************************************************************
SAL100 MVI   SALPR7(,@BR),@BLANK       BLANK OUT SALPAR FOR PROCESSING
       MVC   SALPR6(##LPEN+@B1,@BR),SALPR7(,@BR)
       MVI   SALCNT(,@BR),@ZERO        ZERO OUT COUNTER
       MVC   SAL525+@OP1(2,@BR),SALPHS(,@BR)  MODIFY MOVE OF CHARACTER
       SPACE
***********************************************************************
*                                                                     *
*                  CHECK EBCDIC CHARACTERS                            *
*                                                                     *
***********************************************************************
*
SALBSE EQU   *                         MODULE BASE ADDR
SAL200 CLI   @ZERO(,@XR),@DOLAR        IS IT A '$' ?
       JE    SAL400                    YES, PROCESS CHARACTER
       CLI   @ZERO(,@XR),@NUMBR        IS IT A '#' ?
       JE    SAL400                    YES, PROCESS CHARACTER
       CLI   @ZERO(,@XR),@ASIGN        IS IT A '@' ?
       JE    SAL400                    YES, PROCESS CHARACTER
*
       CLI   @ZERO(,@XR),@CHARA        IS IT AN ALPHA (A-Z) ?
SAL250 JL    SAL750                    NO, CHECK FOR DELIMITERS
       CLI   @ZERO(,@XR),@CHARZ        IS IT AN ALPHA (A-Z) ?
       JNH   SAL400                    YES, PROCESS CHARACTER
       TBN   SALIDR(,@BR),SAL008       ENTERED AT SALPH8 ?
       JF    SAL425                    NO, CHECK IF NUMERIC
*
       TBN   SALIDR(,@BR),SALFST       WAS FIRST CHAR FOUND ALPHA ?
       MVI   $CAERR,@@E100             ALPHA CHAR REQUIRED--ERROR
       JT    SAL425                    YES, CONTINUE
SAL350 L     SALERR(,@BR),@PSR         LOAD ERROR CODE - LOW
SAL375 LA    *-*,@XR                   RESTORE ERROR POINTER
       J     SAL800                    TAKE ERROR FAIT
       SPACE 1
***********************************************************************
*                                                                     *
*                  PROCESS ALPHAMERIC CHARACTER                       *
*                                                                     *
***********************************************************************
SAL400 SBN   SALIDR(,@BR),SALFST       SET ON ALPHA :NOR
*
SAL425 ALC   SALCNT(1,@BR),SAL001(,@BR)  ADD 1 TO CHARACTER COUNTER
       TBN   SALIDR(,@BR),SAL008       WAS ENTRY AT SALPH8 ?
       BF    SAL450(,@BR)              NO, CHECK COUNT FOR VALUE OF SIX
       CLI   SALCNT(,@BR),##LPEN       HAS COUNT EXCEEDED 8 ?
       MVI   $CAERR,@@E102             PASSWORD/FILENAME LENGTH ERROR
       BH    SAL350(,@BR)              YES, TAKE ERROR EXIT
       J     SAL500                    NO, CONTINUE PROCESSING
SAL450 CLI   SALCNT(,@BR),@VOLID       HAS COUNT EXCEEDED 6 ?
       MVI   $CAERR,@@E103             INVALID VOL-ID LENGTH
       BH    SAL350(,@BR)              YES, TAKE ERROR EXIT
       SPACE
*
*                  MODIFY MOVE OF CHARACTER
*
SAL500 ALC   SAL525+@OP1(2,@BR),SAL001(,@BR)
SAL525 MVC   *-*,@ZERO(1,@XR)          MOVE CHARACTER TO OUTPUT AREA
       LA    @B1(,@XR),@XR             INCREMENT XR BY I
       B     SAL200(,@BR)              CHECK NEXT CHARACTER
       SPACE
***********************************************************************
*                                                                     *
*                  CHECK ERRORS AND BYPASS DELIMITERS                 *
*                                                                     *
***********************************************************************
SAL750 CLI   SALCNT(,@BR),@ZERO        ANY VALID CHARACTERS ?
SAL755 MVI   $CAERR,@@E130             REQUIRED PARAM MISSING
       JNE   SAL775                    YES, BYPASS DELIMITERS, EYIT
       CLI   @ZERO(,@XR),@EOS          IS IT EOS ?
       JE    SAL760                    YES, ERROR EVIL
       TBN   SALIDR(,@BR),SAL008       ENTERED AT SALPH8 ?
       MVI   $CAERR,@@E100             ALPHABETIC CHAR REQUIRED
       JT    SAL760                    ERROR EYIT
       MVI   $CAERR,@@E101             ALPHAMERIC CHAR REQUIRED
SAL760 B     SAL350(,@BR)              ERROR EYIT
SAL775 B     SCANIT                    BYPASS DELIMITERS
       SPACE
***********************************************************************
*                                                                     *
*                  SET OFF INDICATORS FOR POSSIBLE SALDHA RE-ENTRY    *
*                                                                     *
***********************************************************************
SAL800 MVI   SALIDR(,@BR),@ZERO
       SPACE
***********************************************************************
*                                                                     *
*                  END OF MODULE PROCESSING                           *
*                                                                     *
***********************************************************************
*SALND  EXIT  @BR,,RETURN               EXIT
SALND0 LA    *-*,@BR                   RESTORE @BR
SALND2 B     *-*                       RETURN TO CALLING PROGRAM
*** END OF EXPANSION ***
       SPACE
***********************************************************************
*                                                                     *
*                  DATA CONSTANTS, BUFFERS, AND WORK AREAS            *
*                                                                     *
***********************************************************************
SALIDR DS    CL1                       1 BYTE OF FLAGS
       ORG   *-1
       DC    XL1'00'                   INITIALIZED TO ZERO
       SPACE 1
SAL008 EQU   X'80'                     ENTRY POINT INDICATOR
*                                      * 0 - ENTERED AT SALPH6
*                                      * 1 - ENTERED AT SALPH8
SALFST EQU   X'01'                     FIRST CHARACTER IS ALPHA / INDR
*                                      * 0 - CHARACTER IS NOT ALPHA
*                                      * 1 - CHARACTER IS ALPHA
SALCNT DS    CL1                       BYTE CHARACTER COUNTER
       ORG   *-1
       DC    XL1'00'                   INITIALIZED TO ZERO
SAL001 DC    XL2'0001'                 COUNTER INCREMENT
SALPHR EQU   *
       DS    CL(##LUEN+2*@B1)          SYNTAX SAVE UNIT
SALPHS DC    AL2(SALPHR-1)             ADDR FOR MODIFYING MOVE
SALPR7 EQU   SALPHR+##DPEN+2*@B1       ADDR IN SALPHR FOR CLANKINS
SALPR6 EQU   SALPHR+##DPEN+@B1         * OUT THE FIELD
SALERR EQU   SAL250+@Q                 ADDR ERROR CODE FOR LOAD
***                       END OF SALPHA                            ***
       MEND
// CEND
// END
*
// READER CONSOLE
