/*SPELL Author: William R. Horton of (now in REXX) */ /* Tennessee Eastman Company, Kingsport, TN. */ /* Revisions made by David McRitchie */ /* at "The REXX Macros Toolbox", DMcRitchie@hotmail.com */ /* Updated 1991/04/08 -- 1991/12/24 11:40 IS03 */ /* Updated 1993/10/05 -- 1993/10/05 20:50 IS03 Convert to REXX */ /*-------------------------------------------------------------------*/ /* Macro: SPELL */ /* Purpose: Run SCRIPT against current data to check spelling */ /*-------------------------------------------------------------------*/ /* Obtained from 'CBT' tape 103 -- TECH.CBT.FILE103.PDS(SPELL) */ /* Created by William R. Horton of Tennessee Eastman Company of */ /* Kingsport, TN, this macro does not require member in edit to be */ /* saved, nor will it cause the member to be saved. Changes have */ /* been made since the original to provide support for SCRIPT */ /* documents. The use of PREFIX and NOPREFIX is supported for the */ /* two datasets created for temporary usage. Lines that have */ /* spelling errors will be reset if X ALL was invoked before use. */ /* As an initial test this macro may be applied against itself. */ /* Error words can be located with LOCATE SPECIAL. Note lines will */ /* be created, which can be eliminated by typing RESET or RESET */ /* SPECIAL on the command line. */ /**********************************************************************/ /* PARM OPTIONS======== */ /* DEBUG USUALLY TRACES SOME LINES */ /* DICT(DICT) OVERRIDES DEFAULT DICTIONARY (SET IN PROFILE) */ /* EAM ENGLISH AMERICAN DICTIONARY SAME AS DICT(EAM) */ /* PROFILE(PROFILE) USE PROFILE OTHER THAN DEFAULT DSMPROF4 */ /* BROWSE BROWSE SCRIPTED LISTING. NORMALLY NOT SEEN. */ /* EDIT EDIT SCRIPTED LISTING. NORMALLY NOT SEEN. */ /* NOCTL Eliminate '.' and ':' in col 1 from spell test. . */ /* Convert ':' anywhere in text to 9 to eliminate. . */ /* Synonomous with MSDS text checking --macro MSPELL.*/ /* NX SPELL CHECK ONLY NX LINES, OTHER LINES AS .* */ /* X WHEN SHOWING WORDS, TREAT AS IF ORIGINAL ALL X. */ /* WOULD BE USED ONLY IN COMBINATION WITH NX. */ /* HELP Invoke ===> TSO CLIST SPELL HELP */ /**********************************************************************/ /* NORMAL USAGE WITHOUT ANY PARAMETERS */ /* NO LINES DISPLAYED (X ALL), SPELL CHECK ALL LINES, LISTING */ /* MISSPELLED WORDS BELOW ACTUAL LINE. LINES IN ERROR RESET. */ /* USE OF (X ALL) BEFORE INVOKING SPELL IS MY PREFERENCE */ /* AT LEAST SOME LINES SHOWN (NX ALL), SPELL WILL LIST LINES AND */ /* WORDS AT THE BEGINNING OF THE LIST. */ /*-------------------------------------------------------------------*/ address "ISREDIT" qcnt = 0 q.="" badline=0; xtralines=0 ADDRESS 'ISREDIT' 'MACRO (PARM)' PARM = TRANSLATE(' 'PARM' ') if POS(' HELP ',PARM) \=0 then do; Address "TSO" "%CLIST SPELL HELP"; return 0; end PARMX = POS(' X ',PARM); IF PARMX \= 0 THEN PARMX = 1 PARMNX = POS(' NX ',PARM); IF PARMNX \= 0 THEN PARMNX = 1 DEBUG = POS(' DEBUG ',PARM); IF DEBUG \= 0 THEN DEBUG = 1 NOCTL = POS(' NOCTL ',PARM); IF NOCTL \= 0 THEN NOCTL = 1 /*******************************************************/ if noctl = 1 then do;"x all";xreset1=1;end else do; "ISREDIT" "SEEK FIRST P'=' 1 X" IF RC \= 0 THEN "x p'=' 1 all" ADDRESS "ISREDIT" "SEEK FIRST P'=' 1 NX" IF RC = 0 THEN XRESET1 = 0 ELSE XRESET1 = 1 end /*******************************************************/ ADDRESS 'ISREDIT' '(LAST) = LINENUM .ZLAST' ADDRESS 'ISREDIT' '(WIDTH) = DATA_WIDTH' ZEDSMSG = ZEDLMSG = '** Spell checking in progress **' ADDRESS 'ISPEXEC' 'CONTROL DISPLAY LOCK' ADDRESS 'ISPEXEC' 'DISPLAY MSG(ISRZ000)' ADDRESS 'ISREDIT' '(DSNX) = DATASET' ADDRESS 'ISREDIT' '(MEMBERX) = MEMBER' LP = '(' RP = ')' DICT = '' /* OR DEFAULT DICTIONARY HERE*/ I = POS(' DICT(',PARM) IF I \= 0 THEN DO PARSE VAR PARM LEFT 'DICT(' DICT ') ' RIGHT PARM == LEFT RIGHT SAY "DICT="DICT" FROM '"PARM"'" END I = POS(' EAM ',PARM); IF I \= 0 THEN DICT = "EAM" PROFILE = 'DSMPROF4' /*DEFAULT*/ I = POS(' PROFILE(',PARM) IF I \= 0 THEN DO PARSE VAR PARM LEFT ' PROFILE(' PROFILE ') ' RIGHT PARM = LEFT RIGHT END /* TSO dataset conventions for use w/o quotes */ SYSUID = SYSVAR('SYSUID') /* Allocate DCF input dataset -- allow up to 200 bytes/rec*/ ADDRESS 'TSO' status = msg('off') 'free fi(ESPELL)' 'free fi(INFILE)' spelldsn = "'"sysuid".spell.macro'" /*********************************************************************/ /* if sysdsn(spelldsn) = "OK" then "del" spelldsn */ /*********************************************************************/ status = msg('on') 'ALLOC FI(ESPELL) NEW CAT SPACE(45 45) TRACKS UNIT(SYSDA)' , 'LRECL(255) RECFM(V B M) BLKSIZE(3156)' , "DSN("spelldsn") REUSE" /* DCB attributes to the contrary will be reset by DCF */ /* Open file and SAY some SCRIPT commands to be sure */ /* data is formatted properly for parsing (later). */ qcnt=qcnt+1; q.qcnt ='.PM 0 0' qcnt=qcnt+1; q.qcnt ='.PW 133' qcnt=qcnt+1; q.qcnt ='.LL 132' qcnt=qcnt+1; q.qcnt ='.CL 132' qcnt=qcnt+1; q.qcnt ='.FO OFF' IF dict \= '' THEN DO qcnt=qcnt+1; q.qcnt ='.DL' DICT DICTX = '.DL' DICT END /* eliminate CCC last page count typed message */ qcnt=qcnt+1; q.qcnt ='.DM HCCEPIF ON' qcnt=qcnt+1; q.qcnt ='.DM OFF' qcnt=qcnt+1; q.qcnt ='.DM LASTPAGE ON' qcnt=qcnt+1; q.qcnt ='.DM OFF' qcnt=qcnt+1; q.qcnt ='.se pron ''0000''' /* end "The REXX Macros Toolbox" considerations */ /*adding in words in this macro -- limit is 808 words */ dcfrec = '.DU ADD DCFINPUT dcfrec DCFMSG EASTMAN EAM ', 'dcfrec EDCTOUT ESPELL FI FSCR HORTON KINGSPORT' , 'NGLOBAL NOPREFIX NRSTR Call TN DICTX regtm' Call DCFINPUT dcfrec = '.DC WORD 05 07 08 14 15 50 61 67 6A 7B 8C 8F ', '9E 9F A1 AB AC AE BB BC BE BF B0 B1 B2 B3 B4 ', 'B5 B6 B7 B8 B9 CB CC C0 D0 EB EC E0 FA' Call DCFINPUT /* by translating / to 9 eliminates JCL ddname */ ADDRESS "ISREDIT" "FIND .ZFIRST .ZFIRST 1 '//'" IF RC = 0 THEN DO; dcfrec = '.TI 61 F9'; Call DCFINPUT; end /* WRITE EACH LINE OF THE DATA BEING EDITED */ xtrlines = qcnt /* lines added in front of file */ I = 1 DO WHILE (I <= LAST) IF 1 = PARMNX THEN DO /* SPECIAL IF NX OPTION IN USE*/ ADDRESS 'ISREDIT' '(XSTATUS) = XSTATUS' I IF "X" = XSTATUS THEN SPELLREC = '.*' ELSE ADDRESS 'ISREDIT' '(SPELLREC) = LINE' I END ELSE ADDRESS 'ISREDIT' '(SPELLREC) = LINE' I if noctl = 1 then do /* for MSDS material w/o macros */ if substr(spellrec,1,4) = '.TOP', | substr(spellrec,1,4) = '.BOT', then spellrec = " "; if substr(spellrec,1,1) = '.' then if substr(spellrec,1,4) \= '.du ' then spellrec='9'substr(spellrec,2) if spellrec \= "" then spellrec = translate(spellrec,'9',':') end /* if msds then make first byte a "9" instead of "." */ qcnt=qcnt+1; q.qcnt=SPELLREC I = I + 1 END Address "TSO" "EXECIO * DISKW ESPELL (STEM Q. FINIS" if pos(' BR',parm) \= 0 then ADDRESS 'ISPEXEC' 'BROWSE DATASET('spelldsn')' /* Invoke SCRIPT/VS */ ZEDLMSG = '** SCRIPT/VS checking words **' ADDRESS 'ISPEXEC' 'CONTROL DISPLAY LOCK' ADDRESS 'ISPEXEC' 'DISPLAY MSG(ISRZ000)' /* ADDRESS 'ISPEXEC' 'SELECT MODE(FSCR) CMD(SCRIPT SPELL.MACRO SPELLCHK',*/ /* FILE(&PREFIX.SPELL.MACRO.LIST) CO M(DELAY) Q B(0))*/ Address 'TSO' 'SCRIPT' spelldsn 'SPELLCHK' , 'SEARCH('''DSNX''')', 'PRO(''SCRIPT.R40.MACLIB('PROFILE')'')', 'LIB(''SCRIPT.R40.MACLIB'')', 'SYS(X NO)', 'FILE('''SYSUID'.SPELL.MACRO.LIST'') CO M(DELAY) Q B(0)' SCRIPT_RC = RC if script_rc \= 0 then SAY 'rc='script_rc 'from ... SCRIPT spell.macro SPELLCHK' , 'SEARCH('''DSNX''')', 'PRO(''SCRIPT.R40.MACLIB('PROFILE')'')', 'LIB(''SCRIPT.R40.MACLIB'')', 'SYS(X NO)', 'FILE('''SYSUID'.SPELL.MACRO.LIST'') CO M(DELAY) Q B(0)' ZEDSMSG = ZEDLMSG = '** SPELL CHECKING IN PROGRESS ** -- FINAL PHASE' ADDRESS 'ISPEXEC' 'CONTROL DISPLAY LOCK' ADDRESS 'ISPEXEC' 'DISPLAY MSG(ISRZ000)' address 'TSO' 'FREE FI(ESPELL) DELETE' EOF = 'NO' MISSPELLED = 0 IF POS(' BR',PARM) \= 0 THEN ADDRESS 'ISPEXEC' 'BROWSE DATASET('''SYSUID'.SPELL.MACRO.LIST'')' IF POS(' ED',PARM) \= 0 THEN, ADDRESS "ISPEXEC" "EDIT DATASET('"SYSUID".SPELL.MACRO.LIST') MACRO(NULL)" "ALLOC FI(infile) DSN('"SYSUID".SPELL.MACRO.LIST') OLD REUSE" q.="" ADDRESS "TSO" "EXECIO * DISKR infile (STEM Q. FINIS" /*------------------------------------------------------*/ /* Read SCRIPT error messages and create MSG records to */ /* show user which card images have misspelled words. */ /*------------------------------------------------------*/ /* aaaa aabb aaBB aacc aaCC aaff aagg aahh aaii aajj aakk*/ IF PARMX = 1 THEN DO /*IF PARM OPTION X TREAT AS IF MIXED*/ XRESET1 = 1 ADDRESS "ISREDIT" "x 1 p'=' all" END dcfrec="" call getrec EOF = "NO" DO WHILE (EOF = 'NO') L = LENGTH(dcfrec) /* no need to check in rexx -- IF L > 18 THEN D-o-*/ IF SUBSTR(dcfrec,2,15) = 'WORDS NOT FOUND' THEN DO MISSPELLED = MISSPELLED + 1 DCFMSG = SUBSTR(dcfrec,2) DCFMSG2 = SUBSTR(dcfrec,17) OKAY = 'NO' call GETREC /* get DCFREC from file*/ x7 = substr(dcfrec,2,7) IF x7 = '''MACRO''' THEN OKAY = 'YES' DO WHILE OKAY||EOF = 'NONO' DCFMSG = DCFMSG||SUBSTR(dcfrec,2) call GETREC /* get DCFREC from file*/ x7 = substr(dcfrec,2,7) if x7 = '''MACRO''' then OKAY = 'YES' END parse var dcfrec '''MACRO'' LINE ' badline ':' if datatype(badline,'N') then do badline = badline - xtrlines ADDRESS 'ISREDIT' 'LINE_AFTER' badline' = NOTELINE (DCFMSG)' IF XRESET1 = 1 THEN , ADDRESS 'ISREDIT' 'RESET X' badline badline ELSE do IF MISSPELLED < 11 THEN ADDRESS 'ISREDIT' 'LINE_BEFORE .ZFIRST = ', 'NOTELINE' '(DCFMSG2)' end end END call getrec END /*"FREE FI(infile) DELETE"*/ IF MISSPELLED > 0 THEN DO ADDRESS 'ISREDIT' 'LINE_AFTER 0 = MSGLINE' , '''MISSPELLED WORDS WERE FOUND ON' MISSPELLED 'LINES' , '(SEE BELOW).''' IF XRESET1 = 0 THEN , ADDRESS 'ISREDIT' 'LINE_BEFORE .ZF = MSGLINE ''-- UP TO 11 LINES', 'SHOWN ABOVE -- ALL MISSPELLINGS APPEAR BELOW --''' ADDRESS 'ISREDIT' 'LOC 0' ZEDSMSG = MISSPELLED 'LINES HAD ERRORS' ZEDLMSG = MISSPELLED 'LINES HAD SPELLING ERRORS', DICTX '-- SCRIPT RC='SCRIPT_RC ADDRESS 'ISPEXEC' 'SETMSG MSG(ISRZ001)' END ELSE DO ZEDSMSG = 'NO MISSPELLED WORDS!' ZEDLMSG = 'ALL WORDS FOUND' DICTX, '-- SCRIPT RC='SCRIPT_RC ADDRESS 'ISPEXEC' 'SETMSG MSG(ISRZ000)' END if noctl = 1 then do address "ISREDIT" "find 1 all '.msds0002'" "find 1 all '.msds0040'" "find 1 all '.msds0005'" "find 1 all '.msds0006'" "find 1 all '.msds0002'" end return END DCFINPUT: procedure , Expose dcfrec qcnt q. qcnt=qcnt+1; q.qcnt = dcfrec Return GETREC: procedure Expose qcnt dcfrec EOF q. qcnt = qcnt + 1 if qcnt <= q.0 then do dcfrec = q.qcnt end; else do; dcfrec=">>EOF>>" EOF="YES" end; Return