@X @~
~V7 56 2 -5
~D10
~H                    MUSS
~
~
~D10
~H             EDT041
~D10
~MMANCHESTER UNIVERSITY  -  CONFIDENTIAL
~
~
                                                           ISSUE 11~
~V9 -1
~P
~V9 1
~YEDT041
~Y
~V9 -1
~P
~V9 -1
~D15
~HFLOWCHARTS
~
~
~H                EDT041
~V9 -1
~F
@TITLE EDT04(1,9)
@COL 1S-2R-3R-4R-5R-6F
@FLOW 1-2-3-4-5-6
@BOX 1.0
XEDIT
@BOX 4.0
PROCEDURES IN MODULE
   1 EDIT
   2 VEDIT
@BOX 6.0
END
@BOX 1.1
   #EDT04/1
MODULE (edIT,vedIT,PW0,PW1,PW2,PW3,PW4,PW5,PW6,PWW1,PWW2);
*GLOBAL 5;
$AD PW0,PW1,PW2,PW3,PW4,PW5,PW6;
$LO64 PWW1,PWW2;
*GLOBAL 0;
@BOX 4.1
LSPEC VEDIT(ADDR [LOGICAL8], INTEGER, INTEGER, INTEGER)/ INTEGER;
LSPEC EDIT (ADDR [LOGICAL8], ADDR [LOGICAL8], $IN);
   #EDT04.2
   #EDT04.1
@BOX 6.1
*END
@END
@TITLE EDT04/1(1,11)
@COL 1S-2R-3R-4R
@FLOW 1-2-3-4
@BOX 1.0
EXTERNAL ENVIRONMENT
@BOX 1.1
:: EXTERNAL ENVIRONMENT
@BOX 4.1
LSPEC READ.FILE.STATUS (ADDR [LOGICAL8], LOGICAL64);
LSPEC PROCESS.NAME (ADDR [LOGICAL8]) / ADDR [LOGICAL8];
LSPEC CHANGE.CHANNEL(INTEGER,INTEGER,LOGICAL);
LSPEC CURRENT.INPUT () / INTEGER;
LSPEC CURRENT.OUTPUT () / INTEGER;
LSPEC DEFINE.INPUT (INTEGER, ADDR [LOGICAL8], INTEGER32) / INTEGER;
LSPEC DEFINE.IO (INTEGER, ADDR [LOGICAL8], INTEGER32, INTEGER32) / INTEGER;
LSPEC END.INPUT (INTEGER, INTEGER);
LSPEC END.OUTPUT (INTEGER, INTEGER);
LSPEC SELECT.INPUT (INTEGER);
LSPEC SELECT.OUTPUT (INTEGER);
LSPEC OUT.FN (ADDR [LOGICAL8]);
LSPEC CAPTION (ADDR [LOGICAL8]);
LSPEC BREAKOUTPUT($IN);
LSPEC ENTER.TRAP (INTEGER, INTEGER);
LSPEC BREAK.INPUT (INTEGER);
LSPEC NEXTCH () / INTEGER;
LSPEC INCH () / INTEGER;
LSPEC OUTCH (INTEGER);
LSPEC I.ENQ () / INTEGER;
LSPEC I.SIZE  () / INTEGER32;
LSPEC LIB07.CURRENT.FILE.AVAILABLE () / INTEGER;
LSPEC IN.I () / ADDR;
LSPEC IN.BACKSPACE (INTEGER);
LSPEC OUT.I (INTEGER32, INTEGER);
LSPEC PROMPT (ADDR [LOGICAL8]);
LSPEC I.POS () / INTEGER32;
LSPEC O.POS () / INTEGER32;
LSPEC SET.I.POS (INTEGER32);
LSPEC SET.O.POS (INTEGER32);
LSPEC OUT.BACKSPACE (INTEGER);
LSPEC I.MODE () / INTEGER32;
LSPEC SKIP.LINE ();
LSPEC NEWLINES (INTEGER);
LSPEC ISOURCE (ADDR[$IN]);
LSPEC READCH (INTEGER)/LOGICAL16;
LSPEC IN.STR (ADDR [LOGICAL8]) / INTEGER;
@END
@TITLE EDT04.1(1,11)
@COL 1S-2R-3R-4R-5R-6R-7R-8F
@FLOW 1-2-3-4-5-6-7-8
@BOX 1.0
EDIT (INPUT, OUTFILE, DEVICE)

SUB-PROCEDURES
   1 PROCESS EDIT COMMANDS
   2 READ POSITION PARAMETER
   3 MATCH STRING
   4 SAVE POINTERS
   5 RESET POINTERS
   6 CONFIRM
   7 READ STRING CHARACTER
   8 FIND
   9 MONITOR
   10 VIEW
@BOX 2.0
REMEMBER CURRENT INPUT AND
OUTPUT STREAM NUMBERS
@BOX 3.0
ASSIGN INPUT AND OUTPUT
DOCUMENTS TO STREAMS
INITIALISE INPUT PAGE/LINE COUNTS
@BOX 4.0
DETERMINE WHETHER OPERATION
IS ONLINE OR OFFLINE
@BOX 5.0
PROCESS XEDIT COMMANDS
#EDT04.1.1
@BOX 6.0
END INPUT AND OUTPUT STREAMS
AND SELECT ORIGINAL STREAMS
@BOX 7.0
MONITOR SUCCESSFUL COMPLETION
OR SIGNAL ERROR
@BOX 8.0
END
@BOX 1.1
PROC EDIT (INFILE, OUTFILE, DEVICE);
INTEGER CMIN, CMOUT, EIN, EOUT, ONLINE, ERROR,
   LINE.NO, PAGE.NO, S.LINE.NO, S.PAGE.NO, REP.LEVEL, REP.LIMIT;
INTEGER32 SI.POS, SO.POS, STR.SIZE;
LITERAL / INTEGER MAX.REP.LEVEL = 5, EOF = %1C;
LOGICAL8 [1] PR;
DATAVEC PRMT (LOGICAL8)
   "->"
END
DATAVEC DUMMY (LOGICAL8)
   0
END
TYPE REP.STKEL IS
   INTEGER LIMIT, COUNT
   INTEGER32 POS;
REP.STKEL [MAX.REP.LEVEL] REP.STACK;

PSPEC READ.POS () / INTEGER32;
PSPEC MATCH.STRING (INTEGER);
PSPEC SAVE.POINTERS ();
PSPEC RESET.POINTERS ();
PSPEC COPY.FOR (INTEGER32) / INTEGER;
PSPEC SKIP.FOR (INTEGER32) / INTEGER;
PSPEC COPY.TO.STR (ADDR [LOGICAL8], INTEGER) / INTEGER;
PSPEC SKIP.TO.STR (ADDR [LOGICAL8], INTEGER) / INTEGER;
PSPEC VIEW ();
PSPEC CONFIRM ();
PSPEC IN.STR.CH (INTEGER) / INTEGER;
PSPEC FIND (ADDR [LOGICAL8], INTEGER) / INTEGER;
PSPEC MONITOR (INTEGER);
   #EDT04.1.2
   #EDT04.1.3
   #EDT04.1.4
   #EDT04.1.5
   #EDT04.1.6
   #EDT04.1.7
   #EDT04.1.8
   #EDT04.1.9
   #EDT04.1.10
   #EDT04.1.11
   #EDT04.1.12
   #EDT04.1.13
   #EDT04.1.14
@BOX 2.1
CURRENT.INPUT () => CMIN;
CURRENT.OUTPUT () => CMOUT;
@BOX 3.1
DEFINE.INPUT (-1, INFILE, %14) => EIN;
SELECT.INPUT (EIN);
IF I.SIZE()*3->>1 => STR.SIZE < %10000 THEN
   %10000 => STR.SIZE;
FI
DEFINE.IO (-1, OUTFILE, %40, STR.SIZE) => EOUT;
SELECT.INPUT (CMIN);
1 => LINE.NO => PAGE.NO;
@BOX 4.1
I.MODE () & %80 => ONLINE;
@BOX 5.1
:: PROCESS EDIT COMMANDS
#EDT04.1.1
@BOX 6.1
END.INPUT (EIN, 0);
END.OUTPUT (EOUT, ERROR);
SELECT.INPUT (CMIN);
SELECT.OUTPUT (CMOUT);
@BOX 7.1
IF ERROR >= 0 THEN
   OUT.FN (OUTFILE);
   CAPTION (%" OK$L")
ELSE
   IF ERROR /= -2 THEN
      ENTER.TRAP (7, 1);
   FI
FI
@BOX 8.1
END
@END
@TITLE EDT04.1.1(1,9)
@COL 1S-2R-3R-4R-5T-6R-7T-8T-9R
@COL 10R-11F
@ROW 6-10
@ROW 9-11
@FLOW 1-2-3-4-5OK-6-7NO-8ONLINE-9-4
@FLOW 5INVALID-10-8
@FLOW 8OFFLINE-11
@FLOW 7YES-4
@BOX 1.0
PROCESS EDIT COMMANDS
@BOX 2.0
SAVE INITIAL POINTERS
[EDT04.1.4]
@BOX 3.0
INITIALISE STACK FOR
REPETITIVE EDITS
@BOX 4.0
SELECT COMMAND INPUT
AND OUTPUT STREAMS
@BOX 5.0
READ NON-BLANK CHARACTER AND
CHECK FOR VALID COMMAND
@BOX 6.0
SELECT APPROPRIATE COMMAND
   . R(ESTORE)
   . A(FTER)
   . B(EFORE)
   . D(ELETE)
   1 S(KIP)
   2 C(OPY)
   3 I(NSERT)
   4 W(INDOW)
   5 E(XIT)
   6 Q(UIT)
   7 M(ERGE)
   8 (
   9 )
   10 V(IEW)
@BOX 7.0
COMMAND COMPLETED OK?
@BOX 8.0
ONLINE OR OFFLINE?
@BOX 9.0
DELETE CURRENT INPUT SECTION
@BOX 10.0
MONITOR COMMAND ERROR
@BOX 11.0
END
@BOX 1.1
:: PROCESS EDIT COMMANDS
BEGIN
INTEGER CH, CMD;
INTEGER32 COUNT;
@BOX 2.1
SAVE.POINTERS ();
@BOX 3.1
0 => REP.LEVEL;
-1 => REP.LIMIT;
@BOX 4.1
0 => ERROR;
SELECT.INPUT (CMIN);
SELECT.OUTPUT (CMOUT);
PROMPT (^PRMT);
@BOX 5.1
WHILE IN.CH () => CH =< " " DO OD
IF FIND (%"RrAaBbDdSsCcIiWwEeQqMm(())Vv", CH) / 2 => CMD < 0
@BOX 6.1
ALTERNATIVE CMD FROM
   RESET.POINTERS ();
   MATCH.STRING (CMD);
   MATCH.STRING (CMD);
   MATCH.STRING (CMD);
   #EDT04.1.1.1
   #EDT04.1.1.2
   #EDT04.1.1.3
   #EDT04.1.1.4
   #EDT04.1.1.5
   #EDT04.1.1.6
   #EDT04.1.1.7
   #EDT04.1.1.8
   #EDT04.1.1.9
   VIEW();
