|
|
1.1 ! root 1: /* ! 2: * makextdev - make an extended character code table for the ditroff ! 3: * interpress converter. ! 4: * ! 5: * Copyright (c) 1984, 1985 Xerox Corp. ! 6: * ! 7: * History: ! 8: * 24-oct-85 ed flint close fontfiles, ran out of open file ! 9: * descriptors with large number of fonts ! 10: * ! 11: * Some of the characters in the interpress fonts have character codes ! 12: * greater than 255. Since the ditroff character code table is an array of ! 13: * char, the codes are too large. This attempts to remedy that situation. ! 14: * If the character code specified in the normal code table is 0377 (decimal ! 15: * 255), then the real code can be found in the extended table (which is an ! 16: * array of short). This program reads the same files that makedev reads and ! 17: * build the extended code table. ! 18: * ! 19: * To specify an extended code in a font table, use a line of the following ! 20: * form: ! 21: * ! 22: * c www kk 0377 xxxxx ! 23: * ! 24: * where: c is the one or two letter character code, ! 25: * www is the character's width, ! 26: * kk is the kerning information, and ! 27: * xxxxx is the actual interpress code for the character. ! 28: * ! 29: * Basically, this is just like any other line in the font table file, except ! 30: * that the standard code is set to 0377 and the actual code is placed on the ! 31: * line as the fifth item. Note that a file with lines like this can still ! 32: * be run thru makedev successfully -- makedev will just ignore the fifth ! 33: * item on the line. ! 34: * ! 35: * One can make the extended tables for all the loaded fonts by saying ! 36: * "makextdev DESC" (just as with makedev), but makedev must be run before ! 37: * doing this, since it will require looking at DESC.out. ! 38: */ ! 39: ! 40: # include "deviceinfo.h" ! 41: # include <stdio.h> ! 42: ! 43: # define Line_length 256 ! 44: ! 45: # define Max_chars 256 /* maximum # of funny chars */ ! 46: /* Tab_size includes all ascii characters except control characters */ ! 47: # define Table_size (Max_chars + 128 - 32) ! 48: ! 49: # define white(ch) ((ch) == ' ' || (ch) == '\t' || (ch) == '\n') ! 50: ! 51: /* values returned by strcmp */ ! 52: # define Equal 0 ! 53: ! 54: char char_name[5 * Max_chars]; ! 55: short char_index_table[Max_chars]; ! 56: ! 57: unsigned char font_index_table[Table_size]; ! 58: unsigned short extend_table[Table_size]; ! 59: struct device_entry device_entry; ! 60: ! 61: main(argc, argv) ! 62: ! 63: int argc; ! 64: char *argv[]; ! 65: ! 66: { ! 67: int i; ! 68: int fntcnt; ! 69: int descfd; ! 70: register char *ptr; ! 71: char line[Line_length]; ! 72: char keyword[80]; ! 73: char *fname; ! 74: FILE *descfile; ! 75: ! 76: if (argc < 2) ! 77: { ! 78: fprintf(stderr, "usage: makextdev font\n"); ! 79: exit(1); ! 80: } ! 81: ! 82: /* First off, get the DESC.out file -- we need the information */ ! 83: if ((descfd = open("DESC.out", 0)) == -1) ! 84: { ! 85: perror("DESC.out"); ! 86: fprintf(stderr, "makextdev: please run \"makedev DESC\" first!\n"); ! 87: exit(1); ! 88: } ! 89: ! 90: /* read struct device_entry off the front */ ! 91: read(descfd, &device_entry, sizeof(device_entry)); ! 92: ! 93: /* skip over the point size table */ ! 94: lseek(descfd, (device_entry.num_sizes + 1) * sizeof(short), 1); ! 95: ! 96: /* read char_index_table and char_name arrays */ ! 97: read(descfd, char_index_table, device_entry.spec_char_num * sizeof(short)); ! 98: read(descfd, char_name, device_entry.spec_name_len); ! 99: for (i=0; i<device_entry.spec_char_num; i++) ! 100: { ! 101: fprintf(stderr, "%d ", char_index_table[i]); ! 102: } ! 103: fputc('\n', stderr); ! 104: for (i=0; i<device_entry.spec_char_num; i++) ! 105: { ! 106: if (char_name[i] == '\0') ! 107: { ! 108: fputc(' ', stderr); ! 109: } ! 110: else ! 111: { ! 112: fputc(char_name[i], stderr); ! 113: } ! 114: } ! 115: fputc('\n', stderr); ! 116: ! 117: /* step thru the arguments */ ! 118: while (--argc > 0) ! 119: { ! 120: fname = *++argv; ! 121: ! 122: if (strcmp(fname, "DESC") == Equal) ! 123: { ! 124: /* do all the preloaded fonts */ ! 125: if ((descfile = fopen(fname, "r")) == NULL) ! 126: { ! 127: perror(fname); ! 128: exit(1); ! 129: } ! 130: ! 131: /* scan thru DESC looking for the "fonts" keyword */ ! 132: do ! 133: { ! 134: if (fgets(line, Line_length, descfile) == NULL) ! 135: { ! 136: fprintf(stderr, "makextdev: no fonts listed in DESC\n"); ! 137: exit(1); ! 138: } ! 139: sscanf(line, "%s", keyword); ! 140: } while (strcmp(keyword, "fonts") != Equal); ! 141: ! 142: /* found the line -- do each font listed on the line */ ! 143: /* line looks like this: fonts n X X X X ... */ ! 144: /* where n is number of fonts and X is a font name */ ! 145: fclose(descfile); ! 146: ptr = line + 5; /* 5 == strlen("fonts") */ ! 147: while (white(*ptr)) ! 148: { ! 149: ptr++; /* never trust a macro */ ! 150: } ! 151: ! 152: /* get font count */ ! 153: fntcnt = atoi(ptr); ! 154: while (!white(*ptr)) ! 155: { ! 156: ptr++; ! 157: } ! 158: while (white(*ptr)) ! 159: { ! 160: ptr++; ! 161: } ! 162: ! 163: /* process each font on the line */ ! 164: while (fntcnt-- > 0) ! 165: { ! 166: register char *fontname; ! 167: ! 168: fontname = ptr; ! 169: while (!white(*ptr)) ! 170: { ! 171: ptr++; ! 172: } ! 173: *ptr++ = '\0'; ! 174: dofont(fontname); ! 175: while (white(*ptr)) ! 176: { ! 177: ptr++; ! 178: } ! 179: } ! 180: } ! 181: else ! 182: { ! 183: dofont(fname); ! 184: } ! 185: } ! 186: } ! 187: ! 188: dofont(fontname) ! 189: ! 190: char *fontname; ! 191: ! 192: { ! 193: int outfile; ! 194: int i; ! 195: int ccode; ! 196: unsigned int xcode; ! 197: char outname[20]; ! 198: char ch[10]; ! 199: char swid[10]; ! 200: char skern[10]; ! 201: char scode[10]; ! 202: char sauxcode[10]; ! 203: char line[Line_length]; ! 204: char keyword[20]; ! 205: FILE *fontfile; ! 206: struct font_entry font_entry; ! 207: ! 208: /* open the file that describes the font */ ! 209: if ((fontfile = fopen(fontname, "r")) == NULL) ! 210: { ! 211: perror(fontname); ! 212: exit(1); ! 213: } ! 214: ! 215: /* find the keyword "charset" */ ! 216: do ! 217: { ! 218: if (fgets(line, Line_length, fontfile) == NULL) ! 219: { ! 220: fprintf(stderr, "makextdev: font %s has no charset\n", fontname); ! 221: exit(1); ! 222: } ! 223: sscanf(line, "%s", keyword); ! 224: } while (strcmp(keyword, "charset") != Equal); ! 225: ! 226: /* get font info from *.out file */ ! 227: /* first, open it */ ! 228: strcpy(outname, fontname); ! 229: strcat(outname, ".out"); ! 230: if ((outfile = open(outname, 0)) == -1) ! 231: { ! 232: perror(outname); ! 233: fprintf(stderr, "makextdev: please run \"makedev %s\" first!\n", ! 234: fontname); ! 235: exit(1); ! 236: } ! 237: ! 238: /* zero extend_table */ ! 239: bzero(extend_table, sizeof(extend_table)); ! 240: ! 241: /* now read the header and font_index_table */ ! 242: read(outfile, &font_entry, sizeof(font_entry)); ! 243: lseek(outfile, (unsigned char)(font_entry.num_char_wid) * 3, 1); /* skip width, kern, and code */ ! 244: read(outfile, font_index_table, device_entry.spec_char_num + 128 - 32); ! 245: close(outfile); ! 246: ! 247: /* unscramble each line */ ! 248: while (fgets(line, Line_length, fontfile) != NULL) ! 249: { ! 250: i = sscanf(line, "%s %s %s %s %s", ch, swid, skern, scode, sauxcode); ! 251: ! 252: if (swid[0] != '"') ! 253: { ! 254: /* translate scode and auxcode into actual numerical values */ ! 255: ccode = convcode(scode); ! 256: xcode = convcode(sauxcode); ! 257: } ! 258: else ! 259: { ! 260: /* it's a repeat of the last character */ ! 261: i = 5; ! 262: } ! 263: ! 264: /* check for extended code */ ! 265: if (ccode == 0377) ! 266: { ! 267: if (i < 5) ! 268: { ! 269: fprintf(stderr, "%s: character %s has no extended code\n", ! 270: fontname, ch); ! 271: } ! 272: else ! 273: { ! 274: /* find the findex and store the extended code in extend_table */ ! 275: if (strlen(ch) == 1) ! 276: { ! 277: /* fprintf(stderr, "font_index_table[%d] = %d\n", ! 278: ch[0] - 32, font_index_table[ch[0] - 32]); ! 279: */ extend_table[font_index_table[ch[0] - 32]] = xcode; ! 280: } ! 281: else ! 282: { ! 283: /* it's a funny name */ ! 284: for (i = 0; i < device_entry.spec_char_num; i++) ! 285: { ! 286: if (strcmp(&char_name[char_index_table[i]], ch) == Equal) ! 287: { ! 288: /* fprintf(stderr, "i = %d, font_index_table[%d] = %d\n", ! 289: i, i+128-32, font_index_table[i+128-32]); ! 290: */ ! 291: extend_table[font_index_table[i + 128-32]] = xcode; ! 292: break; ! 293: } ! 294: } ! 295: } ! 296: } ! 297: } ! 298: } ! 299: ! 300: /* Now, write extend_table in an appropriate file */ ! 301: /* remember: outname currently looks like "XX.out" */ ! 302: strcat(outname, ".ext"); ! 303: if ((outfile = creat(outname, 0666)) == -1) ! 304: { ! 305: perror(outname); ! 306: exit(1); ! 307: } ! 308: write(outfile, extend_table, (device_entry.spec_char_num + 128-32) * sizeof(short)); ! 309: close(outfile); ! 310: fclose(fontfile); ! 311: } ! 312: ! 313: convcode(str) ! 314: ! 315: char *str; ! 316: ! 317: { ! 318: int val; ! 319: ! 320: if (str[0] == '0') ! 321: { ! 322: sscanf(str, "%o", &val); ! 323: } ! 324: else ! 325: { ! 326: val = atoi(str); ! 327: } ! 328: ! 329: return(val); ! 330: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.