home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol022 / zptex.pas < prev   
Encoding:
Pascal/Delphi Source File  |  1984-04-29  |  8.0 KB  |  312 lines

  1. (****************************************************************)
  2. (*                                *
  3.  *  PROGRAM TITLE:    Z - P R I N T   T E X T            *
  4.  *                                *
  5.  *  WRITTEN BY:        Raymond E. Penley            *
  6.  *  DATE WRITTEN:    17 NOV 1979                *
  7.  *                                *
  8.  *  PROGRAM SUMMARY:                        *
  9.  *                                *
  10.  * A very simple text formatter program.            *
  11.  *                                *
  12.  * Command Directives:                        *
  13.  *    ^P    New Paragraph.                    *
  14.  *    ^$    End of Text.                    *
  15.  *    ^I    Indent/space.                    *
  16.  *    ^N    New Line but not New Paragraph.            *
  17.  *    ^B    Break/Pause. Continue on any console input.    *
  18.  *                                *
  19.  * NOTE - Command directives may be in either upper or        *
  20.  *      lower case.                        *
  21.  *                                *
  22.  * MODIFICATION RECORD:                        *
  23.  *      1.0    19 Nov 79 Original Program 'PWORD.PAS'        *
  24.  *        An attempt to extract "WORDS" from text        *
  25.  *        and print them.                    *
  26.  *      1.1  25 Nov 79 -Analyze, Bump, ProcessCommand        *
  27.  *         Newline, Page                    *
  28.  *      1.2  26 Nov 79 -From the the Program Text Formatter(1)*
  29.  *        Adjustline, Appendblank, Appendword,        *
  30.  *        Printline, Roomfor, StartParagraph        *
  31.  *      1.3  28 Nov 79                    *
  32.  *        -Added File selection from the console        *
  33.  *      1.4  19 Aug 80 -Slight mods to program.        *
  34.  *        -Rewrote READWORD.                *
  35.  *                                *
  36.  *    (1)PASCAL, An Introduction to                *
  37.  *       Methodical Programming                *
  38.  *       Authors: W.Findlay & D.A. Watt            *)
  39. (****************************************************************)
  40. PROGRAM ZPTEX;
  41. CONST
  42.  MAXLENGTH     = 255;    (* GROSS MAXIMUM LINE LENGTH *)
  43.  MAXWORDLENGTH    = 30;    (* GET THOSE REALLY BIG WORDS *)
  44.  MAXLINEWIDTH    = 80;    (* SET TO VIDEO TERMINAL WIDTH  *)
  45.  MINLINEWIDTH    = 30;    (* It isn't a co-incidence that Max Word Length *)
  46.             (* and Min Line Width are equal.        *)
  47.  SPACE         = ' ';
  48. TYPE
  49.   BYTE = 0..255;    (* POSITIVE SINGLE BYTE INTEGER *)
  50.   STRING14   = PACKED ARRAY [ 1..14 ] OF CHAR;
  51.   STRINGTYPE = RECORD
  52.          LENGTH : 0..MAXLENGTH;
  53.          IMAGE  : PACKED ARRAY [ 1..MAXLENGTH ] OF CHAR
  54.            END;
  55. VAR
  56.   BLANKINDEX    : 0..MAXWORDLENGTH;
  57.   DIRCH        : CHAR;    (* Char to mark a Command *)
  58.   FATALERROR    : BOOLEAN;
  59.   TEXTFILE    : TEXT;
  60.   FILEID    : STRING14;    (* FILE NAME *)
  61.   INDENT    : BYTE;
  62.   LINE        : PACKED ARRAY [ 1..MAXLINEWIDTH ] OF CHAR;
  63.   LINEWIDTH    : BYTE;
  64.   POS        : BYTE; (* GLOBAL INDEXER *)
  65.   POSITION    : 0..MAXLINEWIDTH;
  66.   TAB        : CHAR;    (* ASCII TAB character *)
  67.   WORD        : STRINGTYPE;
  68.  
  69.     (**************************)
  70.  
  71. PROCEDURE CLEAR(* OUTPUT *);
  72. VAR
  73.   I: BYTE;
  74. BEGIN
  75.   FOR I:=1 TO 24 DO WRITELN;
  76. END; (* CLEAR *)
  77.  
  78. PROCEDURE SKIP( LINES : BYTE );
  79. VAR
  80.   I: BYTE;
  81. BEGIN
  82.   FOR I := 1 TO LINES DO WRITELN
  83. END;
  84.  
  85. PROCEDURE PRINTLINE;
  86. BEGIN
  87.   FOR POS:=1 TO POSITION DO WRITE( LINE[ POS ]);
  88.   WRITELN
  89. END;
  90.  
  91. PROCEDURE STARTLINE;
  92. BEGIN
  93.   POSITION := 0
  94. END;
  95.  
  96. PROCEDURE READWORD;
  97. VAR    CH: CHAR;
  98.  
  99.     PROCEDURE GETC(VAR CH: CHAR);
  100.     BEGIN
  101.       IF NOT EOF(TEXTFILE) THEN
  102.          READ(TEXTFILE, CH);
  103.       (* Classify the character just read *)
  104.       IF CH=TAB THEN CH := SPACE;
  105.       IF EOF(TEXTFILE) THEN
  106.          CH := SPACE;
  107.     END;
  108.  
  109. (*$C- [Control-C OFF]**********************************)
  110.  
  111. BEGIN
  112.   CH := SPACE;
  113.   WHILE (NOT EOF(TEXTFILE)) AND (CH=SPACE) DO (* skipblanks *)
  114.     GETC(CH);
  115.   WITH WORD DO BEGIN
  116.     LENGTH := 0;
  117.     WHILE (NOT EOF(TEXTFILE)) AND (CH<>SPACE) DO
  118.       BEGIN (* accept only non space *)
  119.     IF LENGTH < MAXWORDLENGTH THEN
  120.       BEGIN (* store the char *)
  121.         LENGTH := LENGTH + 1;
  122.         IMAGE[ LENGTH ] := CH;
  123.       END;
  124.     GETC(CH);
  125.       END; (* WHILE *)
  126. (**
  127.     WE NOW HAVE ONE "WORD" IN WORD.IMAGE
  128.     WORD.LENGTH IS THE LENGTH OF THIS WORD
  129. **)
  130.    IF LENGTH >= BLANKINDEX THEN
  131.      BLANKINDEX := LENGTH
  132.    ELSE
  133.      REPEAT
  134.        IMAGE[ BLANKINDEX ] := SPACE;
  135.        BLANKINDEX := PRED(BLANKINDEX);
  136.      UNTIL BLANKINDEX=LENGTH;
  137.   END; (* WITH *)
  138. END; (* READWORD *)
  139.  
  140. PROCEDURE ANALYZE;
  141. VAR
  142.   PAUSE: CHAR;
  143.  
  144.     PROCEDURE APPENDWORD;
  145.     BEGIN
  146.       FOR POS:=1 TO WORD.LENGTH DO
  147.         BEGIN
  148.           POSITION := POSITION +1;
  149.           LINE[ POSITION ] := WORD.IMAGE[ POS ]
  150.         END
  151.     END;
  152.  
  153.     PROCEDURE APPENDBLANK;
  154.     BEGIN
  155.       POSITION := POSITION +1;
  156.       LINE[ POSITION ] := SPACE
  157.     END;
  158.  
  159.     FUNCTION ROOMFOR( NMROFCHARS: INTEGER ): BOOLEAN;
  160.     BEGIN
  161.       ROOMFOR := (POSITION + NMROFCHARS) <= LINEWIDTH
  162.     END;
  163.  
  164.     PROCEDURE ADJUSTLINE;
  165.     VAR
  166.       EXTRABLANKS,
  167.       NMROFGAPS,
  168.       WIDENING,
  169.       LEFTMOST,
  170.       RIGHTMOST: 0..MAXLINEWIDTH;
  171.     BEGIN
  172.       (*    Make LeftMost the POSition of    *
  173.        *    the LeftMost non:blank        *)
  174.       LEFTMOST := 1;
  175.       WHILE LINE[ LEFTMOST ] = SPACE DO
  176.         LEFTMOST := SUCC(LEFTMOST);
  177.       (*    Make RightMost the POSition of    *
  178.        *    the RightMost non-blank        *)
  179.       RIGHTMOST := POSITION;
  180.       WHILE LINE[ RIGHTMOST ] = SPACE DO
  181.         RIGHTMOST := PRED(RIGHTMOST);
  182.       (*    Make NMROFGAPS the number of inter-word gaps *)
  183.       NMROFGAPS := 0;
  184.       FOR POS := LEFTMOST TO RIGHTMOST DO
  185.         IF (LINE[ POS ] = SPACE) THEN NMROFGAPS := NMROFGAPS +1;
  186.       EXTRABLANKS := LINEWIDTH - RIGHTMOST;
  187.       FOR POS := 1 TO RIGHTMOST DO
  188.         IF (POS > LEFTMOST) AND (LINE[ POS ] = SPACE) THEN
  189.           BEGIN (* this Char is an inter-WORD gap *)
  190.             WIDENING := EXTRABLANKS DIV NMROFGAPS;
  191.             WRITE( SPACE:(WIDENING+1) );
  192.             EXTRABLANKS := EXTRABLANKS - WIDENING;
  193.             NMROFGAPS := NMROFGAPS -1
  194.           END(* If *)
  195.         ELSE
  196.           WRITE( LINE[ POS ] );
  197.       WRITELN
  198.     END; (* ADJUSTLINE *)
  199.  
  200.     PROCEDURE NEWLINE;
  201.     (*
  202.         Print the current LINE without adjustment and
  203.         move to the next line.
  204.     *)
  205.     BEGIN
  206.       PRINTLINE;
  207.       STARTLINE
  208.     END;
  209.  
  210.     PROCEDURE STARTPARAGRAPH;
  211.     (*
  212.        Write the current LINE without adjustment
  213.      *)
  214.     BEGIN
  215.       PRINTLINE;
  216.       WRITELN;
  217.       FOR POSITION := 1 TO INDENT DO
  218.         LINE[ POSITION ] := SPACE;
  219.       POSITION := INDENT
  220.     END;
  221.  
  222.     FUNCTION VALIDCOMMAND( THISCHAR : CHAR ) : BOOLEAN;
  223.     BEGIN
  224.       VALIDCOMMAND :=
  225.          (THISCHAR IN [ '$','p','P','i','I','n','N','b','B' ] )
  226.     END;
  227.  
  228.     PROCEDURE BUMP;
  229.     BEGIN
  230.       IF (POSITION < LINEWIDTH) THEN
  231.         BEGIN
  232.         POS := 0;
  233.         REPEAT
  234.           POS := POS + 1;
  235.           APPENDBLANK
  236.         UNTIL (POS = INDENT) OR (POSITION = LINEWIDTH);
  237.         END(* IF *)
  238.     END; (* BUMP *)
  239.  
  240. BEGIN (*** ANALYZE ***)
  241.   (* All Command Directives must start a Word *)
  242.   IF WORD.IMAGE[ 1 ] = DIRCH THEN
  243.     BEGIN
  244.       IF VALIDCOMMAND( WORD.IMAGE[ 2 ] ) THEN
  245.     BEGIN
  246.       CASE WORD.IMAGE[ 2 ] OF
  247.           '$':    FATALERROR := TRUE;(* Force termination *)
  248.           'P','p':    STARTPARAGRAPH;
  249.           'I','i':    BUMP;
  250.           'N','n':    NEWLINE;
  251.           'B','b':    BEGIN
  252.             NEWLINE;
  253.             READLN( PAUSE )
  254.             END
  255.       END (* CASE WORD.IMAGE *)
  256.     END(* IF VALIDCOMMAND *)
  257.     END(* IF *)
  258.   ELSE
  259.     (* Output the WORD followed by a blank, right-adjusting
  260.        the old Line and starting a new line if necessary  *)
  261.     BEGIN
  262.       IF NOT ROOMFOR(WORD.LENGTH) THEN
  263.     BEGIN
  264.       ADJUSTLINE;      (* Right-justify the Current Line *)
  265.       STARTLINE
  266.     END;
  267.      APPENDWORD;
  268.      IF ROOMFOR(1) THEN APPENDBLANK
  269.    END (* ELSE *)
  270. END; (* ANALYZE *)
  271.  
  272. (*$C+ [Control-C ON]*********************************)
  273.  
  274. PROCEDURE INITIALIZE;
  275. BEGIN
  276.   BLANKINDEX    := MAXWORDLENGTH;(* start at the extreme right *)
  277.   DIRCH        := '^';     (* Default for Command Character *)
  278.   INDENT    := 6;        (* Default for all indents *)
  279.   TAB        := CHR(9);    (* ASCII TAB CHARACTER *)
  280.   FATALERROR    := FALSE;
  281.   REPEAT
  282.     WRITELN;
  283.     WRITE('Line width?');
  284.     READLN( LINEWIDTH );
  285.     IF LINEWIDTH < MINLINEWIDTH THEN
  286.       WRITELN('Minimum line width is', MINLINEWIDTH:3, '. Please reenter');
  287.   UNTIL (LINEWIDTH>=MINLINEWIDTH) AND (LINEWIDTH<=MAXLINEWIDTH);
  288.   WRITE('Enter text file name ');
  289.   READLN( FILEID );
  290.   (* OPEN file "FILEID" for READ assign TEXTFILE *)
  291.       RESET( FILEID, TEXTFILE );
  292.   CLEAR(* OUTPUT *);
  293. END;
  294.  
  295. BEGIN (*** Z-PRINT TEXT ***)
  296.   INITIALIZE;
  297.   IF EOF(TEXTFILE) THEN
  298.     WRITELN('File ', FILEID, 'not found')
  299.   ELSE
  300.     BEGIN
  301.       STARTLINE;
  302.       READWORD; (*** Attempt to read a word ***)
  303.       WHILE NOT ( EOF(TEXTFILE) OR FATALERROR ) DO
  304.     BEGIN
  305.       ANALYZE;
  306.       READWORD;    (*** Attempt to read another word ***)
  307.     END; (* WHILE *)
  308.       PRINTLINE; (*** Write the current line without adjustment ***)
  309.     END; (* else *)
  310.   SKIP(4);
  311. END. (*** Z-PRINT TEXT ***)
  312.