Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/crypto/heimdal/lib/wind/gen-punycode-examples.py
34889 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
43
if len(sys.argv) != 3:
44
print "usage: %s rfc3492.txt" % sys.argv[0]
45
sys.exit(1)
46
47
f = open(sys.argv[1], 'r')
48
49
examples_h = generate.Header('%s/punycode_examples.h' % sys.argv[2])
50
examples_c = generate.Header('%s/punycode_examples.c' % sys.argv[2])
51
52
start = False
53
54
while True:
55
l = f.readline()
56
if not l:
57
break
58
if l[-2:] == "\\\n":
59
l2 = f.readline()
60
if not l2:
61
raise Exception("EOF in backslash escape")
62
l2 = re.sub('^ *', '', l2)
63
l = l[:-2] + l2
64
if start:
65
if re.match('7\.2', l):
66
start = False
67
else:
68
m = re.search('^ *\([A-Z]\) *(.*)$', l);
69
if m:
70
desc = m.group(1)
71
codes = []
72
else:
73
m = re.search('^ *([uU]+.*) *$', l)
74
if m:
75
codes.extend(string.split(m.group(1), ' '))
76
else:
77
m = re.search('^ *Punycode: (.*) *$', l)
78
if m:
79
cases.append([codes, m.group(1), desc])
80
else:
81
if re.match('^7\.1', l):
82
start = True
83
cases = []
84
85
f.close()
86
87
examples_h.file.write(
88
'''
89
#include <krb5-types.h>
90
91
#define MAX_LENGTH 40
92
93
struct punycode_example {
94
size_t len;
95
uint32_t val[MAX_LENGTH];
96
const char *pc;
97
const char *description;
98
};
99
100
extern const struct punycode_example punycode_examples[];
101
102
extern const size_t punycode_examples_size;
103
''')
104
105
examples_c.file.write(
106
'''
107
#include <stdlib.h>
108
#include "punycode_examples.h"
109
110
const struct punycode_example punycode_examples[] = {
111
''')
112
113
for x in cases:
114
[cp, pc, desc] = x
115
examples_c.file.write(
116
" {%u, {%s}, \"%s\", \"%s\"},\n" %
117
(len(cp),
118
string.join([re.sub('[uU]\+', '0x', x) for x in cp], ', '),
119
pc,
120
desc))
121
122
examples_c.file.write(
123
'''};
124
125
''')
126
127
examples_c.file.write(
128
"const size_t punycode_examples_size = %u;\n\n" % len(cases))
129
130
examples_h.close()
131
examples_c.close()
132
133