|
|
1.1 ! root 1: #include "tdef.h" ! 2: #include "fns.h" ! 3: #include "ext.h" ! 4: ! 5: #define MAXCH NCHARS /* maximum number of global char names */ ! 6: char *chnames[MAXCH]; /* chnames[n-ALPHABET] -> name of char n */ ! 7: int nchnames; /* number of Cxy names currently seen */ ! 8: ! 9: #define MAXPS 100 /* max number of point sizes */ ! 10: int pstab[MAXPS]; /* point sizes */ ! 11: int nsizes; /* number in DESC */ ! 12: ! 13: Font fonts[MAXFONTS+1]; /* font info + ptr to width info */ ! 14: ! 15: ! 16: #define skipline(f) while (getc(f) != '\n') ! 17: ! 18: getdesc(char *name) ! 19: { ! 20: FILE *fin; ! 21: char cmd[100], s[100]; ! 22: int i, v; ! 23: ! 24: if ((fin = fopen(name, "r")) == NULL) ! 25: return -1; ! 26: while (fscanf(fin, "%s", cmd) != EOF) { ! 27: if (strcmp(cmd, "res") == 0) { ! 28: fscanf(fin, "%d", &Inch); ! 29: } else if (strcmp(cmd, "hor") == 0) { ! 30: fscanf(fin, "%d", &Hor); ! 31: } else if (strcmp(cmd, "vert") == 0) { ! 32: fscanf(fin, "%d", &Vert); ! 33: } else if (strcmp(cmd, "unitwidth") == 0) { ! 34: fscanf(fin, "%d", &Unitwidth); ! 35: } else if (strcmp(cmd, "sizes") == 0) { ! 36: nsizes = 0; ! 37: while (fscanf(fin, "%d", &v) != EOF && v != 0 && nsizes < MAXPS) ! 38: pstab[nsizes++] = v; ! 39: } else if (strcmp(cmd, "fonts") == 0) { ! 40: fscanf(fin, "%d", &nfonts); ! 41: for (i = 1; i <= nfonts; i++) { ! 42: fscanf(fin, "%s", s); ! 43: fontlab[i] = PAIR(s[0], s[1]); ! 44: } ! 45: } else if (strcmp(cmd, "charset") == 0) { /* add any names */ ! 46: while (fscanf(fin, "%s", s) != EOF) ! 47: chadd(s); ! 48: break; ! 49: } ! 50: /* else ! 51: just skip anything else */ ! 52: skipline(fin); ! 53: } ! 54: fclose(fin); ! 55: return 1; ! 56: } ! 57: ! 58: #define eq(s1, s2) (strcmp(s1, s2) == 0) ! 59: ! 60: static int checkfont(char *name) ! 61: { /* in case it's not really a font description file */ ! 62: /* really paranoid, but consider \f. */ ! 63: FILE *fp; ! 64: char buf[300], buf2[300]; ! 65: int i, status = -1; ! 66: ! 67: if ((fp = fopen(name, "r")) == NULL) ! 68: return -1; ! 69: for (i = 1; i <= 10; i++) { ! 70: if (fgets(buf, sizeof buf, fp) == NULL) ! 71: break; ! 72: sscanf(buf, "%s", buf2); ! 73: if (eq(buf2, "name") || eq(buf2, "fontname") || ! 74: eq(buf2, "special") || eq(buf2, "charset")) { ! 75: status = 1; ! 76: break; ! 77: } ! 78: } ! 79: fclose(fp); ! 80: return status; ! 81: ! 82: } ! 83: ! 84: getfont(char *name, int pos) /* create width tab for font */ ! 85: { ! 86: FILE *fin; ! 87: Font *ftemp = &fonts[pos]; ! 88: Chwid chtemp[MAXCH]; ! 89: static Chwid chinit; ! 90: int i, nw, n, wid, kern, code; ! 91: char buf[100], ch[100], s1[100], s2[100], s3[100], cmd[300]; ! 92: ! 93: /* fprintf(stderr, "read font %s onto %d\n", name, pos); */ ! 94: if (checkfont(name) == -1) ! 95: return -1; ! 96: if ((fin = fopen(name, "r")) == NULL) ! 97: return -1; ! 98: for (i = 0; i < ALPHABET; i++) ! 99: chtemp[i] = chinit; /* zero out to begin with */ ! 100: ftemp->specfont = ftemp->ligfont = 0; ! 101: ftemp->defaultwidth = ftemp->spacewidth = Inch * Unitwidth / 72 / 3; /* should be rounded */ ! 102: while (fscanf(fin, "%s", cmd) != EOF) { ! 103: if (strcmp(cmd, "name") == 0) ! 104: fscanf(fin, "%s", ftemp->longname); ! 105: else if (strcmp(cmd, "special") == 0) ! 106: ftemp->specfont = 1; ! 107: else if (strcmp(cmd, "ligatures") == 0) { ! 108: ftemp->ligfont = getlig(fin); ! 109: } else if (strcmp(cmd, "spacewidth") == 0) { ! 110: fscanf(fin, "%d", &ftemp->spacewidth); ! 111: } else if (strcmp(cmd, "defaultwidth") == 0) { ! 112: fscanf(fin, "%d", &ftemp->defaultwidth); ! 113: } else if (strcmp(cmd, "charset") == 0) { ! 114: skipline(fin); ! 115: nw = ALPHABET; ! 116: while (fgets(buf, sizeof buf, fin) != NULL) { ! 117: sscanf(buf, "%s %s %s %s", ch, s1, s2, s3); ! 118: if (s1[0] != '"') { /* genuine new character */ ! 119: sscanf(s1, "%d", &wid); ! 120: sscanf(s2, "%d", &kern); ! 121: code = strtol(s3, 0, 0); /* dec/oct/hex */ ! 122: } ! 123: /* otherwise it's a synonym for prev character, */ ! 124: /* so leave previous values intact */ ! 125: ! 126: ! 127: /* decide what kind of alphabet it might come from here */ ! 128: ! 129: ! 130: if (strlen(ch) == 1) { /* it's ascii */ ! 131: n = ch[0]; /* origin includes non-graphics */ ! 132: chtemp[n].num = ch[0]; ! 133: chtemp[n].wid = wid; ! 134: chtemp[n].kern = kern; ! 135: chtemp[n].code = code; ! 136: } else if (ch[0] == '\\' && ch[1] == '0') { ! 137: /* \0octal or \0xhex */ ! 138: n = strtol(ch+1, 0, 0); ! 139: chtemp[n].num = n; ! 140: chtemp[n].wid = wid; ! 141: chtemp[n].kern = kern; ! 142: chtemp[n].code = code; ! 143: } else { ! 144: if (strcmp(ch, "---") == 0) /* no name */ ! 145: sprintf(ch, "#%d", code); ! 146: if ((n = chindex(ch)) == -1) /* global? */ ! 147: n = chadd(ch); ! 148: chtemp[nw].num = n; ! 149: chtemp[nw].wid = wid; ! 150: chtemp[nw].kern = kern; ! 151: chtemp[nw].code = code; ! 152: nw++; ! 153: } ! 154: /* fprintf(stderr, "font %2.2s char %4.4s num %3d wid %2d code %3d\n", ! 155: ftemp->longname, ch, n, wid, code); ! 156: */ ! 157: } ! 158: break; ! 159: } ! 160: skipline(fin); ! 161: } ! 162: fclose(fin); ! 163: chtemp[' '].wid = ftemp->spacewidth; /* width of space on this font */ ! 164: ftemp->nchars = nw; ! 165: if (ftemp->wp) ! 166: free(ftemp->wp); /* god help us if this wasn't allocated */ ! 167: ftemp->wp = (Chwid *) malloc(nw * sizeof(Chwid)); ! 168: if (ftemp->wp == NULL) ! 169: return -1; ! 170: for (i = 0; i < nw; i++) ! 171: ftemp->wp[i] = chtemp[i]; ! 172: /* ! 173: * printf("%d chars: ", nw); ! 174: * for (i = 0; i < nw; i++) { ! 175: * if (ftemp->wp[i].num > 0 && ftemp->wp[i].num < ALPHABET) ! 176: * printf("%c %d ", ftemp->wp[i].num, ftemp->wp[i].wid); ! 177: * else if (i >= ALPHABET) ! 178: * printf("%d (%s) %d ", ftemp->wp[i].num, ! 179: * chnames[ftemp->wp[i].num-ALPHABET], ftemp->wp[i].wid); ! 180: * } ! 181: * printf("\n"); ! 182: */ ! 183: return 1; ! 184: } ! 185: ! 186: chindex(char *s) /* look for s in global character name table */ ! 187: { ! 188: int i; ! 189: ! 190: for (i = 0; i < nchnames; i++) ! 191: if (strcmp(s, chnames[i]) == 0) ! 192: return i + ALPHABET; /* offset by ALPHABET... */ ! 193: return -1; ! 194: } ! 195: ! 196: chadd(char *s) /* add s to global character name table; assume not there */ ! 197: { /* changes when table format changes */ ! 198: char *p; ! 199: ! 200: chnames[nchnames] = p = (char *) malloc(strlen(s)+1); ! 201: if (p == NULL) { ! 202: ERROR "out of space adding character %s\n", s WARN; ! 203: return LEFTHAND; ! 204: } ! 205: if (nchnames >= NCHARS) { ! 206: ERROR "out ot table space adding character %s\n", s WARN; ! 207: return LEFTHAND; ! 208: } ! 209: strcpy(chnames[nchnames], s); ! 210: return nchnames++ + ALPHABET; ! 211: } ! 212: ! 213: char *chname(int n) /* return string for char with index n */ ! 214: { /* changes when table format changes */ ! 215: return chnames[n-ALPHABET]; ! 216: } ! 217: ! 218: getlig(FILE *fin) /* pick up ligature list */ ! 219: { ! 220: int lig; ! 221: char temp[200]; ! 222: ! 223: lig = 0; ! 224: while (fscanf(fin, "%s", temp) != EOF && strcmp(temp, "0") != 0) { ! 225: if (strcmp(temp, "fi") == 0) ! 226: lig |= LFI; ! 227: else if (strcmp(temp, "fl") == 0) ! 228: lig |= LFL; ! 229: else if (strcmp(temp, "ff") == 0) ! 230: lig |= LFF; ! 231: else if (strcmp(temp, "ffi") == 0) ! 232: lig |= LFFI; ! 233: else if (strcmp(temp, "ffl") == 0) ! 234: lig |= LFFL; ! 235: else ! 236: fprintf(stderr, "illegal ligature %s ignored\n", temp); ! 237: } ! 238: return lig; ! 239: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.