Someone asked if they could change x'00' to x'40 on every record of a file.
So I wrote a program. Just for exercise. And I rewrote it. And I rewrote it. I'm happy with how it works now. It just changes all instances of a single character. The question is whether you get lots of instances in a row, or if they're scattered through the file. If it's all in a row, then use CLI to see the next character. If the characters are scattered, then use TRT to find one, and change it. SOOOO what I did is start with CLI, and change the character. But if it's not the character, then use TRT to find one. That works faster if there are random characters scattered. This is that program. I just replaced it in this documentation. NOTE that within the PARM field, you can use any special character you like for the delimiter. This would allow you to change ' to ".
The //SYSPRINT file tells you how it worked.
EDITONE, ASM 03/18/26, 11.28 PARM=C$A$$X$C2$
SYSPRINT OPENED OUTPUT, RECFM=A0 LRECL=00133
IN OPENED INPUT, RECFM=A0 LRECL=00399
OUT OPENED OUTPUT, RECFM=A0 LRECL=00133
468 RECORDS READ
358 BYTES CHANGED
468 RECORDS WRITTEN
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
ERR &BC,&MSG
LCLA &A
LCLC &L
&L SETC 'SYS&SYSNDX'
&A SETA K'&MSG
REVB &BC,&L.Z
BAL R14,ERR
DC AL1(&A-2),C&MSG
&L.Z DS 0H
MEND
* -----------------------------------------------------------
*
EDITONE START 0
YREGS
USING *,13
STM 14,12,12(13)
ST 13,4(15)
ST 15,8(13)
LR 13,15
L R3,0(R1)
LA R2,2(R3) C' ',X'02'
CLI 1(R3),9
ERR BL,'PARM TOO SHORT, EG X"00",C" "'
LH R4,0(R3)
BCTR R4,0
MVC LINE+32(5),=C'PARM='
MVC LINE+37(0),2(R3)
EX R4,*-6
*
LA R0,2
LA R5,CLI+1
PARMLOOP CLI 0(R2),C'C'
BE PARMC
CLI 0(R2),C'X'
ERR BNE,'EG, PARM= C"A",X"C2" ONLY C AND X ALLOWED'
MVC 12(2,R13),2(R2)
TRT 12(2,R13),TESTHEX-193
ERR BNZ,'BAD HEX'
TR 12(2,R13),MAKEHEX-193
PACK 16(2,R13),12(3,R13)
MVC 0(1,R5),16(R13)
LA R2,6(R2)
B PARMBCT
PARMC MVC 0(1,R5),2(R2)
LA R2,5(R2)
PARMBCT LA R5,MVI+1
BCT R0,PARMLOOP
*
MVC CLI2+1(1),CLI+1
SR R1,R1
IC R1,CLI+1
LA R2,TRTTBL(R1)
MVI 0(R2),4
*
LA R2,SYSPRINT
BAL R9,OPENOUT
LA R2,IN
BAL R9,OPENIN
LA R2,OUT
BAL R9,OPENOUT
B GET
*
OPENOUT MVC DCBLINE(8),DCBDDNAM-IHADCB(R2)
CLI DCBRECFM-IHADCB(R2),0
BNE *+16
MVC DCBRECFM-IHADCB+OUT,DCBRECFM-IHADCB+IN
MVC DCBLRECL-IHADCB+OUT,DCBLRECL-IHADCB+IN
*
PUSH PRINT
PRINT NOGEN
OPEN ((2),OUTPUT)
MVC DCBLINE+16(3),=C'OUT'
CLC =C'SYSPRINT',DCBLINE
BNE NOTSYSP
PUT SYSPRINT,LINE-1
MVC LINE,LINE-1
B NOTSYSP
OPENIN MVC DCBLINE(8),DCBDDNAM-IHADCB(R2)
OPEN ((2),INPUT)
POP PRINT
MVC DCBLINE+16(3),=C' IN'
NOTSYSP UNPK DCBLINE+30(3),DCBRECFM-IHADCB(2,R2)
TR DCBLINE+30(2),HEX-240
MVI DCBLINE+32,C' '
LH R0,DCBLRECL-IHADCB(R2)
CVD R0,12(R13)
OI 19(R13),X'0F'
MVC LINE(L'DCBLINE),DCBLINE
UNPK LINE+L'DCBLINE(5),17(3,R13)
PUT SYSPRINT,LINE-1
BR R9
DCBLINE DC C'........ OPENED OUTPUT, RECFM=.. LRECL='
*
MVC 0(0,R15),1(R3)
MVC LINE+14(0),1(R14)
ERR MVC LINE,LINE-1
IC R1,0(R14)
N R1,=F'15'
EX R1,ERR-6
*
CLC =C'PARM',1(R14)
BNE ERRNPARM
LA R15,LINE+17(R1)
IC R1,1(R3)
EX R1,ERR-12
MVI 0(R15),C' '
*
ERRNPARM LA R14,0(R14)
SR R14,R13
STH R14,12(R13)
UNPK 16(5,R13),12(3,R13)
TR 16(4,R13),HEX-240
MVC LINE(9),=C'ERROR AT '
MVC LINE+9(4),16(R13)
TM DCBOFLGS-IHADCB+SYSPRINT,DCBOFOPN
BO ERRPUT
OPEN (SYSPRINT,OUTPUT)
ERRPUT PUT SYSPRINT,LINE-1
ABEND 1
*
PUT PUT OUT,(3)
AP #PUT,P1
*
GET GET IN
AP #LINE,P1
LR R3,R1
LH R4,DCBLRECL-IHADCB+IN
AR R4,R3
LA R5,255
B CLI
*
LA R1,1(R1)
MVI MVI 0(R1),C' '
AP #CHANGES,P1
LA R1,1(R1)
CR R1,R4
BNL PUT
CLI CLI 0(1),C' '
BE MVI
CLI2 CLI 1(R1),C' '
BE MVI-4
QNEXT LR R2,R4
SR R2,R1
BZ PUT
BCTR R2,0
CR R2,R5
BH TRT256
EX R2,TRT1
BZ PUT
B MVI
TRT1 TRT 0(0,R1),TRTTBL
TRT256 TRT 0(256,R1),TRTTBL
BNZ MVI
LA R1,256(R1)
B QNEXT
*
Z LA R2,#LINE
MVC LINE,LINE-1
*
MVC LINE(L'ED15),ED15
ED LINE(L'ED15),0(R2)
MVC LINE+L'ED15+2(16),8(R2)
PUT SYSPRINT,LINE-1
LA R2,24(R2)
CLI 0(R2),99
BL Z+10
*
CLOSE (IN,,OUT,,SYSPRINT)
L 13,4(13)
LM 14,12,12(13)
SR 15,15
BR 14
LTORG
ED15 DC X'40202020202020202020202020202120'
P0 DC X'0C'
P1 DC X'1C'
#LINE DC PL8'0',CL16'RECORDS READ'
#CHANGES DC PL8'0',CL16'BYTES CHANGED'
#PUT DC PL8'0',CL16'RECORDS WRITTEN',X'FF'
HEX DC C'0123456789ABCDEF'
DW DC 2D'0',C' '
DC AL2(88,0),C' '
LINE DC CL133'EDITONE, ASM &SYSDATE, &SYSTIME ',CL60' '
TESTHEX DC 6X'00',41C' ',10X'00',6C' '
MAKEHEX DC X'0A0B0C0D0E0F',41C' ',X'00010203040506070809'
TRTTBL DC XL256'00'
XL DC A(XL+4+X'97000000')
LA R0,0
CH R0,DCBLRECL-IHADCB+OUT
BNER 14
MVC DCBLRECL-IHADCB+OUT,DCBLRECL-IHADCB+IN
MVC DCBRECFM-IHADCB+OUT,DCBRECFM-IHADCB+IN
BR 14
PUSH PRINT
PRINT NOGEN
IN DCB DDNAME=IN,DSORG=PS,MACRF=GL,EODAD=Z
EODAD=Z
OUT DCB DDNAME=OUT,DSORG=PS,MACRF=PM,EXLST=XL
*UT DCB DDNAME=OUT,DSORG=PS,MACRF=PM,RECFM=FT,LRECL=133
SYSPRINT DCB DDNAME=SYSPRINT,DSORG=PS,MACRF=PM,RECFM=FT,LRECL=133
POP PRINT
*
DCBD DEVD=DA
*
END EDITONE