diff options
author | Rob Austein <sra@hactrn.net> | 2012-09-19 21:28:34 +0000 |
---|---|---|
committer | Rob Austein <sra@hactrn.net> | 2012-09-19 21:28:34 +0000 |
commit | c5ae5ad3053be9b246dec019a5a1c0e3f310a477 (patch) | |
tree | 01053007537c4005b6936b8f357879ec91faf579 /buildtools/defstack.py | |
parent | e84b489d2676abe1e9f7ebc78a0f06a2141d1c58 (diff) |
Move ASN.1 definitions for ROAs and Manifests to common header files
used by all the C programs.
svn path=/branches/tk274/; revision=4725
Diffstat (limited to 'buildtools/defstack.py')
-rw-r--r-- | buildtools/defstack.py | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/buildtools/defstack.py b/buildtools/defstack.py new file mode 100644 index 00000000..4d93ce66 --- /dev/null +++ b/buildtools/defstack.py @@ -0,0 +1,88 @@ +# $Id$ +# +# Tool to write search C source code for "DECLARE_STACK_OF" macro +# calls and write corresponding type-safe "safestack" macros. +# +# You might want to look away now, this is nasty. Then again, OpenSSL +# does the same thing, but in Perl, and mixing automatically generated +# code with code maintained by humans, so "nasty" is a relative term. +# +# Copyright (C) 2011-2012 Internet Systems Consortium ("ISC") +# +# Permission to use, copy, modify, and distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH +# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +# AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, +# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. + +import fileinput +import sys +import re + +header = '''\ +/* + * Automatically generated, do not edit. + * Generator $Id$ + */ + +#ifndef __%__DEFSTACK_H__ +#define __%__DEFSTACK_H__ +''' + +footer = ''' +#endif /* __%__DEFSTACK_H__ */ +''' + +template = ''' +/* + * Safestack macros for %. + */ +#define sk_%_new(st) SKM_sk_new(%, (st)) +#define sk_%_new_null() SKM_sk_new_null(%) +#define sk_%_free(st) SKM_sk_free(%, (st)) +#define sk_%_num(st) SKM_sk_num(%, (st)) +#define sk_%_value(st, i) SKM_sk_value(%, (st), (i)) +#define sk_%_set(st, i, val) SKM_sk_set(%, (st), (i), (val)) +#define sk_%_zero(st) SKM_sk_zero(%, (st)) +#define sk_%_push(st, val) SKM_sk_push(%, (st), (val)) +#define sk_%_unshift(st, val) SKM_sk_unshift(%, (st), (val)) +#define sk_%_find(st, val) SKM_sk_find(%, (st), (val)) +#define sk_%_find_ex(st, val) SKM_sk_find_ex(%, (st), (val)) +#define sk_%_delete(st, i) SKM_sk_delete(%, (st), (i)) +#define sk_%_delete_ptr(st, ptr) SKM_sk_delete_ptr(%, (st), (ptr)) +#define sk_%_insert(st, val, i) SKM_sk_insert(%, (st), (val), (i)) +#define sk_%_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(%, (st), (cmp)) +#define sk_%_dup(st) SKM_sk_dup(%, st) +#define sk_%_pop_free(st, free_func) SKM_sk_pop_free(%, (st), (free_func)) +#define sk_%_shift(st) SKM_sk_shift(%, (st)) +#define sk_%_pop(st) SKM_sk_pop(%, (st)) +#define sk_%_sort(st) SKM_sk_sort(%, (st)) +#define sk_%_is_sorted(st) SKM_sk_is_sorted(%, (st)) +''' + +if len(sys.argv) < 2: + sys.exit("Usage: %s source.c [source.c ...]" % sys.argv[0]) + +splitter = re.compile("[() \t]+").split + +token = None + +for line in fileinput.input(): + + if token is None: + token = "".join(c if c.isalnum() else "_" for c in fileinput.filename().upper()) + sys.stdout.write(header.replace("%", token)) + + if "DECLARE_STACK_OF" in line: + words = splitter(line) + if len(words) > 1 and words[0] == "DECLARE_STACK_OF": + sys.stdout.write(template.replace("%", words[1])) + +if token is not None: + sys.stdout.write(footer.replace("%", token)) |