END
@BOX 7.1
IF ERROR = 0 AND CMD /= 8
@BOX 8.1
IF ONLINE = 0
@BOX 9.1
BREAK.INPUT (CMIN);
@BOX 10.1
MONITOR (0);
@BOX 11.1
END
@END
@TITLE EDT04.1.1.1(1,11)
@COL 20N-6R-7R-21N
@COL 1S-2T-12T-3T-4R-11R-22N-5F
@COL 8R-10R
@ROW 6-4
@ROW 20-12-8
@ROW 21-22
@FLOW 1-2NO-12NO-3NO-4-11-22-5
@FLOW 12YES-20-21-22
@FLOW 3YES-6-7-11
@FLOW 2YES-8-10-11
@BOX 1.0
SKIP COMMAND
@BOX 2.0
PAGE/LINE POSITIONING
SPECIFIED?[EDT04.1.2]
@BOX 3.0
END OF FILE SPECIFIED?
@BOX 4.0
MATCH STRING (SKIP)
[EDT04.1.3]
@BOX 5.0
END
@BOX 6.0
REQUEST CONFIRMATION
[EDT04.1.6]
@BOX 7.0
IF CONFIRMED,
DISCARD INPUT
@BOX 8.0
SELECT INPUT FILE AND
SAVE CURRENT POSITION
[EDT04.1.4]
@BOX 10.0
SKIP TO POSITION,
MONITOR ERROR AND
RESET POINTERS IF
NOT AT REQUIRED
POSITION
@BOX 11.0
MONITOR LARGE SKIP
@BOX 12.0
ERROR?
@BOX 1.1
:: SKIP COMMAND
BEGIN
INTEGER32 R.POS;
@BOX 2.1
IF READPOS () => R.POS >= 0
@BOX 3.1
IF NEXT.CH () => CH = "F"
   OR CH = "f"
@BOX 4.1
MATCH.STRING (CMD);
@BOX 5.1
END
@BOX 6.1
IN.CH ();
CONFIRM ();
@BOX 7.1
IF ERROR = 0 THEN
   SAVE.POINTERS ();
   SKIP.FOR (%10000!EOF);
