⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 automata.c

📁 手机韩语输入法源码 朝鲜语字母与手机键盘之间的对应
💻 C
字号:
/*
   Hangul Automata

   Written by Song Jaekyung
 */

//#include "ptyx.h"
//#include "data.h"
#include "hangul.h"

//extern void HideCursor();

static int ascii(int, char *);

int hangul_state = 1;
char temp_hangul[8];
int (*converter) ();

static int f, m, l;

#define push(x)	( stack[ sp++ ] = (x) )
#define pop()	( stack[ --sp ] )



/* table_for_3 俊辑 荤侩瞪 flag: int type捞 32bit 捞惑捞绢具 窃 */
/* F_WC: wide character绰 馆靛矫 2官捞飘 炼钦屈 内靛(KSSM)肺 钎扁秦具 窃 */
#define	F_F	0x010000                /* 檬己 */
#define F_M	0x020000                /* 吝己 */
#define F_L	0x040000                /* 辆己 */
#define F_A	0x080000                /* ASCII */
#define F_WC    0x100000                /* wide(2 byte) character */



/* table_for_2 俊辑 荤侩瞪 flag */
#define	F_C_F	0x010000U		/* 磊澜 - 檬己傈侩 */
#define F_C_L	0x020000U		/* 磊澜 - 辆己: 辆己傈侩 磊澜篮 绝澜 */
#define F_C_C	0x030000U		/* 磊澜 - 檬, 辆己 扳侩 */
#define F_V	0x040000U		/* 葛澜 */
/* ASCII巩磊绰 傍烹栏肺 静烙 */

/* 2国侥 磊魄 函券: 辆己篮 lcon()俊辑 促矫 贸府窃 */
static unsigned int table_for_2_qwerty[] =
{
/* !          "          #          $          %          & */
  '!' | F_A, '"' | F_A, '#' | F_A, '$' | F_A, '%' | F_A, '&' | F_A,
/* '          (          )          *          +          , */
  '\'' | F_A, '(' | F_A, ')' | F_A, '*' | F_A, '+' | F_A, ',' | F_A, 
/* -          .          /          0          1          2 */
  '-' | F_A, '.' | F_A, '[' | F_A, '0' | F_A, '1' | F_A, '2' | F_A, 
/* 3          4          5          6          7          8 */
  '3' | F_A, '4' | F_A, '5' | F_A, '6' | F_A, '7' | F_A, '8' | F_A,
/* 9          :          ;          <          =          > */
  '9' | F_A, ':' | F_A, ';' | F_A, '<' | F_A, '=' | F_A, '>' | F_A,
/* ?          @          A          B          C          D */
  '?' | F_A, '@' | F_A, 'A' | F_A, 'B' | F_A, 'C' | F_A, 'D' | F_A,
/* E          F          G          H          I          J */
  6 | F_C_F, 'F' | F_A, 'G' | F_A, 'H' | F_A, 'I' | F_A, 'J' | F_A,
/* K          L          M          N          O          P */
  'K' | F_A, 'L' | F_A, 'M' | F_A, 'N' | F_A, 6 | F_V, 12 | F_V,
/* Q          R          S          T          U          V */
  10 | F_C_F, 3 | F_C_C, 'S' | F_A, 12 | F_C_C, 'U' | F_A, 'V' | F_A,
/* W          X          Y          Z          [          \ */
  15 | F_C_F, 'X' | F_A, 'Y' | F_A, 'Z' | F_A, '[' | F_A, '\\' | F_A,
/* ]          ^          _          `          a          b */
  ']' | F_A, '^' | F_A, '_' | F_A, '`' | F_A, 8 | F_C_C, 26 | F_V,
/* c          d          e          f          g          h */
  16 | F_C_C, 13 | F_C_C, 5 | F_C_C, 7 | F_C_C, 20 | F_C_C, 13 | F_V,
/* i          j          k          l          m          n */
  5 | F_V, 7 | F_V, 3 | F_V, 29 | F_V, 27 | F_V, 20 | F_V,
/* o          p          q          r          s          t */
  4 | F_V, 10 | F_V, 9 | F_C_C, 2 | F_C_C, 4 | F_C_C, 11 | F_C_C,
/* u          v          w          x          y          z */
  11 | F_V, 19 | F_C_C, 14 | F_C_C, 18 | F_C_C, 19 | F_V, 17 | F_C_C,
/* {          |          }          ~ */
  '{' | F_A, '|' | F_A, '}' | F_A, '~' | F_A,
};





