|
|
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.