/*{{{}}}*/
/*{{{  #includes*/
#ifdef TERMINFO
#  ifdef INC_CURSES
#     include <curses.h>
#  endif
#  ifdef INC_TERM
#     include <term.h>
#  endif
#else
#  include <termcap.h>
#endif
#include <string.h>
#ifndef NO_GETOPT_H
#  include <getopt.h>
#endif
#include <stdlib.h>
#include <stdio.h>
#include <lib/ori_bool.h>
#include <h/envvar_str.h>
/*}}}  */

/*{{{  variables*/
#ifdef TERMINFO
#  define DATABASE "terminfo"
#else
#  define DATABASE "termcap"
   char termcap_area[1024];
   char bp[1024];
   char *pointer;
#endif
boolean list=False;
/*}}}  */

/*{{{  error_exit*/
void error_exit(char const * const m,char const * const t)
 {
   fprintf(stderr,m,t);
   exit(1);
 }
/*}}}  */
/*{{{  create_alias*/
#ifdef TERMINFO
#  define CREATE_ALIAS(c,i,a) create_alias(a,(unsigned char*)i)
   void create_alias(char const * const name, unsigned char const * code)
#else
#  define CREATE_ALIAS(c,i,a) create_alias(a,c)
  void create_alias(char const * const name, char const * const cap)
# endif
{
# ifndef TERMINFO
     unsigned char *code;
     code=(unsigned char*)tgetstr(cap,&pointer);
# endif
  if (list)
   { printf("%s\n",name);
     return;
   }
  if (!code || !*code)
   { printf("  ;(alias %s ( $UNKNOWN )\n",name);
     return;
   }
  printf("  (alias %s (",name);
  while (*code)
  {
    if (*code==127)
       printf(" C-?");
    else if (*code>=' ')
       printf(" \"%c",*code);
    else
       printf(" C-%c",CTRL_CHARS[*code]);
    code++;
  }
  printf(" ))\n");
}
/*}}}  */

