********************************************************************************************** * DBG020R4: Edit text screen * Copyright (C) 2000 Martin Rowe <martin@dbg400.net> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ********************************************************************************************** * N.B. This pgm uses workfile logicals, TEMPDFT1 & TEMPDFT2. These are copies of DBGDFTD1 & * DBGDFTD2 in QTEMP. To create this program, wrap the CRTBNDRPG command with overrides, or * create permanent copies of the objects. ********************************************************************************************** H DATEDIT(*YMD) DEBUG(*YES) OPTION(*NODEBUGIO : *SRCSTMT) ********************************************************************************************** * FILES: ********************************************************************************************** FTEMPDFT1 UF A E K DISK USROPN F RENAME(DB1DFT0:TEMP0) FTEMPDFT2 UF E K DISK USROPN F RENAME(DB1DFT1:TEMP1) FDBGDFTD1 UF A E K DISK FDBGDFTH1 UF E K DISK FDBG020DF CF E WORKSTN F SFILE(SFL:RRN1) ********************************************************************************************** * ARRAYS: ********************************************************************************************** * Input text 50 lines of upto 132 characters D P#I S 132 DIM(50) * Output text 50 lines of upto 132 characters D P#O S 132 DIM(50) ********************************************************************************************** * DATA STRUCTURES: ********************************************************************************************** * PROGRAM NAME D SDS D PGM 10 D #@User 254 263 * D DS D Cmd 40 INZ('CLRPFM FILE(QTEMP/DB- D GDFTD0) ') * D Banner DS 79 D Headtx 13 INZ('Edit Text for') D Docmnt 15 24 D Descrp 26 75 * D DS D Atr 1 48 D DIM(24) D ATR001 1 2 D ATR002 3 4 D ATR003 5 6 D ATR004 7 8 D ATR005 9 10 D ATR006 11 12 D ATR007 13 14 D ATR008 15 16 D ATR009 17 18 D ATR010 19 20 D ATR011 21 22 D ATR012 23 24 D ATR013 25 26 D ATR014 27 28 D ATR015 29 30 D ATR016 31 32 D ATR017 33 34 D ATR018 35 36 D ATR019 37 38 D ATR020 39 40 D ATR021 41 42 D ATR022 43 44 D ATR023 45 46 D ATR024 47 48 * ********************************************************************************************** * NAMED CONSTANTS: ********************************************************************************************** D Atribs C CONST(X'215C225C235C245C- D 255C265C305C315C325C- D 335C345C355C365C285C- D 295C2C5C2D5C385C395C- D 3A5C3B5C3C5C3D5C3E5C') D Blanks C CONST(X'4040404040404040404040404040- D 4040404040404040404040') D DspAtr C CONST(X'2021222324252630313233343536- D 28292C2D38393A3B3C3D3E') D Lower C CONST('abcdefghijklmnopqrstuvwxyz') D Upper C CONST('ABCDEFGHIJKLMNOPQRSTUVWXYZ') ********************************************************************************************** * WORK FIELDS: ********************************************************************************************** D #C S 3 0 D #E S 1 D #Errid S 7 D #L S 3 0 D #O S 3 0 D #P S 3 0 D #S S 1 D BegWrp S 5 0 D CmdLen S 15 5 D CmdStr S 256 D CpyDta S 79 D CsrPos S 3 0 D CurrentLine S 5 0 D DataToScan S 80 D DtaLen S 5 0 D EndWrp S 5 0 D ErrCde S 1 D GoCopy S 1 D GoMove S 1 D GoOver S 1 D GoWrap S 1 D HldPag S 4 0 D HldWrp S 5 0 D Ignore S 3 0 D LDA S 512 D Len#1 S 3 0 D Len#2 S 3 0 D Lineno S 5 0 D LineNumber S 3 0 D MovDta S 79 D MsgDta S 512 D MsgFil S 10 D MsgID S 7 D MsgLib S 10 D MsgTyp S 10 D Needed S 3 0 D NewLin S 5 0 D Object S 10 D ObjTyp S 10 D OrgSeq S 5 0 D OvrDta S 79 D P#Elen S 3 0 D P#Flen S 3 0 D P#In1 S 256 D P#In2 S 256 D P#Out S 256 D P#Rent S 3 0 D P#Tent S 3 0 D P#TextLine S 132 D PatternLen S 3 0 D PgmQ S 10 D PgmStk S 5 0 D RcdNbr S 4 0 D Remain S 3 0 D Result S 79 D Rrn1 S 4 0 D SearchMask S 25 D SearchString S 25 D StartPos S 3 0 D StringLen S 3 0 D StringPos S 3 0 D Sv#Col S 3 0 D Sv#Lin S 3 0 D SyntaxPgm S 10 D Tolib S 10 D Toobj S 10 D Totrrn S 4 0 D Totseq S 5 0 D Translate S 1 D Trim S 1 D W#Data S 79 D Wrap S 1 D Wildcard S 1 ********************************************************************************************** * ENTRY PARAMETERS: ********************************************************************************************** C *ENTRY PLIST C PARM P#DOCD C PARM P#TITL ********************************************************************************************** * MAINLINE: ********************************************************************************************** C EXSR #INITS * Screen display C CALL 'DBG045CL' 90 REMOVE MSGS B001 C DOW *IN03 = *OFF * C WRITE MSFLC MSG SUBFILE C WRITE FOOTER C EVAL *IN36 = Rrn1 > 0 C EXFMT SFLCTL C CALL 'DBG045CL' 90 REMOVE MSGS * Store current cursor location C EVAL Sv#Lin = CSRLIN C EVAL Sv#Col = CSRCOL C EVAL HldPag = 1 * Store subfile page number B002 C IF RELRCD > 0 C EVAL HldPag = RELRCD E002 C ENDIF * Process response B002 C SELECT * F2=Syntax prompt/check routine S002 C WHEN *IN02 = *ON C AND SyntaxPgm <> *BLANKS C RELRCD CHAIN SFL 80 B003 C IF *IN80 = *OFF C CALL SyntaxPgm 90 C TXTDTA PARM TXTDTA P#TextLine C UPDATE SFL * Load screen subfile to temp file, process, & copy back to screen C EXSR DWLOAD C EXSR UPLOAD E003 C ENDIF * F3=Exit S002 C WHEN *IN03 = *ON C OR *IN12 = *ON * Display exit panel C MOVE 'Y' #SSAVE C EXFMT WINDOW2 * If F12=Previous not requested B003 C IF *IN12 = *OFF * If 'Save changes' is 'Y'es B004 C IF #SSAVE = 'Y' * Load screen subfile to temp file, process, & write back to document C EXSR DWLOAD C EXSR UPDATE E004 C ENDIF * Exit display C LEAVE * Otherwise user wants to stay on the edit screen so set off exit inds X003 C ELSE C EVAL *IN03 = *OFF C EVAL *IN12 = *OFF E003 C ENDIF * F4=Split line S002 C WHEN *IN04 = *ON C RELRCD CHAIN SFL 80 B003 C IF *IN80 = *OFF * Store page number for redisplay C EVAL HldPag = RELRCD C EVAL CsrPos = CSRCOL - 1 B004 C IF CsrPos > 1 * Allocate line number (to go above selected line) C EVAL NewLin = TXTSEQ * Load screen subfile to temp file, process, & copy back to screen C EXSR DWLOAD C EXSR UPLOAD E004 C ENDIF E003 C ENDIF * F5=Move S002 C WHEN *IN05 = *ON C RELRCD CHAIN SFL 80 B003 C IF *IN80 = *OFF * Store page number for redisplay C EVAL HldPag = RELRCD * If selecting the move line B004 C IF GoMove = *OFF * Flag to select the move location next time round C MOVE *ON GoMove * Highlight the line to be moved C MOVE TXTDTA MovDta C EVAL OrgSeq = TXTSEQ C MOVE X'23' TXTATR C UPDATE SFL * Tell user to put cursor on desired line & press F5 again C MOVE 'GSM0302' MsgID C EVAL MsgDta = *BLANKS C EVAL DtaLen = 0 C EVAL PgmStk = 0 C EXSR SNDMSG * Put cursor back to prior location C EVAL LINE = Sv#Lin C EVAL COL = Sv#Col C EVAL SFPAGE = RELRCD * Otherwise, user is specifying move location X004 C ELSE * Flag back to standard overlay status C MOVE *OFF GoMove * Allocate line number (to go above selected line) * If moved line to go above previous location, use that line number B005 C IF TXTSEQ < OrgSeq C EVAL NewLin = TXTSEQ * otherwise account for shuffling up of all lines above new location X005 C ELSE C EVAL NewLin = TXTSEQ - 10 E005 C ENDIF * Load screen subfile to temp file, process, & copy back to screen C EXSR DWLOAD C EXSR UPLOAD E004 C ENDIF E003 C ENDIF * F6=Insert S002 C WHEN *IN06 = *ON C RELRCD CHAIN SFL 80 B003 C IF *IN80 = *OFF * Store page number for redisplay C EVAL HldPag = RELRCD * Allocate line number (to go above selected line) C EVAL NewLin = TXTSEQ * Load screen subfile to temp file, process, & copy back to screen C EXSR DWLOAD C EXSR UPLOAD E003 C ENDIF * F7=Copy S002 C WHEN *IN07 = *ON C RELRCD CHAIN SFL 80 B003 C IF *IN80 = *OFF * Store page number for redisplay C EVAL HldPag = RELRCD * If selecting the copy line B004 C IF GoCopy = *OFF * Flag to select the copy location next time round C MOVE *ON GoCopy * Highlight the line to be copied C MOVE TXTDTA CpyDta C MOVE X'23' TXTATR C UPDATE SFL * Tell user to put cursor on desired line & press F7 again C MOVE 'GSM0300' MsgID C EVAL MsgDta = *BLANKS C EVAL DtaLen = 0 C EVAL PgmStk = 0 C EXSR SNDMSG * Put cursor back to prior location C EVAL LINE = Sv#Lin C EVAL COL = Sv#Col C EVAL SFPAGE = RELRCD * Otherwise, user is specifying copy location X004 C ELSE * Flag back to standard copy status C MOVE *OFF GoCopy * Allocate line number (to go above selected line) C EVAL NewLin = TXTSEQ * Load screen subfile to temp file, process, & copy back to screen C EXSR DWLOAD C EXSR UPLOAD E004 C ENDIF E003 C ENDIF * F8=Remove S002 C WHEN *IN08 = *ON C RELRCD CHAIN SFL 80 B003 C IF *IN80 = *OFF * Store page number for redisplay C EVAL HldPag = RELRCD * Throw line to end of file (blanked out) & it wiil be removed C EVAL TXTSEQ = 99999 C EVAL TXTDTA = *BLANKS C UPDATE SFL * Load screen subfile to temp file, process, & copy back to screen C EXSR DWLOAD C EXSR UPLOAD E003 C ENDIF * F9=Overlay S002 C WHEN *IN09 = *ON C RELRCD CHAIN SFL 80 B003 C IF *IN80 = *OFF * Store page number for redisplay C EVAL HldPag = RELRCD * If selecting the overlay line B004 C IF GoOver = *OFF * Flag to select the overlay location next time round C MOVE *ON GoOver * Highlight the line to be overlaid C MOVE TXTDTA OvrDta C EVAL OrgSeq = TXTSEQ C MOVE X'23' TXTATR C UPDATE SFL * Tell user to put cursor on desired line & press F9 again C MOVE 'GSM0303' MsgID C EVAL MsgDta = *BLANKS C EVAL DtaLen = 0 C EVAL PgmStk = 0 C EXSR SNDMSG * Put cursor back to prior location C EVAL LINE = Sv#Lin C EVAL COL = Sv#Col C EVAL SFPAGE = RELRCD * Otherwise, user is specifying overlay location X004 C ELSE * Flag back to standard overlay status C MOVE *OFF GoOver C CALL 'DBG042R3' 90 C PARM OvrDta P#In1 C PARM TXTDTA P#In2 C PARM P#Out C MOVEL P#Out TXTDTA C EVAL OvrDta = *BLANKS C MOVE X'20' TXTATR C UPDATE SFL * Load screen subfile to temp file, process, & copy back to screen C EXSR DWLOAD C EXSR UPLOAD E004 C ENDIF E003 C ENDIF * F10=Attributes S002 C WHEN *IN10 = *ON C RELRCD CHAIN SFL 80 B003 C IF *IN80 = *OFF * Store page number for redisplay C EVAL HldPag = RELRCD * Select the desired attributes for the text C EXSR ATTRIB * Load screen subfile to temp file, process, & copy back to screen C EXSR DWLOAD C EXSR UPLOAD E003 C ENDIF * F11=Word wrap S002 C WHEN *IN11 = *ON C RELRCD CHAIN SFL 80 B003 C IF *IN80 = *OFF * Store page number for redisplay C EVAL HldPag = RELRCD * If selecting the first word wrap line B004 C IF GoWrap = *OFF * Flag to select the copy location next time round C MOVE *ON GoWrap * Highlight the wrapping start line C MOVE TXTSEQ BegWrp C MOVE X'23' TXTATR C UPDATE SFL * Tell user to put cursor on the last line to be wrapped, & press 14 C MOVE 'GSM0307' MsgID C EVAL MsgDta = *BLANKS C EVAL DtaLen = 0 C EVAL PgmStk = 0 C EXSR SNDMSG * Put cursor back to prior location C EVAL LINE = Sv#Lin C EVAL COL = Sv#Col C EVAL SFPAGE = RELRCD * Otherwise, user is specifying copy location X004 C ELSE * Flag back to standard wrap status C MOVE *OFF GoWrap * Allocate line number (end of wrap block) C EVAL EndWrp = TXTSEQ * Shuffle line numbers if wrap selection done in reverse order (end wrap * line selected first, then start wrap line). B005 C IF BegWrp > EndWrp C EVAL HldWrp = EndWrp C EVAL EndWrp = BegWrp C EVAL BegWrp = HldWrp E005 C ENDIF * Load screen subfile to temp file, process, & copy back to screen C EXSR DWLOAD C EXSR UPLOAD E004 C ENDIF E003 C ENDIF * F14=Find Options S002 C WHEN *IN14 = *ON C EXSR FINDOPTIONS * F16=Find S002 C WHEN *IN16 = *ON C EXSR FIND * Roll up S002 C WHEN *IN60 = *ON * Add a page of blank records C EXSR ADDPAG * Print (*IN29) S002 C WHEN *IN29 = *ON * Load screen subfile to temp file, process, & copy back to screen C EXSR DWLOAD C EXSR UPLOAD * Print the current 'live' document C CALL 'DBG015R4' 90 C PARM P#DOCD C PARM P#TITL * Inform user that report has been printed C MOVE 'GSM0301' MsgID C P#DOCD CAT(P) P#TITL MsgDta C EVAL DtaLen = 60 C EVAL PgmStk = 0 C EXSR SNDMSG * Otherwise, just save the current changes S002 C OTHER * Load screen subfile to temp file, process, & copy back to screen C EXSR DWLOAD C EXSR UPLOAD E002 C ENDSL E001 C ENDDO * Update the index lock C P#DOCD CHAIN DBGDFTH1 80 B001 C IF *IN80 = *OFF C MOVE 'F' DFLOCK C UPDATE DB1DFTH E001 C ENDIF * C EVAL *INLR = *ON C RETURN ************************************************************************** * #INITS: INITIALISE ROUTINE ************************************************************************** C #INITS BEGSR * Create temp physical of document formatted text file C CALL 'DBG046CL' 90 C PARM 'DBGDFTD0' Object C PARM '*FILE' ObjTyp C PARM 'DBGDFTD0' Toobj C PARM 'QTEMP' Tolib C PARM '0' ErrCde * Create temp logicals over temp document formatted text file C CALL 'DBG046CL' 90 C PARM 'DBGDFTD1' Object C PARM '*FILE' ObjTyp C PARM 'TEMPDFT1' Toobj C PARM 'QTEMP' Tolib C PARM '0' ErrCde * C CALL 'DBG046CL' 90 C PARM 'DBGDFTD2' Object C PARM '*FILE' ObjTyp C PARM 'TEMPDFT2' Toobj C PARM 'QTEMP' Tolib C PARM '0' ErrCde * Clear the file out (if running in same job as earlier editor session) C CALL 'QCMDEXC' 90 C PARM Cmd CmdStr C PARM 40 CmdLen * Open the temp logicals C OPEN TEMPDFT1 C OPEN TEMPDFT2 * Load the temp physical with selected document C P#DOCD CHAIN DBGDFTD1 80 B001 C DOW *IN80 = *OFF C WRITE TEMP0 C P#DOCD READE DBGDFTD1 80 E001 C ENDDO * Field setups * Get company name C *DTAARA DEFINE DBGCOMP COMPNY C IN COMPNY * Get primary search string if present C *DTAARA DEFINE *LDA LDA C IN LDA C EVAL FINDSTRING = %SUBST(LDA:503:10) C EVAL SyntaxPgm = %SUBST(LDA:493:10) C MOVE P#DOCD Docmnt C MOVE P#TITL Descrp C MOVE *OFF GoMove C MOVE *OFF GoCopy C MOVE *OFF GoOver C MOVE *OFF GoWrap C EVAL CpyDta = *BLANKS C EVAL OvrDta = *BLANKS C EVAL MovDta = *BLANKS C EVAL W#Data = *BLANKS C EVAL NewLin = 0 C EVAL CsrPos = 0 C EVAL #P = 0 C EVAL Len#1 = 0 C EVAL Len#2 = 0 C EVAL OrgSeq = 0 C EVAL BegWrp = 0 C EVAL EndWrp = 0 C EVAL HldWrp = 0 C MOVEA Atribs Atr C MOVE '{' STRIND C MOVE '}' ENDIND C MOVE X'20' #E C EVAL HldPag = 1 * Set Find defaults C EVAL MATCHTYPE = '2' C EVAL Wrap = *ON * Load screen from temp file C EXSR UPLOAD * Enable message subfile keywords C EVAL *IN26 = *ON * C ENDSR ************************************************************************** * DWLOAD: DOWNLOAD DATA TO DATABASE FILE FROM SCREEN ************************************************************************** C DWLOAD BEGSR * Loop through the whole subfile, loading into temp file C EVAL DFLINE = 0 C CLEAR P#I C EVAL #C = 0 B001 C 1 DO Totrrn RcdNbr C RcdNbr CHAIN SFL 80 B002 C IF *IN80 = *OFF * If word wrapping this block B003 C IF TXTSEQ >= BegWrp C AND TXTSEQ <= EndWrp * Store text in array, ready for wrapping C EVAL #C = #C + 1 C MOVEL TXTDTA P#I(#C) * If on the last line of the word wrap block B004 C IF TXTSEQ = EndWrp * Fit text to screen size (78 char length) C CALL 'DBG040R3' 90 C PARM #C P#Tent Text entries C PARM 79 P#Elen Entry length C PARM P#I Entry data C PARM 78 P#Flen Format to length C PARM P#Rent Returned entries C PARM P#O Returned data * If format text line program completed okay, load screen fields B005 C IF *IN90 = *OFF B006 C 1 DO P#Rent #L C MOVEL P#O(#L) DFTEXT C EVAL DFLINE = DFLINE + 10 C WRITE TEMP0 E006 C ENDDO E005 C ENDIF E004 C ENDIF * Otherwise processing non wrap lines X003 C ELSE * Don't write lines to be removed after F5=Move/F8=Remove/F9=Overlay B004 C IF TXTSEQ <> OrgSeq C AND TXTSEQ <> 99999 * Bump up text sequence by ten for each line C EVAL DFLINE = DFLINE + 10 C MOVE P#DOCD DFDOCD * If current line is required slot for copy or move B005 C IF DFLINE = NewLin B006 C SELECT * Load split text to two lines S006 C WHEN *IN04 = *ON * Calc length of data before cursor position C EVAL Len#1 = CsrPos - 1 * Calc length of data from cursor position to end C EVAL Len#2 = 80 - CsrPos C EVAL #P = CsrPos * Split line, leaving data before cursor on the original line (in effect) C Len#1 SUBST(P) TXTDTA:1 DFTEXT * And remainder onto the new, inserted line C Len#2 SUBST(P) TXTDTA:#P W#Data C MOVE W#Data TXTDTA * Load moved text to new location S006 C WHEN *IN05 = *ON C MOVE MovDta DFTEXT C EVAL MovDta = *BLANKS * Load copied text to new location S006 C WHEN *IN07 = *ON C MOVE CpyDta DFTEXT C EVAL CpyDta = *BLANKS * Inserting a line - blank entry S006 C OTHER C EVAL DFTEXT = *BLANKS E006 C ENDSL * Write a record for the moved/copied data C WRITE TEMP0 * Bump up text sequence for original line C EVAL DFLINE = DFLINE + 10 E005 C ENDIF * Write the subfile record to temp file C MOVE TXTDTA DFTEXT C WRITE TEMP0 E004 C ENDIF E003 C ENDIF E002 C ENDIF E001 C ENDDO * Reset pointers C EVAL OrgSeq = 0 C EVAL NewLin = 0 C EVAL BegWrp = 0 C EVAL EndWrp = 0 * Strip out all blanks lines from the end of the document (but leave at * least one line to indicate the document exists) C *LOVAL SETLL TEMPDFT2 C READ TEMPDFT2 80 B001 C DOW *IN80 = *OFF B002 C IF DFTEXT <> *BLANKS C OR DFLINE <= 10 C UPDATE TEMP1 C LEAVE E002 C ENDIF C DELETE TEMP1 C READ TEMPDFT2 80 E001 C ENDDO * C ENDSR ************************************************************************** * UPLOAD: UPLOAD DATA FROM DATABASE FILE TO SCREEN ************************************************************************** C UPLOAD BEGSR * Clear the subfile C EVAL *IN36 = *OFF SFLCLR C WRITE SFLCTL C EVAL Rrn1 = 0 C EVAL TXTDTA = *BLANKS C EVAL TXTSEQ = 0 C MOVE X'20' TXTATR * Load in the data from the temp file C *LOVAL SETLL TEMPDFT1 C READ TEMPDFT1 80 B001 C DOW *IN80 = *OFF C MOVE DFTEXT TXTDTA C EVAL TXTSEQ = DFLINE C EVAL Rrn1 = Rrn1 + 1 C WRITE SFL * Delete the records after reading them C DELETE TEMP0 C READ TEMPDFT1 80 E001 C ENDDO * If records added to subfile, complete the page with blank records B001 C IF Rrn1 > 0 C Rrn1 DIV 18 Ignore C MVR Remain C EVAL Needed = 18 - Remain X001 C ELSE C EVAL Needed = 18 E001 C ENDIF * Add the needed blank lines B001 C 1 DO Needed C EVAL TXTSEQ = TXTSEQ + 10 C EVAL TXTDTA = *BLANKS C EVAL Rrn1 = Rrn1 + 1 C WRITE SFL E001 C ENDDO * Save max relative record number C EVAL Totrrn = Rrn1 * Save the max text sequence number C EVAL Totseq = TXTSEQ * If previous page number is still valid (ie not displayed a blank page) B001 C IF HldPag <= Totrrn C EVAL SFPAGE = HldPag * Otherwise set to page 1 X001 C ELSE C EVAL SFPAGE = Rrn1 E001 C ENDIF * Put cursor back to prior location C EVAL LINE = Sv#Lin C EVAL COL = Sv#Col * C ENDSR *********************************************************************** * UPDATE: UPDATE LIVE FILE WITH NEW INFO *********************************************************************** C UPDATE BEGSR * Delete the original document records (live file) B001 C DOU *IN80 = *ON C P#DOCD DELETE DB1DFT0 80 E001 C ENDDO * Now loop through temp file, & write to live file C *LOVAL SETLL TEMPDFT1 C READ TEMPDFT1 80 C EVAL Lineno = 0 B001 C DOW *IN80 = *OFF C MOVE P#DOCD DFDOCD C EVAL Lineno = Lineno + 10 C EVAL DFLINE = Lineno C WRITE DB1DFT0 C READ TEMPDFT1 80 E001 C ENDDO * Update the index with change date/user C P#DOCD CHAIN DBGDFTH1 80 B001 C IF *IN80 = *OFF C EVAL DFADTE = *DATE C MOVE #@User DFAUSR C MOVE 'F' DFLOCK C UPDATE DB1DFTH E001 C ENDIF * Update the keyword index file for this document C CALL 'DBG006R4' 90 C PARM DFDOCD * C ENDSR *********************************************************************** * ATTRIB: REPLACE MARKED CHARACTERS WITH SELECTED ATTRIBUTES *********************************************************************** C ATTRIB BEGSR * Display the attribute menu for selection C EXFMT WINDOW1 * If user didn't quit out of the screen, and selected an option B001 C IF *IN12 = *OFF C AND OPTION <> 0 * Extract the selected attribute C EVAL #O = OPTION C MOVEL Atr(#O) #S * Replace start character with selected attribute C STRIND:#S XLATE TXTDTA Result * Move translated result back into target string C MOVE Result TXTDTA * Replace start character with normalise attribute (hex 20) C ENDIND:#E XLATE TXTDTA Result * Move translated result back into target string C MOVE Result TXTDTA * Update subfile with 'tarted up' text C UPDATE SFL E001 C ENDIF * C ENDSR ************************************************************************** * ADDPAG: ADD A PAGE OF BLANK RECORDS ************************************************************************** C ADDPAG BEGSR * Starting from last record written to subfile C EVAL Rrn1 = Totrrn C EVAL TXTSEQ = Totseq C MOVE X'20' TXTATR C EVAL TXTDTA = *BLANKS * Add 18 blank records B001 C 1 DO 18 C EVAL TXTSEQ = TXTSEQ + 10 C EVAL Rrn1 = Rrn1 + 1 C WRITE SFL E001 C ENDDO * Update max values C EVAL Totrrn = Rrn1 C EVAL Totseq = TXTSEQ C EVAL SFPAGE = Totrrn * Position cursor to start of first line on the new page C EVAL LINE = 2 C EVAL COL = 2 * C ENDSR ************************************************************************** * SNDMSG: SEND PROGRAM MESSAGE ********************************************************************************************** * FINDOPTIONS: Set find options ********************************************************************************************** C FINDOPTIONS BEGSR * C WRITE MSFLC C EXFMT WINDOW3 * Remove messages from queue after display C CALL 'DBG045CL' 90 B001 C SELECT * F3=Exit S001 C WHEN *IN03 = *ON * F12=Previous S001 C WHEN *IN12 = *ON * Enter/F16=Find S001 C OTHER C EVAL Wrap = *ON C EXSR FIND E001 C ENDSL * C ENDSR ********************************************************************************************** * FIND: SEARCH FOR STRING AND POSITION TO, IF FOUND ********************************************************************************************** C FIND BEGSR * B001 C IF FINDSTRING <> *BLANKS B002 C IF MATCHTYPE = '2' C Lower:Upper XLATE FINDSTRING SearchMask C EVAL Translate = *ON X002 C ELSE C EVAL SearchMask = FINDSTRING C EVAL Translate = *OFF E002 C ENDIF * Read all records for this document number B002 C IF Wrap = *ON C EVAL CurrentLine = 1 C EVAL Wrap = *OFF C EVAL StartPos = 1 E002 C ENDIF B002 C DOW CurrentLine <= Totrrn * Get the latest version of the current line being searched C CurrentLine CHAIN SFL 80 * Strip out any display attributes, so search doesn't get confused C DspAtr:Blanks XLATE TXTDTA DataToScan C CALL 'QCLSCAN' 90 C PARM DataToScan C PARM 79 StringLen C PARM StartPos C PARM SearchMask SearchString C PARM 25 PatternLen C PARM Translate C PARM '1' Trim C PARM '$' Wildcard C PARM 0 StringPos B003 C IF StringPos > 0 C CurrentLine DIV 18 Ignore C MVR LineNumber C EVAL SFPAGE = CurrentLine C EVAL COL = StringPos + 1 C EVAL StartPos = COL B004 C IF LineNumber = 0 C EVAL LineNumber = 18 E004 C ENDIF C EVAL LINE = LineNumber + 3 C LEAVE X003 C ELSE C EVAL StartPos = 1 E003 C ENDIF * Read next record for document number C EVAL CurrentLine = CurrentLine + 1 B003 C IF CurrentLine > Totrrn C LEAVE E003 C ENDIF E002 C ENDDO * B002 C IF StringPos = 0 C EVAL Wrap = *ON * Inform user that the string wasn't found - press F16 to search from the start C MOVE 'GSM0308' MsgID C EVAL MsgDta = FINDSTRING C EVAL DtaLen = 25 C EVAL PgmStk = 0 C EXSR SNDMSG E002 C ENDIF E001 C ENDIF * C ENDSR ************************************************************************** C SNDMSG BEGSR * Use in-house utility (via system API 'QMHSNDPM') C CALL 'DBG044R3' C PARM MsgID C PARM 'DBGMSGF' MsgFil C PARM '*LIBL' MsgLib C PARM MsgDta C PARM DtaLen C PARM '*INFO' MsgTyp C PARM PGM PgmQ C PARM PgmStk C PARM ' ' #Errid * C ENDSR **************************************************************************