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 45 46if len(sys.argv) != 3: 47 print "usage: %s rfc3454.txt out-dir" % sys.argv[0] 48 sys.exit(1) 49 50tables = rfc3454.read(sys.argv[1]) 51t2 = rfc4518.read() 52 53for x in t2.iterkeys(): 54 tables[x] = t2[x] 55 56error_list = stringprep.get_errorlist() 57 58errorlist_h = generate.Header('%s/errorlist_table.h' % sys.argv[2]) 59 60errorlist_c = generate.Implementation('%s/errorlist_table.c' % sys.argv[2]) 61 62errorlist_h.file.write( 63''' 64#include "windlocl.h" 65 66struct error_entry { 67 uint32_t start; 68 unsigned len; 69 wind_profile_flags flags; 70}; 71 72extern const struct error_entry _wind_errorlist_table[]; 73 74extern const size_t _wind_errorlist_table_size; 75 76''') 77 78errorlist_c.file.write( 79''' 80#include <stdlib.h> 81#include "errorlist_table.h" 82 83const struct error_entry _wind_errorlist_table[] = { 84''') 85 86trans=[] 87 88for t in error_list.iterkeys(): 89 for l in tables[t]: 90 m = re.search('^ *([0-9A-F]+)-([0-9A-F]+); *(.*) *$', l) 91 if m: 92 start = int(m.group(1), 0x10) 93 end = int(m.group(2), 0x10) 94 desc = m.group(3) 95 trans.append([start, end - start + 1, desc, [t]]) 96 else: 97 m = re.search('^ *([0-9A-F]+); *(.*) *$', l) 98 if m: 99 trans.append([int(m.group(1), 0x10), 1, m.group(2), [t]]) 100 101trans = stringprep.sort_merge_trans(trans) 102 103for x in trans: 104 (start, length, description, tables) = x 105 symbols = stringprep.symbols(error_list, tables) 106 if len(symbols) == 0: 107 print "no symbol for %s" % description 108 sys.exit(1) 109 errorlist_c.file.write(" {0x%x, 0x%x, %s}, /* %s: %s */\n" 110 % (start, length, symbols, ",".join(tables), description)) 111 112errorlist_c.file.write( 113'''}; 114 115''') 116 117errorlist_c.file.write( 118 "const size_t _wind_errorlist_table_size = %u;\n" % len(trans)) 119 120errorlist_h.close() 121errorlist_c.close() 122