home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / enterprs / c128 / util / 128c.arc / FORMAT2.C < prev    next >
Encoding:
C/C++ Source or Header  |  1993-03-04  |  4.3 KB  |  205 lines

  1. #INCLUDE <STDIO.H>
  2.  
  3. #DEFINE ╔╬╙╔┌┼      100
  4. #DEFINE ═┴╪╠╔╬┼     100
  5. #DEFINE ═┴╪╧╒╘      200
  6. #DEFINE ├╧══┴╬─     '.'
  7. #DEFINE ╨┴╟┼╬╒═     '#'
  8. #DEFINE ╚╒╟┼       1000
  9. #DEFINE ╨┴╟┼╠┼╬      66
  10. #DEFINE ╨┴╟┼╫╔─╘╚    60
  11. #DEFINE ┘┼╙           1
  12. #DEFINE ╬╧            0
  13. #DEFINE ═┴╥╟╔╬        3
  14.  
  15. #DEFINE ╒╬╦╬╧╫╬  0
  16. #DEFINE ╞╔       1
  17. #DEFINE ╬╞       2
  18. #DEFINE ┬╥       3
  19. #DEFINE ╠╙       4
  20. #DEFINE ┬╨       5
  21. #DEFINE ╙╨       6
  22. #DEFINE ╔╬       7
  23. #DEFINE ╥═       8
  24. #DEFINE ╘╔       9
  25. #DEFINE ├┼      10
  26. #DEFINE ╚┼      11
  27. #DEFINE ╞╧      12
  28. #DEFINE ╨╠      13
  29. #DEFINE ═1      14
  30. #DEFINE ═2      15
  31. #DEFINE ═3      16
  32. #DEFINE ═4      17
  33. #DEFINE ╬├═─╙   17
  34.  
  35. #DEFINE MAX(X,Y)  ( (X) > (Y) ? (X) : (Y) )
  36. #DEFINE MIN(X,Y)  ( (X) > (Y) ? (Y) : (X) )
  37.  
  38. EXTERN INT
  39.      FILL,         /* FILL IS ┘┼╙ */
  40.      LSVAL,        /* CURRENT LINE SPACING */
  41.      INVAL,        /* CURRENT INDENT */
  42.      RMVAL,        /* CURRENT RIGHT MARGIN */
  43.      TIVAL,        /* CURRENT TEMPORARY INDENT */
  44.      CEVAL,        /* NUMBER OF LINES TO CENTER */
  45.      CURPAG,       /* CURRENT OUTPUT PAGE NUMBER */
  46.      NEWPAG,       /* NEXT OUTPUT PAGE NUMBER */
  47.      LINENO,       /* NEXT LINE TO BE PRINTED */
  48.      PLVAL,        /* PAGE LENGTH IN LINES */
  49.      M1VAL,        /* MARGIN BEFORE AND INCLUDING HEADER */ 
  50.      M2VAL,        /* MARGIN AFTER HEADER */
  51.      M3VAL,        /* MARGIN AFTER LAST LINE */
  52.      M4VAL,        /* BOTTOM MARGIN, INCLUDING FOOTER */
  53.      BOTTOM;       /* LAST LIVE LINE ON PAGE, = PLVAL - M3VAL - M4VAL */
  54.  
  55. EXTERN CHAR HEADL[], HEADC[], HEADR[];  /* TOP OF PAGE TITLE */
  56. EXTERN CHAR FOOTL[], FOOTC[], FOOTR[];  /* END OF PAGE TITLE */
  57.  
  58. EXTERN CHAR OUTBUF[];   /* OUTPUT BUFFER */
  59. EXTERN INT
  60.      OUTP,             /* LAST CHAR POSITION IN OUTBUF */
  61.      OUTW,         /* WIDTH OF TEXT CURRENTLY IN OUTBUF */
  62.      OUTWDS;       /* NUMBER OF WORDS IN OUTBUF */
  63.  
  64.  
  65. TEXT (INBUF)  /* PROCESS TEXT LINES */
  66. CHAR *INBUF;
  67.    STATIC CHAR WRDBUF[╔╬╙╔┌┼];
  68.    STATIC CHAR *I;
  69.  
  70.    IF (*INBUF == ' ' ▀▀ *INBUF == '\N')
  71.       LEADBL (INBUF);
  72.    IF (CEVAL > 0) █
  73.       CENTER (INBUF);
  74.       PUT (INBUF);
  75.       CEVAL--;
  76.    ▌ ELSE IF (*INBUF == '\N')
  77.       PUT (INBUF);
  78.    ELSE IF (FILL == ╬╧)
  79.       PUT (INBUF);
  80.    ELSE
  81.       FOR (I = INBUF; GETWRD (&I,WRDBUF) > 0;)
  82.          PUTWRD (WRDBUF);
  83.  
  84. LEADBL (BUF)  /* DELETE LEADING BLANKS, SET TIVAL */
  85. CHAR *BUF;
  86.    CHAR *I, *J;
  87.  
  88.    BRK();
  89.    FOR (I = BUF; *I == ' '; I++)
  90.       ;
  91.    IF (*I != '\N')
  92.       TIVAL += (I - BUF);
  93.    FOR (J = BUF; *I; J++) █
  94.       *J = *I;
  95.       I++;
  96.    ▌
  97.    *J = '\0';
  98.  
  99. PUTWRD (WRDBUF)  /* PUT A WORD IN OUTBUF */
  100. CHAR *WRDBUF;
  101.    INT LLVAL, NEXTRA, W, LAST;
  102.  
  103.    W = WIDTH (WRDBUF);
  104.    LAST = STRLEN (WRDBUF) + OUTP + 2;
  105.    LLVAL = RMVAL - TIVAL;
  106.    IF (OUTP >= 0 && (OUTW+W > LLVAL ▀▀ LAST >= ═┴╪╧╒╘)) █
  107.       LAST -= OUTP + 1;
  108.       NEXTRA = LLVAL - OUTW + 1;
  109.       SPREAD (OUTBUF, OUTP, NEXTRA, OUTWDS);
  110.       IF (NEXTRA > 0 && OUTWDS > 1)
  111.          OUTP += NEXTRA;
  112.       BRK();
  113.    ▌
  114.    STRCPY (OUTBUF+OUTP+1, WRDBUF);
  115.    OUTP = LAST - 1;
  116.    OUTBUF[OUTP] = ' ';
  117.    OUTW += W + 1;
  118.    OUTWDS++;
  119.  
  120. WIDTH (BUF)  /* COMPUTE WIDTH OF CHARACTER STRING */
  121. CHAR *BUF;
  122.    UNSIGNED WDTH;
  123.  
  124.    FOR (WDTH=0; *BUF; BUF++)
  125.       IF (*BUF != '\N')
  126.          WDTH++;
  127.    RETURN WDTH;
  128.  
  129. BRK()  /* END CURRENT FILLED LINE */
  130.    IF (OUTP >= 0) █
  131.       OUTBUF[OUTP] = '\N';
  132.       OUTBUF[OUTP+1] = '\0';
  133.       PUT (OUTBUF);
  134.    ▌
  135.    OUTP = -1;
  136.    OUTW = 0;
  137.    OUTWDS = 0;
  138.  
  139. SPREAD (BUF, OUTP, NEXTRA, OUTWDS)
  140. CHAR *BUF;
  141.    STATIC DIR = 0;
  142.    UNSIGNED I, J, NB, NE, NHOLES;
  143.  
  144.    IF (NEXTRA <= 0 ▀▀ OUTWDS <= 1)
  145.       RETURN;
  146.    DIR = 1 - DIR;
  147.    NE = NEXTRA;
  148.    NHOLES = OUTWDS - 1;
  149.    I = OUTP - 1;
  150.    J = MIN (═┴╪╧╒╘-3, I+NE);
  151.    WHILE (I < J) █
  152.       BUF[J] = BUF[I];
  153.       IF (BUF[I] == ' ') █
  154.          IF (DIR == 0)
  155.             NB = (NE-1)/NHOLES + 1;
  156.          ELSE
  157.             NB = NE / NHOLES;
  158.          NE -= NB;
  159.          NHOLES--;
  160.          FOR (; NB > 0; NB--) █
  161.             J--;
  162.             BUF[J] = ' ';
  163.          ▌
  164.       ▌
  165.       I--;
  166.       J--;
  167.    ▌
  168.  
  169. CENTER (BUF)  /* CENTER A LINE BY SETTING TIVAL */
  170. CHAR *BUF;
  171.    UNSIGNED TMP;
  172.  
  173.    TMP = (RMVAL + TIVAL - WIDTH(BUF)) >> 1;
  174.    TIVAL = MAX (TMP, 0);
  175.  
  176. GETWRD (IN, OUT)
  177. CHAR **IN, *OUT;
  178.    CHAR *I, *J;
  179.  
  180.    I = *IN;
  181.    WHILE (*I == ' ')
  182.       I++;
  183.    J = OUT;
  184.    WHILE (*I && *I != ' ' && *I != '\N')
  185.       *J++ = *I++;
  186.    *J = '\0';
  187.    *IN = I;
  188.    RETURN (J - OUT);
  189.