SCANTEXT

I've written several scan programs, but had never written a program that looks for both upper and lower case, characters, or a mix of them.  Took me longer than I'd hoped, but is, I think, nicer than I'd hoped.   You can scan a file, looking for various different strings, and copy records containing those strings in one pass.  The output can be either a single file, or a different file for each string.  There are two  SYSPRINT files, from 2 runs, and then the source code follows.  SCANTEXT was written to run on the Z390 simulator, but intended to be used on an IBM mainframe.  To do that, you'll need to change the DCBs.   You'd also want a DCB exit to copy recfm and lrecl.   First is the short version of SYSPRINT.


 SYSPRINT OPENED FOR OUTPUT, RECFM=A0 LRECL=00133 BLKSIZE=00000

 PARM=OUTFILES,MVC,STM,ASSEMBLER

 PARM=MVC,STM,ASSEMBLER

 SCANTEXT, ASM 05/13/23 AT 21.50 FIND TEXT STRINGS. CODE PARM=DOC FOR DESCRIPTION

 IN       OPENED FOR  INPUT, RECFM=A0 LRECL=00188 BLKSIZE=00000

 EBCDIC    55   ASCII     5  EBCDIC ASSUMED

       0202  MAX STRINGS=045

 PARM=MVC,STM,ASSEMBLER

 PARM=STM,ASSEMBLER

 PARM=ASSEMBLER

 OUT1     OPENED FOR OUTPUT, RECFM=A0 LRECL=00188 BLKSIZE=00000

 OUT2     OPENED FOR OUTPUT, RECFM=A0 LRECL=00188 BLKSIZE=00000

 OUT3     OPENED FOR OUTPUT, RECFM=A0 LRECL=00188 BLKSIZE=00000

              # TIMES STRING FOUND

              |   LENGTH-1 OF STRING

              |   | OFFSET FROM BEGIN TO SEARCH CHAR

              |   | | LENGTH AFTER SEARCH CHAR

              |   | | | SEARCH CHAR # IN TRT TABLE

              |   | | | | SEARCH CHAR

              |   | | | | | STRING

              |   | | | | | |

 0B8E         4  080503 1 B ASSEMBLER   DD=OUT1

              7  020200 2 M STM   DD=OUT2

             80  020101 3 V MVC   DD=OUT3


        1,599  RECORDS READ

           03  SCAN PARMS SAVED

        3,388  TRT INSTS USED

        1,880  CLC INSTS USED


            4  OUT1  CLOSED

            7  OUT2  CLOSED

           80  OUT3  CLOSED


 IN       CLOSED


