|
|
1.1 root 1: /*
2: * tty.c
3: * Nroff.
4: * nroff output writer, aka TTY driver.
5: */
6:
7: #include <ctype.h>
8: #include "roff.h"
9:
10: /* Font indices. */
11: #define FONTR 0 /* Roman */
12: #define FONTB 1 /* Bold */
13: #define FONTI 2 /* Italic */
14:
15: /* Special escape sequences. */
16: #define RLF "\0337" /* Reverse line feed */
17: #define HRLF "\0338" /* Half reverse line feed */
18: #define HLF "\0339" /* Half line feed */
19: #define LF "\033B" /* Line feed */
20:
21: /*
22: * Device parameters.
23: */
24: int ntroff = NROFF; /* Programme is NROFF type */
25: long semmul = 3; /* Multiplier for em space */
26: long semdiv = 5; /* Divisor for em space */
27: long senmul = 3; /* Multiplier for en space */
28: long sendiv = 5; /* Divisor for en space */
29: long shrmul = 12; /* Horizontal resolution (mul) */
30: long shrdiv = 1; /* Horizontal resolution (div) */
31: long sinmul = 120; /* Multiplier for inch */
32: long sindiv = 1; /* Divisor for inch */
33: long snrmul = 0; /* Narrow space (mul) */
34: long snrdiv = 1; /* Narrow space (div) */
35: long svrmul = 20; /* Vertical resolution (mul) */
36: long svrdiv = 1; /* Vertical resolution (div) */
37:
38: /*
39: * Map user fontnames to font numbers.
40: */
41: FTB fontab[NFNAMES] ={
42: { 'R', '\0', FONTR },
43: { 'B', '\0', FONTB },
44: { 'I', '\0', FONTI }
45: };
46: static char *font_names[NFNAMES] = { "Roman", "Bold", "Italic" };
47:
48: /*
49: * Initialize nroff-specific parameters.
50: */
51: dev_init()
52: {
53: swdmul = 1; /* multiplier for width table */
54: swddiv = 20; /* divisor for width table */
55: vls = psz = unit(SMINCH, 6*SDINCH);
56:
57: /* Sanity check: width() below assumes swdmul*psz == swddiv. */
58: if (swdmul * psz != swddiv)
59: panic("botch: swdmul=%d psz=%d swddiv=%d", swdmul, psz, swddiv);
60: }
61:
62: /*
63: * Compute the scaled width of a character:
64: * width(c) == unit(swdmul*fonwidt[c]*psz, swddiv).
65: * For nroff, swdmul*psz == swddiv and fonwidt[i] is constant, so it's trivial.
66: */
67: int
68: width(c) register int c;
69: {
70: return (c < NWIDTH) ? 12 : 0;
71: }
72:
73: /*
74: * Given a font number, change to the given font.
75: */
76: dev_font(n) register int n;
77: {
78: addidir(DFONT, curfont = n);
79: }
80:
81: /*
82: * Given a pointer to a buffer containing stream directives
83: * and a pointer to the end of the buffer, print the buffer
84: * out.
85: */
86: flushl(buffer, bufend) CODE *buffer; CODE *bufend;
87: {
88: static int hpos, hres, vres, font;
89: register CODE *cp;
90: register int i, n;
91: char *tp;
92:
93: #if (DDEBUG & DBGFUNC)
94: printd(DBGFUNC, "flushl: hpos=%d, hres=%d, vres=%d, font=%d\n",
95: hpos, hres, vres, font);
96: #endif
97: for (cp = buffer; cp < bufend; cp++) {
98: i = cp->l_arg.c_iarg;
99: #if (DDEBUG & DBGCODE)
100: codebug(cp->l_arg.c_code, i);
101: #endif
102: #if 0
103: fprintf(stderr, "output: %d arg=%d\n", cp->l_arg.c_code, i);
104: #endif
105: switch (cp->l_arg.c_code) {
106: case DNULL:
107: case DHYPH:
108: continue;
109: case DHMOV:
110: case DPADC:
111: hres += i;
112: if ((hpos += i) < 0) {
113: hres -= hpos;
114: hpos = 0;
115: }
116: continue;
117: case DVMOV:
118: vres += i;
119: continue;
120: case DFONT:
121: font = i;
122: continue;
123: case DPSZE:
124: continue;
125: case DSPAR:
126: hpos = hres = 0;
127: vres += i;
128: if (vres >= 0) {
129: n = (vres+10) / 20;
130: vres -= n*20;
131: while (n--)
132: putchar('\n');
133: } else {
134: putchar('\r');
135: n = (-vres+9)/20;
136: vres += n*20;
137: while (n--)
138: printf(RLF);
139: }
140: continue;
141: case DTRAB: /* transparent line */
142: tp = cp->b_arg.c_bufp;
143: while (*tp)
144: putchar(*tp++);
145: free(cp->b_arg.c_bufp);
146: continue;
147: default:
148: if (vres >= 0) {
149: vres += 5;
150: n = (vres) / 20;
151: while (n--)
152: printf(LF);
153: if (vres%20/10)
154: printf(HLF);
155: } else {
156: vres -= 5;
157: n = (-vres)/20;
158: while (n--)
159: printf(RLF);
160: if (-vres%20/10)
161: printf(HRLF);
162: }
163: vres = 0;
164: if (hres >= 0) {
165: n = (hres+6) / 12;
166: hres -= n*12;
167: while (n--)
168: putchar(' ');
169: } else {
170: n = (-hres+5)/12;
171: hres += n*12;
172: while (n--)
173: putchar('\b');
174: }
175: if (cp->l_arg.c_code==DHYPC)
176: n = '-';
177: else
178: n = cp->l_arg.c_code;
179: if (n < 0 || n >= NWIDTH)
180: panic("bad directive %d", n);
181: if ((font != FONTR)
182: && (isascii(n))
183: && (isupper(n) || islower(n) || isdigit(n)))
184: switch (font) {
185: case FONTB:
186: printf("%c\b", n);
187: break;
188: case FONTI:
189: #if 1
190: printf("_\b");
191: #else
192: n |= 0x80;
193: #endif
194: break;
195: #if 0
196: case HELV:
197: printf("_\b");
198: break;
199: #endif
200: default:
201: panic("bad font %d", font);
202: }
203: putchar(n);
204: hres += cp->c_arg.c_move-12;
205: hpos += cp->c_arg.c_move;
206: }
207: }
208: }
209:
210: /*
211: * Display available fonts.
212: */
213: void
214: font_display()
215: {
216: register FTB *p;
217: register int a, b;
218:
219: fprintf(stderr, "Fonts available in this version:\n");
220: for (p = fontab; p < &fontab[NFNAMES]; p++) {
221: if ((a = p->f_name[0]) == 0)
222: break;
223: if ((b = p->f_name[1]) == 0)
224: b = ' ';
225: fprintf(stderr," %c%c %s\n", a, b, font_names[p->f_font]);
226: }
227: fprintf(stderr, "Fonts may be renamed with the .rf request.\n");
228: }
229:
230: /*
231: * The following troff functions are nops for nroff.
232: */
233: #if ZKLUDGE
234: dev_close(){}
235: #endif
236: dev_cs(){}
237: dev_fz(){}
238: dev_ps(){} /* psz initialized in devinit() */
239: newpsze(){}
240: load_font(){}
241:
242:
243: /* end of tty.c */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.