?? automata.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 + -