======= but there is a much longer version of SYSPRINT that I used for testing ======


 SYSPRINT OPENED FOR OUTPUT, RECFM=A0 LRECL=00133 BLKSIZE=00000

 PARM=DOC,LISTSTATS,EBCDIC,ASCII,EBCDICTR,ASCIITR,LRECL=3500,EXACTLY,WER2,HEIGHT,HTML,FRAME,PEGS,ERECTING,ASSEMBLING,JOINT,STORIES

 PARM=LISTSTATS,EBCDIC,ASCII,EBCDICTR,ASCIITR,LRECL=3500,EXACTLY,WER2,HEIGHT,HTML,FRAME,PEGS,ERECTING,ASSEMBLING,JOINT,STORIES

 PARM=EBCDIC,ASCII,EBCDICTR,ASCIITR,LRECL=3500,EXACTLY,WER2,HEIGHT,HTML,FRAME,PEGS,ERECTING,ASSEMBLING,JOINT,STORIES

 PARM=ASCII,EBCDICTR,ASCIITR,LRECL=3500,EXACTLY,WER2,HEIGHT,HTML,FRAME,PEGS,ERECTING,ASSEMBLING,JOINT,STORIES

 PARM=EBCDICTR,ASCIITR,LRECL=3500,EXACTLY,WER2,HEIGHT,HTML,FRAME,PEGS,ERECTING,ASSEMBLING,JOINT,STORIES

 PARM=ASCIITR,LRECL=3500,EXACTLY,WER2,HEIGHT,HTML,FRAME,PEGS,ERECTING,ASSEMBLING,JOINT,STORIES

 PARM=LRECL=3500,EXACTLY,WER2,HEIGHT,HTML,FRAME,PEGS,ERECTING,ASSEMBLING,JOINT,STORIES

 PARM=EXACTLY,WER2,HEIGHT,HTML,FRAME,PEGS,ERECTING,ASSEMBLING,JOINT,STORIES

 SCANTEXT, ASM 05/13/23 AT 21.50 FIND TEXT STRINGS. CODE PARM=DOC FOR DESCRIPTION

 COPY RECORDS THAT CONTAIN STRINGS SPECIFIED IN THE PARM FIELD.

 THE SEARCH IS DONE FOR A MIX OF UPPER AND LOWER CASE.

 AND THE INPUT FILE CAN BE EITHER EBCDIC OR ASCII.


 IF YOU ARE SEARCHING FOR A STRING, YOU CAN CODE JUST THAT STRING

 IN THE PARM FIELD, AND SCANTEXT WILL SEARCH FOR UPPER AND LOWER

 CASES OF THAT STRING, AND YOU CAN IGNORE THE REST OF THIS.


 HOWEVER, I HAVE GONE TO CONSIDERABLE TROUBLE TO ALLOW USERS TO

 SEARCH FOR MULTIPLE STRINGS IN A SINGLE PASS. AND, YOU CAN SEARCH

 FOR A STRING THAT CONTAINS A COMMA,BY USING A DIFFERENT DELIMITER.

 YOU COULD EVEN USE BLANK AS A DELIMITER, "BUT ONLY 1".


 EVEN BETTER, THE DEFAULT IS TO WRITE ALL SELECTED RECORDS TO THE

 //OUT FILE, BUT YOU CAN SPECIFY "OUTFILES" IN THE PARM, AND THE

 RECORDS WILL BE WRITTEN TO INDIVIDUAL  "//OUT#"  FILES.


 IN ORDER TO ALLOW USERS TO SEARCH FOR A STRING WITH A COMMA, THE

 PARM FIELD MUST START WITH A COMMA, OR ALTERNATE SEPARATOR.

 FOLLOWING THAT ARE KEYWORDS, FOLLOWED BY STRINGS.  KEYWORDS ARE:


 LISTSTATS- PRINT THE CONTROL TABLE 4 TIMES DURING PROCESSING

 ASCIITR  - FOR TESTING, TO CHANGE EBCDIC INPUT TO ASCII

 EBCDICTR - JUST BECAUSE

 DOC      - PRINT THIS DESCRIPTION

 OUTFILES - CREATE MULTIPLE //OUT# FILES

 ASCII    - INPUT FILE IS ASCII

 EBCDIC   - INPUT FILE IS EBCDIC

  (THE PROGRAM CHECKS THE FIRST RECORD TO GUESS WHETHER IT IS

   AN ASCII OR EBCDIC FILE, BUT DOES NOT ALWAYS GET IT RIGHT.)

 LRECL=##### TO USE A LARGER LRECL FOR THE //IN FILE.


 FOLLOWING THE KEYWORDS ARE THE SELECT STRINGS.

 FOR TESTING, I READ AN ASSEMBLER LISTING AND LOOKED FOR


 ,MVC,STM,BAL,BUBBLE,QFREQ,TRT,FLAG,EQ,UNPK,USING,DROP,LA    R1,DW

 (BUT WHEN I WAS WRITING MULTIPLE OUT FILES, THE LIST WAS SHORTER.)


 //SCAN  EXEC  PGM=SCANTEXT,PARM=",OUTFILES,MVC,STC,ASSEMBLER"

 //STEPLIB  DD DISP=SHR,DSN=

 //SYSPRINT DD SYSOUT=*

 //IN   DD DISP=SHR,DSN=

 //OUT  DD SYSOUT=*

 //OUT1 DD SYSOUT=*

 //OUT2 DD SYSOUT=*

 //OUT3 DD SYSOUT=*


 THERE ARE COUNTS AT THE END OF THE RUN THAT SHOW HOW MANY TIMES

 EACH STRING WAS FOUND. UNLESS "OUTFILES" IS SPECIFIED, ONLY THE

 FIRST OCCURRENCE OF A STRING IN A RECORD IS COUNTED.  AND, ALL

 THE RECORDS GO TO THE //OUT FILE, RATHER THAN INDIVIDUAL FILES.


 IN       OPENED FOR  INPUT, RECFM=A0 LRECL=03500 BLKSIZE=00000

 OUT      OPENED FOR OUTPUT, RECFM=A0 LRECL=03500 BLKSIZE=00000

       0202  MAX STRINGS=045

 PARM=EXACTLY,WER2,HEIGHT,HTML,FRAME,PEGS,ERECTING,ASSEMBLING,JOINT,STORIES

 PARM=WER2,HEIGHT,HTML,FRAME,PEGS,ERECTING,ASSEMBLING,JOINT,STORIES

 PARM=HEIGHT,HTML,FRAME,PEGS,ERECTING,ASSEMBLING,JOINT,STORIES

 PARM=HTML,FRAME,PEGS,ERECTING,ASSEMBLING,JOINT,STORIES

 PARM=FRAME,PEGS,ERECTING,ASSEMBLING,JOINT,STORIES

 PARM=PEGS,ERECTING,ASSEMBLING,JOINT,STORIES

 PARM=ERECTING,ASSEMBLING,JOINT,STORIES

 PARM=ASSEMBLING,JOINT,STORIES

 PARM=JOINT,STORIES

 PARM=STORIES

              # TIMES STRING FOUND

              |   LENGTH-1 OF STRING

              |   | OFFSET FROM BEGIN TO SEARCH CHAR

              |   | | LENGTH AFTER SEARCH CHAR

              |   | | | SEARCH CHAR # IN TRT TABLE

              |   | | | | SEARCH CHAR

              |   | | | | | STRING

              |   | | | | | |

 0312         0  060105   X EXACTLY

              0  030003   W WER2

              0  050302   G HEIGHT

              0  030201   M HTML

              0  040004   F FRAME

              0  030003   P PEGS

              0  070700   G ERECTING

              0  090504   B ASSEMBLING

              0  040004   J JOINT

              0  060303   R STORIES


              # TIMES STRING FOUND

              |   LENGTH-1 OF STRING

              |   | OFFSET FROM BEGIN TO SEARCH CHAR

              |   | | LENGTH AFTER SEARCH CHAR

              |   | | | SEARCH CHAR # IN TRT TABLE

              |   | | | | SEARCH CHAR

              |   | | | | | STRING

              |   | | | | | |

 031A         0  090504   B ASSEMBLING

              0  040004   F FRAME

              0  070700   G ERECTING

              0  050302   G HEIGHT

              0  040004   J JOINT

              0  030201   M HTML

              0  030003   P PEGS

              0  060303   R STORIES

              0  030003   W WER2

              0  060105   X EXACTLY


              # TIMES STRING FOUND

              |   LENGTH-1 OF STRING

              |   | OFFSET FROM BEGIN TO SEARCH CHAR

              |   | | LENGTH AFTER SEARCH CHAR

              |   | | | SEARCH CHAR # IN TRT TABLE

              |   | | | | SEARCH CHAR

              |   | | | | | STRING

              |   | | | | | |

 0322         0  090504 1 B ASSEMBLING

              0  040004 2 F FRAME

              0  070700 3 G ERECTING

              0  050302   G HEIGHT

              0  040004 5 J JOINT

              0  030201 6 M HTML

              0  030003 7 P PEGS

              0  060303 8 R STORIES

              0  030003 9 W WER2

              0  060105 A X EXACTLY


              # TIMES STRING FOUND

              |   LENGTH-1 OF STRING

              |   | OFFSET FROM BEGIN TO SEARCH CHAR

              |   | | LENGTH AFTER SEARCH CHAR

              |   | | | SEARCH CHAR # IN TRT TABLE

              |   | | | | SEARCH CHAR

              |   | | | | | STRING

              |   | | | | | |

 0B8E         2  090504 1 B ASSEMBLING

              1  040004 2 F FRAME

              1  070700 3 G ERECTING

              2  050302   G HEIGHT

              1  040004 5 J JOINT

              4  030201 6 M HTML

              1  030003 7 P PEGS

              4  060303 8 R STORIES

              2  030003 9 W WER2

              4  060105 A X EXACTLY


           22  RECORDS WRITTEN

        1,756  RECORDS READ

           10  SCAN PARMS SAVED

       18,281  TRT INSTS USED

       17,134  CLC INSTS USED

 IN       CLOSED

 OUT      CLOSED



=================  finally, we've gotten to the source code.  ==============


Yeah, I know, no comments.  Deal with it.  I'll think about it.  Maybe.


         AGO   .START


C:\USERS\LIN\DOCUMENTS\Z390CODE\SCANTEXT


SET PA1=",MVC,STM,BAL,BUBB,QFRE,TRT,EQ,LA    R1,UNPK,"

SET PA2=",DROP,LISTSTR,SETFREQ,DW"

SET  G=C:\USERS\LIN\DOCUMENTS\Z390CODE\SCANTEXT

SET       IN=%G%.PRN

SET      OUT=%G%.OUT.TXT

SET SYSPRINT=%G%.SYSPRINT.TXT

SET    SYSIN=%G%.SYSIN.TXT

BAT\ASMLG %G%.MLC TIME(1) PARM(%PA1%USING%PA2%)


SET  G=C:\USERS\LIN\DOCUMENTS\Z390CODE\SCANTEXT

SET  LISTING=%G%.PRN

SET   ATFILE=%G%.BREAK.ATFILE.TXT

SET COMMANDS=%G%.BREAK.COMMANDS.TXT

SET    SYSIN=%G%.BREAK.SYSIN.TXT

BAT\EZ390 C:\USERS\LIN\DOCUMENTS\Z390CODE\QBR.MLC  PARM(SYSIN)


LOADLOC=FE000   13R%

  LRECL=90

LABEL=PRINTR2,ERR*,MSG*,Z,ZS,GETMAIN,TRY*,SET*,SAV*,QFREQ,QS1*,QS9*

