1 /* $NetBSD: wsfontload.c,v 1.6 2001/02/19 23:22:50 cgd Exp $ */ 2 3 /* 4 * Copyright (c) 1999 5 * Matthias Drochner. All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 3. All advertising materials mentioning features or use of this software 16 * must display the following acknowledgement: 17 * This product includes software developed for the NetBSD Project 18 * by Matthias Drochner. 19 * 4. The name of the author may not be used to endorse or promote products 20 * derived from this software without specific prior written permission. 21 * 22 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 23 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 24 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 25 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 26 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 27 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 28 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 29 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 30 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 31 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32 * 33 */ 34 35 #include <stdio.h> 36 #include <fcntl.h> 37 #include <stdlib.h> 38 #include <string.h> 39 #include <unistd.h> 40 #include <sys/types.h> 41 #include <sys/ioctl.h> 42 #include <err.h> 43 #include <malloc.h> 44 45 #include <dev/wscons/wsconsio.h> 46 47 #define DEFDEV "/dev/ttyEcfg" 48 #define DEFWIDTH 8 49 #define DEFHEIGHT 16 50 #define DEFENC WSDISPLAY_FONTENC_ISO 51 #define DEFBITORDER WSDISPLAY_FONTORDER_L2R 52 #define DEFBYTEORDER WSDISPLAY_FONTORDER_L2R 53 54 int main __P((int, char**)); 55 static void usage __P((void)); 56 static int getencoding __P((char *)); 57 static char *rgetencoding __P((int)); 58 static char *rgetfontorder __P((int)); 59 60 static struct { 61 char *name; 62 int val; 63 } fontorders[] = { 64 { "known", WSDISPLAY_FONTORDER_KNOWN}, 65 { "l2r", WSDISPLAY_FONTORDER_L2R}, 66 { "r2l", WSDISPLAY_FONTORDER_R2L}, 67 }; 68 69 static struct { 70 char *name; 71 int val; 72 } encodings[] = { 73 {"iso", WSDISPLAY_FONTENC_ISO}, 74 {"ibm", WSDISPLAY_FONTENC_IBM}, 75 {"pcvt", WSDISPLAY_FONTENC_PCVT}, 76 }; 77 78 static void 79 usage() 80 { 81 82 (void)fprintf(stderr, 83 "Usage: %s [-f wsdev] [-w width] [-h height] [-e encoding]" 84 " [-N name] [-b] [-B] [fontfile]\n", 85 getprogname()); 86 exit(1); 87 } 88 89 /* 90 * map given fontorder to it's string representation 91 */ 92 static char * 93 rgetfontorder(fontorder) 94 int fontorder; 95 { 96 int i; 97 98 for (i = 0; i < sizeof(fontorders) / sizeof(fontorders[0]); i++) 99 if (fontorders[i].val == fontorder) 100 return (fontorders[i].name); 101 102 return "unknown"; 103 } 104 105 /* 106 * map given encoding to it's string representation 107 */ 108 static char * 109 rgetencoding(enc) 110 int enc; 111 { 112 int i; 113 114 for (i = 0; i < sizeof(encodings) / sizeof(encodings[0]); i++) 115 if (encodings[i].val == enc) 116 return (encodings[i].name); 117 118 return "unknown"; 119 } 120 121 /* 122 * map given encoding string to integer value 123 */ 124 static int 125 getencoding(name) 126 char *name; 127 { 128 int i; 129 130 for (i = 0; i < sizeof(encodings) / sizeof(encodings[0]); i++) 131 if (!strcmp(name, encodings[i].name)) 132 return (encodings[i].val); 133 134 if (sscanf(name, "%d", &i) != 1) 135 errx(1, "invalid encoding"); 136 return (i); 137 } 138 139 int 140 main(argc, argv) 141 int argc; 142 char **argv; 143 { 144 char *wsdev; 145 struct wsdisplay_font f; 146 int c, res, wsfd, ffd, verbose; 147 size_t len; 148 void *buf; 149 150 wsdev = DEFDEV; 151 f.fontwidth = DEFWIDTH; 152 f.fontheight = DEFHEIGHT; 153 f.firstchar = 0; 154 f.numchars = 256; 155 f.stride = 0; 156 f.encoding = DEFENC; 157 f.name = 0; 158 f.bitorder = DEFBITORDER; 159 f.byteorder = DEFBYTEORDER; 160 161 while ((c = getopt(argc, argv, "f:w:h:e:N:bB:v")) != -1) { 162 switch (c) { 163 case 'f': 164 wsdev = optarg; 165 break; 166 case 'w': 167 if (sscanf(optarg, "%d", &f.fontwidth) != 1) 168 errx(1, "invalid font width"); 169 break; 170 case 'h': 171 if (sscanf(optarg, "%d", &f.fontheight) != 1) 172 errx(1, "invalid font height"); 173 break; 174 case 'e': 175 f.encoding = getencoding(optarg); 176 break; 177 case 'N': 178 f.name = optarg; 179 break; 180 case 'b': 181 f.bitorder = WSDISPLAY_FONTORDER_R2L; 182 break; 183 case 'B': 184 f.byteorder = WSDISPLAY_FONTORDER_R2L; 185 break; 186 case 'v': 187 verbose = 1; 188 break; 189 case '?': 190 default: 191 usage(); 192 break; 193 } 194 } 195 argc -= optind; 196 argv += optind; 197 198 if (argc > 1) 199 usage(); 200 201 wsfd = open(wsdev, O_RDWR, 0); 202 if (wsfd < 0) 203 err(2, "open ws-device %s", wsdev); 204 205 if (argc > 0) { 206 ffd = open(argv[0], O_RDONLY, 0); 207 if (ffd < 0) 208 err(4, "open font %s", argv[0]); 209 if (!f.name) 210 f.name = argv[0]; 211 } else 212 ffd = 0; 213 214 if (!f.stride) 215 f.stride = (f.fontwidth + 7) / 8; 216 len = f.fontheight * f.numchars * f.stride; 217 if (!len) 218 errx(1, "invalid font size"); 219 220 buf = malloc(len); 221 if (!buf) 222 errx(1, "malloc"); 223 res = read(ffd, buf, len); 224 if (res < 0) 225 err(4, "read font"); 226 if (res != len) 227 errx(4, "short read"); 228 229 f.data = buf; 230 231 if (verbose) { 232 printf("name: %s\n", f.name); 233 printf("firstchar: %d\n", f.firstchar); 234 printf("numchars: %d\n", f.numchars); 235 printf("encoding: %s (%d)\n", 236 rgetencoding(f.encoding), f.encoding); 237 printf("fontwidth: %d\n", f.fontwidth); 238 printf("fontheight: %d\n", f.fontheight); 239 printf("stride: %d\n", f.stride); 240 printf("bitorder: %s (%d)\n", 241 rgetfontorder(f.bitorder), f.bitorder); 242 printf("byteorder: %s (%d)\n", 243 rgetfontorder(f.byteorder), f.byteorder); 244 } 245 246 res = ioctl(wsfd, WSDISPLAYIO_LDFONT, &f); 247 if (res < 0) 248 err(3, "WSDISPLAYIO_LDFONT"); 249 250 return (0); 251 } 252