Yeah, that's what I do in my editor I wrote back in '90. Any time an ESC
comes through I evaluate if the next characters are a known function key.
If not, then I check for my own programmed escape action codes, and if not
then it's just an ESC followed by other chars.
No timing necessary and works like a charm for almost 20 years now. :)
Included below, maybe some of it will be of help to you...
* Release Information
* MANAGE-2000 - CSI - Release 5.0
* OO. - Full Page Editor
*===/============================================================\===*
* / Written by Allen E. Elwood 02/07/90 - AK Savage Software \ * =We=
*<------------------------------------------------------------------>* =Be=
* \ (c) Copyright 1990 by AK Savage Software - All Rights Reserved / *
=Bad!=
*===\============================================================/===*
*#* COPY COPY.TOOLS.BP STANDARD.VARIABLES.2 (REPLACING PGM.NAME BY OO.,
FN.NAME BY OO, IO.OPEN.OPTS BY TERM.DATA:LOCK:XREF) ;*#* Copied Source
Follows (09-13-00)
$INCLUDE STANDARD.COMMON.VARIABLES FROM COPY.TOOLS.BP
$INCLUDE STANDARD.COMMON.APP.PROGRAMS FROM COPY.TOOLS.BP
$INCLUDE COM500 FROM COPY.TOOLS.BP
$INCLUDE STANDARD.VARIABLES.END FROM COPY.TOOLS.BP
PGM.NAME='OO.'; FN.NAME ='OO'
CALL IO.OPEN('TERM.DATA:LOCK:XREF',PASSWORDS)
*#*
EQU SEMI.COLON TO ";";EQU SMALL TO "`;";EQU BIG TO "`:";EQU REFRESH TO
"R";EQU DEL.LINE TO "l";EQU INS.LINE TO "M";EQU DEL.CHAR TO "W";EQU
INS.CHAR TO "Q";EQU CTRL.A TO CHAR(1);EQU RIGHT TO CHAR(6);EQU BACKSPACE TO
CHAR(8);EQU TAB TO CHAR(9);EQU DOWN TO CHAR(10);EQU FORM.FEED TO
CHAR(12);EQU CARRIAGE.RETURN TO CHAR(13);EQU LINE.DELETE TO CHAR(13);EQU
LINE.UNDELETE TO "N";EQU LEFT TO CHAR(21);EQU UP TO CHAR(26);EQU ESCAPE TO
CHAR(27);EQU SMALLEST TO CHAR(31);EQU PAGE.DOWN TO CHAR(68);EQU HOME TO
CHAR(72);EQU INSERT.TOGGLE TO CHAR(73);EQU SHIFT.TAB TO "O";EQU PAGE.UP TO
CHAR(85);EQU BIGGEST TO CHAR(127);EQU LAST.LINE TO 23;EQU VOFFSET TO 3;EQU
HOFFSET TO 20;AT.ROW="a";AND.AT="R";COLUMNS="C";ZAG=''
EQU AM TO @AM
EQU SQL.FORMAT TO "X"
* SET BACKSPACE BACK TO CHAR 127 AFTER ROI FIXES VT100 TERMINAL EMULATION
* TO ACTUALLY DO A BACKSPACE ON A VT100
GOSUB 9000 ; * Perform Initialization.
* Perform Full Screen Editing.
GOSUB 100 ; * Display Screen
* CALL SCREEN.MSG(B4.T:'Hit CTRL-A for Menu':AFT.T:'')
ECHO OFF ; ECHO.FLAG=1
LOOP
LOOP
IF LN.TOG THEN PRINT L(24):C(65):LIN:',':COL:EOL:
PRINT L(LIN-VAM):C(COL-HAM):
IF FN.KEY.ACTIVE THEN
FN.KEY.CNTR+=1
IF FN.KEY.CNTR>FN.KEY.LEN THEN
FN.KEY.ACTIVE=0
CH.IN = SEQ(IN())
END ELSE
CH.IN=SEQ(FN.KEY.VAL[FN.KEY.CNTR,1])
END
END ELSE
CH.IN = SEQ(IN())
END
PRINT L(LIN-VAM):C(COL-HAM):
IF CH.IN=2 THEN GOSUB HANDLE.FUNCTION.KEYS
CH.IN = CHAR(CH.IN)
WHILE CH.IN # CTRL.A DO
BEGIN CASE
CASE CH.IN>SMALLEST AND CH.IN<BIGGEST
IF VM.FLAG="Y" THEN
IF CH.IN='}' THEN ch....@vm
IF CH.IN='|' THEN ch....@svm
END
ZIGGY=ZIG<LIN>
ZLEN=LEN(ZIGGY)
IF INSERT.MODE="I" THEN
IF COL>ZLEN THEN
ZIGGY=ZIGGY:SPACE(COL-ZLEN+5)
ZIG<LIN>=ZIGGY[1,COL-1]:CH.IN
END ELSE
ZIG<LIN>=ZIGGY[1,COL-1]:CH.IN:ZIGGY[COL,LEN(ZIGGY)]
END
* PRINT L(LIN-VAM):C(COL-HAM):INS.CHAR
* PRINT L(LIN-VAM):C(COL-HAM):CH.IN
PRINT
L(LIN-VAM):C(1):EOL:CHANGE(ZIG<LIN>[1+HAM,LAST.COL],ESCAPE,'[')
PRINT L(LIN-VAM):C(COL-HAM):
END ELSE
PRINT L(LIN-VAM):C(COL-HAM):
PRINT CH.IN
IF COL>ZLEN THEN
ZIGGY=ZIGGY:SPACE(COL-ZLEN+5)
ZIG<LIN>=ZIGGY[1,COL-1]:CH.IN
END ELSE
ZIGGY[COL,1]=CH.IN
ZIG<LIN>=ZIGGY
END
END
IF COL = LAST.COL+HAM THEN GOSUB 3000 ; * Do a H.Tab
COL+=1
CASE ESCAPE=CH.IN
IP.TIMEOUT = 99999
PRINT L(LIN-VAM):C(COL-HAM):
IF FN.KEY.ACTIVE THEN
FN.KEY.CNTR+=1
IF FN.KEY.CNTR>FN.KEY.LEN THEN
FN.KEY.ACTIVE=0
SECOND.CHAR = SEQ(IN())
END ELSE
SECOND.CHAR = SEQ(FN.KEY.VAL[FN.KEY.CNTR,1])
END
END ELSE
SECOND.CHAR = SEQ(IN())
END
SECOND.CHAR = CHAR(SECOND.CHAR)
IF SECOND.CHAR=ESCAPE THEN
PRINT L(LIN-VAM):C(COL-HAM):
PRINT '['
ZIGGY=ZIG<LIN>
ZIGGY[COL,1]=CH.IN
ZIG<LIN>=ZIGGY
IF COL = LAST.COL+HAM THEN GOSUB 3000 ; * Do a H.Tab
COL+=1
END ELSE
GOSUB 200 ; * Do Other Escape Sequences
END
CASE DOWN = CH.IN
IF LIN = LAST.LINE+VAM THEN GOSUB 1000 ; * Do a V.Tab
LIN+=1
CASE UP = CH.IN
IF LIN>1 THEN
IF LIN=VAM+1 THEN GOSUB 2000 ; * Cancel a V.Tab
LIN-=1
END
CASE LEFT = CH.IN
IF COL>1 THEN
IF COL>2 THEN IF COL=HAM+2 THEN GOSUB 4000 ; * Cancel a H.Tab
COL-=1
END
CASE RIGHT = CH.IN
IF COL = LAST.COL+HAM THEN GOSUB 3000 ; * Do a H.Tab
COL+=1
CASE TAB = CH.IN
COL+=TOFFSET
LOOP WHILE COL>LAST.COL+HAM DO
GOSUB 3000 ; * Do a H.Tab
REPEAT
CASE CARRIAGE.RETURN = CH.IN
IF COL=1 THEN
INS '' BEFORE ZIG<LIN>
* PRINT L(LAST.LINE):C(COL):DEL.LINE:
* PRINT L(LIN - VAM):C(COL):INS.LINE:
GOSUB 100 ; * Display Screen
END ELSE
COL=1
LIN+=1
IF HAM>0 THEN
HAM=0
IF LIN > LAST.LINE+VAM THEN
GOSUB 1000 ; * Do a Vertical Tab
END ELSE
GOSUB 100 ; * Display Screen
END
END ELSE
IF LIN > LAST.LINE+VAM THEN GOSUB 1000 ; * Do a Vertical Tab
END
END
CASE BACKSPACE = CH.IN
IF COL>1 THEN
IF COL>2 THEN IF COL=HAM+2 THEN GOSUB 4000 ; * Cancel a H.Tab
IF INSERT.MODE="I" THEN
ZIGGY=ZIG<LIN>
ZIGA=ZIGGY[1,COL-2]
ZIGB=ZIGGY[COL,99999]
ZIG<LIN>=ZIGA:ZIGB
* PRINT L(LIN-VAM):C(COL-HAM-1):DEL.CHAR:
ZIGGY=ZIG<LIN>
ZIGA=ZIGGY[LAST.COL+HAM,1]
* PRINT L(LIN-VAM):C(LAST.COL):ZIGA:
COL-=1
PRINT
L(LIN-VAM):C(1):EOL:CHANGE(ZIG<LIN>[1+HAM,LAST.COL],ESCAPE,'[')
PRINT L(LIN-VAM):C(COL-HAM):
END ELSE
COL-=1
PRINT L(LIN-VAM):C(COL-HAM):
PRINT " "
IF LEN(ZIG<LIN>)=COL THEN
ZIGGY=ZIG<LIN>
ZIGGY[COL,1]=""
ZIG<LIN>=ZIGGY
END ELSE
ZIGGY=ZIG<LIN>
ZIGGY[COL,1]=" "
ZIG<LIN>=ZIGGY
END
END
END ELSE
IF LIN>1 THEN
LIN-=1
COL=LEN(ZIG<LIN>)+1
IF INT(COL/LAST.COL)>0 THEN
HAM=COL-HOFFSET
GOSUB 100 ; * Display Screen
END
END
END
END CASE
REPEAT
GOSUB 800 ; * Windows Front End
IF INSERT.MODE="I" THEN
PRINT L(24):C(1):EOL:B4.T:'Insert ON':
END ELSE
PRINT L(24):C(1):EOL:B4.T:'Insert OFF':
END
PRINT ' - ':THE.FILE.NAME:' - ':ITEM.NAME:AFT.T:
REPEAT
HANDLE.FUNCTION.KEYS:
IP.TIMEOUT = 99999
FN.KEY.IN = SEQ(IN())
IP.TIMEOUT=99999
EXTRA.RETURN.YOU.DONT.NEED = SEQ(IN())
FN.KEY.ACTIVE=1
FN.KEY.CNTR=1
BEGIN CASE
CASE FN.KEY.IN='49'
FN.KEY.VAL=ESCAPE:"U"
CASE FN.KEY.IN='50'
FN.KEY.VAL=ESCAPE:"D"
CASE FN.KEY.IN='51'
FN.KEY.VAL=ESCAPE:CARRIAGE.RETURN
CASE FN.KEY.IN='52'
FN.KEY.VAL=ESCAPE:"N"
CASE FN.KEY.IN='53'
FN.KEY.VAL=ESCAPE:"I"
CASE FN.KEY.IN='54'
FN.KEY.VAL=ESCAPE:'H'
CASE FN.KEY.IN='55'
FN.KEY.VAL=' WITH @ID LIKE "...'
CASE FN.KEY.IN='56'
FN.KEY.VAL=STR(BACKSPACE,10)
CASE FN.KEY.IN='57'
FN.KEY.VAL=CTRL.A
CASE FN.KEY.IN='58'
FN.KEY.VAL=CTRL.A
CASE 1
FN.KEY.VAL=''
END CASE
FN.KEY.LEN=LEN(FN.KEY.VAL)
IF FN.KEY.LEN<1 THEN FN.KEY.ACTIVE=0
IF FN.KEY.ACTIVE THEN CH.IN=SEQ(FN.KEY.VAL[FN.KEY.CNTR,1])
RETURN
100* Display Screen
PRINT CLR:
LNS=DCOUNT(ZIG,@AM)
START=1+VAM
FINISH=START+LAST.LINE-1
REALLY.LAST.LINE=FINISH
IF FINISH > LNS THEN FINISH=LNS
LSTART=1+HAM
J=0
FOR I=START TO FINISH
J+=1
OUTPUT=CHANGE(ZIG<I>[LSTART,LAST.COL],ESCAPE,'[')
SWAP FORM.FEED WITH '~' IN OUTPUT
PRINT L(J):C(1):OUTPUT:
NEXT I
IF INSERT.MODE="I" THEN
PRINT L(24):C(1):EOL:B4.T:'Insert ON':
END ELSE
PRINT L(24):C(1):EOL:B4.T:'Insert OFF':
END
PRINT ' - ':THE.FILE.NAME:' - ':ITEM.NAME:AFT.T:
RETURN
200* Do other Escape Sequences
SECOND.CHAR=ICONV(SECOND.CHAR,'MCU')
BEGIN CASE
CASE SQL.FORMAT = SECOND.CHAR
*Okay, we'll SQL format anything that the cursor is touching
CURR.LIN = DOWNCASE(ZIG<LIN>)
CURR.WORD = ''
IF (CURR.LIN[COL,1]=' ' OR CURR.LIN[COL,1]='') THEN
CALL SCREEN.MSG('The Cursor MUST be on the Dict Name you want to
format;b;c;h')
END ELSE
*Get the beginning of the line, the go foward one char at a time,
*converting as you go until eol
B=1
IF COL>1 THEN
FOR B=COL TO 1 STEP -1
CURR.VAL=CURR.LIN[B,1]
IF CURR.VAL # DOT THEN
VALID.NUMBER = (OCONV(CURR.VAL,'MCN') > '')
VALID.ALPHA = (OCONV(CURR.VAL,'MCA') > '')
IF NOT(VALID.NUMBER OR VALID.ALPHA) THEN
B+=1
EXIT
END
END
NEXT
END
EE=LEN(CURR.LIN)
PREV.CHAR.WAS.DOT=0
FOR E=B TO EE
CURR.VAL=CURR.LIN[E,1]
IF PREV.CHAR.WAS.DOT THEN CURR.VAL=UPCASE(CURR.VAL)
IF CURR.VAL=DOT THEN
PREV.CHAR.WAS.DOT=1
CURR.VAL=UNDERSCORE
END ELSE
PREV.CHAR.WAS.DOT=0
VALID.NUMBER = (OCONV(CURR.VAL,'MCN') > '')
VALID.ALPHA = (OCONV(CURR.VAL,'MCA') > '')
IF NOT(VALID.NUMBER OR VALID.ALPHA) THEN EXIT
END
CURR.WORD:=CURR.VAL
NEXT
CURR.WORD[1,1]=UPCASE(CURR.WORD[1,1])
WLEN=LEN(CURR.WORD)
ZIG<LIN>[B,WLEN]=CURR.WORD
GOSUB 100 ; * Display screen
END
CASE REFRESH=SECOND.CHAR
HAM=0
COL=1
GOSUB 100 ; * Display screen
CASE SHIFT.TAB=SECOND.CHAR
IF COL>1 THEN
IF COL>TOFFSET THEN COL=COL-TOFFSET ELSE COL=1
LOOP WHILE COL<=HAM DO
GOSUB 4000 ; * Cancel a H.Tab
REPEAT
END
CASE LINE.DELETE=SECOND.CHAR
IF UNDO=0 THEN UNDO=1
ZAG<UNDO>=ZIG<LIN>
UNDO+=1
DEL ZIG<LIN>
* PRINT L(LIN-VAM):C(1):DEL.LINE:
* PRINT L(LAST.LINE):C(1):INS.LINE:
* LSTART=1+HAM
* OUTPUT=CHANGE(ZIG<REALLY.LAST.LINE>[LSTART,LAST.COL],ESCAPE,'[')
* SWAP FORM.FEED WITH '~' IN OUTPUT
* PRINT OUTPUT:
GOSUB 100 ; * Display Screen
CASE LINE.UNDELETE=SECOND.CHAR
IF UNDO>1 THEN UNDO-=1
INS ZAG<UNDO> BEFORE ZIG<LIN>
* PRINT L(LAST.LINE):C(COL):DEL.LINE:
* PRINT L(LIN - VAM):C(COL):INS.LINE:ZAG<UNDO>[1,LAST.COL]
GOSUB 100 ; * Display Screen
CASE HOME=SECOND.CHAR
LIN=1
COL=1
VAM=0
HAM=0
GOSUB 100 ; * Display Screen
CASE PAGE.DOWN=SECOND.CHAR
VAM+=LAST.LINE
LIN=VAM+1
GOSUB 100 ; * Display Screen
CASE PAGE.UP=SECOND.CHAR
IF VAM>0 THEN
VAM-=LAST.LINE
IF VAM<0 THEN VAM=0
LIN=VAM+1
GOSUB 100 ; * Display Screen
END
CASE INSERT.TOGGLE=SECOND.CHAR
IF INSERT.MODE="I" THEN
INSERT.MODE=""
PRINT L(24):C(1):EOL:B4.T:'Insert OFF':
END ELSE
INSERT.MODE="I"
PRINT L(24):C(1):EOL:B4.T:'Insert ON':
END
PRINT ' - ':THE.FILE.NAME:' - ':ITEM.NAME:AFT.T:
PROMPT " "
CASE 1
ERM='VALUE WAS ':SECOND.CHAR:', This Function Not Available;B;C;H'
CALL SCREEN.MSG(ERM); PROMPT " "
END CASE
RETURN
800* Windows Front End
WN.TEXT=''
WN.HDNG='OO Windows'
WN.TEXT<1>='Oops'
WN.TEXT<2>='Edit'
WN.TEXT<3>='File'
WN.TEXT<4>='Print'
WN.TEXT<5>='Quick Find'
WN.TEXT<6>='Goto Line'
WN.TEXT<7>='TCL'
WN.TEXT<8>='Dup. Line'
WN.TEXT<9>='Chg Tabs'
GOSUB WINDOW.INPUT
BEGIN CASE
CASE WN.RESP=1
RETURN
CASE WN.RESP=2
GOSUB 850 ; * Editing Window
CASE WN.RESP=3
GOSUB 900 ; * Filing Window
CASE WN.RESP=4
GOSUB 6000 ; * Printing Window
CASE WN.RESP=5
GOSUB QUICK.FIND
GOSUB 100 ; * Display Page
CASE WN.RESP=6
GOSUB 5500 ; * Go to a Specific Line Number.
CASE WN.RESP=7
GOSUB 5600 ; * Issue TCL Commands
CASE WN.RESP=8
GOSUB 5700 ; * Duplicate Current Line
CASE WN.RESP=9
GOSUB CHANGE.TABS
END CASE
RETURN
CHANGE.TABS:
WN.TEXT=''
WN.HDNG='Change Tabs To: '
WN.TEXT<1>='Every 2'
WN.TEXT<2>='Every 3'
WN.TEXT<3>='Every 4'
WN.TEXT<4>='Every 5'
WN.TEXT<5>='Every 6'
WN.TEXT<6>='Every 7'
WN.TEXT<7>='Every 8'
WN.TEXT<8>='Every 9'
WN.TEXT<9>='Enter a column number 10'
GOSUB WINDOW.INPUT
IF WN.RESP = 9 THEN
WN.TEXT = ''
WN.HDNG = 'Enter the column number'
WN.TEXT<1> = 'Column : '
GOSUB WINDOW.ENTRY
TOFFSET = WN.RESP - 1
END ELSE
TOFFSET=WN.RESP+1
END
RETURN
850* Editing
WN.TEXT=''
WN.HDNG='OO Editing Window'
WN.TEXT<1>='Oops, Nevermind'
WN.TEXT<2>='Search and Replace'
WN.TEXT<3>='Format Text'
WN.TEXT<4>='Select Text for Editing'
WN.TEXT<5>='Copy Selected Text to Scratch Pad'
WN.TEXT<6>='Insert Text from Scratch Pad'
WN.TEXT<7>='Insert Text from C:\TRANSFER'
WN.TEXT<8>='Delete Text, Place in Scratch Pad'
WN.TEXT<9>='Merge Entire Document'
GOSUB WINDOW.INPUT
BEGIN CASE
CASE WN.RESP=1
RETURN
CASE WN.RESP=2
GOSUB 5000 ; * Search and Replace
GOSUB 100 ; * Display Page
CASE WN.RESP=3
GOSUB 5100 ; * Format Text.
CASE WN.RESP=4
MSG='The First Line in Selection is:':LIN:'.;B'
CALL SCREEN.MSG(MSG) ; PROMPT " "
SEL.FLAG=1
SEL.START=LIN
CASE WN.RESP=5
GOSUB 5200 ; * Copy Selected Text to Scratch Pad
CASE WN.RESP=6 OR WN.RESP = 7
GOSUB 5300 ; * Insert Text from the Scratch Pad
CASE WN.RESP=8
GOSUB 5400 ; * Delete Selected Text
CASE WN.RESP=9
GOSUB MERGE.ENTIRE.DOCUMENT
END CASE
RETURN
900* File it?
WN.TEXT=''
WN.HDNG='OO File Window'
WN.TEXT<1>='Oops, Nevermind.'
WN.TEXT<2>='Top Out of Document.'
WN.TEXT<3>='Save ':THE.FILE.NAME:'\':ITEM.NAME
WN.TEXT<4>='Start a New Document.'
WN.TEXT<5>='Delete Entire Document.'
WN.TEXT<6>='Save, Pre-Compile and Reload'
GOSUB WINDOW.INPUT
BEGIN CASE
CASE WN.RESP=3
IF LEN(ZIG)>'99999999' THEN
ERM='Warning, ':ITEM.NAME:' is greater than 99999999 Bytes. You
Should'
ERM:=' Delete some of this document to the Scratch Pad, and then'
ERM:=' Save this document. Then, immediatly go into a new document
'
ERM:='and Recover the portion of your document that you deleted by '
ERM:='inserting it from the Scratch Pad. Now Returning to your
document!;C;H'
CALL SCREEN.MSG(ERM)
RETURN
END
WN.HDNG='Are You Sure You Want to File?'
WN.TEXT=''
WN.TEXT<1>='Oops, Nevermind'
WN.TEXT<2>='File and Exit'
WN.TEXT<3>='File, but return to document'
IF THE.FILE.NAME[LEN(THE.FILE.NAME)-2,3]=".BP" THEN WN.TEXT<4>='File,
Compile, & Return'
GOSUB WINDOW.INPUT
IF WN.RESP>2 THEN
WRITEU ZIG ON FILE.NAME, ITEM.NAME
ERM=ITEM.NAME:' - ':LEN(ZIG):' Bytes, Now Saved;C;H'
CALL SCREEN.MSG(ERM); PROMPT " "
IF WN.RESP=4 THEN
SS='BX ':THE.FILE.NAME:' ':ITEM.NAME:' (-D,CC)'
PRINT CLR:
PRINT 'Now Compiling ':ITEM.NAME:' in the ':THE.FILE.NAME:' file.'
PERFORM SS
READV SSS FROM VOC, ITEM.NAME,2 ELSE SSS=''
IF SSS='' THEN
CALL SCREEN.MSG('COULD NOT READV VOC - CANNOT DETERMINE PATH FOR
NEWPCODE')
END ELSE
SS='NEWPCODE ':SSS
PRINT SS
PERFORM SS
END
CALL SCREEN.MSG('Hit Return to Continue;C;H') ; PROMPT " "
GOSUB 100 ; * Display Screen
END
RETURN
END
IF WN.RESP=2 THEN
B='Attention : ':ITEM.NAME:' ':LEN(ZIG):' Bytes, is being saved to
':THE.FILE.NAME
PRINT CLR:B
WRITEU ZIG ON FILE.NAME, ITEM.NAME
CALL RELEASE.LOCK(FILE.NAME,ITEM.NAME)
ZIG=B ; LIN=2 ; COL=1 ; VAM=0 ; HAM=0
IF THE.FILE.NAME[LEN(THE.FILE.NAME)-2,3]=".BP" THEN
WN.HDNG='OO Compile Window'
WN.TEXT=''
WN.TEXT<1>='Exit Without Compiling'
WN.TEXT<2>='Compile and Exit'
GOSUB WINDOW.INPUT
IF WN.RESP=2 THEN
SS='BX ':THE.FILE.NAME:' ':ITEM.NAME:' (-D,CC)'
PRINT
PRINT 'Now Compiling ':ITEM.NAME:' in the ':THE.FILE.NAME:'
file.'
PERFORM SS
PRINT 'End of first compile : ':;INPUT DUH.ME
IF NOT(DUH.ME) THEN
SS='BX ':THE.FILE.NAME:' ':ITEM.NAME:' (AU'
PRINT
PRINT 'Now Auditing ':ITEM.NAME:' in the ':THE.FILE.NAME:'
file.'
PERFORM SS
END
READV SSS FROM VOC, ITEM.NAME,2 ELSE SSS=''
IF SSS='' THEN
CALL SCREEN.MSG('COULD NOT READV VOC - CANNOT DETERMINE PATH
FOR NEWPCODE')
END ELSE
SS='NEWPCODE ':SSS
PRINT SS
PERFORM SS
END
END
END
END ELSE
RETURN ; * Back to the HOP.
END
CASE WN.RESP=2
WN.HDNG='OO Top Out Window'
WN.TEXT=''
WN.TEXT<1>='No, Do NOT Top Out!'
WN.TEXT<2>='Yes, Top Out, Do Not File.'
GOSUB WINDOW.INPUT
IF WN.RESP=1 THEN GOTO 900 ; * File it?
PRINT CLR:'Now Topping out of : ':ITEM.NAME:' in file :
':THE.FILE.NAME
CASE WN.RESP=1
RETURN ; * Back to the HOP.
CASE WN.RESP=4
WN.HDNG='Save Current Document Before Exiting?'
WN.TEXT=''
WN.TEXT<1>='Save ':ITEM.NAME
WN.TEXT<2>='No Do Not Save, Start New Document'
GOSUB WINDOW.INPUT
IF WN.RESP=1 THEN
WRITEU ZIG ON FILE.NAME, ITEM.NAME
ERM='Attention : ':ITEM.NAME:' ':LEN(ZIG):' Bytes, has just been
saved to the ':THE.FILE.NAME
ERM:=' File;C;H'
CALL SCREEN.MSG(ERM); PROMPT " "
END
THE.FILE.NAME=""
ITEM.NAME=""
SCRN.SIZE=""
EXTRA.IP="?NO?"
ECHO ON ; ECHO.FLAG=0
CALL RELEASE.LOCK(FILE.NAME,ITEM.NAME)
GOSUB 9000 ; * Perform Initialization
ECHO OFF ; ECHO.FLAG=1
LIN=1 ; COL=1 ; VAM=0 ; HAM=0
GOSUB 100 ; * Display Page
RETURN
CASE WN.RESP=5
WN.HDNG='OO Deletion Window'
WN.TEXT=''
WN.TEXT<1>='Yeah, blow that sucker away!!!'
WN.TEXT<2>="No No No No don't Delete"
GOSUB WINDOW.INPUT
IF WN.RESP=1 THEN DELETE FILE.NAME,ITEM.NAME
IF WN.RESP=2 THEN
CALL SCREEN.MSG('You Wimp, ok I did not not not not delete;b;c;h')
END
CASE WN.RESP=6
WRITEU ZIG ON FILE.NAME, ITEM.NAME
CALL RELEASE.LOCK(FILE.NAME,ITEM.NAME)
PERFORM 'BX ':THE.FILE.NAME:' ':ITEM.NAME:' (PRE'
*#* GEN.P LOCK FILE.NAME THE.FILE.NAME ITEM.NAME 'Basic Program' ;*#* Gen
Source Follows
IF LK.DEPTH.CHK THEN IF RECORDLOCKED(FILE.NAME,ITEM.NAME)>0 THEN CALL
LOCK.ERR(1,THE.FILE.NAME,ITEM.NAME)
LRVU = 0
LOOP
BUSY=0
RECORDLOCKU FILE.NAME,ITEM.NAME ON ERROR CALL
LOCK.ERR(2,THE.FILE.NAME,ITEM.NAME) LOCKED BUSY=1
IF BUSY THEN LRVF = FILE.NAME ; CALL
LOCKED.BY.WHOM(LRVF,ITEM.NAME,'Basic Program',0,1,1) ; IF @USER.TYPE THEN
LRVU = 1
UNTIL NOT(BUSY) DO
REPEAT
IF LRVU THEN WRITEVU FN.NAME ON TERM.CTL, PHYS.DEV.NBR, 21
*#*
READ ZIG FROM FILE.NAME, ITEM.NAME ELSE
SS= 'Your file is gone, someone must have deleted it while it was '
SS:='unlocked for the pre-compile. Yell at them, not me....;b;c;h'
CALL SCREEN.MSG(SS)
END
GOSUB 100 ; * Display Page
RETURN
END CASE
* IF SCRN.SIZE="S" THEN PRINT BIG
CALL RELEASE.LOCK(FILE.NAME,ITEM.NAME)
PRINT 'Be Excellent to Each Other.....'
PRINT ' This is OO..........Signing off'
STOP
1000* Do a Vertical Tab
VAM+=VOFFSET
GOSUB 100 ; * Display Screen
RETURN
2000* Cancel a Vertical Tab
IF VAM>0 THEN VAM-=VOFFSET
IF VAM<VOFFSET THEN VAM=0
GOSUB 100 ; * Display Screen
RETURN
3000* Do a Horizontal Tab
HAM+=HOFFSET
GOSUB 100 ; * Display Screen
RETURN
4000* Cancel a Horizontal Tab
IF HAM>0 THEN HAM-=HOFFSET
IF HAM<HOFFSET THEN HAM=0
GOSUB 100 ; * Display Screen
RETURN
5000* Search and Replace
PRINT CLR:B4.T:'OO - Search and Replace'
PRINT 'Hit ESC at any time to Return'
IF INSERT.MODE="I" THEN
PRINT L(24):C(1):EOL:B4.T:'Insert ON':
END ELSE
PRINT L(24):C(1):EOL:B4.T:'Insert OFF':
END
PRINT ' - ':THE.FILE.NAME:' - ':ITEM.NAME:AFT.T:
PRINT L(3):C(1):
ECHO ON ; ECHO.FLAG=0
PRINT 'Upcase Search or Not? (U/<cr>) : ':;INPUT UPUP
IF UPUP='U' THEN UPUP=1 ELSE UPUP=''
5001 PRINT B4.T:L(4):C(1):' Search for String:
':AFT.T:;INPUT SEARCH.VALUE:;PRINT EOL:
IF SEARCH.VALUE=ESCAPE THEN ECHO OFF ; ECHO.FLAG=1; RETURN
IF UPUP THEN SEARCH.VALUE=UPCASE(SEARCH.VALUE)
PRINT B4.T:L(5):C(1):' Replace with String:
':AFT.T:;INPUT REPLACE.VALUE:;PRINT EOL:
IF REPLACE.VALUE=ESCAPE THEN ECHO OFF ; ECHO.FLAG=1; RETURN
IF UPUP THEN REPLACE.VALUE=UPCASE(REPLACE.VALUE)
PRINT B4.T:L(6):C(1):'Line Prompt, or Occurance Prompt
(L/O)':AFT.T:;INPUT UNIVERSAL:;PRINT EOS:
IF UNIVERSAL=ESCAPE THEN ECHO OFF ; ECHO.FLAG=1; RETURN
PRINT B4.T:L(13):C(10):'* Search will begin with line ':LIN:' *':AFT.T:
PRINT B4.T:L(8):C(10): 'Replace ':AFT.T:SEARCH.VALUE:
PRINT B4.T:L(9):C(10):' With ':AFT.T:REPLACE.VALUE:
PRINT B4.T:L(11):C(10):' Is This OK? (Y/N): ':AFT.T:;INPUT OK
IF OK=ESCAPE THEN ECHO OFF ; ECHO.FLAG=1; RETURN
IF OCONV(OK,'MCU')#"Y" THEN GOTO 5001
SLEN=LEN(SEARCH.VALUE)
LNS=DCOUNT(ZIG,@AM)
FOR I=LIN TO LNS
IF UPUP THEN
ZIGGY=UPCASE(ZIG<I>)
END ELSE
ZIGGY=ZIG<I>
END
POSITION=''
POS=0 ; POS.CNT=0
FINDSTR SEARCH.VALUE IN ZIGGY SETTING POS ELSE POS=0
IF POS THEN
XLEN=LEN(SEARCH.VALUE)
YLEN=LEN(ZIGGY)-(XLEN-1)
FOR P=1 TO YLEN
IF ZIGGY[P,XLEN]=SEARCH.VALUE THEN POSITION<-1>=P ; POS.CNT+=1
NEXT P
END
POS=POSITION
* CALL STRING.SEARCH(SEARCH.VALUE,ZIGGY,POS)
* POS.CNT=DCOUNT(POS,AM)
IF UNIVERSAL="O" THEN
FOR J=POS.CNT TO 1 STEP -1
AA=ZIG<I>[1,POS<J>-1]:REPLACE.VALUE:ZIG<I>[POS<J>+SLEN,9999]
PRINT L(13):'Occurence on Line ':I:EOS
PRINT ZIG<I>[1,POS<J>-1]:B4.T:SEARCH.VALUE:
AFT.T:ZIG<I>[POS<J>+SLEN,9999]
PRINT
ZIG<I>[1,POS<J>-1]:B4.T:REPLACE.VALUE:AFT.T:ZIG<I>[POS<J>+SLEN,9999]
PRINT 'Correct? ':;INPUT YES.OR.NO,1
IF YES.OR.NO=ESCAPE THEN
ECHO OFF
ECHO.FLAG=1
LIN=I
VAM=VOFFSET*(INT(LIN/VOFFSET))
IF VAM=LIN THEN VAM-=VOFFSET
RETURN
END
IF ICONV(YES.OR.NO,'MCU')="Y" THEN ZIG<I>=AA
NEXT J
END ELSE
IF POS.CNT THEN
AA=CHANGE(ZIG<I>,SEARCH.VALUE,REPLACE.VALUE)
PRINT L(13):C(1):'Occurence on Line ':I:EOS
PRINT ZIG<I>
PRINT AA
PRINT 'Correct? ':;INPUT YES.OR.NO,1
IF YES.OR.NO=ESCAPE THEN
ECHO OFF
ECHO.FLAG=1
LIN=I
VAM=VOFFSET*(INT(LIN/VOFFSET))
IF VAM=LIN THEN VAM-=VOFFSET
RETURN
END
IF ICONV(YES.OR.NO,'MCU')="Y" THEN ZIG<I>=AA
END
END
NEXT I
ECHO OFF ; ECHO.FLAG=1
ERM='Search and Replace has been completed;C;H'
CALL SCREEN.MSG(ERM); PROMPT " "
RETURN
5100* Format Text.
IF THE.FILE.NAME[-3,3] = ".BP" THEN
ERM='Cannot format - Item is in a Basic Proc. Library - ':THE.FILE.NAME
ERM:=';C;H'
CALL SCREEN.MSG(ERM) ; PROMPT " "
END ELSE
LIN=1
COL=1
VAM=0
HAM=0
DUMMY=0
DUMA=''
WN.HDNG='OO Format Window'
WN.TEXT=''
WN.TEXT<1>='Nevermind'
WN.TEXT<2>='Format for Coorespondence'
WN.TEXT<3>='Format for Mail'
WN.TEXT<4>='Format for 10-900 Characters'
GOSUB WINDOW.INPUT
IF WN.RESP=2 THEN F.SIZE=70
IF WN.RESP=3 THEN F.SIZE=60
IF WN.RESP=4 THEN
ECHO ON
5110 PRINT CLR:'Format for How Many Columns? (10-900) : ':;INPUT
F.SIZE
IF F.SIZE>900 THEN GOTO 5110
IF F.SIZE<10 THEN GOTO 5110
ECHO OFF
END
IF WN.RESP#1 THEN
PRINT CLR:'Now Formating'
WN.TEXT=''
WN.TEXT<1>='Use Force Justify Format'
WN.TEXT<2>='Use Compressed Format'
GOSUB WINDOW.INPUT
IF WN.RESP=1 THEN
CALL FORMAT.TEXT(ZIG,F.SIZE,DUMA,DUMMY)
ZIG=DUMA
DUMA=''
END ELSE
INS '' BEFORE ZIG<1>
INS '.F' BEFORE ZIG<1>
CALL FORMAT.TEXT(ZIG,F.SIZE,DUMA,DUMMY)
ZIG=DUMA
DUMA=''
DEL ZIG<1>
END
GOSUB 100 ; * Display Screen
END
END
RETURN
5200* Copy Text to Notepad
IF SEL.FLAG=0 THEN
ERM='You Must First Choose a Beginning Selection Using Select Text, '
ERM:='Move the cursor to the Last Line Desired, and then Use Copy to '
ERM:='Place Text in the Scratch Pad. Then you may Insert this Text '
ERM:='at any desired location(s) by Using Insert Text;C;H'
CALL SCREEN.MSG(ERM) ; PROMPT " "
RETURN
END
IF LIN<SEL.START THEN
SEL.FINISH=SEL.START
SEL.START=LIN
END ELSE
SEL.FINISH=LIN
END
WN.HDNG='Copy will be from Line ':SEL.START:' to Line ':SEL.FINISH
WN.TEXT=''
WN.TEXT<1>='Nevermind, Top Out'
WN.TEXT<2>='Copy the Selected Lines to Scratch Pad'
WN.TEXT<3>='Send to C:\transfer'
GOSUB WINDOW.INPUT
BEGIN CASE
CASE WN.RESP=1
PRINT L24:EOL:
SEL.FLAG=0
RETURN
CASE WN.RESP=2 OR WN.RESP=3
SCRATCH.COUNT=0
SCRATCH.PAD=""
SCRATCH.ID=LOGON.ACCOUNT:'.SCRATCH.PAD'
FOR COUNT = SEL.START TO SEL.FINISH
SCRATCH.COUNT+=1
SCRATCH.PAD<SCRATCH.COUNT>=ZIG<COUNT>
NEXT COUNT
SEL.FLAG=0
DELETE MEMO.FILE,SCRATCH.ID
WRITEU SCRATCH.PAD ON MEMO.FILE, SCRATCH.ID
IF WN.RESP=3 THEN
ACTION = 'PC.SEND MEMOS ':SCRATCH.ID:' C:\TRANSFER\SCRATCH.PAD'
PERFORM ACTION
GOSUB 100 ; * Display Screen
END
SCRATCH.PAD=''
* CALL SCREEN.MSG('Text has been Copied to the Scratch Pad;C;H') ; PROMPT
" "
END CASE
RETURN
5300* Insert Text from Notepad
SCRATCH.ID=LOGON.ACCOUNT:'.SCRATCH.PAD'
IF WN.RESP = 7 THEN
ACTION = 'PC.GET MEMOS ':SCRATCH.ID:' C:\TRANSFER\SCRATCH.PAD O'
PERFORM ACTION
GOSUB 100;*DISPLAY PAGE
END
READ SCRATCH.PAD FROM MEMO.FILE, SCRATCH.ID ELSE
ERM='Sorry, the Scratch Pad is Empty, Cannot Complete Insertion;C;H'
CALL SCREEN.MSG(ERM) ; PROMPT " "
RETURN
END
SCRATCH.COUNT=DCOUNT(SCRATCH.PAD,@AM)
WN.HDNG='Insert Text Window'
WN.TEXT=''
WN.TEXT<1>='Oops, Nevermind!'
WN.TEXT<2>='Insert ':SCRATCH.COUNT:' Lines from Scratch Pad Before
Line:':LIN
GOSUB WINDOW.INPUT
BEGIN CASE
CASE WN.RESP=1
RETURN
CASE WN.RESP=2
FOR COUNT=SCRATCH.COUNT TO 1 STEP -1
INS SCRATCH.PAD<COUNT> BEFORE ZIG<LIN>
NEXT COUNT
* MSG='Inserted ':SCRATCH.COUNT:' Lines from Scratch Pad;C;H'
* CALL SCREEN.MSG(MSG) ; PROMPT " "
GOSUB 100 ; * Display Page
END CASE
RETURN
5400* Delete Text, Place in Scratch Pad
IF SEL.FLAG=0 THEN
ERM='You Must First Choose a Beginning Selection Using Select Text, '
ERM:='Move the cursor to the Last Line Desired, and then Use Delete to '
ERM:='Place Text in the Scratch Pad. To Undo, Just Insert this Text '
ERM:='back at the desired location(s) by Using Insert Text;C;H'
CALL SCREEN.MSG(ERM) ; PROMPT " "
RETURN
END
IF LIN<SEL.START THEN
SEL.FINISH=SEL.START
SEL.START=LIN
WHICH.WAY=0
END ELSE
WHICH.WAY=1
SEL.FINISH=LIN
END
WN.HDNG='Delete will be from Line ':SEL.START:' to Line ':SEL.FINISH
WN.TEXT=''
WN.TEXT<1>='Nevermind, Top Out'
WN.TEXT<2>='Delete the Selected Lines to Scratch Pad'
GOSUB WINDOW.INPUT
BEGIN CASE
CASE WN.RESP=1
PRINT L24:EOL:
SEL.FLAG=0
RETURN
CASE WN.RESP=2
SCRATCH.COUNT=0
SCRATCH.PAD=""
SCRATCH.ID=LOGON.ACCOUNT:'.SCRATCH.PAD'
FOR COUNT = SEL.START TO SEL.FINISH
SCRATCH.COUNT+=1
SCRATCH.PAD<SCRATCH.COUNT>=ZIG<COUNT>
NEXT COUNT
SEL.FLAG=0
WRITEU SCRATCH.PAD ON MEMO.FILE, SCRATCH.ID
FOR COUNT = SEL.START TO SEL.FINISH
DEL ZIG<SEL.START>
IF WHICH.WAY THEN LIN-=1
NEXT COUNT
IF WHICH.WAY THEN
LIN+=1
VAM=VOFFSET*(INT(LIN/VOFFSET))
IF VAM=LIN THEN VAM-=VOFFSET
END
IF LIN<1 THEN LIN=1
SCRATCH.PAD=''
* CALL SCREEN.MSG('Deleted Text has been Copied to the Scratch Pad;C;H')
; PROMPT " "
GOSUB 100 ; * Display Page
END CASE
RETURN
5500* Go to a Specific Page
ECHO ON ; ECHO.FLAG=0
PRINT CLR:B4.T:L(6):'Enter 99999 to go to Bottom'
PRINT L(5):' Go to Line Number : ':;INPUT LINE.NBR
PRINT AFT.T:
CURRENT.BOTTOM=DCOUNT(ZIG,@AM)
IF LINE.NBR>CURRENT.BOTTOM THEN
LIN=CURRENT.BOTTOM
END ELSE
IF LINE.NBR > 0 THEN LIN = LINE.NBR
END
VAM=VOFFSET*(INT(LIN/VOFFSET))
IF VAM=LIN THEN VAM-=VOFFSET
GOSUB 100 ; * Display Page
ECHO OFF ; ECHO.FLAG=1
RETURN
5600* Issue TCL Commands
ECHO ON ; ECHO.FLAG=0
PRINT CLR:
PRINT ' Welcome to the TCL OO Zone '
PRINT ''
PROMPT ""
* IF SCRN.SIZE='S' THEN PRINT BIG:
5610 PRINT "OO:\":;INPUT COMMAND
IF ICONV(COMMAND,'MCU')[1,3]='OFF' OR ICONV(COMMAND,'MCU')[1,3]='LOG' THEN
PRINT 'No No, Bad Idea! Go back to OO, file or top, and then '
PRINT 'you can do the ':COMMAND:' command!'
GOTO 5610 ; * More Commands Master!
END
IF ICONV(COMMAND,'MCU')#'END' THEN
PERFORM COMMAND
GOTO 5610 ; * More Commands Master!
END
* IF SCRN.SIZE='S' THEN PRINT SMALL:
GOSUB 100 ; * Display Page.
ECHO OFF ; ECHO.FLAG=1
RETURN
5700* Duplicate Current Line
ZAK=ZIG<LIN>
INS ZAK BEFORE ZIG<LIN>
*SCRATCH.ID=LOGON.ACCOUNT:'.SCRATCH.PAD'
*WRITEU ZAK ON MEMO.FILE, SCRATCH.ID
PRINT L(LAST.LINE):C(COL):DEL.LINE:
PRINT L(LIN - VAM):C(COL):INS.LINE:ZAK[1,LAST.COL]
GOSUB 100 ; * Display Page
RETURN
*===========================================================================
====
QUICK.FIND:*
PRINT CLR:B4.T:'OO - Quick Find'
PRINT 'Hit ESC at any time to Return'
IF INSERT.MODE="I" THEN
PRINT L(24):C(1):EOL:B4.T:'Insert ON':
END ELSE
PRINT L(24):C(1):EOL:B4.T:'Insert OFF':
END
PRINT ' - ':THE.FILE.NAME:' - ':ITEM.NAME:AFT.T:
PRINT L(3):C(1):
ECHO ON ; ECHO.FLAG=0
IF SEARCH.VALUE = '' THEN SEARCH.VALUE = "Custom "
PREV.SV = SEARCH.VALUE
IF PREV.SV THEN
PRINT B4.T:L(3):C(1):' Hit return to search for ':AFT.T:PREV.SV:AFT.T:'
Again'
END
PRINT B4.T:L(4):C(1):' Search for String: ':AFT.T:;INPUT
SEARCH.VALUE:;PRINT EOL:
IF SEARCH.VALUE=ESCAPE THEN ECHO OFF ; ECHO.FLAG=1; RETURN
IF PREV.SV THEN
IF NOT(SEARCH.VALUE) THEN
SEARCH.VALUE = PREV.SV
END
END
SLEN=LEN(SEARCH.VALUE)
LNS=DCOUNT(ZIG,@AM)
FOR I=LIN TO LNS
ZIGGY=ZIG<I>
POSITION=''
POS=0 ; POS.CNT=0
FINDSTR SEARCH.VALUE IN ZIGGY SETTING POS ELSE POS=0
IF POS THEN
XLEN=LEN(SEARCH.VALUE)
YLEN=LEN(ZIGGY)-(XLEN-1)
FOR P=1 TO YLEN
IF ZIGGY[P,XLEN]=SEARCH.VALUE THEN POSITION<-1>=P ; POS.CNT+=1
NEXT P
END
POS=POSITION
FOR J=POS.CNT TO 1 STEP -1
PRINT L(13):C(1):'Occurence on Line ':I:EOS
PRINT ZIG<I>[1,POS<J>-1]:B4.T:SEARCH.VALUE:
AFT.T:ZIG<I>[POS<J>+SLEN,9999]
LOOP
PRINT L(15):C(7):'Stop Here? ':;INPUT YES.OR.NO,1
YES.OR.NO = UPCASE(YES.OR.NO)
IF YES.OR.NO = 'Y' OR YES.OR.NO = 'N' THEN EXIT
REPEAT
IF YES.OR.NO='Y' THEN
ECHO OFF
ECHO.FLAG=1
LIN=I
VAM=VOFFSET*(INT(LIN/VOFFSET))
IF VAM=LIN THEN VAM-=VOFFSET
RETURN
END
NEXT J
NEXT I
ECHO OFF ; ECHO.FLAG=1
ERM='End of Document Reached;C;H'
CALL SCREEN.MSG(ERM); PROMPT " "
RETURN
*===========================================================================
====
MERGE.ENTIRE.DOCUMENT:
ECHO ON ; ECHO.FLAG=0
CRT L(1):C(1):'Merge Entire Document - Hit Escape to
Abort':EOL:L(2):C(1):EOL:L(3):C(1):EOL:
CRT
L(4):C(1):"=================================================================
=":EOL
ANS=""
LOOP
PRINT L(2):C(5):EOL:"Enter Filename Itemname : ":;INPUT FI.NAME
IF FI.NAME=ESCAPE THEN
GOSUB 100 ; * Display Screen
RETURN
END
PRINT L(3):C(5):EOL:' Correct? (Y/N): ':;INPUT ANS
IF ANS=ESCAPE THEN
GOSUB 100 ; * Display Screen
RETURN
END
ANS=OCONV(ANS,'MCU')
UNTIL ANS="Y" DO
IF ANS#"N" THEN CALL SCREEN.MSG('Sorry, ':ANS:' is an invalid response -
try again;B;C;H;')
REPEAT
MERGE.FILE.NAME=FIELD(FI.NAME," ",1)
MERGE.ITEM.NAME=FIELD(FI.NAME," ",2)
OPEN '',MERGE.FILE.NAME TO MERGE.FILE ELSE
ERM='Filename : ':MERGE.FILE.NAME:' Does Not Exist;B;C;H'
CALL SCREEN.MSG(ERM) ; PROMPT " "
GOTO MERGE.ENTIRE.DOCUMENT
END
READ MERGE.RECORD FROM MERGE.FILE, MERGE.ITEM.NAME ELSE
ERM='Itemname : ':MERGE.ITEM.NAME:' Does Not Exist;B;C;H'
CALL SCREEN.MSG(ERM) ; PROMPT " "
GOTO MERGE.ENTIRE.DOCUMENT
END
MERGE.COUNT=DCOUNT(MERGE.RECORD,@AM)
OK.TO.MERGE=1
FOR COUNT=MERGE.COUNT TO 1 STEP -1 WHILE OK.TO.MERGE
IF LEN(ZIG)+LEN(MERGE.RECORD<COUNT>)>99999999 THEN
ERM='Attention, this merge would have resulted in an over 99MB
condition. Merge was halted at Merge Document Line #:':COUNT:',
':MERGE.RECORD<COUNT>:' - Now Returning to Document - It is suggested that
you save your work immediately before adding ANY new lines!!!!!;B;C;H'
CALL SCREEN.MSG(ERM) ; PROMPT " "
OK.TO.MERGE=0
END ELSE
INS MERGE.RECORD<COUNT> BEFORE ZIG<LIN>
END
NEXT COUNT
ECHO OFF ; ECHO.FLAG=1
GOSUB 100 ; * Display Screen
RETURN
6000* Print the Document
WN.HDNG='Printer Type'
WN.TEXT=''
WN.TEXT<1>=' 80 Column Printer'
WN.TEXT<2>='132 Column Printer'
WN.TEXT<3>='132 Column HP4siMX'
WN.TEXT<4>='132 Column Oki'
GOSUB WINDOW.INPUT
IF WN.RESP=1 THEN LP.SIZE=80 ELSE LP.SIZE=132
IF WN.RESP=3 THEN HP=1 ELSE HP=0
IF WN.RESP=4 THEN HP=2
WN.HDNG='OO Print Window'
WN.TEXT=''
WN.TEXT<1>='Nevermind'
WN.TEXT<2>='Add Page Breaks'
WN.TEXT<3>='Do Not Add Page Breaks'
* WN.TEXT<4>='Do a BList w/Cross Reference Line Numbers'
GOSUB WINDOW.INPUT
IF WN.RESP=4 THEN
PRINT CLR:'Note that this ONLY works if you have saved your file first!'
SS='BLIST ':THE.FILE.NAME:' ':ITEM.NAME:' (P,M,E,X,I,C,N)'
PRINT
PRINT SS
PERFORM SS
CALL SCREEN.MSG ('Hit Return to Continue;C;H'); PROMPT " "
GOSUB 100 ; * Display Screen
RETURN
END
IF WN.RESP=2 THEN SKIPPER='YES'
IF WN.RESP=3 THEN SKIPPER='NO'
IF WN.RESP#1 THEN
WN.HDNG='OO Left Margin Window'
WN.TEXT=''
WN.TEXT<1>='Add Five Spaces to Left Margin'
WN.TEXT<2>='Do not Change Left Margin'
WN.TEXT<3>='Add Line Numbers to Left Margin'
GOSUB WINDOW.INPUT
IF WN.RESP=1 THEN MARGIN=5 ELSE MARGIN=0
PRINT CLR:B4.T:'Now Printing Document : ':AFT.T:ITEM.NAME
LINES.OUT=DCOUNT(ZIG,@AM)
PRINT
PRINT 'Document contains ':LINES.OUT:' Lines'
PRINT
RQM 1
IF HP=1 THEN PERFORM "SP-ASSIGN = MIS.LSR"
IF HP=2 THEN PERFORM "SP-ASSIGN = OKI"
CALL PRINTER.ON("","")
IF HP THEN PRINT ESCAPE:"&l0O ":ESCAPE:"(8U ":ESCAPE:"(s 0p 16.66h 8.5v
0s 0b 0T"
CRT @(0,5):'Now Printing Page Number : 1'
ALO.ALO=0
IF WN.RESP#2 THEN LP.SIZE=LP.SIZE-5
FOR ALO=1 TO LINES.OUT
IF ZIG<ALO>[1,1]='~' THEN
PRINT TOP.OF.PAGE
END ELSE
SECTIONS=INT(LEN(ZIG<ALO>)/LP.SIZE)
IF WN.RESP#2 THEN
SEC.SEC=(SECTIONS*LP.SIZE)+(SECTIONS*5)
SECTIONS=INT(SEC.SEC/LP.SIZE)
IF SEC.SEC => SECTIONS*LP.SIZE THEN SECTIONS+=1
END ELSE
IF LEN(ZIG<ALO>) => SECTIONS*LP.SIZE THEN SECTIONS+=1
END
IF SECTIONS=0 THEN SECTIONS=1
FOR ALS=1 TO SECTIONS
IF WN.RESP<3 THEN PRINT
SPACE(MARGIN):ZIG<ALO>[((ALS-1)*(LP.SIZE-MARGIN))+1,LEN(ZIG<ALO>[((ALS-1)*(L
P.SIZE-MARGIN))+1,(LP.SIZE-MARGIN)])]
IF WN.RESP=3 THEN PRINT
ALO"L#5":ZIG<ALO>[((ALS-1)*(LP.SIZE-5))+1,LEN(ZIG<ALO>[((ALS-1)*(LP.SIZE-5))
+1,(LP.SIZE-5)])]
ALO.ALO+=1
NEXT ALS
END
IF MOD(ALO.ALO,60)=0 THEN
IF SKIPPER='YES' THEN PRINT TOP.OF.PAGE
CRT @(0,05):'Now Printing Page Number : ':INT(ALO/60)+1
END
NEXT ALO
CALL PRINTER.CLOSE("","")
ERM=B4.T:ITEM.NAME:AFT.T:' has now been printed;C;H'
CALL SCREEN.MSG(ERM); PROMPT " "
GOSUB 100 ; * Display Screen
IF HP THEN PERFORM "SP.STD"
END
RETURN
9000* Perform Initialization.
VAM=0 ; HAM=0 ; SCRATCH.PAD="" ; INSERT.MODE='I'
DOT='.'
SEARCH.VALUE = ''
UNDERSCORE='_'
UNDO=0
TOFFSET=5
IF UPCASE(FIELD(LOGON.ACCOUNT,':',1))='MBOWMA' THEN TOFFSET=75
ZIG=''
ZIG<1>='Hi Kiddies, Its OO Time'
LIN=1 ; COL=1
OPEN '', 'VOC' TO VOC ELSE PRINT 'OH MY GOD THE VOC IS GONE';STOP
PRINT CLR:ZIG
IF EXTRA.IP='?NO?' THEN
SCRN.SIZE='' ; THE.FILE.NAME='' ; ITEM.NAME=''
END ELSE
SWAP SEMI.COLON WITH AM IN EXTRA.IP
CNT=DCOUNT(EXTRA.IP,@AM)
IF EXTRA.IP<1> = 'DICT' THEN
DICT.ON = 1
DEL EXTRA.IP<1>
END ELSE
DICT.ON =0
END
IF CNT=1 THEN
ITEM.NAME=EXTRA.IP<1>
READ VR FROM VOC, ITEM.NAME THEN
BEGIN CASE
CASE VR<1>='C'
THE.FILE.NAME=FIELD(VR<3>,' ',1)
CASE VR<1>='R'
THE.FILE.NAME=VR<2>
CASE 1
THE.FILE.NAME="AEE.BP"
END CASE
END ELSE
THE.FILE.NAME="AEE.BP"
END
END
IF CNT>1 THEN THE.FILE.NAME=EXTRA.IP<1> ; ITEM.NAME=EXTRA.IP<2>
IF CNT>2 THEN SCRN.SIZE=EXTRA.IP<3> ELSE SCRN.SIZE=''
EXTRA.IP='?NO?'
END
PROMPT " "
IF THE.FILE.NAME>"" THEN
PRINT 'FILENAME : ':THE.FILE.NAME
END ELSE
PRINT 'FILENAME : ':;INPUT THE.FILE.NAME:
IF THE.FILE.NAME="" THEN
THE.FILE.NAME="AEE.BP"
PRINT "AEE.BP"
END ELSE
PRINT
END
END
FILE.OPEN.ERROR = 0
IF DICT.ON THEN
OPEN 'DICT', THE.FILE.NAME TO FILE.NAME ELSE FILE.OPEN.ERROR = 1
END ELSE
OPEN THE.FILE.NAME TO FILE.NAME ELSE FILE.OPEN.ERROR = 1
END
IF FILE.OPEN.ERROR THEN
ERM='Sorry, but file : ':B4.T:THE.FILE.NAME:AFT.T:' does not
exist!;B;C;H'
CALL SCREEN.MSG(ERM); PROMPT " "
STOP
END
IF ITEM.NAME>'' THEN
PRINT 'ITEMNAME : ':ITEM.NAME
END ELSE
PRINT 'ITEMNAME : ':;INPUT ITEM.NAME
END
LOOP
*#* GEN.P LOCK FILE.NAME THE.FILE.NAME ITEM.NAME ;*#* Gen Source Follows
IF LK.DEPTH.CHK THEN IF RECORDLOCKED(FILE.NAME,ITEM.NAME)>0 THEN CALL
LOCK.ERR(1,THE.FILE.NAME,ITEM.NAME)
BUSY=0
RECORDLOCKU FILE.NAME,ITEM.NAME ON ERROR CALL
LOCK.ERR(2,THE.FILE.NAME,ITEM.NAME) LOCKED BUSY=1
IF BUSY THEN LRVF = FILE.NAME ; CALL
LOCKED.BY.WHOM(LRVF,ITEM.NAME,'',0,0,0) ; IF @USER.TYPE THEN LRVU = 1
*#*
IF NOT(BUSY) THEN EXIT
CALL SCREEN.MSG(THE.FILE.NAME:' ':ITEM.NAME:' locked by
':BY.WHOM:';B;C;H')
PRINT 'Continue trying? (Y/N) : ':;INPUT YORN
IF OCONV(YORN,'MCU')#'Y' THEN STOP
REPEAT
READ ZIG FROM FILE.NAME, ITEM.NAME ELSE
LAST.COL=80
WN.HDNG=ITEM.NAME:' is a New Item'
WN.TEXT=''
WN.TEXT<1>='Continue with this New Item'
WN.TEXT<2>='Change the Item Name'
WN.TEXT<3>='Change the File Name'
WN.TEXT<4>='Change the Item AND File Name'
WN.TEXT<5>='Exit OO'
ECHO.FLAG=0
GOSUB WINDOW.INPUT
BEGIN CASE
CASE WN.RESP=5
CALL RELEASE.LOCK(FILE.NAME,ITEM.NAME)
STOP
CASE WN.RESP=2
ITEM.NAME='' ; EXTRA.IP='' ; EXTRA.IP<1>=THE.FILE.NAME ;
EXTRA.IP<3>=SCRN.SIZE
CALL RELEASE.LOCK(FILE.NAME,ITEM.NAME)
GOTO 9000 ; * Initialization
CASE WN.RESP=3
THE.FILE.NAME='' ; EXTRA.IP='' ; EXTRA.IP<2>=ITEM.NAME ;
EXTRA.IP<3>=SCRN.SIZE
CALL RELEASE.LOCK(FILE.NAME,ITEM.NAME)
GOTO 9000 ; * Initialization
CASE WN.RESP=4
ITEM.NAME=''
THE.FILE.NAME=''
CALL RELEASE.LOCK(FILE.NAME,ITEM.NAME)
GOTO 9000 ; * Initialization
END CASE
* ERM='Attention : ':B4.T:ITEM.NAME:AFT.T:' is a NEW ITEM in
':B4.T:THE.FILE.NAME:AFT.T:';C;H'
* CALL SCREEN.MSG(ERM); PROMPT " "
ZIG=""
END
SEL.FLAG=0 ; LN.TOG=1 ; SCRATCH.COUNT=0
9001 IF SCRN.SIZE='' THEN PRINT "Big or Small (80 or 132 Column) ":;INPUT
SCRN.SIZE
SCRN.SIZE=UPCASE(SCRN.SIZE)
IF SCRN.SIZE='' THEN SCRN.SIZE='B'
IF SCRN.SIZE="S" THEN
LAST.COL=132
* PRINT SMALL
END ELSE
IF SCRN.SIZE#"B" THEN SCRN.SIZE=''; GOTO 9001
LAST.COL=80
END
SET.VALUE.MARK.FLAG:
VM.FLAG=""
PRINT "Use Value Marks? (Y/N) : ":;INPUT VM.FLAG
IF VM.FLAG="" THEN VM.FLAG="N"
VM.FLAG=OCONV(VM.FLAG,'MCU')
IF VM.FLAG#"Y" THEN IF VM.FLAG#"N" THEN GOTO SET.VALUE.MARK.FLAG
OPEN 'MEMOS' TO MEMO.FILE ELSE
ERM='Error, you must have a MEMOS file to use Select,Copy or Paste. '
ERM:='You Must create this file before you can use OO!;B;E;A;C;H'
CALL SCREEN.MSG(ERM)
END
FN.KEY.ACTIVE=0
RETURN
WINDOW.INPUT:
* Yes, we do windows
IF ECHO.FLAG THEN ECHO ON
WN.LINES=DCOUNT(WN.TEXT,@AM)
WN.MAX=''
WN.MAX<1>=LEN(WN.HDNG)
FOR WN.I=1 TO WN.LINES
WN.MAX<-1>=LEN(WN.TEXT<WN.I>)
NEXT I
WN.WIDTH=MAXIMUM(WN.MAX)+8
IF WN.WIDTH > LAST.COL THEN
ERM='Internal Window Width Specification Error for Window: ':WN.HDNG
ERM:=';B;H;E;A'
CALL SCREEN.MSG(ERM)
RETURN
END
IF WN.WIDTH<15 THEN WN.WIDTH=15
WN.WIDTH2=INT(WN.WIDTH/2+1)
WN.SPACE=INT(WN.WIDTH2-INT(LEN(WN.HDNG)/2))
WN.HEAD=STR(" ",80)
WN.HEAD[1,1]='|'
WN.HEAD[WN.SPACE,LEN(WN.HDNG)+6]=WN.HDNG:STR(" ",80)
WN.HEAD[WN.WIDTH,1]='|'
WN.HEAD=WN.HEAD[1,WN.WIDTH+5]
PRINT L(1):C(1):'*':STR('=',WN.WIDTH-2):'*'
PRINT L(2):C(1):WN.HEAD[1,WN.WIDTH]
PRINT L(3):C(1):'|':STR(" ",WN.WIDTH-2):'|'
FOR WN.I=1 TO WN.LINES+1
WN.LIN='| ':WN.I:' - ':WN.TEXT<WN.I>:STR(" ",80)
WN.LIN[WN.WIDTH,1]='|'
WN.LIN=WN.LIN[1,WN.WIDTH]
PRINT L(3+WN.I):C(1):WN.LIN
NEXT WN.I
PRINT L(3+WN.I):C(1):'|':STR(" ",WN.WIDTH-2):'|'
PRINT L(4+WN.I):C(1):'|':STR(" ",WN.WIDTH-2):'|'
PRINT L(5+WN.I):C(1):'|':STR(" ",WN.WIDTH-2):'|'
PRINT L(6+WN.I):C(1):'*':STR('=',WN.WIDTH-2):'*'
WN.INQ=WN.LINES+5
WN.LAST=WN.LINES+7
LOOP
PRINT L(WN.INQ):C(2):' Selection : ':;INPUT WN.RESP,1
IF WN.RESP>WN.LINES OR WN.RESP<1 OR NOT(NUM(WN.RESP)) THEN
IF WN.RESP='' THEN WN.RESP='RETURN'
ERM=WN.RESP:B4.T:' is an Invalid Response, Try Again':AFT.T:';B'
CALL SCREEN.MSG(ERM); PROMPT " "
END ELSE
EXIT
END
REPEAT
START=1+VAM
LSTART=1+HAM
WN.FINISH=START+WN.LAST
J=0
SCRN=""
FOR WN.I=START TO WN.FINISH
J+=1
OUTPUT=CHANGE(ZIG<WN.I>[LSTART,WN.WIDTH],ESCAPE,'[')
LENO=LEN(OUTPUT)
IF LENO<WN.WIDTH THEN OUTPUT=OUTPUT:B4.T:STR(" ",WN.WIDTH-LENO):AFT.T
PRINT L(J):C(1):OUTPUT
NEXT WN.I
PRINT L(LIN-VAM):C(COL-HAM):
IF ECHO.FLAG THEN ECHO OFF
RETURN
WINDOW.ENTRY:
* Yes, we do windows
IF ECHO.FLAG THEN ECHO ON
WN.LINES=DCOUNT(WN.TEXT,@AM)
WN.MAX=''
WN.MAX<1>=LEN(WN.HDNG)
FOR WN.I=1 TO WN.LINES
WN.MAX<-1>=LEN(WN.TEXT<WN.I>)
NEXT I
WN.WIDTH=MAXIMUM(WN.MAX)+8
IF WN.WIDTH > LAST.COL THEN
ERM='Internal Window Width Specification Error for Window: ':WN.HDNG
ERM:=';B;H;E;A'
CALL SCREEN.MSG(ERM)
RETURN
END
IF WN.WIDTH<15 THEN WN.WIDTH=15
WN.WIDTH2=INT(WN.WIDTH/2+1)
WN.SPACE=INT(WN.WIDTH2-INT(LEN(WN.HDNG)/2))
WN.HEAD=STR(" ",80)
WN.HEAD[1,1]='|'
WN.HEAD[WN.SPACE,LEN(WN.HDNG)+6]=WN.HDNG:STR(" ",80)
WN.HEAD[WN.WIDTH,1]='|'
WN.HEAD=WN.HEAD[1,WN.WIDTH+5]
PRINT L(1):C(1):'*':STR('=',WN.WIDTH-2):'*'
PRINT L(2):C(1):WN.HEAD[1,WN.WIDTH]
PRINT L(3):C(1):'|':STR(" ",WN.WIDTH-2):'|'
FOR WN.I=1 TO WN.LINES+1
WN.LIN='| ':WN.I:' - ':WN.TEXT<WN.I>:STR(" ",80)
WN.LIN[WN.WIDTH,1]='|'
WN.LIN=WN.LIN[1,WN.WIDTH]
PRINT L(3+WN.I):C(1):WN.LIN
NEXT WN.I
PRINT L(3+WN.I):C(1):'|':STR(" ",WN.WIDTH-2):'|'
PRINT L(4+WN.I):C(1):'|':STR(" ",WN.WIDTH-2):'|'
PRINT L(5+WN.I):C(1):'|':STR(" ",WN.WIDTH-2):'|'
PRINT L(6+WN.I):C(1):'*':STR('=',WN.WIDTH-2):'*'
WN.INQ=WN.LINES+5
WN.LAST=WN.LINES+7
LOOP
PRINT L(WN.INQ):C(2):' Selection : ':;INPUT WN.RESP
EXIT
* IF WN.RESP>WN.LINES OR WN.RESP<1 OR NOT(NUM(WN.RESP)) THEN
* IF WN.RESP='' THEN WN.RESP='RETURN'
* ERM=WN.RESP:B4.T:' is an Invalid Response, Try Again':AFT.T:';B'
* CALL SCREEN.MSG(ERM); PROMPT " "
* END ELSE
* EXIT
* END
REPEAT
START=1+VAM
LSTART=1+HAM
WN.FINISH=START+WN.LAST
J=0
SCRN=""
FOR WN.I=START TO WN.FINISH
J+=1
OUTPUT=CHANGE(ZIG<WN.I>[LSTART,WN.WIDTH],ESCAPE,'[')
LENO=LEN(OUTPUT)
IF LENO<WN.WIDTH THEN OUTPUT=OUTPUT:B4.T:STR(" ",WN.WIDTH-LENO):AFT.T
PRINT L(J):C(1):OUTPUT
NEXT WN.I
PRINT L(LIN-VAM):C(COL-HAM):
IF ECHO.FLAG THEN ECHO OFF
RETURN
9999* Abort Routine
CALL SCREEN.MSG('Call Allen, OO has blown;B;E;A;C;H')
END
-----Original Message-----
From: [email protected]
[mailto:[email protected]]on Behalf Of Womack, Adrian
Sent: Tuesday, November 10, 2009 6:03 PM
To: U2 Users List
Subject: Re: [U2] UniData Unibasic IN function
I have a routine that gets variable length keyboard input without using
any naps/sleeps etc - BUT we don't have any keyboard sequences that are
subsets of other sequences. eg. we don't use a single ESC character to
mean anything.
So I basically just keep getting characters whilst the sequence received
is a subset of a known sequence, then I return immediately when the
sequence is complete or no longer matches a known sequence.
Note: I make use of the Universe KEYIN() function.
-----Original Message-----
From: [email protected]
[mailto:[email protected]] On Behalf Of Hona, David
Sent: Wednesday, 11 November 2009 9:37 AM
To: 'U2 Users List'
Subject: Re: [U2] UniData Unibasic IN function
Bob,
This is kind of a FAQ and you'll find a few responses in the archives
for the U2 Users groups (via Google search) in Mail Archive and similar
archiving services...
Here's one response from Martin Phillips (UV specific, but I think you
get the idea) ... maybe an overkill for you?:
http://www.mail-archive.com/[email protected]/msg24904.html
You need to take care that you input routine 'naps' / sleeps for a few
milliseconds between or risk that it hogs the CPU (especially, if in use
by lots of users simulatenously).
Regards
David
-----Original Message-----
From: [email protected]
[mailto:[email protected]] On Behalf Of Bob Woodward
Sent: Wednesday, 11 November 2009 11:18 AM
To: U2 Users Mailing List
Subject: [U2] UniData Unibasic IN function
Hi Folks,
I have a need to capture control/function keys from the keyboard in a
basic program. The IN() function does exactly this but I'm having a bit
of trouble figuring out how to recognize the "end" of a multi-character
keystroke. The cursor keys and function keys all start with ESC
(Char-27) but have a variable number of characters afterwards. I'm
looking for a way to recognize the difference between pressing the F1
key verses typing type <ESC><O><P> keys. They both bring in data,
character by character, as CHAR(27), CHAR(79), then CHAR(80).
I've tried using the INPUT VAR UNFILTERED command but then it requires
an additional Enter key to release the data to the program. I can't set
a length because of the number of characters in the function keys, and
any kind of time limit is going to be too long to be bearable.
Oh, and I also need to be able to recognize the difference between the
escape key by itself verses the start of a function key.
The system is Unidata 6.1. Thanks in advance for any thoughts or
suggestions.
Bob Woodward
System Programmer/Analyst
K2 Sports
************** IMPORTANT MESSAGE *****************************
This e-mail message is intended only for the addressee(s) and contains
information which may be confidential.
If you are not the intended recipient please advise the sender by return
email, do not use or disclose the contents, and delete the message and
any attachments from your system. Unless specifically indicated, this
email does not constitute formal advice or commitment by the sender or
the Commonwealth Bank of Australia (ABN 48 123 123 124) or its
subsidiaries.
We can be contacted through our web site: commbank.com.au.
If you no longer wish to receive commercial electronic messages from us,
please reply to this e-mail by typing Unsubscribe in the subject line.
**************************************************************
_______________________________________________
U2-Users mailing list
[email protected]
http://listserver.u2ug.org/mailman/listinfo/u2-users
DISCLAIMER:
Disclaimer. This e-mail is private and confidential. If you are not the
intended recipient, please advise us by return e-mail immediately, and
delete the e-mail and any attachments without using or disclosing the
contents in any way. The views expressed in this e-mail are those of the
author, and do not represent those of this company unless this is clearly
indicated. You should scan this e-mail and any attachments for viruses. This
company accepts no liability for any direct or indirect damage or loss
resulting from the use of any attachments to this e-mail.
_______________________________________________
U2-Users mailing list
[email protected]
http://listserver.u2ug.org/mailman/listinfo/u2-users
_______________________________________________
U2-Users mailing list
[email protected]
http://listserver.u2ug.org/mailman/listinfo/u2-users