LABEL=TES*,EDIT0*,GETIN,WRITOUT,


LABEL=AGETMAIN,CARD,LINE,

COMMAND=

COMMAND=C:\USERS\LIN\DOCUMENTS\Z390CODE\SCANTEXT ASMLG

COMMAND=C:\USERS\LIN\DOCUMENTS\Z390CODE\SCANTEXTT EZ390

COMMAND=C:\USERS\LIN\DOCUMENTS\Z390CODE\SCANTEXTB BK PTS

COMPRESS=Y

  CMDFILE=Y

  ATFILE=Y



.START   ANOP

*

         MACRO

         @     &MSG

         LCLA  &N,&M

&N       SETA  K'&MSG

&N       SETA  &N-2

         DC    AL1(&N-1),C&MSG

         MEND

*

         MACRO

&LBL     ERR   &BC,&MSG,&ERR=ERR

&LBL     REVB  &BC,4+SYS&SYSNDX

         BAL   1,SYS&SYSNDX

         @     &MSG

SYS&SYSNDX  BAL   14,&ERR

         MEND

*

* -----------------------------------------------------------

         MACRO

&LABEL   REVB  &COND,&TO

         LCLC  &C,&B

         LCLA  &LEN

         AIF   ('&COND' NE 'B').ADDREM

&LABEL   NOP   &TO

         MEXIT

.ADDREM  ANOP

&LEN     SETA  K'&COND

         AIF   ('&COND'(2,1) NE 'N').ADD

&B       SETC  '&COND'(3,&LEN-2)

         AGO   .DOIT

.ADD     ANOP

&B       SETC  '&COND'(2,&LEN-1)

&B       SETC  'N&B'

.DOIT    ANOP

&LABEL   B&B    &TO

         MEND

* -----------------------------------------------------------

SCANTEXT START 0

         YREGS

         USING *,13,12             NORMAL INIT STUFF

         B     52(R15)

         DC    12F'0'              SET BASE AND SAVE PARM

         STM   14,12,12(13)

         ST    13,4(15)

         ST    15,8(13)

         LR    13,15

         LA    R12,4095

         LA    R12,1(R12,R13)

         L     R3,0(R1)

         LA    R2,SYSPRINT

         BAL   R9,OPENOUT

         LH    R2,0(R3)

         SH    R2,=H'1'

         ERR   BM,'NO PARM',ERR=ERR

         LA    R4,PARM

         CLI   2(R3),C'A'

         BL    *+8

         LA    R4,PARM+1

         MVC   0(0,R4),2(R3)

         EX    R2,*-6

*

         CLI   PARM,X'80'

         ERR   BNL,', SEPATOR MISSING',ERR=ERR

         MVC   SEPAR,PARM

         MVC   PARM,PARM+1

         SR    R3,R3

         B     QPARMBAL

*

QPARMMV  L     R1,0(R2)

         MVC   0(1,R1),PARM

         LA    R2,PARM+2(R3)

         MVC   PARM,0(R2)

QPARMBAL PUT   SYSPRINT,PARMPUT

         BAL   R2,QPARMIC

*

         DC    AL4(FLAGTR)

         @     'ASCIITR'

         DC    AL4(FLAGTR)

         @     'EBCDICTR'

         DC    AL4(FLAGDOC)

         @     'DOC'

         DC    AL4(FLAGOUT)

         @     'OUTFILES'

         DC    AL4(FLAGASCI)

         @     'ASCII'

         DC    AL4(FLAGASCI)

         @     'EBCDIC'

         DC    AL4(FLAGLIST)

         @     'LISTSTATS'

         DC    X'FF'

         CLC   PARM(0),5(R2)

QPARMIC  IC    R3,4(R2)

         EX    R3,QPARMIC-6

         BE    QPARMMV

         LA    R2,6(R2,R3)

         CLI   0(R2),0

         BE    QPARMIC

         CLC   =C'LRECL=',PARM

         BNE   OPENINOU

*        DOC,ASCII,EBCDIC,MAKEEBCDIC,MAKEASCI,ASCII

*

         LA    R14,PARM+6

         SR    R15,R15

ADDLRECL IC    R1,0(R14)

         N     R1,=F'15'

         MH    R15,=H'10'

         AR    R15,R1

         LA    R14,1(R14)

         CLI   0(R14),C'0'

         BNL   ADDLRECL

         STH   R15,DCBLRECL-IHADCB+IN

         MVC   PARM,1(R14)

         B     QPARMBAL

*

OPENINOU BAL   R9,PRINTDOC

         LA    R2,IN

         BAL   R9,OPENIN

         CLI   FLAGOUT,C'O'

         BE    *+12

         LA    R2,OUT

         BAL   R9,OPENOUT

*

         MVI   RECFM,C'F'

         MVC   DW(1),DCBRECFM-IHADCB+IN

         NI    DW,X'70'

         CLI   DW,X'40'

         BNE   *+8

         MVI   RECFM,C'V'

*

         SR    R10,R10

         BAL   R9,QASCII

         SR    R11,R11

         MVC   LINE,LINE-1

* ------------------------------------------

*        CLI   FLAGASCI,C'A'

*        BNE   PARMLA-4

*        TR    PARM,EBC2ASCI

*        TR    SEPAR,EBC2ASCI

* ------------------------------------------

         LA    R4,STRINGS

         USING STRDSECT,4

         L     R0,0(R4)

         CVD   R0,DW

         OI    DW+7,X'0F'

         UNPK  MAXSTRM+21(3),DW+6(2)

MAXSTRM  ERR   B,'MAX STRINGS=... ',ERR=MSG

*

         USING STRDSECT,4

