home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Professional
/
OS2PRO194.ISO
/
os2
/
prgramer
/
spl
/
preditor.sp
< prev
next >
Wrap
Text File
|
1988-05-26
|
22KB
|
692 lines
BEGIN
{ Preditor : Program editor }
{ This program is written in The Structured Programming Language.
You need to obtain the Structured Programming Language processor
and process this program with it. A BASIC program will result and
you will need to sort the program using SORT.EXE and then compile
the program using any BASIC compiler. This program will run on
MSDOS, PCDOS, or where there is compiled BASIC, such as on AMIGA,
MACINTOSH, ATARI ST. You first must translate the program on MSDOS
or PCDOS. You can obtain the Structured Programming Language from
PC SIG at 800 245 6717, ask for DISK 666.
Softdisk at 800 831 2694, ask for BIG BLUE DISK issue #16.
Public Brand Software at 800 426 3475, ask for DISK BA-9.
You can also get file SPLLIB.ARC from bbs systems at 800 632 7227,
516 561 6590, and 516 334 8221. SPL is also known as file SPL.ARC
and can be gotten from bbs systems at 800 365 6262 and 800 323 7464.
This program PREDITOR and The Structured Programming Language are
both shareware. Certainly if you use the SPL processor to create
a running program out of PREDITOR, then you should register both
The SPL processor and this program, PREDITOR if you use them and
like them. If you have questions, call me, Dennis Baer at work at
516 694 5872. }
INTEGER Found, { Sucessful find }
I,J, { Counters }
Character_pointer, { Character pointer }
Result, { Result }
File_open, { File open }
Current_line, { Current line in file }
Output_mode, { Output mode }
LE; { Logical end of file }
STRING L, { File record }
Change_delimiter, { Delimiter used in the change command. }
Ifile; { Input file name. }
INTEGER ARRAY PT(4000); { Record pointers }
STRING ARRAY OF(4000); { File records }
PROCEDURE INITIALIZE; { Initialize file arrays, output messages. }
BEGIN
OUTPUT('*** PREDITOR version 1.0 ***');
OUTPUT(' (c) Dennis Baer 1988');
OPEN('LPT1:' FOR OUTPUT AS #7); { Open printer }
File_open := 0; { File open set to zero, file not open }
Change_delimiter := '!'; { Set default change delimiter }
FOR I := 1 STEP 1 UNTIL 4000 DO
BEGIN
PT(I) := 0; { Set pointer to record as null }
OF(I) := ''; { Set record null }
END
END
è INTEGER LOW,HIGH,Low_line,High_line; { Line number variables }
PROCEDURE OUTSCREEN(LOW,HIGH);
BEGIN
IF HIGH=0 THEN
BEGIN
OUTPUT('<' @ LOW @ '>' @ OF(PT(LOW)));
Current_line := LOW;
RETURN;
END
FOR I:= LOW STEP 1 UNTIL HIGH DO
BEGIN
OUTPUT('<' @ I @ '>' @ OF(PT(I)));
END
Current_line := HIGH;
END
PROCEDURE OUTPRINTER(LOW,HIGH);
BEGIN
FOR I:= LOW STEP 1 UNTIL HIGH DO
BEGIN
L := OF(PT(I));
OUTPUT(#7, MID$(L,1,80));
IF LEN(L) > 80 THEN
BEGIN
L := MID$(L,81); OUTPUT(#7,L);
END
END
Current_line := HIGH; OUTPUT();
END
STRING Search_string, Replace_string;
PROCEDURE FIND(Search_string);
BEGIN
Found := 0;
FOR J := Current_line STEP 1 UNTIL LE DO
BEGIN
Character_pointer := INSTR( OF(PT(J)), Search_string );
IF Character_pointer <> 0 THEN
BEGIN
Current_line := J;
Found := 1; RETURN;
END
END
Current_line := 1;
END
PROCEDURE CHANGE(Search_string,Replace_string);
BEGIN
STRING Part_1, Part_2, Part_3;
Found := 0;
Character_pointer := INSTR( OF(PT(Current_line)), Search_string );
IF Character_pointer = 0 THEN RETURN;è IF Character_pointer = 1 THEN
BEGIN
Part_1 := '';
END
ELSE
BEGIN
Part_1 := LEFT$( OF(PT(Current_line)), Character_pointer-1 );
END
IF ( Character_pointer - 1 + LEN(Search_string) ) >
LEN(OF(PT(Current_line))) THEN
BEGIN
Part_3 := '';
Part_2 := Replace_string;
OF(PT(Current_line)) := Part_1 + Part_2 + Part_3;
Found := 1;
OUTSCREEN(Current_line,0);
RETURN;
END
ELSE
BEGIN
Part_3 := MID$( OF(PT(Current_line)), Character_pointer +
LEN(Search_string) );
Part_2 := Replace_string;
OF(PT(Current_line)) := Part_1 + Part_2 + Part_3;
Found := 1;
OUTSCREEN(Current_line,0);
RETURN;
END
END
PROCEDURE DELETE_LINES(LOW,HIGH);
BEGIN
INTEGER Temp;
Temp := LOW;
IF HIGH = 0 THEN HIGH := LOW;
FOR J := LOW STEP 1 UNTIL HIGH DO
BEGIN
OF(PT(J)) := ''; PT(J) := 0;
END
IF HIGH < LE THEN
BEGIN
FOR J := HIGH + 1 STEP 1 UNTIL LE DO
BEGIN
PT(Temp) := PT(J);
PT(J) := 0;
Temp := Temp + 1;
END
END
Current_line := 1; LE := LE - (HIGH-LOW+1);
END
è STRING Line;
PROCEDURE INPUTLINE(Line);
BEGIN
INTEGER Temp;
FOR I := 1 STEP 1 UNTIL 4000 DO
BEGIN
IF OF(I) = '' THEN
BEGIN
Temp := I;
GO TO Found_blank;
END
END
Found := 0;
RETURN;
Found_blank:
Found := 1;
IF PT(1) = 0 THEN
BEGIN
Current_line := 1; LE := 1; PT(1) := Temp;
OF(PT(1)) := Line; RETURN;
END
FOR I := LE + 1 STEP -1 UNTIL Current_line + 2 DO
BEGIN
IF LE = Current_line THEN GO TO Done_shifting;
PT(I) := PT(I-1);
END
Done_shifting:
PT(Current_line + 1) := Temp; LE := LE + 1;
OF(PT(Current_line + 1)) := Line;
Current_line := Current_line + 1;
END
STRING File; { File name of open file. }
PROCEDURE OPENFILE(File);
BEGIN
INTEGER Temp;
IF File_open = 1 THEN
BEGIN
Result := 0;
RETURN;
END
ONERRGOTO File_open_error;
OPEN( File FOR INPUT AS #1 );
è ONERRGOTO File_read_error;
FOR I := 1 STEP 1 UNTIL 4000 DO
BEGIN
IF EOF(1) THEN GO TO Success; { End of file. }
LINEIN( #1,L); { Read record. }
IF L = '' THEN L := ' '; { Null line set to a blank }
PT(I) := I; OF(I) := L; Temp := I;
END
Success: CLOSE(#1); Result := 1; File_open := 1; { Set file open. }
LE := Temp; Current_line := 1;
RETURN;
File_open_error: Result := 0; OUTPUT('*** Error, opening file: ' @ File @
' ***');
RESUME Finish_open;
File_read_error: Result := 0; OUTPUT('*** Error, reading file: ' @ File @
' ***');
RESUME Finish_open;
Finish_open:
END
PROCEDURE SAVEFILE(File); { Save text file. }
BEGIN
{ If file is not open and no file name is given
give error code and return. }
Result := 1; { Assume result is 1, error will change result. }
IF File_open AND File = '' THEN
BEGIN
Result := 0; RETURN;
END
IF LE = 0 THEN
BEGIN
OUTPUT('File: ' @ File @ ' is empty. ');
Result := 0; RETURN;
END
IF File_open = 0 THEN
BEGIN
File_open := 1;
OPEN(File FOR OUTPUT AS #1);
END
ELSE
BEGIN
OPEN(File FOR OUTPUT AS #1);
END
è FOR I := 1 STEP 1 UNTIL LE DO
BEGIN
OUTPUT(#1,OF(PT(I)));
END
CLOSE(#1);
END
PROCEDURE CLOSEFILE(File); { Close text file. }
BEGIN
IF File_open = 0 THEN
BEGIN
Result := 0; RETURN; { Error, no file is open. }
END
SAVEFILE(File); File := ''; { Save the file. }
IF Result = 0 THEN RETURN; { Error occurred. }
File_open := 0; { File closed, no file open, once again. }
FOR I := 1 STEP 1 UNTIL 4000 DO
BEGIN
PT(I) := 0; { Nullify pointer to line. }
OF(I) := ''; { Set line null. }
END
LE := 0; { Set logical end to zero, empty file buffer. }
END
PROCEDURE REGISTER;
BEGIN
OUTPUT();
OUTPUT(
'*****************************************************************');
OUTPUT(
'* This program PREDITOR has been developed by Dennis Baer. *');
OUTPUT(
'* If you use this program and you like it then make a pledge *');
OUTPUT(
'* of $25. Send a post card with your name and address on the *');
OUTPUT(
'* front and my name and address on the back and write $25 as *');
OUTPUT(
'* your pledge, also on back. Place this post card in a *');
OUTPUT(
'* business envelope and mail it to: *');
OUTPUT(
'* *');
OUTPUT(
'* Dennis Baer *');
OUTPUT(
'* 25 Miller Road *');
OUTPUT(
'* Farmingdale,New York 11735 *');
OUTPUT(
'* *');
OUTPUT(
'* When you receive your post card back, HONOR your pledge and *');
OUTPUT(è '* make check out for $25 to Dennis Baer. THANK YOU. *');
OUTPUT(
'* Registered users are entitled to software support. *');
OUTPUT(
'* Call 516 694 5872 *');
OUTPUT(
'*****************************************************************');
END
{ Main program }
INITIALIZE;
REGISTER;
Ask:
OUTPUT();
OUTPUT('Edit'); OUTPUT('>' @);
LINEIN(Line); { Get an input line }
Remove_space:
IF Line = ' ' OR Line = '' THEN
BEGIN
OUTPUT('Error, invalid Edit command '); GO Ask;
END
IF LEFT$(Line,1) = ' ' THEN { Remove extra spaces from the left }
BEGIN
Line := RIGHT$(Line,LEN(Line)-1); GO Remove_space;
END
{ *************************** STOP COMMAND ********************************** }
IF Line = 'STOP' OR Line = 'stop' THEN
BEGIN
CLOSE();
REGISTER;
STOP;
END
{ *************************** SAVE FILE COMMAND ***************************** }
IF LEFT$(Line,1) = 'S' OR LEFT$(Line,1) = 's' THEN { Save file }
BEGIN
IF MID$(Line,2,1) <> ' ' THEN
BEGIN
OUTPUT('Error, missing space'); GO Ask;
END
IF LEN(Line) <= 2 THEN
BEGINè Blank:
OUTPUT('No file name entered.'); GO Ask;
END
Ifile := RIGHT$(Line,LEN(Line)-2);
Result := 1; { Assume successful result beforehand }
SAVEFILE(Ifile); { Save file buffer to disk }
IF Result = 0 THEN
BEGIN
OUTPUT('Failure to save file ' @ Ifile); GO Ask;
END
GO Ask;
END
{ *************************** CLOSE FILE COMMAND **************************** }
IF LEFT$(Line,2) = 'CL' OR LEFT$(Line,2) = 'cl' THEN
BEGIN
Result := 1; { Assume successful result at first }
CLOSEFILE(Ifile);
IF Result = 0 THEN
BEGIN
OUTPUT('Failure to close file ' @ Ifile); GO Ask;
END
GO Ask;
END
{ *************************** OPEN FILE COMMAND ***************************** }
IF LEFT$(Line,3) = 'OP ' OR LEFT$(Line,3) = 'op ' THEN
BEGIN
IF File_open = 1 THEN
BEGIN
OUTPUT('File ' @ Ifile @ ' is already open, error.');
GO Ask;
END
Ifile := RIGHT$(Line,LEN(Line)-2);
IF LEN(Line)<=3 THEN
BEGIN
OUTPUT('No file name entered, error.');
GO Ask;
END
Result := 1; { Assume result is 1 }
OPENFILE(Ifile);
IF Result = 0 THEN
BEGIN
OUTPUT('Failure to open file ' @ Ifile);
GO Ask;
END
GO Ask;
END
è{ *************************** LIST COMMAND ********************************** }
IF LEFT$(Line,1) = 'L' OR LEFT$(Line,1) = 'l' THEN
BEGIN
Output_mode := 0; { Set output mode to list }
IF Line = 'L' OR Line = 'L ' OR Line = 'l' OR Line = 'l ' THEN
BEGIN
Low_line := Current_line; High_line := Current_line;
GO Check_and_print;
END
The_rest:
IF MID$(Line,2,1) <> ' ' THEN
BEGIN
OUTPUT('Missing space'); GO Ask;
END
Line := RIGHT$(Line,LEN(Line)-2);
Low_line := VAL(Line);
IF Low_line <= 0 THEN
BEGIN
OUTPUT('Invalid low line number'); GO Ask;
END
Character_pointer := INSTR(Line,',');
IF Character_pointer = 0 THEN
BEGIN
High_line := Low_line;
GO Check_and_print;
END
IF Character_pointer = LEN(Line) THEN
BEGIN
OUTPUT('No high line number entered');
GO Ask;
END
Line := MID$(Line,Character_pointer+1);
IF Line = '*' THEN
BEGIN
High_line := LE;
GO Check_and_print;
END
High_line := VAL(Line);
IF High_line <=0 THEN
BEGIN
OUTPUT('Invalid high line number');
GO Ask;
END
Check_and_print:
IF Low_line > LE OR
Low_line < 1 OR
High_line > LE OR
High_line < 1 THEN
BEGIN
OUTPUT('Line number out of bounds');è GO Ask;
END
IF Low_line > High_line THEN
BEGIN
OUTPUT('First line number higher than second line number');
GO Ask;
END
IF Output_mode = 1 THEN
BEGIN
OUTPRINTER(Low_line,High_line); GO Ask;
END
IF Output_mode = 0 THEN
BEGIN
OUTSCREEN(Low_line,High_line); GO Ask;
END
IF Output_mode = 2 THEN
BEGIN
DELETE_LINES(Low_line,High_line); GO Ask;
END
END
{ *************************** TOP COMMAND *********************************** }
IF Line = 'T' OR Line = 't' THEN
BEGIN
Current_line := 1;
OUTPUT('Top');
GO Ask;
END
{ *************************** PRINT COMMAND ********************************* }
IF LEFT$(Line,1) = 'P' OR LEFT$(Line,1) ='p' THEN
BEGIN
Output_mode := 1;
IF Line = 'P' OR Line = 'P ' OR Line = 'p' OR Line = 'p ' THEN
BEGIN
High_line := Current_line;
Low_line := Current_line;
GO Check_and_print;
END
ELSE GO TO The_rest;
END
{ *************************** DELETE COMMAND ******************************** }
IF LEFT$(Line,1) = 'D' OR LEFT$(Line,1) = 'd' THEN
BEGIN
Output_mode := 2; { delete is mode 2 }
IF Line = 'D' OR Line ='D ' OR Line = 'd' OR Line = 'd ' THEN
BEGINè Low_line := Current_line;
High_line := Current_line;
GO Check_and_print;
END
ELSE GO TO The_rest;
END
{ *************************** CHANGE COMMAND ******************************** }
IF LEFT$(Line,1) = 'C' OR LEFT$(Line,1) = 'c' THEN
BEGIN
STRING Search, { Contains search string }
Replace; { Contains replacement string }
Line := MID$(Line,2);
Strip_blank:
IF LEFT$(Line,1) = ' ' THEN
BEGIN
Line := MID$(Line,2);
GO Strip_blank;
END
IF LEFT$(Line,1) <> Change_delimiter THEN
BEGIN
OUTPUT('Missing ' @ Change_delimiter);
GO Ask;
END
Search := ''; Line := MID$(Line,2);
IF LEN(Line) = 0 THEN
BEGIN
OUTPUT('Error, search string is null'); GO Ask;
END
IF MID$(Line,1,1) = Change_delimiter THEN
BEGIN
OUTPUT('Error, no string entered for search');
GO Ask;
END
Build:
Search := Search + MID$(Line,1,1); Line := MID$(Line,2);
IF Line = '' THEN
BEGIN
OUTPUT('Missing ' @ Change_delimiter);
GO Ask;
END
IF LEFT$(Line,1) <> Change_delimiter THEN GO Build;
Replace := MID$(Line,2); { Get replacement string }
CHANGE(Search,Replace);
IF Found = 0 THEN
BEGIN
OUTPUT('String:' @ Search @ ' not found');
GO Ask;è END
GO Ask;
END
{ *************************** FIND COMMAND ********************************** }
IF LEFT$(Line,1) = 'F' OR LEFT$(Line,1) = 'f' THEN
BEGIN
STRING Search; { String to search for }
IF Line = 'F' OR Line = 'F ' OR Line = 'f' OR Line = 'f ' THEN
BEGIN
OUTPUT('Missing search string');
GO Ask;
END
Line := MID$(Line,2);
Strip:
IF LEFT$(Line,1) = ' ' THEN
BEGIN
Line :=MID$(Line,2);
GO Strip;
END
IF MID$(Line,1,1) <> Change_delimiter THEN
BEGIN
OUTPUT('Missing ' @ Change_delimiter);
GO Ask;
END
Search := ''; Line := MID$(Line,2);
IF LEN(Line) = 0 THEN
BEGIN
OUTPUT('Missing string to be found');
GO Ask;
END
IF MID$(Line,1,1) = Change_delimiter THEN
BEGIN
OUTPUT('Error, null search string');
GO Ask;
END
Build_1:
Search := Search + MID$(Line,1,1); Line := MID$(Line,2);
IF Line = '' THEN
BEGIN
OUTPUT('Missing ' @ Change_delimiter);
GO Ask;
END
IF LEFT$(Line,1) <> Change_delimiter THEN GO Build_1;
FIND(Search);
IF Found := 0 THEN
BEGINè OUTPUT('String: ' @ Search @ ' not found');
Current_line := 1;
GO Ask;
END
GO Ask;
END
{ *************************** BOTTOM COMMAND ******************************** }
IF Line = 'B' OR Line = 'b' THEN
BEGIN
Current_line := LE;
OUTPUT('Bottom at line: ' @ Current_line);
GO Ask;
END
{ *************************** INPUT COMMAND ********************************* }
IF Line = 'I' OR Line = 'i' THEN
BEGIN
OUTPUT('Input'); OUTPUT('>' @);
Line := '';
Inline:
LINEIN(Line);
IF Line = '' THEN GO Ask;
INPUTLINE(Line);
IF Found = 1 THEN
BEGIN
OUTPUT('>' @);
GO Inline;
END
OUTPUT('Input stopped, input buffer is full');
GO Ask;
END
OUTPUT('Invalid Edit command:' @ Line); GO Ask;
{ End of program }
END