#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "akbd.h"

#include "msgtrans.h"
#include "keycode.h"

static const struct {
  int keycode;
  char *text;
} mapping[]={
  {8,"K_BKSPC"},
  {127,"K_DEL"},
  {akbd_PrintK,"K_PRINT"},
  {akbd_TabK,"K_TAB"},
  {akbd_EndK,"K_END"},
  {akbd_LeftK,"K_LEFT"},
  {akbd_RightK,"K_RIGHT"},
  {akbd_DownK,"K_DOWN"},
  {akbd_UpK,"K_UP"},
  {akbd_Fn+1,"K_F1"},
  {akbd_Fn+2,"K_F2"},
  {akbd_Fn+3,"K_F3"},
  {akbd_Fn+4,"K_F4"},
  {akbd_Fn+5,"K_F5"},
  {akbd_Fn+6,"K_F6"},
  {akbd_Fn+7,"K_F7"},
  {akbd_Fn+8,"K_F8"},
  {akbd_Fn+9,"K_F9"},
  {akbd_Fn10,"K_F10"},
  {akbd_Fn11,"K_F11"},
  {akbd_Fn12,"K_F12"},
  {akbd_InsertK,"K_INSERT"},
  {akbd_PageUpK,"K_PAGEUP"},
  {akbd_PageDownK,"K_PAGEDN"},
  {akbd_LeftFlagK,"K_WINL"},
  {akbd_RightFlagK,"K_WINR"},
  {akbd_MenuK,"K_MENU"},
  {0,0},
};

char *keycode_to_text(int keycode,char *buffer,int max)
{
  int i;
  char *buf=buffer;
  int inserted;
  int test_keycode = keycode>=0x100 ? keycode &~(akbd_Sh | akbd_Ctl) : keycode;

  for (i=0;mapping[i].keycode;i++) {
    if (test_keycode==mapping[i].keycode) {
      if (keycode>=0x100) {
        if (keycode & akbd_Sh) {
          inserted=snprintf(buf,max,"%s",msgtrans("K_SHIFT"));
          max-=inserted;
          buf+=inserted;
        }

        if (keycode & akbd_Ctl) {
          inserted=snprintf(buf,max,"%s",msgtrans("K_CTRL"));
          max-=inserted;
          buf+=inserted;
        }
      }

      snprintf(buf,max,"%s",msgtrans(mapping[i].text));
      return buffer;
    }
  }

  if (keycode<32) {
    snprintf(buffer,max,"%s%c",msgtrans("K_CTRL"),keycode+64);
    return buffer;
  }

  snprintf(buffer,max,"%c",keycode);

  return buffer;
}
