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) 05/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 } 288