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