1#!/usr/local/bin/python 2# -*- coding: iso-8859-1 -*- 3 4# $Id$ 5 6# Copyright (c) 2004 Kungliga Tekniska Högskolan 7# (Royal Institute of Technology, Stockholm, Sweden). 8# All rights reserved. 9# 10# Redistribution and use in source and binary forms, with or without 11# modification, are permitted provided that the following conditions 12# are met: 13# 14# 1. Redistributions of source code must retain the above copyright 15# notice, this list of conditions and the following disclaimer. 16# 17# 2. Redistributions in binary form must reproduce the above copyright 18# notice, this list of conditions and the following disclaimer in the 19# documentation and/or other materials provided with the distribution. 20# 21# 3. Neither the name of the Institute nor the names of its contributors 22# may be used to endorse or promote products derived from this software 23# without specific prior written permission. 24# 25# THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 26# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 27# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 28# ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 29# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 30# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 31# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 32# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 33# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 34# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 35# SUCH DAMAGE. 36 37import re 38import string 39import sys 40 41import generate 42import rfc3454 43import rfc4518 44import stringprep 45import util 46 47if len(sys.argv) != 3: 48 print "usage: %s rfc3454.txt out-dir" % sys.argv[0] 49 sys.exit(1) 50 51tables = rfc3454.read(sys.argv[1]) 52t2 = rfc4518.read() 53 54for x in t2.iterkeys(): 55 tables[x] = t2[x] 56 57map_list = stringprep.get_maplist() 58 59map_h = generate.Header('%s/map_table.h' % sys.argv[2]) 60 61map_c = generate.Implementation('%s/map_table.c' % sys.argv[2]) 62 63map_h.file.write( 64''' 65#include "windlocl.h" 66 67struct translation { 68 uint32_t key; 69 unsigned short val_len; 70 unsigned short val_offset; 71 wind_profile_flags flags; 72}; 73 74extern const struct translation _wind_map_table[]; 75 76extern const size_t _wind_map_table_size; 77 78extern const uint32_t _wind_map_table_val[]; 79 80''') 81 82map_c.file.write( 83''' 84#include "map_table.h" 85 86const struct translation _wind_map_table[] = { 87''') 88 89trans=[] 90 91for t in map_list.iterkeys(): 92 for l in tables[t]: 93 m = re.search('^ *([0-9A-F]+)-([0-9A-F]+); *([^;]+); *(.*) *$', l) 94 if m: 95 start = int(m.group(1), 0x10) 96 end = int(m.group(2), 0x10) 97 value = m.group(3) 98 desc = m.group(4) 99 for key in xrange(start,end,1): 100 trans.append((key, value, desc, [t])) 101 continue 102 m = re.search('^ *([^;]+); *([^;]+); *(.*) *$', l) 103 if m: 104 key = int(m.group(1), 0x10) 105 value = m.group(2) 106 desc = m.group(3) 107 trans.append((key, value, desc, [t])) 108 continue 109 110valTable = [] 111offsetTable = {} 112 113trans = stringprep.sort_merge_trans(trans) 114 115for x in trans: 116 if x[0] == 0xad: 117 print "fooresult %s" % ",".join(x[3]) 118 119for x in trans: 120 (key, value, description, table) = x 121 v = value.split() 122 i = util.subList(valTable, v) 123 if i: 124 offsetTable[key] = i 125 else: 126 offsetTable[key] = len(valTable) 127 valTable.extend(v) 128 129for x in trans: 130 (key, value, description, tables) = x 131 symbols = stringprep.symbols(map_list, tables) 132 if len(symbols) == 0: 133 print "no symbol for %s %s (%s)" % (key, description, tables) 134 sys.exit(1) 135 v = value.split() 136 map_c.file.write(" {0x%x, %u, %u, %s}, /* %s: %s */\n" 137 % (key, len(v), offsetTable[key], symbols, ",".join(tables), description)) 138 139map_c.file.write( 140''' 141}; 142 143''') 144 145map_c.file.write( 146 "const size_t _wind_map_table_size = %u;\n\n" % len(trans)) 147 148map_c.file.write( 149 "const uint32_t _wind_map_table_val[] = {\n") 150 151for x in valTable: 152 map_c.file.write(" 0x%s,\n" % x) 153 154map_c.file.write( 155 "};\n\n") 156 157map_h.close() 158map_c.close() 159