]> CyberLeo.Net >> Repos - FreeBSD/releng/9.3.git/blob - tools/tools/vt/setfont/setfont.c
Copy stable/9 to releng/9.3 as part of the 9.3-RELEASE cycle.
[FreeBSD/releng/9.3.git] / tools / tools / vt / setfont / setfont.c
1 #include <sys/consio.h>
2 #include <sys/endian.h>
3 #include <sys/ioctl.h>
4 #include <sys/param.h>
5
6 #include <stdio.h>
7 #include <stdlib.h>
8 #include <string.h>
9 #include <unistd.h>
10
11 struct file_header {
12         uint8_t         magic[8];
13         uint8_t         width;
14         uint8_t         height;
15         uint16_t        nglyphs;
16         uint16_t        nmappings_normal;
17         uint16_t        nmappings_bold;
18 } __packed;
19
20 static vfnt_map_t *
21 load_mappingtable(unsigned int nmappings)
22 {
23         vfnt_map_t *t;
24         unsigned int i;
25
26         if (nmappings == 0)
27                 return (NULL);
28
29         t = malloc(sizeof *t * nmappings);
30
31         if (fread(t, sizeof *t * nmappings, 1, stdin) != 1) {
32                 perror("mappings");
33                 exit(1);
34         }
35
36         for (i = 0; i < nmappings; i++) {
37                 t[i].src = be32toh(t[i].src);
38                 t[i].dst = be16toh(t[i].dst);
39                 t[i].len = be16toh(t[i].len);
40         }
41
42         return (t);
43 }
44
45 int
46 main(int argc __unused, char *argv[] __unused)
47 {
48         struct file_header fh;
49         static vfnt_t vfnt;
50         size_t glyphsize;
51
52         if (fread(&fh, sizeof fh, 1, stdin) != 1) {
53                 perror("file_header");
54                 return (1);
55         }
56
57         if (memcmp(fh.magic, "VFNT 1.0", 8) != 0) {
58                 fprintf(stderr, "Bad magic\n");
59                 return (1);
60         }
61
62         vfnt.nnormal = be16toh(fh.nmappings_normal);
63         vfnt.nbold = be16toh(fh.nmappings_bold);
64         vfnt.nglyphs = be16toh(fh.nglyphs);
65         vfnt.width = fh.width;
66         vfnt.height = fh.height;
67
68         glyphsize = howmany(vfnt.width, 8) * vfnt.height * vfnt.nglyphs;
69         vfnt.glyphs = malloc(glyphsize);
70
71         if (fread(vfnt.glyphs, glyphsize, 1, stdin) != 1) {
72                 perror("glyphs");
73                 return (1);
74         }
75
76         vfnt.normal = load_mappingtable(vfnt.nnormal);
77         vfnt.bold = load_mappingtable(vfnt.nbold);
78
79         if (ioctl(STDOUT_FILENO, PIO_VFONT, &vfnt) == -1) {
80                 perror("PIO_VFONT");
81                 return (1);
82         }
83
84         return (0);
85 }