1: /* 2: * Copyright (c) 1983 Regents of the University of California. 3: * All rights reserved. The Berkeley software License Agreement 4: * specifies the terms and conditions for redistribution. 5: */ 6: 7: #ifndef lint 8: static char sccsid[] = "@(#)vwidth.c 5.1 (Berkeley) 5/15/85"; 9: #endif not lint 10: 11: /* 12: * Creates a width table for troff from a versatec font for a 13: * normal font. 14: * Usage: width font [ point_size ] 15: * where font is the file name of the versatec font and 16: * point_size is it point size. 17: * If the point size is omitted it is taken from the suffix of 18: * the font name, as bocklin.14 => 14 point. 19: * It is better to use as large a point size font as possible 20: * to avoid round off. 21: */ 22: 23: #include <stdio.h> 24: 25: struct wtable { 26: char charloc; 27: char *name; 28: } wtable[] = { 29: '\214', "space", 30: '!', "!", 31: '"', "\"", 32: '#', "#", 33: '$', "$", 34: '%', "%", 35: '&', "&", 36: '\'', "'", 37: '(', "(", 38: ')', ")", 39: '*', "*", 40: '+', "+", 41: ',', ",", 42: '-', "- hyphen", 43: '.', ".", 44: '/', "/", 45: '0', "0", 46: '1', "1", 47: '2', "2", 48: '3', "3", 49: '4', "4", 50: '5', "5", 51: '6', "6", 52: '7', "7", 53: '8', "8", 54: '9', "9", 55: ':', ":", 56: ';', ";", 57: '<', "<", 58: '=', "=", 59: '>', ">", 60: '?', "?", 61: '@', "@", 62: 'A', "A", 63: 'B', "B", 64: 'C', "C", 65: 'D', "D", 66: 'E', "E", 67: 'F', "F", 68: 'G', "G", 69: 'H', "H", 70: 'I', "I", 71: 'J', "J", 72: 'K', "K", 73: 'L', "L", 74: 'M', "M", 75: 'N', "N", 76: 'O', "O", 77: 'P', "P", 78: 'Q', "Q", 79: 'R', "R", 80: 'S', "S", 81: 'T', "T", 82: 'U', "U", 83: 'V', "V", 84: 'W', "W", 85: 'X', "X", 86: 'Y', "Y", 87: 'Z', "Z", 88: '[', "[", 89: '\\', "\\", 90: ']', "]", 91: '^', "^", 92: '_', "_", 93: '\`', "\`", 94: 'a', "a", 95: 'b', "b", 96: 'c', "c", 97: 'd', "d", 98: 'e', "e", 99: 'f', "f", 100: 'g', "g", 101: 'h', "h", 102: 'i', "i", 103: 'j', "j", 104: 'k', "k", 105: 'l', "l", 106: 'm', "m", 107: 'n', "n", 108: 'o', "o", 109: 'p', "p", 110: 'q', "q", 111: 'r', "r", 112: 's', "s", 113: 't', "t", 114: 'u', "u", 115: 'v', "v", 116: 'w', "w", 117: 'x', "x", 118: 'y', "y", 119: 'z', "z", 120: '{', "{", 121: '|', "|", 122: '}', "}", 123: '~', "~", 124: '\206', "narrow space", 125: '-', "hyphen", 126: '\07', "bullet", 127: '\010', "square", 128: '\06', "3/4 em dash", 129: '\05', "rule", 130: '\021', "1/4", 131: '\022', "1/2", 132: '\023', "3/4", 133: '\04', "minus", 134: '\01', "fi", 135: '\02', "fl", 136: '\03', "ff", 137: '\011', "ffi", 138: '\012', "ffl", 139: '\013', "degree", 140: '\014', "dagger", 141: '\200', "section (unimplem)", 142: '\015', "foot mark", 143: '\200', "acute acc (unimplem)", 144: '\200', "grave acc (unimplem)", 145: '\200', "underrule (unimplem)", 146: '\200', "slash (unimplem)", 147: '\203', "half narrow space", 148: '\200', "null", 149: '\200', "null", 150: '\200', "null", 151: '\200', "null", 152: '\200', "null", 153: '\200', "null", 154: '\200', "null", 155: '\200', "null", 156: '\200', "null", 157: '\200', "null", 158: '\200', "null", 159: '\200', "null", 160: '\200', "null", 161: '\200', "null", 162: '\200', "null", 163: '\200', "null", 164: '\200', "null", 165: '\200', "null", 166: '\200', "null", 167: '\200', "null", 168: '\200', "null", 169: '\200', "null", 170: '\200', "null", 171: '\200', "null", 172: '\200', "null", 173: '\200', "null", 174: '\200', "null", 175: '\200', "null", 176: '\200', "null", 177: '\200', "null", 178: '\200', "null", 179: '\200', "null", 180: '\200', "null", 181: '\200', "null", 182: '\200', "null", 183: '\200', "null", 184: '\200', "null", 185: '\200', "null", 186: '\200', "null", 187: '\200', "null", 188: '\200', "null", 189: '\200', "null", 190: '\200', "null", 191: '\200', "null", 192: '\200', "null", 193: '\200', "null", 194: '\200', "null", 195: '\200', "null", 196: '\200', "null", 197: '\200', "null", 198: '\200', "null", 199: '\200', "null", 200: '\200', "null", 201: '\200', "null", 202: '\200', "null", 203: '\200', "null", 204: '\200', "null", 205: '\200', "null", 206: '\200', "null", 207: '\200', "null", 208: '\200', "null", 209: '\200', "null", 210: '\200', "null", 211: '\200', "null", 212: '\200', "null", 213: '\200', "null", 214: '\200', "null", 215: '\200', "null", 216: '\200', "null", 217: '\200', "null", 218: '\200', "null", 219: '\017', "registered", 220: '\016', "copyright", 221: '\200', "null", 222: '\020', "cent", 223: 0, 0 224: }; 225: 226: struct desc { 227: short addr; 228: short nbytes; 229: char up; 230: char down; 231: char left; 232: char right; 233: short width; 234: } desc[256]; 235: 236: main(argc, argv) 237: int argc; 238: char *argv[]; 239: { 240: register int cl; 241: register esc; 242: register w; 243: int i, psize; 244: int fd, high; 245: 246: if (argc != 3 && argc != 2) { 247: printf("Usage: vwidth font [pointsize] > font.c\n"); 248: exit(1); 249: } 250: fd = open(argv[1], 0); 251: if (argc == 3) 252: psize = atoi(argv[2]); 253: else { 254: char *p; 255: for (p = argv[1]; *p && *p != '.'; p++) 256: ; 257: if (*p == 0) { 258: psize = 10; 259: fprintf(stderr, "Assuming %d point\n", psize); 260: } else 261: psize = atoi(p+1); 262: } 263: lseek(fd, 10L, 0); 264: read(fd, desc, sizeof desc); 265: high = desc['a'].up+1; 266: printf("char XXw[256-32] = {\n"); 267: for (i = 0; wtable[i].charloc != 0; i++) { 268: cl = wtable[i].charloc & 0377; 269: if (cl & 0200) 270: w = cl & 0177; 271: else 272: w = desc[cl].width*(54./25.)*(6./psize)+.5; 273: esc = 0; 274: if ((cl >= '0' && cl <= '9') || (cl >= 'A' && cl <= 'Z') || 275: (cl >= 'a' && cl <= 'z')) { 276: if (desc[cl].up > high) 277: esc |= 0200; 278: if (desc[cl].down > 0) 279: esc |= 0100; 280: } 281: if (esc) 282: printf("%d+0%o,\t/* %s */\n", w, esc, wtable[i].name); 283: else 284: printf("%d,\t\t/* %s */\n", w, wtable[i].name); 285: } 286: printf("};\n"); 287: }