2 |
- |
1 |
/*
|
|
|
2 |
*
|
|
|
3 |
* POSTBEGIN, if it's not NULL, is some PostScript code that's sent to the printer
|
|
|
4 |
* before any of the input files. It's not terribly important since the same thing
|
|
|
5 |
* can be accomplished in other ways, but this approach is convenient. POSTBEGIN
|
|
|
6 |
* is initialized so as to disable job timeouts. The string can also be set on the
|
|
|
7 |
* command line using the -P option.
|
|
|
8 |
*
|
|
|
9 |
*/
|
|
|
10 |
|
|
|
11 |
#define POSTBEGIN "statusdict /waittimeout 0 put\n"
|
|
|
12 |
|
|
|
13 |
/*
|
|
|
14 |
*
|
|
|
15 |
* The following help determine where postio is when it's running - either in the
|
|
|
16 |
* START, SEND, or DONE states. Primarily controls what's done in getstatus().
|
|
|
17 |
* RADIAN occasionally had problems with two way conversations. Anyway this stuff
|
|
|
18 |
* can be used to prevent status queries while we're transmitting a job. Enabled
|
|
|
19 |
* by the -q option.
|
|
|
20 |
*
|
|
|
21 |
*/
|
|
|
22 |
|
|
|
23 |
#define NOTCONNECTED 0
|
|
|
24 |
#define START 1
|
|
|
25 |
#define SEND 2
|
|
|
26 |
#define DONE 3
|
|
|
27 |
|
|
|
28 |
/*
|
|
|
29 |
*
|
|
|
30 |
* Previous versions of postio only ran as a single process. That was (and still
|
|
|
31 |
* is) convenient, but meant we could only flow control one direction. Data coming
|
|
|
32 |
* back from the printer occasionally got lost, but that didn't often hurt (except
|
|
|
33 |
* for lost error messages). Anyway I've added code that lets you split the program
|
|
|
34 |
* into separate read and write processes, thereby helping to prevent data loss in
|
|
|
35 |
* both directions. It should be particularly useful when you're sending a job that
|
|
|
36 |
* you expect will be returning useful data over the communications line.
|
|
|
37 |
*
|
|
|
38 |
* The next three definitions control what's done with data on communications line.
|
|
|
39 |
* The READ flag means the line can be read, while the WRITE flag means it can be
|
|
|
40 |
* written. When we're running as a single process both flags are set. I tried to
|
|
|
41 |
* overlay the separate read/write process code on what was there and working for
|
|
|
42 |
* one process. The implementation isn't as good as it could be, but should be
|
|
|
43 |
* safe. The single process version still works, and remains the default.
|
|
|
44 |
*
|
|
|
45 |
*/
|
|
|
46 |
|
|
|
47 |
#define READ 1
|
|
|
48 |
#define WRITE 2
|
|
|
49 |
#define READWRITE 3
|
|
|
50 |
|
|
|
51 |
/*
|
|
|
52 |
*
|
|
|
53 |
* Messages generated on the printer and returned over the communications line
|
|
|
54 |
* look like,
|
|
|
55 |
*
|
|
|
56 |
* %%[ status: idle; source: serial 25 ]%%
|
|
|
57 |
* %%[ status: waiting; source: serial 25 ]%%
|
|
|
58 |
* %%[ status: initializing; source: serial 25 ]%%
|
|
|
59 |
* %%[ status: busy; source: serial 25 ]%%
|
|
|
60 |
* %%[ status: printing; source: serial 25 ]%%
|
|
|
61 |
* %%[ status: PrinterError: out of paper; source: serial 25 ]%%
|
|
|
62 |
* %%[ status: PrinterError: no paper tray; source: serial 25 ]%%
|
|
|
63 |
*
|
|
|
64 |
* %%[ PrinterError: out of paper; source: serial 25 ]%%
|
|
|
65 |
* %%[ PrinterError: no paper tray; source: serial 25 ]%%
|
|
|
66 |
*
|
|
|
67 |
* %%[ Error: undefined; OffendingCommand: xxx ]%%
|
|
|
68 |
* %%[ Flushing: rest of job (to end-of-file) will be ignored ]%%
|
|
|
69 |
*
|
|
|
70 |
* although the list isn't meant to be complete.
|
|
|
71 |
*
|
|
|
72 |
* The following constants are used to classify the recognized printer states.
|
|
|
73 |
* readline() reads complete lines from ttyi and stores them in array mesg[].
|
|
|
74 |
* getstatus() looks for the "%%[ " and " ]%%" delimiters that bracket printer
|
|
|
75 |
* messages and if found it tries to parse the enclosed message. After the lookup
|
|
|
76 |
* one of the following numbers is returned as an indication of the existence or
|
|
|
77 |
* content of the printer message. The return value is used in start(), send(),
|
|
|
78 |
* and done() to figure out what's happening and what can be done next.
|
|
|
79 |
*
|
|
|
80 |
*/
|
|
|
81 |
|
|
|
82 |
#define BUSY 0 /* processing data already sent */
|
|
|
83 |
#define WAITING 1 /* printer wants more data */
|
|
|
84 |
#define PRINTING 2 /* printing a page */
|
|
|
85 |
#define IDLE 3 /* ready to start the next job */
|
|
|
86 |
#define ENDOFJOB 4 /* readline() builds this up on EOF */
|
|
|
87 |
#define PRINTERERROR 5 /* PrinterError - eg. out of paper */
|
|
|
88 |
#define ERROR 6 /* some kind of PostScript error */
|
|
|
89 |
#define FLUSHING 7 /* throwing out the rest of the job */
|
|
|
90 |
#define INITIALIZING 8 /* printer is booting */
|
|
|
91 |
#define DISCONNECT 9 /* from Datakit! */
|
|
|
92 |
#define UNKNOWN 10 /* in case we missed anything */
|
|
|
93 |
#define NOSTATUS 11 /* no response from the printer */
|
|
|
94 |
|
|
|
95 |
#define WRITEPROCESS 12 /* dummy states for write process */
|
|
|
96 |
#define INTERACTIVE 13 /* and interactive mode */
|
|
|
97 |
|
|
|
98 |
/*
|
|
|
99 |
*
|
|
|
100 |
* An array of type Status is used, in getstatus(), to figure out the printer's
|
|
|
101 |
* current state. Just helps convert strings representing the current state into
|
|
|
102 |
* integer codes that other routines use.
|
|
|
103 |
*
|
|
|
104 |
*/
|
|
|
105 |
|
|
|
106 |
typedef struct {
|
|
|
107 |
char *state; /* printer's current status */
|
|
|
108 |
int val; /* value returned by getstatus() */
|
|
|
109 |
} Status;
|
|
|
110 |
|
|
|
111 |
/*
|
|
|
112 |
*
|
|
|
113 |
* STATUS is used to initialize an array of type Status that translates the ASCII
|
|
|
114 |
* strings returned by the printer into appropriate codes that can be used later
|
|
|
115 |
* on in the program. getstatus() converts characters to lower case, so if you
|
|
|
116 |
* add any entries make them lower case and put them in before the UNKNOWN entry.
|
|
|
117 |
* The lookup terminates when we get a match or when an entry with a NULL state
|
|
|
118 |
* is found.
|
|
|
119 |
*
|
|
|
120 |
*/
|
|
|
121 |
|
|
|
122 |
#define STATUS \
|
|
|
123 |
\
|
|
|
124 |
{ \
|
|
|
125 |
"busy", BUSY, \
|
|
|
126 |
"waiting", WAITING, \
|
|
|
127 |
"printing", PRINTING, \
|
|
|
128 |
"idle", IDLE, \
|
|
|
129 |
"endofjob", ENDOFJOB, \
|
|
|
130 |
"printererror", PRINTERERROR, \
|
|
|
131 |
"error", ERROR, \
|
|
|
132 |
"flushing", FLUSHING, \
|
|
|
133 |
"initializing", INITIALIZING, \
|
|
|
134 |
NULL, UNKNOWN \
|
|
|
135 |
}
|
|
|
136 |
|
|
|
137 |
/*
|
|
|
138 |
*
|
|
|
139 |
* The baud rate can be set on the command line using the -b option. If you omit
|
|
|
140 |
* it BAUDRATE will be used.
|
|
|
141 |
*
|
|
|
142 |
*/
|
|
|
143 |
|
|
|
144 |
#define BAUDRATE B9600
|
|
|
145 |
|
|
|
146 |
/*
|
|
|
147 |
*
|
|
|
148 |
* An array of type Baud is used, in routine getbaud(), to translate ASCII strings
|
|
|
149 |
* into termio values that represent the requested baud rate.
|
|
|
150 |
*
|
|
|
151 |
*/
|
|
|
152 |
|
|
|
153 |
typedef struct {
|
|
|
154 |
char *rate; /* string identifying the baud rate */
|
|
|
155 |
short val; /* and its termio.h value */
|
|
|
156 |
} Baud;
|
|
|
157 |
|
|
|
158 |
/*
|
|
|
159 |
*
|
|
|
160 |
* BAUDTABLE initializes the array that's used to translate baud rate requests
|
|
|
161 |
* into termio values. It needs to end with an entry that has NULL assigned to
|
|
|
162 |
* the rate field.
|
|
|
163 |
*
|
|
|
164 |
*/
|
|
|
165 |
|
|
|
166 |
#define BAUDTABLE \
|
|
|
167 |
\
|
|
|
168 |
{ \
|
|
|
169 |
"9600", B9600, \
|
|
|
170 |
"B9600", B9600, \
|
|
|
171 |
"19200", EXTA, \
|
|
|
172 |
"19.2", EXTA, \
|
|
|
173 |
"B19200", EXTA, \
|
|
|
174 |
"EXTA", EXTA, \
|
|
|
175 |
"1200", B1200, \
|
|
|
176 |
"B1200", B1200, \
|
|
|
177 |
"2400", B2400, \
|
|
|
178 |
"B2400", B2400, \
|
|
|
179 |
"B4800", B4800, \
|
|
|
180 |
"4800", B4800, \
|
|
|
181 |
"38400", EXTB, \
|
|
|
182 |
"38.4", EXTB, \
|
|
|
183 |
"B38400", EXTB, \
|
|
|
184 |
"EXTB", EXTB, \
|
|
|
185 |
NULL, B9600 \
|
|
|
186 |
}
|
|
|
187 |
|
|
|
188 |
/*
|
|
|
189 |
*
|
|
|
190 |
* A few miscellaneous definitions. BLOCKSIZE is the default size of the buffer
|
|
|
191 |
* used for reading the input files (changed with the -B option). MESGSIZE is the
|
|
|
192 |
* size of the character array used to store printer status lines - don't make it
|
|
|
193 |
* too small!
|
|
|
194 |
*
|
|
|
195 |
*/
|
|
|
196 |
|
|
|
197 |
#define BLOCKSIZE 2048
|
|
|
198 |
#define MESGSIZE 512
|
|
|
199 |
|
|
|
200 |
/*
|
|
|
201 |
*
|
|
|
202 |
* Some of the non-integer valued functions used in postio.c.
|
|
|
203 |
*
|
|
|
204 |
*/
|
|
|
205 |
|
|
|
206 |
char *find();
|
|
|
207 |
|
|
|
208 |
char *malloc();
|
|
|
209 |
char *strtok();
|