FI
@BOX 8.1
SAVE.POINTERS ();
@BOX 10.1
IF SKIP.FOR (R.POS&%FFFF0000!'$P) = 0 THEN
   IF SKIP.FOR (R.POS<<-16!'$L) = 0,->ON10;
FI
MONITOR (1);
RESET.POINTERS ();
ON10:
@BOX 11.1
SELECT.OUTPUT (CMOUT);
OUTCH("$L");
OUT.I (I.POS () - SI.POS, 0);
CAPTION (%" CHARACTERS SKIPPED$L");
@BOX 12.1
IF ERROR < 0
@END

@TITLE EDT04.1.1.2(1,11)
@COL 6R-7R
@COL 1S-2T-12T-3T-4R-5F
@COL 8R-10R
@ROW 6-4
@ROW 12-8
@ROW 3-10
@FLOW 1-2NO-12NO-3NO-4-5
@FLOW 12YES-5
@FLOW 2YES-8-10-5
@FLOW 3YES-6-7-5
@BOX 1.0
COPY COMMAND
@BOX 2.0
PAGE/LINE POSITIONING
SPECIFIED?[EDT04.1.2]
@BOX 3.0
END OF FILE SPECIFIED?
@BOX 4.0
MATCH STRING (COPY)
[EDT04.1.3]
@BOX 5.0
END
@BOX 6.0
SELECT INPUT AND
OUTPUT FILES AND
SAVE CURRENT POSITION
[EDT04.1.4]
@BOX 7.0
COPY TO END
OF INPUT FILE
@BOX 8.0
SELECT INPUT AND
OUTPUT FILES AND
SAVE CURRENT POSITION
[EDT04.1.4]
@BOX 10.0
COPY TO POSITION
MONITOR ERROR AND
RESET POINTERS IF
NOT AT REQUIRED
POSITION
@BOX 12.0
ERROR?
@BOX 1.1
:: COPY COMMAND
BEGIN
INTEGER32 R.POS;
@BOX 2.1
IF READ.POS () => R.POS >= 0
@BOX 3.1
IF NEXT.CH () => CH = "F"
   OR CH = "f"
@BOX 4.1
MATCH.STRING (CMD);
@BOX 5.1
END
@BOX 6.1
IN.CH ();
SAVE.POINTERS ();
@BOX 7.1
COPY.FOR (%10000 ! EOF);
@BOX 8.1
SAVE.POINTERS ();
@BOX 10.1
IF COPY.FOR (R.POS&%FFFF0000!'$P) = 0 THEN
   IF COPY.FOR (R.POS<<-16!'$L) = 0,->ONC10;
FI
MONITOR (1);
RESET.POINTERS ();
ONC10:
@BOX 12.1
IF ERROR < 0
@END

@TITLE EDT04.1.1.3(1,9)

@COL 1S-2T-3R-4F
@COL 5R
@ROW 3-5
@FLOW 1-2YES-3-4
@FLOW 2NO-5-4
@BOX 1.0
INSERT COMMAND
@BOX 2.0
STRING DELIMITER OK?
@BOX 3.0
INSERT CHARACTERS UP TO
MATCHING DELIMITER
@BOX 4.0
END
@BOX 5.0
ILLEGAL STRING DELIMITER
@BOX 1.1
:: INSERT COMMAND
BEGIN
INTEGER DEL, CH;
@BOX 2.1
WHILE IN.CH () => DEL =< " " DO OD
IF DEL >= "A" =< "Z" OR
   DEL >= "a" =< "z"
@BOX 3.1
SELECT.OUTPUT (EOUT);
DEL => PR [0];
PROMPT (^PR);
WHILE IN.STR.CH (DEL) => CH /= DEL AND ERROR = 0 DO
   OUT.CH (CH);
OD
PROMPT (^PRMT);
@BOX 4.1
END
@BOX 5.1
MONITOR (9);
@END
@TITLE EDT04.1.1.4(1,11)
@COL 1S-2R-3R-4R-5R-6R-7R-8F
@FLOW 1-2-3-4-5-6-7-8
@BOX 1.0
WINDOW COMMAND
@BOX 2.0
READ LINE COUNT PARAMETER
@BOX 3.0
SELECT INPUT FILE
@BOX 4.0
OUTPUT PAGE AND LINE
@BOX 5.0
PRINT BEGINNING OF CURRENT LINE
FROM OUTPUT FILE
@BOX 6.0
PRINT CURRENT POSITION MARKER
@BOX 7.0
CONTINUE PRINTING FROM INPUT FILE
@BOX 8.0
END
@BOX 1.1
:: WINDOW COMMAND
BEGIN
INTEGER CH, COUNT, I;
INTEGER32 W.POS;
@BOX 2.1
WHILE NEXT.CH () =< " " /= "$L" DO
   IN.CH ();
OD
IF NEXT.CH () >= "0" =< "9" THEN
   IN.I () => COUNT;
ELSE
   1 => COUNT;
FI
@BOX 3.1
SELECT.INPUT (EIN);
@BOX 4.1
OUTI(PAGE.NO,0);OUTCH(".");
OUTI(LINE.NO,0);NEWLINES(1);
@BOX 5.1
SELECT.INPUT (EOUT);
IF I.ENQ () & %C = 0 THEN
   I.POS () => W.POS;
   IN.CH ();
   IN.BACKSPACE (-1);
   WHILE I.POS () < W.POS DO
      OUT.CH (IN.CH());
   OD
FI
SELECT.INPUT (EIN);
@BOX 6.1
CAPTION (%"~^~");
@BOX 7.1
I.POS () => W.POS;
-1 => I;
WHILE 1 +> I < COUNT AND I.ENQ () & %C = 0 DO
   WHILE IN.CH () => CH /= "$L" /= "$P"  AND I.ENQ () & %C = 0 DO
      OUT.CH (CH);
   OD
   OUT.CH (CH);
OD
SET.I.POS (W.POS);
@BOX 8.1
END
@END
@TITLE EDT04.1.1.5(1,11)
@COL 1S-2T-3R-4R-5R-6F
@COL 7R
@ROW 3-7
@FLOW 1-2EMPTY-3-4-5-6
@FLOW 2ERROR-7-6
@BOX 1.0
EXIT COMMAND
@BOX 2.0
CHECK REPETITION STACK IS EMPTY
@BOX 3.0
SELECT INPUT AND
OUTPUT FILES
@BOX 4.0
COPY REMAINDER OF
INPUT TO OUTPUT
@BOX 5.0
FORCE EXIT
@BOX 6.0
END
@BOX 7.0
MONITOR FAULT
@BOX 1.1
:: EXIT COMMAND
BEGIN
@BOX 2.1
IF REP.LEVEL > 0
@BOX 3.1
SELECT.INPUT (EIN);
SELECT.OUTPUT (EOUT);
@BOX 4.1
COPY.FOR (%10000 ! EOF);
@BOX 5.1
0 => ONLINE;
@BOX 6.1
END
@BOX 7.1
0 => REP.LEVEL;
MONITOR (2);
@END
@TITLE EDT04.1.1.6(1,9)
@COL 1S-2T-3R-4F
@FLOW 1-2OK-3-4
@FLOW 2FAILED-4
@BOX 1.0
QUIT COMMAND
@BOX 2.0
REQUEST CONFIRMATION
[]
@BOX 3.0
FORCE EXIT BY SETTING
ERROR FLAG
@BOX 4.0
END
@BOX 1.1
:: QUIT COMMAND
BEGIN
@BOX 2.1
CONFIRM ();
IF ERROR < 0
@BOX 3.1
-2 => ERROR;
0 => ONLINE;
@BOX 4.1
END
@END
@TITLE EDT04.1.1.7(1,11)

@COL 1S-3R-7R-8T-2T-4R-5R-6F
@COL 9R
@ROW 2-9
@FLOW 1-3-7-8YES-2OK-4-5-6
@FLOW 2FAILED-6
@FLOW 8NO-9-6
@BOX 1.0
MERGE COMMAND
@BOX 2.0
REQUEST CONFIRMATION
@BOX 3.0
READ FILE NAME
@BOX 4.0
ASSIGN FILE TO
EDIT INPUT STREAM
INITIALISE PAGE/LINE COUNTS
@BOX 5.0
SAVE CURRENT POSITION
@BOX 6.0
END
@BOX 7.0
CHECK FILE EXISTS
@BOX 8.0
FILE EXISTS?
@BOX 9.0
FILE DOES NOT EXIST
@BOX 1.1
:: MERGE COMMAND
BEGIN
LOGICAL8 [32] BUF;
ADDR [LOGICAL8] NAME, NAME2;
LITERAL / ADDR [LOGICAL8] NIL.BYTES =;
@BOX 2.1
CONFIRM ();
IF ERROR < 0
@BOX 3.1
PART (^BUF, 0, IN.STR (^BUF) - 1) => NAME;
PROCESS.NAME (NAME) => NAME2;
@BOX 4.1
END.INPUT (EIN, 0);
DEFINE.INPUT (EIN, NAME, %14);
1 => LINE.NO => PAGE.NO;
@BOX 5.1
SAVE.POINTERS ();
@BOX 6.1
END
@BOX 7.1
IF PW1 = 0 THEN
   IF LIB07.CURRENT.FILE.AVAILABLE () = 0 THEN
      -1 => ERROR;
   FI
ELSE
   READ.FILE.STATUS (NAME2, PWW1);
   IF PW0 < 0 THEN
      -1 => ERROR;
   FI
FI
@BOX 8.1
IF ERROR < 0
@BOX 9.1
MONITOR (3);
@END
@TITLE EDT04.1.1.8(1,11)
@COL 1S-2T-3T-4R-5F
@COL 6R
@ROW 4-6
@FLOW 1-2NO-3OK-4-5
@FLOW 2YES-6-5
@FLOW 3FAULTY-6
@BOX 1.0
LEFT PARENTHESIS
@BOX 2.0
REPETITION LIMIT EXCEEDED?
(TOO MANY NESTED LEVELS)
@BOX 3.0
READ REPETITION CONDITION
@BOX 4.0
ADD NEW LEVEL TO
REPETITION STACK
@BOX 5.0
END
@BOX 6.0
ILLEGAL REPETITION
@BOX 1.1
:: LEFT PARENTHESIS
BEGIN
INTEGER CH, CNT, I;
DATAVEC TERM (INTEGER)
256 "$P" "$L"
END
@BOX 2.1
IF REP.LEVEL + 1 >= MAX.REP.LEVEL
@BOX 3.1
IF FIND (%"FfPpLl", NEXT.CH ()) / 2 => I >= 0 THEN
   IN.CH ();
   TERM [I] => CH;
   -1 => CNT;
ELSE
   IF NEXT.CH () >= "0" =< "9" THEN
      -1 => CH;
      IN.I () => CNT;
   ELSE
      0 => CNT;
   FI
FI
IF CNT = 0
@BOX 4.1
REP.LIMIT => LIMIT OF REP.STACK [REP.LEVEL]
SELECT REP.STACK [1 +> REP.LEVEL];
CH => REP.LIMIT;
CNT => COUNT;
I.POS () => POS;
@BOX 5.1
END
@BOX 6.1
MONITOR (4);
@END
@TITLE EDT04.1.1.9(1,11)
@COL 6R
@COL 1S-2T-3T-4R-5F
@COL 7R
@ROW 6-4-7
@FLOW 1-2NO-3NO-4-5
@FLOW 3YES-6-5
@FLOW 2YES-7-5
@BOX 1.0
RIGHT PARENTHESIS
@BOX 2.0
UNMATCHED RIGHT PARENTHESIS?
@BOX 3.0
REPETITION LIMIT REACHED?
@BOX 4.0
RESET TO MATCHING "("
@BOX 5.0
END
@BOX 6.0
UNSTACK INNERMOST
REPETITION LEVEL
@BOX 7.0
MONITOR ERROR
@BOX 1.1
:: RIGHT PARENTHESIS
BEGIN
@BOX 2.1
IF REP.LEVEL =< 0
@BOX 3.1
SELECT REP.STACK [REP.LEVEL];
IF 1 -> COUNT = 0 AND REP.LIMIT < 0
@BOX 4.1
SET.I.POS (POS);
@BOX 5.1
END
@BOX 6.1
LIMIT OF REP.STACK [1 -> REP.LEVEL] => REP.LIMIT;
@BOX 7.1
MONITOR (5);
@END
@TITLE EDT04.1.2(1,11)
@COL 5R-10T-15R-16T-17R-19R
@COL 1S-2R-3T-4T-9R-6F
@COL 11T-7R-8T-14R-18R
@ROW 4-11
@ROW 5-7
@ROW 19-9-18
@FLOW 1-2-3NO-4N-9-6
@FLOW 4YES-5-10Y-15-16Y-17-19-6
@FLOW 3YES-11Y-7-8Y-14-18-6
@FLOW 11
@FLOW 11N-9
@FLOW 8N-18
@FLOW 10N-19
@FLOW 16N-19
@BOX 1.0
READ POS () PAGE/LINE
@BOX 2.0
SKIP OVER BLANK CHARACTERS
@BOX 3.0
IS 1ST NONBLANK CH "+"?
@BOX 4.0
IS CH INTEGER?
@BOX 5.0
READ INTEGER
FORM REL LINE VALUE AND
SET PAGE VALUE ZERO
@BOX 6.0
END
@BOX 7.0
READ INTEGER LINE VALUE
SET PAGE VALUE ZERO
@BOX 8.0
NEXT CH = "."?
@BOX 9.0
SET RESULT NEGATIVE
@BOX 10.0
NEXT CH = "."?
@BOX 11.0
NEXT CH INTEGER?
@BOX 14.0
FORM PAGE VALUE AND
SET LINE VALUE ZERO
@BOX 15.0
FORM REL PAGE VALUE AND
SET LINE VALUE ZERO
@BOX 16.0
NEXT CH INTEGER?
@BOX 17.0
READ INTEGER AND FORM LINE VALUE
@BOX 18.0
SET RESULT TO PAGE/LINE VALS
@BOX 19.0
SET RESULT TO REL PAGE/LINE VALS
@BOX 1.1
PROC READ.POS;
INTEGER CH;
INTEGER32 RVAL, IVAL;
@BOX 2.1
WHILE IN.CH () => CH =< " " DO OD
@BOX 3.1
IF CH = "+"
@BOX 4.1
IN.BACKSPACE(1);
IF CH >= "0" =< "9"
@BOX 5.1
IN.I() - LINE.NO => RVAL;
@BOX 6.1
END
@BOX 7.1
IN.I () => RVAL;
@BOX 8.1
IF NEXT.CH () /= "."
@BOX 9.1
-1 => READ.POS;
@BOX 10.1
IF NEXT.CH() /= "."
@BOX 11.1
IF NEXTCH()=>CH < "0" OR CH > "9"
@BOX 14.1
RVAL <<- 16 => RVAL;
INCH();
@BOX 15.1
R.VAL +LINE.NO - PAGE.NO <<- 16 => RVAL;
INCH();
@BOX 16.1
IF NEXT.CH()=>CH < "0" OR CH > "9"
@BOX 17.1
IN.I() -1 !> RVAL;
@BOX 18.1
RVAL => READ.POS;
@BOX 19.1
IF RVAL < 0 THEN
   0 => RVAL;
FI
RVAL => READ.POS;
@END

@TITLE EDT04.1.3(1,11)
@COL 1S-2T-3T-4R-5T-16R-6T-7R-9R-8R-10N-11F
@COL 13R-17N-12R-14R-15N
@ROW 3-13
@ROW 5-17
@ROW 9-14
@ROW 10-15
@FLOW 1-2NO-3N0-4-5FAIL-16-6REPETITION-7-9-8-10-11
@FLOW 3YES-10
@FLOW 5MATCHED-17-12-15
@FLOW 2YES-13-15-10
@FLOW 6FAULT-14-15
@BOX 1.0
MATCH STRING (CMD)
@BOX 2.0
INVALID STRING DELIMITER?
@BOX 3.0
READ STRING TO BE MATCHED
ERROR IN STRING?
@BOX 4.0
SELECT FILE INPUT AND OUTPUT
AND SAVE CURRENT POSITION
[EDT04.1.4]
@BOX 5.0
SKIP/COPY TO STRING MATCH
[EDT04.1.1.13/14]
@BOX 6.0
FAULY COMMAND, OR
TERMINATION OF REPETITION
@BOX 7.0
SKIP TO INNERMOST ")"
@BOX 8.0
REMOVE INNERMOST LEVEL
FROM REPETITION STACK
@BOX 9.0
PRINT NUMBER OF REPETITIONS
@BOX 11.0
END
@BOX 12.0
ADJUST POINTERS
ACCORDING TO
COMMAND
@BOX 13.0
MONITOR FAULTY COMMAND
@BOX 14.0
MONITOR STRING NOT FOUND
AND RESET POINTERS
@BOX 16.0
SELECT COMMAND INPUT
AND OUTPUT STREAMS
@BOX 1.1
PROC MATCH.STRING (CMD);
LOGICAL8 [128] STRING;
INTEGER STR.LENGTH, DEL, I, RESULT, CH;
ADDR [LOGICAL8] STRING.PTR;
@BOX 2.1
IF IN.CH () => DEL >= "A" =< "Z" OR
   DEL >= "a" =< "z" OR DEL >= '0 =< '9
@BOX 3.1
DEL => PR [0];
PROMPT (^PR);
-1 => STR.LENGTH;
WHILE IN.STR.CH (DEL) => STRING [1 +> STR.LENGTH] /= DEL
   AND STR.LENGTH < 127 DO OD
PROMPT (^PRMT);
IF STRING [STR.LENGTH] /= DEL OR STR.LENGTH = 0 THEN
   MONITOR (8);
FI
IF ERROR < 0
@BOX 4.1
SAVE.POINTERS ();
@BOX 5.1
PART (^STRING, 0, STR.LENGTH - 1) => STRING.PTR;
IF CMD = 4 THEN
   SKIP.TO.STR (STRING.PTR, REP.LIMIT ) => RESULT;
ELSE
   COPY.TO.STR (STRING.PTR, REP.LIMIT) => RESULT;
FI
IF RESULT = 0
@BOX 6.1
IF REP.LIMIT < 0
@BOX 7.1
WHILE IN.CH () /= ")" DO OD
@BOX 8.1
LIMIT OF REP.STACK [1 -> REP.LEVEL] => REP.LIMIT;
@BOX 9.1
CAPTION (%"$L* ");
OUT.I (-1 - COUNT OF REP.STACK [REP.LEVEL], 0);
OUT.CH ("$L");
@BOX 11.1
END
@BOX 12.1
ALTERNATIVE CMD - 1 FROM
   BEGIN
   FOR I < STR.LENGTH DO
      OUT.CH (IN.CH ()=>CH);
      IF CH = '$L THEN
         1 +> LINE.NO;
      ELSE IF CH = '$P THEN
         1 => LINE.NO;1 +> PAGE.NO;
      FI FI
   OD
   END
   0;
   BEGIN
   FOR STR.LENGTH DO
      IN.CH ()=>CH;
      IF CH = '$L THEN
         1+>LINE.NO
      ELSE IF CH = '$P THEN
         1=>LINE.NO;1+>PAGE.NO;
      FI FI
   OD
   END
   BEGIN
      IN.CH ();
      IN.BACKSPACE (-1);
   END
   BEGIN
      IN.CH ();
      IN.BACKSPACE (-1);
      OUT.CH (0);
      OUT.BACKSPACE (-1);
   END
END
@BOX 13.1
MONITOR (9);
@BOX 14.1
MONITOR (10);
RESET.POINTERS ();
@BOX 16.1
SELECT.INPUT (CMIN);
SELECT.OUTPUT (CMOUT);
@END
@TITLE EDT04.1.4(1,11)
@COL 1S-2R-3R-4F
@FLOW 1-2-3-4
@BOX 1.0
SAVE POINTERS ()
@BOX 2.0
SELECT EDIT INPUT
AND OUTPUT STREAMS
@BOX 3.0
SAVE POSITION IN
INPUT AND OUTPUT STREAMS
STORE PAGE/LINE COUNTS
@BOX 4.0
END
@BOX 1.1
PROC SAVE.POINTERS;
@BOX 2.1
SELECT.INPUT (EIN);
SELECT.OUTPUT (EOUT);
@BOX 3.1
I.POS () => SI.POS;
O.POS () => SO.POS;
LINE.NO => S.LINE.NO;
PAGE.NO => S.PAGE.NO;
@BOX 4.1
END
@END
@TITLE EDT04.1.5(1,11)
@COL 1S-2R-5R-3R-4F
@FLOW 1-2-5-3-4
@BOX 1.0
RESET POINTERS ()
@BOX 2.0
SELECT EDIT INPUT
AND OUTPUT STREAMS
@BOX 3.0
RESTORE POSITION IN
INPUT AND OUTPUT STREAMS
RESTORE PAGE/LINE COUNTS
@BOX 4.0
END
@BOX 5.0
NOTE POSITION
@BOX 1.1
PROC RESET.POINTERS;
INTEGER CH;
INTEGER32 COUNT, DUMMY, REQ.POSN;
@BOX 2.1
SELECT.INPUT (EIN);
SELECT.OUTPUT (EOUT);
@BOX 3.1
SET.I.POS (SI.POS);
SET.O.POS (SO.POS);
S.LINE.NO => LINE.NO;
S.PAGE.NO => PAGE.NO;
@BOX 4.1
END
@BOX 5.1
IPOS () => REQ.POSN;
@END
@TITLE EDT04.1.6(1,9)
@COL 1S-2R-3T-4R-5F
@FLOW 1-2-3"Y"-4-5
@FLOW 3OTHER-5
@BOX 1.0
CONFIRM ()
@BOX 2.0
SET PROMPT TO "REALLY?"
@BOX 3.0
READ AND CHECK REPLY
@BOX 4.0
SET 'ERROR' FLAG AND
MONITOR 'ABANDONED'
@BOX 5.0
END
@BOX 1.1
PROC CONFIRM;
INTEGER CH;
@BOX 2.1
PROMPT (%"REALLY? ");
@BOX 3.1
WHILE NEXT.CH () =< " " DO
   IN.CH ();
OD
PROMPT (^PRMT);
IF IN.CH () => CH = "Y" OR CH = "y"
@BOX 4.1
MONITOR (11);
@BOX 5.1
END
@END
@TITLE EDT04.1.7(1,9)
@COL 1S-3T-4T-5R-6F
@FLOW 1-3=DEL-4ESCAPE-5-6
@FLOW 3/=DEL-6
@FLOW 4NOT ESCAPE-6
@BOX 1.0
IN STR CH (DEL) CH
@BOX 3.0
READ CHARACTER AND
COMPARE WITH DELIMITER
@BOX 4.0
CHECK IF NEXT CHARACTER
IS AN ALLOWABLE ESCAPE
@BOX 5.0
SUBSTITUTE APPROPRIATE
ESCAPE CHARACTER
@BOX 6.0
END
@BOX 1.1
PROC IN.STR.CH(DEL);
INTEGER I, J;
@BOX 3.1
IF IN.CH () => IN.STR.CH /= DEL
@BOX 4.1
IF FIND (%"0123456789LlPp", NEXT.CH ()) => I < 0
@BOX 5.1
IN.CH ();
IF I < 10 THEN
   FIND (%"0123456789ABCDEF", IN.CH ()) => J;
   IF J < 0 OR IN.CH () /= DEL THEN
      MONITOR (12);
   ELSE
      I * 16 + J => IN.STR.CH;
   FI
ELSE
   IF IN.CH () /= DEL THEN
      MONITOR (13);
   ELSE
      I & %E => IN.STR.CH; ::ASSUMES ISO CODE
   FI
FI
@BOX 6.1
END
@END
@TITLE EDT04.1.8(1,9)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
FIND (STRING, CH) INDEX
@BOX 2.0
LOCATE CHARACTER IN STRING
RETURNING AN INDEX
RETURN -1 IF NOT FOUND
@BOX 3.0
END
@BOX 1.1
PROC FIND (STRING, CH);
INTEGER STR.SIZE;
@BOX 2.1
SIZE (STRING) => STR.SIZE;
-1 => FIND;
WHILE 1 +> FIND < STR.SIZE AND
   STRING^ [FIND] /= CH DO
OD
IF FIND = STR.SIZE THEN
   -10 => FIND;
FI
@BOX 3.1
END
@END
@TITLE EDT04.1.9(1,9)

@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
MONITOR (ERROR MESSAGE)
@BOX 2.0
OUTPUT ERROR MESSAGE
AND FLAG ERROR
@BOX 3.0
END
@BOX 1.1
PROC MONITOR (ERROR.MESS);
DATAVEC IEC (LOGICAL8)
   "INVALID EDIT COMMAND$L"
END
DATAVEC NF (LOGICAL8)
   "NOT FOUND$L"
END
DATAVEC BM (LOGICAL8)
   "')' MISSING$L"
END
DATAVEC FNA (LOGICAL8)
   "FILE NOT AVAILABLE$L"
END
DATAVEC IR (LOGICAL8)
   "ILLEGAL REPETITION$L"
END
DATAVEC IB (LOGICAL8)
   "INVALID ')'$L"
END
DATAVEC MTO (LOGICAL8)
   "MORE THAN ONE LINE IN REPETITION$L"
END
DATAVEC NE (LOGICAL8)
   "NUMBER EXPECTED$L"
END
DATAVEC ISS (LOGICAL8)
   "ILLEGAL STRING SIZE$L"
END
DATAVEC ISD (LOGICAL8)
   "ILLEGAL STRING DELIMITER$L"
END
DATAVEC SNF (LOGICAL8)
   "STRING NOT FOUND$L"
END
DATAVEC ABN (LOGICAL8)
   "ABANDONED$L"
END
DATAVEC IHP (LOGICAL8)
   "ILLEGAL HEX PAIR$L"
END
DATAVEC DE (LOGICAL8)
   "DELIMITER EXPECTED$L"
END
DATAVEC MNTR (ADDR [LOGICAL8])
   IEC
   NF
   BM
   FNA
   IR
   IB
   MTO
   NE
   ISS
   ISD
   SNF
   ABN
   IHP
   DE
END
@BOX 2.1
SELECT.OUTPUT (CMOUT);
CAPTION (MNTR [ERROR.MESS]);
-1 => ERROR
@BOX 3.1
END
@END

@TITLE EDT04.1.10(1,9)
@COL 1S-2R-3R-4R-5R-24T-11T-12T-6R-26T-27R-28T-7R-8F
@COL 25R-14R-15R-16R
@ROW 11-25
@FLOW 1-2-3-4-5-24N-11N-12N-6-26Y-27-28Y-7-8
@FLOW 11Y-14-16-6
@FLOW 12Y-15-16-6
@FLOW 24Y-25-16
@FLOW 26N-28N-8
@BOX 1.0
VIEW COMMAND
@BOX 2.0
READ LINE COUNT PARAMETER
@BOX 3.0
SET UP TEXT VECTOR
@BOX 4.0
STORE CURRENT I/O POINTERS
@BOX 5.0
COPY SPECIFIED NO OF LINES
TO TEXT VECTOR
@BOX 24.0
END OF BUFFER REACHED?
@BOX 6.0
CALL VECTOR EDITOR
RESET PROMPT ON RETURN
@BOX 7.0
COPY CONTENTS OF TEXT VECTOR
TO OUTPUT STREAM
SEND NEWPAGE AND RESET
SWITCH IF NEWPAGE SWITCH SET
@BOX 8.0
END
@BOX 26.0
REWIND REQD?
@BOX 27.0
RESET POINTERS
@BOX 28.0
OUTPUT TEXT REQD?
@BOX 11.0
STOPPED ON LONG LINE?
@BOX 12.0
STOPPED ON NEWPAGE?
@BOX 25.0
RESET END OF TEXT POINTER
TO START OF LAST LINE
BACKSPACE TO START OF LAST
LINE OF INPUT
MONITOR - VIEWING RESTRICTED TO
@BOX 14.0
RESET END OF TEXT POINTER
TO START OF LAST LINE
MONITOR - LONG LINE AT
@BOX 15.0
SET NEWPAGE SWITCH
MONITOR - NEWPAGE AT
@BOX 16.0
OUTPUT NO OF LINES TO OBSTRUCTION
@BOX 1.1
PROC VIEW;
$IN CH,COUNT,J,BSIZE,I,K,SOW,CURSOR,LASTL,NPSW;
$LO8[3000] TEXTAREA;   ::UNTIL "MAKE" WORKS PROPERLY
$AD[$LO8] TEXT;
$DA ARROW($LO8);
'-'>
END
@BOX 2.1
WHILE NEXTCH() =< " " /= '$L DO
   INCH();
OD
IF NEXTCH() >= "0" =< "9" THEN
   INI() => COUNT;
ELSE
   1 => COUNT;
FI
INCH();
@BOX 3.1
::IF COUNT*80+512=>BSIZE > 3000 THEN
::   3000=>BSIZE;
::FI
::MAKE($LO8,BSIZE) => TEXT;
^TEXTAREA => TEXT;
@BOX 4.1
SAVE.POINTERS();
SELECTOUTPUT(CMOUT);
@BOX 5.1
0 => NPSW;
-1 => J;
FOR K < COUNT DO
   0=> I; J => LASTL;
   WHILE IENQ() & %C = 0 AND INCH()=>TEXT^[1+>J]=>CH /= '$L DO
      IF CH = '$P, -> OUT;
      IF 1+>I=80 OR J >= 2000 THEN
      INBACKSPACE(-1);->OUT;
      FI
   OD
OD
OUT:
@BOX 24.1
IF J >= 2000
@BOX 6.1
SELECT.INPUT(CMIN);
VEDIT(TEXT,J+1,DEVICE,EOUT) => J;
PROMPT(^ARROW);
@BOX 26.1
IF TEXT^[J] /= 1 /= %17
@BOX 27.1
RESET.POINTERS ();
@BOX 28.1
IF TEXT^[J] /= 5 /= 1
@BOX 7.1
IF NPSW /= 0 THEN
   0 => NPSW; '$P => TEXT^[1+>J-1];
FI
PART(TEXT,0,J-1) => TEXT;
SELECTOUTPUT(EOUT);
CAPTION(TEXT);
@BOX 8.1
END
@BOX 11.1
IF I = 80
@BOX 12.1
IF CH = '$P
@BOX 25.1
LASTL => J;
1 -> K;
CAPTION(%"VIEW RESTRICTED TO");
@BOX 14.1
LASTL => J;
CAPTION(%"LONG LINE AT");
@BOX 15.1
1 => NPSW; 1 -> J;
CAPTION(%"NEWPAGE AT");
@BOX 16.1
CAPTION(%" +");
OUTI(K,4);
NEWLINES(1);
@END
@TITLE EDT04.1.11(1,11)
@COL 11T-12R-13R
@COL 1S-2R-3R-4T-5R-6T-14R-7T-8T-9R-10F
@ROW 11-5
@ROW 13-9
@FLOW 1-2-3-4N-5-6Y-14-7N-8Y-9-10
@FLOW 4Y-11Y-12-13-10
@FLOW 11N-13
@FLOW 6N-5
@FLOW 7Y-3
@FLOW 8N-5
@BOX 1.0
COPY.FOR (PAGES/LINES)
@BOX 2.0
SET COUNT AND TEST CHAR
@BOX 3.0
DECREMENT COUNT
@BOX 4.0
COUNT < 0?
@BOX 5.0
READ AND PRINT CHAR
@BOX 6.0
CONTROL CH?
@BOX 14.0
UPDATE PAGE/LINE COUNTS
@BOX 7.0
TEST CH?
@BOX 8.0
END OF FILE?
@BOX 9.0
SET RESULT NEGATIVE
@BOX 10.0
END
@BOX 11.0
WAS TEST CH AN EOF?
@BOX 12.0
BACKSPACE OUTPUT POINTER
BY ONE
@BOX 13.0
SET RESULT ZERO
@BOX 1.1
PROC COPY.FOR (COUNT.CH);
$IN COUNT, TEST.CH, CH;
@BOX 2.1
COUNT.CH & %FFFF => TEST.CH;
COUNT.CH ->> 16 => COUNT;
@BOX 3.1
1 -> COUNT;
@BOX 4.1
IF COUNT < 0
@BOX 5.1
OUTCH(INCH() => CH);
@BOX 6.1
IF CH >= %20
@BOX 14.1
IF CH = '$L THEN
   1 +> LINE.NO;
ELSE IF CH = '$P THEN
   1 => LINE.NO;1 +> PAGE.NO;
FI FI
@BOX 7.1
IF CH = TEST.CH
@BOX 8.1
IF CH /= EOF
@BOX 9.1
IN.BACKSPACE (0);
-1 => COPY.FOR;
@BOX 10.1
END
@BOX 11.1
IF TEST.CH /= EOF
@BOX 12.1
OUTBACKSPACE (1);
INBACKSPACE (0);
@BOX 13.1
0 => COPY.FOR;
@END
@TITLE EDT04.1.12(1,11)
@COL 11R
@COL 1S-2R-3R-4T-5R-6T-14R-7T-8T-9R-10F
@ROW 11-9
@FLOW 1-2-3-4N-5-6Y-14-7N-8Y-9-10
@FLOW 4Y-11-10
@FLOW 6N-5
@FLOW 7Y-3
@FLOW 8N-5
@BOX 1.0
SKIP.FOR (PAGES/LINES)
@BOX 2.0
SET COUNT AND TEST CHAR
@BOX 3.0
DECREMENT COUNT
@BOX 4.0
COUNT < 0?
@BOX 5.0
READ CHAR
@BOX 6.0
CONTROL CH?
@BOX 14.0
UPDATE PAGE/LINE COUNTS
@BOX 7.0
TEST CH?
@BOX 8.0
END OF FILE?
@BOX 9.0
SET RESULT NEGATIVE
@BOX 10.0
END
@BOX 11.0
SET RESULT ZERO
@BOX 1.1
PROC SKIP.FOR (COUNT.CH);
$IN COUNT, TEST.CH, CH;
@BOX 2.1
COUNT.CH & %FFFF => TEST.CH;
COUNT.CH ->> 16 => COUNT;
@BOX 3.1
1 -> COUNT;
@BOX 4.1
IF COUNT < 0
@BOX 5.1
INCH() => CH;
@BOX 6.1
IF CH >= %20
@BOX 14.1
IF CH = '$L THEN
   1 +> LINE.NO;
ELSE IF CH = '$P THEN
   1 => LINE.NO;1 +> PAGE.NO;
FI FI
@BOX 7.1
IF CH = TEST.CH
@BOX 8.1
IF CH /= EOF
@BOX 9.1
-1 => SKIP.FOR;
@BOX 10.1
IN.BACKSPACE (0);
END
@BOX 11.1
0 => SKIP.FOR;
@END
@TITLE EDT04.1.13(1,11)
@COL 18R
@COL 1S-2T-21N-3R-26N-4R-5T-22R-16T-17T-23T-7R-11T-8R-9T-24T-10T-12R-13R-14F
@COL 19N-25N-6R-20R
@ROW 21-19
@ROW 26-25
@ROW 7-6
@ROW 12-20
@ROW 18-13
@FLOW 1-2N-21-3-26-4-5Y-22-16N-17N-23Y-7-11N-8-9N-24N-10Y-11Y-12-13-14
@FLOW 2Y-13
@FLOW 9Y-13
@FLOW 10N-20-19-21
@FLOW 16Y-13
@FLOW 5N-23N-6-25-26
@FLOW 17Y-18-14
@FLOW 24Y-18
@BOX 1.0
COPY.TO.STR (STRING, TERMINATOR)
@BOX 2.0
NULL STRING?
@BOX 3.0
NOTE FIRST CH IN STRING
@BOX 4.0
READ CH FROM INPUT
@BOX 5.0
IS CH TERMINATOR OR CONTROL CH OR
SAME AS FIRST IN STRING?
@BOX 6.0
OUTPUT CH
@BOX 7.0
NOTE INPUT POINTER
@BOX 8.0
READ NEXT CH FROM INPUT
@BOX 9.0
TERMINATOR?
@BOX 10.0
SAME AS NEXT IN STRING?
@BOX 11.0
END OF STRING?
@BOX 12.0
RESET INPUT POINTER TO
START OF STRING
@BOX 13.0
SET RESULT ZERO
@BOX 14.0
END
@BOX 22.0
UPDATE PAGE/LINE COUNTS
@BOX 16.0
TERMINATOR?
@BOX 23.0
SAME AS FIRST IN STRING?
@BOX 17.0
EOF?
@BOX 18.0
SET RESULT NEGATIVE
@BOX 20.0
RESET INPUT POINTER
@BOX 24.0
EOF?
@BOX 1.1
PROC COPY.TO.STR(CHSTR, TERM.CH);
$IN PTR, CH, STR.CH, STR.SIZE;
$IN32 IPTR;
@BOX 2.1
IF SIZE(CHSTR) => STR.SIZE = 0
@BOX 3.1
0 => PTR;
CHSTR^[0] => STR.CH;
@BOX 4.1
INCH() => CH;
@BOX 5.1
IF CH /= TERM.CH >= %20
@BOX 6.1
OUTCH(CH);
@BOX 7.1
IPOS() - 1 => IPTR;
@BOX 8.1
INCH() => CH;
@BOX 9.1
IF CH = TERM.CH
@BOX 10.1
IF CH /= CHSTR^[1+>PTR]
@BOX 11.1
IF PTR + 1 = STR.SIZE
@BOX 12.1
SET.IPOS(IPTR);
@BOX 13.1
0 => COPY.TO.STR;
@BOX 14.1
END
@BOX 22.1
IF CH = '$L THEN
   1 +> LINE.NO;
ELSE IF CH = '$P THEN
   1 => LINE.NO;1 +> PAGE.NO;
FI FI
@BOX 16.1
IF CH = TERM.CH
@BOX 23.1
IF CH /= STR.CH
@BOX 17.1
IF CH = EOF
@BOX 18.1
IN.BACKSPACE (0);
-1 => COPY.TO.STR;
@BOX 20.1
SET.IPOS(IPTR);
OUTCH (INCH ());
@BOX 24.1
IF CH = EOF
@END
@TITLE EDT04.1.14(1,11)
@COL 18R
@COL 1S-2T-21N-3R-4R-5T-22R-16T-17T-23T-7R-11T-8R-9T-24T-10T-12R-13R-14F
@COL 19N-20R
@ROW 21-19
@ROW 12-20
@ROW 18-13
@FLOW 1-2N-21-3-4-5N-23N-4
@FLOW 5Y-22-16N-17N-23Y-7-11N-8-9N-24N-10Y-11Y-12-13-14
@FLOW 2Y-13
@FLOW 9Y-13
@FLOW 10N-20-19-21
@FLOW 16Y-13
@FLOW 17Y-18-14
@FLOW 24Y-18
@BOX 1.0
SKIP.TO.STR (STRING, TERMINATOR)
@BOX 2.0
NULL STRING?
@BOX 3.0
NOTE FIRST CH IN STRING
@BOX 4.0
READ CH FROM INPUT
@BOX 5.0
IS CH TERMINATOR OR CONTROL CH?
@BOX 22.0
UPDATE PAGE/LINE COUNTS
@BOX 7.0
NOTE INPUT POINTER
@BOX 8.0
READ NEXT CH FROM INPUT
@BOX 9.0
TERMINATOR?
@BOX 10.0
SAME AS NEXT IN STRING?
@BOX 11.0
END OF STRING?
@BOX 12.0
RESET INPUT POINTER TO
START OF STRING
@BOX 13.0
SET RESULT ZERO
@BOX 14.0
END
@BOX 16.0
TERMINATOR?
@BOX 23.0
SAME AS FIRST IN STRING?
@BOX 17.0
EOF?
@BOX 18.0
SET RESULT NEGATIVE
@BOX 20.0
RESET INPUT POINTER
@BOX 24.0
EOF?
@BOX 1.1
PROC SKIP.TO.STR(CHSTR, TERM.CH);
$IN PTR, CH, STR.CH, STR.SIZE;
$IN32 IPTR;
@BOX 2.1
IF SIZE(CHSTR) => STR.SIZE = 0
@BOX 3.1
0 => PTR;
CHSTR^[0] => STR.CH;
@BOX 4.1
INCH() => CH;
@BOX 5.1
IF CH /= TERM.CH >= %20
@BOX 22.1
IF CH = '$L THEN
   1 +> LINE.NO;
ELSE IF CH = '$P THEN
   1 => LINE.NO;1 +> PAGE.NO;
FI FI
@BOX 7.1
IPOS() => IPTR;
@BOX 8.1
INCH() => CH;
@BOX 9.1
IF CH = TERM.CH
@BOX 10.1
IF CH /= CHSTR^[1+>PTR]
@BOX 11.1
IF PTR + 1 = STR.SIZE
@BOX 12.1
SET.IPOS(IPTR-1);
@BOX 13.1
0 => SKIP.TO.STR;
@BOX 14.1
END
@BOX 16.1
IF CH = TERM.CH
@BOX 23.1
IF CH /= STR.CH
@BOX 17.1
IF CH = EOF
@BOX 18.1
IN.BACKSPACE (0);
-1 => SKIP.TO.STR;
@BOX 20.1
SET.IPOS(IPTR);
@BOX 24.1
IF CH = EOF
@END
@TITLE EDT04.2(1,11)
@COL 16C-42T-17R-40T-18R-11C-12R-13R
@COL 1S-2R-4R-5R-3N-6R-22T-23T-24R-25R-26C-30T-27R-7C-20R-21R-32R-8F
@COL 14C-19R-33T-34R-15R-9C-10R-28C-29R
@ROW 11-7-28
@ROW 23-14
@ROW 16-25
@FLOW 1-2-4-5-3-6-22Y-23Y-24-25IGNORED-3
@FLOW 9-10-30N-27-3
@FLOW 30Y-3
@FLOW 42Y-3
@FLOW 7-20-21-32-8
@FLOW 11-12-13-30
@FLOW 40Y-13
@FLOW 22N-14-19-33Y-34-15-30
@FLOW 33N-15
@FLOW 16-42N-17-40N-18-30
@FLOW 23N-25
@FLOW 28-29-30
@FLOW 26-30
@BOX 1.0
VECTOR EDITOR(TEXT AREA,
   SIZE,DEVICE,OVERFLOW)
@BOX 2.0
COPY TEXT TO END OF VECTOR
SET START OF WINDOW POINTER
SET START OF TEXT POINTER
SET LINE POINTER AND COUNT
@BOX 4.0
CHANGE CURRENT STREAM
TO DIRECT ACCESS
SET PROMPT TO NULL
@BOX 5.0
SEND THE FIRST 22 LINES OF
TEXT TO THE SCREEN
[EDT04.2.3]
SET CURSOR TO START OF WINDOW
@BOX 6.0
READ CHAR
@BOX 7.0
END
EDIT
@BOX 8.0
END
@BOX 9.0
MOVE
@BOX 10.0
MOVE CURSOR RIGHT, LEFT,
UP OR DOWN [EDT04.2.1]
SET CURSOR MOVES
OUTSTANDING
@BOX 11.0
DELETE
LINE
@BOX 12.0
INCREMENT CURSOR FRONT
UNTIL AFTER NEXT NEWLINE
OR END OF TEXT
@BOX 13.0
SET DELETION SWITCH
SET STATUS TO CAUSE
REFRESH FROM CURRENT LINE
@BOX 14.0
NEWLINE
@BOX 15.0
REPLACE CHARACTER [EDT04.2.2]
@BOX 16.0
DELETE
CHAR
@BOX 17.0
INCREMENT CURSOR FRONT
@BOX 18.0
SET DELETION SWITCH
SET STATUS TO CAUSE
REFRESH CURRENT LINE
@BOX 19.0
ECHO CHAR
@BOX 20.0
RESTORE CURRENT STREAM
TO ORIGINAL MODE
@BOX 21.0
COPY ALL TEXT TO START OF TA
ENSURE TEXT ENDS WITH NEWLINE
FOLLOWED BY TERMINATION CHAR
(E,Z,A,W)
@BOX 22.0
CONTROL CHAR?
@BOX 23.0
ANY INSERTIONS OR DELETIONS JUST
BEEN MADE?
@BOX 24.0
UPDATE SCREEN[EDT04.2.1.3]
@BOX 25.0
SWITCH ON CONTROL
FUNCTION
@BOX 26.0
COMMAND
RETURN
@BOX 27.0
REFRESH SCREEN AND CURSOR ACCORDING
TO REFRESH STATUS INFORMATION
@BOX 28.0
INSERT
@BOX 29.0
INSERT A SPACE IN FRONT
OF THE CURSOR AND
SET REFRESH CURRENT LINE STATUS
@BOX 30.0
ANY MORE CHARS
TO PROCESS?
@BOX 32.0
SET RESULT TO SIZE OF TEXT
@BOX 33.0
ANY CURSOR MOVEMENTS
OUTSTANDING?
@BOX 34.0
MOVE CURSOR AND
RESET SWITCH
@BOX 40.0
IS CH NEWLINE?
@BOX 42.0
END OF TEXT?
@BOX 1.1
PROC VEDIT(TA,TSIZE,DEV,OFLOW);
$IN SOT,I,J,CH,LPOS,LCT,INSDEL,TEMP,SOW;
$IN SOWLCT,CB,CF,COMOUT,EPTR,CMO;
$IN RWLCT,RLINE,DVNO,LAST.CH.SW,STRMD;
$LI/$AD[$LO8] NULL=;
$LI LAST.MARK=%100;
$IN[4] SRC;
$AD[$LO8] CODES,OFTEXT;
#EDT04.2/1
@BOX 2.1
SIZE(TA) - 1 => CF => EPTR;
WHILE TSIZE > 0 DO
   TA^[1->TSIZE] => TA^[1->CF];
OD
-1 => CB;
0 => LPOS => INSDEL => SOT;
0 => SOW => CMO => LAST.CH.SW;
23 => LCT => SOWLCT;
@BOX 4.1
CURRENT.OUTPUT() => COMOUT;
ISOURCE(^SRC);
CHANGE.CHANNEL(SRC[0],0,%209D);
PW1 => DVNO;
PW2 => STRMD;
WAIT(-1,1);
PROMPT(NULL);
@BOX 5.1
BREAKOUTPUT(COMOUT);
REFRESH.WINDOW(1);
@BOX 6.1
IGN:
IF LAST.CH.SW /= 0 THEN
   BREAKOUTPUT(-1);
FI
READCH(DVNO);
PW1=>CH&LAST.MARK=>LAST.CH.SW;
%FF &> CH;
@BOX 7.1
ENDED:
@BOX 8.1
END
@BOX 9.1
::MOVECURSOR
@BOX 10.1
#EDT04.2.1
1 => CMO;
@BOX 11.1
DELINE:
@BOX 12.1
WHILE CF < EPTR AND TA^[1+>CF-1]=>
CH /= '$L DO OD
@BOX 13.1
1 => INSDEL;
IF LCT < RWLCT THEN
   LCT => RWLCT;
FI
@BOX 14.1
CHAR:
@BOX 15.1
#EDT04.2.2
@BOX 16.1
DELCH:
@BOX 17.1
1 +> CF;
@BOX 18.1
LCT => RLINE;
@BOX 19.1
OUTCH(CH);
@BOX 20.1
23 => LCT;0 => LPOS;
SENDCURS();
WAIT(-1,1);
CHANGE.CHANNEL(SRC[0],1,STRMD);
BREAKOUTPUT(COMOUT);
@BOX 21.1
CB => J;
CF -1 => I;
WHILE 1+>I < EPTR DO
   TA^[I] => TA^[1+>J];
OD
IF TA^[J] /= '$L THEN
   '$L => TA^[1+>J];
FI
CH => TA^[1+>J];
@BOX 22.1
IF CH >= %20
@BOX 23.1
IF INSDEL = 0
@BOX 24.1
UPDATE.SCREEN();
@BOX 25.1
CODETYPE[DEV] => CODES;
DECODE:
FOR I < 13 DO
   IF CH = CODES^[I], -> OUT;
OD
-> IGN;
OUT:
SWITCH I \ ESCSEQ, CURSF, ENDED, CURSUP,
CURSD, CURSB, DELINE, DELCH,CHAR,INSERT,
ENDED,ENDED,ENDED;
ESCSEQ:
READCH(DVNO);  ::SHOULD BE "["
READCH(DVNO);
PW1 & %FF - 'A => CH;
IF CH & %FC /= 0, ->IGN;
SWITCH CH \ CURSUP,CURSD,CURSF,CURSB;
@BOX 26.1
CMD.RET:
@BOX 27.1
UPDATE.SCREEN();
@BOX 28.1
INSERT:
@BOX 29.1
" " => TA^[1->CF];
LCT => RLINE;
@BOX 30.1
IF LAST.CH.SW = 0
@BOX 32.1
J => VEDIT;
@BOX 33.1
IF CMO = 0
@BOX 34.1
SEND.CURS();
@BOX 40.1
IF TA^[CF-1] = '$L
@BOX 42.1
IF CF = EPTR
@END
@TITLE EDT04.2/1(1,9)
@COL 1S-2F
@BOX 1.0
DECLARATIONS
@BOX 2.0
END
@BOX 1.1
$PS SENDCURS();
$PR SENDCURS;
0 => CMO;
IF DEV /= 0 THEN
   OUTCH(%16);
   OUTCH(LPOS+%20);
   OUTCH(LCT+%20);
ELSE
   OUTCH(%1B);OUTCH('[);
   OUTI(LCT+1,0);OUTCH(";");OUTI(LPOS+1,0);
   OUTCH('H);
FI
BREAKOUTPUT(COMOUT);
END
$LI/$LO8 MR=%19,MU=%1C,MD=%1D,ML=%8;
$DA CCODES0($LO8)
%1B MR 5 MU MD ML %18 4 %A %12 1 %1A %17
END
$DA CCODES1($LO8)
%1B %10 5 %15 %19 %F %18 4 %A %12 1 %1A %17
END
$DA ECODES($LO8)
%1B 'C %5 'A 'B 'D 'M 'P %A %1B %1B %1B %1B
END
$DA SMODE($LO8)
%1B '] %53 %1B '\
END
$DA RMODE($LO8)
%1B '] %52 %1B '\
END
$DA CODETYPE($AD[$LO8])
CCODES0 CCODES1
END
$DA SEMODE($AD[$LO8])
SMODE SMODE
END
$DA RESETMODE($AD[$LO8])
RMODE RMODE
END
$DA NEWBCLEAR($LO8)
%1F
END
$DA ANSICLEAR($LO8)
%1B '[ %32 'J
END
$DA CLEAR($AD[$LO8])
ANSICLEAR NEWBCLEAR
END
$DA NEWBDLINE($LO8)
%19
END
$DA ANSIDLINE($LO8)
%1B '[ 'K
END
$DA DLINE($AD[$LO8])
ANSIDLINE NEWBDLINE
END
#EDT04.2.4
#EDT04.2.3
#EDT04.2.1.1
#EDT04.2.1.2
#EDT04.2.1.3
@BOX 2.1
::END
@END
@TITLE EDT04.2.1(1,9)
@COL 1S-3T-4R-5T-6R-26N-7C-30T-8R-9R-10T-11R
@COL 12R-13R-25N-14F
@COL 15C-16T-17R-18T-19R-27N-21C-31T-22R-23R-20T-24R
@ROW 12-19
@ROW 7-21
@ROW 11-25
@FLOW 1-3N-4-5Y-6-26-25-14
@FLOW 7-30N-8-9-10N-11-14
@FLOW 10Y-25
@FLOW 15-16N-17-18Y-19-27-25-14
@FLOW 21-31N-22-23-20Y-25
@FLOW 18N-12-25
@FLOW 5N-13-25
@FLOW 3Y-26
@FLOW 16Y-27
@FLOW 20N-24-14
@FLOW 30Y-25
@FLOW 31Y-25
@BOX 1.0
MOVE
LEFT
@BOX 3.0
ALREADY AT START OF TEXT?
@BOX 4.0
COPY PREVIOUS CHAR FROM END
OF NEW TEXT TO START OF OLD TEXT.
DECREMENT CURSOR POINTERS.
@BOX 5.0
WAS IT A NEWLINE?
@BOX 6.0
MOVE CURSOR UP ONE AND
ALONG TO END OF LINE
SET NEWLINE POSITION [EDT04.2.1.2]
@BOX 7.0
MOVE
UP
@BOX 8.0
REMEMBER CURRENT LINE POSITION
@BOX 9.0
COPY BACKWARDS FROM END OF
NEW TEXT TO START OF OLD TEXT
UNTIL NEWLINE OR START OF TEXT
DECREMENTING LINE POSITION
SET CURSOR POINTERS TO NEW POSITION
@BOX 10.0
START OF TEXT?
@BOX 11.0
MOVE CURSOR UP AND ON TO
ORIGINAL LINE POSITION OR NEWLINE
COPY BACKWARDS FROM
END OF NEW TEXT TO START OF
OLD UNTIL ORIGINAL LINE POSITION
SET NEW CURSOR POINTER VALUES
[EDT04.2.1.2]
@BOX 12.0
INCREMENT LINE POSITION
@BOX 13.0
DECREMENT LINE POSITION
@BOX 14.0
END
@BOX 15.0
MOVE
RIGHT
@BOX 16.0
ALREADY AT END?
@BOX 17.0
COPY NEXT CHAR FROM OLD TO
NEW TEXT AREA AND INCREMENT
CURSOR POINTERS
@BOX 18.0
WAS IT A NEWLINE?
@BOX 19.0
MOVE CURSOR DOWN ONE
AND TO START OF LINE
RESET LINE POS
[EDT04.2.1.1]
@BOX 21.0
MOVE
DOWN
@BOX 22.0
REMEMBER CURRENT
LINE POSITION
@BOX 23.0
COPY TEXT FROM OLD TO
NEW TEXT AREA UNTIL NEWLINE
OR END OF TEXT
INCREMENTING CURSOR POINTERS
AND LINE POSITION
@BOX 20.0
END OF TEXT
@BOX 24.0
MOVE CURSOR DOWN TO
NEXT LINE [EDT04.2.1.1]
@BOX 30.0
ALREADY AT START?
@BOX 31.0
ALREADY AT START?
@BOX 1.1
CURSB:
@BOX 3.1
IF CB < SOT
@BOX 4.1
TA^[CB] => TA^[1->CF] => CH;
1 -> CB;
@BOX 5.1
IF CH /= '$L
@BOX 6.1
MOVEUP(1000);
@BOX 7.1
CURSUP:
@BOX 30.1
IF CB < SOT
@BOX 8.1
LPOS => TEMP;
@BOX 9.1
WHILE CB >= SOT AND TA^[1->CB+1] => CH
=> TA^[1->CF] /= '$L DO
1 -> LPOS;
OD
@BOX 10.1
IF CH /= '$L
@BOX 11.1
MOVEUP(TEMP);
@BOX 12.1
1 +> LPOS;
@BOX 13.1
1 -> LPOS;
::END
@BOX 15.1
CURSF:
@BOX 16.1
IF CF = EPTR
@BOX 17.1
TA^[CF] => CH => TA^[1+>CB];
1 +> CF;
@BOX 18.1
IF CH /= '$L
@BOX 19.1
MOVEDOWN(0);
@BOX 21.1
CURSD:
@BOX 31.1
IF CF = EPTR
@BOX 22.1
LPOS => TEMP;
@BOX 23.1
WHILE CF < EPTR AND TA^[1 +> CF -1] =>
TA^[1+>CB]=>CH /= '$L DO
   1 +> LPOS
OD
@BOX 20.1
IF CH /= '$L
@BOX 24.1
MOVEDOWN(TEMP);
@END
@TITLE EDT04.2.1.1(1,9)
@COL 1S-2T-3R-4R-5R-7F
@COL 10R-11T-12R-13R
@ROW 3-10
@FLOW 1-2N-3-4-5-7
@FLOW 2Y-10-11Y-12-4
@FLOW 11N-13-4
@BOX 1.0
MOVE DOWN ONE (POSITION)
@BOX 2.0
LAST LINE ON SCREEN?
@BOX 3.0
INCREMENT LINE COUNT
@BOX 4.0
COPY FROM OLD TO NEW
TEXT AREA UP TO SPECIFIED
POSITION NEWLINE OR END OF TEXT
INCREMENTING CURSOR POINTERS
@BOX 5.0
NOTE NEW POSITION
@BOX 7.0
END
@BOX 10.0
FORCE NEWLINE
SET LINE POS ZERO
REFRESH LINE[EDT04.2.4]
@BOX 11.0
FIRST LINE OF TEXT
AT TOP OF SCREEN?
@BOX 12.0
MOVE START OF WINDOW ON
BY ONE LINE IN TEXT AREA
@BOX 13.0
DECREMENT LINE COUNT
FOR START OF WINDOW
@BOX 1.1
$PS MOVEDOWN($IN);
$PR MOVEDOWN(POS);
$IN I;
$AD[$LO8]STR;
@BOX 2.1
IF LCT = 23
@BOX 3.1
1 +> LCT;
@BOX 4.1
-1 => I;
WHILE 1+>I < POS AND CF < EPTR DO
   IF TA^[CF] => CH = '$L, ->OUT;
   CH => TA^[1+>CB];1 +>CF;
OD
OUT:
@BOX 5.1
I => LPOS;
@BOX 7.1
END
@BOX 10.1
NEWLINES(1);
0 => LPOS;
REFRESH.LINE(0);
@BOX 11.1
IF SOWLCT > 0
@BOX 12.1
WHILE TA^[1+>SOW] /= '$L DO OD
@BOX 13.1
1 -> SOWLCT;
@END
@TITLE EDT04.2.1.2(1,9)
@COL 9R
@COL 1S-3R-2T-4T-5R-6R-8F
@COL 10R
@ROW 4-10
@ROW 9-5
@FLOW 1-3-2N-4Y-5-6-8
@FLOW 2Y-10-4N-9-8
@BOX 1.0
UP ONE (POSITION)
@BOX 2.0
DECREMENT LINE COUNT
AND TEST IF
CURSOR AT TOP
OF SCREEN
@BOX 3.0
COUNT NO OF CHARS
IN PREVIOUS LINE
@BOX 4.0
COUNT > SPECIFIED POSITION?
@BOX 5.0
COPY BACKWARDS FROM END
OF NEW TEXT TO START OF OLD
UNTIL SPECIFIED POSITION OR
START OF TEXT
@BOX 6.0
SET NEW LINE POSITION
@BOX 8.0
END
@BOX 9.0
SET LINE POSITION TO COUNT
@BOX 10.0
MOVE START OF WINDOW TO
ONE LINE EARLIER IN TEXT
SET STATUS TO CAUSE REFRESH
FROM CURRENT LINE
@BOX 1.1
$PS MOVEUP($IN);
$PR MOVEUP(POS);
$IN I,COUNT;
$AD[$LO8] STR;
@BOX 2.1
IF 1 -> LCT < 0
@BOX 3.1
CB+1 => I;
WHILE 1->I >= SOT AND TA^[I] /= '$L DO OD
CB -I => COUNT;
@BOX 4.1
IF COUNT =< POS
@BOX 5.1
POS +> I;
WHILE CB >= SOT > I DO
   TA^[1->CB+1] => TA^[1->CF];
OD
@BOX 6.1
POS => LPOS;
@BOX 8.1
END
@BOX 9.1
COUNT => LPOS;
@BOX 10.1
WHILE TA^[1->SOW] /= '$L DO OD
IF LCT < RWLCT THEN
   LCT => RWLCT;
FI
@END
@TITLE EDT04.2.1.3(1,9)
@COL 1S-2R-3T-5R-6R-4R-7R-8F
@COL 9T-10T-11R-12R-13R
@ROW 4-9
@FLOW 1-2-3Y-5-6-4-7-8
@FLOW 3N-9Y-10Y-11-12-13-7
@FLOW 9N-7
@FLOW 10N-12-13
@BOX 1.0
UPDATE SCREEN
@BOX 2.0
REMEMBER CURSOR POSITION
@BOX 3.0
WINDOW REQD?
@BOX 4.0
RESTORE CURSOR POINTERS
@BOX 5.0
RESET TEXT POINTERS TO
START OF SPECIFIED LINE
@BOX 6.0
REFRESH WINDOW[EDT04.2.3]
@BOX 7.0
REPOSITION CURSOR
RESET STATUS
SET NO CURSOR MOVES
OUTSTANDING
@BOX 8.0
END
@BOX 9.0
LINE REFRESH REQD?
@BOX 10.0
NEXT LINE?
@BOX 11.0
MOVE TEXT POINTERS TO START OF NEXT LINE
@BOX 12.0
REFRESH LINE[EDT04.2.4]
@BOX 13.0
RESTORE CURSOR POINTERS
@BOX 1.1
$PS UPDATE.SCREEN();
$PR UPDATE.SCREEN;
$IN RLCT,RLPOS,RCB;
@BOX 2.1
LCT => RLCT;LPOS => RLPOS;
CB => RCB;
@BOX 3.1
IF RWLCT > 23
@BOX 4.1
WHILE CB < RCB DO
   TA^[1+>CF-1] => TA^[1+>CB];
OD
@BOX 5.1
FOR LCT-RWLCT DO
WHILE TA^[1->CB+1]=>TA^[1->CF] /= '$L DO OD
OD
@BOX 6.1
IF RWLCT=>LCT < 0 THEN
   0 => LCT;
FI
REFRESH.WINDOW(0);
@BOX 7.1
IF RLCT=>LCT < 0 THEN
   0 => LCT;
FI
RLPOS=>LPOS;
SENDCURS();
@BOX 8.1
END
@BOX 9.1
IF RLINE > 23
@BOX 10.1
IF RLINE = LCT
@BOX 11.1
WHILE TA^[1+>CF-1]=>TA^[1+>CB] /= '$L DO OD
1+>LCT;
@BOX 12.1
REFRESH.LINE(0);
@BOX 13.1
WHILE CB > RCB DO
   TA^[1->CB+1] => TA^[1->CF];
OD
@END
@TITLE EDT04.2.2(1,9)
@COL 10R-11R
@COL 1S-9T-3T-12T-2R-4R-5R-14T-20R-6F
@COL 7R-16T-17T-18R-19R-15R
@ROW 2-7
@ROW 10-3
@FLOW 1-9N-3N-12N-2-4-5-14N-20-6
@FLOW 3Y-7-16N-17Y-18-19-15-6
@FLOW 14Y-6
@FLOW 16Y-15
@FLOW 17N-19
@FLOW 12Y-7
@FLOW 9Y-10-11-3
@BOX 1.0
INSERT CHARACTER
@BOX 2.0
ADD CHARACTER TO END OF
NEW TEXT AREA
INCREMENT CURSOR BACK POINTER
@BOX 3.0
NEWLINE?
@BOX 4.0
INCREMENT LINE POSITION
@BOX 5.0
SET INSERTION FLAG
@BOX 14.0
IS CHAR TO BE REPLACED
A NEWLINE OR CURSOR FRONT
AT END OF BUFFER?
@BOX 20.0
MOVE PAST NEXT CHAR
@BOX 6.0
END
@BOX 7.0
RESET INSERTION FLAG
ADD NEWLINE TO END
OF NEW TEXT AREA
@BOX 12.0
LAST CHAR POSN
IN LINE?
@BOX 16.0
LAST LINE ON SCREEN?
@BOX 17.0
HAS FIRST LINE MOVED OFF SCREEN?
@BOX 18.0
SET START OF WINDOW LINE COUNT ZERO
MOVE START OF WINDOW POINTERS ON ONE LINE
@BOX 19.0
DECREMENT LINE COUNT
@BOX 15.0
SET STATUS TO CAUSE REFRESH
WINDOW FROM THIS LINE
INCREMENT LINE COUNT
SET LINE POS ZERO
@BOX 9.0
TEXT AREA FULL?
@BOX 10.0
SEND ALL TEXT UP TO
CURRENT LINE TO SPECIFIED
OUTPUT OVERFLOW
@BOX 11.0
RESELECT VDU OUTPUT
REPOSITION CURSOR
@BOX 1.1
::CHARACTER REPLACEMENT
@BOX 2.1
CH => TA^[1+>CB];
@BOX 3.1
IF CH = '$L
@BOX 4.1
1 +> LPOS;
@BOX 5.1
1 => INSDEL;
@BOX 14.1
IF TA^[CF] = '$L OR CF = EPTR
@BOX 20.1
1 +> CF;
@BOX 6.1
::END
@BOX 7.1
0  => INSDEL;
'$L => TA^[1+>CB];
@BOX 12.1
IF LPOS = 78
@BOX 16.1
IF LCT < 23
@BOX 17.1
IF 1->SOWLCT >= 0
@BOX 18.1
0 => SOWLCT;
WHILE TA^[1+>SOW] /= '$L DO OD
@BOX 19.1
1 -> LCT;
@BOX 15.1
IF LCT < RWLCT THEN
   LCT => RWLCT;
FI
1 +> LCT;
0 => LPOS;
@BOX 9.1
IF CF-CB = 1
@BOX 10.1
WHILE TA^[1->CB+1] /= '$L DO OD
SELECT.OUTPUT(OFLOW);
PART(TA,0,1+>CB=>I) => OFTEXT;
CAPTION(OFTEXT);
@BOX 11.1
CB => I; 0 => SOW;
SELECT.OUTPUT(COMOUT);
-1 => CB; LCT => SOWLCT;
WHILE 1 +> I < CF DO
   TA^[I] => TA^[1+>CB];
OD
@END
@TITLE EDT04.2.3(1,9)
@COL 12N-2T-4T-8R
@COL 1S-16R-17R-18R-19N-15R-3T-7T-5R-14T-6R-9R-10R-11F
@ROW 12-19
@ROW 2-7
@FLOW 1-16-17-18-19-15-3N-7N-5-14Y-6-7Y-10-11
@FLOW 3Y-2N-4N-8-12-19
@FLOW 14N-9-19
@FLOW 2Y-10
@FLOW 4Y-10
@BOX 1.0
REFRESH WINDOW(MODE)
@BOX 3.0
INITIAL REFRESH?
@BOX 5.0
MOVE CURSOR AND POINTERS
TO START OF NEXT LINE
@BOX 6.0
CLEAR LINE
@BOX 2.0
TOP OF SCREEN?
@BOX 4.0
END OF TEXT?
@BOX 8.0
DECREMENT LINE NO FOR
CURSOR START OF WINDOW
@BOX 7.0
WINDOW FULL?
@BOX 14.0
END OF TEXT?
@BOX 15.0
REFRESH LINE [EDT04.2.4]
@BOX 9.0
PLANT NEWLINE IN TEXT AREA
@BOX 10.0
RESTORE CURSOR, POINTER, LINE POSITION AND NO
RESET REFRESH WINDOW STATUS
@BOX 11.0
END
@BOX 16.0
REMEMBER CURRENT POSITION
@BOX 17.0
COPY TEXT FROM END OF NEW
AREA TO START OF OLD UNTIL
START OF LINE OR TEXT
DECREMENTING CURSOR POINTERS
@BOX 18.0
RESET INSERTION FLAG
SEND CURSOR TO NEW POSITION
@BOX 1.1
$PS REFRESH.WINDOW($IN);
$PR REFRESH.WINDOW(MODE);
$IN CBS,CLPOS,CLCT;
@BOX 3.1
IF MODE /= 0
@BOX 5.1
OUTCH('$L);
1 +> LCT;0 => LPOS;
@BOX 6.1
CAPTION(DLINE[DEV]);
@BOX 2.1
IF SOWLCT => CLCT = 1
@BOX 4.1
IF CF = EPTR
@BOX 8.1
1 -> SOWLCT;
OUTCH('$L => TA^[1+>CB]);
1+>CF;0=>LPOS;
@BOX 7.1
IF LCT = 23
@BOX 14.1
IF CF < EPTR
@BOX 15.1
REFRESH.LINE(1);
@BOX 9.1
'$L => TA^[1+>CB];
1+>CF;
@BOX 10.1
WHILE CB > CBS DO
   TA^[1->CB+1] => TA^[1->CF];
OD
CLPOS => LPOS;CLCT => LCT;
24 => RWLCT;
SENDCURS();
@BOX 11.1
END
@BOX 16.1
CB => CBS;
LPOS => CLPOS;LCT => CLCT;
@BOX 17.1
WHILE CB >= SOT AND TA^[CB] /= '$L DO
   TA^[1->CB+1] => TA^[1->CF];
OD
@BOX 18.1
0 => LPOS  => INSDEL;
SENDCURS();
@END
@TITLE EDT04.2.4(1,9)
@COL 1S-2R-3R-4R-8T-9R-7T-5R-6F
@FLOW 1-2-3-4-8N-9-7Y-5-6
@FLOW 8Y-7N-6
@BOX 1.0
REFRESH LINE(MODE)
@BOX 2.0
RESET REFRESH LINE STATUS
REMEMBER CURRENT LINE POSITION
SKIP BACK TO START OF LINE
DECREMENT CURSOR POINTERS
@BOX 3.0
SEND CURSOR
TO START OF LINE
@BOX 4.0
OUTPUT LINE CURTAILING
IF TOO LONG
@BOX 8.0
LINE CURTAILED?
@BOX 9.0
RESET INSERTION FLAG
@BOX 7.0
RETURNING TO ORIGINAL
POSITION
@BOX 5.0
RESTORE CURSOR AND CURSOR
POINTERS TO ORIGINAL POSITION
@BOX 6.0
END
@BOX 1.1
$PS REFRESH.LINE($IN);
$PR REFRESH.LINE(MODE);
$IN CH, CBPOS, CFPOS, CLPOS;
@BOX 2.1
24 => RLINE;
LPOS => CLPOS;
WHILE CB >= SOT AND TA^[CB] =>CH /= '$L DO
   1->CB;CH => TA^[1->CF];
OD
@BOX 3.1
0 => LPOS;
SENDCURS();
@BOX 4.1
WHILE CF < EPTR AND TA^[CF]=>CH /= '$L DO
   IF 1+>LPOS = 80 THEN
      '$L => TA^[1->CF];79 => LPOS; ->OUT;
   ELSE
   OUTCH(CH=>TA^[1+>CB]);
   1+>CF;
   FI
OD
OUT:
CAPTION(DLINE[DEV]);
BREAKOUTPUT(COMOUT);
@BOX 8.1
IF LPOS = 79
@BOX 9.1
0 => INSDEL;
@BOX 7.1
IF MODE /= 0
@BOX 5.1
CLPOS -> LPOS;
FOR LPOS DO
   TA^[1->CB+1] => TA^[1->CF];
OD
CLPOS => LPOS;
SENDCURS();
@BOX 6.1
END
@END

