<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://pickwiki.org/index.php?action=history&amp;feed=atom&amp;title=TclStack</id>
	<title>TclStack - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://pickwiki.org/index.php?action=history&amp;feed=atom&amp;title=TclStack"/>
	<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=TclStack&amp;action=history"/>
	<updated>2026-04-28T22:10:44Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://pickwiki.org/index.php?title=TclStack&amp;diff=2643&amp;oldid=prev</id>
		<title>IanMcGowan: Updated with tab completion for commands, file names and dictionaries</title>
		<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=TclStack&amp;diff=2643&amp;oldid=prev"/>
		<updated>2019-09-13T22:54:12Z</updated>

		<summary type="html">&lt;p&gt;Updated with tab completion for commands, file names and dictionaries&lt;/p&gt;
&lt;a href=&quot;https://pickwiki.org/index.php?title=TclStack&amp;amp;diff=2643&amp;amp;oldid=2626&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>IanMcGowan</name></author>
	</entry>
	<entry>
		<id>https://pickwiki.org/index.php?title=TclStack&amp;diff=2626&amp;oldid=prev</id>
		<title>IanMcGowan: Add link to latest version on github</title>
		<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=TclStack&amp;diff=2626&amp;oldid=prev"/>
		<updated>2019-04-26T23:36:00Z</updated>

		<summary type="html">&lt;p&gt;Add link to latest version on github&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 23:36, 26 April 2019&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;Line 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[HomePage]] &amp;gt;&amp;gt; [[BasicSource]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[HomePage]] &amp;gt;&amp;gt; [[BasicSource]&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;] &amp;gt;&amp;gt; [https://github.com/ianmcgowan/SCI.BP/blob/master/STACK Github:&lt;/ins&gt;]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;This program is an attempt to make TCL a more productive place for programmers.  You can edit&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;This program is an attempt to make TCL a more productive place for programmers.  You can edit&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>IanMcGowan</name></author>
	</entry>
	<entry>
		<id>https://pickwiki.org/index.php?title=TclStack&amp;diff=2284&amp;oldid=prev</id>
		<title>Conversion script: link fix</title>
		<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=TclStack&amp;diff=2284&amp;oldid=prev"/>
		<updated>2015-02-26T23:48:56Z</updated>

		<summary type="html">&lt;p&gt;link fix&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[HomePage]] &amp;gt;&amp;gt; [[BasicSource]]&lt;br /&gt;
&lt;br /&gt;
This program is an attempt to make TCL a more productive place for programmers.  You can edit&lt;br /&gt;
the command stack using standard bash/emacs key-bindings.  There is also a stack of program&lt;br /&gt;
files being worked on and shortcuts for the common operations of editing, compiling, running&lt;br /&gt;
and interacting with version control.&lt;br /&gt;
&lt;br /&gt;
Planned new features include tab-completion on commands, file&lt;br /&gt;
and dictionary names (how to make it quick with thousands of entries is a problem).&lt;br /&gt;
&lt;br /&gt;
The help information gives a good overview of what is currently there (though aliases,&lt;br /&gt;
program token expansion and setting the prompt are extras not mentioned).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
            PRINT &amp;#039;Ctrl-A     Start of line     Ctrl-R      Toggle insert mode&amp;#039;&lt;br /&gt;
            PRINT &amp;#039;Ctrl-B     Back one char     Ctrl-W      Delete word&amp;#039;&lt;br /&gt;
            PRINT &amp;#039;Ctrl-D     Delete char       Ctrl-X      Forward word&amp;#039;&lt;br /&gt;
            PRINT &amp;#039;Ctrl-E     End of line       Ctrl-Z      Back word&amp;#039;&lt;br /&gt;
            PRINT &amp;#039;Ctrl-F     Forward char      &amp;#039;&lt;br /&gt;
            PRINT &amp;#039;Ctrl-G     Cancel line       &amp;#039;&lt;br /&gt;
            PRINT &amp;#039;Ctrl-I     Forward word      ~xxx        Search for xxx&amp;#039;&lt;br /&gt;
            PRINT &amp;#039;Ctrl-J     Delete to end     .Lm,n       List entry m thru n&amp;#039;&lt;br /&gt;
            PRINT &amp;#039;Ctrl-M     Accept line       .Rn         Restore entry n, edit&amp;#039;&lt;br /&gt;
            PRINT &amp;#039;Ctrl-N     Next line         .Dm,n       Delete entry m thru n&amp;#039;&lt;br /&gt;
            PRINT &amp;#039;Ctrl-P     Previous line     Q           Quit back to TCL&amp;#039;&lt;br /&gt;
            PRINT&lt;br /&gt;
            PRINT &amp;#039;/   List the program stack   //  List the stack with cvs status&amp;#039;&lt;br /&gt;
            PRINT &amp;#039;[[/Nx]] Add a New program,&amp;#039;&lt;br /&gt;
            PRINT &amp;#039;[[/Ex]] Edit the x`th program    [[/WW]] Edit the program list&amp;#039;&lt;br /&gt;
            PRINT &amp;#039;[[/Wx]] VI the x`th program      [[/S]]  Sort the program stack&amp;#039;&lt;br /&gt;
            PRINT &amp;#039;[[/Bx]] Compile the x`th program [[/BR]] Compile and run&amp;#039;&lt;br /&gt;
            PRINT &amp;#039;[[/CI]] Checkin a program to cvs [[/D]]  Show diff with cvs version&amp;#039;&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See also:&lt;br /&gt;
