<?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=GetLineStack</id>
	<title>GetLineStack - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://pickwiki.org/index.php?action=history&amp;feed=atom&amp;title=GetLineStack"/>
	<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=GetLineStack&amp;action=history"/>
	<updated>2026-04-28T22:09:27Z</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=GetLineStack&amp;diff=1820&amp;oldid=prev</id>
		<title>Conversion script: link fix</title>
		<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=GetLineStack&amp;diff=1820&amp;oldid=prev"/>
		<updated>2015-02-26T23:48:54Z</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;Back to [[BasicSource]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
SUBROUTINE GET.LINE(X,XXLENGTH,DISP.LEN,XXDATA,RTN.CHAR)&lt;br /&gt;
************************************************************************&lt;br /&gt;
* Program: GET.LINE.STACK&lt;br /&gt;
* Author : Ian [[McGowan]]&lt;br /&gt;
* Date   : 6/24/89&lt;br /&gt;
* Edited : 16:49:22 Nov 19 1998 By MCGOWAN &lt;br /&gt;
* Comment: Get a line of data with editing keys&lt;br /&gt;
************************************************************************&lt;br /&gt;
* Date     By   Desc&lt;br /&gt;
* -------- ---- ----------------------------------------------------&lt;br /&gt;
*10/02/95* IAN  Attempt to fix &amp;#039;turd&amp;#039; bug -- JIM&lt;br /&gt;
*10/02/95  IAN  Add CTRL-B for back -- JIM&lt;br /&gt;
*09/14/95  IAN  Add CTRL-W for delete word -- JIM&lt;br /&gt;
*01/02/94  IAN  Trap HOME and END key, Also add del word and line -- JIM&lt;br /&gt;
*01/25/94  IAN  CTRL-D exits -- JIM&lt;br /&gt;
*08/22/97  IAN  Add wyse support, make more emacs like&lt;br /&gt;
************************************************************************&lt;br /&gt;
* X           = X POS&lt;br /&gt;
* XXLENGTH    = MAX ALLOWED LENGTH&lt;br /&gt;
* DISP.LEN    = MAX DISPLAYED XXLENGTH&lt;br /&gt;
* XXDATA      = ON INPUT  VARIABLE XXDATA&lt;br /&gt;
*             = ON OUTPUT RETURNED STRING&lt;br /&gt;
* RTN.CHAR    = SEQ(CHAR PRESSED TO EXIT)&lt;br /&gt;
&lt;br /&gt;
* Important globals&lt;br /&gt;
* CP          = Cursor Position, Y coordinate on the screen 0 -&amp;gt; DISP.LEN&lt;br /&gt;
* CH.PTR      = Pointer into string being edited            1 -&amp;gt; XXLENGTH&lt;br /&gt;
* POS         = Pointer to first char currently displayed   1 -&amp;gt; XXLENGTH&lt;br /&gt;
* ASC.CH      = The numeric value of the key just entered&lt;br /&gt;
&lt;br /&gt;
INIT:&lt;br /&gt;
   EQU INSERT TO &amp;#039;1&amp;#039;,REPLACE TO &amp;#039;-1&amp;#039;,BEEP TO CHAR(7)&lt;br /&gt;
   EQU ESC TO CHAR(27),AM TO CHAR(254)&lt;br /&gt;
   EQU NUL TO &amp;#039;&amp;#039;,TRUE TO 1,FALSE TO 0,SPACE TO &amp;#039; &amp;#039;&lt;br /&gt;
   TERM=UPCASE(GETENV(&amp;quot;TERM&amp;quot;))&lt;br /&gt;
   IF INDEX(TERM,&amp;#039;WY&amp;#039;,1) THEN TERM=&amp;#039;W&amp;#039;   &lt;br /&gt;
   PROMPT NUL&lt;br /&gt;
   ECHO OFF&lt;br /&gt;
   MODE = REPLACE ; TEMP.XXDATA =XXDATA&lt;br /&gt;
   BASE = @(X) ; MASK = &amp;#039;L#&amp;#039;:DISP.LEN&lt;br /&gt;
   PRINT BASE:&lt;br /&gt;
   CURR.LEN = LEN(XXDATA)&lt;br /&gt;
   GOSUB GO.END&lt;br /&gt;
   RTN.CHAR=&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
MAIN:&lt;br /&gt;
   LOOP&lt;br /&gt;
      PRINT @(X+CP):&lt;br /&gt;
      CH=IN()&lt;br /&gt;
      ASC.CH = SEQ(CH)&lt;br /&gt;
      EXIT.FLAG=FALSE&lt;br /&gt;
      BEGIN CASE&lt;br /&gt;
         CASE ASC.CH = 1&lt;br /&gt;
            GOSUB GO.BEGIN&lt;br /&gt;
         CASE ASC.CH = 2&lt;br /&gt;
            GOSUB LEFT&lt;br /&gt;
         CASE ASC.CH = 4&lt;br /&gt;
            GOSUB DEL&lt;br /&gt;
         CASE ASC.CH = 5&lt;br /&gt;
            GOSUB GO.END&lt;br /&gt;
         CASE ASC.CH = 6&lt;br /&gt;
            GOSUB RIGHT&lt;br /&gt;
         CASE ASC.CH = 8 AND TERM=&amp;#039;W&amp;#039;&lt;br /&gt;
            GOSUB LEFT&lt;br /&gt;
         CASE ASC.CH = 8&lt;br /&gt;
            GOSUB BACK&lt;br /&gt;
         CASE ASC.CH = 9&lt;br /&gt;
            GOSUB FORWARD.WORD&lt;br /&gt;
         CASE ASC.CH = 10 AND TERM=&amp;#039;W&amp;#039;&lt;br /&gt;
            RTN.CHAR=2&lt;br /&gt;
            EXIT.FLAG=TRUE&lt;br /&gt;
         CASE ASC.CH = 10&lt;br /&gt;
            GOSUB DEL.TO.END&lt;br /&gt;
         CASE ASC.CH=11 AND TERM=&amp;#039;W&amp;#039;&lt;br /&gt;
            RTN.CHAR=1&lt;br /&gt;
            EXIT.FLAG=TRUE&lt;br /&gt;
         CASE ASC.CH=12 AND TERM=&amp;#039;W&amp;#039;&lt;br /&gt;
            GOSUB RIGHT&lt;br /&gt;
         CASE ASC.CH = 13&lt;br /&gt;
            EXIT.FLAG = TRUE&lt;br /&gt;
            RTN.CHAR=13&lt;br /&gt;
         CASE ASC.CH = 14&lt;br /&gt;
            RTN.CHAR=2&lt;br /&gt;
            EXIT.FLAG=TRUE&lt;br /&gt;
         CASE ASC.CH = 16&lt;br /&gt;
            RTN.CHAR=1&lt;br /&gt;
            EXIT.FLAG=TRUE&lt;br /&gt;
         CASE ASC.CH = 18&lt;br /&gt;
            GOSUB INSRT&lt;br /&gt;
         CASE ASC.CH = 23&lt;br /&gt;
            GOSUB DELETE.WORD&lt;br /&gt;
         CASE ASC.CH = 24&lt;br /&gt;
            GOSUB FORWARD.WORD&lt;br /&gt;
         CASE ASC.CH = 25&lt;br /&gt;
            XXDATA = &amp;#039;&amp;#039;&lt;br /&gt;
            EXIT.FLAG=TRUE&lt;br /&gt;
            RTN.CHAR=13&lt;br /&gt;
         CASE ASC.CH = 26&lt;br /&gt;
            GOSUB BACK.WORD&lt;br /&gt;
         CASE ASC.CH = 27&lt;br /&gt;
            GOSUB ESC.KEY&lt;br /&gt;
         CASE ASC.CH &amp;lt; 27&lt;br /&gt;
            PRINT @(0):ASC.CH:&lt;br /&gt;
         CASE ASC.CH = 127&lt;br /&gt;
            GOSUB BACK&lt;br /&gt;
         CASE 1&lt;br /&gt;
            GOSUB ORD&lt;br /&gt;
      END CASE&lt;br /&gt;
      CURR.LEN = LEN(XXDATA)&lt;br /&gt;
   UNTIL EXIT.FLAG DO&lt;br /&gt;
   REPEAT&lt;br /&gt;
   IF XXDATA[CURR.LEN,1] = SPACE THEN XXDATA = XXDATA[1,CURR.LEN-1]&lt;br /&gt;
   ECHO ON ; PRINT BASE:XXDATA MASK&lt;br /&gt;
RETURN&lt;br /&gt;
&lt;br /&gt;
ORD:&lt;br /&gt;
   * Ordinary key pressed&lt;br /&gt;
   IF CH.PTR # XXLENGTH+1 THEN&lt;br /&gt;
      IF MODE = INSERT THEN&lt;br /&gt;
         IF CURR.LEN = XXLENGTH THEN&lt;br /&gt;
            PRINT BEEP:&lt;br /&gt;
            GOTO SKIP1&lt;br /&gt;
         END ELSE&lt;br /&gt;
            XXDATA = XXDATA[1,CH.PTR-1]:CH:XXDATA[CH.PTR,CURR.LEN]&lt;br /&gt;
         END&lt;br /&gt;
      END ELSE&lt;br /&gt;
         XXDATA = XXDATA[1,CH.PTR-1]:CH:XXDATA[CH.PTR+1,CURR.LEN]&lt;br /&gt;
      END&lt;br /&gt;
      CH.PTR = CH.PTR + 1&lt;br /&gt;
      IF CP # DISP.LEN THEN&lt;br /&gt;
         PRINT @(X+CP):CH:&lt;br /&gt;
         IF MODE = INSERT THEN&lt;br /&gt;
            PRINT XXDATA[CH.PTR,DISP.LEN-CP-1]:&lt;br /&gt;
         END&lt;br /&gt;
         CP = CP + 1&lt;br /&gt;
      END ELSE&lt;br /&gt;
         POS = POS + 1&lt;br /&gt;
         PRINT BASE:XXDATA[POS,DISP.LEN] MASK:&lt;br /&gt;
      END&lt;br /&gt;
   END ELSE&lt;br /&gt;
      PRINT BEEP:&lt;br /&gt;
   END&lt;br /&gt;
SKIP1:&lt;br /&gt;
RETURN&lt;br /&gt;
&lt;br /&gt;
RIGHT:&lt;br /&gt;
* There are 3 situations here -&lt;br /&gt;
* 1 We&amp;#039;re pressing the right arrow thru existing text       (CH.PTR = CURR.LEN)&lt;br /&gt;
* 2 We&amp;#039;ve typed text and are at the end when we press right (CH.PTR &amp;gt; CURR.LEN)&lt;br /&gt;
* 3 We&amp;#039;re in the middle of text, pressing the right arrow   (CH.PTR &amp;lt; CURR.LEN)&lt;br /&gt;
   IF CH.PTR &amp;lt; XXLENGTH THEN&lt;br /&gt;
      IF CH.PTR &amp;gt; CURR.LEN THEN PRINT BEEP: ; GOTO SKIP2&lt;br /&gt;
      IF CH.PTR = CURR.LEN THEN&lt;br /&gt;
         * If the last char is not a space make it one&lt;br /&gt;
         IF XXDATA[CURR.LEN,1] # SPACE THEN&lt;br /&gt;
            XXDATA = XXDATA:SPACE&lt;br /&gt;
            IF CP # DISP.LEN THEN PRINT @(X+CP+1):SPACE:&lt;br /&gt;
            CURR.LEN = CURR.LEN + 1&lt;br /&gt;
         END ELSE&lt;br /&gt;
            PRINT BEEP:&lt;br /&gt;
            GOTO SKIP2&lt;br /&gt;
         END&lt;br /&gt;
      END&lt;br /&gt;
      CH.PTR = CH.PTR + 1&lt;br /&gt;
      IF CP # DISP.LEN THEN&lt;br /&gt;
         * We&amp;#039;re not at the end of display so just move the cursor&lt;br /&gt;
         CP = CP + 1&lt;br /&gt;
      END ELSE&lt;br /&gt;
         * We are at the end of the display so leave cursor where&lt;br /&gt;
         * it is and scroll through line&lt;br /&gt;
         POS = POS + 1&lt;br /&gt;
         PRINT BASE:XXDATA[POS,DISP.LEN] MASK:&lt;br /&gt;
      END&lt;br /&gt;
   END ELSE&lt;br /&gt;
      PRINT BEEP:&lt;br /&gt;
   END&lt;br /&gt;
SKIP2:&lt;br /&gt;
RETURN&lt;br /&gt;
&lt;br /&gt;
FORWARD.WORD:&lt;br /&gt;
   * Tab key pressed - move forwards a word&lt;br /&gt;
   IF CH.PTR &amp;gt;= CURR.LEN THEN&lt;br /&gt;
      PRINT BEEP:&lt;br /&gt;
   END ELSE&lt;br /&gt;
      LOOP&lt;br /&gt;
         CH.PTR = CH.PTR + 1&lt;br /&gt;
         CP = CP + 1&lt;br /&gt;
      UNTIL XXDATA[CH.PTR,1] = SPACE OR CH.PTR = CURR.LEN DO&lt;br /&gt;
      REPEAT&lt;br /&gt;
      IF CH.PTR # CURR.LEN THEN&lt;br /&gt;
         LOOP&lt;br /&gt;
            CH.PTR = CH.PTR + 1&lt;br /&gt;
            CP = CP + 1&lt;br /&gt;
         UNTIL XXDATA[CH.PTR,1] # SPACE OR CH.PTR = CURR.LEN DO&lt;br /&gt;
         REPEAT&lt;br /&gt;
      END&lt;br /&gt;
      IF CP &amp;gt; DISP.LEN THEN&lt;br /&gt;
         CP = DISP.LEN&lt;br /&gt;
         POS = CH.PTR - DISP.LEN&lt;br /&gt;
         PRINT BASE:XXDATA[POS,DISP.LEN] MASK:&lt;br /&gt;
      END&lt;br /&gt;
   END&lt;br /&gt;
RETURN&lt;br /&gt;
&lt;br /&gt;
LEFT:&lt;br /&gt;
   * If we&amp;#039;re not at the start of data, move left&lt;br /&gt;
   IF CH.PTR # 1 THEN&lt;br /&gt;
      CH.PTR = CH.PTR - 1&lt;br /&gt;
      IF CP # 0 THEN&lt;br /&gt;
         * We&amp;#039;re not at the start of the display so just move the cursor&lt;br /&gt;
         CP = CP - 1&lt;br /&gt;
      END ELSE&lt;br /&gt;
         * We are at the start of the display so leave cursor and scroll&lt;br /&gt;
         POS = POS - 1&lt;br /&gt;
         PRINT BASE:XXDATA[POS,DISP.LEN] MASK:&lt;br /&gt;
      END&lt;br /&gt;
   END ELSE&lt;br /&gt;
      PRINT BEEP:&lt;br /&gt;
   END&lt;br /&gt;
RETURN&lt;br /&gt;
&lt;br /&gt;
DEL:&lt;br /&gt;
   * Delete the character at the cursor and redisplay from this point&lt;br /&gt;
   XXDATA = XXDATA[1,CH.PTR-1]:XXDATA[CH.PTR+1,CURR.LEN]&lt;br /&gt;
   CURR.LEN = CURR.LEN - 1&lt;br /&gt;
   PRINT BASE:XXDATA[POS,DISP.LEN] MASK:&lt;br /&gt;
RETURN&lt;br /&gt;
&lt;br /&gt;
BACK:&lt;br /&gt;
&lt;br /&gt;
   * Backspace key pressed&lt;br /&gt;
   IF CH.PTR # 1 THEN&lt;br /&gt;
      CH.PTR = CH.PTR - 1&lt;br /&gt;
      XXDATA = XXDATA[1,CH.PTR-1]:XXDATA[CH.PTR+1,CURR.LEN]&lt;br /&gt;
      CURR.LEN = CURR.LEN - 1&lt;br /&gt;
      IF CP # 0 THEN&lt;br /&gt;
         CP = CP - 1&lt;br /&gt;
      END ELSE&lt;br /&gt;
         POS = POS - 1&lt;br /&gt;
      END&lt;br /&gt;
      PRINT BASE:XXDATA[POS,DISP.LEN] MASK:&lt;br /&gt;
   END ELSE&lt;br /&gt;
      PRINT BEEP:&lt;br /&gt;
   END&lt;br /&gt;
RETURN&lt;br /&gt;
&lt;br /&gt;
INSRT:&lt;br /&gt;
   * Toggle between insert and replace modes&lt;br /&gt;
   MODE = -MODE&lt;br /&gt;
RETURN&lt;br /&gt;
&lt;br /&gt;
ESC.KEY:&lt;br /&gt;
   * ESC pressed, or extended key&lt;br /&gt;
   * Get next char of extended command&lt;br /&gt;
   ALLOW = 0&lt;br /&gt;
   EXT.KEY=IN()&lt;br /&gt;
   EXT = SEQ(EXT.KEY)&lt;br /&gt;
   EXT.KEY = OCONV(EXT.KEY,&amp;#039;MCU&amp;#039;)&lt;br /&gt;
   BEGIN CASE&lt;br /&gt;
      CASE EXT.KEY = &amp;#039;D&amp;#039;&lt;br /&gt;
        GOSUB DELETE.WORD&lt;br /&gt;
      CASE EXT.KEY = &amp;#039;[&amp;#039; OR EXT.KEY = &amp;#039;O&amp;#039;&lt;br /&gt;
         EXT.KEY=IN()&lt;br /&gt;
         BEGIN CASE&lt;br /&gt;
            CASE EXT.KEY = &amp;#039;C&amp;#039;&lt;br /&gt;
               GOSUB RIGHT&lt;br /&gt;
            CASE EXT.KEY = &amp;#039;D&amp;#039;&lt;br /&gt;
               GOSUB LEFT&lt;br /&gt;
            CASE EXT.KEY = &amp;#039;A&amp;#039;&lt;br /&gt;
               RTN.CHAR=1&lt;br /&gt;
               EXIT.FLAG=TRUE&lt;br /&gt;
            CASE EXT.KEY = &amp;#039;B&amp;#039;&lt;br /&gt;
               RTN.CHAR=2&lt;br /&gt;
               EXIT.FLAG=TRUE&lt;br /&gt;
         END CASE&lt;br /&gt;
   END CASE&lt;br /&gt;
RETURN ; * From ESC key&lt;br /&gt;
&lt;br /&gt;
BACK.WORD:&lt;br /&gt;
   * Shift tab pressed - go back a word&lt;br /&gt;
   IF CH.PTR = 1 THEN&lt;br /&gt;
      PRINT BEEP:&lt;br /&gt;
   END ELSE&lt;br /&gt;
      * 2 situations - either we&amp;#039;re in a word already or&lt;br /&gt;
      * we&amp;#039;re at the start of a word&lt;br /&gt;
      * If in a word - loop to the start of the word&lt;br /&gt;
      * otherwise skip spaces, and then move to start of word&lt;br /&gt;
      IF XXDATA[CH.PTR-1,1] # SPACE THEN&lt;br /&gt;
         LOOP&lt;br /&gt;
         UNTIL XXDATA[CH.PTR-1,1] = SPACE OR CH.PTR = 1 DO&lt;br /&gt;
            CH.PTR = CH.PTR - 1&lt;br /&gt;
            CP = CP - 1&lt;br /&gt;
         REPEAT&lt;br /&gt;
      END ELSE&lt;br /&gt;
         * Skip spaces&lt;br /&gt;
         LOOP&lt;br /&gt;
         UNTIL XXDATA[CH.PTR-1,1] # SPACE OR CH.PTR = 1 DO&lt;br /&gt;
            CH.PTR = CH.PTR - 1&lt;br /&gt;
            CP = CP - 1&lt;br /&gt;
         REPEAT&lt;br /&gt;
         IF CH.PTR &amp;gt; 1 THEN&lt;br /&gt;
            * At word end - move to start of word&lt;br /&gt;
            LOOP&lt;br /&gt;
            UNTIL XXDATA[CH.PTR-1,1] = SPACE OR CH.PTR = 1 DO&lt;br /&gt;
               CH.PTR = CH.PTR - 1&lt;br /&gt;
               CP = CP - 1&lt;br /&gt;
            REPEAT&lt;br /&gt;
         END&lt;br /&gt;
      END&lt;br /&gt;
      IF CP &amp;lt; 0 THEN&lt;br /&gt;
         CP = 0&lt;br /&gt;
         POS = CH.PTR&lt;br /&gt;
         PRINT BASE:XXDATA[POS,DISP.LEN] MASK:&lt;br /&gt;
      END&lt;br /&gt;
   END&lt;br /&gt;
RETURN&lt;br /&gt;
&lt;br /&gt;
DEL.TO.END:&lt;br /&gt;
   * Delete from cursor to end of line&lt;br /&gt;
   IF CH.PTR = 1 THEN&lt;br /&gt;
      XXDATA = &amp;#039;&amp;#039;&lt;br /&gt;
      CP = 0&lt;br /&gt;
      POS = 1&lt;br /&gt;
   END ELSE&lt;br /&gt;
      XXDATA = XXDATA[1,CH.PTR-1]&lt;br /&gt;
   END&lt;br /&gt;
   CURR.LEN = LEN(XXDATA)&lt;br /&gt;
   PRINT BASE:XXDATA[POS,DISP.LEN] MASK:&lt;br /&gt;
RETURN&lt;br /&gt;
&lt;br /&gt;
DELETE.WORD:&lt;br /&gt;
   * Delete to space at right of cursor&lt;br /&gt;
   IF CH.PTR &amp;gt;= CURR.LEN THEN&lt;br /&gt;
      PRINT BEEP:&lt;br /&gt;
   END ELSE&lt;br /&gt;
      C = CH.PTR&lt;br /&gt;
      LOOP&lt;br /&gt;
         C = C + 1&lt;br /&gt;
      UNTIL XXDATA[C,1] = SPACE OR C = CURR.LEN DO&lt;br /&gt;
      REPEAT&lt;br /&gt;
      XXDATA = XXDATA[1,CH.PTR-1]:XXDATA[C+1,CURR.LEN]&lt;br /&gt;
      CURR.LEN = CURR.LEN - C + CH.PTR - 1&lt;br /&gt;
      PRINT BASE:XXDATA[POS,DISP.LEN] MASK:&lt;br /&gt;
   END&lt;br /&gt;
RETURN&lt;br /&gt;
&lt;br /&gt;
GO.BEGIN:&lt;br /&gt;
   * Go to the start of data and redisplay&lt;br /&gt;
   CP = 0&lt;br /&gt;
   CH.PTR = 1&lt;br /&gt;
   POS = 1&lt;br /&gt;
   PRINT BASE:XXDATA MASK:&lt;br /&gt;
RETURN&lt;br /&gt;
&lt;br /&gt;
GO.END:&lt;br /&gt;
   * Move to the end of data and redisplay&lt;br /&gt;
   IF XXDATA[CURR.LEN,1] # SPACE THEN&lt;br /&gt;
      XXDATA = XXDATA:SPACE&lt;br /&gt;
      CURR.LEN = CURR.LEN + 1&lt;br /&gt;
   END&lt;br /&gt;
   IF CURR.LEN &amp;lt; DISP.LEN THEN&lt;br /&gt;
      CP = CURR.LEN - 1&lt;br /&gt;
      POS = 1&lt;br /&gt;
   END ELSE&lt;br /&gt;
      CP = DISP.LEN - 1&lt;br /&gt;
      POS = CURR.LEN - DISP.LEN + 1&lt;br /&gt;
   END&lt;br /&gt;
   CH.PTR = CURR.LEN&lt;br /&gt;
   PRINT BASE:XXDATA[POS,DISP.LEN] MASK:&lt;br /&gt;
RETURN&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;/div&gt;</summary>
		<author><name>Conversion script</name></author>
	</entry>
</feed>