// DATE 210620
// NOHALT
*
*** RUN MAINT.
*
// LOAD $MAINT,F1
// RUN
// COPY FROM-READER,TO-F1,RETAIN-R,LIBRARY-S,NAME-$CANI
       MACRO
       $CANI
.*
.*     5703-XM1 DELIMETER SCAN ROUTINE
.*
       TEXT
       TITLE 'SCANIT - DELIMETER SCAN MODULE'
***********************************************************************
*  5703-XM1    COPYRIGHT IBM CORP. 1970                               *
*              REFER TO INSTRUCTIONS ON COPYRIGHT NOTICE, 120-2083    *
*                                                                     *
***********************************************************************
*STATUS                                                               *
*   VERSION 1 MODIFICATION 0                                          *
*                                                                     *
*FUNCTION                                                             *
*   THE FUNCTION OF SCANIT IS TO SCAN PAST VALID DELIMITERS AND       *
*   RETURN A POINTER TO THE FIRST CHARACTER THAT'S NOT A DELIMITER.   *
*                                                                     *
*ENTRY POINTS                                                         *
*   * THE ENTRY POINT IS SCANIT.                                      *
*   * THE CALLING SEQUENCE IS AS FOLLOWS:                             *
*            B     SCANIT                                             *
*     WITH REGISTER 2 (@XR) POINTING TO THE FIRST CHARACTER TO BE     *
*     EXAMINED.                                                       *
*                                                                     *
*INPUT                                                                *
*   NONE                                                              *
*                                                                     *
*OUTPUT                                                               *
*   NONE                                                              *
*                                                                     *
*EXTERNAL REFERENCES                                                  *
*   $CAERR - ERROR CODE SAVE AREA                                     *
*                                                                     *
*EXITS, NORMAL                                                        *
*   NORMAL EXIT FROM SCANIT IS TO THE BYTE FOLLOWING THE BRANCH TO    *
*   SCANIT IN THE CALLING ROUTINE. THE PSR (REGISTER 4) WILL CONTAIN  *
*   A ZERO IF NO DELIMITERS WERE FOUND OR A HIGH CONDITION IF ONE OR  *
*   MORE DELIMITERS WERE SCANNED.                                     *
*                                                                     *
*EXITS, ERROR                                                         *
*   ERROR EXIT FROM SCANIT IS TO THE BYTE FOLLOWING THE BRANCH TO     *
*   SCANIT IN THE CALLING ROUTINE. THE PSR WILL CONTAIN A LOW         *
*   CONDITION.                                                        *
*                                                                     *
*TABLES/WORKAREAS                                                     *
*   * SCACNT - AREA CONTAINING NUMBERS OF DELIMITERS SCANNED          *
*   * SCAMMA - LOC WHERE SCACOM MAY BE MOVED IF ONE COMMA IS ALSO     *
*     TO BE CONSIDERED A DELIMITER. MOVING SCACOF BACK INTO SCAMMA    *
*     INDICATES THAT ONLY BLANKS SHOULD BE CONSIDERED DELIMITERS.     *
*                                                                     *
*ATTRIBUTES                                                           *
*   RELOCATABLE AND RE-USABLE                                         *
*                                                                     *
*CHARACTER CODE DEPENDENCY                                            *
*   THE OPERATION OF THIS MODULE DOES NOT DEPEND UPON A PARTICULAR    *
*   INTERNAL REPRESENTATION OF THE EXTERNAL CHARACTER SET.            *
*                                                                     *
*NOTES                                                                *
*   ERROR PROCEDURES                                                  *
*      THE ONLY ERROR CONDITION DETECTED BY SCANIT IS THE CASE WHERE  *
*      A CARRIAGE-RETURN CODE FOLLOWS A COMMA.  UPON RETURN TO THE    *
*      CALLING ROUTINE, @PSR WILL BE SET TO A LOW CONDITION, THE      *
*      ERROR CODE IS SET IN $CAERR, AND MG WILU BE POINTING TO THE    *
*      CARRIAGE-RETURN CHARACTER.                                     *
*                                                                     *
*   REGISTER USAGE                                                    *
*      REGISTER 2 (@XR) IS USED AS A POINTER ACROSS THE AREA BEING    *
*      SCANNED FOR DELIMETERS.                                        *
*                                                                     *
*   SAVED/RESTORED AREAS                                              *
*      UPON ENTRY TO SCANIT, REGISTER 8 (@ARR) IS SAVED AND USED AS   *
*      THE RETURN ADDRESS.                                            *
*                                                                     *
*   MODIFICATION CONSIDERATIONS                                       *
*      NONE                                                           *
*                                                                     *
*   REQUIRED MODULES                                                  *
*      * @SYSEQ - COMMON SYSTEM EQUATES                               *
*      * @FXDEQ - FIXED NUCLEUS ADDRESSES EQUATES                     *
*                                                                     *
*   OTHER                                                             *
*      SCANIT IS INITIALIZED TO BYPASS BLANKS ONLY. IF SCACOM IS      *
*      MOVED TO SCAMMA, ONE COMMA WILL BE SCANNED ALONG WITH BLANKS.  *
*      THE INSTRUCTION TO DO THIS IS AS FOLLOWS:                      *
*            MVI   SCAMMA,SCACOM                                      *
*                                                                     *
*      TO DROP THE COMMA FROM ITS DELIMITER STATUS, SCACOF SHOULD BE  *
*      MOVED TO SCAMMA, USING THE FOLLOWING INSTRUCTION:              *
*            MVI   SCAMMA,SCACOF                                      *
*                                                                     *
***********************************************************************
       SPACE 2