/* 2 国侥俊辑 康巩磊 -> 炼钦屈 檬己 函券
   搬苞: 檬己捞 酒聪搁 0
 */
static int
fcon (c)
     int c;
{
  /* 檬己狼 裹困 八祸 */
  if (c < '"' || c > 'z')
    return 0;

  if (table_for_2_qwerty[c - '!'] & F_C_F)
    return table_for_2_qwerty[c - '!'] & 0xff;

  return 0;
}

/* 2 国侥俊辑 康巩磊 -> 吝己 函券
   搬苞: 吝己捞 酒聪搁 0
 */
static int
vow (c)
     int c;
{
  /* 葛澜狼 裹困 八祸 */
  if (c < 'L' || c > 'y')
    return 0;

  if (table_for_2_qwerty[c - '!'] & F_V)
    return table_for_2_qwerty[c - '!'] & 0xff;

  return 0;
}

/* 2国侥俊辑 康巩磊 -> 罐魔 函券
   搬苞: 罐魔捞 酒聪搁 0
 */
static int
lcon (c)
     int c;
{
  static unsigned int table_qwerty[] =
  {
    /* !   "   #   $   %   &   '   (   )   *   +   ,   -   .   / */
       0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    /* 0   1   2   3   4   5   6   7   8   9   :   ;   <   =   > */
       0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    /* ?   @   A   B   C   D   E   F   G   H   I   J   K   L   M */
       0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    /* N   O   P   Q   R   S   T   U   V   W   X   Y   Z   [   \ */
       0,  0,  0,  0,  3,  0,  22, 0,  0,  0,  0,  0,  0,  0,  0,
    /* ]   ^   _   `   a   b   c   d   e   f   g   h   i   j   k */
       0,  0,  0,  0,  17, 0,  25, 23, 8,  9,  29, 0,  0,  0,  0,
    /* l   m   n   o   p   q   r   s   t   u   v   w   x   y   z */
       0,  0,  0,  0,  0,  19, 2,  5,  21, 0,  28, 24, 27, 0,  26
  };

  /* 辆己狼 裹困 八祸 */
  if (c < 'R' || c > 'z')
    return 0;

  if (table_for_2_qwerty[c - '!'] & F_C_L)
    return table_qwerty[c - '!'];

  return 0;
}

/* 2 国侥俊辑 (泅犁 罐魔, 康巩磊 涝仿) -> 罐魔 函券 */
static int
comcon_qwerty (k, c)
     int k;
     int c;
{
  switch (k)
    {
    case 2:			/* ぁ */
      switch (c)
	{
	case 't':
	  return 4;		/* ぁさ */
	}
      break;
    case 5:			/* い */
      switch (c)
	{
	case 'w':		/* いじ */
	  return 6;
	case 'g':		/* いぞ */
	  return 7;
	}
      break;
    case 9:			/* ぉ */
      switch (c)
	{
	case 'r':		/* ぉぁ */
	  return 10;
	case 'a':		/* ぉけ */
	  return 11;
	case 'q':		/* ぉげ */
	  return 12;
	case 't':		/* ぉさ */
	  return 13;
	case 'x':		/* ぉぜ */
	  return 14;
	case 'v':		/* ぉそ */
	  return 15;
	case 'g':		/* ぉぞ */
	  return 16;
	}
      break;
    case 19:			/* げ */
      switch (c)
	{
	case 't':		/* げさ */
	  return 20;
	}
      break;
    }
  return 0;
}

/* 2国侥俊辑 (泅犁 吝己, 康巩 涝仿) -> 吝己 函券 */
static int
comvow_qwerty (v, c)
     int v;
     int c;
{
  switch (v)
    {
    case 13:			/* で */
      switch (c)
	{
	case 'k':		/* でた */
	  return 14;
	case 'o':		/* でだ */
	  return 15;
	case 'l':		/* でび */
	  return 18;
	}
      break;
    case 20:			/* ぬ */
      switch (c)
	{
	case 'j':		/* ぬっ */
	  return 21;
	case 'p':		/* ぬつ */
	  return 22;
	case 'l':		/* ぬび */
	  return 23;
	}
      break;
    case 27:			/* ぱ */
      switch (c)
	{
	case 'l':		/* ぱび */
	  return 28;
	}
      break;
    }
  return 0;
}

