|
Packit |
b89d10 |
#!/usr/bin/python
|
|
Packit |
b89d10 |
# -*- coding: utf-8 -*-
|
|
Packit |
b89d10 |
# gperf_fold_key_conv.py
|
|
Packit |
b89d10 |
# Copyright (c) 2016-2017 K.Kosako
|
|
Packit |
b89d10 |
|
|
Packit |
b89d10 |
import sys
|
|
Packit |
b89d10 |
import re
|
|
Packit |
b89d10 |
|
|
Packit |
b89d10 |
REG_LINE_GPERF = re.compile('#line .+gperf"')
|
|
Packit |
b89d10 |
REG_HASH_FUNC = re.compile('hash\s*\(register\s+const\s+char\s*\*\s*str,\s*register\s+unsigned\s+int\s+len\s*\)')
|
|
Packit |
b89d10 |
REG_STR_AT = re.compile('str\[(\d+)\]')
|
|
Packit |
b89d10 |
REG_RETURN_TYPE = re.compile('^const\s+short\s+int\s*\*')
|
|
Packit |
b89d10 |
REG_FOLD_KEY = re.compile('unicode_fold(\d)_key\s*\(register\s+const\s+char\s*\*\s*str,\s*register\s+unsigned\s+int\s+len\)')
|
|
Packit |
b89d10 |
REG_ENTRY = re.compile('\{".*?",\s*(-?\d+)\s*\}')
|
|
Packit |
b89d10 |
REG_IF_LEN = re.compile('if\s*\(\s*len\s*<=\s*MAX_WORD_LENGTH.+')
|
|
Packit |
b89d10 |
REG_GET_HASH = re.compile('(?:register\s+)?(?:unsigned\s+)?int\s+key\s*=\s*hash\s*\(str,\s*len\);')
|
|
Packit |
b89d10 |
REG_GET_CODE = re.compile('(?:register\s+)?const\s+char\s*\*\s*s\s*=\s*wordlist\[key\]\.name;')
|
|
Packit |
b89d10 |
REG_CODE_CHECK = re.compile('if\s*\(\*str\s*==\s*\*s\s*&&\s*!strncmp.+\)')
|
|
Packit |
b89d10 |
REG_RETURN_WL = re.compile('return\s+&wordlist\[key\];')
|
|
Packit |
b89d10 |
REG_RETURN_0 = re.compile('return 0;')
|
|
Packit |
b89d10 |
|
|
Packit |
b89d10 |
def parse_line(s, key_len):
|
|
Packit |
b89d10 |
s = s.rstrip()
|
|
Packit |
b89d10 |
|
|
Packit |
b89d10 |
r = re.sub(REG_LINE_GPERF, '', s)
|
|
Packit |
b89d10 |
if r != s: return r
|
|
Packit |
b89d10 |
r = re.sub(REG_HASH_FUNC, 'hash(OnigCodePoint codes[])', s)
|
|
Packit |
b89d10 |
if r != s: return r
|
|
Packit |
b89d10 |
r = re.sub(REG_STR_AT, 'onig_codes_byte_at(codes, \\1)', s)
|
|
Packit |
b89d10 |
if r != s: return r
|
|
Packit |
b89d10 |
r = re.sub(REG_RETURN_TYPE, 'int', s)
|
|
Packit |
b89d10 |
if r != s: return r
|
|
Packit |
b89d10 |
r = re.sub(REG_FOLD_KEY, 'unicode_fold\\1_key(OnigCodePoint codes[])', s)
|
|
Packit |
b89d10 |
if r != s: return r
|
|
Packit |
b89d10 |
r = re.sub(REG_ENTRY, '\\1', s)
|
|
Packit |
b89d10 |
if r != s: return r
|
|
Packit |
b89d10 |
r = re.sub(REG_IF_LEN, 'if (0 == 0)', s)
|
|
Packit |
b89d10 |
if r != s: return r
|
|
Packit |
b89d10 |
r = re.sub(REG_GET_HASH, 'int key = hash(codes);', s)
|
|
Packit |
b89d10 |
if r != s: return r
|
|
Packit |
b89d10 |
r = re.sub(REG_GET_CODE, 'int index = wordlist[key];', s)
|
|
Packit |
b89d10 |
if r != s: return r
|
|
Packit |
b89d10 |
r = re.sub(REG_CODE_CHECK,
|
|
Packit |
b89d10 |
'if (index >= 0 && onig_codes_cmp(codes, OnigUnicodeFolds%d + index, %d) == 0)' % (key_len, key_len), s)
|
|
Packit |
b89d10 |
if r != s: return r
|
|
Packit |
b89d10 |
|
|
Packit |
b89d10 |
r = re.sub(REG_RETURN_WL, 'return index;', s)
|
|
Packit |
b89d10 |
if r != s: return r
|
|
Packit |
b89d10 |
r = re.sub(REG_RETURN_0, 'return -1;', s)
|
|
Packit |
b89d10 |
if r != s: return r
|
|
Packit |
b89d10 |
|
|
Packit |
b89d10 |
return s
|
|
Packit |
b89d10 |
|
|
Packit |
b89d10 |
def parse_file(f, key_len):
|
|
Packit |
b89d10 |
print "/* This file was converted by gperf_fold_key_conv.py\n from gperf output file. */"
|
|
Packit |
b89d10 |
|
|
Packit |
b89d10 |
line = f.readline()
|
|
Packit |
b89d10 |
while line:
|
|
Packit |
b89d10 |
s = parse_line(line, key_len)
|
|
Packit |
b89d10 |
print s
|
|
Packit |
b89d10 |
line = f.readline()
|
|
Packit |
b89d10 |
|
|
Packit |
b89d10 |
|
|
Packit |
b89d10 |
# main
|
|
Packit |
b89d10 |
argv = sys.argv
|
|
Packit |
b89d10 |
argc = len(argv)
|
|
Packit |
b89d10 |
|
|
Packit |
b89d10 |
key_len = int(argv[1])
|
|
Packit |
b89d10 |
parse_file(sys.stdin, key_len)
|