ren: do not hyphenate last lines, if the 2nd bit of .hy is set
[neatroff.git] / dev.c
blobfd944fd461741fb93fab96df43ac1b98316c6d22
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 int dev_res; /* device resolution */
9 int dev_uwid; /* device unitwidth */
10 int dev_hor; /* minimum horizontal movement */
11 int dev_ver; /* minimum vertical movement */
13 /* mounted fonts */
14 static char fn_name[NFONTS][FNLEN]; /* font names */
15 static struct font *fn_font[NFONTS]; /* font structs */
16 static int fn_n; /* number of mounted fonts */
18 static void skipline(FILE* filp)
20 int c;
21 do {
22 c = getc(filp);
23 } while (c != '\n' && c != EOF);
26 static void dev_prologue(void)
28 out("x T utf\n");
29 out("x res %d %d %d\n", dev_res, dev_hor, dev_ver);
30 out("x init\n");
33 int dev_mnt(int pos, char *id, char *name)
35 char path[PATHLEN];
36 struct font *fn;
37 sprintf(path, "%s/%s", dev_dir, name);
38 fn = font_open(path);
39 if (!fn)
40 return -1;
41 if (fn_font[pos])
42 font_close(fn_font[pos]);
43 if (fn_name[pos] != name) /* ignore if fn_name[pos] is passed */
44 strcpy(fn_name[pos], id);
45 fn_font[pos] = fn;
46 out("x font %d %s\n", pos, name);
47 return pos;
50 int dev_open(char *dir)
52 char path[PATHLEN];
53 char tok[ILNLEN];
54 int i;
55 FILE *desc;
56 strcpy(dev_dir, dir);
57 sprintf(path, "%s/DESC", dir);
58 desc = fopen(path, "r");
59 while (fscanf(desc, "%s", tok) == 1) {
60 if (tok[0] == '#') {
61 skipline(desc);
62 continue;
64 if (!strcmp("fonts", tok)) {
65 fscanf(desc, "%d", &fn_n);
66 for (i = 0; i < fn_n; i++)
67 fscanf(desc, "%s", fn_name[i + 1]);
68 fn_n++;
69 continue;
71 if (!strcmp("sizes", tok)) {
72 while (fscanf(desc, "%s", tok) == 1)
73 if (!strcmp("0", tok))
74 break;
75 continue;
77 if (!strcmp("res", tok)) {
78 fscanf(desc, "%d", &dev_res);
79 continue;
81 if (!strcmp("unitwidth", tok)) {
82 fscanf(desc, "%d", &dev_uwid);
83 continue;
85 if (!strcmp("hor", tok)) {
86 fscanf(desc, "%d", &dev_hor);
87 continue;
89 if (!strcmp("ver", tok)) {
90 fscanf(desc, "%d", &dev_ver);
91 continue;
93 if (!strcmp("charset", tok))
94 break;
95 skipline(desc);
97 fclose(desc);
98 dev_prologue();
99 for (i = 0; i < fn_n; i++)
100 if (*fn_name[i])
101 dev_mnt(i, fn_name[i], fn_name[i]);
102 return 0;
105 static void dev_epilogue(void)
107 out("x trailer\n");
108 out("x stop\n");
111 void dev_close(void)
113 int i;
114 dev_epilogue();
115 for (i = 0; i < fn_n; i++) {
116 if (fn_font[i])
117 font_close(fn_font[i]);
118 fn_font[i] = NULL;
122 /* glyph handling functions */
124 struct glyph *dev_glyph(char *c, int fn)
126 struct glyph *g;
127 int i;
128 if ((c[0] == c_ec || c[0] == c_ni) && c[1] == c_ec)
129 c++;
130 if (c[0] == c_ec && c[1] == '(')
131 c += 2;
132 c = tr_map(c);
133 g = font_find(fn_font[fn], c);
134 if (g)
135 return g;
136 for (i = 0; i < fn_n; i++)
137 if (fn_font[i] && fn_font[i]->special)
138 if ((g = font_find(fn_font[i], c)))
139 return g;
140 return NULL;
143 struct glyph *dev_glyph_byid(char *id, int fn)
145 return font_glyph(fn_font[fn], id);
148 int dev_kernpair(char *c1, char *c2)
150 return 0;
153 /* return the mounted position of font */
154 int dev_pos(char *id)
156 int i;
157 if (isdigit(id[0])) {
158 int num = atoi(id);
159 if (num < 0 || num >= fn_n || !fn_font[num]) {
160 errmsg("bad font position\n");
161 return -1;
163 return num;
165 for (i = 1; i < fn_n; i++)
166 if (!strcmp(fn_name[i], id))
167 return i;
168 if (!strcmp(fn_name[0], id))
169 return 0;
170 return dev_mnt(0, id, id);
173 /* return the font struct at pos */
174 struct font *dev_font(int pos)
176 return pos >= 0 && pos < fn_n ? fn_font[pos] : NULL;
179 int dev_getcs(int fn)
181 return dev_font(fn)->cs;
184 void dev_setcs(int fn, int cs)
186 if (fn >= 0)
187 dev_font(fn)->cs = cs;
190 int dev_getbd(int fn)
192 return dev_font(fn)->bd;
195 void dev_setbd(int fn, int bd)
197 if (fn >= 0)
198 dev_font(fn)->bd = bd;