genren.pl revision b13da9df870a61b11249bf741347908dbea0edd8
1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#!/usr/bin/perl
2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#*
3b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#*******************************************************************************
4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#*   Copyright (C) 2001-2007, International Business Machines
5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#*   Corporation and others.  All Rights Reserved.
6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#*******************************************************************************
7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#*
8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#*   file name:  genren.pl
9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#*   encoding:   US-ASCII
10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#*   tab size:   8 (not used)
11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#*   indentation:4
12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#*
13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#*   Created by: Vladimir Weinstein
14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#*   07/19/2001
15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#*
16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#*  Used to generate renaming headers.
17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#*  Run on UNIX platforms (linux) in order to catch all the exports
18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru$headername = 'urename.h';
20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru$path = substr($0, 0, rindex($0, "/")+1)."../../common/unicode/uversion.h";
22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru(-e $path) || die "Cannot find uversion.h";
24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruopen(UVERSION, $path);
26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruwhile(<UVERSION>) {
28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(/\#define U_ICU_VERSION_SUFFIX/) {
29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        chop;
30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        s/\#define U_ICU_VERSION_SUFFIX //;
31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        $U_ICU_VERSION_SUFFIX = "$_";
32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        last;
33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruwhile($ARGV[0] =~ /^-/) { # detects whether there are any arguments
37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    $_ = shift @ARGV;      # extracts the argument for processing
38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /^-v/ && ($VERBOSE++, next);                      # verbose
39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /^-h/ && (&printHelpMsgAndExit, next);               # help
40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /^-o/ && (($headername = shift (@ARGV)), next);   # output file
41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /^-S/ && (($U_ICU_VERSION_SUFFIX = shift(@ARGV)), next); # pick the suffix
42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    warn("Invalid option $_\n");
43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    &printHelpMsgAndExit;
44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruunless(@ARGV > 0) {
47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    warn "No libraries, exiting...\n";
48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    &printHelpMsgAndExit;
49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#$headername = "uren".substr($ARGV[0], 6, index(".", $ARGV[0])-7).".h";
52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru$HEADERDEF = uc($headername);  # this is building the constant for #define
54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru$HEADERDEF =~ s/\./_/;
55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    open HEADER, ">$headername"; # opening a header file
58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#We will print our copyright here + warnings
60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruprint HEADER <<"EndOfHeaderComment";
61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*******************************************************************************
63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   Copyright (C) 2002-2007, International Business Machines
64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   Corporation and others.  All Rights Reserved.
65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*******************************************************************************
66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   file name:  $headername
68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   encoding:   US-ASCII
69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   tab size:   8 (not used)
70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   indentation:4
71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   Created by: Perl script written by Vladimir Weinstein
73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*  Contains data for renaming ICU exports.
75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*  Gets included by umachine.h
76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*  THIS FILE IS MACHINE-GENERATED, DON'T PLAY WITH IT IF YOU DON'T KNOW WHAT
78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*  YOU ARE DOING, OTHERWISE VERY BAD THINGS WILL HAPPEN!
79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifndef $HEADERDEF
82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define $HEADERDEF
83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* Uncomment the following line to disable renaming on platforms
85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru   that do not use Autoconf. */
86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* #define U_DISABLE_RENAMING 1 */
87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !U_DISABLE_RENAMING
89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruEndOfHeaderComment
90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querufor(;@ARGV; shift(@ARGV)) {
92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    @NMRESULT = `nm -Cg -f s $ARGV[0]`;
93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if($?) {
94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        warn "Couldn't do 'nm' for $ARGV[0], continuing...\n";
95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        next; # Couldn't do nm for the file
96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    splice @NMRESULT, 0, 6;
98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    foreach (@NMRESULT) { # Process every line of result and stuff it in $_
100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ($_, $address, $type) = split(/\|/);
101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        &verbose( "type: \"$type\" ");
102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(!($type =~ /[UAwW?]/)) {
103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(/@@/) { # These would be imports
104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                &verbose( "Import: $_ \"$type\"\n");
105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } elsif (/::/) { # C++ methods, stuff class name in associative array
106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                &verbose( "C++ method: $_\n");
107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                ## icu_2_0::CharString::~CharString(void) -> CharString
108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                @CppName = split(/::/); ## remove scope stuff
109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if(@CppName>1) {
110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    ## MessageFormat virtual table -> MessageFormat
111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    @CppName = split(/ /, $CppName[1]); ## remove debug stuff
112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                ## ures_getUnicodeStringByIndex(UResourceBundle -> ures_getUnicodeStringByIndex
114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                @CppName = split(/\(/, $CppName[0]); ## remove function args
115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                $CppClasses{$CppName[0]}++;
116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } elsif ( /\(/) { # These are strange functions
117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                print STDERR "$_\n";
118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } elsif ( /icu_/) {
119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                print STDERR "Skipped strange mangled function $_\n";
120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else { # This is regular C function
121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                &verbose( "C func: $_\n");
122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                @funcname = split(/[\(\s+]/);
123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                $CFuncs{$funcname[0]}++;
124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            &verbose( "Skipped: $_ $1\n");
127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruprint HEADER "\n/* C exports renaming data */\n\n";
132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruforeach(sort keys(%CFuncs)) {
133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    print HEADER "#define $_ $_$U_ICU_VERSION_SUFFIX\n";
134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruprint HEADER "/* C++ class names renaming defines */\n\n";
137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruprint HEADER "#ifdef XP_CPLUSPLUS\n";
138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruprint HEADER "#if !U_HAVE_NAMESPACE\n\n";
139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruforeach(sort keys(%CppClasses)) {
140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    print HEADER "#define $_ $_$U_ICU_VERSION_SUFFIX\n";
141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruprint HEADER "\n#endif\n";
143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruprint HEADER "#endif\n";
144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruprint HEADER "\n#endif\n";
145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruprint HEADER "\n#endif\n";
146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclose HEADER;
148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querusub verbose {
150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if($VERBOSE) {
151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        print STDERR @_;
152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querusub printHelpMsgAndExit {
157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    print STDERR <<"EndHelpText";
158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUsage: $0 [OPTIONS] LIBRARY_FILES
159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  Options:
160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    -v - verbose
161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    -h - help
162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    -o - output file name (defaults to 'urename.h'
163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    -S - suffix (defaults to _MAJOR_MINOR of current ICU version)
164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruWill produce a renaming .h file
165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruEndHelpText
167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    exit 0;
169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
172