diff options
author | Ryan Bloom <rbb@apache.org> | 2001-07-21 06:34:54 +0000 |
---|---|---|
committer | Ryan Bloom <rbb@apache.org> | 2001-07-21 06:34:54 +0000 |
commit | fcaa0f5620de0f583a459fd19a14c0fde329a843 (patch) | |
tree | d9f36fd6b7ae0a8dbf7fad3af090cc7a66bbcbe4 /build/make_exports.awk | |
parent | 6053f562d3e29afdb765dacfedb155e201ff1636 (diff) | |
download | httpd-fcaa0f5620de0f583a459fd19a14c0fde329a843.tar.gz |
Improve the exports generating awk script. In the past, we had
work around problems in the awk script by avoiding some #if and
#ifdefs. This has bitten us many times in generating the exports.c
file. This improvement allows corrects the header file parsing.
Submitted by: Sander Striker <striker@apache.org>
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@89647 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'build/make_exports.awk')
-rw-r--r-- | build/make_exports.awk | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/build/make_exports.awk b/build/make_exports.awk new file mode 100644 index 0000000000..27fd631eb9 --- /dev/null +++ b/build/make_exports.awk @@ -0,0 +1,120 @@ + +BEGIN { + printf("/*\n") + printf(" * THIS FILE WAS AUTOGENERATED BY make_exports.awk\n") + printf(" *\n") + printf(" * This is an ugly hack that needs to be here, so\n") + printf(" * that libtool will link all of the APR functions\n") + printf(" * into server regardless of whether the base server\n") + printf(" * uses them.\n") + printf(" */\n") + printf("\n") + printf("#define CORE_PRIVATE\n") + printf("\n") + + for (i = 1; i < ARGC; i++) { + file = ARGV[i] + sub("([^/]*[/])*", "", file) + printf("#include \"%s\"\n", file) + } + + printf("\n") + printf("const void *ap_ugly_hack = NULL;\n") + printf("\n") + + TYPE_NORMAL = 0 + TYPE_HEADER = 1 + + stackptr = 0 +} + +function push(line) { + stack[stackptr] = line + stackptr++ +} + +function do_output() { + printf("/*\n") + printf(" * %s\n", FILENAME) + printf(" */\n") + + for (i = 0; i < stackptr; i++) { + printf("%s\n", stack[i]) + } + + stackptr = 0 + + printf("\n"); +} + +function enter_scope(type) { + scope++ + scope_type[scope] = type + scope_stack[scope] = stackptr + delete scope_used[scope] +} + +function leave_scope() { + used = scope_used[scope] + + if (!used) + stackptr = scope_stack[scope] + + scope-- + if (used) { + scope_used[scope] = 1 + + if (!scope) + do_output() + } +} + +function add_symbol(symbol) { + idx = index(symbol, "#") + + if (!idx) { + push("const void *ap_hack_" symbol " = (const void *)" symbol ";") + scope_used[scope] = 1 + } +} + +/^[ \t]*AP[RU]?_DECLARE[^(]*[(][^)]*[)]([^ ]* )*[^(]+[(]/ { + sub("[ \t]*AP[RU]?_DECLARE[^(]*[(][^)]*[)]", ""); + sub("[(].*", ""); + sub("^[ \t]+", ""); + sub("([^ ]* ^([ \t]*[(]))*", ""); + + add_symbol($0) + next +} + +/^#[ \t]*if(ndef| !defined[(])([^_]*_)*H/ { + enter_scope(TYPE_HEADER) + next +} + +/^#[ \t]*if([n]?def)? / { + enter_scope(TYPE_NORMAL) + push($0) + next +} + +/^#[ \t]*endif/ { + if (scope_type[scope] == TYPE_NORMAL) + push($0) + + leave_scope() + next +} + +/^#[ \t]*else/ { + push($0) + next +} + +/^#[ \t]*elif/ { + push($0) + next +} + + |