PARMLA   LA    R3,PARM

         C     R4,=A(ENDDOC-L'STRINGS)

         ERR   BNL,'TOO MANY SEARCH STRINGS'

         AP    #PARMS,P1

         PUT   SYSPRINT,PARMPUT

PARML    LA    R3,1(R3)

         CLC   SEPAR,0(R3)

         BE    PARMF

         CLC   LINE+88(22),0(R3)

         BNE   PARML

         B     PARMF

*

PASCIIX  TRT   SSTRING(0),0(R14)  NOTASCII

PARMMVC  MVC   SSTRING(0),PARM

PARMTR   TR    SSTRING(0),0(R14)  TOASCII

PARMF    LR    R1,R3

         S     R1,=A(PARM+1)

         MVC   STRDSECT(LSTRING),LINE

         XC    STRDSECT(6),STRDSECT

         ZAP   SCOUNT,P0

*

         EX    R1,PARMMVC

         STH   R1,SLENGTH

         STH   R1,SSTRING-2

         CLI   FLAGASCI,C'A'

         BNE   PARMNOTA

*

         L     R14,=A(NOTASCII)

         EX    R1,PASCIIX

         MVC   ASCIERR+14(1),0(R1)

ASCIERR  ERR   BNZ,'STRING ( ) HAS AN INVALID ASCII CHAR',ERR=ERR

*

PARMNOTA MVC   PARM,1(R3)

*

         LA    R4,LSTRING(R4)

         ST    R4,ENDSTRIN

         CLC   PARM(11),LINE+80

         BNE   PARMLA

         DROP  4

         SR    R4,R4

* --------------------------------------------

         LA    R3,STRINGS

         USING STRDSECT,3

SETFREQ  LA    R2,6(R3)

         LA    R4,0(R3)

         BAL   R14,QFREQ

*        MVC   7(1,R3),6(R3)

         LA    R3,LSTRING(R3)

         C     R3,ENDSTRIN

         BL    SETFREQ

         DROP  3

         BAL   R9,LISTSTR

*

         BAL   R9,BUBBLE

         BAL   R9,LISTSTR

         BAL   R9,QOFFSET

         BAL   R9,LISTSTR

         BAL   R9,GETMAIN

         CLI   FLAGASCI,C'E'

         BE    DUPEBCDI

         MVC   TRTTABLE+97(26),TRTTABLE+65

         B     DUPEBCDI+6

*

DUPEBCDI MVC   TRTTABLE+128(48),TRTTABLE+192

         L     R1,PUT-4

         MVI   PARM-1,C' '

         CLI   FLAGASCI,C'A'

         BNE   *+8

         MVI   PARM-1,X'20'

         MVC   PARM,PARM-1

         MVC   LINE,LINE-1

         MVC   0(4,R13),*+6

         B     GETGOT

*

* IF NEITHER ASCII NOR EBCDIC WAS SPECIFIED, THEN WE'RE GOING TO

* COUNT ASCII AND EBCDIC CHARACTERS IN THE FIRST RECORD OF THE FILE.

* WHICHEVER COUNT IS GREATER, WE'LL ASSUME THAT'S THE CHARACTER SET

* OF THE ENTIRE FILE.

*

* X'4B' IS A PERIOD IN EBCDIC AND C'K' IN ASCII, SO YOU HAVE TO

* USE ONE CHARACTER SET OR THE OTHER.

*

         DC    F'0'

QASCII   ST    R9,QASCII-4

         BAL   R9,READAREC

         CLI   FLAGASCI,C' '

         BNE   QASCIIZ  

         CLI   FLAGASCI,C' '

         BNE   QASCIIZ

         L     R2,LRECL

         L     R1,PUT-4

         LA    R2,0(R1,R2)

         SR    R3,R3

         SR    R4,R4

QASCIIL  CLI   0(R1),X'4B'

         BE    QASCIIN

         CLI   0(R1),X'20'

         BE    QASCIIA

         CLI   0(R1),X'30'

         BL    QASCIIN

         CLI   0(R1),X'3A'

         BL    QASCIIA

         CLI   0(R1),X'41'

         BL    QASCIIN

         CLI   0(R1),X'5B'

         BL    QASCIIA

         CLI   0(R1),X'61'

         BL    QASCIIN

         CLI   0(R1),X'7B'

         BL    QASCIIA

         CLI   0(R1),X'81'

         BL    QASCIIN

         CLI   0(R1),X'AA'

         BL    QASCIIE

         CLI   0(R1),X'C1'

         BL    QASCIIN

         CLI   0(R1),X'EA'

         BL    QASCIIE

         CLI   0(R1),X'F0'

         BL    QASCIIN

         CLI   0(R1),X'F9'

         BH    QASCIIN

QASCIIE  AP    #EBCDIC,P1

         B     QASCIIN

QASCIIA  AP    #ASCII,P1

QASCIIN  LA    R1,1(R1)

         CR    R1,R2

         BL    QASCIIL

         MVI   FLAGASCI,C'E'

         MVC   LINE(6),=C'EBCDIC'

         MVC   LINE+6(6),ED5

         ED    LINE+6(6),#EBCDIC

         MVC   LINE+15(5),=C'ASCII'

         MVC   LINE+20(6),ED5

         ED    LINE+20(6),#ASCII

         MVC   LINE+28(15),=C'EBCDIC ASSUMED'

         CP    #EBCDIC,#ASCII

         BH    *+14

         MVC   LINE+28(6),=C' ASCII'

         MVI   FLAGASCI,C'A'

         PUT   SYSPRINT,LINE-1

         MVC   LINE,LINE-1

QASCIIZ  L     R9,QASCII-4

         BR    R9

ED5      DC    X'402020202120'

#ASCII   DC    PL3'0'

#EBCDIC  DC    PL3'0'

*

* TR2EBCDI L     R4,=A(ASCI2EBC)

*          B     *+8

* TR2ASCII L     R4,=A(EBC2ASCI)

*          LA    R3,STRINGS

* TRTR     TR    8(36,R3),0(R4)

*          LA    R3,L'STRINGS(R3)

*          C     R3,ENDSTRIN

*          BL    TRTR

*          BR    R9

*

LISTITLE EQU   *

         @     '# TIMES STRING FOUND'

         @     '|   LENGTH-1 OF STRING'

         @     '|   | OFFSET FROM BEGIN TO SEARCH CHAR'

         @     '|   | | LENGTH AFTER SEARCH CHAR'

         @     '|   | | | SEARCH CHAR # IN TRT TABLE'

         @     '|   | | | | SEARCH CHAR'

         @     '|   | | | | | STRING'

         @     '|   | | | | | |'

         @     ' '

*

LISTSTR  CLI   FLAGLIST,C'L'

         BNER  R9

         LA    R3,LISTITLE

         SR    R2,R2

LISTITLL IC    R2,0(R3)

         MVC   LINE+13(0),1(R3)

         EX    R2,*-6

         PUT   SYSPRINT,LINE-1

         MVC   LINE,LINE-1

         LA    R3,2(R2,R3)

         CLI   0(R3),1

         BH    LISTITLL

*

         LA    R0,0(R9)

         SR    R0,R13

         ST    R0,12(13)

         UNPK  LINE(5),14(3,R13)

         TR    LINE(4),HEX-240

         MVI   LINE+4,C' '

         LA    R3,STRINGS

         USING STRDSECT,3

LISTSTRM MVC   LINE+6(L'ED7),ED7

         ED    LINE+6(L'ED7),SCOUNT

         MVC   LINE+16(6),STRDSECT

         OC    LINE+16(6),=6C'0'

         MVC   LINE+23(1),SINDEX

         MVC   LINE+25(1),SCHAR

         LH    R2,0(R3)

         EX    R2,LISTMVC

         CLI   FLAGOUT,C'O'

         BNE   LISTPUT

         CLC   =C'OUT',SDDNAME

         BNE   LISTPUT

         LA    R1,LINE+31(R2)

         MVC   0(3,R1),=C'DD='

         MVC   3(4,R1),SDDNAME

LISTPUT  PUT   SYSPRINT,LINE-1

         MVC   LINE,LINE-1

         LA    R3,LSTRING(R3)

         C     R3,ENDSTRIN

         BL    LISTSTRM

         PUT   SYSPRINT,LINE-1

         BR    R9

ED7      DC    X'4020202020202120'

* LISTTR   TR    LINE+27(0),0(R14)  TOEBCDIC

LISTMVC  MVC   LINE+27(0),SSTRING

         DROP  3

* +++++++++++++++++++++++++++++++++++++++++++++++

READAREC LA    R10,1(R10)

         GET   IN

         LA    R1,0(R1)

         ST    R1,PUT-12

         ST    R1,PUT-4

         LH    R0,DCBLRECL-IHADCB+IN

         CLI   RECFM,C'V'

         BNE   NOTVB

         LH    R0,0(R1)

         SH    R0,=H'4'

         LA    R1,4(R1)

NOTVB    STM   R0,R1,LRECL

*

         CLI   FLAGTR,C' '

         BER   R9

         L     R14,=A(TOASCII)

         CLI   FLAGTR,C'A'

         BE    *+8

         L     R14,=A(TOEBCDIC)

         L     R2,LRECL

         BCTR  R2,0

TRLOOP   CH    R2,=H'255'

         BL    TRSHORT

         TR    0(256,R1),0(R14)

         LA    R1,256(R1)

         SH    R2,=H'256'

         B     TRLOOP

         TR    0(0,R1),0(R14)

TRSHORT  EX    R2,*-6

         BR    R9

*

WRITAREC L     R0,PUT-12

         PUT   OUT,(0)

         LA    R11,1(R11)

         AP    #OUT,P1

         BR    R9

*

         DC    F'0'

LRECL    DC    F'0'

         DC    F'0'

PUT      BAL   R9,WRITAREC

GET      BAL   R9,READAREC

GETGOT   L     R1,PUT-4

         LR    R8,R1

         AP    #IN,P1

         LA    R4,0(R1)

         A     R4,LRECL 

         SR    R2,R2

         LA    R0,255

         B     TEST

*

         L     R1,DW

TRYAGAIN LA    R1,1(R1)

TEST     LR    R3,R4

         SR    R3,R1

         AP    #TRT,P1

         CR    R3,R0

         BNH   TRTSHORT

         CLC   0(133,R1),PARM

         BE    GET

         TRT   0(256,R1),TRTTABLE

         BNZ   TRTFOUND

         LA    R1,255(R1)

         B     TRYAGAIN

*

         TRT   0(0,R1),TRTTABLE

TRTSHORT EX    R3,TRTSHORT-6

         BZ    GET

TRTFOUND ST    R1,DW

         LR    R5,R2

         MH    R5,=AL2(LSTRING)

         LA    R6,STRINGS-LSTRING(R5)

         USING STRDSECT,6

NEXTSTR  SH    R1,SOFFSET

         C     R1,PUT-4

         BL    NOT

         LH    R14,SLENGTH

         LA    R15,0(R14,R1)

         CR    R15,R4

         BNL   NOT

*

         EX    R14,MVCFIELD

         CLI   FLAGASCI,C'A'

         BNE   XOCFIELD

         L     R15,=A(TOEBCDIC)

         TR    12(32,R13),0(R15)

         B     XOCFIELD

*

MVCFIELD MVC   12(0,R13),0(R1)

CLCFIELD CLC   12(0,R13),SSTRING

OCFIELD  OC    12(0,R13),LINE

*

XOCFIELD EX    R14,OCFIELD

COMPARE  AP    #CLC,P1

         EX    R14,CLCFIELD

         BNE   NOTFOU

         AP    SCOUNT,P1

         CLI   FLAGOUT,C'O'

         BNE   PUT

*

         L     R14,SDCBADDR

         USING DCBDSECT,14

         AP    DCBCOUNT,P1

         L     R0,PUT-12

         PUT   (14),(0)

         B     NOT

         DROP  14

*

NOTFOU   CLC   SCHAR,SCHAR+LSTRING

         BNE   TRYAGAIN-4

NOT      LA    R6,LSTRING(R6)

         C     R6,ENDSTRIN

         BNL   GET

         L     R1,DW

         B     NEXTSTR

         DROP  6

* +++++++++++++++++++++++++++++++++++++++++++

         DC    4F'0'

ERR      MVC   LINE(5),=C'ERROR'

MSG      STM   14,1,ERR-16

         LA    R0,0(R14)

         SR    R0,R13

         ST    R0,DW

         UNPK  LINE+6(5),DW+2(3)

         TR    LINE+6(4),HEX-240

         MVI   LINE+10,C' '

         SR    R15,R15

         IC    R15,0(R1)

         MVC   LINE+12(0),1(R1)

         EX    R15,*-6

*        LA    R15,LINE+15(R15)

*        MVC   0(8,R15),0(R3)

         PUT   SYSPRINT,LINE-1

         CLI   LINE,C'E'

         LM    14,1,ERR-16

         MVC   LINE,LINE-1

         BNER  R14

         OI    RC,8

         B     Z

*

QOFFSET  LA    3,STRINGS

         LA    R2,1

         SR    R1,R1

         XC    TRTTABLE,TRTTABLE

*

         USING STRDSECT,3

QOFFSETA IC    R1,SCHAR

         CLI   FLAGASCI,C'A'

         BNE   QOFFSETB

         STC   R1,DW

         L     R15,=A(TOASCII)

         TR    DW(1),0(R15)

         IC    R1,DW

QOFFSETB LA    R4,TRTTABLE(R1)

         STC   R2,0(R4)

         STC   R2,6(R3)

         TR    6(1,R3),HEX

*

QOFFSETC MVC   SDDNAME,=C'OUT'

         STC   R2,SDDNAME+3

         TR    SDDNAME+3(1),HEX

         CLC   SCHAR,SCHAR+LSTRING

         LA    R3,LSTRING(R3)

         LA    R2,1(R2)

         BE    QOFFSETC

         C     R3,ENDSTRIN

         BL    QOFFSETA

         BCTR  R2,0

         ST    R2,#FILES

         BR    R9

*

         DC    F'0'

GETMAIN  CLI   FLAGOUT,C'O'

         BNER  R9

         ST    R9,GETMAIN-4

*

         L     R0,#FILES

         MH    0,=AL2(LDCB)

         ST    R0,LGETMAIN

         GETMAIN  R,LV=(0)

         ST    R1,AGETMAIN

*

         LA    R4,1

         LR    R2,R1

         USING DCBDSECT,R2

         LA    R3,STRINGS

*

OPENDCBS ST    R2,SDCBADDR

         MVC   DCBDD,SDDNAME

         ZAP   DCBCOUNT,P0

         MVC   DCBRECFM-IHADCB+OUT1(1),DCBRECFM-IHADCB+IN

         MVC   DCBLRECL-IHADCB+OUT1(2),DCBLRECL-IHADCB+IN

         MVC   DCBDDNAM-IHADCB+OUT1(4),SDDNAME

         MVC   DCBDCB,OUT1

         BAL   R9,OPENOUT

         LA    R2,LDCB(R2)

         LA    R3,LSTRING(R3)

         LA    R4,1(R4)

         C     R3,ENDSTRIN

         BL    OPENDCBS

         L     R9,GETMAIN-4

         BR    R9

         DROP  3,2

*

OPENMSG  DC    CL54'OPENED FOR OUTPUT, RECFM=...LRECL=..... BLKSIZE='

         USING IHADCB,2

OPENIN   MVC   LINE(8),DCBDDNAM

         MVC   OPENMSG+11(3),=C' IN'

         PUSH  PRINT

         PRINT NOGEN

         OPEN  ((2),INPUT)

         B     OPENUNPK

OPENOUT  MVC   LINE(8),DCBDDNAM

         MVC   OPENMSG+11(3),=C'OUT'

         CLC   =H'0',DCBLRECL

         BNE   OPENOUTO

         MVC   DCBRECFM,DCBRECFM-IHADCB+IN

         MVC   DCBLRECL,DCBLRECL-IHADCB+IN

OPENOUTO OPEN  ((2),OUTPUT)

         POP   PRINT

OPENUNPK UNPK  OPENMSG+25(3),DCBRECFM(2)

         TR    OPENMSG+25(2),HEX-240

         MVI   OPENMSG+27,C' '

         LH    R0,DCBLRECL

         CVD   R0,DW

         OI    DW+7,X'0F'

         UNPK  OPENMSG+34(5),DW+5(3)

         LH    R0,DCBBLKSI

         CVD   R0,DW

         OI    DW+7,X'0F'

         UNPK  OPENMSG+48(5),DW+5(3)

         MVC   LINE+9(L'OPENMSG),OPENMSG

         PUT   SYSPRINT,LINE-1

         MVC   LINE,LINE-1

         BR    R9

         DROP  2

*

BUBBLE   L     R3,ENDSTRIN

         LA    R0,LSTRING

         SR    R3,R0

BUBBLEA  LA    R2,STRINGS

         CR    R2,R3

         BNLR  R9

BUBBCLC  CLC   7(L'SSTRING,R2),7+LSTRING(R2)

         BNH   *+22

         MVC   12(LSTRING,R13),0(R2)

         MVC   0(LSTRING,R2),LSTRING(R2)

         MVC   LSTRING(LSTRING,R2),12(R13)

         LA    R2,LSTRING(R2)

         CR    R2,R3

         BL    BUBBCLC

         SR    R3,R0

         B     BUBBLEA

* --------------------------------------------------------

*  FIND THE LEAST FREQUENT CHAR IN THE STRING TO KEY TRT SCAN ON.

*  R2 = 2-BYTE LENGTH,  FOLLOWED BY STRING

*  R4 = CHAR, OFFSET TO CHAR, # BYTES FROM END OF STRING.

*       TO NOT OVERFLOW PAST END OF RECORD.

*

*  R0 = A(FIRST CHAR OF STRING TO CALC OFFSET)

*  R3 = # TIMES TO GO THRU LOOP, TESTING CHARS

*  R5 = CHAR TO BE TESTED

*  R6 = LOCATION IN FREQ TABLE

*  R7 = LOC OF LOWEST ENTRY IN FREQ TABLE

*  R1 = OFFSET TO LEAST FREQ CHAR

*  R8 = LENGTH AFTER LEAST FREQ CHAR, TO NOT OVERFLOW.

*

QFREQ    STM   R14,R8,12(R13) OINT TO FIRST BYTE (TO CALC OFFSET)

         LA    R0,2(R2)       POINT TO FIRST BYTE (TO CALC OFFSET)

         LA    R7,=H'255'+1   AND REALLY HIGH TABLE TARGET VALUE

*

         LH    R3,0(R2)       LENGTH OF STRING

         LTR   R3,R3          Q. ZERO?

         BNZ   *+8               NO, OKAY.

         EX    0,*               YES, LOGIC ERROR

         LR    R8,R3          DUP STRING LENGTH

         STH   R3,0(R4)

         LA    R3,1(R3)

         SR    R5,R5

* --------------------------------------------------

QFREQLOP IC    R5,2(R2)            LOAD CHAR

         LA    R6,FREQTBL(R5)          OFFSET IN FREQ TBL

         CLC   0(1,R6),0(R7)         Q. NEW LOW FREQ

         BNL   QFREQNOT                 NO.

         MVC   7(1,R4),2(R2)            YES, SAVE THE CHAR

         LR    R7,R6               SAVE ADDR OF LOW FREQ

         LA    R1,2(R2)            POINT TO CHAR

*

QFREQNOT LA    R2,1(R2)

         BCT   R3,QFREQLOP

* --------------------------------------------------

         SR    R1,R0               CALC OFFSET TO CHAR

         STH   R1,2(R4)       SAVE OFFSET TO CHAR

         SR    R8,R1          CALC LENGTH AFTER CHAR

         STH   R8,4(R4)       SAVE TO PREVENT OVERFLOW PAST END OF REC.

         MVI   6(R4),C' '

         LM    R14,R8,12(R13)

         BR    R14

*

CLOSE    TM    DCBOFLGS-IHADCB(R2),DCBOFOPN

         BZR   R9

         CLOSE ((2))

         TM    DCBOFLGS-IHADCB+SYSPRINT,DCBOFOPN

         BZR   R9

         MVC   LINE(8),DCBDDNAM-IHADCB(R2)

         MVC   LINE+9(6),=C'CLOSED'

         PUT   SYSPRINT,LINE-1

         BR    R9

*

#OUT     DC    PL5'0',CL16'RECORDS WRITTEN'

#IN      DC    PL5'0',CL16'RECORDS READ'

#PARMS   DC    PL5'0',CL16'SCAN PARMS SAVED'

#TRT     DC    PL5'0',CL16'TRT INSTS USED'

#CLC     DC    PL5'0',CL16'CLC INSTS USED'

         DC    X'FF'

ED9      DC    X'402020206B2020206B212020'

TOTALS   LA    R2,#IN

         CLI   FLAGOUT,C'O'

         BE    *+8

         LA    R2,#OUT

TOTALSMV MVC   LINE(L'ED9),ED9

         ED    LINE(L'ED9),0(R2)

         MVC   LINE+L'ED9+2(16),5(R2)

         PUT   SYSPRINT,LINE-1

         LA    R2,21(R2)

         LA    R2,#CLC-#CLC(R2)

         CLI   0(R2),X'99'

         BL    TOTALSMV   

         MVC   LINE,LINE-1

         CLI   FLAGOUT,C'S'

         BNER  R9

         LA    R3,STRINGS

         USING STRDSECT,R3

         EX    0,*

         DROP  R3

         BR    R9

*

NOPARM   OI    RC,8

         B     ZTOTALS

Z        MVI   FLAGLIST,C'L'

         BAL   R9,LISTSTR

ZTOTALS  BAL   R9,TOTALS

         CLI   FLAGOUT,C'O'

         BNE   CLOSEIN

         PUT   SYSPRINT,LINE-1

         LA    R3,STRINGS

         USING STRDSECT,3

CLOSOUT  L     R2,SDCBADDR

         USING DCBDSECT,2

         TM    DCBOFLGS-IHADCB(R2),DCBOFOPN

         BE    OUTNOTOP

*

         MVC   LINE+4(L'ED7),ED7

         ED    LINE+4(L'ED7),DCBCOUNT

         MVC   LINE+6+L'ED7(4),DCBDD

         CLOSE ((2))

         MVC   LINE+12+L'ED7(6),=C'CLOSED'

         PUT   SYSPRINT,LINE-1

         MVC   LINE,LINE-1

OUTNOTOP LA    R3,LSTRING(R3)

         C     R3,ENDSTRIN

         BL    CLOSOUT

         PUT   SYSPRINT,LINE-1

         DROP  3,2

*

CLOSEIN  LA    R2,IN

         BAL   R9,CLOSE

         LA    R2,OUT

         BAL   R9,CLOSE

         LA    R2,SYSPRINT

         BAL   R9,CLOSE

         SR    15,15

         IC    15,RC

         L     13,4(13)

         L     14,12(13)

         LM    0,12,20(13)

         BR    14

*

PRINTDOC LA    R4,DOC-1

         SR    R5,R5

DOCLOOP  IC    R5,0(R4)

         MVC   LINE(0),1(R4)

         EX    R5,*-6

         PUT   SYSPRINT,LINE-1

         MVC   LINE,LINE-1

         CLI   FLAGDOC,C'D'

         BNER  R9

         LA    R4,2(R4,R5)

         C     R4,=A(ENDDOC)

         BL    DOCLOOP

         BR    R9

         LTORG

*

#FILES   DC    F'0'

LGETMAIN DC    F'0'

AGETMAIN DC    F'0'

P0       DC    X'0C'

P1       DC    X'1C'

RC       DC    X'00'

RECFM    DC    C' '

FLAGLIST DC    C' '

FLAGOUT  DC    C' '

FLAGDOC  DC    C' '

FLAGASCI DC    C' '

FLAGTR DC      C' '

SEPAR    DC    C','

ENDSTRIN DC    A(0)

HEX      DC    C'0123456789ABCDEF',C'GHIJKLMNOPQRSTUVWXYZ'

DW       DC    2D'0'

PARMPUT  DC    C' PARM='

PARM     DC    CL133' ',CL8' '

LINE     DC    CL133' '

*

         CNOP  0,8

TRTTABLE DS    0XL256

FREQTBL  DC    256X'05'

         ORG   FREQTBL

         DC    X'191817'

         ORG   FREQTBL+X'20'      BLANK + SPECIAL CHARS

         DC    X'44',15X'09'

         ORG   FREQTBL+X'30'      ASCII NUMBERS

         DC    X'20191817161514131211'

         ORG   FREQTBL+X'40'      ASCII UPPER CASE LETTERS

         DC   X'442407131625100818220405151220230803171921140611040903'

         DC    6X'08'             SPECIAL CHARS,THEN LOWER CASE LETTERS

         DC   X'022407131625100818220405151220230803171921140611040903'

         DC    5X'08'

         ORG   FREQTBL+X'80'

         DC    X'05240713162510081822',6X'05'   EBCDIC LOWER CASE

         DC    X'05040515122023080317',6X'05'

         DC    X'05051921140611040903',6X'05'

         DC    16X'05'

         ORG   FREQTBL+X'C0'

         DC    X'05240713162510081822',6X'05'     UPPER CASE

         DC    X'05040515122023080317',6X'05'

         DC    X'05051921140611040903',6X'05'

         DC    X'20191817161514131211',6X'05'

         ORG

*

         PUSH  PRINT

         PRINT NOGEN

IN       DCB   DDNAME=IN,DSORG=PS,MACRF=GL,LRECL=188,RECFM=FT,EODAD=Z

OUT      DCB  DDNAME=OUT,DSORG=PS,MACRF=PM

OUT1     DCB  DDNAME=OUT1,DSORG=PS,MACRF=PM

SYSPRINT DCB  DDNAME=SYSPRINT,DSORG=PS,LRECL=133,RECFM=FT,MACRF=PM

         POP   PRINT

STRINGS  DC    0CL48' ',A((ENDDOC-*-48)/48)

*

         DC    AL1(L'DOC-1)

DOC      DC    C'SCANTEXT, ASM &SYSDATE AT &SYSTIME FIND TEXT STRINGS. C

               CODE PARM=DOC FOR DESCRIPTION'

 @ 'COPY RECORDS THAT CONTAIN STRINGS SPECIFIED IN THE PARM FIELD.'

 @ 'THE SEARCH IS DONE FOR A MIX OF UPPER AND LOWER CASE.'

 @ 'AND THE INPUT FILE CAN BE EITHER EBCDIC OR ASCII.'

 @ ' '

 @ 'IF YOU ARE SEARCHING FOR A STRING, YOU CAN CODE JUST THAT STRING'

 @ 'IN THE PARM FIELD, AND SCANTEXT WILL SEARCH FOR UPPER AND LOWER'

 @ 'CASES OF THAT STRING, AND YOU CAN IGNORE THE REST OF THIS.'

 @ ' '

 @ 'HOWEVER, I HAVE GONE TO CONSIDERABLE TROUBLE TO ALLOW USERS TO'

 @ 'SEARCH FOR MULTIPLE STRINGS IN A SINGLE PASS. AND, YOU CAN SEARCH'

 @ 'FOR A STRING THAT CONTAINS A COMMA,BY USING A DIFFERENT DELIMITER.'

 @ 'YOU COULD EVEN USE BLANK AS A DELIMITER, "BUT ONLY 1".'

 @ ' '

 @ 'EVEN BETTER, THE DEFAULT IS TO WRITE ALL SELECTED RECORDS TO THE'

 @ '//OUT FILE, BUT YOU CAN SPECIFY "OUTFILES" IN THE PARM, AND THE'

 @ 'RECORDS WILL BE WRITTEN TO INDIVIDUAL  "//OUT#"  FILES.'

 @ ' '

 @ 'IN ORDER TO ALLOW USERS TO SEARCH FOR A STRING WITH A COMMA, THE'

 @ 'PARM FIELD MUST START WITH A COMMA, OR ALTERNATE SEPARATOR.'

 @ 'FOLLOWING THAT ARE KEYWORDS, FOLLOWED BY STRINGS.  KEYWORDS ARE:'

 @ ' '

 @ 'LISTSTATS- PRINT THE CONTROL TABLE 4 TIMES DURING PROCESSING'

 @ 'ASCIITR  - FOR TESTING, TO CHANGE EBCDIC INPUT TO ASCII'

 @ 'EBCDICTR - JUST BECAUSE'

 @ 'DOC      - PRINT THIS DESCRIPTION'

 @ 'OUTFILES - CREATE MULTIPLE //OUT# FILES'

 @ 'ASCII    - INPUT FILE IS ASCII'

 @ 'EBCDIC   - INPUT FILE IS EBCDIC'

 @ ' (THE PROGRAM CHECKS THE FIRST RECORD TO GUESS WHETHER IT IS'

 @ '  AN ASCII OR EBCDIC FILE, BUT DOES NOT ALWAYS GET IT RIGHT.)'

 @ 'LRECL=##### TO USE A LARGER LRECL FOR THE //IN FILE.'

 @ ' '

 @ 'FOLLOWING THE KEYWORDS ARE THE SELECT STRINGS.'

 @ 'FOR TESTING, I READ AN ASSEMBLER LISTING AND LOOKED FOR'

 @ ' '

 @ ',MVC,STM,BAL,BUBBLE,QFREQ,TRT,FLAG,EQ,UNPK,USING,DROP,LA    R1,DW'

 @ '(BUT WHEN I WAS WRITING MULTIPLE OUT FILES, THE LIST WAS SHORTER.)'

 @ ' '

 @ '//SCAN  EXEC  PGM=SCANTEXT,PARM=",OUTFILES,MVC,STC,ASSEMBLER"'

 @ '//STEPLIB  DD DISP=SHR,DSN='

 @ '//SYSPRINT DD SYSOUT=*'

 @ '//IN   DD DISP=SHR,DSN='

 @ '//OUT  DD SYSOUT=*'

 @ '//OUT1 DD SYSOUT=*'

 @ '//OUT2 DD SYSOUT=*'

 @ '//OUT3 DD SYSOUT=*'

 @ ' '

 @ 'THERE ARE COUNTS AT THE END OF THE RUN THAT SHOW HOW MANY TIMES'

 @ 'EACH STRING WAS FOUND. UNLESS "OUTFILES" IS SPECIFIED, ONLY THE'

 @ 'FIRST OCCURRENCE OF A STRING IN A RECORD IS COUNTED.  AND, ALL'

 @ 'THE RECORDS GO TO THE //OUT FILE, RATHER THAN INDIVIDUAL FILES.'

 @ ' '

ENDDOC   EQU   *

*

*

* THESE CHARACTERS CANNOT BE TRANSLATED FROM EBCDIC TO ASCII AND BACK.

* GENERALLY BECAUSE THERE ARE NO EQUIVALENT ASCII CHARACTERS.

* BUT FOR THE PROGRAM TO WORK, IT MUST TRANSLATE BOTH WAYS,

* SO NONE OF THESE CAN BE INCLUDED IN A STRING SELLECT.

*

UNTRAN   DC   256X'00'

         ORG  UNTRAN+08

         DC   X'08'

         ORG  UNTRAN+X'1A'

         DC   X'1A'

         ORG  UNTRAN+X'25'

         DC   X'25'

         ORG  UNTRAN+X'33'

         DC   X'33343536'

         ORG  UNTRAN+X'71'

         DC   X'71'

         ORG  UNTRAN+X'61'

         DC   X'61'

         ORG  UNTRAN+X'90'

         DC   X'90'

         ORG  UNTRAN+X'AD'

         DC   X'AD'

         ORG  UNTRAN+X'BF'

         DC   X'BF'

         ORG  UNTRAN+X'DA'

         DC   X'DA'

         ORG  UNTRAN+X'B8'

         DC   X'B8'

         ORG  UNTRAN+X'59'

         DC   X'59'

         ORG  UNTRAN+X'31'

         DC   X'31'

         ORG

*

* THIS IS A MORE COMPLETE TABLE OF EBCDIC CHARACTERS THAT

* CANNOT BE TRANSLATED INTO ASCII, AND SO CANNOT BE USED

* IN STRING SELECT PARAMETERS FOR ASCII INPUT FILES.

*

NOTASCII DC    X'000000001A001A001A1A1A0000000000'

         DC    X'000000001A1A001A00001A1A00000000'

         DC    X'1A1A1A1A1A0000001A1A1A1A1A000000'

         DC    X'1A1A001A1A1A1A001A1A1A1A00001A1A'

         DC    X'001A1A1A1A1A1A1A1A1A000000000000'

         DC    X'001A1A1A1A1A1A1A1A1A000000000000'

         DC    X'001A1A1A1A1A1A1A1A1A000000000000'

         DC    X'1A1A1A1A1A1A1A1A1A00000000000000'

         DC    X'1A0000000000000000001A1A1A1A1A1A'

         DC    X'1A0000000000000000001A1A1A1A1A1A'

         DC    X'1A0000000000000000001A1A1A1A1A1A'

         DC    X'1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A'

         DC    X'000000000000000000001A1A1A1A1A1A'

         DC    X'000000000000000000001A1A1A1A1A1A'

         DC    X'001A00000000000000001A1A1A1A1A1A'

         DC    X'000000000000000000001A1A1A1A1A1A'

*

*

* HTTPS://WWW.IBM.COM/DOCS/EN/IIS/11.7?TOPIC=TABLESBCDIC-ASCII

*

         CNOP  0,8

TOASCII  DC    X'000102031A091A7F1A1A1A0B0C0D0E0F'

         DC    X'101112131A1A081A18191A1A1C1D1E1F'

         DC    X'1A1A1A1A1A0A171B1A1A1A1A1A050607'

         DC    X'1A1A161A1A1A1A041A1A1A1A14151A1A'

         DC    X'201A1A1A1A1A1A1A1A1A5B2E3C282B21'

         DC    X'261A1A1A1A1A1A1A1A1A5D242A293B5E'

         DC    X'2D1A1A1A1A1A1A1A1A1A7C2C255F3E3F'

         DC    X'1A1A1A1A1A1A1A1A1A603A2340273D22'

         DC    X'1A6162636465666768691A1A1A1A1A1A'

         DC    X'1A6A6B6C6D6E6F7071721A1A1A1A1A1A'

         DC    X'1A7E737475767778797A1A1A1A1A1A1A'

         DC    X'1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A'

         DC    X'7B4142434445464748491A1A1A1A1A1A'

         DC    X'7D4A4B4C4D4E4F5051521A1A1A1A1A1A'

         DC    X'5C1A535455565758595A1A1A1A1A1A1A'

         DC    X'303132333435363738391A1A1A1A1A1A'

*

*

TOEBCDIC DC    X'000102031A091A7F1A1A1A0B0C0D0E0F'

         DC    X'101112133C3D3226181961271C1D1E1F'

         DC    X'404F7F7B5B6C507D4D5D5C4E6B604B61'

         DC    X'F0F1F2F3F4F5F6F7F8F97A5E4C7E6E6F'

         DC    X'7CC1C2C3C4C5C6C7C8C9D1D2D3D4D5D6'

         DC    X'D7D8D9E2E3E4E5E6E7E8E94AE05A5F6D'

         DC    X'79818283848586878889919293949596'

         DC    X'979899A2A3A4A5A6A7A8A9C06AD0A107'

         DC    128X'3F'          80-FF   3F

*

*

*

* DCB DDNAME=IN,DSORG=PS,DEVD=DA,MACRF=GL,BLKSIZE=32767,RECFM=U,EODAD=Z

*UT  DCB   DDNAME=OUT,DSORG=PS,DEVD=DA,LRECL=110,RECFM=FB,MACRF=PM

*

*        DCBD  DEVD=DA

*

@@PAD#1  EQU   ((*-SCANTEXT)/4096+1)*4096

@@PAD#2  EQU   @@PAD#1-(*-SCANTEXT)

         ORG   *+@@PAD#2

*

DCBDSECT DSECT 0

DCBDCB   DS    XL104

DCBDD    DS    CL4

DCBCOUNT DS    CL4

LDCB     EQU   *-DCBDSECT

*

STRDSECT DSECT 0

SLENGTH  DS    H

SOFFSET  DS    H

SREMAIN  DS    H

SINDEX   DS    C

SCHAR    DS    C

SSTRING  DS    CL28

SCOUNT   DS    PL4

SDDNAME  DS    CL4

SDCBADDR DS    F

LSTRING  EQU   *-STRDSECT

*

         END   SCANTEXT