Add pancyrillic font
[platform/upstream/kbd.git] / src / getunimap.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <errno.h>
4 #include <ctype.h>
5 #include <unistd.h>
6 #include <sys/ioctl.h>
7 #include <linux/kd.h>
8 #include "getfd.h"
9 #include "xmalloc.h"
10 #include "kdmapop.h"
11 #include "nls.h"
12 #include "version.h"
13
14 #ifndef USE_LIBC
15 /* There is such function in libc5 but it doesn't work for me [libc 5.4.13] */
16 #include "wctomb.c"
17 #define wctomb our_wctomb
18 #endif
19
20 static int
21 ud_compar(const void *u1, const void *u2){
22         unsigned short fp1 = ((struct unipair *) u1)->fontpos;
23         unsigned short fp2 = ((struct unipair *) u2)->fontpos;
24         return (int) fp1 - (int) fp2;
25 }
26
27 static void __attribute__ ((noreturn))
28 usage(void) {
29         fprintf(stderr, _("Usage:\n\t%s [-s] [-C console]\n"), progname);
30         exit(1);
31 }
32
33 int
34 main(int argc, char **argv){
35         int sortflag = 0;
36         char mb[]={0,0,0,0,0,0,0,0};
37         unsigned mb_length;
38         int fd, c, i;
39         char *console = NULL;
40         struct unimapdesc ud;
41
42         set_progname(argv[0]);
43
44         setlocale(LC_ALL, "");
45         bindtextdomain(PACKAGE_NAME, LOCALEDIR);
46         textdomain(PACKAGE_NAME);
47
48         if (argc == 2 &&
49             (!strcmp(argv[1], "-V") || !strcmp(argv[1], "--version")))
50                 print_version_and_exit();
51
52         while ((c = getopt(argc, argv, "sC:")) != EOF) {
53                 switch (c) {
54                 case 's':
55                         sortflag = 1;
56                         break;
57                 case 'C':
58                         console = optarg;
59                         break;
60                 default:
61                         usage();
62                 }
63         }
64
65         if (optind < argc)
66                 usage();
67
68         fd = getfd(console);
69         if (getunimap(fd, &ud))
70                 exit(1);
71
72         if (sortflag) {
73                 printf("# sorted kernel unimap - count=%d\n", ud.entry_ct);
74                 /* sort and merge entries */
75                 qsort(ud.entries, ud.entry_ct, sizeof(ud.entries[0]),
76                        ud_compar);
77                 for(i=0; i<ud.entry_ct; i++) {
78                         int fp = ud.entries[i].fontpos;
79                         printf("0x%03x\tU+%04x", fp, ud.entries[i].unicode);
80                         while (i+1 < ud.entry_ct &&
81                                ud.entries[i+1].fontpos == fp)
82                                 printf(" U+%04x", ud.entries[++i].unicode);
83                         printf("\n");
84                 }
85         } else {
86                 printf("# kernel unimap - count=%d\n", ud.entry_ct);
87                 for(i=0; i<ud.entry_ct; i++) {
88                         mb_length = wctomb (mb, ud.entries[i].unicode);
89                         mb[ (mb_length > 6) ? 0 : mb_length ] = 0 ;
90                         if (mb_length == 1 && !isprint(mb[0])) {
91                                 mb[2] = 0;
92                                 mb[1] = mb[0] + 0100;
93                                 mb[0] = '^';
94                         }
95                         printf("0x%03x\tU+%04x\t# %s \n",
96                                ud.entries[i].fontpos,
97                                ud.entries[i].unicode, mb);
98                 }
99         }
100
101         return 0;
102 }