/* 技国侥俊辑 康巩 贸府: 技国侥篮 ascii3甫 芭媚辑 咳 */
static int
ascii (c, buf)
     int c;
     char *buf;
{
  static int f, m, l;

  if (c == -1)
    {
      if (hangul_state)
	hangul_state = 0;
      else
	{
	  hangul_state = 1;
	  f = 1;
	  m = 2;
	  l = 1;
	}
     // jwf show_status (&term->screen, 0, 0);
      return 0;
    }
  else if (c == -2)
    {				/* flush output */
      f = 1;
      m = 2;
      l = 1;
      return 0;
    }
  else if (hangul_state && c == 27)      /* escape key */
    {
      hangul_state = 0;
      // jwf show_status (&term->screen, 0, 0);
      buf[0] = c;
      return 1;
    }
#ifdef USE_WON
  else if (hangul_state && c == '\\')
    {
      buf[0] = 0xa3;
      buf[1] = 0xdc;
      return 2;
    }
#endif
  else if (c & F_WC)              /* wide character */
    {
      buf[0] = (c & 0xFF00) >> 8; /* first byte */
      buf[1] = (c & 0xFF);        /* second byte */
      /* 葛电 内靛甫 瘤盔窍扁 困秦辑 
       * 3官捞飘 内靛(郴何扁夯屈)栏肺 官槽饶 促矫 免仿且 内靛肺 官槽促. */
      convert_johab_to_3((unsigned char *)buf, &f, &m, &l);
      (*converter) (f, m, l, buf);
      return 2;
    }
  else
    {
      buf[0] = c;
      return 1;
    }
}

/* (康巩 涝仿) -> 肯己屈 内靛 巩磊凯
   c : 康巩 ASCII
   -1 : 茄康 toggle
   -2 : 泅犁 备己吝牢 茄臂阑 倒妨 霖促. flush.
   buf : 肯己等 臂磊狼 KS C 5601 - 1992 内靛
   搬苞: buf 俊 割 官捞飘唱 甸绢 艾绰啊
   寇何 曼炼: display_temp() : 泅犁 备己吝牢 茄臂阑 拳搁俊 弊妨 霖促.
   term->screen.keyboard : 磊魄 搬沥. 2 = 2国侥, 3 = 3国侥
   term->screen.use_dvorak_layout : 康巩磊魄硅凯. False = qwerty, True = dvorak
   convert_3_to_ks() : 炼钦->肯己 函券. 函券等 饶 巩磊凯 辨捞甫
   倒妨 拎具 茄促. 2 肚绰 8
   show_status() : 茄臂 惑怕 牢瘤 康巩 惑怕牢瘤 钎矫茄促.
 */
