MYSCAN
MYSCAN is (well, will be when it's finished) yet another "read a file and copy selected records" program. In the '70s, I wrote a simple program that read the parm field, which could contain multiple arguments and would read the input file and copy only records that contained one of those arguments. A couple years after I did that, the bank leased DUMPER, from Joe Blank, who wrote it while he worked at Fireman's Fund Insurance Company. They had a huge master file, and ran updates once a week. After the update, they'd use DUMPER to rad the file and split out selected records to various extract files, to be used by applications, so they didn't have to pass the entire mater file. He also created ISPF panels to use DUMPER from your desk. His program wasn't faster than mine, but it was worlds better. In any case, I've always liked that idea, and have written several such, some of which are also in google-sites.
DUMPER record select control cards look like:
IF=(1,0,C'My Name') which would copy all records with My Name somewhere in them.
IF=(9,EQ,X'C1'),AND=(12,EQ,P'12345'),OR=(12,EQ,P'54321') Which checks for 'A' in col-9 and looks for 12345 or 54321 in col-12
For the program I'm working on, currently titled MYSCAN, there are 3 parts.
1. loading the file links I'll be using.
2. loading the record select entries.
2b. connecting the file links to the record select entries that will use them.
3. actually scanning and selecting records and writing them.
I think that the first 2 steps work. A few days ago, I rewrote most of that code, more simply than it had been. And there's a trace that seems to show that it works correctly. Right this minute, there's error correction, and more code needs to be written, step-3 and I'm tired and not sure I'm up to it. When that happens, it's time to write notes.
There are rules, but you have to know them to know whether "OR" applies to the IF or to the AND.
To address that, I'd like to be able to code:
IF=(1,EQ,C'ABC'),ANDOR=(11,0,C'MY NAME,WRITE=A,11,0,C'YOUR NAME',WRITE=B)
meaning you're still dealing with ABC records, and if 'my name' appears in one of those records, write that record to file-A, or if 'your name' appears, write the record to file-B.
So, in addition to IF=, AND=, OR=, you have:
IF= IFAND= IFOR=
AND= ANDAND= ANDOR=
OR= ORAND= OROR=
DUMPER had a very nice edit function in it. I have a limited edit function, that, at the moment, will only replace a string with another of the same length. (I hope I can improve on that, to process different lengths, but the same length is much easier.)
When you're writing a record, you can write the entire record. OR, you can write selected parts of the record, inserting hard coded strings in the record if you'd like.
The 5 data types, that can be used in either/both the record select, or the WRITE specs, are:
C'ABC' normal character data
T'Abc' either upper of lower case data
L'ABC' lower case data
P'1234' or P'-1234' packed decimal numeric data
F'4321' of F'-4321' 4-byte binary data
You can GOTO=ALABEL (skip ahead in the instruction stream).
And the control file can have several logical files within it, using STARTEND= (17 chars).
You can code that, and processing will start where it finds the STARTEND=jobname.stepname that you specify, and stop when it encounters any other STARTEND= in the instruction stream. (So I can have all my various test streams in a single file, and use the one I want to test specifically.)
AGO .START
C:\USERS\LIN\DOCUMENTS\Z390CODE\MYSCAN
SET PA="DETAIL,MAX=16000 "
SET G=C:\USERS\LIN\DOCUMENTS\Z390CODE\MYSCAN
SET IN=%G%.PRN
SET OUT=%G%.OUTPUT.OUT.TXT
SET DSDC=%G%.OUTPUT.DSDC.TXT
SET ORG=%G%.OUTPUT.ORG.TXT
SET MVI=%G%.OUTPUT.MVI.TXT
SET MVC=%G%.OUTPUT.MVC.TXT
SET ST=%G%.OUTPUT.ST.TXT
SET FILE0000=%G%.OUTPUT.FILE0000.TXT
SET SYSPRINT=%G%.OUTPUT.SYSPRINT.TXT
SET SYSIN=%G%.SYSIN.TXT
BAT\ASMLG %G%.MLC TIME(1) PARM(%PA%)
SET LISTING=C:\USERS\LIN\DOCUMENTS\Z390CODE\MYSCAN.PRN
SET SYSIN=C:\USERS\LIN\DOCUMENTS\Z390CODE\MYSCAN.BREAK.SYSIN.TXT
BAT\EZ390 C:\USERS\LIN\DOCUMENTS\Z390CODE\RANDY.MLC
LOADLOC=FD000 13R%
LRECL=90
LABEL=PRINTR2,ERR*,MSG*,Z,ZS,GETMAIN,TRY*,SET*,SAV*,QFREQ,QS1*,QS9*
LABEL=TES*,EDIT0*,GETIN,WRITOUT,
IF=(1,0,C'ABE'),WRITE=(1,4,11,12,33,22)=DDNAME
IFAND=(1,0,T'DEF',4,EQ,X'22'),SUM=(NAME,22,8)
IFOR=(1,EQ,C'ABC',1,EQ,X'C1C2C3'),GOTO=.LABEL
AND=(11,9,C'DEF')
OR=(12,GT,X'121313')
ANDAND=(11,9,C'DEF',22,23,T"GHI")
ANDOR=(
ORAND=(
OROR=(
.LABEL
THERE IS A LOGIC PROBLEM
WHEN THERE IS A FAILURE, DO YOU ALWAYS GO TO THE NEXT IF=
OR
IF=( SUCCESSFUL
AND=( FAIL
OR=( DOES THIS GO BACK TO IF= OR GET SKIPPED BECAUSE OF AND=
OR GET DONE, BECAUSE OF AND=?
ALLOWING THE DOUBLE VERB HELPS THAT LOGIC QUITE A BIT.
DATA TYPES ARE
X HEX
C CHARACTER
T TEXT (EITHER UPPER OR LOWER CASE CHARACTER)
L LOWER CASE (LOWER CASE CHARACTER)
P PACKED DECIMAL
F 4 BYTES
.START ANOP
*
* ---------------------------------------
MACRO
&LBL MSG &BC,&MSG,&TYPE,&ERRLOC=EXIT8 MSG, ERR, OR TRACE
CNOP 0,2
&LBL REVB &BC,SYS&SYSNDX+4
BAL R0,SYS&SYSNDX
DC AL3(&ERRLOC)
@ &MSG
CNOP 0,2
SYS&SYSNDX BAL R14,PUT&TYPE
MEND
* ---------------------------------------
MACRO
&LBL @ &MSG
LCLA &L
&L SETA (K'&MSG-3)
&LBL DC AL1(&L),C&MSG
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
* ----------------------------------------
* MACRO
* &LBL $$LA &R,&F
* AIF ('&F'(1,1) EQ '(').ADD0
* &LBL LA &R,&F
* MEXIT
* .ADD0 ANOP
* &LBL LA &R,0&F
* MEND
* ----------------------------------------
MYSCAN START 0
YREGS
LSTRING EQU 30
USING *,13,12,11
DS 18F
ORG *-72
STM 14,12,12(13)
ST 13,4(15)
ST 15,8(13)
LR 13,15
LA 11,4095
LA 12,1(11,13)
LA 11,1(11,12)
L R4,0(R1)
B SETUP
ORG
*
TRTTB EQU *
TRTTABLE EQU TRTTB+256
TRTTEXT EQU TRTTB+512
FINDSPAC EQU TRTTABLE-C' '
*
PUSH PRINT
PRINT NOGEN
SETUP OPEN (SYSIN,INPUT,SYSPRINT,OUTPUT)
POP PRINT
PUT SYSPRINT,LINE-1
PUT SYSPRINT,PARM-1
MVC LINE,LINE-1
MVC PARM,LINE
SR R5,R5
LH R2,0(R4)
SH R2,=H'1'
LA R7,80(R13)
BM NOPARM
*
MVC PARM(5),=C'PARM='
MVC PARM+5(0),2(R4)
EX R2,*-6
LA R6,PARM+5
BAL R8,TESTPARM
SR R8,R8
B NOPARM
*
* ALRIGHT, THIS IS ALL A RAT'S NEST. WE DO THE PARM PROCESSING NERE.
* IF THERE IS NO PARM, THEN WE READ //SYSIN WHICH CAN HAVE:
* PARM= TO COME BACK AND DO THIS.
* * INITIAL COMMENTS WHICH ARE INTENDED TO BE DOCUMENTATION
* STARTAT=LABEL USED TO SKIP INTO //SYSIN TO START OF CARDS.
* YEAH, IT CONFUSED ME AS WELL. SORRY !!!
* -------------------------------------------------------
TESTPARL MVC PARM+5(88),0(R6)
TESTPARM CLI PARM+5,C' '
BER R8
PUT SYSPRINT,PARM-1
LA R6,PARM+5
CLC =C'TEST=X''',0(R6)
BNE TRYLIST
TR 7(2,R6),TRHEX
PACK FLAGTEST(2),7(3,R6)
LA R6,11(R6)
B TESTPARL
*
TRYLIST CLC =C'LIST=',0(R6)
BNE NOTLIST
MVC FLAGLIST,5(R6)
CLI 5(R6),C'0'
BNL *+12
LA R6,7(R6)
B TESTPARL
*
MVC FLAGLIST,PARM+88
MVI FLAGLIST,C'N'
LA R6,5(R6)
BAL R9,GET#
STH R1,FLAGLIST+1
LA R6,1(R6)
LA R4,FLAGLIST+3
BAL R9,QQTEXT
MVC PARM,PARM-1
B TESTPARL
*
NOTLIST CLC =C'GETMAIN=',0(R6)
BNE NGETMA
LA R6,8(R6)
BAL R9,GET#
ST R1,LGETMAIN
LA R6,1(R6)
B TESTPARL
*
NSTA MSG B,'INVALID PARM= KEYWORD',ERR6,ERRLOC=EXIT8
*
NGETMA CLC =C'STARTEND=',0(R6)
BNE NSTA
LTR R5,R5
BNZ SAVSTA
MSG B,'CANNOT HAVE STARTEND= IN //SYSIN',ERR6,ERRLOC-EXIT8
SAVSTA TRT 0(23,R6),FINDEND
MSG BZ,'STARTEND= TOO LONG',ERR6,ERRLOC=EXIT8
LR R2,R1
BCTR R2,0
SR R2,R6
MVC STARTEND(0),0(R6)
EX R2,*-6
*
MVC 0(88,R6),1(R1)
B TESTPARL
* ----------------------------------------------------------
*
NOPARM MVC PARM,PARM-1
BAL R9,GETCARD
CLC =C'PARM=',0(R6)
BNE QSTART
MVC PARM(80),0(R6)
BAL R8,TESTPARM
B NOPARM
*
QSTART CLI STARTEND,C' '
BE GETMAIN
CLCSTART CLC STARTEND,0(R6)
BE GOTSTART
BAL R9,GETCARD
B CLCSTART
GOTSTART MVC LINE(L'STARTEND),STARTEND
MVC LINE+L'STARTEND(5),=C'FOUND'
BAL R14,PUTLINE
BAL R9,GETCARD
MVC STARTEND,PARM+88
*
GETMAIN L R0,LGETMAIN
GETMAIN R,LV=(0)
LA R4,0(R1)
ST R4,AGETMAIN
ST R4,IFANDOR
ST R4,IFANDORZ
*
L R14,LGETMAIN
SH R14,=H'400'
CVD R14,DW
LA R15,0(R1,R14)
ST R15,EGETMAIN
SR R8,R8
OI DW+7,X'0F'
MVC LINE(16),=C'USEABLE GETMAIN='
UNPK LINE+16(7),DW+4(4)
BAL R14,PUTLINE
SR R5,R5
B CHECKDD
* -----------------------------------------------
DC F'0'
GETCARD GET SYSIN
AP #SYSIN,P1
CLI 0(R1),C' '
BE GETCARD
CLI 0(R1),C'*'
BE GETCARD
MVC CARD,0(R1)
LA R6,CARD
** ST R6,GETSYSIN-4
ST R6,GETCARD-4
BAL R14,PUTR6
BR R9
*
PUTCARD CLI FLAGTEST,0
LA R0,CARD-1
BE PUTCARDP
LA R14,0(R9)
SR R14,R13
ST R14,12(R13)
UNPK CARD-5(5),14(3,R13)
TR CARD-5(4),HEX-240
MVI CARD-1,C' '
LA R0,CARD-6
PUTCARDP PUT SYSPRINT,(0)
BR R9
*
USING DCBDSECT,5
GETNEXDD BAL R9,GETCARD
CHECKDD CLC =C'DD=',0(R6)
BNE ENDOFDD
BAL R14,PUTR6
MVI FLAGWRIT,C'W'
LTR R5,R5
BZ STARTDD
L R1,LASTDCB
MVI 0(R5),X'FF'
LA R5,2(R5)
ST R5,0(R1)
ST R5,FIRSTDCB
B *+8
STARTDD L R5,AGETMAIN
* DD=NANE
ST R5,LASTDCB DD=NAME,22,33
SAVER8R5 LR R8,R5 DD=NAME,C'ABC'
LA R6,3(R6)
*
XC 0(LDCB+4,R5),0(R5)
TRT 0(9,R6),FINDEND
MSG BZ,'INVALID DD=NAME',ERR6,ERRLOC=GETNEXDD
LR R2,R1 DD=ABC
BCTR R2,0
SR R2,R6
MSG BM,'DD= ERROR',ERR6,ERRLOC=GETNEXDD
MVC PARM(0),0(R6) DCBDD
EX R2,*-6
MVC OUTZ-8(8),PARM DCBDD
MVC DCBDDNAM-IHADCB+OUTZ(8),PARM
* MVC DCBDCB,OUTZ
MVC DCB#(LOUTZ),OUTZ-16
MVC PARM(11),PARM-1
LA R0,DCBDCB
ST R0,DCBADDR
LA R5,LDCB(R5)
MVI 0(R5),X'FF'
LR R6,R1
CLI 0(R6),C' '
BE GETNEXDD
ST R5,DCBFLDS-DCBDSECT(R8)
GETDDL BAL R14,PUTR6
CLI 0(R6),C' '
BE GETNEXDD
BAL R9,QCOMMA
MVC CARD,0(R6)
LA R6,CARD
GETDDN BAL R14,PUTR6
CLI 0(R6),C'0'
BNL DDLOCLEN
*
MVC 0(1,R5),0(R6)
MVI 1(R5),C' '
LA R4,2(R5)
SR R7,R7
BAL R9,QQTEXT
L R6,SAVE6
LH R1,2(R5)
LA R5,5(R1,R5)
B DDMORE
*
DDLOCLEN BAL R9,GET#
STH R1,0(R5)
BAL R9,QCOMMA
BAL R9,GET#
STH R1,2(R5)
LA R5,4(R5)
*
DDMORE MVI 0(R5),X'FF'
MVC CARD,0(R6)
LA R6,CARD
CLI 0(R6),C' '
BNE *+12
LA R5,2(R5)
B GETNEXDD
*
CLI 0(R6),C'+'
BNE GETDDL
BAL R9,GETCARD
B GETDDN
*
PUTR6SAV DC CL20' '
DC F'0'
PUTR6 CLI FLAGLIST,C'A'
BNER R14
ST R14,PUTR6-4
LA R0,PARM-1
CLI FLAGTEST,0
BE PUTR6P
LA R14,0(R14)
SR R14,R13
ST R14,12(R13)
UNPK PARM-5(5),14(3,R13)
TR PARM-5(4),HEX-240
MVI PARM-1,C' '
LA R0,PARM-6
PUTR6P MVC PARM(70),0(R6)
PUT SYSPRINT,(0)
MVC PARM(71),PARM-1
L R14,PUTR6-4
BR R14
*
FINDIF GET SYSIN
CLC =C'STARTEND=',0(R1)
BE STARTENZ
AP #SYSIN,P1
CLC =C'IF=(',0(R1)
BNE FINDIF
FINDIFSV MVC CARD,0(R1)
LA R6,CARD
ST R6,GETCARD-4
BAL R14,PUTR6
B TESTIF
* -----------------------------------------------------
LQOPCODE EQU 8
QOPCODE DC CL4'AND=',CL4'A Q '
DC CL4'ANDA',CL4'AAQ '
DC CL4'ANDO',CL4'AOQ '
DC CL4'EDIT',CL4'E Q '
DC CL4'GOTO',CL4'G . '
DC CL4'IF=(',CL4'I Q '
DC CL4'IFAN',CL4'IAQ '
DC CL4'IFOR',CL4'IOQ '
DC CL4'LABE',CL4'L . '
DC CL4'OR=(',CL4'O Q '
DC CL4'ORAN',CL4'OAQ '
DC CL4'OROR',CL4'OOQ '
DC CL4'REPL',CL4'A Q '
DC CL4'WRIT',CL4'W . '
** DC CL4' ',CL4' '
DC X'FF'
* -----------------------------------------------
GETOPC LA R2,QOPCODE-LQOPCODE
LA R2,LQOPCODE(R2)
CLC 0(4,R6),0(R2)
BH GETOPC+4
BER R9
*
CLI 0(R6),C'0'
BE BADOPCA
CLI 2(R6),C'0'
BE BADOPCA
CLI 3(R6),C'0'
BE BADOPCA
CLI 4(R6),C'0'
BE BADOPCA
MSG BNE,'INVALID OPCODE',ERR6,ERRLOC=FINDIF
BADOPCA MSG B,'CHECK FOR 0/O IN KEYWORD',ERR6,ERRLOC=READIF
* -----------------------------------------------
B RESTART <== THIS GETS MOVED TO 0(R13)
RESTART L R8,IFANDOR
LA R6,CARD
DC H'0' GONNA ABEND HERE, AND CONTINUE.
B TESTIF
* -----------------------------------------------
PUTSEPAR CLI FLAGLIST,C'A'
BNER R14
ST R14,8(R13)
MVI PARM,C'-'
MVC PARM+1(70),PARM
PUT SYSPRINT,PARM-1
MVC PARM,PARM-1
L R14,8(R13)
BR R14
*
USING DI,8
USING DA,7
NOFILES DS 0H
ENDOFDD BAL R14,PUTSEPAR
*
LTR R5,R5
BNZ *+12
L R5,AGETMAIN
B *+12
MVI 0(R5),X'FF'
LA R5,2(R5)
ST R5,IFANDORZ
ST R5,IFANDOR
MVI 0(R5),0
MVC 1(256,R5),0(R5)
MVC 0(4,R13),RESTART-4 HANDY FOR TESTING
*
SR R8,R8
MVC PARM,PARM-1
L R6,GETCARD-4
CLC =C'IF',0(R6)
MSG BNE,'FIRST "REAL CC" MUST BE IF=',ABE
B TESTIF
*
OI RC,8
GETNEXIF BAL R9,GETCARD
CLC =C'STARTEND=',0(R6)
BE STARTENZ
LA R6,CARD
CLC =C'IF=(',0(R6)
BE FINDIFSV
CLC =C'IFAN',0(R6)
BE FINDIFSV
CLC =C'IFOR',0(R6)
BE FINDIFSV
BAL R9,PUTCARD
MSG B,'//SYSIN ERR, LOOKING FOR IF',ERR6,ERRLOC=GETNEXIF-4
*
SHORTR8 LA R1,LDI+2(R8)
MVI LDI(R8),X'FF'
READIF BAL R9,GETNEXIF
TESTIF BAL R9,GETOPC
*
LOADIF LTR R8,R8
BNZ *+12
L R8,IFANDORZ
B *+8
L R8,0(R8)
L R1,PREVR8
LTR R1,R1
BZ *+8
ST R8,0(R1)
ST R8,PREVR8
*
XC 0(LDI+LDA,R8),0(R8)
MVC DILABELS,99+PARM
MVC DIOPCOD2,99+PARM
MVC DIOPCODE(4),4(R2)
TRT 0(8,R6),FINDEQ
MSG BZ,'INVALID OPCODE=',ERR6,ERRLOC=READIF
CLI DISEARCH,C'.'
BE SAVR8LBL
CLI 1(R1),C'('
MSG BNE,'( MISSING FROM KEY=(##,##',ERR6,ERRLOC=READIF
LA R6,2(R1)
CLI DISEARCH,C'Q'
BE SAVEIF
EX 0,*
DC H'0'
*
NEXTR6IF LA R1,LDA(R7)
ST R1,DANEXT
LA R0,LDA+2(R1)
ST R0,DANEXT
B XCR7R7
SAVEIF LA R7,LDI(R8)
LA R1,LDA+2(R7)
ST R1,DINEXT
ST R7,DIR7
XCR7R7 XC 0(LDA+4,R7),0(R7)
MVC DALABELS,99+PARM
BAL R14,PUTR6
BAL R9,GETFRTO
BAL R14,PUTR6
LA R4,DALEN1
BAL R9,QQTEXT
L R6,SAVE6
BAL R14,PUTR6
MVI LDA(R7),X'FF'
*
CLI DAOPCODE,C'R'
BE *+12
CLI DAOPCODE,C'E'
BNE QR7END
*
LA R4,DALEN2
BAL R9,QQTEXT
L R6,SAVE6
LA R1,LDAEDIT(R7)
ST R1,DANEXT
MVI 0(R1),X'FF'
LA R1,2(R1)
ST R1,DINEXT
MVI 0(R1),X'FF'
B READIF
*
QR7END BAL R14,PUTR6
CLC =C') ',0(R6)
BE READIF
CLC =C'+ ',0(R6)
BNE *+8
BAL R9,GETCARD
*
CLI 0(R6),C'0'
BNL NEXTR6IF
*
QDAWRI BAL R14,PUTR6
TRT 0(8,R6),FINDEQ
MSG BZ,'= NOT FOUND IN KEY= WITHIN IF=',ERR6,ERRLOC=READIF
LA R3,1(R1)
TRT 0(9,R3),FINDEND
MSG BZ,'KEY=... TOO LONG',ERR6,ERRLOC=READIF
LR R2,R1
SR R2,R3
SH R2,=H'1'
MSG BM,'WRITE=/GOTO= LENGTH 0',ERR6,ERRLOC=READIF
LA R4,DAWRITE
CLI 0(R6),C'W'
BE SAVDAWRI
CLI 0(R6),C'G'
BE SAVDAWRI
MSG B,'INVVALID KEY=',ERR6,ERRLOC=READIF
SAVDAWRI CLI 0(R4),C' '
MSG BNE,'WRITE=/GOTO= ALREADY SET',ERR6,ERRLOC=READIF
MVC 0(0,R4),0(R3)
EX R2,*-6
LA R6,1(R1)
L R1,DIR7
MVI DAWRGO-DA(R1),C'Y'
B NEXTR6IF
*
SAVR8LBL BAL R14,PUTR6
MVI DIOPCODE,C'?'
LA R4,DIWRITE
CLI 0(R6),C'W'
BE R8WRIT
LA R4,DILABEL
CLI 0(R6),C'L'
BE R8WRIT
LA R4,DIGOTO
CLI 0(R6),C'G'
BE R8WRIT
EX 0,*
R8WRIT CLI 0(R4),C' '
MSG BNE,'LABEL=/GOTO=/WRITE= ALREADY SET',ERR6,GOTOLOC=READIF
LA R3,1(R1) BEG
TRT 0(9,R4),FINDEND
MSG BZ,'LABEL/DDNAME TOO LONG',ERR6,ERRLOC=READIF
LR R2,R1
SR R2,R3
SH R2,=H'1'
MSG BM,'LABEL/DDNAME LENG=0',ERR6,ERRLOC=READIF
MVC 0(8,R4),PARM+99
MVC 0(0,R4),0(R3)
EX R2,*-6
CLI 0(R1),C' '
BE SHORTR8
BAL R9,QCOMMA
BAL R9,GETOPC
CLI 6(R2),C'.'
BE SAVR8LBL
MSG B,'WRITE=,GOTO=,LABEL= ERROR',ERR6,READIF
*
* ------------------------------------
QCOMMA BAL R14,PUTR6
CLI 0(R6),C','
LA R6,1(R6)
BER R9
BCTR R6,0
LA R14,0(R9)
SR R14,R13
ST R14,DW
UNPK QCOMMAM+12(5),DW+2(3)
TR QCOMMAM+12(4),HEX-240
MVI QCOMMAM+16,C' '
QCOMMAM MSG B,'.... COMMA MISSIG',ERR6
*
DC F'0'
GETFRTO ST R9,GETFRTO-4
BAL R14,PUTR6
CLI 0(R6),C'0'
MSG BL,'INVALID LOC #',ERR6
BAL R9,GET#
SH R1,=H'1'
BNM SAVELOC
MSG B,'LOCATION STARTS WITH 1, NOT 0',ERR6
SAVELOC STH R1,DAFROM
BAL R9,QCOMMA
CLI 0(R6),C'0'
BL GETBRAN
BAL R9,GET#
SH R1,=H'1'
BNM *+8
LH R1,=X'7FFF'
STH R1,DATO
BAL R9,QCOMMA
B GETFRTOZ
*
CCTABLE DC C'EQ',X'80'
DC C'GE',X'A0'
DC C'GT',X'20'
DC C'LE',X'C0'
DC C'LT',X'40'
DC C'NE',X'70'
DC C'Z'
*
GETBRAN LA R1,CCTABLE-3
GETBRANL LA R1,3(R1)
CLC 0(2,R6),0(R1)
BH GETBRANL
MSG BL,'BAD BRANCH COND',ERR6
MVC DACHAREQ,0(R1)
MVC DAEQ,2(R1)
XI DAEQ,X'F0'
LA R6,2(R6)
BAL R9,QCOMMA
GETFRTOZ L R9,GETFRTO-4
BR R9
* ---------------------------------------------
SAVE6 DC F'0'
SAVE7 DC F'0'
SAVE8 DC F'0'
NEXT7 DC F'0'
* -----------------------------------
QFREQ STM R14,R9,12(R13)
*** BAL R14,PUTR6
L R7,SAVE7
CLI DACHAREQ,C' ' Q. EQ OR RANGE?
BNE QFREQZ IF EQ, SKIP THIS
LA R14,DACHAR +1 H(OFFSET) +3 H(LENGTH-1) +5(STRING)
MVI 68(R13),X'FF'
LH R1,DALEN1
CLI DALEN1,0
BE *+8
EX 0,*
LA R0,1(R1)
LA R2,DASTR1 CURR LOC IN STRING
ST R2,64(R13)
SR R15,R15
QFREQIC IC R15,0(R2)
LA R1,FREQTBL(R15)
CLC 0(1,R1),68(R13)
BNL QFREQNOT
MVC 68(1,R13),0(R1)
*
MVC 0(1,R14),0(R2)
LR R1,R2
S R1,64(R13)
STH R1,1(R14)
QFREQNOT LA R2,1(R2)
BCT R0,QFREQIC
*
SR R1,R1
IC R1,DACHAR
LA R14,TRTTABLE
LR R15,R14
SR R15,R1
CLI DATYPE,C'T'
BNE *+8
LA R15,256(R15)
ST R15,DATRTBL
* B QFREQZ
*
QFREQZ LM R14,R9,12(R13)
BR R9
* -------------------------------------
DC F'0'
QQTEXT ST R9,QQTEXT-4
TM FLAGTEST,X'F0'
BNO QQTEXTA
BAL R14,PUTR6
QQTEXTA LA R2,1(R6)
SR R1,R1
CLI 1(R6),C'"'
BE FINDQUOT
CLI 1(R6),C''''
BE FINDQUOT
MSG B,'INVALID QUOTED STRING',ERR6
ABEND 4
FINDQUOT LA R2,1(R2)
CLC 0(1,R2),1(R6)
BE GOTQUOTE
LA R1,1(R1)
CH R1,=H'29'
BH NOQUOTE
CLC PARM+77(33),0(R2)
BNE FINDQUOT
NOQUOTE MSG B,'INVALID STRING',TRAC
MSG B,'INVALID STRING',ERR6
*
MVC 2(0,R4),2(R6)
GOTQUOTE LA R0,1(R2)
ST R0,SAVE6 COMMA AFTER QUOTE
LR R3,R2
SR R3,R6
SH R3,=H'3'
STH R3,0(R4)
EX R3,GOTQUOTE-6 SAV STRING
*
LA R1,DATATYPS-LDATATYP
QTYPE LA R1,LDATATYP(R1)
CLC 0(1,R6),4(R1)
BE QTYPEMVC
CLI LDATATYP(R1),0
BE QTYPE
MSG B,'INVALID DATA TYPE',ERR6
QTYPEMVC MVC DW+16(4),4(R1)
L R15,0(R1)
BR R15
*
DATATYPS DC A($CHAR),CL4'CC '
LDATATYP EQU *-DATATYPS
DC A($TEXT),CL4'TT '
DC A($LOW),CL4'LC '
DC A($HEX),CL4'XC '
DC A($PACK),CL4'PP# '
DC A($FW),CL4'FF# ',X'FF'
*
TR 2(0,R4),TRLOWER
$LOW EX R3,$LOW-6 MAKE THE STRING LOWER CASE.
MVI DW+20,C'L'
B $CHAR+4
*
TR 2(0,R4),TRUPPER
$TEXT EX R3,$TEXT-6 MAKE THE STRING UPPER CASE.
MVI DW+20,C'T'
B $CHAR+4
$CHAR MVI DW+20,C'C'
LH R1,0(R4)
LA R4,3(R1)
L R9,QQTEXT-4
BR R9
* ---------------------------------
MVC 2(0,R4),LINE+1
PACK LINE+1(0),0(0,R6)
$PACK ST R6,DW+20
LH R1,0(R4)
LA R6,2(R6)
LA R0,2(R6,R1)
ST R0,SAVE6
MVC DW+16(1),0(R6)
*
CLI 0(R6),C'-'
BNE *+10
BCTR R1,0
LA R6,1(R6)
*
LR R15,R1
LA R15,1(R15)
SRL R15,1
LR R0,R15
SLL R0,4
*
OR R1,R0
STH R15,0(R4)
EX R1,$PACK-6
EX R15,$PACK-12
* MVC 2(0,R4),LINE+1
L R6,SAVE6
LA R14,2(R4,R15)
NI 0(R14),X'FC'
CLI DW+16,C'-'
BNE $CHAR+4
OI 0(R14),X'0D'
MVI DW+20,C'P'
B $CHAR+4
*
PACK DW+8,0(0,R15)
$FWSIGN CLI 2(R6),C'-'
BNE *+10
LA R15,1(R15)
BCTR R3,0
EX R3,$FWSIGN-6
CLI 2(R6),C'-'
BNE *+8
NI DW+15,X'FD'
CVB R0,DW+8
BR R14
*
$FW LA R15,2(R6)
BAL R14,$FWSIGN
ST R0,2(R4) DASTR1
MVC 0(2,R4),=H'3' DALEN1
MVI DW+20,C'F'
B $CHAR+4
*
TR 2(0,R6),TRHEX
$HEX TM 1(R4),1
MSG BZ,'ODD # HEX DIGITS',ERR6
EX R3,$HEX-6
LA R0,1(R3)
SRL R0,1
LR R1,R0
BCTR R1,0
STH R1,0(R4)
LA R14,2(R6)
LA R15,2(R4)
PACK 0(2,R15),0(3,R14)
LA R15,1(R15)
LA R14,2(R14)
BCT R0,*-14
LA R6,1(R14)
MVC 0(8,R15),PARM+99
MVI DW+20,C'X'
B $CHAR+4
* ---------------------------------------
GET# SR R1,R1
GET#IC IC R0,0(R6)
N R0,=F'15'
MH R1,=H'10'
AR R1,R0
LA R6,1(R6)
CLI 0(R6),C'0'
BNL GET#IC
CLI 0(R6),C','
BER R9
CLI 0(R6),C' '
BER R9
CLI 0(R6),C')'
BER R9
CLI 0(R6),C''''
BER R9
MSG B,'## SYNTAX ERR',ERR6
* -----------------------------------------
MVC LINE(0),16(R1)
PUTMSG STM R15,R1,PUTTRAC-12
LR R1,R0
IC R15,15(R1)
EX R15,PUTMSG-6
LM R15,R1,PUTTRAC-12
B PUTLINE
*
MVC LINE+5(0),4(R1)
PUTABE STM 15,1,PUTTRAC-12
LR R1,R0
BAL R15,PUTADDR
IC R15,15(R1)
EX R15,PUTABE-6
BAL R14,PUTLINE
ABEND 1
*
DC 6F'0'
PUTADDR LA R0,0(R1)
SR R0,R13
SH R0,=H'8'
ST R0,12(R13)
UNPK LINE(5),14(3,R13)
TR LINE(4),HEX-240
MVI LINE+4,C' '
BR 15
*
PUTERR MVI FLAGMSG,C'E'
B PUTERR6+4
PUTERR6 MVI FLAGMSG,C'6'
STM 14,3,PUTADDR-24
LR R1,R0
BAL R15,PUTADDR
SR R15,R15
IC R15,3(R1)
CH R15,=H'44'
BL *+6
DC H'0'
EX R15,PUTABE-6
LA R14,LINE+9(R15)
CLI FLAGMSG,C'6'
BNE *+14
MVC 0(20,R14),0(R6)
LA R14,23(R14)
MVC 0(7,R14),=C'*ERROR*'
BAL R14,PUTLINE
LM 14,1,PUTADDR-24
LR R1,R0
ICM R14,7,0(R1)
CLI FLAGTEST,0
BNER R14
ABEND 1
*
DC 16F'0'
PUTTRAC CLI FLAGTEST,0
BER R14
STM 0,15,PUTTRAC-64
LR R1,R0
BAL R15,PUTADDR
IC R15,15(R14)
EX R15,PUTABE-6
BAL R14,PUTLINE
MVC LINE+5(5),=C'R0-R7'
LA R3,2
LA R2,PUTTRAC-64
PUTTRACL LA R1,LINE+11
LA R0,8
PUTTRACU UNPK 0(9,R1),0(5,R2)
TR 0(8,R1),HEX-240
MVI 8(R1),C' '
LA R1,9(R1)
LA R2,4(R2)
BCT R0,PUTTRACU
BAL R14,PUTLINE
MVC LINE+5(5),=C'R8-RF'
BCT R3,PUTTRACL
MVC LINE,LINE-1
LM R0,R15,PUTTRAC-64
BR R14
* ---------------------------------------------
*
*IFAND=(1,EQ,X'01',2,9,C'THIS',11,11,T'TEXT',24,EQ,P'12345')
*IFOR=(1,EQ,C'G',1,EQ,C'?'),THEN=GOTO=LABEL
*IF=(1,EQ,C'W'),THEN=WRITE=(1,9,44,12,13,9),DDNAME
*
DC F'0'
PUTBLANK DS 0H
PUTPARM ST R14,PUTBLANK-4
LA R0,PARM-1
CLI FLAGTEST,0
BE PUTPARMP
LA R14,0(R9)
SR R14,R13
ST R14,12(R13)
UNPK PARM-5(5),14(3,R13)
TR PARM-5(4),HEX-240
MVI PARM-1,C' '
LA R0,PARM-6
PUTPARMP PUT SYSPRINT,(0)
L R14,PUTBLANK-4
BR R14
*
DC 3H'0'
PUTLINE MVI PUTLINE-6,C' '
B PUTLINEN+4
PUTLINEA MVI PUTLINE-6,C'A'
B PUTLINEN+4
PUTLINEN MVI PUTLINE-6,C'N'
ST R14,PUTLINE-4
LA R0,LINE-1
CLI FLAGTEST,0
BE PUTLINEP
LA R14,0(R14)
SR R14,R13
ST R14,12(R13)
UNPK LINE-5(5),14(3,R13)
TR LINE-5(4),HEX-240
MVI LINE-1,C' '
LA R0,LINE-6
PUTLINEP PUT SYSPRINT,(0)
L R14,PUTLINE-4
CLI PUTLINE-6,C'N'
BER R14
MVC LINE,LINE-1
CLI PUTLINE-6,C'A'
BNER R14
ABEND 3
*
QGETMAIN L R0,IFANDORZ
S R0,AGETMAIN
CVD R0,DW
MVC LINE(L'ED7),ED7
ED LINE(L'ED7),DW+4
MVC LINE+10(24),=C'GETMAIN TABLE BYTES USED'
BAL R14,PUTLINE
BR R9
ED7 DC X'40202020206B212020'
*
*
DC F'0'
LISTABLE ST R9,LISTABLE-4
TM FLAGTEST,X'40'
BZR R9
L R8,IFANDOR
B LISTBLJ
*
LISTABAD MVC LINE,LINE-1
ST R2,12(R13)
UNPK LINE+4(7),13(4,R13)
TR LINE+4(6),HEX-240
MVI LINE+10,C'='
LA R3,LINE+11
BR R14
*
LISTBLI L R8,DINEXT
L R9,LISTABLE-4
LTR R8,R8
BZR R9
CLI 0(R8),X'FF'
BER R9
*
LISTBLJ LR R2,R8
BAL R14,LISTABAD
*
MVC LINE(4),=C'R8=='
BAL R14,LISTWORD NEXT
BAL R14,LISTWORD R7
BAL R14,LISTBL4 OPCODE
BAL R14,LISTBL4 MORE OPCOE
BAL R14,LISTBL8 WRITE
BAL R14,LISTBL8 LABEL
BAL R14,LISTBL8 GOTO
BAL R14,PUTLINE
CLI LDI(R8),X'FF'
BNE LISTBLA-4
B LISTBLI
*
LISTBL8 MVC 0(8,R3),0(R2)
LA R3,9(R3)
LA R2,8(R2)
BR R14
LISTBL4 MVC 0(4,R3),0(R2)
LA R3,5(R3)
LA R2,4(R2)
BR R14
LISTBL2 MVC 0(2,R3),0(R2)
LA R3,3(R3)
LA R2,2(R2)
BR R14
*
L R7,DIR7
LISTBLA LTR R2,R7
BZ LISTBLI
BAL R14,LISTABAD
MVC LINE+1(3),=C'R7='
BAL R14,LISTWORD NEXT
BAL R14,LISTBL4 OPCODE
BAL R14,LISTWORD TRT TABLE
BAL R14,LISTBL4 TYPE
BAL R14,LISTBL8 GOTO
BAL R14,LISTBL8 WRITE
BAL R14,LISTHALF FROM
BAL R14,LISTHALF TO/LEN
MVC 0(3,R3),DACHAREQ EQ+SCAN CHAR
LA R3,4(R3)
LA R2,DALEN1
BAL R14,LISTHALF
*
LH R1,DALEN1
CLI DATYPE,C'C'
BE LISTBLAP-4
CLI DATYPE,C'L'
BE LISTBLAP-4
CLI DATYPE,C'T'
BE LISTBLAP-4
*
LA R14,DASTR1
LA R1,1(R1)
LISTBLU UNPK 1(3,R3),0(2,R14)
TR 1(2,R3),HEX-240
LA R14,1(R14)
LA R3,2(R3)
BCT R1,LISTBLU
MVI 1(R3),C' '
B LISTBLAP
*
MVC 1(0,R3),DASTR1
EX R1,*-6
LISTBLAP BAL R14,PUTLINE
L R7,DANEXT
LTR R7,R7
BZ LISTBLI
CLI 0(R7),X'FF'
BE LISTBLI
C R7,DINEXT
BL LISTBLA
EX 0,*
*
LISTWORD UNPK 0(9,R3),0(5,R2)
TR 0(8,R3),HEX-240
MVI 8(R3),C' '
LA R2,4(R2)
LA R3,9(R3)
BR R14
*
LISTHALF UNPK 0(5,R3),0(3,R2)
TR 0(4,R3),HEX-240
MVI 4(R3),C' '
LA R2,2(R2)
LA R3,5(R3)
BR R14
* ----------------------------------------------
DC F'0'
FIXDI ST R9,FIXDI-4
L R8,IFANDOR
B FIXDIA+4
FIXDIA L R8,DINEXT
LTR R8,R8
BZ FIXDI9
FIXDIB CLI 0(R8),X'FF'
BE FIXDI9
*
BAL R3,FIXDIW
BAL R3,FIXDIG
L R7,DIR7
LTR R7,R7
BNZ FIXDA
L R8,DINEXT
LTR R8,R8
BNZ FIXDIB
FIXDI9 L R9,FIXDI-4
BR R9
* ----------------------------------------------
L R7,DANEXT
FIXDA LTR R7,R7
BZ FIXDIA
CLI 0(R7),X'FF'
BE FIXDIA
*
BAL R3,FIXDAW
BAL R3,FIXDAG
B FIXDA-4
*
FIXDAW CLI DAWRITE,C' '
BNHR R3
LA R2,DAWRITE
BAL R9,QDD
BR R3
*
FIXDIW CLI DIWRITE,C' '
BNHR R3
LA R2,DIWRITE
BAL R9,QDD
BR R3
*
FIXDAG CLI DAGOTO,C' '
BNHR R3
LR R1,R8
LA R2,DAGOTO
BAL R9,QLABEL
BR R3
*
FIXDIG CLI DIGOTO,C' '
BNHR R3
LR R1,R8
LA R2,DIGOTO
BAL R9,QLABEL
BR R3
*
QLABEL L R1,DINEXT
MVC QLABELM+12(8),0(R2)
MVC QLABELE+12+6(8),0(R2)
*
L R1,DINEXT-DI(R1)
LTR R1,R1
BZ QLABELE
CLI 0(R1),X'FF'
BE QLABELE
CLI DILABEL-DI(R1),C' '
BNH QLABEL+4
CLC 0(8,R2),DILABEL-DI(R1)
BNE QLABEL+16
ST R1,4(R2)
QLABELM MSG B,' UPDATED',MSG
BR R9
QLABELE MSG BE,'GOTO= NOT FOUND',ERR,ERRLOC=FIXDI
BR R9
* ----------------------------
DC F'0'
QDD ST R9,QDD-4
MVC QDDNOTF+12(8),0(R2)
MVC QDDOP+12(08),0(R2)
L R5,FIRSTDCB
B *+8
QDDLOOP L R5,DCBNEXT
CLI 0(R5),X'FF'
BNE QDDCLC
QDDNOTF MSG B,'DDNAME WAS NOT DEFINED BY DD=',ERR,ERRLOC=FIXDI
B QDDZ
QDDCLC CLC 0(8,R2),DCBDD
BNE QDDLOOP
ST R5,4(R2)
LA R2,DCBDCB
TM DCBOFLGS-IHADCB(R2),DCBOFOPN
BZ OPENOUT
** BAL R9,OPENOUT
QDDOP MSG B,' ALREADY OPEN',MSG
QDDZ L R9,QDD-4
BR R9
* ----------------------------------
OPENMSG DC CL62'12345678 OPENED FOR OUTPUT, RECFM=...LRECL=..... BLX
KSIZE='
**ENMSG DC CL54'OPENED FOR OUTPUT, RECFM=...LRECL=..... BLKSIZE='
USING IHADCB,2
OPENIN MVC OPENMSG(8),DCBDDNAM
MVC OPENMSG+20(3),=C' IN'
PUSH PRINT
PRINT NOGEN
OPEN ((2),INPUT)
B OPENUNPK
OPENOUT MVC OPENMSG(8),DCBDDNAM
MVC OPENMSG+20(3),=C'OUT'
CLC =H'0',DCBLRECL
BNE OPENOUTO
MVC DCBRECFM,DCBRECFM-IHADCB+IN
MVC DCBLRECL,DCBLRECL-IHADCB+IN
OPENOUTO OPEN ((2),OUTPUT)
LA R0,SYSPRINT
CR R0,R2
BER R9
*
POP PRINT
OPENUNPK UNPK OPENMSG+34(3),DCBRECFM(2)
TR OPENMSG+34(2),HEX-240
MVI OPENMSG+36,C' '
LH R0,DCBLRECL
CVD R0,DW
OI DW+7,X'0F'
UNPK OPENMSG+43(5),DW+5(3)
LH R0,DCBBLKSI
CVD R0,DW
OI DW+7,X'0F'
UNPK OPENMSG+57(5),DW+5(3)
MVC LINE(L'OPENMSG),OPENMSG
BAL R14,PUTLINE
BR R9
DROP 2
*
ZS ST R8,EGETMAIN
BAL R14,PUTSEPAR
LA R2,SYSIN
BAL R9,CLOSE
BAL R9,QGETMAIN
CLI RC,0
BNE DONE
*
MVI TRTTB-1,0
MVC TRTTB,TRTTB-1
MVC TRTTB+256,TRTTB-1
MVC TRTTB+512,TRTTB-1
MVI TRTTABLE,C'A'
MVI TRTTEXT,C'C'
MVI TRTTEXT-64,C'B'
*
BAL R9,LISTABLE
BAL R9,FIXDI
BAL R9,LISTABLE
** AGO .PASTIF
B STARTIN
*
BEGREC DC F'0'
ENDREC DC F'0'
*
STARTIN LA R2,IN
BAL R9,OPENIN
B TOP
GETIN GET IN
AP #IN,P1
LA R6,0(R1)
LH R14,DCBLRECL-IHADCB+IN
AR R14,R6
ST R14,ENDREC
ST R6,BEGREC
L R8,IFANDOR
BR R9
$GOTO LR R8,R15
B TOP+4
*
$WRITEIN CLI YESNO,C'Y'
BNER R9
TM DCBOFLGS-IHADCB+OUT,DCBOFOPN
BZ TOP
L R0,GETIN-4
PUT (2),(0)
SH R2,=H'16'
AP 0(8,R2),P1
BR R9
*
TOP LA R2,OUT
BAL R9,$WRITEIN
BAL R9,GETIN
B NEXTIFT
*
NEXTIF L R8,DINEXT
NEXTIFT LTR R8,R8
BZ TOP
CLI 0(R8),X'FF'
BE TOP
CLI DIOPCODE,C'I'
BNE NEXTIF
L R7,DIR7
*
CLI DIWRITE,C' '
BNH *+10
L R15,DIWRITE+4
BALR R9,R15
*
CLI DIGOTO,C' '
BNH *+10
L R15,DIGOTO+4
BR R15
*
MVI YESNO,C' '
LTR R7,R7
BZ TOP
CLI DACHAREQ,C' '
BH $CE
B $CS
* -------------------------------------------
* THE $CS + $CE (COMPARE EQ AND COMP SCAN) ROUTINES ARE USED FOR ALL
* THE C'ABC', X'C1C2C3', L'ABD', T'ABC', P'123' + F'1234' ROUTINES.
* THE FIRST 3 OF THOSE ARE SIMPLE COMPARES.
*
* THE TEXT STRING HAS TO BE MOVED TO A W/A AND TRANSLATED
* TO UPPER CASE, AND THEN COMPARED.
*
* FULLWORD IS A SIMPLE COMPARED, MUCH LIKE CHAR.
* PACKED HAVE TO HAVE TO FIRST MAKE SURE IT'S A VALID PACKED FIELD,
* THEN ADJUST THE LENGTH TO ACCOMODATE BOTH FIELDS, THEN COMPARED.
* -------------------------------------------
$CS ST R9,ARETURN
LR R1,R6
L R0,ENDREC
SR R0,R6
SH R0,DALEN1
BNP $CEZ
CH R0,DATO
BL *+8
LH R0,DATO
A R0,BEGREC
*
L R14,DATRTBL
AH R1,DACHAOFF
$CSL LR R2,R0
SR R2,R1
SH R2,DACHAOFF
CH R2,=H'255'
BL *+8
LA R2,255
EX R2,$CSFOUND-12
BNZ $CSFOUND
LA R1,255(R1)
CR R1,R0
BL $CSL
B $CENOPE
*
TRT 0(0,R1),0(R14) R0=END OF REC TO TEST
CLC DASTR1(0),0(R1) R1=DATA TO TEST
$CSFOUND SH R1,DACHAOFF
LH R2,DALEN1
CLI DATYPE,C'T'
BE $CSTEXT
CLI DATYPE,C'P'
BE $CSPACK
CLI DATYPE,C'F'
BE $CSFULLW
B $CSCOMP
*
$CSFULLW L R0,DASTR1
C R0,0(R1)
B $CSCOMP+4
*
CP 0(0,R1),DASTR1(0)
TRT 0(0,R1),TESTPACK
$CSPACK EX R2,$CSPACK-6
BNZ $CENOPE
LA R15,0(R1,R2)
TM 0(R15),X'0C'
BNO $CENOPE
SLL R2,4
L R15,DALEN1
OR R2,R15
EX R2,$CSPACK-12
B $CSCOMP+4
*
MVC 12(0,R13),0(R1)
TR 12(0,R13),TRUPPER
CLC 12(0,R13),DASTR1
$CSTEXT EX R2,$CSTEXT-18
EX R2,$CSTEXT-12
EX R2,$CSTEXT-06
B $CSCOMP+4
*
$CSCOMP EX R2,$CSFOUND-6
BE $CEYES
AH R1,DACHAOFF
LA R1,1(R1)
CR R1,R0
BL $CSL
B $CENOPE
* ------------------------------------------
BC 0,$CENOPE
CLC DASTR1,0(R1)
$CE ST R9,ARETURN
L R1,BEGREC
AH R1,DAFROM
LH R2,DALEN1
LA R0,1(R1,R2)
C R0,ENDREC
BH $CEZ
*
CLI DATYPE,C'P'
BE $CEPACK
CLI DATYPE,C'T'
BE $CETEXT
CLI DATYPE,C'F'
BE $CEFULLW
B $CECOMP
*
CP 0(0,R1),DASTR1(0)
TRT 0(0,R1),TESTPACK
$CEPACK LH R2,DALEN1
EX R2,$CEPACK-6
BZ $CEZ
LA R14,0(R1,R2)
TM 0(R14),X'0C'
BNO $CEZ
SLL R2,4
LH R15,DALEN1
OR R2,R15
EX R2,$CEPACK-12
B $CECOMP+4
*
$CEFULLW L R2,0(R1)
C R2,DASTR1
B $CECOMP+4
*
$CETEXT EX R2,$CECOMP-18
EX R2,$CECOMP-12
EX R2,$CECOMP-06
B $CECOMP+4
*
MVC 12(0,R13),0(R1)
TR 12(0,R13),TRUPPER
CLC 12(0,R13),DASTR1
*
$CECOMP EX R2,$CE-6
EX R2,$CE-10
BNE $CENOPE
*
$CEYES CLI YESNO,C' '
BE $CYESY
CLI DIANDOR,C'O'
BE $CYESY
B $CYESY+4
$CYESY MVI YESNO,C'Y'
CLI DAWRITE,C' '
BNH *+10
L R15,DIWRITE+4
BALR R9,R15
*
CLI DAGOTO,C' '
BNH *+10
L R15,DIGOTO+4
BR R15
CLI DIOPCODE,C'E'
BE
CLI DIOPCODE,C'R'
BNE $RETURN
LH R14,DALEN2
CR R14,R2
BE REPLMVC
BL *+6
LR R14,R2
NOP REPLMVC
OI *-3,X'0F'
MSG B,'REPLACE FROM TO STRINGS NOT SAME LENGTH',MSG
OI RC,4
MVC 0(0,R1),DASTR2
REPLMVC EX R14,*-6
EDIT EX 0,8
DC H'0'
B $RETURN
*
$CENOPE CLI YESNO,C' '
BE $CENOPEN
CLI DIANDOR,C'A'
BE $CENOPEN
B $CENOPEN+4
$CENOPEN MVI YESNO,C'N'
$CEZ DS 0H
$RETURN CLI LDA(R7),X'FF'
BE $RETURNZ
L R7,DANEXT
LTR R7,R7
BZ $RETURNZ
CLI 0(R7),X'FF'
BE $RETURNZ
CLI DACHAREQ,C' '
BE $CE+4
B $CS+4
*
$RETURNZ L R9,ARETURN
BR R9
ARETURN DC A(0)
* -------------------------------------------
$WRITE L R0,BEGREC
L R1,DCBADDR
PUT (1),(0)
AP DCB#,P1
BR R9
*
.PASTIF ANOP
*
*
*
*
ED15 DC X'402020206B2020206B2020206B2020206B212020'
CLOSEMSG DC CL18' RECORDS READ '
*
USING IHADCB,2
CLOSE TM DCBOFLGS,DCBOFOPN
BZR R9
CLOSE ((2))
TM DCBOFLGS-IHADCB+SYSPRINT,DCBOFOPN
BZR R9
MVC LINE(8),DCBDDNAM
MVC LINE+8(7),=C' CLOSED'
MVC LINE+15(L'ED15+L'CLOSEMSG),ED15
LR R15,R2
SH R15,=H'16'
LA R1,LINE+14+L'ED15
EDMK LINE+15(L'ED15),0(R15)
MVC LINE+17(54),0(R1)
BAL R14,PUTLINE
BR R9
DROP 2
EXIT8 OI RC,8
B Z
STARTENZ MSG B,'SYSIN TERMINATED BY STARTEND=',MSG
*
Z LA R2,IN
BAL R9,CLOSE
MVC CLOSEMSG+10(7),=C'WRITTEN'
LA R2,OUT
BAL R9,CLOSE
L R3,AGETMAIN
C R3,IFANDORZ
BNL DONE
CLOSDCB LA R2,DCBDCB
C R2,IFANDORZ
BNL DONE
BAL R9,CLOSE
L R3,DCBNEXT
B CLOSDCB
DONE LA R2,SYSPRINT
BAL R9,CLOSE
LA R2,SYSIN
BAL R9,CLOSE
LM R0,R1,LGETMAIN
FREEMAIN R,LV=(0),A=(1)
LM R0,R1,LBUFFER
LTR R1,R1
BZ SR1515
FREEMAIN R,LV=(0),A=(1)
*
SR1515 SR 15,15
IC 15,RC
L 13,4(13)
L 14,12(13)
LM 0,12,20(13)
BR 14
*
LTORG
STARTEND DC CL27' '
DC X'FF'
RC DC X'00'
P0 DC X'0C'
P1 DC X'1C'
YESNO DC C' '
FLAGDOC DC C' '
FLAGWTO DC C' '
WRITSEL DC C' '
*
FLAGWRIT DC C' '
FLAGMSG DC C'E'
FLAGTEST DC 2X'00' NEED 2 BYTES FOR HEX PACK
FLAGLIST DC CL35' '
*
DW DC 3D'0'
PREVR8 DC 4F'0'
IFANDOR DC F'0'
IFANDORZ DC F'0'
*
LWRITE DC F'32768'
AWRITE DC F'0'
*
LBUFFER DC X'00007FFC'
ABUFFER DC FL4'0'
*
EGETMAIN DC F'4000'
LGETMAIN DC F'4000'
AGETMAIN DC F'0'
*
FIRSTDCB DC F'0'
LASTDCB DC 2A(0)
NEXTDCB DC F'0'
PREVDCB DC F'0'
*
HEX DC C'0123456789ABCDEF '
DC CL8' '
LINE DC CL133'MYSCAN, ASM &SYSDATE AT &SYSTIME -LINWOOD LYONS E
EMAIL LINLYONS@YAHOO.COM SUBJECT=MYSCAN FOR USE AUTHOR
RIZATION.'
DC CL8' '
CARD DC CL80' ',CL53' '
TESTPACK DC 10X'00000000000000000000222200006600',CL8' '
PARM DC CL133'READ //IN FILE, SELECT (EDIT) RECORDS, AND WRITE TH
HE SELECTED RECORDS TO ONE OR MORE OUTPUT FILES.'
DC 16CL16'0123456789ABCDEF'
TESTHEX EQU *-193
DC 6X'00',41C' ',10X'00',6C' '
TRHEX EQU *-193
DC X'0A0B0C0D0E0F',CL41' ',X'00010203040506070809'
*
FINDEND DC XL64'00',C' ',XL64'00'
ORG FINDEND+C','
DC C','
ORG FINDEND+C')'
DC C')'
ORG
DC 128X'00'
FINDTBL DC C' ',XL192'00'
FINDEQ EQU FINDTBL-C'='
*
TRUPPER DC 256AL1(*-TRUPPER)
ORG TRUPPER+X'81'
DC C'ABCDEFBHI'
ORG TRUPPER+X'91'
DC C'JKLMNOPQR'
ORG TRUPPER+X'A2'
DC C'STUVWXYZ'
ORG
*
TRLOWER DC 256AL1(*-TRLOWER)
ORG TRLOWER+C'A'
DC X'818283848586878889' A-I
ORG TRLOWER+C'J'
DC X'919293949596979899' J-R
ORG TRLOWER+C'S'
DC X'A2A3A4A5A6A7A8A9' S-Z
ORG
*
PUSH PRINT
PRINT NOGEN
DS 0D
#SYSIN DC PL8'0'
DC CL8'SYSIN'
SYSIN DCB DDNAME=SYSIN,DSORG=PS,LRECL=133,RECFM=FT,MACRF=GL,EODAD=ZS
DS 0D
#IN DC PL8'0'
DC CL8'IN'
IN DCB DDNAME=IN,DSORG=PS,LRECL=133,RECFM=FT,MACRF=GL,EODAD=Z
DS 0D
DC PL8'0'
DC CL8'OUT'
OUT DCB DDNAME=OUT,DSORG=PS,LRECL=133,RECFM=FT,MACRF=PM
DC PL8'0'
DC CL8'OUTZ'
OUTZ DCB DDNAME=OUTZ,DSORG=PS,LRECL=133,RECFM=FT,MACRF=PM
DC C'ABCD'
LOUTZ EQU *-OUTZ+16
SYSPRINT DCB DDNAME=SYSPRINT,DSORG=PS,LRECL=133,RECFM=FT,MACRF=PM
POP PRINT
*
FREQTBL DC 256X'05'
ORG FREQTBL
DC X'191817'
ORG FREQTBL+X'20' BLANK + SPECIAL CHARS
DC X'22',15X'09'
ORG FREQTBL+X'30' ASCII NUMBERS
DC X'20191817161514131211'
ORG FREQTBL+X'40' ASCII UPPER CASE LETTERS
DC X'022407131625100818220405151220230803171921140611040903'
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
*
* 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 ((*-MYSCAN)/4096+1)*4096
@@PAD#2 EQU @@PAD#1-(*-MYSCAN)
ORG *+@@PAD#2
*
DCBDSECT DSECT 0
DCBNEXT DS A
DCBADDR DS A
DCBFLDS DS A
DCB# DS PL8
DCBDD DS CL8
DCBDCB DS XL104
DS CL4
LDCB EQU *-DCBDSECT
*
DI DSECT IF= DSECT
DINEXT DS A
DIR7 DS A
DIOPCODE DS C
DIANDOR DS C
DISEARCH DS C
DS C
*
DIOPCOD2 DS 0CL4
DIOPCODL DS C
DIOPCODG DS C
DIOPCODW DS C
DIOPCODZ DS C
DILABELS DS 0CL24
DIWRITE DS CL8
DIGOTO DS CL8
DILABEL DS CL8
LDI EQU *-DI
*
DA DSECT
DANEXT DS A
DALABELS DS 0CL24
DAOPCODE DS C
DAZEND DS C
DAWRGO DS C,C
*
DATYPE DS C
DAFLGCLC DS C
DANUMERI DS 2C
DAGOTO DS CL8
DAWRITE DS CL8
*
DAFROM DS H
DATO DS H
DA# DS PL6
*
DAEQ DS X
DACHAREQ DS CL2
*
DACHAR DS C
DACHAOFF DS H
*
DATRTBL DS A
DALEN1 DS H
* LSTRING EQU 30 DEFINED AT 'START'
DASTR1 DS CL(LSTRING)
LDA EQU *-DA
*
DALEN2 DS H
DASTR2 DS CL(LSTRING)
LDAEDIT EQU *-DA
*
END MYSCAN