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