home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CP/M
/
CPM_CDROM.iso
/
enterprs
/
c128
/
util
/
128c.arc
/
FORMAT.C
< prev
next >
Wrap
Text File
|
1993-03-04
|
8KB
|
381 lines
#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;
▌