tr: map font name to font position earlier for .ochar
[neatroff.git] / dev.c
blob44c2fe9683e1dddef3de4b9374e7ec3e31bfda6d
1 #include <ctype.h>
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <string.h>
5 #include "roff.h"
7 char dev_dir[PATHLEN]; /* device directory */
8 char dev_dev[PATHLEN]; /* output device name */
9 int dev_res; /* device resolution */
10 int dev_uwid; /* device unitwidth */
11 int dev_hor; /* minimum horizontal movement */
12 int dev_ver; /* minimum vertical movement */
14 /* mounted fonts */
15 static char fn_name[NFONTS][FNLEN]; /* font names */
16 static struct font *fn_font[NFONTS]; /* font structs */
17 static int fn_n; /* number of mounted fonts */
19 /* .fspecial request */
20 static char fspecial_fn[NFONTS][FNLEN]; /* .fspecial first arguments */
21 static char fspecial_sp[NFONTS][FNLEN]; /* .fspecial special fonts */
22 static int fspecial_n; /* number of fonts in fspecial_sp[] */
24 static void skipline(FILE* filp)
26 int c;
27 do {
28 c = getc(filp);
29 } while (c != '\n' && c != EOF);
32 static void dev_prologue(void)
34 out("x T %s\n", dev_dev);
35 out("x res %d %d %d\n", dev_res, dev_hor, dev_ver);
36 out("x init\n");
39 int dev_mnt(int pos, char *id, char *name)
41 char path[PATHLEN];
42 struct font *fn;
43 sprintf(path, "%s/dev%s/%s", dev_dir, dev_dev, name);
44 fn = font_open(path);
45 if (!fn)
46 return -1;
47 if (fn_font[pos])
48 font_close(fn_font[pos]);
49 if (fn_name[pos] != name) /* ignore if fn_name[pos] is passed */
50 strcpy(fn_name[pos], id);
51 fn_font[pos] = fn;
52 out("x font %d %s\n", pos, name);
53 return pos;
56 int dev_open(char *dir, char *dev)
58 char path[PATHLEN];
59 char tok[ILNLEN];
60 int i;
61 FILE *desc;
62 strcpy(dev_dir, dir);
63 strcpy(dev_dev, dev);
64 sprintf(path, "%s/dev%s/DESC", dir, dev);
65 desc = fopen(path, "r");
66 if (!desc)
67 return 1;
68 while (fscanf(desc, "%s", tok) == 1) {
69 if (tok[0] == '#') {
70 skipline(desc);
71 continue;
73 if (!strcmp("fonts", tok)) {
74 fscanf(desc, "%d", &fn_n);
75 for (i = 0; i < fn_n; i++)
76 fscanf(desc, "%s", fn_name[i + 1]);
77 fn_n++;
78 continue;
80 if (!strcmp("sizes", tok)) {
81 while (fscanf(desc, "%s", tok) == 1)
82 if (!strcmp("0", tok))
83 break;
84 continue;
86 if (!strcmp("res", tok)) {
87 fscanf(desc, "%d", &dev_res);
88 continue;
90 if (!strcmp("unitwidth", tok)) {
91 fscanf(desc, "%d", &dev_uwid);
92 continue;
94 if (!strcmp("hor", tok)) {
95 fscanf(desc, "%d", &dev_hor);
96 continue;
98 if (!strcmp("ver", tok)) {
99 fscanf(desc, "%d", &dev_ver);
100 continue;
102 if (!strcmp("charset", tok))
103 break;
104 skipline(desc);
106 fclose(desc);
107 dev_prologue();
108 for (i = 0; i < fn_n; i++)
109 if (*fn_name[i])
110 dev_mnt(i, fn_name[i], fn_name[i]);
111 return 0;
114 static void dev_epilogue(void)
116 out("x trailer\n");
117 out("x stop\n");
120 void dev_close(void)
122 int i;
123 dev_epilogue();
124 for (i = 0; i < fn_n; i++) {
125 if (fn_font[i])
126 font_close(fn_font[i]);
127 fn_font[i] = NULL;
131 /* glyph handling functions */
133 struct glyph *dev_glyph(char *c, int fn)
135 struct glyph *g;
136 int i;
137 if ((c[0] == c_ec || c[0] == c_ni) && c[1] == c_ec)
138 c++;
139 if (c[0] == c_ec && c[1] == '(')
140 c += 2;
141 c = cmap_map(c);
142 g = font_find(fn_font[fn], c);
143 if (g)
144 return g;
145 for (i = 0; i < fspecial_n; i++)
146 if (dev_pos(fspecial_fn[i]) == fn && dev_pos(fspecial_sp[i]) >= 0)
147 if ((g = font_find(dev_font(dev_pos(fspecial_sp[i])), c)))
148 return g;
149 for (i = 0; i < fn_n; i++)
150 if (fn_font[i] && fn_font[i]->special)
151 if ((g = font_find(fn_font[i], c)))
152 return g;
153 return NULL;
156 struct glyph *dev_glyph_byid(char *id, int fn)
158 return font_glyph(fn_font[fn], id);
161 int dev_kernpair(char *c1, char *c2)
163 return 0;
166 /* return the mounted position of a font */
167 int dev_pos(char *id)
169 int i;
170 if (isdigit(id[0])) {
171 int num = atoi(id);
172 if (num < 0 || num >= fn_n || !fn_font[num]) {
173 errmsg("bad font position\n");
174 return -1;
176 return num;
178 for (i = 1; i < fn_n; i++)
179 if (!strcmp(fn_name[i], id))
180 return i;
181 if (!strcmp(fn_name[0], id))
182 return 0;
183 return dev_mnt(0, id, id);
186 /* return the mounted position of a font struct */
187 int dev_fontpos(struct font *fn)
189 int i;
190 for (i = 0; i < fn_n; i++)
191 if (fn_font[i] == fn)
192 return i;
193 return 0;
196 /* return the font struct at pos */
197 struct font *dev_font(int pos)
199 return pos >= 0 && pos < fn_n ? fn_font[pos] : NULL;
202 int dev_getcs(int fn)
204 return dev_font(fn)->cs;
207 void dev_setcs(int fn, int cs)
209 if (fn >= 0)
210 dev_font(fn)->cs = cs;
213 int dev_getbd(int fn)
215 return dev_font(fn)->bd;
218 void dev_setbd(int fn, int bd)
220 if (fn >= 0)
221 dev_font(fn)->bd = bd;
224 void tr_fspecial(char **args)
226 char *fn = args[1];
227 int i;
228 if (!fn) {
229 fspecial_n = 0;
230 return;
232 for (i = 2; i < NARGS; i++) {
233 if (args[i] && fspecial_n < LEN(fspecial_fn)) {
234 strcpy(fspecial_fn[fspecial_n], fn);
235 strcpy(fspecial_sp[fspecial_n], args[i]);
236 fspecial_n++;