Annotation of researchv10no/cmd/postscript/postio/postio.h, revision 1.1

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();

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.