ref: f2bd9dc3bbe0453855d163df286e5a5d93f6ec18
dir: /dev.c/
#include <ctype.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include "post.h" char dev_dir[PATHLEN]; /* device directory */ char dev_dev[PATHLEN]; /* output device name */ int dev_res; /* device resolution */ int dev_uwid; /* device unitwidth */ int dev_hor; /* minimum horizontal movement */ int dev_ver; /* minimum vertical movement */ /* mounted fonts */ static char fn_name[NFONTS][FNLEN]; /* font names */ static struct font *fn_font[NFONTS]; /* font structs */ static int fn_n; /* number of mounted fonts */ static void skipline(FILE* filp) { int c; do { c = getc(filp); } while (c != '\n' && c != EOF); } int dev_mnt(int pos, char *id, char *name) { char path[PATHLEN]; struct font *fn; sprintf(path, "%s/dev%s/%s", dev_dir, dev_dev, name); fn = font_open(path); if (!fn) return -1; if (fn_font[pos]) font_close(fn_font[pos]); if (fn_name[pos] != name) /* ignore if fn_name[pos] is passed */ strcpy(fn_name[pos], id); fn_font[pos] = fn; return pos; } int dev_open(char *dir, char *dev) { char path[PATHLEN]; char tok[ILNLEN]; int i; FILE *desc; strcpy(dev_dir, dir); strcpy(dev_dev, dev); sprintf(path, "%s/dev%s/DESC", dir, dev); desc = fopen(path, "r"); while (fscanf(desc, "%s", tok) == 1) { if (tok[0] == '#') { skipline(desc); continue; } if (!strcmp("fonts", tok)) { fscanf(desc, "%d", &fn_n); for (i = 0; i < fn_n; i++) fscanf(desc, "%s", fn_name[i + 1]); fn_n++; continue; } if (!strcmp("sizes", tok)) { while (fscanf(desc, "%s", tok) == 1) if (!strcmp("0", tok)) break; continue; } if (!strcmp("res", tok)) { fscanf(desc, "%d", &dev_res); continue; } if (!strcmp("unitwidth", tok)) { fscanf(desc, "%d", &dev_uwid); continue; } if (!strcmp("hor", tok)) { fscanf(desc, "%d", &dev_hor); continue; } if (!strcmp("ver", tok)) { fscanf(desc, "%d", &dev_ver); continue; } if (!strcmp("charset", tok)) break; skipline(desc); } fclose(desc); return 0; } void dev_close(void) { int i; for (i = 0; i < fn_n; i++) { if (fn_font[i]) font_close(fn_font[i]); fn_font[i] = NULL; } } struct glyph *dev_glyph(char *c, int fn) { struct glyph *g; int i; g = font_find(fn_font[fn], c); if (g) return g; for (i = 0; i < fn_n; i++) if (fn_font[i] && fn_font[i]->special) if ((g = font_find(fn_font[i], c))) return g; return NULL; } struct glyph *dev_glyph_byid(char *id, int fn) { return font_glyph(fn_font[fn], id); } int dev_kernpair(char *c1, char *c2) { return 0; } /* return the font struct at pos */ struct font *dev_font(int pos) { return pos >= 0 && pos < fn_n ? fn_font[pos] : NULL; } int charwid(int wid, int sz) { /* the original troff rounds the widths up */ return (wid * sz + dev_uwid / 2) / dev_uwid; } int dev_fontid(struct font *fn) { int i; for (i = 0; i < fn_n; i++) if (fn_font[i] == fn) return i; return 0; }