Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/crypto/heimdal/lib/wind/gen-errorlist.py
34914 views
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
37
import re
38
import string
39
import sys
40
41
import generate
42
import rfc3454
43
import rfc4518
44
import stringprep
45
46
if len(sys.argv) != 3:
47
print "usage: %s rfc3454.txt out-dir" % sys.argv[0]
48
sys.exit(1)
49
50
tables = rfc3454.read(sys.argv[1])
51
t2 = rfc4518.read()
52
53
for x in t2.iterkeys():
54
tables[x] = t2[x]
55
56
error_list = stringprep.get_errorlist()
57
58
errorlist_h = generate.Header('%s/errorlist_table.h' % sys.argv[2])
59
60
errorlist_c = generate.Implementation('%s/errorlist_table.c' % sys.argv[2])
61
62
errorlist_h.file.write(
63
'''
64
#include "windlocl.h"
65
66
struct error_entry {
67
uint32_t start;
68
unsigned len;
69
wind_profile_flags flags;
70
};
71
72
extern const struct error_entry _wind_errorlist_table[];
73
74
extern const size_t _wind_errorlist_table_size;
75
76
''')
77
78
errorlist_c.file.write(
79
'''
80
#include <stdlib.h>
81
#include "errorlist_table.h"
82
83
const struct error_entry _wind_errorlist_table[] = {
84
''')
85
86
trans=[]
87
88
for 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
101
trans = stringprep.sort_merge_trans(trans)
102
103
for 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
112
errorlist_c.file.write(
113
'''};
114
115
''')
116
117
errorlist_c.file.write(
118
"const size_t _wind_errorlist_table_size = %u;\n" % len(trans))
119
120
errorlist_h.close()
121
errorlist_c.close()
122
123