SCANFREQ
AGO .START
THIS PROGRAM CREATES THE FREQENCY TABLE (QFREQTBL)
IT DOES THAT BY READING 2 FILES, AND COUNTING THE CHARACTERS
IN THEM. WHEN I DID IT, ONE FILE WAS A TEXT FILE, AND THE
OTHER WAS A LOAD MODULE. MAYBE FOR 'NORMAL' USE, ONE WOULD USE
1, OR 2, DATA FILES. THIS IS A 3 STEP PROCESS.
1. RUN READING 1-2 FILES THAT REPRESENT THE LIKELY DATA FILES
THAT YOU'LL BE PROCESSING. I USED ONE TEXT FILE, AND 1 LOAD MOD.
THE OUTPUT OF THAT RUN CONSISTS OF 256 "DEF RECORDS THAT CAN
BE USED TO ASSEMBLE THE FREQUENCY TABLE.
NOTE THAT DEF RECORDS ARE PRODUCED TWICE, ONCE AFTER EACH
INPUT FILE. USE THE LAST, COMPOSITE SET.
2. CUT+PASTE THOSE DEF RECORDS INTO THE END OF THIS SOURCE PROGRAM
AND RUN IT AGAIN. THIS 2ND RUN WILL PRODUCE THE DC X' RECORDS
THAT YOU SEE BELOW. YOU THEN WANT TO CUT+PASTE THOSE INTO THE
SCAN???? PROGRAM THAT WILL BE USING THE TABLE TO FIND CHARACTER
STRINGS.
3. PASTE THIS NEW TABLE INTO THE SCANFAST / SCANSTR / SCANEDIT
PROGRAMS SO THAT THEY'LL RUN FASTER. I'VE DONE THAT AS BEST
I WAS ABLE, BUT I DON'T HAVE YOUR DATA.
ALTERNATIVELY, SCANFREQ ALSO PRODUCES A 256 BYTE RECORD THAT IS
THE EVENTUAL QFREQTBL TABLE THAT'S USED IN EACH OF THE SCAN...
PROGRAMS. I'LL CONSIDER CREATING A FILE THAT IMPORTS THAT RECORD
INTO THE VARIOUS SCAN... PROGRAMS. I HAVEN'T DECIDE WHETHER TO
DO THAT OR NOT.
SO, RUN SCANFREQ ONCE WITH //INA AND //INE READING DATA.
THE WAY I'VE SET IT UP IS THAT:
//INE READS AND ANALYZES RECORDS.
//INA READS AND ANALYZES RECFM=U DATA BLOCKS, IGNORING RECORDS.
ONE OUTPUT OF THAT FIRST RUN IS 256 "DEF" SOURCE CODE RECORDS.
YOU TAKE THOSE, AND REPLACE THE EXISTING DEF RECORDS WITH THE
NEW ONES THAT YOU'VE PRODUCED, AND THE OUTPUT OF THAT SEDONE RUN
IS THE SET OF "DC" X RECORDS THAT YOU SEE BELOW.
THE OTHER OUTPUT IS THE 256 BYTE RECORD THAT IS THE EVENTUAL
FREQUENCY TABLE.
------------ THESE FEW LINES ARE USEFUL IN Z390.ORG TESTING.-------
------------ FIRST THE ASSEMBLE, LINK, TEST REQUEST
SET INE=C:\USERS\LIN\DOCUMENTS\BUSHSTUFF.TXT
SET INA=C:\USERS\LIN\DOCUMENTS\Z390CODE\ADSTRING.390
SET FREQTBL=C:\USERS\LIN\DOCUMENTS\Z390CODE\SCANFREQ.FREQTBL.TXT
SET SYSPRINT=C:\USERS\LIN\DOCUMENTS\Z390CODE\SCANFREQ.SYSPRINT.TXT
BAT\ASMLG C:\USERS\LIN\DOCUMENTS\Z390CODE\SCANFREQ
C:\USERS\LIN\DOCUMENTS\Z390CODE\SCANFREQ
---- PARM(A) ONLY DO INA FILE. PARM(E) ONLY DO INE FILE.
THIS APPLIES TO MVS RUNS AS WELL.
SET INE=C:\USERS\LIN\DOCUMENTS\Z390CODE\COUNTCHR.PRN
SET INA=C:\USERS\LIN\DOCUMENTS\Z390CODE\COUNTCHR.360
SET FREQTBL=C:\USERS\LIN\DOCUMENTS\Z390CODE\SCANFREQ.FREQTBL.TXT
SET SYSPRINT=C:\USERS\LIN\DOCUMENTS\Z390CODE\COUNTCHR.SYSPRINT.TXT
BAT\EZ390 C:\USERS\LIN\DOCUMENTS\Z390CODE\COUNTCHR PARM(A)
*
TO USE THIS IN AN MVS ENVIRONMENT ...
//FREQ EXEC PGM=SCANFREQ
//STEPLIB DD DISP=SHR,DSN=
//SYSPRINT DD SYSOUT=*
//INA DD DISP=SHR,DSN= BINARY DATA FILE
//INE DD DISP=SHR,DSN= TEXT DATA FILE
//FREQTBL DD DISP=(,CAT6LG),DSN= 256 BYTE CHAR FREQUENCY RECORD
IF I'VE ADDED CODE TO THE OTHER PROGRAMS, YOU COULD OPEN THE FREQTBL
FILE AND READ THAT RECORD OVER THE QFREQTBL TABLE OF CHARACTER
FREQUENCY. WE'LL SEE IF I GET TO THAT. AND WHETHER I/WE THINK
THAT IT'S WORTH DOING.
STEP2 IS, YOU HAVE TO EDIT SCANFREQ, REPLACING THE NEW DEF RECORDS
BEFORE DOING THE 2ND RUN. THEN EDIT THE SCAN??? PROGRAMS WITH
THE NEW QFREQTBL SOURCE CODE.
STEP3 WOULD BE TO RE-ASSEMBEL THE SCAN PROGRAM(S) WITH YOUR NEW
FREQUENCY TABLE. THAT WOULD PROBABLY RUN A BIT BETTER IN YOUR
ENVIRONMENT.
THIS IS THE QFREQTBL THAT I CREATED AND USED.
DC X'5431292B2C4E2A2C2D23342027222336'
DC X'442428242125211F28213D2620212122'
DC X'2A222128392124222425252329202021'
DC X'3024213335262F242920252126202022'
DC X'944120222C37244723232089465A4522'
DC X'482024202E2021203127323C4B593227'
DC X'77842420222024202220267F497A3853'
DC X'3B2220202420202122336B5066656A5D'
DC X'3E917C8886937D818A8E212020202021'
DC X'4258748B878F9083518C20202B212120'
DC X'25318D9285768263804D2220224A2020'
DC X'272021202220202127212120214B2021'
DC X'286E62685F60575556693F4030202122'
DC X'3A4C5564675E5B5F4361292625212224'
DC X'35226F70524C5C3F4F3A23202A202020'
DC X'7B7E797273716D6C7578232120212427'
DONE. I USED THIS TO ANALYZE MY BUSHSTUFF.TXT AND ADSTRING.390
LOAD MOD FOR CHARACTER FREQUENCY. THE TABLE ABOVE IS WHAT I'VE USED.
.START ANOP
MACRO
DEF &LOC,&FREQ
GBLA &N
GBLC &LAST
LCLA &L
&L SETA &N+31
AIF ('&LAST' EQ '&FREQ').ORG
&N SETA &N+1
.ORG ORG QFREQTBL+X'&LOC'
DC AL1(&L)
&LAST SETC '&FREQ'
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
*
MACRO
&LBL SORT &FIRST,&END,&ENTLEN,&KEY,&KEYLEN
* SORT FIRST,END,ENTLEN,KEYLOC,KEYLEN
LCLA &N
LCLC &L
&N SETA &SYSNDX
&L SETC 'SYS&N'
&LBL STM 14,4,12(13)
$$LA 14,&ENTLEN LOAD ENTRY LENGTH
$$LA 15,&END
LA 4,&ENTLEN.(15)
SR 15,14
$$LA 1,&FIRST
&L.A LR 3,1
LA 2,&ENTLEN.(1)
&L.C CLC &KEY.(&KEYLEN,1),&KEY.(2)
BH *+6
LR 2,1
BXLE 1,14,&L.C
CR 2,1
BE &L.N
MVC 0(&ENTLEN,4),0(2)
MVC 0(&ENTLEN,2),0(3)
MVC 0(&ENTLEN,3),0(4)
&L.N LA 1,&ENTLEN.(3)
CR 1,15
BL &L.A
LM 14,4,12(13)
MEND
*
*
SCANFREQ START 0
YREGS
USING *,13
DS 18F
ORG *-72
STM 14,12,12(13)
ST 13,4(15)
ST 15,8(13)
LR 13,15
L R1,0(R1)
CLI 1(R1),0
BE OPEN
MVC PARM(1),2(R1)
B OPEN
ORG
* LGETMAIN DC A(2048)
* AGETMAIN DC F'0'
#RECS DC PL6'0',CL11'RECORDS'
#CHARS DC PL6'0',CL11'CHARACTERS'
PUSH PRINT
PRINT NOGEN
INE DCB DDNAME=INE,DSORG=PS,MACRF=GL,LRECL=32760,RECFM=FT,EODAD=Z
INA DCB DDNAME=INA,DSORG=PS,MACRF=GL,LRECL=32760,RECFM=F,EODAD=Z
OUT DCB DDNAME=FREQTBL,DSORG=PS,MACRF=PM,LRECL=256,RECFM=F
SYSPRINT DCB DDNAME=SYSPRINT,DSORG=PS,MACRF=PM,LRECL=133,RECFM=FT
*
USING IHADCB,R7
OPENIN MVC OPENMSG+1(8),DCBDDNAM
MVC OPENMSG+17(3),=C' IN'
OPEN ((7),INPUT)
B OPENUNPK
*
OPENMSG DC CL60' ........ OPENED OUTPUT, RECFM=.. LRECL=..... BLKSIZE='
*PENMSG DC C' ........ OPENED, RECFM=.. LRECL=..... BLKSIZE=..... '
OPENOUT MVC OPENMSG+1(8),DCBDDNAM
MVC OPENMSG+17(3),=C'OUT'
OPEN ((7),OUTPUT)
*
OPENUNPK UNPK OPENMSG+31(3),DCBRECFM(2)
TR OPENMSG+31(3),HEX-240
MVI OPENMSG+33,C' '
LH R0,DCBLRECL
CVD R0,DW
OI DW+7,X'0F'
UNPK OPENMSG+40(5),DW+5(3)
LH R0,DCBBLKSI
CVD R0,DW
OI DW+7,X'0F'
UNPK OPENMSG+54(5),DW+5(3)
MVC LINE(L'OPENMSG),OPENMSG
PUT SYSPRINT,LINE
MVC LINE+1(66),LINE
BR R8
DROP R7
*
OPEN1 BAL R8,OPENIN
GET1 GET (7)
AP #RECS,=P'1'
LR R3,R1
LH R4,DCBLRECL-IHADCB(R7)
AR R4,R3
LOOP1 SR R1,R1
AP #CHARS,=P'1'
IC R1,0(R3)
SLL R1,2
LA R2,TBL(R1)
L R14,0(R2)
LA R14,1(R14)
TM 1(R2),X'80'
BO *+8
ST R14,0(R2)
LA R3,1(R3)
LR R0,R4
SR R0,R3
CH R0,=H'134'
BL NOCHK
CLI 0(R3),C' '
BNE *+14
CLC LINE(132),0(R3)
BE GET1
CLI 0(R3),0
BNE *+14
CLC IDMSG(132),0(R3)
BE GET1
NOCHK CR R3,R4
BL LOOP1
B GET1
Z BAL R8,CLOSE
BR R9
POP PRINT
*
OPEN LA R7,SYSPRINT
BAL R8,OPENOUT
PUT SYSPRINT,IDMSG
MVI IDMSG,0
MVC IDMSG+1(132),IDMSG
*
BAL R9,SETUP
*
LA R7,INE
CLI PARM,C'A'
BE *+12
BAL R9,OPEN1
BAL R9,REPORT
*
LA R7,INA
CLI PARM,C'E'
BE *+12
BAL R9,OPEN1
BAL R9,REPORT
*
LA R7,OUT
BAL R8,OPENOUT
PUT OUT,QFREQTBL
*
MVC LINE,LINE-1
MVC LINE+1(22),=C'FREQTBL RECORD WRITTEN'
PUT SYSPRINT,LINE
MVC LINE,LINE-1
*
LA R7,INA
BAL R8,CLOSE
LA R7,INE
BAL R8,CLOSE
LA R7,OUT
BAL R8,CLOSE
*
MVC LINE,LINE-1
MVC LINE(8),=C' BYE BYE'
PUT SYSPRINT,LINE
MVC LINE,LINE-1
*
LA R7,SYSPRINT
BAL R8,CLOSE
*
L R13,4(R13)
LM 14,12,12(13)
SR 15,15
BR 14
*
CLOSE TM DCBOFLGS-IHADCB(R7),DCBOFOPN
BZR R8
CLOSE ((7))
TM DCBOFLGS-IHADCB+SYSPRINT,DCBOFOPN
BZR R8
MVC LINE+1(8),DCBDDNAM-IHADCB(R7)
MVC LINE+9(7),=C' CLOSED'
PUT SYSPRINT,LINE
BR R8
*
PARM DC C' '
ED11 DC X'4020206B2020206B2020206B202120'
*
REPORT MVC LINE(L'ED11),ED11
ED LINE(L'ED11),#RECS
MVC LINE+L'ED11+2(11),#RECS+6
MVC LINE+25(L'ED11),ED11
ED LINE+25(L'ED11),#CHARS
MVC LINE+23+L'ED11+3(11),#CHARS+6
MVC LINE+23+L'ED11+3+13(6),=C'SO FAR'
PUT SYSPRINT,LINE
MVC LINE,LINE-1
*
LA R3,TBL
LA R4,256
SR R2,R2
LOOP2 ST R2,12(R13)
MVC LINE+9(3),=C'DEF'
UNPK LINE+15(3),15(2,R13)
TR LINE+15(2),HEX-240
MVI LINE+17,C','
*
L R0,0(R3)
CVD R0,16(R13)
OI 23(R13),X'0F'
UNPK LINE+18(11),18(6,R13)
*
* MVC LINE+7(L'ED11),ED11
* ED LINE+7(L'ED11),18(R13)
* LTR R0,R0
* BNZ *+8
* MVI LINE+8+L'ED11,C'0'
*
LA R3,4(R3)
LA R2,1(R2)
PUT SYSPRINT,LINE
BCT R4,LOOP2
BR R9
*
QFREQTBL DC 256X'05'
ORG QFREQTBL
DC X'151413'
ORG QFREQTBL+X'20' BLANK + SPECIAL CHARS
DC X'15',15X'09'
ORG QFREQTBL+X'30' ASCII NUMBERS
DC X'14',9X'12',6X'09'
ORG QFREQTBL+X'40' ASCII UPPER CASE LETTERS
DC X'091411111114111111141011121212141110121212131010091309'
DC 6X'08' SPECIAL CHARS,THEN LOWER CASE LETTERS
DC X'091411111114111111141011121212141110121212131010091309'
DC 5X'08'
ORG QFREQTBL+X'80'
* A B C D E F G H I
DC X'05141111111411111114',6X'05' EBCDIC LOWER CASE
* J K L M N O P Q R
DC X'05111110111314110013',6X'05' "
* S T U V W X Y Z
DC X'05051313120909081209',6X'05' "
DC 16X'05'
ORG QFREQTBL+X'C1'
DC X'141212121912121214',6X'05' UPPER CASE
DC X'05121212101414120314',6X'05'
DC X'05051414121111040904',6X'05'
DC X'15151413131313131313',6X'05'
ORG
*
SETUP DS 0H
DEF 17,00000000000
DEF 1C,00000000000
DEF 2D,00000000000
DEF 2E,00000000000
DEF 39,00000000000
DEF 3D,00000000000
DEF 3E,00000000000
DEF 42,00000000000
DEF 4A,00000000000
DEF 51,00000000000
DEF 53,00000000000
DEF 55,00000000000
DEF 57,00000000000
DEF 63,00000000000
DEF 65,00000000000
DEF 67,00000000000
DEF 69,00000000000
DEF 72,00000000000
DEF 73,00000000000
DEF 75,00000000000
DEF 76,00000000000
DEF 8B,00000000000
DEF 8C,00000000000
DEF 8D,00000000000
DEF 8E,00000000000
DEF 9A,00000000000
DEF 9B,00000000000
DEF 9F,00000000000
DEF AB,00000000000
DEF AE,00000000000
DEF AF,00000000000
DEF B1,00000000000
DEF B3,00000000000
DEF B5,00000000000
DEF B6,00000000000
DEF BB,00000000000
DEF BE,00000000000
DEF CD,00000000000
DEF EB,00000000000
DEF ED,00000000000
DEF EE,00000000000
DEF EF,00000000000
DEF FC,00000000000
DEF 0B,00000000001
DEF 14,00000000001
DEF 16,00000000001
DEF 19,00000000001
DEF 1D,00000000001
DEF 22,00000000001
DEF 25,00000000001
DEF 2F,00000000001
DEF 32,00000000001
DEF 3B,00000000001
DEF 56,00000000001
DEF 77,00000000001
DEF 8A,00000000001
DEF 8F,00000000001
DEF 9D,00000000001
DEF 9E,00000000001
DEF B2,00000000001
DEF B7,00000000001
DEF B9,00000000001
DEF BA,00000000001
DEF BC,00000000001
DEF BF,00000000001
DEF CE,00000000001
DEF DD,00000000001
DEF FB,00000000001
DEF FD,00000000001
DEF 1E,00000000002
DEF 1F,00000000002
DEF 21,00000000002
DEF 27,00000000002
DEF 3F,00000000002
DEF 43,00000000002
DEF 4F,00000000002
DEF 64,00000000002
DEF 68,00000000002
DEF 71,00000000002
DEF 78,00000000002
DEF AA,00000000002
DEF AC,00000000002
DEF B4,00000000002
DEF CF,00000000002
DEF DE,00000000002
DEF E1,00000000002
DEF 0D,00000000003
DEF 0E,00000000003
DEF 2B,00000000003
DEF 48,00000000003
DEF 49,00000000003
DEF EA,00000000003
DEF FA,00000000003
DEF 09,00000000004
DEF 13,00000000004
DEF 26,00000000004
DEF 28,00000000004
DEF 31,00000000004
DEF 37,00000000004
DEF 46,00000000004
DEF 52,00000000004
DEF 62,00000000004
DEF 66,00000000004
DEF 74,00000000004
DEF DF,00000000004
DEF FE,00000000004
DEF 11,00000000005
DEF 29,00000000005
DEF 2A,00000000005
DEF 3A,00000000005
DEF A0,00000000005
DEF DC,00000000005
DEF 15,00000000006
DEF 1B,00000000006
DEF 35,00000000006
DEF 6A,00000000006
DEF DB,00000000006
DEF 3C,00000000007
DEF 59,00000000007
DEF 5F,00000000007
DEF B0,00000000007
DEF B8,00000000007
DEF FF,00000000007
DEF 0C,00000000008
DEF 12,00000000008
DEF 23,00000000008
DEF C0,00000000008
DEF 18,00000000009
DEF 2C,00000000009
DEF 38,00000000009
DEF DA,00000000009
DEF 02,00000000010
DEF 20,00000000010
DEF EC,00000000010
DEF 06,00000000011
DEF 9C,00000000011
DEF 03,00000000013
DEF 07,00000000013
DEF 44,00000000013
DEF 04,00000000014
DEF 08,00000000016
DEF 54,00000000019
DEF 36,00000000020
DEF CC,00000000020
DEF 30,00000000022
DEF 58,00000000022
DEF A1,00000000022
DEF 01,00000000023
DEF 5E,00000000023
DEF 5A,00000000024
DEF 79,00000000024
DEF 33,00000000026
DEF 0A,00000000027
DEF E0,00000000027
DEF 34,00000000031
DEF 0F,00000000036
DEF 45,00000000037
DEF 6E,00000000039
DEF 24,00000000043
DEF D0,00000000043
DEF E9,00000000044
DEF 70,00000000046
DEF 5B,00000000047
DEF 1A,00000000049
DEF 80,00000000053
DEF CA,00000000053
DEF E7,00000000054
DEF CB,00000000060
DEF 41,00000000072
DEF 90,00000000079
DEF D8,00000000082
DEF 10,00000000084
DEF 4E,00000000086
DEF 4C,00000000089
DEF 47,00000000091
DEF 50,00000000095
DEF 6C,00000000099
DEF AD,00000000113
DEF BD,00000000113
DEF 5C,00000000147
DEF E5,00000000147
DEF D1,00000000151
DEF A9,00000000168
DEF 05,00000000179
DEF E8,00000000200
DEF 7B,00000000220
DEF 98,00000000224
DEF E4,00000000227
DEF 6F,00000000234
DEF 00,00000000240
DEF D2,00000000240
DEF C7,00000000286
DEF C8,00000000287
DEF C6,00000000303
DEF 91,00000000335
DEF 5D,00000000336
DEF 4D,00000000348
DEF D6,00000000361
DEF E6,00000000384
DEF 7F,00000000390
DEF D5,00000000414
DEF D7,00000000414
DEF C4,00000000420
DEF C5,00000000446
DEF D9,00000000458
DEF C2,00000000460
DEF A7,00000000482
DEF D3,00000000514
DEF 7D,00000000535
DEF 7C,00000000559
DEF D4,00000000561
DEF C3,00000000663
DEF C9,00000000692
DEF 7E,00000000727
DEF 7A,00000000735
DEF F7,00000000829
DEF F6,00000000849
DEF C1,00000000851
DEF E2,00000000864
DEF E3,00000000872
DEF F5,00000000989
DEF F3,00000001010
DEF F4,00000001303
DEF 92,00000001346
DEF F8,00000001422
DEF A5,00000001432
DEF 60,00000001669
DEF F9,00000001906
DEF F2,00000001956
DEF 6D,00000002188
DEF F0,00000002227
DEF 82,00000002265
DEF 86,00000002608
DEF F1,00000002702
DEF 6B,00000002777
DEF A8,00000002887
DEF 87,00000003466
DEF A6,00000003557
DEF 97,00000003929
DEF 61,00000003949
DEF A4,00000004314
DEF 84,00000004814
DEF 94,00000005100
DEF 83,00000005421
DEF 4B,00000005469
DEF 88,00000006781
DEF 93,00000007094
DEF 99,00000009007
DEF A2,00000009144
DEF 89,00000010347
DEF 95,00000010476
DEF 96,00000011890
DEF 81,00000012251
DEF A3,00000013664
DEF 85,00000017084
DEF 40,00000039118
ORG
LA R4,16
LA R2,QFREQTBL
*
UNPK0 LA R3,LINE+17
LA R1,4
MVC LINE+9(8),=C'DC X'''
UNPK UNPK 0(9,R3),0(5,R2)
TR 0(8,R3),HEX-240
LA R2,4(R2)
LA R3,8(R3)
BCT R1,UNPK
MVI 0(R3),C''''
PUT SYSPRINT,LINE
BCT R4,UNPK0
MVC LINE,LINE-1
BR R9
*
LTORG
DC CL4' '
LINE DC CL133' '
IDMSG DC CL133' SCANFREQ, ASM &SYSDATE AT &SYSTIME'
DW DC D'0'
HEX DC C'0123456789ABCDEF'
TBL DC 256F'0'
DCBD DEVD=DA
END SCANFREQ