(****************************************************************)
(* *
* PROGRAM TITLE: Z - P R I N T T E X T *
* *
* WRITTEN BY: Raymond E. Penley *
* DATE WRITTEN: 17 NOV 1979 *
* *
* PROGRAM SUMMARY: *
* *
* A very simple text formatter program. *
* *
* Command Directives: *
* ^P New Paragraph. *
* ^$ End of Text. *
* ^I Indent/space. *
* ^N New Line but not New Paragraph. *
* ^B Break/Pause. Continue on any console input. *
* *
* NOTE - Command directives may be in either upper or *
* lower case. *
* *
* MODIFICATION RECORD: *
* 1.0 19 Nov 79 Original Program 'PWORD.PAS' *
* An attempt to extract "WORDS" from text *
* and print them. *
* 1.1 25 Nov 79 -Analyze, Bump, ProcessCommand *
* Newline, Page *
* 1.2 26 Nov 79 -From the the Program Text Formatter(1)*
* Adjustline, Appendblank, Appendword, *
* Printline, Roomfor, StartParagraph *
* 1.3 28 Nov 79 *
* -Added File selection from the console *
* 1.4 19 Aug 80 -Slight mods to program. *
* -Rewrote READWORD. *
* *
* (1)PASCAL, An Introduction to *
* Methodical Programming *
* Authors: W.Findlay & D.A. Watt *)
(****************************************************************)
PROGRAM ZPTEX;
CONST
MAXLENGTH = 255; (* GROSS MAXIMUM LINE LENGTH *)
MAXWORDLENGTH = 30; (* GET THOSE REALLY BIG WORDS *)
MAXLINEWIDTH = 80; (* SET TO VIDEO TERMINAL WIDTH *)
MINLINEWIDTH = 30; (* It isn't a co-incidence that Max Word Length *)
(* and Min Line Width are equal. *)
SPACE = ' ';
TYPE
BYTE = 0..255; (* POSITIVE SINGLE BYTE INTEGER *)
STRING14 = PACKED ARRAY [ 1..14 ] OF CHAR;
STRINGTYPE = RECORD
LENGTH : 0..MAXLENGTH;
IMAGE : PACKED ARRAY [ 1..MAXLENGTH ] OF CHAR
END;
VAR
BLANKINDEX : 0..MAXWORDLENGTH;
DIRCH : CHAR; (* Char to mark a Command *)
FATALERROR : BOOLEAN;
TEXTFILE : TEXT;
FILEID : STRING14; (* FILE NAME *)
INDENT : BYTE;
LINE : PACKED ARRAY [ 1..MAXLINEWIDTH ] OF CHAR;
LINEWIDTH : BYTE;
POS : BYTE; (* GLOBAL INDEXER *)
POSITION : 0..MAXLINEWIDTH;
TAB : CHAR; (* ASCII TAB character *)
WORD : STRINGTYPE;
(**************************)
PROCEDURE CLEAR(* OUTPUT *);
VAR
I: BYTE;
BEGIN
FOR I:=1 TO 24 DO WRITELN;
END; (* CLEAR *)
PROCEDURE SKIP( LINES : BYTE );
VAR
I: BYTE;
BEGIN
FOR I := 1 TO LINES DO WRITELN
END;
PROCEDURE PRINTLINE;
BEGIN
FOR POS:=1 TO POSITION DO WRITE( LINE[ POS ]);
WRITELN
END;
PROCEDURE STARTLINE;
BEGIN
POSITION := 0
END;
PROCEDURE READWORD;
VAR CH: CHAR;
PROCEDURE GETC(VAR CH: CHAR);
BEGIN
IF NOT EOF(TEXTFILE) THEN
READ(TEXTFILE, CH);
(* Classify the character just read *)
IF CH=TAB THEN CH := SPACE;
IF EOF(TEXTFILE) THEN
CH := SPACE;
END;
BEGIN
CH := SPACE;
WHILE (NOT EOF(TEXTFILE)) AND (CH=SPACE) DO (* skipblanks *)
GETC(CH);
WITH WORD DO BEGIN
LENGTH := 0;
WHILE (NOT EOF(TEXTFILE)) AND (CH<>SPACE) DO
BEGIN (* accept only non space *)
IF LENGTH < MAXWORDLENGTH THEN
BEGIN (* store the char *)
LENGTH := LENGTH + 1;
IMAGE[ LENGTH ] := CH;
END;
GETC(CH);
END; (* WHILE *)
(**
WE NOW HAVE ONE "WORD" IN WORD.IMAGE
WORD.LENGTH IS THE LENGTH OF THIS WORD
**)
IF LENGTH >= BLANKINDEX THEN
BLANKINDEX := LENGTH
ELSE
REPEAT
IMAGE[ BLANKINDEX ] := SPACE;
BLANKINDEX := PRED(BLANKINDEX);
UNTIL BLANKINDEX=LENGTH;
END; (* WITH *)
END; (* READWORD *)
PROCEDURE ANALYZE;
VAR
PAUSE: CHAR;
PROCEDURE APPENDWORD;
BEGIN
FOR POS:=1 TO WORD.LENGTH DO
BEGIN
POSITION := POSITION +1;
LINE[ POSITION ] := WORD.IMAGE[ POS ]
END
END;
PROCEDURE APPENDBLANK;
BEGIN
POSITION := POSITION +1;
LINE[ POSITION ] := SPACE
END;
FUNCTION ROOMFOR( NMROFCHARS: INTEGER ): BOOLEAN;
BEGIN
ROOMFOR := (POSITION + NMROFCHARS) <= LINEWIDTH
END;
PROCEDURE ADJUSTLINE;
VAR
EXTRABLANKS,
NMROFGAPS,
WIDENING,
LEFTMOST,
RIGHTMOST: 0..MAXLINEWIDTH;
BEGIN
(* Make LeftMost the POSition of *
* the LeftMost non:blank *)
LEFTMOST := 1;
WHILE LINE[ LEFTMOST ] = SPACE DO
LEFTMOST := SUCC(LEFTMOST);
(* Make RightMost the POSition of *
* the RightMost non-blank *)
RIGHTMOST := POSITION;
WHILE LINE[ RIGHTMOST ] = SPACE DO
RIGHTMOST := PRED(RIGHTMOST);
(* Make NMROFGAPS the number of inter-word gaps *)
NMROFGAPS := 0;
FOR POS := LEFTMOST TO RIGHTMOST DO
IF (LINE[ POS ] = SPACE) THEN NMROFGAPS := NMROFGAPS +1;
EXTRABLANKS := LINEWIDTH - RIGHTMOST;
FOR POS := 1 TO RIGHTMOST DO
IF (POS > LEFTMOST) AND (LINE[ POS ] = SPACE) THEN
BEGIN (* this Char is an inter-WORD gap *)
WIDENING := EXTRABLANKS DIV NMROFGAPS;
WRITE( SPACE:(WIDENING+1) );
EXTRABLANKS := EXTRABLANKS - WIDENING;
NMROFGAPS := NMROFGAPS -1
END(* If *)
ELSE
WRITE( LINE[ POS ] );
WRITELN
END; (* ADJUSTLINE *)
PROCEDURE NEWLINE;
(*
Print the current LINE without adjustment and
move to the next line.
*)
BEGIN
PRINTLINE;
STARTLINE
END;
PROCEDURE STARTPARAGRAPH;
(*
Write the current LINE without adjustment
*)
BEGIN
PRINTLINE;
WRITELN;
FOR POSITION := 1 TO INDENT DO
LINE[ POSITION ] := SPACE;
POSITION := INDENT
END;
FUNCTION VALIDCOMMAND( THISCHAR : CHAR ) : BOOLEAN;
BEGIN
VALIDCOMMAND :=
(THISCHAR IN [ '$','p','P','i','I','n','N','b','B' ] )
END;
PROCEDURE BUMP;
BEGIN
IF (POSITION < LINEWIDTH) THEN
BEGIN
POS := 0;
REPEAT
POS := POS + 1;
APPENDBLANK
UNTIL (POS = INDENT) OR (POSITION = LINEWIDTH);
END(* IF *)
END; (* BUMP *)
BEGIN (*** ANALYZE ***)
(* All Command Directives must start a Word *)
IF WORD.IMAGE[ 1 ] = DIRCH THEN
BEGIN
IF VALIDCOMMAND( WORD.IMAGE[ 2 ] ) THEN
BEGIN
CASE WORD.IMAGE[ 2 ] OF
'$': FATALERROR := TRUE;(* Force termination *)
'P','p': STARTPARAGRAPH;
'I','i': BUMP;
'N','n': NEWLINE;
'B','b': BEGIN
NEWLINE;
READLN( PAUSE )
END
END (* CASE WORD.IMAGE *)
END(* IF VALIDCOMMAND *)
END(* IF *)
ELSE
(* Output the WORD followed by a blank, right-adjusting
the old Line and starting a new line if necessary *)
BEGIN
IF NOT ROOMFOR(WORD.LENGTH) THEN
BEGIN
ADJUSTLINE; (* Right-justify the Current Line *)
STARTLINE
END;
APPENDWORD;
IF ROOMFOR(1) THEN APPENDBLANK
END (* ELSE *)
END; (* ANALYZE *)
PROCEDURE INITIALIZE;
BEGIN
BLANKINDEX := MAXWORDLENGTH;(* start at the extreme right *)
DIRCH := '^'; (* Default for Command Character *)
INDENT := 6; (* Default for all indents *)
TAB := CHR(9); (* ASCII TAB CHARACTER *)
FATALERROR := FALSE;
REPEAT
WRITELN;
WRITE('Line width?');
READLN( LINEWIDTH );
IF LINEWIDTH < MINLINEWIDTH THEN
WRITELN('Minimum line width is', MINLINEWIDTH:3, '. Please reenter');
UNTIL (LINEWIDTH>=MINLINEWIDTH) AND (LINEWIDTH<=MAXLINEWIDTH);
WRITE('Enter text file name ');
READLN( FILEID );
(* OPEN file "FILEID" for READ assign TEXTFILE *)
RESET( FILEID, TEXTFILE );
CLEAR(* OUTPUT *);
END;
BEGIN (*** Z-PRINT TEXT ***)
INITIALIZE;
IF EOF(TEXTFILE) THEN
WRITELN('File ', FILEID, 'not found')
ELSE
BEGIN
STARTLINE;
READWORD; (*** Attempt to read a word ***)
WHILE NOT ( EOF(TEXTFILE) OR FATALERROR ) DO
BEGIN
ANALYZE;
READWORD; (*** Attempt to read another word ***)
END; (* WHILE *)
PRINTLINE; (*** Write the current line without adjustment ***)
END; (* else *)
SKIP(4);
END. (*** Z-PRINT TEXT ***)