mkunitab.py
来自「bbs server linux平台下软件源码」· Python 代码 · 共 93 行
PY
93 行
#/usr/bin/env python
import sys, string, os, getopt
def make(mapfile, mbname, lcrange, unochar, mbnochar):
f = open(mapfile)
mb = open(mbname + ".mb.c", "w")
mapl2u = {}
mapu2l = {}
s = f.readline()
while s:
s = string.strip(s)
i = string.find(s, '#')
if i != -1:
s = s[:i]
m = string.split(s)
if len(m) > 1 and eval(m[0]) > 0xff :
mapl2u[eval(m[0])] = eval(m[1])
mapu2l[eval(m[1])] = eval(m[0])
s = f.readline()
mb.write("#define unochar " + hex(unochar) + "\n")
mb.write("#define mbnochar " + hex(mbnochar) + "\n")
mb.write("static unsigned int ltab[][" + str(lcrange[1][1] - lcrange[1][0]) + "]=\n{\n")
for lead in range(lcrange[0][0], lcrange[0][1]):
mb.write("\t{\n\t\t");
for trail in range(lcrange[1][0], lcrange[1][1]):
try:
val = hex(mapl2u[(lead << 8) | trail])
except:
val = 'unochar'
mb.write(val + ",")
if (trail & 7) == 7:
mb.write("\n\t\t")
mb.write("},\n")
mb.write("};\n")
mb.write("/* --- FROM local encoding to unicode --- */\n")
mb.write("unsigned int from" + mbname + "(unsigned int dbchar)\n{\n")
mb.write("\tconst unsigned char lead_low = " + hex(lcrange[0][0]) + ";\n")
mb.write("\tconst unsigned char lead_high = " + hex(lcrange[0][1] - 1) + ";\n")
mb.write("\tconst unsigned char trail_low = " + hex(lcrange[1][0]) + ";\n")
mb.write("\tconst unsigned char trail_high = " + hex(lcrange[1][1] - 1) + ";\n")
mb.write("""
unsigned char lead = (dbchar >> 8) & 0xff;
unsigned char trail = dbchar & 0xff;
if (lead < lead_low || lead > lead_high)
return unochar;
if (trail < trail_low || trail > trail_high)
return unochar;
return ltab[lead - lead_low][trail - trail_low];
}\n\n\n""")
mapupane = {}
for hibyte in range(0, 0x100):
emptypane = 1
for lowbyte in range(0, 0x100):
try:
val = hex(mapu2l[(hibyte << 8) | lowbyte])
emptypane = 0
except:
pass
if emptypane:
pass
else:
mapupane[hibyte] = 1
mb.write("static unsigned int upane" + hex(hibyte)[2:] + "[] =\n{\n\t")
for lowbyte in range(0, 0xff):
try:
val = hex(mapu2l[(hibyte << 8) | lowbyte])
except:
val = 'mbnochar';
mb.write(val + ',')
if (lowbyte & 7) == 7:
mb.write("\n\t")
mb.write("};\n\n")
mb.write("\n\nstatic unsigned int *utab[] =\n{\n")
for hibyte in range(0, 0x100):
if mapupane.has_key(hibyte):
mb.write("\tupane" + hex(hibyte)[2:] + ",\n")
else:
mb.write("\t0,\n")
mb.write("};\n\n")
mb.write("/* --- FROM unicode to local encoding --- */\n")
mb.write("unsigned int to" + mbname + "(unsigned int uchar)\n{\n")
mb.write("""
unsigned char hibyte = (uchar >> 8) & 0xff;
unsigned char lowbyte = uchar & 0xff;
if (!utab[hibyte])
return mbnochar;
return utab[hibyte][lowbyte];
}\n""")
f.close()
mb.close()
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?