convertd.c
来自「C实现的MUD,对大家基本入门网络游戏很有帮助!」· C语言 代码 · 共 190 行
C
190 行
// languaged.c//// GB <-> Big5//// Kenny@EC (1998/3/21)// (Ported from @(#)$Id: ccf.c,v 1.2 1994/04/30 19:49:36 shin Exp shin $)// #define LANGUAGE_D "/adm/daemons/languaged.c" at globals.h// Ported to by ken@chinesemud.net at 1998/05/18#pragma optimize#pragma save_binary//inherit F_CLEAN_UP;#define B2G_TAB CONFIG_DIR+"language/BtoG.tab"#define G2B_TAB CONFIG_DIR+"language/GtoB.tab"#define B2G 0#define G2B 1#define B2G_bad1 0xa1#define B2G_bad2 0xf5#define G2B_bad1 0xa1#define G2B_bad2 0xbc#define is_GB1(x) ((x)>=0xa1 && (x)<=0xf7)#define is_GB2(x) ((x)>=0xa1 && (x)<=0xfe)#define is_B51(x) ((x)>=0xa1&&(x)<=0xfe)#define is_B52(x) (((x)>=0x40 && (x)<=0x7e) || ((x)>=0xa1 && (x)<=0xfe))private int G2B_cols, B2G_cols;private mapping B2G_Cache=([]), G2B_Cache=([]);private int Fetch(int key, int flag){ int col_limit=flag? G2B_cols: B2G_cols, col = key%col_limit; string buf, file=flag? G2B_TAB: B2G_TAB; if (flag && G2B_Cache[key]) return G2B_Cache[key]; if (!flag && B2G_Cache[key]) return B2G_Cache[key]; if (buf = read_file(file, key/col_limit+1, 1)) { string *field = explode(buf, ","); if (col < sizeof(field)) { int value; sscanf(field[col], "%x", value); if (flag) G2B_Cache[key] = value; else B2G_Cache[key] = value; return value; } // if } // if return 0;} // Fetch()private int *g2b(int c1, int c2){ int i; if ((c2>=0xa1) && (c2<=0xfe)) { if ((c1>=0xa1) && (c1<=0xa9)) { i = ((c1-0xa1)*94 + (c2-0xa1)) * 2; return ({ Fetch(i++, G2B), Fetch(i, G2B) }); } // if else if ((c2>=0xa1) && (c2<=0xfe)) { i = ((c1-0xb0+9)*94 + (c2-0xa1)) * 2; return ({ Fetch(i++, G2B), Fetch(i, G2B) }); } // if } // if return ({ G2B_bad1, G2B_bad2 });} // g2b()private int *b2g(int c1, int c2){ int i; if ((c1 >= 0xa1) && (c1 <= 0xf6)) { if ((c2 >= 0x40) && (c2 <= 0x7e)) { i = ((c1 - 0xa1) * 157 + (c2 - 0x40)) * 2; return ({ Fetch(i++, B2G), Fetch(i, B2G) }); } // if else if ((c2 >= 0xa1) && (c2 <= 0xfe)) { i = ((c1 - 0xa1) * 157 + (c2 - 0xa1) + 63) * 2; return ({ Fetch(i++, B2G), Fetch(i, B2G) }); } // if } // if else if ((c1 == 0xf7) && (c2 >= 0x40) && (c2 <= 0x55)) { i = ((c1 - 0xa1) * 157 + (c2 - 0x40)) * 2; return ({ Fetch(i++, B2G), Fetch(i, B2G) }); } // if return ({ B2G_bad1, B2G_bad2 });} // b2g()string GB2Big5(string src){ string str=src; // duplicate string int len=strlen(str); for (int i=0; i<len;) if (is_GB1(str[i]) && is_GB2(str[i+1])) { int *code=g2b(str[i], str[i+1]); str[i] = code[0]; str[i+1] = code[1]; i += 2; } // if else i++; return str+""; // assure string} // GB2Big5()string Big52GB(string src){ string str=src; // duplicate string int len=strlen(str); for (int i=0; i<len;) if (is_B51(str[i]) && is_B52(str[i+1])) { int *code=b2g(str[i], str[i+1]); str[i] = code[0]; str[i+1] = code[1]; i += 2; } // if else i++; return str+""; // assure string} // Big52GB()string toBig5(string str){ if (!stringp(str)) return 0; return GB2Big5(str);} // toBig5()string toGB(string str){ if (!stringp(str)) return 0; return Big52GB(str);} // toGB()string input (string str, object me){ if (! str || ! me) return str; if (me->query_encoding() == 1) { return toGB(str); } return str;}string output (string str, object me){ if (! str || ! me) return str; if (me->query_encoding() == 1) { return toBig5(str); } return str;}void create(){ string buf; seteuid(getuid()); if (buf = read_file(B2G_TAB, 1, 1)) B2G_cols = sizeof(explode(buf, ","))-1; if (buf = read_file(G2B_TAB, 1, 1)) G2B_cols = sizeof(explode(buf, ","))-1;} // create()
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?