/*{{{  main*/
int main(int argc, char *argv[])
{
  /*{{{  variable declarations*/
#  ifdef TERMINFO
     int result;
#  endif
  char const *terminal;
  int c;
  extern char *optarg;
  extern int optind;
  boolean err=False;
  boolean no_term=False;
  /*}}}  */

  /*{{{  parse arguments*/
  terminal=getenv("TERM");
  /*{{{  process options*/
  while ((c=getopt(argc,argv,"hlnt:"))!=-1)
     switch (c)
      {
        /*{{{  h*/
        case '?':
        case 'h':
           err=True;
           break;
        /*}}}  */
        /*{{{  l*/
        case 'l':
           list=True;
           break;
        /*}}}  */
        /*{{{  n*/
        case 'n':
           no_term=True;
           break;
        /*}}}  */
        /*{{{  t*/
        case 't':
           terminal=optarg;
           break;
        /*}}}  */
      }
  if (list)
     no_term=True;
  /*}}}  */
  /*{{{  check usage*/
  if (err || optind<argc)
     error_exit("Usage: autoalias [-hln] [-t terminalname]\n",0);
  /*}}}  */
  /*}}}  */
  if (!terminal || !terminal[0])
   /*{{{  complain*/
     error_exit("autoalias: no environment variable TERM.\n",0);
   /*}}}  */
  /*{{{  get terminal data*/
  switch
   (
#    ifdef TERMINFO
       (setupterm(terminal,2,&result),result)
#    else
       tgetent(bp,terminal)
#    endif
   )
   { case -1:
        error_exit("autoalias: cannot access " DATABASE " database for terminal %s.\n",terminal);
     case 0:
        error_exit("autoalias: no " DATABASE " entry for %s.\n",terminal);
     default:
#       ifndef TERMINFO
           pointer = termcap_area;
#       endif
        break;
   }
  /*}}}  */
  if (!no_term)
     printf("(terminal (%s)\n",terminal);
  /*{{{  f0-f63*/
  CREATE_ALIAS("k0",key_f0,"f0");
  CREATE_ALIAS("k1",key_f1,"f1");
  CREATE_ALIAS("k2",key_f2,"f2");
  CREATE_ALIAS("k3",key_f3,"f3");
  CREATE_ALIAS("k4",key_f4,"f4");
  CREATE_ALIAS("k5",key_f5,"f5");
  CREATE_ALIAS("k6",key_f6,"f6");
  CREATE_ALIAS("k7",key_f7,"f7");
  CREATE_ALIAS("k8",key_f8,"f8");
  CREATE_ALIAS("k9",key_f9,"f9");
  CREATE_ALIAS("k;",key_f10,"f10");
  CREATE_ALIAS("F1",key_f11,"f11");
  CREATE_ALIAS("F2",key_f12,"f12");
  CREATE_ALIAS("F3",key_f13,"f13");
  CREATE_ALIAS("F4",key_f14,"f14");
  CREATE_ALIAS("F5",key_f15,"f15");
  CREATE_ALIAS("F6",key_f16,"f16");
  CREATE_ALIAS("F7",key_f17,"f17");
  CREATE_ALIAS("F8",key_f18,"f18");
  CREATE_ALIAS("F9",key_f19,"f19");
  CREATE_ALIAS("FA",key_f20,"f20");
  CREATE_ALIAS("FB",key_f21,"f21");
  CREATE_ALIAS("FC",key_f22,"f22");
  CREATE_ALIAS("FD",key_f23,"f23");
  CREATE_ALIAS("FE",key_f24,"f24");
  CREATE_ALIAS("FF",key_f25,"f25");
  CREATE_ALIAS("FG",key_f26,"f26");
  CREATE_ALIAS("FH",key_f27,"f27");
  CREATE_ALIAS("FI",key_f28,"f28");
  CREATE_ALIAS("FJ",key_f29,"f29");
  CREATE_ALIAS("FK",key_f30,"f30");
  CREATE_ALIAS("FL",key_f31,"f31");
  CREATE_ALIAS("FM",key_f32,"f32");
#  ifndef SMALL_TERMINFO
     CREATE_ALIAS("FN",key_f33,"f13");
     CREATE_ALIAS("FO",key_f34,"f34");
     CREATE_ALIAS("FP",key_f35,"f35");
     CREATE_ALIAS("FQ",key_f36,"f36");
     CREATE_ALIAS("FR",key_f37,"f37");
     CREATE_ALIAS("FS",key_f38,"f38");
     CREATE_ALIAS("FT",key_f39,"f39");
     CREATE_ALIAS("FU",key_f40,"f40");
     CREATE_ALIAS("FV",key_f41,"f41");
     CREATE_ALIAS("FW",key_f42,"f42");
     CREATE_ALIAS("FX",key_f43,"f43");
     CREATE_ALIAS("FY",key_f44,"f44");
     CREATE_ALIAS("FZ",key_f45,"f45");
     CREATE_ALIAS("Fa",key_f46,"f46");
     CREATE_ALIAS("Fb",key_f47,"f47");
     CREATE_ALIAS("Fc",key_f48,"f48");
     CREATE_ALIAS("Fd",key_f49,"f49");
     CREATE_ALIAS("Fe",key_f50,"f50");
     CREATE_ALIAS("Ff",key_f51,"f51");
     CREATE_ALIAS("Fg",key_f52,"f52");
     CREATE_ALIAS("Fh",key_f53,"f53");
     CREATE_ALIAS("Fi",key_f54,"f54");
     CREATE_ALIAS("Fj",key_f55,"f55");
     CREATE_ALIAS("Fk",key_f56,"f56");
     CREATE_ALIAS("Fl",key_f57,"f57");
     CREATE_ALIAS("Fm",key_f58,"f58");
     CREATE_ALIAS("Fn",key_f59,"f59");
     CREATE_ALIAS("Fo",key_f60,"f60");
     CREATE_ALIAS("Fp",key_f61,"f61");
     CREATE_ALIAS("Fq",key_f62,"f62");
     CREATE_ALIAS("Fr",key_f63,"f63");
#  endif
  /*}}}  */
  /*{{{  keypad*/
  CREATE_ALIAS("K1",key_a1,"upper_left_pad");
  CREATE_ALIAS("ku",key_up,"up");
  CREATE_ALIAS("K3",key_a3,"upper_right_pad");
  CREATE_ALIAS("kl",key_left,"left");
#  ifndef SMALL_TERMINFO
     CREATE_ALIAS("#4",key_sleft,"shift-left");
#  endif
  CREATE_ALIAS("K2",key_b2,"center_pad");
  CREATE_ALIAS("kr",key_right,"right");
#  ifndef SMALL_TERMINFO
     CREATE_ALIAS("%i",key_sright,"shift-right");
#  endif
  CREATE_ALIAS("K4",key_c1,"bottom_left_pad");
  CREATE_ALIAS("kd",key_down,"down");
  CREATE_ALIAS("K5",key_c3,"bottom_right_pad");
  /*}}}  */
  /*{{{  move*/
  CREATE_ALIAS("kh",key_home,"home");
#  ifndef SMALL_TERMINFO
     CREATE_ALIAS("#2",key_shome,"shift-home");
#  endif
  CREATE_ALIAS("kH",key_ll,"home-down");
#  ifndef SMALL_TERMINFO
     CREATE_ALIAS("@1",key_beg,"begin");
     CREATE_ALIAS("&9",key_sbeg,"shift-begin");
#  endif
  CREATE_ALIAS("kP",key_ppage,"prev_page");
#  ifndef SMALL_TERMINFO
     CREATE_ALIAS("%8",key_previous,"previous-object");
     CREATE_ALIAS("%e",key_sprevious,"shift-previous");
#  endif
  CREATE_ALIAS("kN",key_npage,"next_page");
#  ifndef SMALL_TERMINFO
     CREATE_ALIAS("%5",key_next,"next-object");
     CREATE_ALIAS("%c",key_snext,"shift-next");
     CREATE_ALIAS("@7",key_end,"end");
     CREATE_ALIAS("*7",key_send,"shift-end");
#  endif
  CREATE_ALIAS("kR",key_sr,"scroll-up");
  CREATE_ALIAS("kF",key_sf,"scroll-down");
  /*}}}  */
  /*{{{  clr/del/ins*/
  CREATE_ALIAS("kI",key_ic,"insert-char");
  CREATE_ALIAS("kb",key_backspace,"backspace");
  CREATE_ALIAS("kD",key_dc,"rubout");
#  ifndef SMALL_TERMINFO
     CREATE_ALIAS("*4",key_sdc,"shift-rubout");
#  endif
  CREATE_ALIAS("kA",key_il,"insert-line");
  CREATE_ALIAS("kL",key_dl,"delline");
#  ifndef SMALL_TERMINFO
     CREATE_ALIAS("*5",key_sdl,"shift-delline");
#  endif
  CREATE_ALIAS("kE",key_eol,"clreol");
#  ifndef SMALL_TERMINFO
     CREATE_ALIAS("*8",key_seol,"shift-clear-line");
#  endif
  CREATE_ALIAS("kS",key_eos,"clreos");
  CREATE_ALIAS("kC",key_clear,"clear-screen");
  /*}}}  */
  /*{{{  tab*/
#  ifndef SMALL_TERMINFO
     CREATE_ALIAS("kB",key_btab,"back_tab");
#  endif
  CREATE_ALIAS("ka",key_catab,"clear-all-tabs");
  CREATE_ALIAS("kt",key_ctab,"clear-tab");
  CREATE_ALIAS("kT",key_stab,"set-tab");
  /*}}}  */
  /*{{{  control*/
#  ifndef SMALL_TERMINFO
     CREATE_ALIAS("@2",key_cancel,"cancel");
     CREATE_ALIAS("&0",key_scancel,"shift-cancel");
     CREATE_ALIAS("@6",key_create,"create");
     CREATE_ALIAS("*3",key_screate,"shift-create");
     CREATE_ALIAS("%6",key_open,"open");
     CREATE_ALIAS("@3",key_close,"close");
     CREATE_ALIAS("@4",key_command,"command");
     CREATE_ALIAS("*1",key_scommand,"shift-command");
     CREATE_ALIAS("@8",key_enter,"send");
     CREATE_ALIAS("@9",key_exit,"exit");
     CREATE_ALIAS("*9",key_sexit,"shift-exit");
     CREATE_ALIAS("&6",key_save,"save");
     CREATE_ALIAS("!1",key_ssave,"shift-save");
     CREATE_ALIAS("&2",key_refresh,"refresh");
     CREATE_ALIAS("&4",key_restart,"restart");
     CREATE_ALIAS("%1",key_help,"help");
     CREATE_ALIAS("#1",key_shelp,"shift-help");
     CREATE_ALIAS("%3",key_message,"message");
     CREATE_ALIAS("%a",key_smessage,"shift-message");
     CREATE_ALIAS("%7",key_options,"options");
     CREATE_ALIAS("%d",key_soptions,"shift-options");
     CREATE_ALIAS("&5",key_resume,"resume");
     CREATE_ALIAS("*6",key_select,"select");
     CREATE_ALIAS("#3",key_sic,"shift-input");
     CREATE_ALIAS("%9",key_print,"print");
     CREATE_ALIAS("%f",key_sprint,"shift-print");
     CREATE_ALIAS("&1",key_reference,"reference");
     CREATE_ALIAS("%j",key_srsume,"shift-resume");
     CREATE_ALIAS("&7",key_suspend,"suspend");
     CREATE_ALIAS("!2",key_ssuspend,"shift-suspend");
#  endif
  /*}}}  */
  /*{{{  edit*/
#  ifndef SMALL_TERMINFO
     CREATE_ALIAS("@5",key_copy,"copy");
     CREATE_ALIAS("*2",key_scopy,"shift-copy");
     CREATE_ALIAS("@0",key_find,"find");
     CREATE_ALIAS("*0",key_sfind,"shift-find");
     CREATE_ALIAS("%2",key_mark,"mark");
     CREATE_ALIAS("%4",key_move,"move");
     CREATE_ALIAS("%b",key_smove,"shift-move");
     CREATE_ALIAS("%0",key_redo,"redo");
     CREATE_ALIAS("%g",key_sredo,"shift-redo");
     CREATE_ALIAS("&3",key_replace,"replace");
     CREATE_ALIAS("%h",key_sreplace,"shift-replace");
     CREATE_ALIAS("&8",key_undo,"undo");
     CREATE_ALIAS("!3",key_sundo,"shift-undo");
#  endif
  /*}}}  */
  if (!no_term)
     printf(")\n");

  exit(0);
}
/*}}}  */