:[[GetLineStack]] - a subroutine to allow cursor editing in wy50, vt100&lt;br /&gt;
&lt;br /&gt;
CVS Integration &amp;quot;helpers&amp;quot;&lt;br /&gt;
:[[CvsCheckout]]&lt;br /&gt;
:[[CvsCheckin]]&lt;br /&gt;
:[[CvsLog]]&lt;br /&gt;
:[[CvsList]]&lt;br /&gt;
:[[CvsDiff]]&lt;br /&gt;
:[[CvsStatus]]&lt;br /&gt;
:[[CvsGetDir]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
***************************************************************************&lt;br /&gt;
* Program: STACK&lt;br /&gt;
* Author : Ian [[McGowan]]&lt;br /&gt;
* Date   : 06/13/89&lt;br /&gt;
* Edited : $Id: STACK,v 1.20 2005/02/10 17:36:54 dsiroot Exp $&lt;br /&gt;
* Comment: Stacks TCL commands&lt;br /&gt;
***************************************************************************&lt;br /&gt;
EQU NUL TO &amp;#039;&amp;#039;,SPC TO &amp;#039; &amp;#039;,TRUE TO 1, FALSE TO 0, BANG TO &amp;#039;~&amp;#039;, UNIX TO &amp;#039;!&amp;#039;&lt;br /&gt;
EQU BELL TO CHAR(7), OTHERWISE TO 1&lt;br /&gt;
EQU RET TO 13,ESC TO 27,UP.KEY TO 1,DOWN.KEY TO 2&lt;br /&gt;
EOL=@(-4);UP=@(-10)&lt;br /&gt;
PROMPT NUL&lt;br /&gt;
&lt;br /&gt;
LONG.LINE = 999&lt;br /&gt;
EXECUTING = FALSE;SL.ACTIVE = FALSE&lt;br /&gt;
SELECT.LIST = NUL;OLD.WORD = NUL&lt;br /&gt;
SELECT.STATEMENT=FALSE ; CAP.ACTIVE=FALSE&lt;br /&gt;
&lt;br /&gt;
PWD=GETENV(&amp;quot;PWD&amp;quot;)&lt;br /&gt;
I=LEN(PWD) ; ACC=NUL&lt;br /&gt;
FOR F=I TO 1 STEP -1&lt;br /&gt;
    IF PWD[F,1] = &amp;#039;/&amp;#039; THEN EXIT&lt;br /&gt;
    ACC=PWD[F,1]:ACC&lt;br /&gt;
NEXT F&lt;br /&gt;
&lt;br /&gt;
INITIALS=UPCASE(@LOGNAME)&lt;br /&gt;
EXEC.LINE=\!grep &amp;quot;^\:@LOGNAME:\:&amp;quot; /etc/passwd | awk -F: &amp;#039;{print $5}&amp;#039;\;&lt;br /&gt;
CAP.ACTIVE=TRUE&lt;br /&gt;
GOSUB EXEC.SUB&lt;br /&gt;
USERNAME=FIELD(EXEC.CAP&amp;lt;1&amp;gt;,&amp;quot;,&amp;quot;,1)&lt;br /&gt;
HOME.DIR=GETENV(&amp;quot;HOME&amp;quot;)&lt;br /&gt;
STACK.ITEM=&amp;#039;.STACK_&amp;#039;:INITIALS&lt;br /&gt;
ALIAS.ITEM=&amp;#039;.STACK.ALIAS_&amp;#039;:INITIALS&lt;br /&gt;
PROGRAM.ITEM=&amp;#039;.STACK.PROGRAM_&amp;#039;:INITIALS&lt;br /&gt;
SETTING.ITEM=&amp;#039;.STACK.SETTING_&amp;#039;:INITIALS&lt;br /&gt;
HOME.FILE=&amp;#039;HOME.&amp;#039;:UPCASE(INITIALS)&lt;br /&gt;
OPEN &amp;#039;VOC&amp;#039; TO VOC ELSE STOP 201,&amp;#039;VOC&amp;#039;&lt;br /&gt;
OPEN HOME.FILE TO HOME.F ELSE&lt;br /&gt;
    R=&amp;#039;DIR&amp;#039; ; R&amp;lt;2&amp;gt;=HOME.DIR ; R&amp;lt;3&amp;gt;=&amp;#039;[[D_VOC]]&amp;#039;&lt;br /&gt;
    WRITE R ON VOC, HOME.FILE&lt;br /&gt;
    OPEN HOME.FILE TO HOME.F ELSE STOP 201, HOME.FILE&lt;br /&gt;
END&lt;br /&gt;
OPEN &amp;#039;CTLGTB&amp;#039; TO CTLGTB ELSE STOP 201,&amp;#039;CTLGTB&amp;#039;&lt;br /&gt;
OPEN &amp;#039;CTLG&amp;#039;   TO CTLG   ELSE STOP 201,&amp;#039;CTLG&amp;#039;&lt;br /&gt;
OPEN &amp;#039;TRIN.GLOBAL.PARAMETER&amp;#039; TO TRIN.GLOBAL.PARAMETER ELSE STOP 201,&amp;#039;TRIN.GLOBAL.PARAMETER&amp;#039;&lt;br /&gt;
&lt;br /&gt;
SETTINGS      = &amp;#039;;&amp;#039;        ;* DEFAULT COMMAND SEPERATOR&lt;br /&gt;
SETTINGS&amp;lt;2&amp;gt;   = &amp;#039;.&amp;#039;        ;* DEFAULT STACK CHAR&lt;br /&gt;
SETTINGS&amp;lt;3&amp;gt;   = &amp;#039;/&amp;#039;        ;* DEFAULT PROG CHAR&lt;br /&gt;
SETTINGS&amp;lt;4&amp;gt;   = 9999       ;* DEFAULT MAX # LINES IN STACK&lt;br /&gt;
SETTINGS&amp;lt;5&amp;gt;   = &amp;#039;SCRED&amp;#039;    ;* DEFAULT SCREEN EDITOR&lt;br /&gt;
SETTINGS&amp;lt;6&amp;gt;   = &amp;#039;AE&amp;#039;       ;* DEFAULT LINE EDITOR&lt;br /&gt;
SETTINGS&amp;lt;7&amp;gt;   =&amp;#039;* Edited :&amp;#039;;* DEFAULT HEADER STRING&lt;br /&gt;
SETTINGS&amp;lt;8&amp;gt;   = TRUE       ;* DEFAULT USE GET.LINE SUBR&lt;br /&gt;
SETTINGS&amp;lt;9&amp;gt;   = &amp;#039;BP.DEV&amp;#039;   ;* DEFAULT WORK FILE&lt;br /&gt;
SETTINGS&amp;lt;10&amp;gt;  = TRUE       ;* DEFAULT = CONVERT TO UCASE&lt;br /&gt;
SETTINGS&amp;lt;11&amp;gt;  = &amp;quot;&amp;quot;         ;* DEFAULT STARTUP COMMAND&lt;br /&gt;
SETTINGS&amp;lt;12&amp;gt;  = &amp;quot;#R#A&amp;gt;&amp;quot;    ;* DEFAULT PROMPT&lt;br /&gt;
SETTINGS&amp;lt;13&amp;gt;  = -2         ;* DEFAULT X DISPLACEMENT FOR PROMPT&lt;br /&gt;
SETTINGS&amp;lt;14&amp;gt;  = &amp;quot;bash&amp;quot;     ;* DEFAULT SHELL FOR UNIX COMMANDS&lt;br /&gt;
&lt;br /&gt;
READ R FROM HOME.F, SETTING.ITEM ELSE R=NUL&lt;br /&gt;
I=DCOUNT(SETTINGS,@AM)&lt;br /&gt;
FOR F=1 TO I&lt;br /&gt;
    IF R&amp;lt;F&amp;gt; # NUL THEN SETTINGS&amp;lt;F&amp;gt; = R&amp;lt;F&amp;gt;&lt;br /&gt;
NEXT F&lt;br /&gt;
COMMAND.SEPERATOR = SETTINGS&amp;lt;1&amp;gt;&lt;br /&gt;
STACK.CHAR   = SETTINGS&amp;lt;2&amp;gt;&lt;br /&gt;
PROG.CHAR    = SETTINGS&amp;lt;3&amp;gt;&lt;br /&gt;
MAX.STACK    = SETTINGS&amp;lt;4&amp;gt;&lt;br /&gt;
WP.VERB      = SETTINGS&amp;lt;5&amp;gt;&lt;br /&gt;
ED.VERB      = SETTINGS&amp;lt;6&amp;gt;&lt;br /&gt;
STAMP.STRING = SETTINGS&amp;lt;7&amp;gt;&lt;br /&gt;
GET.LINE.FLAG= SETTINGS&amp;lt;8&amp;gt;&lt;br /&gt;
WORK.FILE    = SETTINGS&amp;lt;9&amp;gt;&lt;br /&gt;
MCU.ON       = SETTINGS&amp;lt;10&amp;gt;&lt;br /&gt;
STARTUP      = SETTINGS&amp;lt;11&amp;gt;&lt;br /&gt;
PROMT        = SETTINGS&amp;lt;12&amp;gt;&lt;br /&gt;
X.DISP       = SETTINGS&amp;lt;13&amp;gt;&lt;br /&gt;
WRITE SETTINGS ON HOME.F, SETTING.ITEM&lt;br /&gt;
&lt;br /&gt;
EXEC.LINE=&amp;quot;!hostname&amp;quot; ; CAP.ACTIVE=TRUE ; GOSUB EXEC.SUB&lt;br /&gt;
HOST.NAME=EXEC.CAP&amp;lt;1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
READ STACK FROM HOME.F, STACK.ITEM ELSE STACK = NUL&lt;br /&gt;
READ PROGRAMS FROM HOME.F, PROGRAM.ITEM ELSE PROGRAMS = NUL&lt;br /&gt;
READ ALIASES FROM HOME.F, ALIAS.ITEM ELSE ALIASES = NUL&lt;br /&gt;
OLD.X.DISP=X.DISP&lt;br /&gt;
RTN=NUL&lt;br /&gt;
IF STARTUP # NUL THEN ANS=STARTUP ; GOSUB COMMAND ; STARTUP=NUL&lt;br /&gt;
ANS=NUL&lt;br /&gt;
&lt;br /&gt;
LOOP&lt;br /&gt;
    GOSUB EXPAND.PROMPT&lt;br /&gt;
    PRINT PROMPT.DISP:&lt;br /&gt;
    X = LEN(PROMPT.DISP) + X.DISP&lt;br /&gt;
    ENTRY = NUL;LEN = LONG.LINE;DISP.LEN=79-X&lt;br /&gt;
    GOSUB GET.INPUT&lt;br /&gt;
    ANS=ENTRY&lt;br /&gt;
    * Reread the program and command stack, since they maybe modified&lt;br /&gt;
    * in another session&lt;br /&gt;
    READ PROGRAMS FROM HOME.F, PROGRAM.ITEM ELSE PROGRAMS = NUL&lt;br /&gt;
    READ STACK FROM HOME.F, STACK.ITEM ELSE STACK = NUL&lt;br /&gt;
    READ ALIASES FROM HOME.F, ALIAS.ITEM ELSE ALIASES = NUL&lt;br /&gt;
    IF RTN # ESC THEN GOSUB COMMAND&lt;br /&gt;
REPEAT&lt;br /&gt;
&lt;br /&gt;
GET.INPUT:&lt;br /&gt;
    IF GET.LINE.FLAG THEN&lt;br /&gt;
        CALL GET.LINE.STACK(X,LEN,DISP.LEN,ENTRY,RTN)&lt;br /&gt;
    END ELSE&lt;br /&gt;
        PRINT @(X):;INPUT ENTRY&lt;br /&gt;
        RTN = RET&lt;br /&gt;
    END&lt;br /&gt;
RETURN&lt;br /&gt;
&lt;br /&gt;
COMMAND:&lt;br /&gt;
    BEGIN CASE&lt;br /&gt;
            * Map up and down arrows to .R1 and .Rn&lt;br /&gt;
        CASE RTN = UP.KEY&lt;br /&gt;
            ANS = &amp;#039;.R1&amp;#039;&lt;br /&gt;
        CASE ANS=&amp;#039;?&amp;#039;&lt;br /&gt;
            ANS=&amp;#039;.H&amp;#039;&lt;br /&gt;
    END CASE&lt;br /&gt;
    IF ANS = NUL THEN RETURN&lt;br /&gt;
    UNIX.COMMAND=FALSE&lt;br /&gt;
    IF ANS[1,1] = UNIX THEN UNIX.COMMAND=TRUE&lt;br /&gt;
    OLD.STACK = STACK&lt;br /&gt;
    START.WORD.SEARCH = 1&lt;br /&gt;
    COMMAND.LIST = ANS&lt;br /&gt;
    COMMAND.COUNT = 1&lt;br /&gt;
    IF STARTUP#NUL THEN EXECUTING=TRUE ELSE EXECUTING=FALSE&lt;br /&gt;
    IF UNIX.COMMAND THEN&lt;br /&gt;
        * Don&amp;#039;t look for ; for unix commands&lt;br /&gt;
        GOSUB DO.COMMAND&lt;br /&gt;
    END ELSE&lt;br /&gt;
        LOOP&lt;br /&gt;
            ANS = FIELD(COMMAND.LIST,COMMAND.SEPERATOR,COMMAND.COUNT)&lt;br /&gt;
        UNTIL ANS = NUL DO&lt;br /&gt;
            GOSUB DO.COMMAND&lt;br /&gt;
            COMMAND.COUNT = COMMAND.COUNT + 1&lt;br /&gt;
        REPEAT&lt;br /&gt;
    END&lt;br /&gt;
    WRITE ALIASES ON HOME.F, ALIAS.ITEM&lt;br /&gt;
RETURN&lt;br /&gt;
&lt;br /&gt;
DO.COMMAND:&lt;br /&gt;
    IF MCU.ON AND NOT(UNIX.COMMAND) THEN&lt;br /&gt;
        ANS = TRIM(UPCASE(ANS))&lt;br /&gt;
        IF ANS[1,5] # &amp;#039;ALIAS&amp;#039; THEN GOSUB EXPAND.ALIASES&lt;br /&gt;
        GOSUB EXPAND.PROG.CHARS&lt;br /&gt;
    END&lt;br /&gt;
    IF ANS=&amp;#039;!&amp;#039; THEN ANS=&amp;#039;!&amp;#039;:SETTINGS&amp;lt;14&amp;gt;&lt;br /&gt;
    LEN.ANS = LEN(ANS)&lt;br /&gt;
    SEARCH.FOR=NUL&lt;br /&gt;
    SELECT.STATEMENT=FALSE&lt;br /&gt;
    CAP.ACTIVE=FALSE&lt;br /&gt;
    BEGIN CASE&lt;br /&gt;
        CASE ANS[1,1] = STACK.CHAR&lt;br /&gt;
            GOSUB STACK.COMMAND&lt;br /&gt;
        CASE ANS[1,1] = PROG.CHAR&lt;br /&gt;
            GOSUB PROG.COMMAND&lt;br /&gt;
        CASE ANS[1,1] = BANG&lt;br /&gt;
            GOSUB BANG.COMMAND&lt;br /&gt;
        CASE ANS = &amp;#039;QUIT&amp;#039; OR ANS = &amp;#039;OFF&amp;#039; OR ANS = &amp;#039;EXIT&amp;#039;&lt;br /&gt;
            GOSUB WRITE.INFO&lt;br /&gt;
            CHAIN &amp;#039;OFF&amp;#039;&lt;br /&gt;
        CASE ANS = &amp;#039;Q&amp;#039;&lt;br /&gt;
            GOSUB WRITE.INFO&lt;br /&gt;
            STOP&lt;br /&gt;
        CASE ANS[1,5] = &amp;#039;ALIAS&amp;#039;&lt;br /&gt;
            GOSUB DO.ALIAS&lt;br /&gt;
        CASE OTHERWISE&lt;br /&gt;
            IF NOT(EXECUTING) THEN&lt;br /&gt;
                INS ANS BEFORE STACK&amp;lt;1&amp;gt;&lt;br /&gt;
                WRITE STACK ON HOME.F, STACK.ITEM&lt;br /&gt;
            END&lt;br /&gt;
            IF ANS[1,6] = &amp;#039;SELECT&amp;#039; OR ANS[2,6]= &amp;#039;SELECT&amp;#039; OR ANS[1,8]= &amp;#039;GET.LIST&amp;#039; OR ANS[1,6] = &amp;#039;SEARCH&amp;#039; THEN SELECT.STATEMENT=TRUE&lt;br /&gt;
            EXEC.LINE = ANS&lt;br /&gt;
            GOSUB EXEC.SUB&lt;br /&gt;
            IF SELECT.STATEMENT THEN SL.ACTIVE=TRUE ELSE SL.ACTIVE=FALSE&lt;br /&gt;
    END CASE&lt;br /&gt;
RETURN&lt;br /&gt;
&lt;br /&gt;
DO.ALIAS:&lt;br /&gt;
    AL = FIELD(ANS,SPC,2)&lt;br /&gt;
    STRING = NUL;I = 3&lt;br /&gt;
    LOOP&lt;br /&gt;
        F = FIELD(ANS,SPC,I)&lt;br /&gt;
    UNTIL F = NUL DO&lt;br /&gt;
        STRING = STRING:SPC:F&lt;br /&gt;
        I = I + 1&lt;br /&gt;
    REPEAT&lt;br /&gt;
    BEGIN CASE&lt;br /&gt;
        CASE AL = NUL AND STRING = NUL&lt;br /&gt;
            GOSUB LIST.ALIAS&lt;br /&gt;
        CASE STRING = NUL&lt;br /&gt;
            GOSUB LIST.ONE.ALIAS&lt;br /&gt;
        CASE 1&lt;br /&gt;
            GOSUB SET.ALIAS&lt;br /&gt;
    END CASE&lt;br /&gt;
RETURN&lt;br /&gt;
&lt;br /&gt;
SET.ALIAS:&lt;br /&gt;
    STRING=STRING[2,LONG.LINE]&lt;br /&gt;
    PRINT AL:&amp;#039;=&amp;#039;:STRING&lt;br /&gt;
    LOCATE AL IN ALIASES&amp;lt;1&amp;gt; BY &amp;#039;AL&amp;#039; SETTING P THEN&lt;br /&gt;
        ALIASES&amp;lt;2,P&amp;gt; = STRING&lt;br /&gt;
    END ELSE&lt;br /&gt;
        INS AL BEFORE ALIASES&amp;lt;1,P&amp;gt;;INS STRING BEFORE ALIASES&amp;lt;2,P&amp;gt;&lt;br /&gt;
    END&lt;br /&gt;
RETURN&lt;br /&gt;
&lt;br /&gt;
LIST.ALIAS:&lt;br /&gt;
    I = DCOUNT(ALIASES&amp;lt;1&amp;gt;,@VM)&lt;br /&gt;
    FOR F = 1 TO I&lt;br /&gt;
        PRINT ALIASES&amp;lt;1,F&amp;gt;,ALIASES&amp;lt;2,F&amp;gt;&lt;br /&gt;
    NEXT F&lt;br /&gt;
RETURN&lt;br /&gt;
&lt;br /&gt;
LIST.ONE.ALIAS:&lt;br /&gt;
    LOCATE AL IN ALIASES&amp;lt;1&amp;gt; BY &amp;#039;AL&amp;#039; SETTING P ELSE PRINT AL:&amp;#039; not found&amp;#039;;RETURN&lt;br /&gt;
    X=0;LEN=99;DISP.LEN=30;ENTRY=ALIASES&amp;lt;2,P&amp;gt;&lt;br /&gt;
    GOSUB GET.INPUT&lt;br /&gt;
    IF RTN = 27 THEN RETURN&lt;br /&gt;
    ALIASES&amp;lt;2,P&amp;gt; = ENTRY&lt;br /&gt;
    IF ENTRY = NUL THEN DEL ALIASES&amp;lt;1,P&amp;gt;;DEL ALIASES&amp;lt;2,P&amp;gt;&lt;br /&gt;
RETURN&lt;br /&gt;
&lt;br /&gt;
EXEC.SUB:&lt;br /&gt;
    IF EXEC.LINE = NUL THEN RETURN&lt;br /&gt;
    BEGIN CASE&lt;br /&gt;
        CASE SL.ACTIVE AND SELECT.STATEMENT&lt;br /&gt;
            EXECUTE EXEC.LINE PASSLIST SEL.LIST.IN RTNLIST SEL.LIST.OUT&lt;br /&gt;
            SEL.LIST.IN=SEL.LIST.OUT&lt;br /&gt;
        CASE SL.ACTIVE&lt;br /&gt;
            EXECUTE EXEC.LINE PASSLIST SEL.LIST.IN&lt;br /&gt;
        CASE SELECT.STATEMENT&lt;br /&gt;
            EXECUTE EXEC.LINE RTNLIST SEL.LIST.OUT&lt;br /&gt;
            SEL.LIST.IN=SEL.LIST.OUT&lt;br /&gt;
        CASE CAP.ACTIVE&lt;br /&gt;
            EXECUTE EXEC.LINE CAPTURING EXEC.CAP&lt;br /&gt;
        CASE 1&lt;br /&gt;
            EXECUTE EXEC.LINE&lt;br /&gt;
    END CASE&lt;br /&gt;
RETURN&lt;br /&gt;
&lt;br /&gt;
EXPAND.PROG.CHARS:&lt;br /&gt;
    * expand //10 to be IV.BP IV.EQP.MNT for example&lt;br /&gt;
    POS = 1&lt;br /&gt;
    LOOP&lt;br /&gt;
        I = INDEX(ANS,PROG.CHAR:PROG.CHAR,POS)&lt;br /&gt;
    UNTIL I = 0 DO&lt;br /&gt;
        VAR = NUL;IDX = I+2&lt;br /&gt;
        LOOP&lt;br /&gt;
            C = ANS[IDX,1]&lt;br /&gt;
        UNTIL NOT(NUM(C)) OR C = NUL DO&lt;br /&gt;
            VAR = VAR:C&lt;br /&gt;
            IDX = IDX+1&lt;br /&gt;
        REPEAT&lt;br /&gt;
        IF NUM(VAR) AND VAR &amp;gt; 0 THEN&lt;br /&gt;
            ANS = ANS[1,I-1]:PROGRAMS&amp;lt;VAR&amp;gt;:ANS[IDX,LONG.LINE]&lt;br /&gt;
        END ELSE&lt;br /&gt;
            POS = POS + 1&lt;br /&gt;
        END&lt;br /&gt;
    REPEAT&lt;br /&gt;
RETURN&lt;br /&gt;
&lt;br /&gt;
EXPAND.ALIASES:&lt;br /&gt;
    SWAP SPC WITH @VM IN ANS ; POS = 1&lt;br /&gt;
    LOOP&lt;br /&gt;
        R = ANS&amp;lt;1,POS&amp;gt;&lt;br /&gt;
    UNTIL R = NUL DO&lt;br /&gt;
        LOCATE R IN ALIASES&amp;lt;1&amp;gt; BY &amp;#039;AL&amp;#039; SETTING P THEN ANS&amp;lt;1,POS&amp;gt; = ALIASES&amp;lt;2,P&amp;gt;&lt;br /&gt;
        POS = POS + 1&lt;br /&gt;
    REPEAT&lt;br /&gt;
    SWAP @VM WITH SPC IN ANS&lt;br /&gt;
RETURN&lt;br /&gt;
&lt;br /&gt;
EXPAND.PROMPT:&lt;br /&gt;
    IF SL.ACTIVE THEN&lt;br /&gt;
        PROMPT.DISP=&amp;#039;#RSEL&amp;gt;&amp;#039;&lt;br /&gt;
        OLD.X.DISP=X.DISP&lt;br /&gt;
        X.DISP=-2&lt;br /&gt;
    END ELSE&lt;br /&gt;
        PROMPT.DISP = PROMT&lt;br /&gt;
        X.DISP=OLD.X.DISP&lt;br /&gt;
    END&lt;br /&gt;
    CTR = 1&lt;br /&gt;
    LOOP&lt;br /&gt;
        I = INDEX(PROMPT.DISP,&amp;#039;#&amp;#039;,CTR)&lt;br /&gt;
    UNTIL I = 0 DO&lt;br /&gt;
        F = PROMPT.DISP[I+1,1]&lt;br /&gt;
        L = PROMPT.DISP[1,I-1];R = TRIM(PROMPT.DISP[I+2,LONG.LINE])&lt;br /&gt;
        BEGIN CASE&lt;br /&gt;
            CASE F = &amp;#039;B&amp;#039;&lt;br /&gt;
                PROMPT.DISP = L:CHAR(7):R&lt;br /&gt;
            CASE F = &amp;#039;A&amp;#039;&lt;br /&gt;
                PROMPT.DISP = L:ACC:R&lt;br /&gt;
            CASE F = &amp;#039;T&amp;#039;&lt;br /&gt;
                PROMPT.DISP = L:OCONV(TIME(),&amp;#039;MTS&amp;#039;):R&lt;br /&gt;
            CASE F = &amp;#039;D&amp;#039;&lt;br /&gt;
                PROMPT.DISP = L:OCONV(DATE(),&amp;#039;D&amp;#039;):R&lt;br /&gt;
            CASE F = &amp;#039;E&amp;#039;&lt;br /&gt;
                PROMPT.DISP = L:CHAR(ESC):R&lt;br /&gt;
            CASE F = &amp;#039;R&amp;#039;&lt;br /&gt;
                PROMPT.DISP = L:CHAR(13):CHAR(10):R&lt;br /&gt;
            CASE F = &amp;#039;#&amp;#039;&lt;br /&gt;
                PROMPT.DISP = L:&amp;#039;#&amp;#039;:R&lt;br /&gt;
                CTR = CTR + 1&lt;br /&gt;
            CASE F = &amp;#039;U&amp;#039;&lt;br /&gt;
                PROMPT.DISP = L:INITIALS:R&lt;br /&gt;
            CASE F = &amp;#039;H&amp;#039;&lt;br /&gt;
                PROMPT.DISP=L:FIELD(HOST.NAME,&amp;quot;.&amp;quot;,1):R&lt;br /&gt;
            CASE OTHERWISE&lt;br /&gt;
                CTR = CTR + 1&lt;br /&gt;
        END CASE&lt;br /&gt;
    REPEAT&lt;br /&gt;
RETURN&lt;br /&gt;
&lt;br /&gt;
STACK.COMMAND:&lt;br /&gt;
    BEGIN CASE&lt;br /&gt;
        CASE ANS[1,2] = &amp;#039;.L&amp;#039;&lt;br /&gt;
            IF ANS = &amp;#039;.L&amp;#039; THEN ANS = &amp;#039;.L,20&amp;#039;&lt;br /&gt;
            GOSUB GET.PARAMS&lt;br /&gt;
            IF RANGE.ERROR THEN RETURN&lt;br /&gt;
            I = DCOUNT(STACK,@AM)&lt;br /&gt;
            IF I = 0 THEN PRINT &amp;#039;No items present&amp;#039;;RETURN&lt;br /&gt;
            IF P2 &amp;gt; I THEN P2 = I&lt;br /&gt;
            PRINT&lt;br /&gt;
            FOR F = P2 TO P1 STEP -1;PRINT SPC:F&amp;#039;R#3&amp;#039;:SPC:STACK&amp;lt;F&amp;gt; ; NEXT F&lt;br /&gt;
        CASE ANS[1,2] = &amp;#039;.R&amp;#039; OR ANS[1,2] = &amp;#039;.X&amp;#039;&lt;br /&gt;
            IF STACK = NUL THEN PRINT BELL ELSE GO EDIT&lt;br /&gt;
        CASE ANS[1,2] = &amp;#039;.D&amp;#039;&lt;br /&gt;
            GOSUB GET.PARAMS&lt;br /&gt;
            IF RANGE.ERROR THEN RETURN&lt;br /&gt;
            FOR I = P1 TO P2&lt;br /&gt;
                DEL STACK&amp;lt;P1&amp;gt;&lt;br /&gt;
            NEXT I&lt;br /&gt;
            WRITE STACK ON HOME.F, STACK.ITEM&lt;br /&gt;
        CASE ANS = &amp;#039;.E&amp;#039;&lt;br /&gt;
            WRITE STACK ON HOME.F, STACK.ITEM&lt;br /&gt;
            EXEC.LINE = ED.VERB:SPC:HOME.FILE:SPC:STACK.ITEM&lt;br /&gt;
            GOSUB EXEC.SUB&lt;br /&gt;
            READ STACK FROM HOME.F, STACK.ITEM ELSE STACK = NUL&lt;br /&gt;
        CASE ANS = &amp;#039;.W&amp;#039;&lt;br /&gt;
            WRITE STACK ON HOME.F, STACK.ITEM&lt;br /&gt;
            EXEC.LINE = WP.VERB:SPC:HOME.FILE:SPC:STACK.ITEM&lt;br /&gt;
            GOSUB EXEC.SUB&lt;br /&gt;
            READ STACK FROM HOME.F, STACK.ITEM ELSE STACK = NUL&lt;br /&gt;
        CASE ANS = &amp;#039;.CL&amp;#039;&lt;br /&gt;
            STACK = NUL&lt;br /&gt;
            WRITE STACK ON HOME.F, STACK.ITEM&lt;br /&gt;
            PRINT &amp;#039;Stack cleared&amp;#039;&lt;br /&gt;
        CASE ANS = &amp;#039;.P&amp;#039;&lt;br /&gt;
            PRINT &amp;#039;#R - Return  #A - Account  #D - Date  #T - Time #P - Port&amp;#039;&lt;br /&gt;
            PRINT &amp;#039;#E - Escape  #L - Level    #U - User  #H - Host&amp;#039;&lt;br /&gt;
            PRINT &amp;#039;Prompt&amp;#039;:&lt;br /&gt;
            X = 7;DISP.LEN = 60;ENTRY = PROMT;LEN = 99;GOSUB GET.INPUT&lt;br /&gt;
            PROMT = ENTRY&lt;br /&gt;
            PRINT &amp;#039;Enter the X displacement for input :&amp;#039;:&lt;br /&gt;
            ENTRY = NUL;LEN = 5;DISP.LEN = 5;X = 37;GOSUB GET.INPUT&lt;br /&gt;
            X.DISP = ENTRY&lt;br /&gt;
            IF NOT(NUM(X.DISP)) THEN X.DISP = 0&lt;br /&gt;
            SETTINGS&amp;lt;12&amp;gt; = PROMT&lt;br /&gt;
            SETTINGS&amp;lt;13&amp;gt; = X.DISP&lt;br /&gt;
            OLD.X.DISP=X.DISP&lt;br /&gt;
        CASE ANS = &amp;#039;.H&amp;#039;&lt;br /&gt;
            PRINT &amp;#039;Ctrl-A     Start of line     Ctrl-R      Toggle insert mode&amp;#039;&lt;br /&gt;
            PRINT &amp;#039;Ctrl-B     Back one char     Ctrl-W      Delete word&amp;#039;&lt;br /&gt;
            PRINT &amp;#039;Ctrl-D     Delete char       Ctrl-X      Forward word&amp;#039;&lt;br /&gt;
            PRINT &amp;#039;Ctrl-E     End of line       Ctrl-Z      Back word&amp;#039;&lt;br /&gt;
            PRINT &amp;#039;Ctrl-F     Forward char      &amp;#039;&lt;br /&gt;
            PRINT &amp;#039;Ctrl-G     Cancel line       &amp;#039;&lt;br /&gt;
            PRINT &amp;#039;Ctrl-I     Forward word      ~xxx        Search for xxx&amp;#039;&lt;br /&gt;
            PRINT &amp;#039;Ctrl-J     Delete to end     .Lm,n       List entry m thru n&amp;#039;&lt;br /&gt;
            PRINT &amp;#039;Ctrl-M     Accept line       .Rn         Restore entry n, edit&amp;#039;&lt;br /&gt;
            PRINT &amp;#039;Ctrl-N     Next line         .Dm,n       Delete entry m thru n&amp;#039;&lt;br /&gt;
            PRINT &amp;#039;Ctrl-P     Previous line     Q           Quit back to TCL&amp;#039;&lt;br /&gt;
            PRINT&lt;br /&gt;
            PRINT &amp;#039;/   List the program stack   //  List the stack with cvs status&amp;#039;&lt;br /&gt;
            PRINT &amp;#039;[[/Nx]] Add a New program,&amp;#039;&lt;br /&gt;
            PRINT &amp;#039;[[/Ex]] Edit the x`th program    [[/WW]] Edit the program list&amp;#039;&lt;br /&gt;
            PRINT &amp;#039;[[/Wx]] VI the x`th program      [[/S]]  Sort the program stack&amp;#039;&lt;br /&gt;
            PRINT &amp;#039;[[/Bx]] Compile the x`th program [[/BR]] Compile and run&amp;#039;&lt;br /&gt;
            PRINT &amp;#039;[[/CI]] Checkin a program to cvs [[/D]]  Show diff with cvs version&amp;#039;&lt;br /&gt;
        CASE ANS = &amp;#039;.U&amp;#039;&lt;br /&gt;
            IF MCU.ON THEN MCU.ON = FALSE;PRINT &amp;#039;upper case off&amp;#039; ELSE MCU.ON = TRUE;PRINT &amp;#039;UPPER CASE ON&amp;#039;&lt;br /&gt;
        CASE OTHERWISE&lt;br /&gt;
            PRINT &amp;#039;There is no such STACK command&amp;#039;:BELL&lt;br /&gt;
            PRINT &amp;#039;? for help&amp;#039;&lt;br /&gt;
    END CASE&lt;br /&gt;
RETURN&lt;br /&gt;
&lt;br /&gt;
GET.PARAMS:&lt;br /&gt;
    I = INDEX(ANS,&amp;#039;,&amp;#039;,1)&lt;br /&gt;
    IF I # 0 THEN&lt;br /&gt;
        L = I-1;P1 = NUL&lt;br /&gt;
        LOOP&lt;br /&gt;
            IF NUM(ANS[L,1]) THEN P1 = ANS[L,1]:P1;L=L-1 ELSE EXIT&lt;br /&gt;
        REPEAT&lt;br /&gt;
        P2 = ANS[I + 1, LEN.ANS]&lt;br /&gt;
    END ELSE&lt;br /&gt;
        P1 = NUL&lt;br /&gt;
        LOOP&lt;br /&gt;
            IF NUM(ANS[LEN.ANS,1]) THEN P1 = ANS[LEN.ANS,1]:P1;LEN.ANS=LEN.ANS-1 ELSE EXIT&lt;br /&gt;
        REPEAT&lt;br /&gt;
        IF P1 = NUL THEN P1 = 1&lt;br /&gt;
        P2 = P1&lt;br /&gt;
    END&lt;br /&gt;
    IF P1 = NUL THEN P1 = 1&lt;br /&gt;
    IF P2 = NUL THEN P2 = MAX.STACK&lt;br /&gt;
    IF NUM(P1) &amp;amp; NUM(P2) &amp;amp; P1 &amp;gt; 0 &amp;amp; P2 &amp;lt;= MAX.STACK THEN&lt;br /&gt;
        RANGE.ERROR = FALSE&lt;br /&gt;
    END ELSE&lt;br /&gt;
        RANGE.ERROR = TRUE&lt;br /&gt;
        PRINT &amp;#039;Range Error&amp;#039;:BELL&lt;br /&gt;
    END&lt;br /&gt;
RETURN&lt;br /&gt;
&lt;br /&gt;
EDIT:&lt;br /&gt;
    * Some of the stuff in here is redundant, repeating COMMAND&lt;br /&gt;
    * but to gosub command introduces re-entrancy problems&lt;br /&gt;
    * That&amp;#039;s why we use the dreaded GOTO command&lt;br /&gt;
    N = ANS[3,LEN.ANS]&lt;br /&gt;
    IF NOT(NUM(N)) THEN PRINT &amp;#039;No such line number - &amp;#039;:N:BELL;RETURN&lt;br /&gt;
    IF N = NUL THEN N = 1&lt;br /&gt;
    LOOP WHILE N # NUL AND STACK&amp;lt;N&amp;gt; # NUL DO&lt;br /&gt;
        PRINT UP:N &amp;#039;R%3&amp;#039;:&amp;#039;:&amp;#039;:EOL:&lt;br /&gt;
        ENTRY = STACK&amp;lt;N&amp;gt;;X = 5;DISP.LEN = 74;LEN = LONG.LINE&lt;br /&gt;
        IF ENTRY # NUL THEN&lt;br /&gt;
            OLD.ENTRY = ENTRY&lt;br /&gt;
            GOSUB GET.INPUT&lt;br /&gt;
            ANS = ENTRY&lt;br /&gt;
        END&lt;br /&gt;
        BEGIN CASE&lt;br /&gt;
            CASE RTN = UP.KEY&lt;br /&gt;
                IF SEARCH.FOR # NUL THEN&lt;br /&gt;
                    GO BANG.COMMAND&lt;br /&gt;
                END ELSE&lt;br /&gt;
                    N = N + 1&lt;br /&gt;
                    IF STACK&amp;lt;N&amp;gt; = NUL THEN N = 1&lt;br /&gt;
                END&lt;br /&gt;
            CASE RTN = DOWN.KEY&lt;br /&gt;
                N = N - 1&lt;br /&gt;
                IF N = 0 THEN&lt;br /&gt;
                    *FOR F = 1 TO MAX.STACK&lt;br /&gt;
                    *   IF STACK&amp;lt;F&amp;gt; = NUL THEN N = F-1;F = MAX.STACK&lt;br /&gt;
                    *NEXT F&lt;br /&gt;
                    N=1; PRINT BELL:&lt;br /&gt;
                END&lt;br /&gt;
            CASE RTN = RET&lt;br /&gt;
                UNIX.COMMAND=FALSE&lt;br /&gt;
                IF ANS[1,1] = UNIX THEN UNIX.COMMAND=TRUE&lt;br /&gt;
                IF UNIX.COMMAND THEN&lt;br /&gt;
                    EXECUTING = FALSE&lt;br /&gt;
                    IF N = 1 AND ENTRY = OLD.ENTRY THEN EXECUTING = TRUE&lt;br /&gt;
                    GOSUB DO.COMMAND&lt;br /&gt;
                    N=NUL&lt;br /&gt;
                END ELSE&lt;br /&gt;
                    C.LIST = ANS&lt;br /&gt;
                    C.COUNT = 1&lt;br /&gt;
                    LOOP&lt;br /&gt;
                        ANS = FIELD(C.LIST,COMMAND.SEPERATOR,C.COUNT)&lt;br /&gt;
                    UNTIL ANS = NUL DO&lt;br /&gt;
                        EXECUTING = FALSE&lt;br /&gt;
                        IF N = 1 AND ENTRY = OLD.ENTRY THEN EXECUTING = TRUE&lt;br /&gt;
                        GOSUB DO.COMMAND&lt;br /&gt;
                        C.COUNT = C.COUNT + 1&lt;br /&gt;
                    REPEAT&lt;br /&gt;
                    N = NUL&lt;br /&gt;
                END&lt;br /&gt;
            CASE RTN = ESC&lt;br /&gt;
                N = NUL&lt;br /&gt;
        END CASE&lt;br /&gt;
    REPEAT&lt;br /&gt;
RETURN&lt;br /&gt;
&lt;br /&gt;
BANG.COMMAND:&lt;br /&gt;
    * Search the stack for a string&lt;br /&gt;
    IF SEARCH.FOR = NUL THEN SEARCH.FOR = ANS[2,LONG.LINE]&lt;br /&gt;
    FOUND = FALSE&lt;br /&gt;
    FOR F = START.WORD.SEARCH TO MAX.STACK UNTIL FOUND OR STACK&amp;lt;F&amp;gt; = NUL&lt;br /&gt;
        IF INDEX(STACK&amp;lt;F&amp;gt;,SEARCH.FOR,1) # 0 THEN FOUND = TRUE&lt;br /&gt;
    NEXT F&lt;br /&gt;
    IF FOUND THEN&lt;br /&gt;
        START.WORD.SEARCH = F&lt;br /&gt;
        ANS = &amp;#039;.R&amp;#039;:F-1&lt;br /&gt;
        GO EDIT&lt;br /&gt;
    END&lt;br /&gt;
    PRINT BELL:SEARCH.FOR:&amp;#039; event not found&amp;#039;&lt;br /&gt;
RETURN&lt;br /&gt;
&lt;br /&gt;
PROG.COMMAND:&lt;br /&gt;
    IF ANS = PROG.CHAR OR ANS=PROG.CHAR:PROG.CHAR THEN GO PRINT.PROG.INFO&lt;br /&gt;
    GOSUB PARSE.PROG.COM&lt;br /&gt;
    BEGIN CASE&lt;br /&gt;
        CASE PROG.COM = &amp;#039;[[/WW]]&amp;#039;&lt;br /&gt;
            WRITE PROGRAMS ON HOME.F, PROGRAM.ITEM&lt;br /&gt;
            EXEC.LINE = WP.VERB:SPC:HOME.FILE:SPC:PROGRAM.ITEM&lt;br /&gt;
            GOSUB EXEC.SUB&lt;br /&gt;
            READ PROGRAMS FROM HOME.F, PROGRAM.ITEM ELSE PROGRAMS = NUL&lt;br /&gt;
        CASE PROG.COM = &amp;#039;[[/N]]&amp;#039;&lt;br /&gt;
            GOSUB GET.PROG.NAME&lt;br /&gt;
            IF RTN=13 THEN&lt;br /&gt;
                PROGRAMS&amp;lt;PROG.NUM&amp;gt; = PROG&lt;br /&gt;
                WRITE PROGRAMS ON HOME.F, PROGRAM.ITEM&lt;br /&gt;
            END&lt;br /&gt;
            IF B.FILE # &amp;#039;&amp;#039; THEN&lt;br /&gt;
                OPEN B.FILE TO F THEN&lt;br /&gt;
                    OPTIONS=&amp;#039;&amp;#039;&lt;br /&gt;
                    CALL CVS.CHECKOUT(RTN, B.FILE, B.ITEM, OPTIONS)&lt;br /&gt;
                    READ DUMMY FROM F, B.ITEM ELSE&lt;br /&gt;
                        PRINT B.ITEM:&amp;#039; not found.  Use standard header? &amp;#039;:&lt;br /&gt;
                        INPUT YORN&lt;br /&gt;
                        IF YORN = &amp;#039;Y&amp;#039; THEN&lt;br /&gt;
                            READ HEADER FROM TRIN.GLOBAL.PARAMETER, &amp;#039;TRIN.HEADER&amp;#039; THEN&lt;br /&gt;
                                SWAP &amp;quot;$*&amp;quot; WITH &amp;quot;$&amp;quot; IN HEADER&lt;br /&gt;
                                HEADER&amp;lt;2&amp;gt;=HEADER&amp;lt;2&amp;gt;[1,12]:B.ITEM&lt;br /&gt;
                                HEADER&amp;lt;3&amp;gt;=HEADER&amp;lt;3&amp;gt;[1,12]:USERNAME                               &lt;br /&gt;
                                HEADER&amp;lt;4&amp;gt;=HEADER&amp;lt;4&amp;gt;[1,12]:OCONV(DATE(),&amp;quot;D4/&amp;quot;)&lt;br /&gt;
                                WRITE HEADER ON F, B.ITEM&lt;br /&gt;
                            END&lt;br /&gt;
                        END&lt;br /&gt;
                    END&lt;br /&gt;
                    CLOSE F&lt;br /&gt;
                END ELSE&lt;br /&gt;
                    PRINT B.FILE:&amp;#039; is not a file in this account&amp;#039;&lt;br /&gt;
                END&lt;br /&gt;
            END&lt;br /&gt;
        CASE PROG.COM = &amp;#039;[[/H]]&amp;#039;&lt;br /&gt;
            OPTIONS=&amp;#039;LESS&amp;#039;&lt;br /&gt;
            CALL CVS.LOG(RTN, B.FILE, B.ITEM, OPTIONS)&lt;br /&gt;
        CASE PROG.COM = &amp;#039;[[/L]]&amp;#039;&lt;br /&gt;
            OPTIONS=&amp;#039;MODIFIED&amp;#039;&lt;br /&gt;
            X = 15;DISP.LEN=30;LEN=LONG.LINE;ENTRY=NUL&lt;br /&gt;
            PRINT &amp;#039;Program File :&amp;#039;:&lt;br /&gt;
            GOSUB GET.INPUT&lt;br /&gt;
            ANS = UPCASE(ENTRY)&lt;br /&gt;
            IF RTN # 13 THEN RETURN            &lt;br /&gt;
            CALL CVS.LIST(RTN, ENTRY, OPTIONS)&lt;br /&gt;
        CASE PROG.COM = &amp;#039;[[/CI]]&amp;#039;&lt;br /&gt;
            * Check it in&lt;br /&gt;
            OPTIONS=&amp;#039;&amp;#039;&lt;br /&gt;
            CALL CVS.CHECKIN(RTN, B.FILE, B.ITEM, OPTIONS)&lt;br /&gt;
        CASE PROG.COM = &amp;#039;[[/D]]&amp;#039;&lt;br /&gt;
            * CVS Diff&lt;br /&gt;
            OPTIONS=&amp;#039;SHOW&amp;#039;&lt;br /&gt;
            CALL CVS.DIFF(RTN, B.FILE, B.ITEM, OPTIONS)&lt;br /&gt;
        CASE B.FILE[1,1] = &amp;#039;*&amp;#039; OR B.FILE=&amp;#039;&amp;#039;&lt;br /&gt;
            NULL ;* Don&amp;#039;t do anything with &amp;#039;comment&amp;#039; or blank entries&lt;br /&gt;
        CASE PROG.COM = &amp;#039;[[/BR]]&amp;#039;&lt;br /&gt;
            GOSUB COMPILE&lt;br /&gt;
            EXEC.LINE = B.ITEM&lt;br /&gt;
            GOSUB EXEC.SUB&lt;br /&gt;
        CASE PROG.COM = &amp;#039;[[/B]]&amp;#039;&lt;br /&gt;
            GOSUB COMPILE&lt;br /&gt;
        CASE PROG.COM = &amp;#039;[[/E]]&amp;#039; OR PROG.COM = &amp;#039;[[/W]]&amp;#039;&lt;br /&gt;
            OPEN B.FILE TO F ELSE PRINT &amp;#039;Cannot open &amp;#039;:B.FILE:BELL;RETURN&lt;br /&gt;
            READ R1 FROM F, B.ITEM ELSE R1=NUL&lt;br /&gt;
            IF PROG.COM = &amp;#039;[[/E]]&amp;#039; THEN&lt;br /&gt;
                EXEC.LINE = ED.VERB:SPC:PROG:OPTIONS&lt;br /&gt;
            END ELSE&lt;br /&gt;
                EXEC.LINE = WP.VERB:SPC:PROG&lt;br /&gt;
            END&lt;br /&gt;
            GOSUB EXEC.SUB&lt;br /&gt;
            * Do we need to time-stamp?&lt;br /&gt;
            *READ R FROM F, B.ITEM THEN&lt;br /&gt;
            *   IF R1 # R THEN GOSUB TIME.STAMP&lt;br /&gt;
            *END&lt;br /&gt;
            CLOSE F&lt;br /&gt;
        CASE PROG.COM = &amp;#039;[[/F]]&amp;#039;&lt;br /&gt;
            EXEC.LINE = &amp;#039;BFORMAT &amp;#039;:PROG:OPTIONS&lt;br /&gt;
            GOSUB EXEC.SUB&lt;br /&gt;
        CASE PROG.COM = &amp;#039;[[/R]]&amp;#039;&lt;br /&gt;
            OPEN B.FILE TO F ELSE PRINT &amp;#039;Cannot open &amp;#039;:B.FILE:BELL;RETURN&lt;br /&gt;
            READV R FROM F, B.ITEM, 1 ELSE R=NUL&lt;br /&gt;
            CLOSE F&lt;br /&gt;
            IF R=&amp;#039;PQ&amp;#039; THEN&lt;br /&gt;
                EXEC.LINE= &amp;#039;RP &amp;#039;:PROG:OPTIONS&lt;br /&gt;
            END ELSE&lt;br /&gt;
                EXEC.LINE = B.ITEM:OPTIONS&lt;br /&gt;
            END&lt;br /&gt;
            GOSUB EXEC.SUB&lt;br /&gt;
        CASE PROG.COM = &amp;#039;[[/S]]&amp;#039;&lt;br /&gt;
            E=\SORT.RECORD \:HOME.FILE:\ \:PROGRAM.ITEM&lt;br /&gt;
            PRINT E ; EXECUTE E&lt;br /&gt;
        CASE OTHERWISE&lt;br /&gt;
            PRINT &amp;#039;There is no such PROGRAM command&amp;#039;:BELL&lt;br /&gt;
            PRINT &amp;#039;? for help&amp;#039;&lt;br /&gt;
    END CASE&lt;br /&gt;
RETURN&lt;br /&gt;
&lt;br /&gt;
COMPILE:&lt;br /&gt;
    OPTIONS=&amp;#039;&amp;#039;&lt;br /&gt;
    * Check for global catalog&lt;br /&gt;
    READ DUMMY FROM CTLGTB, B.ITEM THEN&lt;br /&gt;
        PRINT B.ITEM:&amp;#039; is cataloged globally&amp;#039;&lt;br /&gt;
        OPTIONS=&amp;#039;G&amp;#039;&lt;br /&gt;
    END&lt;br /&gt;
    &lt;br /&gt;
    * Check for local catalog&lt;br /&gt;
    READ DUMMY FROM CTLG, B.ITEM THEN&lt;br /&gt;
        PRINT B.ITEM:&amp;#039; is cataloged locally&amp;#039;&lt;br /&gt;
        OPTIONS:=&amp;#039;L&amp;#039;&lt;br /&gt;
    END&lt;br /&gt;
&lt;br /&gt;
    * Check for direct catalog&lt;br /&gt;
    READ DUMMY FROM VOC, B.ITEM THEN&lt;br /&gt;
        IF INDEX(DUMMY&amp;lt;2&amp;gt;,&amp;#039;[[/CTLG]]/&amp;#039;,1)=0 THEN&lt;br /&gt;
            PRINT B.ITEM:&amp;#039; is cataloged direct to &amp;#039;:DUMMY&amp;lt;2&amp;gt;&lt;br /&gt;
            PRINT &amp;#039;Bugging out:&amp;#039;:INDEX(DUMMY&amp;lt;2&amp;gt;,&amp;#039;[[/CTLG]]/&amp;#039;,1)&lt;br /&gt;
            RETURN&lt;br /&gt;
        END&lt;br /&gt;
    END&lt;br /&gt;
&lt;br /&gt;
    IF LEN(OPTIONS) &amp;gt; 1 THEN&lt;br /&gt;
        PRINT &amp;quot;OPTIONS=&amp;quot;:OPTIONS&lt;br /&gt;
        PRINT &amp;quot;I do not like green eggs and ham, nor do I like&amp;quot;&lt;br /&gt;
        PRINT &amp;quot;programs cataloged twice.  You must fix, Sam&amp;quot;&lt;br /&gt;
        RETURN&lt;br /&gt;
    END&lt;br /&gt;
&lt;br /&gt;
    LOOP&lt;br /&gt;
    UNTIL OPTIONS#&amp;#039;&amp;#039; DO&lt;br /&gt;
        PRINT &amp;#039;Catalog &amp;#039;:B.ITEM:&amp;#039; -- L)ocal or G)lobal :&amp;#039;:&lt;br /&gt;
        INPUT OPTIONS&lt;br /&gt;
        OPTIONS=UPCASE(OPTIONS)&lt;br /&gt;
        IF OPTIONS = &amp;#039;/&amp;#039; OR OPTIONS=&amp;#039;&amp;#039; THEN RETURN&lt;br /&gt;
        * Have to enter L or G&lt;br /&gt;
        IF OPTIONS # &amp;#039;L&amp;#039; AND OPTIONS # &amp;#039;G&amp;#039; THEN OPTIONS=&amp;#039;&amp;#039;&lt;br /&gt;
    REPEAT&lt;br /&gt;
&lt;br /&gt;
    EXEC.LINE = &amp;#039;BASIC &amp;#039;:B.FILE:&amp;#039; &amp;#039;&lt;br /&gt;
    IF OPTIONS=&amp;#039;G&amp;#039; THEN EXEC.LINE:=&amp;#039;TO BP.OBJ &amp;#039;&lt;br /&gt;
    EXEC.LINE := B.ITEM:&amp;#039; -D&amp;#039;&lt;br /&gt;
    PRINT EXEC.LINE&lt;br /&gt;
    GOSUB EXEC.SUB&lt;br /&gt;
&lt;br /&gt;
    IF OPTIONS=&amp;#039;G&amp;#039; THEN&lt;br /&gt;
        EXEC.LINE = &amp;#039;CATALOG BP.OBJ &amp;#039;:B.ITEM:&amp;#039; FORCE&amp;#039;&lt;br /&gt;
        PRINT EXEC.LINE&lt;br /&gt;
        GOSUB EXEC.SUB&lt;br /&gt;
        * Global, so remove direct or local pointers&lt;br /&gt;
        READ R FROM VOC, B.ITEM THEN DELETE VOC, B.ITEM&lt;br /&gt;
    END ELSE&lt;br /&gt;
        EXEC.LINE = &amp;#039;CATALOG &amp;#039;:PROG:&amp;#039; LOCAL FORCE&amp;#039;&lt;br /&gt;
        PRINT EXEC.LINE&lt;br /&gt;
        GOSUB EXEC.SUB&lt;br /&gt;
        * Object is in CTLG file, so remove from SOURCE file&lt;br /&gt;
        OPEN B.FILE TO F ELSE PRINT &amp;#039;Cannot open &amp;#039;:B.FILE:BELL;RETURN&lt;br /&gt;
        DELETE F, &amp;#039;_&amp;#039;:B.ITEM&lt;br /&gt;
        CLOSE F&lt;br /&gt;
    END&lt;br /&gt;
&lt;br /&gt;
    EXEC.LINE = &amp;#039;NEWPCODE&amp;#039;&lt;br /&gt;
    GOSUB EXEC.SUB&lt;br /&gt;
RETURN&lt;br /&gt;
&lt;br /&gt;
PARSE.PROG.COM:&lt;br /&gt;
    PROG.NUM = NUL&lt;br /&gt;
    F = FIELD(ANS,SPC,1);L = LEN(F);I = L&lt;br /&gt;
    LOOP&lt;br /&gt;
        IF NUM(F[I,1]) THEN PROG.NUM = F[I,1]:PROG.NUM ELSE EXIT&lt;br /&gt;
        I = I - 1&lt;br /&gt;
    REPEAT&lt;br /&gt;
    IF PROG.NUM = NUL THEN PROG.NUM = 1&lt;br /&gt;
    OPTIONS = ANS[L+1,LONG.LINE]&lt;br /&gt;
    PROG.COM = ANS[1,I]&lt;br /&gt;
    PROG = PROGRAMS&amp;lt;PROG.NUM&amp;gt;&lt;br /&gt;
    B.FILE = FIELD(PROG,SPC,1)&lt;br /&gt;
    B.ITEM = FIELD(PROG,SPC,2)&lt;br /&gt;
RETURN&lt;br /&gt;
&lt;br /&gt;
GET.PROG.NAME:&lt;br /&gt;
    X = 15;DISP.LEN = 30;LEN = LONG.LINE;ENTRY = PROG&lt;br /&gt;
    PRINT &amp;#039;Program Name :&amp;#039;:&lt;br /&gt;
    GOSUB GET.INPUT&lt;br /&gt;
    ANS = UPCASE(ENTRY)&lt;br /&gt;
    IF RTN # 13 THEN RETURN&lt;br /&gt;
    GOSUB EXPAND.ALIASES&lt;br /&gt;
    IF INDEX(ANS,SPC,1) THEN&lt;br /&gt;
        B.FILE = FIELD(ANS,SPC,1)&lt;br /&gt;
        B.ITEM = FIELD(ANS,SPC,2)&lt;br /&gt;
        PROG=ANS&lt;br /&gt;
    END ELSE&lt;br /&gt;
        IF ANS = NUL THEN&lt;br /&gt;
            B.FILE = NUL ; B.ITEM = NUL ;PROG = NUL&lt;br /&gt;
        END ELSE&lt;br /&gt;
            B.FILE = WORK.FILE ; B.ITEM = ANS ; PROG = B.FILE:SPC:B.ITEM&lt;br /&gt;
        END&lt;br /&gt;
    END&lt;br /&gt;
RETURN&lt;br /&gt;
&lt;br /&gt;
TIME.STAMP:&lt;br /&gt;
    * Assumes that calling code opened file to F, and read record into R,&lt;br /&gt;
    *  and will take care of closing file&lt;br /&gt;
    ERROR = FALSE&lt;br /&gt;
    IF INDEX(R,STAMP.STRING,1) THEN&lt;br /&gt;
        L=LEN(STAMP.STRING)&lt;br /&gt;
        FOR N=1 TO 10&lt;br /&gt;
            IF R&amp;lt;N&amp;gt;[1,L] = STAMP.STRING THEN&lt;br /&gt;
                R&amp;lt;N&amp;gt; = STAMP.STRING:&amp;#039; &amp;#039;:TIMEDATE():&amp;#039; By &amp;#039;:INITIALS&amp;#039;L#8&amp;#039;&lt;br /&gt;
                WRITE R ON F,B.ITEM&lt;br /&gt;
                R = NUL&lt;br /&gt;
            END&lt;br /&gt;
        NEXT F&lt;br /&gt;
    END&lt;br /&gt;
RETURN&lt;br /&gt;
&lt;br /&gt;
PRINT.PROG.INFO:&lt;br /&gt;
    I = DCOUNT(PROGRAMS,@AM)&lt;br /&gt;
    PRINT&lt;br /&gt;
    FOR F = 1 TO I&lt;br /&gt;
        IF PROGRAMS&amp;lt;F&amp;gt; # NUL THEN&lt;br /&gt;
            CH=&amp;#039; &amp;#039;&lt;br /&gt;
            IF ANS=PROG.CHAR:PROG.CHAR THEN&lt;br /&gt;
                * We want cvs status as well&lt;br /&gt;
                FILE=FIELD(PROGRAMS&amp;lt;F&amp;gt;,&amp;#039; &amp;#039;,1)&lt;br /&gt;
                ITEM=FIELD(PROGRAMS&amp;lt;F&amp;gt;,&amp;#039; &amp;#039;,2)&lt;br /&gt;
                CALL CVS.STATUS(R,FILE,ITEM,&amp;#039;&amp;#039;)&lt;br /&gt;
                STATUS=R&amp;lt;1&amp;gt;&lt;br /&gt;
                WORK.VER=R&amp;lt;2&amp;gt;&lt;br /&gt;
                CVS.VER=R&amp;lt;3&amp;gt;&lt;br /&gt;
                BEGIN CASE&lt;br /&gt;
                    CASE STATUS=&amp;#039;UPTODATE&amp;#039;&lt;br /&gt;
                        CH=&amp;#039;  &amp;#039;:WORK.VER&amp;#039;L#9&amp;#039;&lt;br /&gt;
                    CASE STATUS=&amp;#039;MODIFIED&amp;#039;&lt;br /&gt;
                        CH=&amp;#039;&amp;gt; &amp;#039;:WORK.VER&amp;#039;L#4&amp;#039;:&amp;#039; &amp;#039;:CVS.VER&amp;#039;L#4&amp;#039;&lt;br /&gt;
                    CASE 1&lt;br /&gt;
                        CH=&amp;#039;! &amp;#039;:SPACE(9)&lt;br /&gt;
                END CASE&lt;br /&gt;
            END&lt;br /&gt;
            PRINT F &amp;#039;L#5&amp;#039;:CH:&amp;#039; &amp;#039;:PROGRAMS&amp;lt;F&amp;gt;&lt;br /&gt;
        END&lt;br /&gt;
    NEXT F&lt;br /&gt;
RETURN&lt;br /&gt;
&lt;br /&gt;
WRITE.INFO:&lt;br /&gt;
    WRITE STACK ON HOME.F, STACK.ITEM&lt;br /&gt;
    WRITE ALIASES ON HOME.F, ALIAS.ITEM&lt;br /&gt;
    WRITE PROGRAMS ON HOME.F, PROGRAM.ITEM&lt;br /&gt;
    WRITE SETTINGS ON HOME.F, SETTING.ITEM&lt;br /&gt;
RETURN&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;/div&gt;</summary>
		<author><name>Conversion script</name></author>
	</entry>
</feed>