*
*                  EQUATES USED IN THIS SUBROUTINE
*
SCAINC EQU   1                         TO INCREMENT POINTER
SCACOM EQU   @BNE                      SWITCH TO ALLOW SCANNING COMMA
SCACOF EQU   @UCB                      SWITCH TO SET OFF THE INDICATON
*                                      * FOR SCANNING A COMMA
SCANIT EQU   *                         ENTRY POINT TO THIS SUBROUTINE
       ST    SCA500+@OP1,@ARR          SAVE RETURN ADDRESS
       ST    SCASVE,@XR                SAVE POINTER VALUE
       MVI   $CAERR,@@E110             SET ERROR CODE
       J     SCA200                    GO TO PROCESS
       SPACE
SCA100 LA    SCAINC(,@XR),@XR          INCREMENT POINTER TO NEXT CHAR
SCA200 CLI   0(,@XR),@BLANK            IS THIS CHAR BLANK ?
       BE    SCA100                    YES, FETCH NEXT ONE
*
       CLI   0(,@XR),@COMMA            IS IT A COMMA ?
SCA250 JC    SCA400,@UCB               UCS TO RETURN -- OR NOP IF
*                                      * SCAMMA IS ACTIVE AND CHAR
SCA300 LA    SCAINC(,@XR),@XR          INCREMENT POINTER TO NEXT CHAR
       CLI   0(,@XR),@BLANK            IS THIS CHAR A BLANK ?
       BE    SCA300                    YES, FETCH NEXT ONE
*
       CLI   0(,@XR),@EOS+1            IS THIS EOS ?
       JL    SCA500                    IF NOT, SKIP ERROR ROUTINE
*
SCA400 ST    SCACNT,@XR                SAVE NEW POINTER VALUE
       SLC   SCACNT(2),SCASVE          SET PSR TO EQUAL IF POINTER
*                                      * NOT ADVANCED
SCA500 B     *-*                       YES, RETURN
SCAMMA EQU   SCA250+@Q                 TO SET SCAN COMMA INDICATOR
*
*                  SAVE AREA
*
SCASV1 EQU   *                         FIRST BYTE OF SCASVE
SCASVE DS    CL2                       ORIGINAL POINTER VALUE SAVE
SCACNT DS    CL2                       SAVE AREA FOR TOTAL CHAR SCAN
*                      END OF SCANIT
*** END OF EXPANSION ***
       MEND
// CEND
// END
*
// READER CONSOLE
