1*ae771770SStanislav Sedov#!/usr/local/bin/python 2*ae771770SStanislav Sedov# -*- coding: iso-8859-1 -*- 3*ae771770SStanislav Sedov 4*ae771770SStanislav Sedov# $Id$ 5*ae771770SStanislav Sedov 6*ae771770SStanislav Sedov# Copyright (c) 2004 Kungliga Tekniska Högskolan 7*ae771770SStanislav Sedov# (Royal Institute of Technology, Stockholm, Sweden). 8*ae771770SStanislav Sedov# All rights reserved. 9*ae771770SStanislav Sedov# 10*ae771770SStanislav Sedov# Redistribution and use in source and binary forms, with or without 11*ae771770SStanislav Sedov# modification, are permitted provided that the following conditions 12*ae771770SStanislav Sedov# are met: 13*ae771770SStanislav Sedov# 14*ae771770SStanislav Sedov# 1. Redistributions of source code must retain the above copyright 15*ae771770SStanislav Sedov# notice, this list of conditions and the following disclaimer. 16*ae771770SStanislav Sedov# 17*ae771770SStanislav Sedov# 2. Redistributions in binary form must reproduce the above copyright 18*ae771770SStanislav Sedov# notice, this list of conditions and the following disclaimer in the 19*ae771770SStanislav Sedov# documentation and/or other materials provided with the distribution. 20*ae771770SStanislav Sedov# 21*ae771770SStanislav Sedov# 3. Neither the name of the Institute nor the names of its contributors 22*ae771770SStanislav Sedov# may be used to endorse or promote products derived from this software 23*ae771770SStanislav Sedov# without specific prior written permission. 24*ae771770SStanislav Sedov# 25*ae771770SStanislav Sedov# THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 26*ae771770SStanislav Sedov# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 27*ae771770SStanislav Sedov# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 28*ae771770SStanislav Sedov# ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 29*ae771770SStanislav Sedov# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 30*ae771770SStanislav Sedov# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 31*ae771770SStanislav Sedov# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 32*ae771770SStanislav Sedov# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 33*ae771770SStanislav Sedov# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 34*ae771770SStanislav Sedov# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 35*ae771770SStanislav Sedov# SUCH DAMAGE. 36*ae771770SStanislav Sedov 37*ae771770SStanislav Sedovimport re 38*ae771770SStanislav Sedovimport string 39*ae771770SStanislav Sedovimport sys 40*ae771770SStanislav Sedov 41*ae771770SStanislav Sedovimport generate 42*ae771770SStanislav Sedovimport UnicodeData 43*ae771770SStanislav Sedovimport util 44*ae771770SStanislav Sedov 45*ae771770SStanislav Sedovif len(sys.argv) != 4: 46*ae771770SStanislav Sedov print "usage: %s UnicodeData.txt" 47*ae771770SStanislav Sedov " CompositionExclusions-3.2.0.txt out-dir" % sys.argv[0] 48*ae771770SStanislav Sedov sys.exit(1) 49*ae771770SStanislav Sedov 50*ae771770SStanislav Sedovud = UnicodeData.read(sys.argv[1]) 51*ae771770SStanislav Sedov 52*ae771770SStanislav Sedovdef sortedKeys(d): 53*ae771770SStanislav Sedov """Return a sorted list of the keys of a dict""" 54*ae771770SStanislav Sedov keys = d.keys() 55*ae771770SStanislav Sedov keys.sort() 56*ae771770SStanislav Sedov return keys 57*ae771770SStanislav Sedov 58*ae771770SStanislav Sedovtrans = dict([(k, [re.sub('<[a-zA-Z]+>', '', v[4]), v[0]]) 59*ae771770SStanislav Sedov for k,v in ud.items() if v[4]]) 60*ae771770SStanislav Sedov 61*ae771770SStanislav SedovmaxLength = 0 62*ae771770SStanislav Sedovfor v in trans.values(): 63*ae771770SStanislav Sedov maxLength = max(maxLength, len(v[0].split())) 64*ae771770SStanislav Sedov 65*ae771770SStanislav Sedovnormalize_h = generate.Header('%s/normalize_table.h' % sys.argv[3]) 66*ae771770SStanislav Sedovnormalize_c = generate.Implementation('%s/normalize_table.c' % sys.argv[3]) 67*ae771770SStanislav Sedov 68*ae771770SStanislav Sedovnormalize_h.file.write( 69*ae771770SStanislav Sedov''' 70*ae771770SStanislav Sedov#include <krb5-types.h> 71*ae771770SStanislav Sedov 72*ae771770SStanislav Sedov#define MAX_LENGTH_CANON %u 73*ae771770SStanislav Sedov 74*ae771770SStanislav Sedovstruct translation { 75*ae771770SStanislav Sedov uint32_t key; 76*ae771770SStanislav Sedov unsigned short val_len; 77*ae771770SStanislav Sedov unsigned short val_offset; 78*ae771770SStanislav Sedov}; 79*ae771770SStanislav Sedov 80*ae771770SStanislav Sedovextern const struct translation _wind_normalize_table[]; 81*ae771770SStanislav Sedov 82*ae771770SStanislav Sedovextern const uint32_t _wind_normalize_val_table[]; 83*ae771770SStanislav Sedov 84*ae771770SStanislav Sedovextern const size_t _wind_normalize_table_size; 85*ae771770SStanislav Sedov 86*ae771770SStanislav Sedovstruct canon_node { 87*ae771770SStanislav Sedov uint32_t val; 88*ae771770SStanislav Sedov unsigned char next_start; 89*ae771770SStanislav Sedov unsigned char next_end; 90*ae771770SStanislav Sedov unsigned short next_offset; 91*ae771770SStanislav Sedov}; 92*ae771770SStanislav Sedov 93*ae771770SStanislav Sedovextern const struct canon_node _wind_canon_table[]; 94*ae771770SStanislav Sedov 95*ae771770SStanislav Sedovextern const unsigned short _wind_canon_next_table[]; 96*ae771770SStanislav Sedov''' % maxLength) 97*ae771770SStanislav Sedov 98*ae771770SStanislav Sedovnormalize_c.file.write( 99*ae771770SStanislav Sedov''' 100*ae771770SStanislav Sedov#include <stdlib.h> 101*ae771770SStanislav Sedov#include "normalize_table.h" 102*ae771770SStanislav Sedov 103*ae771770SStanislav Sedovconst struct translation _wind_normalize_table[] = { 104*ae771770SStanislav Sedov''') 105*ae771770SStanislav Sedov 106*ae771770SStanislav SedovnormalizeValTable = [] 107*ae771770SStanislav Sedov 108*ae771770SStanislav Sedovfor k in sortedKeys(trans) : 109*ae771770SStanislav Sedov v = trans[k] 110*ae771770SStanislav Sedov (key, value, description) = k, v[0], v[1] 111*ae771770SStanislav Sedov vec = [int(x, 0x10) for x in value.split()]; 112*ae771770SStanislav Sedov offset = util.subList(normalizeValTable, vec) 113*ae771770SStanislav Sedov if not offset: 114*ae771770SStanislav Sedov offset = len(normalizeValTable) 115*ae771770SStanislav Sedov normalizeValTable.extend(vec) # [("0x%s" % i) for i in vec]) 116*ae771770SStanislav Sedov normalize_c.file.write(" {0x%x, %u, %u}, /* %s */\n" 117*ae771770SStanislav Sedov % (key, len(vec), offset, description)) 118*ae771770SStanislav Sedov 119*ae771770SStanislav Sedovnormalize_c.file.write( 120*ae771770SStanislav Sedov'''}; 121*ae771770SStanislav Sedov 122*ae771770SStanislav Sedov''') 123*ae771770SStanislav Sedov 124*ae771770SStanislav Sedovnormalize_c.file.write( 125*ae771770SStanislav Sedov "const size_t _wind_normalize_table_size = %u;\n\n" % len(trans)) 126*ae771770SStanislav Sedov 127*ae771770SStanislav Sedovnormalize_c.file.write("const uint32_t _wind_normalize_val_table[] = {\n") 128*ae771770SStanislav Sedov 129*ae771770SStanislav Sedovfor v in normalizeValTable: 130*ae771770SStanislav Sedov normalize_c.file.write(" 0x%x,\n" % v) 131*ae771770SStanislav Sedov 132*ae771770SStanislav Sedovnormalize_c.file.write("};\n\n"); 133*ae771770SStanislav Sedov 134*ae771770SStanislav Sedovexclusions = UnicodeData.read(sys.argv[2]) 135*ae771770SStanislav Sedov 136*ae771770SStanislav Sedovinv = dict([(''.join(["%05x" % int(x, 0x10) for x in v[4].split(' ')]), 137*ae771770SStanislav Sedov [k, v[0]]) 138*ae771770SStanislav Sedov for k,v in ud.items() 139*ae771770SStanislav Sedov if v[4] and not re.search('<[a-zA-Z]+> *', v[4]) and not exclusions.has_key(k)]) 140*ae771770SStanislav Sedov 141*ae771770SStanislav Sedovtable = 0 142*ae771770SStanislav Sedov 143*ae771770SStanislav Sedovtables = {} 144*ae771770SStanislav Sedov 145*ae771770SStanislav Sedovdef createTable(): 146*ae771770SStanislav Sedov """add a new table""" 147*ae771770SStanislav Sedov global table, tables 148*ae771770SStanislav Sedov ret = table 149*ae771770SStanislav Sedov table += 1 150*ae771770SStanislav Sedov tables[ret] = [0] + [None] * 16 151*ae771770SStanislav Sedov return ret 152*ae771770SStanislav Sedov 153*ae771770SStanislav Sedovdef add(table, k, v): 154*ae771770SStanislav Sedov """add an entry (k, v) to table (recursively)""" 155*ae771770SStanislav Sedov if len(k) == 0: 156*ae771770SStanislav Sedov table[0] = v[0] 157*ae771770SStanislav Sedov else: 158*ae771770SStanislav Sedov i = int(k[0], 0x10) + 1 159*ae771770SStanislav Sedov if table[i] == None: 160*ae771770SStanislav Sedov table[i] = createTable() 161*ae771770SStanislav Sedov add(tables[table[i]], k[1:], v) 162*ae771770SStanislav Sedov 163*ae771770SStanislav Sedovtop = createTable() 164*ae771770SStanislav Sedov 165*ae771770SStanislav Sedovfor k,v in inv.items(): 166*ae771770SStanislav Sedov add(tables[top], k, v) 167*ae771770SStanislav Sedov 168*ae771770SStanislav Sedovnext_table = [] 169*ae771770SStanislav SedovtableToNext = {} 170*ae771770SStanislav SedovtableEnd = {} 171*ae771770SStanislav SedovtableStart = {} 172*ae771770SStanislav Sedov 173*ae771770SStanislav Sedovfor k in sortedKeys(tables) : 174*ae771770SStanislav Sedov t = tables[k] 175*ae771770SStanislav Sedov tableToNext[k] = len(next_table) 176*ae771770SStanislav Sedov l = t[1:] 177*ae771770SStanislav Sedov start = 0 178*ae771770SStanislav Sedov while start < 16 and l[start] == None: 179*ae771770SStanislav Sedov start += 1 180*ae771770SStanislav Sedov end = 16 181*ae771770SStanislav Sedov while end > start and l[end - 1] == None: 182*ae771770SStanislav Sedov end -= 1 183*ae771770SStanislav Sedov tableStart[k] = start 184*ae771770SStanislav Sedov tableEnd[k] = end 185*ae771770SStanislav Sedov n = [] 186*ae771770SStanislav Sedov for i in range(start, end): 187*ae771770SStanislav Sedov x = l[i] 188*ae771770SStanislav Sedov if x: 189*ae771770SStanislav Sedov n.append(x) 190*ae771770SStanislav Sedov else: 191*ae771770SStanislav Sedov n.append(0) 192*ae771770SStanislav Sedov next_table.extend(n) 193*ae771770SStanislav Sedov 194*ae771770SStanislav Sedovnormalize_c.file.write("const struct canon_node _wind_canon_table[] = {\n") 195*ae771770SStanislav Sedov 196*ae771770SStanislav Sedovfor k in sortedKeys(tables) : 197*ae771770SStanislav Sedov t = tables[k] 198*ae771770SStanislav Sedov normalize_c.file.write(" {0x%x, %u, %u, %u},\n" % 199*ae771770SStanislav Sedov (t[0], tableStart[k], tableEnd[k], tableToNext[k])) 200*ae771770SStanislav Sedov 201*ae771770SStanislav Sedovnormalize_c.file.write("};\n\n") 202*ae771770SStanislav Sedov 203*ae771770SStanislav Sedovnormalize_c.file.write("const unsigned short _wind_canon_next_table[] = {\n") 204*ae771770SStanislav Sedov 205*ae771770SStanislav Sedovfor k in next_table: 206*ae771770SStanislav Sedov normalize_c.file.write(" %u,\n" % k) 207*ae771770SStanislav Sedov 208*ae771770SStanislav Sedovnormalize_c.file.write("};\n\n") 209*ae771770SStanislav Sedov 210*ae771770SStanislav Sedovnormalize_h.close() 211*ae771770SStanislav Sedovnormalize_c.close() 212