home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / basic / spl / preditor.sp < prev    next >
Text File  |  1988-04-06  |  22KB  |  703 lines

  1. BEGIN
  2.      { Preditor : Program editor }
  3.  
  4.      { This program is written in The Structured Programming Language.
  5.      You need to obtain the Structured Programming Language processor
  6.      and process this program with it. A BASIC program will result and
  7.      you will need to sort the program using SORT.EXE and then compile
  8.      the program using any BASIC compiler. This program will run on
  9.      MSDOS, PCDOS, or where there is compiled BASIC, such as on AMIGA,
  10.      MACINTOSH, ATARI ST. You first must translate the program on MSDOS
  11.      or PCDOS. You can obtain the Structured Programming Language from
  12.      PC SIG at 800 245 6717, ask for DISK 666.
  13.      Softdisk at 800 831 2694, ask for BIG BLUE DISK issue #16.
  14.      Public Brand Software at 800 426 3475, ask for DISK BA-9.
  15.      You can also get file SPLLIB.ARC from bbs systems at 800 632 7227,
  16.      516 561 6590, and 516 334 8221. SPL is also known as file SPL.ARC
  17.      and can be gotten from bbs systems at 800 365 6262 and 800 323 7464.
  18.      This program PREDITOR and The Structured Programming Language are
  19.      both shareware. Certainly if you use the SPL processor to create
  20.      a running program out of PREDITOR, then you should register both
  21.      The SPL processor and this program, PREDITOR if you use them and
  22.      like them. If you have questions, call me, Dennis Baer at work at
  23.      516 694 5872. }
  24.  
  25.      INTEGER Found,                 { Sucessful find }
  26.              I,J,                   { Counters }
  27.              Character_pointer,     { Character pointer }
  28.              Result,                { Result }
  29.              File_open,             { File open }
  30.              Current_line,          { Current line in file }
  31.              Output_mode,           { Output mode }
  32.              LE;                    { Logical end of file }
  33.  
  34.      STRING L,                { File record }
  35.             Change_delimiter, { Delimiter used in the change command. }
  36.             Ifile;            { Input file name. }
  37.  
  38.      INTEGER ARRAY PT(4000);  { Record pointers }
  39.  
  40.      STRING ARRAY OF(4000);  { File records }
  41.  
  42.      PROCEDURE INITIALIZE;   { Initialize file arrays, output messages. }
  43.      BEGIN
  44.           OUTPUT('*** PREDITOR version 1.0 ***');
  45.           OUTPUT('    (c) Dennis Baer 1988');
  46.           OPEN('LPT1:' FOR OUTPUT AS #7);  { Open printer }
  47.           File_open := 0;  { File open set to zero, file not open }
  48.           Change_delimiter := '!'; { Set default change delimiter }
  49.           FOR I := 1 STEP 1 UNTIL 4000 DO
  50.           BEGIN
  51.                PT(I) := 0;  { Set pointer to record as null }
  52.                OF(I) := ''; { Set record null }
  53.           END
  54.      END
  55.  
  56.      INTEGER LOW,HIGH,Low_line,High_line; { Line number variables }
  57.  
  58.      PROCEDURE OUTSCREEN(LOW,HIGH);
  59.      BEGIN
  60.           IF HIGH=0 THEN
  61.           BEGIN
  62.                OUTPUT('<' @ LOW @ '>' @ OF(PT(LOW)));
  63.                Current_line := LOW;
  64.                RETURN;
  65.           END
  66.           FOR I:= LOW STEP 1 UNTIL HIGH DO
  67.           BEGIN
  68.                OUTPUT('<' @ I @ '>' @ OF(PT(I)));
  69.           END
  70.           Current_line := HIGH;
  71.      END
  72.  
  73.      PROCEDURE OUTPRINTER(LOW,HIGH);
  74.      BEGIN
  75.           FOR I:= LOW STEP 1 UNTIL HIGH DO
  76.           BEGIN
  77.                L := OF(PT(I));
  78.                OUTPUT(#7, MID$(L,1,80));
  79.                IF LEN(L) > 80 THEN
  80.                BEGIN
  81.                     L := MID$(L,81); OUTPUT(#7,L);
  82.                END
  83.           END  
  84.           Current_line := HIGH; OUTPUT();
  85.      END
  86.  
  87.      STRING Search_string, Replace_string;
  88.  
  89.      PROCEDURE FIND(Search_string);
  90.      BEGIN
  91.           Found := 0;
  92.           FOR J := Current_line STEP 1 UNTIL LE DO
  93.           BEGIN
  94.                Character_pointer := INSTR( OF(PT(J)), Search_string );
  95.                IF Character_pointer <> 0 THEN
  96.                BEGIN
  97.                     Current_line := J;
  98.                     Found := 1; RETURN;
  99.                END
  100.           END
  101.           Current_line := 1;
  102.      END
  103.  
  104.      PROCEDURE CHANGE(Search_string,Replace_string);
  105.      BEGIN
  106.           STRING Part_1, Part_2, Part_3;
  107.  
  108.           Found := 0;
  109.           Character_pointer := INSTR( OF(PT(Current_line)), Search_string );
  110.           IF Character_pointer = 0 THEN RETURN;
  111.           IF Character_pointer = 1 THEN
  112.           BEGIN
  113.                Part_1 := '';
  114.           END
  115.  
  116.           ELSE
  117.           BEGIN
  118.                Part_1 := LEFT$( OF(PT(Current_line)), Character_pointer-1 );
  119.           END
  120.  
  121.           IF ( Character_pointer - 1 + LEN(Search_string) ) >
  122.              LEN(OF(PT(Current_line))) THEN
  123.           BEGIN
  124.                Part_3 := '';
  125.                Part_2 := Replace_string;
  126.                OF(PT(Current_line)) := Part_1 + Part_2 + Part_3;
  127.                Found := 1;
  128.                OUTSCREEN(Current_line,0);
  129.                RETURN;
  130.           END
  131.  
  132.           ELSE
  133.           BEGIN
  134.                Part_3 := MID$( OF(PT(Current_line)), Character_pointer +
  135.                                                      LEN(Search_string) );
  136.                Part_2 := Replace_string;
  137.                OF(PT(Current_line)) := Part_1 + Part_2 + Part_3;
  138.                Found := 1;
  139.                OUTSCREEN(Current_line,0);
  140.                RETURN;
  141.           END
  142.      END
  143.  
  144.      PROCEDURE DELETE_LINES(LOW,HIGH);
  145.      BEGIN
  146.           INTEGER Temp;
  147.  
  148.           Temp := LOW;
  149.           IF HIGH = 0 THEN HIGH := LOW;
  150.           FOR J := LOW STEP 1 UNTIL HIGH DO
  151.           BEGIN
  152.                OF(PT(J)) := ''; PT(J) := 0;
  153.           END
  154.           IF HIGH < LE THEN
  155.           BEGIN
  156.                FOR J := HIGH + 1 STEP 1 UNTIL LE DO
  157.                BEGIN
  158.                     PT(Temp) := PT(J);
  159.                     PT(J) := 0;
  160.                     Temp := Temp + 1;
  161.                END
  162.           END
  163.           Current_line := 1; LE := LE - (HIGH-LOW+1);
  164.      END
  165.  
  166.      STRING Line;
  167.  
  168.      PROCEDURE INPUTLINE(Line);
  169.      BEGIN
  170.           INTEGER Temp;
  171.  
  172.           FOR I := 1 STEP 1 UNTIL 4000 DO
  173.           BEGIN
  174.                IF OF(I) = '' THEN
  175.                BEGIN
  176.                     Temp := I;
  177.                     GO TO Found_blank;
  178.                END
  179.           END
  180.           Found := 0;
  181.           RETURN;
  182.  
  183. Found_blank:
  184.  
  185.           Found := 1;
  186.           IF PT(1) = 0 THEN
  187.           BEGIN
  188.                Current_line := 1; LE := 1; PT(1) := Temp;
  189.                OF(PT(1)) := Line; RETURN;
  190.           END
  191.  
  192.           FOR I := LE + 1 STEP -1 UNTIL Current_line + 2 DO
  193.           BEGIN
  194.                IF LE = Current_line THEN GO TO Done_shifting;
  195.                PT(I) := PT(I-1);
  196.           END
  197.  
  198. Done_shifting:
  199.  
  200.           PT(Current_line + 1) := Temp; LE := LE + 1;
  201.           OF(PT(Current_line + 1)) := Line;
  202.           Current_line := Current_line + 1;
  203.      END
  204.            
  205.      STRING File; { File name of open file. }
  206.  
  207.      PROCEDURE OPENFILE(File);
  208.      BEGIN
  209.           INTEGER Temp;
  210.  
  211.           IF File_open = 1 THEN
  212.           BEGIN
  213.                Result := 0;
  214.                RETURN;
  215.           END
  216.  
  217.           ONERRGOTO File_open_error;
  218.  
  219.           OPEN( File FOR INPUT AS #1 );
  220.  
  221.           ONERRGOTO File_read_error;
  222.  
  223.           FOR I := 1 STEP 1 UNTIL 4000 DO
  224.           BEGIN
  225.                IF EOF(1) THEN GO TO Success; { End of file. }
  226.                LINEIN( #1,L); { Read record. }
  227.                IF L = '' THEN L := ' '; { Null line set to a blank }
  228.                PT(I) := I; OF(I) := L; Temp := I;
  229.           END
  230.  
  231. Success:  CLOSE(#1); Result := 1; File_open := 1; { Set file open. }
  232.           LE := Temp; Current_line := 1;
  233.           RETURN;
  234.  
  235. File_open_error: Result := 0; OUTPUT('*** Error, opening file: ' @ File @
  236.                                     ' ***');
  237.           RESUME Finish_open;
  238.  
  239. File_read_error: Result := 0; OUTPUT('*** Error, reading file: ' @ File @
  240.                                     ' ***');
  241.           RESUME Finish_open;
  242.  
  243. Finish_open:
  244.  
  245.      END
  246.  
  247.      PROCEDURE SAVEFILE(File);  { Save text file. }
  248.      BEGIN
  249.           { If file is not open and no file name is given
  250.             give error code and return. }
  251.  
  252.           Result := 1; { Assume result is 1, error will change result. }
  253.  
  254.           IF  File_open AND File = ''  THEN
  255.           BEGIN
  256.                Result := 0; RETURN;
  257.           END
  258.  
  259.           IF LE = 0 THEN
  260.           BEGIN
  261.                OUTPUT('File: ' @ File @ ' is empty. ');
  262.                Result := 0; RETURN;
  263.           END
  264.  
  265.           IF File_open = 0 THEN
  266.           BEGIN
  267.                File_open := 1;
  268.                OPEN(File FOR OUTPUT AS #1);
  269.           END
  270.  
  271.           ELSE
  272.           BEGIN
  273.                OPEN(File FOR OUTPUT AS #1);
  274.           END
  275.  
  276.           FOR I := 1 STEP 1 UNTIL LE DO
  277.           BEGIN
  278.                OUTPUT(#1,OF(PT(I)));
  279.           END
  280.           CLOSE(#1);
  281.      END
  282.  
  283.      PROCEDURE CLOSEFILE(File);  { Close text file. }
  284.      BEGIN
  285.           IF File_open = 0 THEN
  286.           BEGIN
  287.                Result := 0; RETURN; { Error, no file is open. }
  288.           END
  289.           SAVEFILE(File); File := ''; { Save the file. }
  290.           IF Result = 0 THEN RETURN;  { Error occurred. }
  291.           File_open := 0; { File closed, no file open, once again. }
  292.  
  293.           FOR I := 1 STEP 1 UNTIL 4000 DO
  294.           BEGIN
  295.                PT(I) := 0; { Nullify pointer to line. }
  296.                OF(I) := ''; { Set line null. }
  297.           END
  298.           LE := 0; { Set logical end to zero, empty file buffer. }
  299.      END
  300.  
  301.      PROCEDURE REGISTER;
  302.      BEGIN
  303.           OUTPUT();
  304.           OUTPUT(
  305.           '*****************************************************************');
  306.           OUTPUT(
  307.           '*  This program PREDITOR has been developed by Dennis Baer.     *');
  308.           OUTPUT(
  309.           '*  If you use this program and you like it then make a pledge   *');
  310.           OUTPUT(
  311.           '*  of $25. Send a post card with your name and address on the   *');
  312.           OUTPUT(
  313.           '*  front and my name and address on the back and write $25 as   *');
  314.           OUTPUT(
  315.           '*  your pledge, also on back. Place this post card in a         *');
  316.           OUTPUT(
  317.           '*  business envelope and mail it to:                            *');
  318.           OUTPUT(
  319.           '*                                                               *');
  320.           OUTPUT(
  321.           '*  Dennis Baer                                                  *');
  322.           OUTPUT(
  323.           '*  25 Miller Road                                               *');
  324.           OUTPUT(
  325.           '*  Farmingdale,New York 11735                                   *');
  326.           OUTPUT(
  327.           '*                                                               *');
  328.           OUTPUT(
  329.           '*  When you receive your post card back, HONOR your pledge and  *');
  330.           OUTPUT(
  331.           '*  make check out for $25 to Dennis Baer. THANK YOU.            *');
  332.           OUTPUT(
  333.           '*  Registered users are entitled to software support.           *');
  334.           OUTPUT(
  335.           '*  Call 516 694 5872                                            *');
  336.           OUTPUT(
  337.           '*****************************************************************');
  338.      END
  339.  
  340.  
  341.      { Main program   }
  342.  
  343.      INITIALIZE;
  344.  
  345.      REGISTER;
  346.  
  347.      Ask:
  348.  
  349.      OUTPUT();
  350.      OUTPUT('Edit'); OUTPUT('>' @);
  351.      LINEIN(Line); { Get an input line }
  352.  
  353.      Remove_space:
  354.  
  355.      IF Line = ' ' OR Line = '' THEN
  356.      BEGIN
  357.           OUTPUT('Error, invalid Edit command '); GO Ask;
  358.      END
  359.  
  360.      IF LEFT$(Line,1) = ' ' THEN  { Remove extra spaces from the left }
  361.      BEGIN
  362.           Line := RIGHT$(Line,LEN(Line)-1); GO Remove_space;
  363.      END
  364.  
  365. { *************************** STOP COMMAND ********************************** }
  366.  
  367.  
  368.      IF Line = 'STOP' OR Line = 'stop' THEN
  369.      BEGIN
  370.           REGISTER;
  371.           STOP;
  372.      END
  373.  
  374. { *************************** SAVE FILE COMMAND ***************************** }
  375.  
  376.  
  377.      IF LEFT$(Line,1) = 'S' OR LEFT$(Line,1) = 's' THEN  { Save file }
  378.      BEGIN
  379.           IF MID$(Line,2,1) <> ' ' THEN
  380.           BEGIN
  381.                OUTPUT('Error, missing space'); GO Ask;
  382.           END
  383.           IF LEN(Line) <= 2 THEN
  384.           BEGIN
  385.                Blank:
  386.  
  387.                OUTPUT('No file name entered.'); GO Ask;
  388.           END
  389.  
  390.           Ifile := RIGHT$(Line,LEN(Line)-2);
  391.           Result := 1; { Assume successful result beforehand }
  392.  
  393.           SAVEFILE(Ifile); { Save file buffer to disk }
  394.  
  395.           IF Result = 0 THEN
  396.           BEGIN
  397.                OUTPUT('Failure to save file ' @ Ifile); GO Ask;
  398.           END
  399.           GO Ask;
  400.      END
  401.  
  402. { *************************** CLOSE FILE COMMAND **************************** }
  403.  
  404.      IF LEFT$(Line,2) = 'CL' OR LEFT$(Line,2) = 'cl' THEN
  405.      BEGIN
  406.           Result := 1;  { Assume successful result at first }
  407.           CLOSEFILE(Ifile);
  408.           IF Result = 0 THEN
  409.           BEGIN
  410.                OUTPUT('Failure to close file ' @ Ifile); GO Ask;
  411.           END
  412.           GO Ask;
  413.      END
  414.  
  415. { *************************** OPEN FILE COMMAND ***************************** }
  416.  
  417.      IF LEFT$(Line,3) = 'OP ' OR LEFT$(Line,3) = 'op ' THEN
  418.      BEGIN
  419.           IF File_open = 1 THEN
  420.           BEGIN
  421.                OUTPUT('File ' @ Ifile @ ' is already open, error.');
  422.                GO Ask;
  423.           END
  424.           Ifile := RIGHT$(Line,LEN(Line)-2);
  425.           IF LEN(Line)<=3 THEN
  426.           BEGIN
  427.                OUTPUT('No file name entered, error.');
  428.                GO Ask;
  429.           END
  430.           Result := 1; { Assume result is 1 }
  431.           OPENFILE(Ifile);
  432.           IF Result = 0 THEN
  433.           BEGIN
  434.                OUTPUT('Failure to open file ' @ Ifile);
  435.                GO Ask;
  436.           END
  437.           GO Ask;
  438.      END
  439.  
  440. { *************************** LIST COMMAND ********************************** }
  441.  
  442.      IF LEFT$(Line,1) = 'L' OR LEFT$(Line,1) = 'l' THEN
  443.      BEGIN
  444.           Output_mode := 0; { Set output mode to list }
  445.           IF Line = 'L' OR Line = 'L ' OR Line = 'l' OR Line = 'l ' THEN
  446.           BEGIN
  447.                Low_line := Current_line; High_line := Current_line;
  448.                GO Check_and_print;
  449.           END
  450.  
  451.           The_rest:
  452.  
  453.           IF MID$(Line,2,1) <> ' ' THEN
  454.           BEGIN
  455.                OUTPUT('Missing space'); GO Ask;
  456.           END
  457.           Line := RIGHT$(Line,LEN(Line)-2);
  458.           Low_line := VAL(Line);
  459.           IF Low_line <= 0 THEN
  460.           BEGIN
  461.                OUTPUT('Invalid low line number'); GO Ask;
  462.           END
  463.           Character_pointer := INSTR(Line,',');
  464.           IF Character_pointer = 0 THEN
  465.           BEGIN
  466.                High_line := Low_line;
  467.                GO Check_and_print;
  468.           END
  469.           IF Character_pointer = LEN(Line) THEN
  470.           BEGIN
  471.                OUTPUT('No high line number entered');
  472.                GO Ask;
  473.           END
  474.           Line := MID$(Line,Character_pointer+1);
  475.           IF Line = '*' THEN
  476.           BEGIN
  477.                High_line := LE;
  478.                GO Check_and_print;
  479.           END
  480.           High_line := VAL(Line);
  481.           IF High_line <=0 THEN
  482.           BEGIN
  483.                OUTPUT('Invalid high line number');
  484.                GO Ask;
  485.           END
  486.  
  487.           Check_and_print:
  488.  
  489.           IF Low_line  > LE  OR
  490.              Low_line  < 1   OR
  491.              High_line > LE  OR
  492.              High_line < 1   THEN
  493.           BEGIN
  494.                OUTPUT('Line number out of bounds');
  495.                GO Ask;
  496.           END
  497.           IF Low_line > High_line THEN
  498.           BEGIN
  499.                OUTPUT('First line number higher than second line number');
  500.                GO Ask;
  501.           END
  502.  
  503.           IF Output_mode = 1 THEN
  504.           BEGIN
  505.                OUTPRINTER(Low_line,High_line); GO Ask;
  506.           END
  507.  
  508.           IF Output_mode = 0 THEN
  509.           BEGIN
  510.                OUTSCREEN(Low_line,High_line); GO Ask;
  511.           END
  512.  
  513.           IF Output_mode = 2 THEN
  514.           BEGIN
  515.                DELETE_LINES(Low_line,High_line); GO Ask;
  516.           END
  517.      END
  518.  
  519. { *************************** TOP COMMAND *********************************** }
  520.  
  521.      IF Line = 'T' OR Line = 't' THEN
  522.      BEGIN
  523.           Current_line := 1;
  524.           OUTPUT('Top');
  525.           GO Ask;
  526.      END
  527.  
  528. { *************************** PRINT COMMAND ********************************* }
  529.  
  530.      IF LEFT$(Line,1) = 'P' OR LEFT$(Line,1) ='p' THEN
  531.      BEGIN
  532.           Output_mode := 1;
  533.           IF Line = 'P' OR Line = 'P ' OR Line = 'p' OR Line = 'p ' THEN
  534.           BEGIN
  535.                High_line := Current_line;
  536.                Low_line := Current_line;
  537.                GO Check_and_print;
  538.           END
  539.  
  540.           ELSE GO TO The_rest;
  541.      END
  542.  
  543. { *************************** DELETE COMMAND ******************************** }
  544.  
  545.      IF LEFT$(Line,1) = 'D' OR LEFT$(Line,1) = 'd' THEN
  546.      BEGIN
  547.           Output_mode := 2;  { delete is mode 2 }
  548.           IF Line = 'D' OR Line ='D ' OR Line = 'd' OR Line = 'd ' THEN
  549.           BEGIN
  550.                Low_line := Current_line;
  551.                High_line := Current_line;
  552.                GO Check_and_print;
  553.           END
  554.  
  555.           ELSE GO TO The_rest;
  556.      END
  557.  
  558. { *************************** CHANGE COMMAND ******************************** }
  559.  
  560.      IF LEFT$(Line,1) = 'C' OR LEFT$(Line,1) = 'c' THEN
  561.      BEGIN
  562.           STRING Search,     { Contains search string }
  563.                  Replace;    { Contains replacement string }
  564.  
  565.           Line := MID$(Line,2);
  566.  
  567.           Strip_blank:
  568.  
  569.           IF LEFT$(Line,1) = ' ' THEN
  570.           BEGIN
  571.                Line := MID$(Line,2);
  572.                GO Strip_blank;
  573.           END
  574.           IF LEFT$(Line,1) <> Change_delimiter THEN
  575.           BEGIN
  576.                OUTPUT('Missing ' @ Change_delimiter);
  577.                GO Ask;
  578.           END
  579.           Search := ''; Line := MID$(Line,2);
  580.           IF LEN(Line) = 0 THEN
  581.           BEGIN
  582.                OUTPUT('Error, search string is null'); GO Ask;
  583.           END
  584.           IF MID$(Line,1,1) = Change_delimiter THEN
  585.           BEGIN
  586.                OUTPUT('Error, no string entered for search');
  587.                GO Ask;
  588.           END
  589.  
  590.           Build:
  591.  
  592.           Search := Search + MID$(Line,1,1); Line := MID$(Line,2);
  593.           IF Line = '' THEN
  594.           BEGIN
  595.                OUTPUT('Missing ' @ Change_delimiter);
  596.                GO Ask;
  597.           END
  598.           IF LEFT$(Line,1) <> Change_delimiter THEN GO Build;
  599.           Replace := MID$(Line,2); { Get replacement string }
  600.           CHANGE(Search,Replace);
  601.           IF Found = 0 THEN
  602.           BEGIN
  603.                OUTPUT('String:' @ Search @ ' not found');
  604.                GO Ask;
  605.           END
  606.           GO Ask;
  607.      END
  608.  
  609. { *************************** FIND COMMAND ********************************** }
  610.  
  611.      IF LEFT$(Line,1) = 'F' OR LEFT$(Line,1) = 'f' THEN
  612.      BEGIN
  613.           STRING Search;  { String to search for }
  614.  
  615.           IF Line = 'F' OR Line = 'F ' OR Line = 'f' OR Line = 'f ' THEN
  616.           BEGIN
  617.                OUTPUT('Missing search string');
  618.                GO Ask;
  619.           END
  620.  
  621.           Line := MID$(Line,2);
  622.  
  623.           Strip:
  624.  
  625.           IF LEFT$(Line,1) = ' ' THEN
  626.           BEGIN
  627.                Line :=MID$(Line,2);
  628.                GO Strip;
  629.           END
  630.  
  631.           IF MID$(Line,1,1) <> Change_delimiter THEN
  632.           BEGIN
  633.                OUTPUT('Missing ' @ Change_delimiter);
  634.                GO Ask;
  635.           END
  636.           Search := ''; Line := MID$(Line,2);
  637.           IF LEN(Line) = 0 THEN
  638.           BEGIN
  639.                OUTPUT('Missing string to be found');
  640.                GO Ask;
  641.           END
  642.           IF MID$(Line,1,1) = Change_delimiter THEN
  643.           BEGIN
  644.                OUTPUT('Error, null search string');
  645.                GO Ask;
  646.           END
  647.  
  648.           Build_1:
  649.  
  650.           Search := Search + MID$(Line,1,1); Line := MID$(Line,2);
  651.           IF Line = '' THEN
  652.           BEGIN
  653.                OUTPUT('Missing ' @ Change_delimiter);
  654.                GO Ask;
  655.           END
  656.           IF LEFT$(Line,1) <> Change_delimiter THEN GO Build_1;
  657.           FIND(Search);
  658.           IF Found := 0 THEN
  659.           BEGIN
  660.                OUTPUT('String: ' @ Search @ ' not found');
  661.                Current_line := 1;
  662.                GO Ask;
  663.           END
  664.           GO Ask;
  665.      END
  666.  
  667. { *************************** BOTTOM COMMAND ******************************** }
  668.  
  669.      IF Line = 'B' OR Line = 'b' THEN
  670.      BEGIN
  671.           Current_line := LE;
  672.           OUTPUT('Bottom at line: ' @ Current_line);
  673.           GO Ask;
  674.      END
  675.  
  676. { *************************** INPUT COMMAND ********************************* }
  677.  
  678.      IF Line = 'I' OR Line = 'i' THEN
  679.      BEGIN
  680.           OUTPUT('Input'); OUTPUT('>' @);
  681.           Line := '';
  682.  
  683.           Inline:
  684.  
  685.           LINEIN(Line);
  686.           IF Line = '' THEN GO Ask;
  687.           INPUTLINE(Line);
  688.           IF Found = 1 THEN
  689.           BEGIN
  690.                OUTPUT('>' @);
  691.                GO Inline;
  692.           END
  693.           OUTPUT('Input stopped, input buffer is full');
  694.           GO Ask;
  695.      END
  696.  
  697.      OUTPUT('Invalid Edit command:' @ Line); GO Ask;
  698.  
  699.      { End of program }
  700.  
  701. END 
  702.  
  703.