1#!/usr/bin/python 2# -*- coding: utf-8 -*- 3# gperf_fold_key_conv.py 4# Copyright (c) 2016-2018 K.Kosako 5 6import sys 7import re 8 9REG_LINE_GPERF = re.compile('#line .+gperf"') 10REG_HASH_FUNC = re.compile('hash\s*\(register\s+const\s+char\s*\*\s*str,\s*register\s+size_t\s+len\s*\)') 11REG_STR_AT = re.compile('str\[(\d+)\]') 12REG_RETURN_TYPE = re.compile('^const\s+short\s+int\s*\*') 13REG_FOLD_KEY = re.compile('unicode_fold(\d)_key\s*\(register\s+const\s+char\s*\*\s*str,\s*register\s+size_t\s+len\)') 14REG_ENTRY = re.compile('\{".*?",\s*(-?\d+)\s*\}') 15REG_IF_LEN = re.compile('if\s*\(\s*len\s*<=\s*MAX_WORD_LENGTH.+') 16REG_GET_HASH = re.compile('(?:register\s+)?(?:unsigned\s+)?int\s+key\s*=\s*hash\s*\(str,\s*len\);') 17REG_GET_CODE = re.compile('(?:register\s+)?const\s+char\s*\*\s*s\s*=\s*wordlist\[key\]\.name;') 18REG_CODE_CHECK = re.compile('if\s*\(\*str\s*==\s*\*s\s*&&\s*!strncmp.+\)') 19REG_RETURN_WL = re.compile('return\s+&wordlist\[key\];') 20REG_RETURN_0 = re.compile('return 0;') 21 22def parse_line(s, key_len): 23 s = s.rstrip() 24 25 r = re.sub(REG_LINE_GPERF, '', s) 26 if r != s: return r 27 r = re.sub(REG_HASH_FUNC, 'hash(OnigCodePoint codes[])', s) 28 if r != s: return r 29 r = re.sub(REG_STR_AT, 'onig_codes_byte_at(codes, \\1)', s) 30 if r != s: return r 31 r = re.sub(REG_RETURN_TYPE, 'int', s) 32 if r != s: return r 33 r = re.sub(REG_FOLD_KEY, 'unicode_fold\\1_key(OnigCodePoint codes[])', s) 34 if r != s: return r 35 r = re.sub(REG_ENTRY, '\\1', s) 36 if r != s: return r 37 r = re.sub(REG_IF_LEN, 'if (0 == 0)', s) 38 if r != s: return r 39 r = re.sub(REG_GET_HASH, 'int key = hash(codes);', s) 40 if r != s: return r 41 r = re.sub(REG_GET_CODE, 'int index = wordlist[key];', s) 42 if r != s: return r 43 r = re.sub(REG_CODE_CHECK, 44 'if (index >= 0 && onig_codes_cmp(codes, OnigUnicodeFolds%d + index, %d) == 0)' % (key_len, key_len), s) 45 if r != s: return r 46 47 r = re.sub(REG_RETURN_WL, 'return index;', s) 48 if r != s: return r 49 r = re.sub(REG_RETURN_0, 'return -1;', s) 50 if r != s: return r 51 52 return s 53 54def parse_file(f, key_len): 55 print "/* This file was converted by gperf_fold_key_conv.py\n from gperf output file. */" 56 57 while True: 58 line = f.readline() 59 if not line: 60 break 61 62 s = parse_line(line, key_len) 63 print s 64 65 66# main 67argv = sys.argv 68argc = len(argv) 69 70key_len = int(argv[1]) 71parse_file(sys.stdin, key_len) 72