int
hangul_automata (c, buf)
     int c;			/* input character */
     char *buf;
{
  static int sp, pc, stack[10];
  int t, t2, rs;

  extern int font_ks_mode;
  int ks_only;

  /* function pointer for english keyboard layout */
  static int (*comfcon3)();
  static int (*comvow3)();
  static int (*comcon3)();
  static int (*comcon)();
  static int (*comvow)();

 // jwf ks_only = font_ks_mode != -1 || term->screen.code == C_WANSUNG;
converter = convert_3_to_ks; // jwf
  if (hangul_state == 0)	/* 康巩 惑怕 */
    return ascii (c, buf);

  /* dvorak 硅凯阑 qwerty磊魄贸烦 官操绢 淋 */
 /* if ( jwf term->screen.use_dvorak_layout &&  c >= '!' && c <= '~')
    {
      c = table_dvorak_layout[c - '!']; 
    }
*/
  /* set function pointer: 3.1.5rc1俊辑 烙矫肺 借澜. 梆 汗备 抗沥 */
  comcon = comcon_qwerty;
  comvow = comvow_qwerty;
//  comfcon3 = comfcon3_qwerty;
//  comvow3 = comvow3_qwerty;
//  comcon3 = comcon3_qwerty;

  if (1 /* jwf term->screen.keyboard == 2 */)
    {				/* 2 国侥 */
      switch (hangul_state)
	{
	case 1:		/* 檬己阑 扁促覆 */
	  sp = 0;
	  if (t = fcon (c))
	    {
	      display_temp (t, 2, 1);
	      f = t;
	      hangul_state = 2;
	      return 0;
	    }
	  else if (t = vow (c))
	    {
	      display_temp (1, t, 1);
	      f = 1;
	      m = t;
	      push (2);
	      hangul_state = 3;
	      return 0;
	    }
	  else
	    {
	      f = 1;
	      m = 2;
	      l = 1;
	      display_temp (-1, -1, -1);
	      return ascii (c, buf);
	    }
	  break;
	case 2:		/* 吝己 扁促覆 */
	  if (t = vow (c))
	    {
	      if (in_ks(f, t, 1))
		{
		  display_temp (f, t, 1);
		  push (2);
		  m = t;
		  hangul_state = 3;
		  return 0;
		}
	      else
		{
		  rs = (*converter) (f, 2, 1, buf);
		  display_temp (f = 1, m = t, 1);
		  sp = 0;
		  push(2);
		  hangul_state = 3;
		  return rs;
		}
	    }
	  else if (t = fcon (c))
	    {
	      rs = (*converter) (f, 2, 1, buf);
	      display_temp (t, 2, 1);
	      sp = 0;
	      f = t;
	      hangul_state = 2;
	      return rs;
	    }
	  else if (c == '\b')
	    {
	      display_temp (-1, -1, -1);
	      hangul_state = 1;
	      return 0;
	    }
	  else
	    {
	      rs = (*converter) (f, 2, 1, buf);
	      display_temp (-1, -1, -1);
	      hangul_state = 1;
	      return ascii (c, buf + rs) + rs;
	    }
	  break;
	case 3:		/* 辆己 扁促覆 */
	  if ((t = lcon (c)) && (!ks_only || in_ks(f, m, t)))
	    {
	      display_temp (f, m, t);
	      push (1);
	      l = t;
	      pc = c;
	      hangul_state = 4;
	      return 0;
	    }
	  else if ((t = comvow (m, c)) && (!ks_only || in_ks(f, t, 1)))
	    {
	      display_temp (f, t, 1);
	      push (m);
	      m = t;
	      return 0;
	    }
	  else if (t = fcon (c))
	    {
	      rs = (*converter) (f, m, 1, buf);
	      display_temp (t, 2, 1);
	      f = t;
	      sp = 0;
	      hangul_state = 2;
	      return rs;
	    }
	  else if (t = vow (c))
	    {
	      rs = (*converter) (f, m, 1, buf);
	      f = 1;
	      m = t;
	      l = 1;
	      display_temp (f, m, l);
	      sp = 0;
	      push (2);
	      return rs;
	    }
	  else if (c == '\b')
	    {			/* back space */
	      m = pop ();
	      if (m == 2)
		{		/* we extracted all */
		  if (f == 1)
		    {
		      hangul_state = 1;
		      f = -1;
		    }
		  else
		    {
		      hangul_state = 2;
		    }
		}
	      display_temp (f, m, 1);
	      return 0;
	    }
	  else
	    {
	      rs = (*converter) (f, m, 1, buf);
	      display_temp (-1, -1, -1);
	      sp = 0;
	      hangul_state = 1;
	      return ascii (c, buf + rs) + rs;
	    }
	  break;
	case 4:		/* 汗钦 罐魔 扁促覆 */
	  if( (t = comcon(l, c)) && (!ks_only || in_ks(f, m, t)))
	    {
	      display_temp (f, m, t);
	      push (l);
	      l = t;
	      pc = c;
	      return 0;
	    }
	  else if (t = vow (c))
	    {
	      if (!ks_only || in_ks(fcon(pc), t, 1))
		{
		  rs = (*converter) (f, m, pop (), buf);
		  display_temp (f = fcon (pc), m = t, 1);
		  sp = 0;
		  push (2);
		  hangul_state = 3;
		  return rs;
		}
	      else
		{
		  rs = (*converter) (f, m, l, buf);
		  display_temp (f = 1, m = t, 1);
		  sp = 0;
		  push(2);
		  hangul_state = 3;
		  return rs;
		}
	    }
	  else if (t = fcon (c))
	    {
	      rs = (*converter) (f, m, l, buf);
	      display_temp (t, 2, 1);
	      f = t;
	      sp = 0;
	      hangul_state = 2;
	      return rs;
	    }
	  else if (c == '\b')
	    {			/* back space */
	      display_temp (f, m, l = pop ());
	      if (l == 1)
		hangul_state = 3;
	      return 0;
	    }
	  else
	    {
	      rs = (*converter) (f, m, l, buf);
	      display_temp (-1, -1, -1);
	      sp = 0;
	      hangul_state = 1;
	      return ascii (c, buf + rs) + rs;
	    }
	  break;
	}
    }
}

display_temp (f, m, l)
     int f, m, l;
{
  if (f < 0)
    {
    // jwf  HideCursor ();
      temp_hangul[0] = 0;
    }
  else
    convert_3_to_johab (f, m, l, temp_hangul);
 // jwf ShowCursor ();
}

in_ks (f, m, t)
     int f, m, t;
{
  char buf[8];

  return convert_3_to_ks (f, m, t, buf) == 2;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -