
#include <nlist.h>
#include <sys/types.h>
#include <sys/file.h>
#include <stdio.h>


char dvorak[]={
	 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 /*   0 */
	,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 /*   8 */
	,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00	/*  16 */
	,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 /*  24 */
	,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 /*  32 */
	,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 /*  40 */ 
	,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 /*  48 */
	,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 /*  56 */ 
	,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 /*  64 */
	,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 /*  72 */ 
	,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x81 ,0x82 /*  80 */
	,0x83 ,0x84 ,0x85 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 /*  88 */ 
	,0x00 ,0x00 ,0x00 ,0x00 ,0x86 ,0x87 ,0x88 ,0x89 /*  96 */
	,0x8a ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 /* 104 */ 
	,0x00 ,0x1b ,0x08 ,0x0a ,0x8b ,0x00 ,0x00 ,0x00 /* 112 */
	,0x00 ,0x00 ,0x00 ,0x00 ,0x8c ,0x8d ,0x00 ,0x00 /* 120 */
	,0x8e ,0x8f ,0x90 ,0x91 ,0x00 ,0x00 ,0x00 ,0x00 /* 128 */
	,0x00 ,0x00 ,0x92 ,0x93 ,0x94 ,0x95 ,0x96 ,0x97 /* 136 */
	,0x00 ,0x00 ,0xa0 ,0x00 ,0xa1 ,0xa2 ,0xa3 ,0xa4 /* 144 */
	,0xa5 ,0xa6 ,0xa7 ,0xa8 ,0xa9 ,0xaa ,0xab ,0xac /* 152 */
	,0xad ,0x98 ,0x99 ,0x9a ,0x9b ,0x00 ,0x00 ,0x9c /* 160 */
	,0x9d ,0x9e ,0x9f ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 /* 168 */
	,0x00 ,0x1b ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 /* 176 */ /* hacked meta key */
	,0x00 ,0x00 ,0x00 ,0x00 ,0x7f ,'\r' ,0x09 ,'`'  /* 184 */
	,'1'  ,'\'' ,'a'  ,';'  ,0x00 ,'2'  ,','  ,'o'  /* 192 */
	,'q'  ,'<'  ,0x00 ,'3'  ,'.'  ,'e'  ,'j'  ,0x00 /* 200 */
	,'4'  ,'p'  ,'u'  ,'k'  ,' '  ,0x00 ,'5'  ,'y'  /* 208 */
	,'i'  ,'x'  ,0x00 ,'6'  ,'f'  ,'d'  ,'b'  ,0x00 /* 216 */
	,'7'  ,'g'  ,'h'  ,'m'  ,0x00 ,'8'  ,'c'  ,'t'  /* 224 */
	,'w'  ,0x00 ,'9'  ,'r'  ,'n'  ,'v'  ,0x00 ,'0'  /* 232 */
	,'l'  ,0x00 ,'s'  ,'z'  ,0x00 ,'='  ,']'  ,'['  /* 240 */
	,0x00 ,'\\'  ,'/'  ,'-' ,0x00 ,0x00 ,0x00 ,0x00 /* 248 */
};

char shifted_dvorak[]={
	 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 /*   0 */
	,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 /*   8 */
	,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00	/*  16 */
	,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 /*  24 */
	,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 /*  32 */
	,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 /*  40 */ 
	,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 /*  48 */
	,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 /*  56 */ 
	,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 /*  64 */
	,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 /*  72 */ 
	,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x81 ,0x82 /*  80 */
	,0x83 ,0x84 ,0x85 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 /*  88 */ 
	,0x00 ,0x00 ,0x00 ,0x00 ,0x86 ,0x87 ,0x88 ,0x89 /*  96 */
	,0x8a ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 /* 104 */ 
	,0x00 ,0x1b ,0x08 ,0x0a ,0x8b ,0x00 ,0x00 ,0x00 /* 112 */
	,0x00 ,0x00 ,0x00 ,0x00 ,0x8c ,0x8d ,0x00 ,0x00 /* 120 */
	,0x8e ,0x8f ,0x90 ,0x91 ,0x00 ,0x00 ,0x00 ,0x00 /* 128 */
	,0x00 ,0x00 ,0x92 ,0x93 ,0x94 ,0x95 ,0x96 ,0x97 /* 136 */
	,0x00 ,0x00 ,0xa0 ,0x00 ,0xa1 ,0xa2 ,0xa3 ,0xa4 /* 144 */
	,0xa5 ,0xa6 ,0xa7 ,0xa8 ,0xa9 ,0xaa ,0xab ,0xac /* 152 */
	,0xad ,0x98 ,0x99 ,0x9a ,0x9b ,0x00 ,0x00 ,0x9c /* 160 */
	,0x9d ,0x9e ,0x9f ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 /* 168 */
	,0x00 ,0x1b ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 /* 176 */ /* hacked meta key */
	,0x00 ,0x00 ,0x00 ,0x00 ,0x7f ,'\r' ,0x09 ,'~'  /* 184 */
	,'!'  ,'"'  ,'A'  ,':'  ,0x00 ,'@'  ,'<'  ,'O'  /* 192 */
	,'Q'  ,'>'  ,0x00 ,'#'  ,'>'  ,'E'  ,'J'  ,0x00 /* 200 */
	,'$'  ,'P'  ,'U'  ,'K'  ,' '  ,0x00 ,'%'  ,'Y'  /* 208 */
	,'I'  ,'X'  ,0x00 ,'^'  ,'F'  ,'D'  ,'B'  ,0x00 /* 216 */
	,'&'  ,'G'  ,'H'  ,'M'  ,0x00 ,'*'  ,'C'  ,'T'  /* 224 */
	,'W'  ,0x00 ,'('  ,'R'  ,'N'  ,'V'  ,0x00 ,')'  /* 232 */	/* changed for < > on , . */
	,'L'  ,0x00 ,'S'  ,'Z'  ,0x00 ,'+'  ,'}'  ,'{'  /* 240 */
	,0x00 ,'|'  ,'?'  ,'_'  ,0x00 ,0x00 ,0x00 ,0x00 /* 248 */
};


char qwerty[]={
	 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 /*   0 */
	,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 /*   8 */
	,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00	/*  16 */
	,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 /*  24 */
	,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 /*  32 */
	,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 /*  40 */ 
	,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 /*  48 */
	,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 /*  56 */ 
	,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 /*  64 */
	,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 /*  72 */ 
	,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x81 ,0x82 /*  80 */
	,0x83 ,0x84 ,0x85 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 /*  88 */ 
	,0x00 ,0x00 ,0x00 ,0x00 ,0x86 ,0x87 ,0x88 ,0x89 /*  96 */
	,0x8a ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 /* 104 */ 
	,0x00 ,0x1b ,0x08 ,0x0a ,0x8b ,0x00 ,0x00 ,0x00 /* 112 */
	,0x00 ,0x00 ,0x00 ,0x00 ,0x8c ,0x8d ,0x00 ,0x00 /* 120 */
	,0x8e ,0x8f ,0x90 ,0x91 ,0x00 ,0x00 ,0x00 ,0x00 /* 128 */
	,0x00 ,0x00 ,0x92 ,0x93 ,0x94 ,0x95 ,0x96 ,0x97 /* 136 */
	,0x00 ,0x00 ,0xa0 ,0x00 ,0xa1 ,0xa2 ,0xa3 ,0xa4 /* 144 */
	,0xa5 ,0xa6 ,0xa7 ,0xa8 ,0xa9 ,0xaa ,0xab ,0xac /* 152 */
	,0xad ,0x98 ,0x99 ,0x9a ,0x9b ,0x00 ,0x00 ,0x9c /* 160 */
	,0x9d ,0x9e ,0x9f ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 /* 168 */
	,0x00 ,0x1b ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 /* 176 */ /* hacked meta key */
	,0x00 ,0x00 ,0x00 ,0x00 ,0x7f ,'\r' ,0x09 ,'`'  /* 184 */
	,'1'  ,'q'  ,'a'  ,'z'  ,0x00 ,'2'  ,'w'  ,'s'  /* 192 */
	,'x'  ,'<'  ,0x00 ,'3'  ,'e'  ,'d'  ,'c'  ,0x00 /* 200 */
	,'4'  ,'r'  ,'f'  ,'v'  ,' '  ,0x00 ,'5'  ,'t'  /* 208 */
	,'g'  ,'b'  ,0x00 ,'6'  ,'y'  ,'h'  ,'n'  ,0x00 /* 216 */
	,'7'  ,'u'  ,'j'  ,'m'  ,0x00 ,'8'  ,'i'  ,'k'  /* 224 */
	,','  ,0x00 ,'9'  ,'o'  ,'l'  ,'.'  ,0x00 ,'0'  /* 232 */
	,'p'  ,0x00 ,';'  ,'/'  ,0x00 ,'='  ,']'  ,'\\' /* 240 */
	,0x00 ,'-'  ,'['  ,'\'' ,0x00 ,0x00 ,0x00 ,0x00 /* 248 */
};

char shifted_qwerty[]={
	 0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 /*   0 */
	,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 /*   8 */
	,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00	/*  16 */
	,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 /*  24 */
	,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 /*  32 */
	,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 /*  40 */ 
	,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 /*  48 */
	,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 /*  56 */ 
	,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 /*  64 */
	,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 /*  72 */ 
	,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x81 ,0x82 /*  80 */
	,0x83 ,0x84 ,0x85 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 /*  88 */ 
	,0x00 ,0x00 ,0x00 ,0x00 ,0x86 ,0x87 ,0x88 ,0x89 /*  96 */
	,0x8a ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 /* 104 */ 
	,0x00 ,0x1b ,0x08 ,0x0a ,0x8b ,0x00 ,0x00 ,0x00 /* 112 */
	,0x00 ,0x00 ,0x00 ,0x00 ,0x8c ,0x8d ,0x00 ,0x00 /* 120 */
	,0x8e ,0x8f ,0x90 ,0x91 ,0x00 ,0x00 ,0x00 ,0x00 /* 128 */
	,0x00 ,0x00 ,0x92 ,0x93 ,0x94 ,0x95 ,0x96 ,0x97 /* 136 */
	,0x00 ,0x00 ,0xa0 ,0x00 ,0xa1 ,0xa2 ,0xa3 ,0xa4 /* 144 */
	,0xa5 ,0xa6 ,0xa7 ,0xa8 ,0xa9 ,0xaa ,0xab ,0xac /* 152 */
	,0xad ,0x98 ,0x99 ,0x9a ,0x9b ,0x00 ,0x00 ,0x9c /* 160 */
	,0x9d ,0x9e ,0x9f ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 /* 168 */
	,0x00 ,0x1b ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 /* 176 */ /* hacked meta key */
	,0x00 ,0x00 ,0x00 ,0x00 ,0x7f ,'\r' ,0x09 ,'~'  /* 184 */
	,'!'  ,'Q'  ,'A'  ,'Z'  ,0x00 ,'@'  ,'W'  ,'S'  /* 192 */
	,'X'  ,'>'  ,0x00 ,'#'  ,'E'  ,'D'  ,'C'  ,0x00 /* 200 */
	,'$'  ,'R'  ,'F'  ,'V'  ,' '  ,0x00 ,'%'  ,'T'  /* 208 */
	,'G'  ,'B'  ,0x00 ,'^'  ,'Y'  ,'H'  ,'N'  ,0x00 /* 216 */
	,'&'  ,'U'  ,'J'  ,'M'  ,0x00 ,'*'  ,'I'  ,'K'  /* 224 */
	,'<'  ,0x00 ,'('  ,'O'  ,'L'  ,'>'  ,0x00 ,')'  /* 232 */	/* changed for < > on , . */
	,'P'  ,0x00 ,':'  ,'?'  ,0x00 ,'+'  ,'}'  ,'|'  /* 240 */
	,0x00 ,'_'  ,'{'  ,'"'  ,0x00 ,0x00 ,0x00 ,0x00 /* 248 */
};

usage()
{
  fprintf (stderr, "usage: dvorak [-q] [namelist]\n");
  exit(1);
}

main (argc, argv)
     int argc;
     char **argv;
{
  struct nlist n[3];
  int fd;
  char *kernel = "/vmunix";
  int dv=1;
  
  while (argv++, --argc) {
    if (argv[0][0] == '-')
      if (argv[0][1] == 'q')
	dv = 0;
      else
	usage();
    else
      kernel = argv[1];
  }
  n[0].n_name = "_q_key";
  n[1].n_name = "_q_shift_key";
  n[2].n_name = 0;
  if (nlist (kernel, n)) {
    fprintf (stderr, "nlist: can't find names in kernel namelist %s\n", kernel);
    exit(1);
  }
  fd = open("/dev/kmem", O_RDWR);
  if (fd < 0) {
    perror ("open /dev/kmem");
    exit (1);
  }
  lseek (fd, n[0].n_value, L_SET);
  write (fd, dv ? dvorak : qwerty, sizeof(dvorak));
  lseek (fd, n[1].n_value, L_SET);
  write (fd, dv ? shifted_dvorak : shifted_qwerty, sizeof(dvorak));
  close (fd);
}

