Blame src/gperf_unfold_key_conv.py

Packit Service bd74e6
#!/usr/bin/python
Packit Service bd74e6
# -*- coding: utf-8 -*-
Packit Service bd74e6
# gperf_unfold_key_conv.py
Packit Service bd74e6
# Copyright (c) 2016-2017  K.Kosako
Packit Service bd74e6
Packit Service bd74e6
import sys
Packit Service bd74e6
import re
Packit Service bd74e6
Packit Service bd74e6
REG_LINE_GPERF = re.compile('#line .+gperf"')
Packit Service bd74e6
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 Service bd74e6
REG_STR_AT = re.compile('str\[(\d+)\]')
Packit Service bd74e6
REG_UNFOLD_KEY = re.compile('unicode_unfold_key\s*\(register\s+const\s+char\s*\*\s*str,\s*register\s+unsigned\s+int\s+len\)')
Packit Service bd74e6
REG_ENTRY = re.compile('\{".+?",\s*/\*(.+?)\*/\s*(-?\d+),\s*(\d)\}')
Packit Service bd74e6
REG_EMPTY_ENTRY = re.compile('\{"",\s*(-?\d+),\s*(\d)\}')
Packit Service bd74e6
REG_IF_LEN = re.compile('if\s*\(\s*len\s*<=\s*MAX_WORD_LENGTH.+')
Packit Service bd74e6
REG_GET_HASH = re.compile('(?:register\s+)?(?:unsigned\s+)?int\s+key\s*=\s*hash\s*\(str,\s*len\);')
Packit Service bd74e6
REG_GET_CODE = re.compile('(?:register\s+)?const\s+char\s*\*\s*s\s*=\s*wordlist\[key\]\.name;')
Packit Service bd74e6
REG_CODE_CHECK = re.compile('if\s*\(\*str\s*==\s*\*s\s*&&\s*!strncmp.+\)')
Packit Service bd74e6
Packit Service bd74e6
def parse_line(s):
Packit Service bd74e6
    s = s.rstrip()
Packit Service bd74e6
Packit Service bd74e6
    r = re.sub(REG_LINE_GPERF, '', s)
Packit Service bd74e6
    if r != s: return r
Packit Service bd74e6
    r = re.sub(REG_HASH_FUNC, 'hash(OnigCodePoint codes[])', s)
Packit Service bd74e6
    if r != s: return r
Packit Service bd74e6
    r = re.sub(REG_STR_AT, 'onig_codes_byte_at(codes, \\1)', s)
Packit Service bd74e6
    if r != s: return r
Packit Service bd74e6
    r = re.sub(REG_UNFOLD_KEY, 'unicode_unfold_key(OnigCodePoint code)', s)
Packit Service bd74e6
    if r != s: return r
Packit Service bd74e6
    r = re.sub(REG_ENTRY, '{\\1, \\2, \\3}', s)
Packit Service bd74e6
    if r != s: return r
Packit Service bd74e6
    r = re.sub(REG_EMPTY_ENTRY, '{0xffffffff, \\1, \\2}', s)
Packit Service bd74e6
    if r != s: return r
Packit Service bd74e6
    r = re.sub(REG_IF_LEN, 'if (0 == 0)', s)
Packit Service bd74e6
    if r != s: return r
Packit Service bd74e6
    r = re.sub(REG_GET_HASH, 'int key = hash(&code);', s)
Packit Service bd74e6
    if r != s: return r
Packit Service bd74e6
    r = re.sub(REG_GET_CODE, 'OnigCodePoint gcode = wordlist[key].code;', s)
Packit Service bd74e6
    if r != s: return r
Packit Service bd74e6
    r = re.sub(REG_CODE_CHECK, 'if (code == gcode && wordlist[key].index >= 0)', s)
Packit Service bd74e6
    if r != s: return r
Packit Service bd74e6
Packit Service bd74e6
    return s
Packit Service bd74e6
Packit Service bd74e6
def parse_file(f):
Packit Service bd74e6
    print "/* This file was converted by gperf_unfold_key_conv.py\n      from gperf output file. */"
Packit Service bd74e6
Packit Service bd74e6
    line = f.readline()
Packit Service bd74e6
    while line:
Packit Service bd74e6
        s = parse_line(line)
Packit Service bd74e6
        print s
Packit Service bd74e6
        line = f.readline()
Packit Service bd74e6
Packit Service bd74e6
Packit Service bd74e6
# main
Packit Service bd74e6
parse_file(sys.stdin)