home *** CD-ROM | disk | FTP | other *** search
- #INCLUDE <STDIO.H>
-
- #DEFINE ╔╬╙╔┌┼ 100
- #DEFINE ═┴╪╠╔╬┼ 100
- #DEFINE ═┴╪╧╒╘ 200
- #DEFINE ├╧══┴╬─ '.'
- #DEFINE ╨┴╟┼╬╒═ '#'
- #DEFINE ╚╒╟┼ 1000
- #DEFINE ╨┴╟┼╠┼╬ 66
- #DEFINE ╨┴╟┼╫╔─╘╚ 60
- #DEFINE ┘┼╙ 1
- #DEFINE ╬╧ 0
- #DEFINE ═┴╥╟╔╬ 3
-
- #DEFINE ╒╬╦╬╧╫╬ 0
- #DEFINE ╞╔ 1
- #DEFINE ╬╞ 2
- #DEFINE ┬╥ 3
- #DEFINE ╠╙ 4
- #DEFINE ┬╨ 5
- #DEFINE ╙╨ 6
- #DEFINE ╔╬ 7
- #DEFINE ╥═ 8
- #DEFINE ╘╔ 9
- #DEFINE ├┼ 10
- #DEFINE ╚┼ 11
- #DEFINE ╞╧ 12
- #DEFINE ╨╠ 13
- #DEFINE ═1 14
- #DEFINE ═2 15
- #DEFINE ═3 16
- #DEFINE ═4 17
- #DEFINE ╬├═─╙ 17
-
- #DEFINE MAX(X,Y) ( (X) > (Y) ? (X) : (Y) )
- #DEFINE MIN(X,Y) ( (X) > (Y) ? (Y) : (X) )
-
- EXTERN INT
- FILL, /* FILL IS ┘┼╙ */
- LSVAL, /* CURRENT LINE SPACING */
- INVAL, /* CURRENT INDENT */
- RMVAL, /* CURRENT RIGHT MARGIN */
- TIVAL, /* CURRENT TEMPORARY INDENT */
- CEVAL, /* NUMBER OF LINES TO CENTER */
- CURPAG, /* CURRENT OUTPUT PAGE NUMBER */
- NEWPAG, /* NEXT OUTPUT PAGE NUMBER */
- LINENO, /* NEXT LINE TO BE PRINTED */
- PLVAL, /* PAGE LENGTH IN LINES */
- M1VAL, /* MARGIN BEFORE AND INCLUDING HEADER */
- M2VAL, /* MARGIN AFTER HEADER */
- M3VAL, /* MARGIN AFTER LAST LINE */
- M4VAL, /* BOTTOM MARGIN, INCLUDING FOOTER */
- BOTTOM; /* LAST LIVE LINE ON PAGE, = PLVAL - M3VAL - M4VAL */
-
- EXTERN CHAR HEADL[], HEADC[], HEADR[]; /* TOP OF PAGE TITLE */
- EXTERN CHAR FOOTL[], FOOTC[], FOOTR[]; /* END OF PAGE TITLE */
-
- EXTERN CHAR OUTBUF[]; /* OUTPUT BUFFER */
- EXTERN INT
- OUTP, /* LAST CHAR POSITION IN OUTBUF */
- OUTW, /* WIDTH OF TEXT CURRENTLY IN OUTBUF */
- OUTWDS; /* NUMBER OF WORDS IN OUTBUF */
-
-
- TEXT (INBUF) /* PROCESS TEXT LINES */
- CHAR *INBUF;
- █
- STATIC CHAR WRDBUF[╔╬╙╔┌┼];
- STATIC CHAR *I;
-
- IF (*INBUF == ' ' ▀▀ *INBUF == '\N')
- LEADBL (INBUF);
- IF (CEVAL > 0) █
- CENTER (INBUF);
- PUT (INBUF);
- CEVAL--;
- ▌ ELSE IF (*INBUF == '\N')
- PUT (INBUF);
- ELSE IF (FILL == ╬╧)
- PUT (INBUF);
- ELSE
- FOR (I = INBUF; GETWRD (&I,WRDBUF) > 0;)
- PUTWRD (WRDBUF);
- ▌
-
- LEADBL (BUF) /* DELETE LEADING BLANKS, SET TIVAL */
- CHAR *BUF;
- █
- CHAR *I, *J;
-
- BRK();
- FOR (I = BUF; *I == ' '; I++)
- ;
- IF (*I != '\N')
- TIVAL += (I - BUF);
- FOR (J = BUF; *I; J++) █
- *J = *I;
- I++;
- ▌
- *J = '\0';
- ▌
-
- PUTWRD (WRDBUF) /* PUT A WORD IN OUTBUF */
- CHAR *WRDBUF;
- █
- INT LLVAL, NEXTRA, W, LAST;
-
- W = WIDTH (WRDBUF);
- LAST = STRLEN (WRDBUF) + OUTP + 2;
- LLVAL = RMVAL - TIVAL;
- IF (OUTP >= 0 && (OUTW+W > LLVAL ▀▀ LAST >= ═┴╪╧╒╘)) █
- LAST -= OUTP + 1;
- NEXTRA = LLVAL - OUTW + 1;
- SPREAD (OUTBUF, OUTP, NEXTRA, OUTWDS);
- IF (NEXTRA > 0 && OUTWDS > 1)
- OUTP += NEXTRA;
- BRK();
- ▌
- STRCPY (OUTBUF+OUTP+1, WRDBUF);
- OUTP = LAST - 1;
- OUTBUF[OUTP] = ' ';
- OUTW += W + 1;
- OUTWDS++;
- ▌
-
- WIDTH (BUF) /* COMPUTE WIDTH OF CHARACTER STRING */
- CHAR *BUF;
- █
- UNSIGNED WDTH;
-
- FOR (WDTH=0; *BUF; BUF++)
- IF (*BUF != '\N')
- WDTH++;
- RETURN WDTH;
- ▌
-
- BRK() /* END CURRENT FILLED LINE */
- █
- IF (OUTP >= 0) █
- OUTBUF[OUTP] = '\N';
- OUTBUF[OUTP+1] = '\0';
- PUT (OUTBUF);
- ▌
- OUTP = -1;
- OUTW = 0;
- OUTWDS = 0;
- ▌
-
- SPREAD (BUF, OUTP, NEXTRA, OUTWDS)
- CHAR *BUF;
- █
- STATIC DIR = 0;
- UNSIGNED I, J, NB, NE, NHOLES;
-
- IF (NEXTRA <= 0 ▀▀ OUTWDS <= 1)
- RETURN;
- DIR = 1 - DIR;
- NE = NEXTRA;
- NHOLES = OUTWDS - 1;
- I = OUTP - 1;
- J = MIN (═┴╪╧╒╘-3, I+NE);
- WHILE (I < J) █
- BUF[J] = BUF[I];
- IF (BUF[I] == ' ') █
- IF (DIR == 0)
- NB = (NE-1)/NHOLES + 1;
- ELSE
- NB = NE / NHOLES;
- NE -= NB;
- NHOLES--;
- FOR (; NB > 0; NB--) █
- J--;
- BUF[J] = ' ';
- ▌
- ▌
- I--;
- J--;
- ▌
- ▌
-
- CENTER (BUF) /* CENTER A LINE BY SETTING TIVAL */
- CHAR *BUF;
- █
- UNSIGNED TMP;
-
- TMP = (RMVAL + TIVAL - WIDTH(BUF)) >> 1;
- TIVAL = MAX (TMP, 0);
- ▌
-
- GETWRD (IN, OUT)
- CHAR **IN, *OUT;
- █
- CHAR *I, *J;
-
- I = *IN;
- WHILE (*I == ' ')
- I++;
- J = OUT;
- WHILE (*I && *I != ' ' && *I != '\N')
- *J++ = *I++;
- *J = '\0';
- *IN = I;
- RETURN (J - OUT);
- ▌
-