home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / modula2 / library / modula1 / edit.mod < prev    next >
Text File  |  1987-06-11  |  2KB  |  74 lines

  1. (* Read a text and produce a copy with flushed left and right margins.
  2.    Place a fixed number of characters (say, length = 72) in each line,
  3.    and distribute blanks as word separators accordingly. *)
  4.  
  5. MODULE chedit;
  6.  
  7. FROM InOut IMPORT Write, WriteLn, OpenInput, Done, Read;
  8.  
  9. CONST length = 72;
  10.  
  11. VAR ch: CHAR;
  12.     i,m,k,lim: CARDINAL;
  13.     line: ARRAY [1..136] OF CHAR;
  14.     index: ARRAY [1..68] OF CARDINAL;
  15.  
  16. PROCEDURE setline;
  17. VAR i,j,h,s,spaces,q,l,r: CARDINAL;
  18.     
  19. BEGIN
  20.   IF m = 0 THEN m := 1; index[m] := lim END;
  21.   j := 0; Write(' '); (* printer control *)
  22.   IF m > 1 THEN
  23.     spaces := lim - index[m];
  24.     q := spaces DIV (m-1);
  25.     r := spaces - (m-1)*q;
  26.     l := (m-r) DIV 2;
  27.     r := l + r;  (* distribute spaces *)
  28.     i := 0;
  29.     REPEAT
  30.       INC(i);
  31.       s := index[i];
  32.       REPEAT
  33.         INC(j);
  34.         Write(line[j]);
  35.       UNTIL j = s;
  36.       FOR h := 1 TO q DO Write(' ') END;
  37.       IF (l <= i) AND (i < r) THEN Write(' ') END;
  38.     UNTIL i = m-1;
  39.   END;
  40.   s := index[m]-1;
  41.   REPEAT INC(j); Write(line[j]) UNTIL j = s;
  42.   j := 0; WriteLn;
  43.   FOR h := index[m]+1 TO lim DO
  44.     INC(j);
  45.     line[j] := line[h];
  46.   END;
  47.   k := j; m := 0
  48. END setline;
  49.  
  50. BEGIN
  51.   OpenInput('TEXT');
  52.   lim := length + 1;
  53.   k := 0;            (* k = # OF characters IN line *)
  54.   m := 0;            (* m = # OF complete words IN line *)
  55.   LOOP
  56.     Read(ch);
  57.     IF NOT Done THEN EXIT END;
  58.     IF ch # ' ' THEN
  59.       REPEAT
  60.         INC(k);
  61.         line[k] := ch;
  62.         Read(ch);
  63.         IF k = lim THEN setline END
  64.       UNTIL (ch = ' ') OR (NOT Done);
  65.       INC(k); line[k] := ' ';
  66.       INC(m); index[m] := k;
  67.       IF k = lim THEN setline END
  68.     END
  69.   END;
  70.   Write(' ');
  71.   FOR i := 1 TO k DO Write(line[i]) END;
  72.   WriteLn;
  73. END chedit.
  74.