|
|
1.1 ! root 1: /* ! 2: * fonts.c ! 3: * Troff. ! 4: * Font loading. ! 5: */ ! 6: ! 7: #include <ctype.h> ! 8: #include <canon.h> ! 9: #include "roff.h" ! 10: ! 11: static int errflag; /* font table read error flag */ ! 12: int nfonts; /* number of fonts available */ ! 13: ! 14: /* ! 15: * Map user font names to font numbers. ! 16: * Several troff font names can map to the same font number. ! 17: * Entries get added by .lf or .rf. ! 18: */ ! 19: FTB fontab[NFNAMES]; ! 20: ! 21: /* ! 22: * Font width table pointers, indexed by font number. ! 23: * The order of built-in entries corresponds to the indices in "fonts.h". ! 24: * The .lf request adds additional entries to this table. ! 25: */ ! 26: FWTAB *fwptab[NFONTS]; ! 27: ! 28: /* Read a canonical short from file. */ ! 29: int ! 30: get_short(fp) register FILE *fp; ! 31: { ! 32: short s; ! 33: ! 34: if (fread(&s, sizeof s, 1, fp) != 1) ! 35: errflag = 1; ! 36: canint(s); ! 37: return (int)s; ! 38: } ! 39: ! 40: /* ! 41: * Read a NUL-terminated string from file. ! 42: * Return a pointer to a newly allocated copy of it. ! 43: * Die if it is too long. ! 44: */ ! 45: #define NBUF 256 ! 46: char * ! 47: get_str(fp) register FILE *fp; ! 48: { ! 49: static char buf[NBUF]; ! 50: register char *s; ! 51: register int c; ! 52: ! 53: for (s = buf; s < &buf[NBUF]; ) { ! 54: c = fgetc(fp); ! 55: *s++ = c; ! 56: if (c == '\0') ! 57: break; ! 58: else if (c == EOF) { ! 59: errflag = 1; ! 60: return NULL; ! 61: } ! 62: } ! 63: if (s == &buf[NBUF]) { ! 64: errflag = 1; ! 65: return; ! 66: } ! 67: s = nalloc(strlen(buf) + 1); ! 68: strcpy(s, buf); ! 69: return s; ! 70: } ! 71: ! 72: void ! 73: load_font(s, file) char *s, *file; ! 74: { ! 75: register FWTAB *p; ! 76: register FILE *fp; ! 77: int i, new, newflag; ! 78: ! 79: if ((fp = fopen(file, "rb")) == NULL) { ! 80: /* Not found, look in default fwt directory. */ ! 81: sprintf(miscbuf, "%s%sfwt/%s", ! 82: LIBDIR, (pflag) ? TPSDIR : TPCLDIR, file); ! 83: if ((fp = fopen(miscbuf, "rb")) == NULL) { ! 84: printe(".lf: cannot open file \"%s\"", file); ! 85: return; ! 86: } ! 87: } ! 88: if ((new = font_num(s)) == -1) { ! 89: /* Font does not already exist, allocate new FWTAB entry. */ ! 90: if (nfonts >= NFONTS) { ! 91: printe(".lf: cannot load more than %d fonts", NFONTS); ! 92: return; ! 93: } ! 94: newflag = 1; ! 95: new = nfonts; /* assign new font number */ ! 96: fwptab[new] = nalloc(sizeof(FWTAB)); /* allocate new FWTAB */ ! 97: } else ! 98: newflag = 0; ! 99: errflag = 0; ! 100: p = fwptab[new]; ! 101: p->f_descr = get_str(fp); ! 102: p->f_PSname = get_str(fp); ! 103: p->f_flags = get_short(fp); ! 104: p->f_fonttype = get_short(fp); ! 105: p->f_orientation = get_short(fp); ! 106: p->f_spacing = get_short(fp); ! 107: p->f_symset = get_short(fp); ! 108: p->f_pitch = get_short(fp); ! 109: p->f_psz = get_short(fp); ! 110: p->f_style= get_short(fp); ! 111: p->f_weight = get_short(fp); ! 112: p->f_face = get_short(fp); ! 113: p->f_num = get_short(fp); ! 114: p->f_den = get_short(fp); ! 115: for (i = 0; i < NWIDTH; i++) ! 116: p->f_width[i] = fgetc(fp); ! 117: i = fgetc(fp); /* should return EOF */ ! 118: fclose(fp); ! 119: if (i != EOF || errflag) { ! 120: printe(".lf: %s, file \"%s\"", ! 121: (i != EOF) ? "bad font width table" : "read error", ! 122: file); ! 123: if (newflag) ! 124: free(p); ! 125: return; ! 126: } else if ((p->f_flags & F_PCL) == 0 && !pflag) ! 127: printe(".lf: \"%s\" is not a PCL font width table", file); ! 128: else if ((p->f_flags & F_PS) == 0 && pflag) ! 129: printe(".lf: \"%s\" is not a PostScript font width table", file); ! 130: fpsz[new] = p->f_psz; /* enter pointsize in env */ ! 131: fcsz[new] = 0; /* enter const char size in env */ ! 132: assign_font(s, new); /* and assign desired name */ ! 133: if (newflag) ! 134: ++nfonts; ! 135: } ! 136: ! 137: /* ! 138: * List all the font names and descriptions in this version. ! 139: */ ! 140: void ! 141: font_display() ! 142: { ! 143: register FTB *p; ! 144: register int a, b; ! 145: ! 146: fprintf(stderr, "Fonts available in this version:\n"); ! 147: for (p = fontab; p < &fontab[NFNAMES]; p++) { ! 148: if ((a = p->f_name[0]) == 0) ! 149: break; ! 150: if ((b = p->f_name[1]) == 0) ! 151: b = ' '; ! 152: fprintf(stderr," %c%c %s\n", a, b, fwptab[p->f_font]->f_descr); ! 153: } ! 154: fprintf(stderr, ! 155: "Additional fonts may be loaded with the .lf request.\n" ! 156: "Fonts may be renamed with the .rf request.\n" ! 157: ); ! 158: } ! 159: ! 160: /* ! 161: * Return fontname associated with font number n. ! 162: * Because the mapping is many->one, the user might have ! 163: * specified the font with a different name. ! 164: * The returned value points to a statically allocated buffer. ! 165: */ ! 166: char * ! 167: fontname(n) register int n; ! 168: { ! 169: static char buf[3]; ! 170: register FTB *p; ! 171: ! 172: for (p = fontab; p < &fontab[NFNAMES]; p++) { ! 173: if (p->f_font == n) { ! 174: buf[0] = p->f_name[0]; ! 175: buf[1] = p->f_name[1]; ! 176: buf[2] = '\0'; ! 177: return buf; ! 178: } ! 179: } ! 180: return NULL; ! 181: } ! 182: ! 183: /* end of fonts.c */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.