home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol062 / dotext.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1984-04-29  |  4.8 KB  |  193 lines

  1. EXTERNAL KFORMAT::DOTEXT;
  2.  
  3. {+++++++++++++++++++++++++++++++++++++++++++++++++++}
  4. {+ DOTEXT MODULE FOR KFORMAT Text Output Processor +}
  5. {+++++++++++++++++++++++++++++++++++++++++++++++++++}
  6.  
  7. { compiler options for Pascal/Z compiler. }
  8. {$C-}{ control-c checking OFF }
  9. {$M-}{ integer mult & divd error checking OFF }
  10. {$F-}{ floating point error checking OFF }
  11.  
  12. {
  13.     process text
  14. }
  15. PROCEDURE DOTEXT(inbuf:BUFFER);
  16. VAR    i    :int;
  17.     wordbuf :BUFFER;
  18.  
  19.   {
  20.     delete leading blanks & set tival
  21.   }
  22.   PROCEDURE LEADBL(VAR lbbuf:BUFFER);
  23.   VAR    i :int;
  24.   BEGIN
  25.     DOBREAK;
  26.     i := 1;
  27.     WHILE ((lbbuf[i]=SPACE) and (i < LENGTH(lbbuf))) DO i := i + 1;
  28.     IF (lbbuf[i] <> NEWLINE) THEN tival := tival + i - 1;
  29.     IF ( i<>1 ) THEN DELETE(lbbuf,1,i-1);    { *** 3-81 *** }
  30.   END;
  31.  
  32.  
  33.   {
  34.     width of a printed line
  35.   }
  36.   FUNCTION WIDTH(VAR w:BUFFER):int;
  37.   VAR    i,wdth :int;
  38.   BEGIN
  39.     wdth := 0;
  40.     FOR i := 1 TO LENGTH(w) DO
  41.       IF (w[i]=BACKSPACE) THEN
  42.     wdth := wdth - 1
  43.       ELSE IF (w[i] <> NEWLINE) THEN
  44.     wdth := wdth + 1;
  45.     WIDTH := wdth;
  46.   END;
  47.  
  48.   {
  49.     centers by setting temporary indent
  50.   }
  51.   PROCEDURE CENTER(VAR cebuf:BUFFER);
  52.   var    k: int;
  53.   BEGIN
  54.     k := ( rmval + tival - WIDTH(cebuf) ) DIV 2;
  55.     tival := IMAX( k,0 );
  56.   END;
  57.  
  58.   {
  59.     replace non-white space chars with bksp, "_"
  60.   }
  61.   PROCEDURE UNDERLINE(VAR inbuf:BUFFER);
  62.   VAR    u :int;
  63.     ulstr :DSTRING;
  64.   BEGIN
  65.     ulstr := '  ';
  66.     ulstr[1] := BACKSPACE;
  67.     ulstr[2] := '_';
  68.     u := 1;
  69.     WHILE (u <= LENGTH(inbuf)) DO
  70.       begin
  71.       IF ( (inbuf[u] <> SPACE)
  72.        AND (inbuf[u] <> TAB)
  73.        AND (inbuf[u] <> BACKSPACE)
  74.        AND (inbuf[u] <> NEWLINE) ) THEN
  75.     BEGIN  INSERT(ulstr,inbuf,u+1);
  76.            u := u + 3
  77.     END
  78.       ELSE
  79.     u := u + 1;
  80.       end;
  81.   END;
  82.  
  83.   {
  84.     spread words to justify right margin
  85.   }
  86.   PROCEDURE SPREAD(VAR outbuf:BUFFER; outp, nextra, outwds:int);
  87.   VAR    nb,    { number blanks }
  88.     ne,    { number extra    }
  89.     nholes, { number holes    }
  90.     i, j: int;
  91.   BEGIN
  92.     IF (nextra > 0) THEN
  93.       BEGIN{nextra > 0}
  94.     IF (outwds > 0) and ( spacefill ) THEN
  95.       BEGIN
  96.         direction := NOT direction;     { tobble bias direction }
  97.         ne := nextra;
  98.         nholes := outwds - 1;
  99.         i := LENGTH(outbuf) - 1;         { point at final non-blank }
  100.         WHILE ( ne > 0 ) DO
  101.           BEGIN
  102.         WHILE ( outbuf[i] <> SPACE ) DO i := i - 1;
  103.         IF ( direction ) THEN
  104.           nb := (ne-1) DIV nholes + 1    { rounded }
  105.         ELSE
  106.           nb := ne DIV nholes;        { truncated }
  107.         ne := ne - nb;
  108.         nholes := nholes - 1;
  109.         WHILE ( nb > 0 ) DO        { insert extra blanks }
  110.           BEGIN
  111.             INSERT(' ',outbuf,i+1);
  112.             nb := nb - 1;
  113.           END;
  114.         i := i - 1
  115.           END {while ne > 0}
  116.       END
  117.       END {IF nextra > 0}
  118.   END;
  119.  
  120.   {
  121.     put a word in outbuf including margin justification
  122.   }
  123.   PROCEDURE PUTWORD(VAR pwbuf:BUFFER);
  124.   VAR    w, last,
  125.     llval, nextra: int;
  126.   BEGIN
  127.     w := WIDTH(pwbuf); { printable width of pwbuf }
  128.     last := LENGTH(pwbuf) + outp + 1;    { new end of outbuf }
  129.     llval := rmval - tival;  { printable line length }
  130.     IF ((outp > 0)
  131.       AND ( ((outw + w) > llval) OR (last > MAXBUF) ) ) THEN{ too big }
  132.     BEGIN
  133.       last := last - outp; { remember end of wrdbuf }
  134.       nextra := llval - outw + 1; { # blanks needed to pad }
  135.       IF ( spacefill ) THEN
  136.         SPREAD(outbuf,outp,nextra,outwds);
  137.       IF ((nextra > 0) AND (outwds > 1)) THEN
  138.         outp := outp + nextra;
  139.       DOBREAK { flush previous line }
  140.     END;
  141.     outp := last;
  142.     { *  outbuf := CONCAT(outbuf,pwbuf,space);    * }
  143.     append(outbuf,pwbuf);        { add new word to outbuf }
  144.     append(outbuf,space);        { add a blank         }
  145.     outw := outw + w + 1;        { update output width     }
  146.     outwds := outwds + 1;        { increment the word count }
  147.   END;
  148.  
  149.  
  150.   {
  151.     get a non-blank word from inbuf[] to wdbuf[] and
  152.     advance g.  Returns length of wdbuf.
  153.   }
  154.   FUNCTION GETWORD(VAR inbuf: BUFFER; VAR g: int; VAR wdbuf: BUFFER):int;
  155.   VAR    st: int;
  156.   BEGIN
  157.     WHILE (((inbuf[g]=SPACE) OR (inbuf[g]=TAB))
  158.       AND (g < LENGTH(inbuf))) DO g := g + 1;
  159.     st := g;
  160.     SKIPCHARS(inbuf,g);
  161.     wdbuf := COPY(inbuf,st,g-st);
  162.     GETWORD := LENGTH(wdbuf);
  163.   END;
  164.  
  165. BEGIN {dotext}
  166.   IF ((inbuf[1]=SPACE) OR (inbuf[1]=NEWLINE)) THEN
  167.     LEADBL(inbuf);            { * move left, set tival * }
  168.   IF ( ulval > 0 ) THEN         { * underlining * }
  169.     BEGIN
  170.       UNDERLINE(inbuf);
  171.       ulval := ulval - 1
  172.     END;
  173.   IF ( ceval > 0 ) THEN         { * centering in effect * }
  174.     BEGIN
  175.       CENTER(inbuf);
  176.       PUTTEXT(inbuf);
  177.       ceval := ceval - 1;
  178.     END
  179.   ELSE IF (inbuf[1]=NEWLINE) THEN    { * all blank line * }
  180.     PUTTEXT(inbuf)
  181.   ELSE IF ( NOT fill ) THEN        { * un-filled text passes * }
  182.     PUTTEXT(inbuf)            { * text "as is"      * }
  183.   ELSE                    { * filled text * }
  184.     BEGIN
  185.       i := 1;
  186.       WHILE ( GETWORD(inbuf,i,wordbuf) > 0 ) DO
  187.     PUTWORD(wordbuf);
  188.     END;
  189. END;  {dotext}
  190.  
  191. {END EXTERNAL}.
  192.  
  193.