Logo Search packages:      
Sourcecode: kbd version File versions  Download package

getunimap.c

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <ctype.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <linux/kd.h>
#include "getfd.h"
#include "xmalloc.h"
#include "kdmapop.h"
#include "nls.h"
#include "version.h"

#ifndef USE_LIBC
/* There is such function in libc5 but it doesn't work for me [libc 5.4.13] */
#include "wctomb.c"
#define wctomb our_wctomb
#endif

static int
ud_compar(const void *u1, const void *u2){
      unsigned short fp1 = ((struct unipair *) u1)->fontpos;
      unsigned short fp2 = ((struct unipair *) u2)->fontpos;
      return (int) fp1 - (int) fp2;
}

static void
usage(void) {
      fprintf(stderr, _("Usage:\n\t%s [-s] [-C console]\n"), progname);
      exit(1);
}

int
main(int argc, char **argv){
      int sortflag = 0;
      char mb[]={0,0,0,0,0,0,0,0};
      unsigned mb_length;
      int fd, c, i;
      char *console = NULL;
      struct unimapdesc ud;

      set_progname(argv[0]);

      setlocale(LC_ALL, "");
      bindtextdomain(PACKAGE, LOCALEDIR);
      textdomain(PACKAGE);

      if (argc == 2 &&
          (!strcmp(argv[1], "-V") || !strcmp(argv[1], "--version")))
            print_version_and_exit();

      while ((c = getopt(argc, argv, "sC:")) != EOF) {
            switch (c) {
            case 's':
                  sortflag = 1;
                  break;
            case 'C':
                  console = optarg;
                  break;
            default:
                  usage();
            }
      }

      if (argc != 1)
            usage();

      fd = getfd(console);
      if (getunimap(fd, &ud))
            exit(1);

      if (sortflag) {
            printf("# sorted kernel unimap - count=%d\n", ud.entry_ct);
            /* sort and merge entries */
            qsort(ud.entries, ud.entry_ct, sizeof(ud.entries[0]),
                   ud_compar);
            for(i=0; i<ud.entry_ct; i++) {
                  int fp = ud.entries[i].fontpos;
                  printf("0x%03x\tU+%04x", fp, ud.entries[i].unicode);
                  while (i+1 < ud.entry_ct &&
                         ud.entries[i+1].fontpos == fp)
                        printf(" U+%04x", ud.entries[++i].unicode);
                  printf("\n");
            }
      } else {
            printf("# kernel unimap - count=%d\n", ud.entry_ct);
            for(i=0; i<ud.entry_ct; i++) {
                  mb_length = wctomb (mb, ud.entries[i].unicode);
                  mb[ (mb_length > 6) ? 0 : mb_length ] = 0 ;
                  if (mb_length == 1 && !isprint(mb[0])) {
                        mb[2] = 0;
                        mb[1] = mb[0] + 0100;
                        mb[0] = '^';
                  }
                  printf("0x%03x\tU+%04x\t# %s \n",
                         ud.entries[i].fontpos,
                         ud.entries[i].unicode, mb);
            }
      }

      return 0;
}

Generated by  Doxygen 1.6.0   Back to index