xref: /original-bsd/local/transcript/src/pstext.c (revision ad93c43e)
1 /*	@(#)pstext.c	1.2 09/15/87	*/
2 #ifndef lint
3 static char Notice[] = "Copyright (c) 1985 Adobe Systems Incorporated";
4 static char *RCSID="$Header: pstext.c,v 2.1 85/11/24 11:51:14 shore Rel $";
5 #endif
6 /* pstext.c
7  *
8  * Copyright (C) 1985 Adobe Systems Incorporated
9  *
10  * ultra-simple text formatter for PostScript
11  *
12  * pstext gets called when a text file gets spooled to a
13  * PostScript printer.  In this case, a text file is a
14  * file without the PostScript magic number (%!).
15  *
16  * In BSD systems, pstext is fork/execed from the spooler
17  * communications program, and has an argv like the spooler's.
18  * In SYSV systems, pstext is run by the top-level interface
19  * shell script, and has more control(?) and different args.
20  *
21  * If you want nicer listings, use enscript.
22  *
23  * Edit History:
24  * Andrew Shore: Sat Nov 16 12:09:25 1985
25  * End Edit History.
26  *
27  * RCSLOG:
28  * $Log:	pstext.c,v $
29  * Revision 2.1  85/11/24  11:51:14  shore
30  * Product Release 2.0
31  *
32  * Revision 1.4  85/11/20  00:55:32  shore
33  * Support for System V
34  * argv changes to work with both
35  * 4.2bsd and Sys V spooler interface
36  *
37  * Revision 1.3  85/06/16  20:31:19  shore
38  * fixed page-break bug
39  *
40  * Revision 1.2  85/05/14  11:27:46  shore
41  * fixed blank page bug
42  *
43  *
44  */
45 
46 #include <stdio.h>
47 #include <ctype.h>
48 #include "transcript.h"
49 
50 #define MAXWIDTH 132
51 #define MAXLINES 12
52 
53 private char	buf[MAXLINES][MAXWIDTH];/* MAXLINE lines of MAXWIDTH chars */
54 private int	maxcol[MAXLINES] = {-1};/* max col used in each lines */
55 
56 private int	width = 132;
57 private int	length = 66;
58 private int	indent = 0;
59 private int	controls;
60 private char	*prog;
61 
62 main(argc, argv)
63 int argc;
64 char **argv;
65 {
66     register char *cp;
67     register int ch;
68     int	lineno = 0;
69     int npages = 1;
70     int blanklines = 0;
71     int donepage = 0;
72     int done, linedone, maxline, i, col;
73     char tempfile[512];
74     char *l, *libdir;
75 
76     prog = *argv;
77 
78     /* initialize line buffer to blanks */
79     done = 0;
80     for (cp = buf[0], l = buf[MAXLINES]; cp < l; *cp++ = ' ');
81 
82     /* put out header */
83     if ((libdir = envget("PSLIBDIR")) == NULL) libdir = LibDir;
84     if (copyfile(mstrcat(tempfile,libdir,TEXTPRO,sizeof tempfile), stdout)) {
85 	fprintf(stderr,"%s: trouble copying text prolog\n",prog);
86 	exit(2);
87     }
88     while (!done) {
89 	col = indent;
90 	maxline = -1;
91 	linedone = 0;
92 	while (!linedone) {
93 	    switch (ch = getchar()) {
94 		case EOF:
95 			linedone = done = 1;
96 			break;
97 		case '\f':
98 			lineno = length;
99 		case '\n':
100 			linedone = 1;
101 			break;
102 		case '\b':
103 			if (--col < indent) col = indent;
104 			break;
105 		case '\r':
106 			col = indent;
107 			break;
108 		case '\t':
109 			col = ((col - indent) | 07) + indent + 1;
110 			break;
111 
112 		default:
113 			if ((col >= width) ||
114 			    (!controls && (!isascii(ch) || !isprint(ch)))) {
115 			    col++;
116 			    break;
117 			}
118 			for (i = 0; i < MAXLINES; i++) {
119 			    if (i > maxline) maxline = i;
120 			    cp = &buf[i][col];
121 			    if (*cp == ' ') {
122 				*cp = ch;
123 				if (col > maxcol[i])
124 				    maxcol[i] = col;
125 				break;
126 			    }
127 			}
128 			col++;
129 			break;
130 	    }
131 	}
132 	/* print out lines */
133 	if (maxline == -1) {
134 	    blanklines++;
135 	}
136 	else {
137 	    if (blanklines) {
138 		if (!donepage) {
139 		    printf("%%%%Page: %d %d\nStartPage\n",
140 		    	npages, npages);
141 		    donepage = 1;
142 		}
143 		if (blanklines == 1) {
144 		    printf("B\n");
145 		}
146 		else {
147 		    printf("%d L\n", blanklines);
148 		}
149 		blanklines = 0;
150 	    }
151 	    for (i = 0; i <= maxline; i++) {
152 		if (!donepage) {
153 		    printf("%%%%Page: %d %d\nStartPage\n",
154 		    	npages, npages);
155 		    donepage = 1;
156 		}
157 		putchar('(');
158 		for (cp = buf[i], l = cp+maxcol[i]; cp <= l;) {
159 		    switch (*cp) {
160 			case '(': case ')': case '\\':
161 			    putchar('\\');
162 			default:
163 			    putchar(*cp);
164 			    *cp++ = ' ';
165 		    }
166 		}
167 		printf(")%s\n", (i < maxline) ? "" : "S");
168 	        maxcol[i] = -1;
169 	    }
170 	}
171 	if (++lineno >= length) {
172 	    if (!donepage)
173 		printf("%%%%Page: %d %d\nStartPage\n", npages, npages);
174 	    printf("EndPage\n");
175 	    npages++;
176 	    donepage = 0;
177 	    lineno = 0;
178 	    blanklines = 0;
179 	}
180     }
181     if (lineno && donepage) {
182 	printf("EndPage\n");
183 	donepage = 0;
184 	npages++;
185     }
186     printf("%%%%Trailer\n");
187     VOIDC fclose(stdout);
188     exit(0);
189 }
190