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
main(argc,argv)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