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 ╬┼ 18
- #DEFINE ╬├═─╙ 18
-
- #DEFINE MAX(X,Y) ( (X) > (Y) ? (X) : (Y) )
- #DEFINE MIN(X,Y) ( (X) > (Y) ? (Y) : (X) )
-
- 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 */
-
- CHAR HEADL[═┴╪╠╔╬┼], HEADC[═┴╪╠╔╬┼], HEADR[═┴╪╠╔╬┼]; /* TOP OF PAGE TITLE */
- CHAR FOOTL[═┴╪╠╔╬┼], FOOTC[═┴╪╠╔╬┼], FOOTR[═┴╪╠╔╬┼]; /* END OF PAGE TITLE */
-
- CHAR OUTBUF[═┴╪╧╒╘]; /* OUTPUT BUFFER */
- INT OUTP, /* LAST CHAR POSITION IN OUTBUF */
- OUTW, /* WIDTH OF TEXT CURRENTLY IN OUTBUF */
- OUTWDS; /* NUMBER OF WORDS IN OUTBUF */
-
-
- MAIN (ARGC, ARGV) /* TEXT FORMATTER */
- UNSIGNED ARGC;
- CHAR **ARGV;
- █
- ╞╔╠┼ FIN;
-
- INIT();
- IF (ARGC == 1)
- FORMAT (STDIN);
- ELSE
- WHILE (--ARGC) █
- IF ((FIN = FOPEN (*++ARGV, "R")) == ╬╒╠╠ ▀▀ FERROR()) █
- PRINTF ("CAN'T OPEN %S\N", *ARGV);
- EXIT();
- ▌
- FORMAT (FIN);
- FCLOSE (FIN);
- ▌
- IF (LINENO > 0)
- SPACE (╚╒╟┼);
- ▌
-
- FORMAT (FIN)
- ╞╔╠┼ FIN;
- █
- STATIC CHAR INBUF[╔╬╙╔┌┼];
-
- WHILE (FGETS (INBUF, ╔╬╙╔┌┼, FIN) != ╬╒╠╠)
- IF (*INBUF == ├╧══┴╬─)
- COMMAND (INBUF);
- ELSE
- TEXT (INBUF);
- ▌
-
- INIT() /* INITIALIZE VARIABLES */
- █
- CURPAG = 0;
- NEWPAG = 1;
- LINENO = 0;
- PLVAL = ╨┴╟┼╠┼╬;
- *HEADL = '\0';
- *HEADC = '\0';
- *HEADR = '\0';
- *FOOTL = '\0';
- *FOOTC = '\0';
- *FOOTR = '\0';
- FILL = ┘┼╙;
- LSVAL = 1;
- INVAL = 0;
- RMVAL = ╨┴╟┼╫╔─╘╚;
- TIVAL = 0;
- CEVAL = 0;
- OUTP = -1;
- OUTW = 0;
- OUTWDS = 0;
- M1VAL = ═┴╥╟╔╬;
- M2VAL = ═┴╥╟╔╬;
- M3VAL = ═┴╥╟╔╬;
- M4VAL = ═┴╥╟╔╬;
- BOTTOM = PLVAL - M3VAL - M4VAL;
- ▌
-
- COMMAND (BUF) /* PERFORM FORMATTING COMMAND */
- CHAR *BUF;
- █
- INT CT;
- INT VAL;
- STATIC CHAR ARGTYP;
- STATIC SPVAL;
-
- IF ((CT = COMTYP(BUF)) == ╒╬╦╬╧╫╬)
- RETURN;
- VAL = GETVAL (BUF, &ARGTYP);
- SWITCH (CT) █
- CASE ╞╔:
- BRK();
- FILL = ┘┼╙;
- BREAK;
- CASE ╬╞:
- BRK();
- FILL = ╬╧;
- BREAK;
- CASE ┬╥:
- BRK();
- BREAK;
- CASE ╠╙:
- SET (&LSVAL, VAL, ARGTYP, 1, 1, ╚╒╟┼);
- BREAK;
- CASE ╙╨:
- SET (&SPVAL, VAL, ARGTYP, 1, 0, ╚╒╟┼);
- SPACE (SPVAL);
- BREAK;
- CASE ┬╨:
- IF (LINENO > 0)
- SPACE (╚╒╟┼);
- SET (&CURPAG, VAL, ARGTYP, CURPAG+1, -╚╒╟┼, ╚╒╟┼);
- NEWPAG = CURPAG;
- BREAK;
- CASE ╨╠:
- SET (&PLVAL, VAL, ARGTYP, ╨┴╟┼╠┼╬, M1VAL+M2VAL+M3VAL+M4VAL+1, ╚╒╟┼);
- BOTTOM = PLVAL - M3VAL - M4VAL;
- BREAK;
- CASE ╔╬:
- SET (&INVAL, VAL, ARGTYP, 0, 0, RMVAL - 1);
- TIVAL = INVAL;
- BREAK;
- CASE ╥═:
- SET (&RMVAL, VAL, ARGTYP, ╨┴╟┼╫╔─╘╚, TIVAL+1, ╚╒╟┼);
- BREAK;
- CASE ╘╔:
- SET (&TIVAL, VAL, ARGTYP, 0, 0, RMVAL);
- BREAK;
- CASE ├┼:
- BRK();
- SET (&CEVAL, VAL, ARGTYP, 1, 0, ╚╒╟┼);
- BREAK;
- CASE ╚┼:
- GETTL (BUF, HEADL, HEADC, HEADR);
- BREAK;
- CASE ╞╧:
- GETTL (BUF, FOOTL, FOOTC, FOOTR);
- BREAK;
- CASE ═1:
- SET (&M1VAL, VAL, ARGTYP, ═┴╥╟╔╬, 0, PLVAL-M2VAL-M3VAL-M4VAL-1);
- BREAK;
- CASE ═2:
- SET (&M2VAL, VAL, ARGTYP, ═┴╥╟╔╬, 0, PLVAL-M1VAL-M3VAL-M4VAL-1);
- BREAK;
- CASE ═3:
- SET (&M3VAL, VAL, ARGTYP, ═┴╥╟╔╬, 0, PLVAL-M1VAL-M2VAL-M4VAL-1);
- BOTTOM = PLVAL - M3VAL - M4VAL;
- BREAK;
- CASE ═4:
- SET (&M4VAL, VAL, ARGTYP, ═┴╥╟╔╬, 0, PLVAL-M1VAL-M2VAL-M3VAL-1);
- BOTTOM = PLVAL - M3VAL - M4VAL;
- BREAK;
- CASE ╬┼:
- BRK();
- IF (VAL > BOTTOM - LINENO + 1)
- SPACE (╚╒╟┼);
- BREAK;
- ▌
- ▌
-
- COMTYP (BUF)
- CHAR *BUF;
- █
- STATIC CHAR COMMANDS[][3] = █
- "FI", "NF", "BR", "LS", "BP",
- "SP", "IN", "RM", "TI", "CE",
- "HE", "FO", "PL", "M1", "M2",
- "M3", "M4", "NE"
- ▌;
- CHAR *P;
- UNSIGNED I;
-
- FOR (P=COMMANDS, I=1; I <= ╬├═─╙; I++, P+=3)
- IF (BUF[1] == *P && BUF[2] == *(P+1))
- RETURN (I);
- RETURN ╒╬╦╬╧╫╬;
- ▌
-
- GETVAL (BUF, ARGTYP) /* EVALUATE OPTIONAL NUMERIC ARGUMENT */
- CHAR *BUF, *ARGTYP;
- █
- CHAR *SKIPB();
-
- BUF = SKIPB (BUF + 3);
- *ARGTYP = *BUF;
- IF (*ARGTYP == '+' ▀▀ *ARGTYP == '-')
- BUF++;
- RETURN (ATOI(BUF));
- ▌
-
- SET (PARAM, VAL, ARGTYP, DEFVAL, MINVAL, MAXVAL)
- INT *PARAM;
- █
- SWITCH (ARGTYP) █
- CASE '\N':
- *PARAM = DEFVAL;
- BREAK;
- CASE '+':
- *PARAM += VAL;
- BREAK;
- CASE '-':
- *PARAM -= VAL;
- BREAK;
- DEFAULT:
- *PARAM = VAL;
- ▌
- *PARAM = MIN (*PARAM, MAXVAL);
- *PARAM = MAX (*PARAM, MINVAL);
- ▌
-
- PUT (BUF) /* PUT OUT LINE WITH PROPER SPACING AND INDENTING */
- CHAR *BUF;
- █
- UNSIGNED I;
-
- IF (LINENO == 0 ▀▀ LINENO > BOTTOM)
- PHEAD();
- FOR (I = TIVAL; I--;)
- PUTCHAR (' ');
- TIVAL = INVAL;
- FPUTS (BUF, STDOUT);
- SKIP (MIN(LSVAL-1, BOTTOM-LINENO));
- LINENO += LSVAL;
- IF (LINENO > BOTTOM)
- PFOOT();
- ▌
-
- PHEAD() /* PUT OUT PAGE HEADER */
- █
- CURPAG = NEWPAG++;
- IF (M1VAL > 0) █
- SKIP (M1VAL - 1);
- PUTTL (HEADL, HEADC, HEADR, CURPAG);
- ▌
- SKIP (M2VAL);
- LINENO = M1VAL + M2VAL + 1;
- ▌
-
- PFOOT() /* PUT OUT PAGE FOOTER */
- █
- SKIP (M3VAL);
- IF (M4VAL > 0) █
- PUTTL (FOOTL, FOOTC, FOOTR, CURPAG);
- SKIP (M4VAL - 1);
- ▌
- ▌
-
- PUTTL (TTLL, TTLC, TTLR, PAGENO) /* PUT OUT TITLE LINE WITH OPTIONAL PAGE NUMBER */
- CHAR *TTLL, *TTLC, *TTLR;
- █
- STATIC CHAR TTLOUT[═┴╪╠╔╬┼];
- INT LEN, NCHARS, SHIFT;
-
- NCHARS = EXPAND (TTLOUT, TTLL, PAGENO) + TIVAL;
- PRINTF ("%*S", NCHARS, TTLOUT);
- LEN = EXPAND (TTLOUT, TTLC, PAGENO);
- SHIFT = ((RMVAL + TIVAL - LEN) >> 1) - NCHARS;
- PRINTF ("%*S", SHIFT+LEN, TTLOUT);
- NCHARS += SHIFT + LEN;
- EXPAND (TTLOUT, TTLR, PAGENO);
- PRINTF ("%*S\N", MAX(RMVAL-NCHARS,0), TTLOUT);
- ▌
-
- EXPAND (OUT, IN, PAGENO)
- CHAR *OUT, *IN;
- █
- CHAR *I;
-
- FOR (I = OUT; *IN; IN++)
- IF (*IN == ╨┴╟┼╬╒═) █
- SPRINTF (I, "%D", PAGENO);
- FOR (; *I; I++)
- ;
- ▌ ELSE
- *I++ = *IN;
- *I = '\0';
- RETURN (STRLEN(OUT));
- ▌
-
- GETTL (BUF, TTLL, TTLC, TTLR) /* COPY TITLE FROM BUF TO TTL */
- CHAR *BUF, *TTLL, *TTLC, *TTLR;
- █
- IF ((BUF = GETTL2 (BUF, TTLL)) == ╬╒╠╠)
- RETURN;
- IF ((BUF = GETTL2 (BUF, TTLL)) == ╬╒╠╠)
- RETURN;
- IF ((BUF = GETTL2 (BUF, TTLC)) == ╬╒╠╠)
- RETURN;
- GETTL2 (BUF, TTLR);
- ▌
-
- GETTL2 (BUF, TTL)
- CHAR *BUF, *TTL;
- █
- FOR (BUF++; *BUF != '/'; BUF++) █
- IF (*BUF == '\N') █
- *TTL = '\0';
- RETURN ╬╒╠╠;
- ▌
- *TTL++ = *BUF;
- ▌
- *TTL = '\0';
- RETURN BUF;
- ▌
-
- SPACE (N) /* SPACE N LINES OR TO BOTTOM OF PAGE */
- █
- BRK();
- IF (LINENO > BOTTOM)
- RETURN;
- IF (LINENO == 0)
- PHEAD();
- SKIP (MIN(N, BOTTOM+1-LINENO));
- LINENO += N;
- IF (LINENO > BOTTOM)
- PFOOT();
- ▌
-
- SKIP (N) /* OUTPUT N BLANK LINES */
- █
- INT I;
-
- FOR (I = 1; I <= N; I++)
- PUTCHAR ('\N');
- ▌
-
- CHAR *SKIPB (P)
- CHAR *P;
- █
- FOR (; *P == ' '; P++)
- ;
- RETURN P;
- ▌
-