|
|
1.1 ! root 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();
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.