|
|
1.1 root 1: /*
2: * hpprint.c
3: * 12/13/90
4: * Print a file for the hp daemon.
5: * This is nontrivial for two reasons.
6: * First, the device might be a serial line,
7: * so this needs to worry about getting the mode bits right.
8: * Second, "hpr foo" should expand tabs in foo,
9: * but "hpr -f 1 font" should not muck with the binary font bits.
10: * This routine therefore knows some gory details about HP PCL.
11: */
12:
13: #include <stdio.h>
14: #include <sgtty.h>
15:
16: extern int printing;
17: extern FILE *lp;
18:
19: char ebuf[64];
20:
21: /*
22: * Print the given file.
23: * If fontnum is not -1, the file contains a soft font;
24: * precede and follow it with PCL commands to load it as font fontnum.
25: */
26: print(file, fontnum) char *file; int fontnum;
27: {
28: register FILE *f;
29: register int c;
30: register int nraw = 0;
31: int col = 0;
32: struct sgttyb sg;
33:
34: f = fopen( file, "r");
35: if (f == NULL)
36: return (1);
37: ioctl(fileno(lp), TIOCGETP, &sg);
38: c = sg.sg_flags;
39: sg.sg_flags &= ~(XTABS|CRMOD);
40: ioctl(fileno(lp), TIOCSETP, &sg);
41: sg.sg_flags = c;
42: if (fontnum != -1)
43: fprintf(lp, "\033*c%dD", fontnum); /* assign font # */
44: while ((c=getc(f)) != EOF && printing > 0) {
45: if (nraw) {
46: putc(c, lp);
47: --nraw;
48: continue;
49: }
50: switch (c) {
51: case 033:
52: c = escape(f);
53: /* PCL commands followed by binary data. */
54: if ((c == 'W' && ebuf[1] == '*' && ebuf[2] == 'b')
55: || (c == 'W' && ebuf[1] == '(' && ebuf[2] == 's')
56: || (c == 'W' && ebuf[1] == ')' && ebuf[2] == 's')
57: || (c == 'X' && ebuf[1] == '&' && ebuf[2] == 'p'))
58: nraw = atoi(ebuf+3); /* data count */
59: continue;
60: case '\n':
61: putc('\r', lp);
62: col = 0;
63: putc(c, lp);
64: continue;
65: case '\r':
66: col = 0;
67: putc(c, lp);
68: continue;
69: case '\t':
70: do putc(' ', lp); while ((++col%8) != 0);
71: continue;
72: case '\b':
73: if (col)
74: col -= 1;
75: putc(c, lp);
76: continue;
77: default:
78: if (c >= ' ' && c < 0177)
79: ++col;
80: putc(c, lp);
81: continue;
82: }
83: }
84: if (fontnum != -1)
85: fprintf(lp, "\033*c5F"); /* make font permanent */
86: ioctl(fileno(lp), TIOCSETP, &sg);
87: fclose( f);
88: return (0);
89: }
90:
91: /*
92: * Copy a PCL command (escape sequence) to the printer,
93: * but save a copy in the buffer for later examination.
94: */
95: escape(fp) register FILE *fp;
96: {
97: register char *p;
98: register int c;
99:
100: p = ebuf;
101: *p++ = 033;
102: putc(033, lp);
103: if ((c = getc(fp)) != EOF && printing > 0) {
104: putc(c, lp);
105: *p++ = c;
106: *p = 0;
107: if (c == 'E' || c == '=' || c == '9' || c == 'Y' || c == 'Z')
108: return c;
109: while ((c = getc(fp)) != EOF && printing > 0) {
110: putc(c, lp);
111: *p++ = c;
112: *p = 0;
113: if (c >= '@' && c <= 'Z')
114: return c; /* read until UPPERCASE char */
115: }
116: }
117: return 0;
118: }
119:
120: /* end of hpprint.c */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.