Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / third_party / icu / source / tools / genren / genren.pl
1 #!/usr/bin/perl 
2 #*
3 #*******************************************************************************
4 #*   Copyright (C) 2001-2012, International Business Machines
5 #*   Corporation and others.  All Rights Reserved.
6 #*******************************************************************************
7 #*
8 #*   file name:  genren.pl
9 #*   encoding:   US-ASCII
10 #*   tab size:   8 (not used)
11 #*   indentation:4
12 #*
13 #*   Created by: Vladimir Weinstein
14 #*   07/19/2001
15 #*
16 #*  Used to generate renaming headers.
17 #*  Run on UNIX platforms (linux) in order to catch all the exports
18
19 use POSIX qw(strftime);
20
21 $headername = 'urename.h';
22
23 $path = substr($0, 0, rindex($0, "/")+1)."../../common/unicode/uversion.h";
24
25 $nmopts = '-Cg -f s';
26 $post = '';
27
28 $mode = 'POSIX';
29
30 (-e $path) || die "Cannot find uversion.h";
31
32 open(UVERSION, $path);
33
34 while(<UVERSION>) {
35     if(/\#define U_ICU_VERSION_SUFFIX/) {
36         chop;
37         s/\#define U_ICU_VERSION_SUFFIX //;
38         $U_ICU_VERSION_SUFFIX = "$_";
39         last;
40     }
41 }
42
43 while($ARGV[0] =~ /^-/) { # detects whether there are any arguments
44     $_ = shift @ARGV;      # extracts the argument for processing
45     /^-v/ && ($VERBOSE++, next);                      # verbose
46     /^-h/ && (&printHelpMsgAndExit, next);               # help
47     /^-o/ && (($headername = shift (@ARGV)), next);   # output file
48     /^-n/ && (($nmopts = shift (@ARGV)), next);   # nm opts
49     /^-p/ && (($post = shift (@ARGV)), next);   # nm opts
50     /^-x/ && (($mode = shift (@ARGV)), next);   # nm opts
51     /^-S/ && (($U_ICU_VERSION_SUFFIX = shift(@ARGV)), next); # pick the suffix
52     warn("Invalid option $_\n");
53     &printHelpMsgAndExit;
54 }
55
56 unless(@ARGV > 0) {
57     warn "No libraries, exiting...\n";
58     &printHelpMsgAndExit;
59 }
60
61 #$headername = "uren".substr($ARGV[0], 6, index(".", $ARGV[0])-7).".h";
62     
63 $HEADERDEF = uc($headername);  # this is building the constant for #define
64 $HEADERDEF =~ s/\./_/;
65
66     
67     open HEADER, ">$headername"; # opening a header file
68
69 #We will print our copyright here + warnings
70
71 $YEAR = strftime "%Y",localtime;
72
73 print HEADER <<"EndOfHeaderComment";
74 /*
75 *******************************************************************************
76 *   Copyright (C) 2002-$YEAR, International Business Machines
77 *   Corporation and others.  All Rights Reserved.
78 *******************************************************************************
79 *
80 *   file name:  $headername
81 *   encoding:   US-ASCII
82 *   tab size:   8 (not used)
83 *   indentation:4
84 *
85 *   Created by: Perl script tools/genren.pl written by Vladimir Weinstein
86 *
87 *  Contains data for renaming ICU exports.
88 *  Gets included by umachine.h
89 *
90 *  THIS FILE IS MACHINE-GENERATED, DON'T PLAY WITH IT IF YOU DON'T KNOW WHAT
91 *  YOU ARE DOING, OTHERWISE VERY BAD THINGS WILL HAPPEN!
92 */
93
94 #ifndef $HEADERDEF
95 #define $HEADERDEF
96
97 /* U_DISABLE_RENAMING can be defined in the following ways:
98  *   - when running configure, e.g.
99  *        runConfigureICU Linux --disable-renaming
100  *   - by changing the default setting of U_DISABLE_RENAMING in uconfig.h
101  */
102
103 #include "unicode/uconfig.h"
104
105 #if !U_DISABLE_RENAMING
106
107 /* We need the U_ICU_ENTRY_POINT_RENAME definition. There's a default one in unicode/uvernum.h we can use, but we will give
108    the platform a chance to define it first.
109    Normally (if utypes.h or umachine.h was included first) this will not be necessary as it will already be defined.
110  */
111
112 #ifndef U_ICU_ENTRY_POINT_RENAME
113 #include "unicode/umachine.h"
114 #endif
115
116 /* If we still don't have U_ICU_ENTRY_POINT_RENAME use the default. */
117 #ifndef U_ICU_ENTRY_POINT_RENAME
118 #include "unicode/uvernum.h"
119 #endif
120
121 /* Error out before the following defines cause very strange and unexpected code breakage */
122 #ifndef U_ICU_ENTRY_POINT_RENAME
123 #error U_ICU_ENTRY_POINT_RENAME is not defined - cannot continue. Consider defining U_DISABLE_RENAMING if renaming should not be used.
124 #endif
125
126 EndOfHeaderComment
127
128 $fileCount = 0;
129 $itemCount = 0;
130 $symbolCount = 0;
131
132 for(;@ARGV; shift(@ARGV)) {
133     $fileCount++;
134     @NMRESULT = `nm $nmopts $ARGV[0] $post`;
135     if($?) {
136         warn "Couldn't do 'nm' for $ARGV[0], continuing...\n";
137         next; # Couldn't do nm for the file
138     }
139     if($mode =~ /POSIX/) {
140         splice @NMRESULT, 0, 6;
141     } elsif ($mode =~ /Mach-O/) {
142 #        splice @NMRESULT, 0, 10;
143     }
144     foreach (@NMRESULT) { # Process every line of result and stuff it in $_
145         $itemCount++;
146         if($mode =~ /POSIX/) {
147             &verbose("  $_");
148             ($_, $address, $type) = split(/\|/);
149             chop $qtype;
150         } elsif ($mode =~ /Mach-O/) {
151             ($address, $type, $_) = split(/ /);
152             if(/^_(.*)$/) {
153                 $_ = $1;
154             } else {
155                 next;
156             }
157         } else {
158             die "Unknown mode $mode";
159         }
160         &verbose( "type: \"$type\" ");
161         if(!($type =~ /[UAwW?]/)) {
162             if(/@@/) { # These would be imports
163                 &verbose( "Import: $_ \"$type\"\n");
164                 &verbose( "C++ method: $_\n");
165             } elsif (/^[^\(]*::/) { # C++ methods, stuff class name in associative array
166                 ##  DON'T match    ...  (   foo::bar ...   want :: to be to the left of paren
167                 ## icu::CharString::~CharString(void) -> CharString
168                 @CppName = split(/::/); ## remove scope stuff
169                 
170                 if(@CppName>1) {
171                     ## MessageFormat virtual table -> MessageFormat
172                     if(! ($CppName[0] =~ /icu/ )) {
173                         # *** WARNING Bad namespace (not 'icu') on ShoeSize::ShoeSize()
174                         warn "*** WARNING Bad namespace (not 'icu') on $_\n";
175                         next;
176                     }
177                     &verbose ( "(Chopping scope $CppName[0] )");
178                     @CppName = split(/ /, $CppName[1]); ## remove debug stuff
179                 }
180                 ## ures_getUnicodeStringByIndex(UResourceBundle -> ures_getUnicodeStringByIndex
181                 @CppName = split(/\(/, $CppName[0]); ## remove function args
182                 if($CppName[0] =~ /^operator/) {
183                     &verbose ("Skipping C++ function: $_\n");
184                 } elsif($CppName[0] =~ /^~/) {
185                     &verbose ("Skipping C++ destructor: $_\n");
186                 } else {
187                     &verbose( "Skipping C++ class: '$CppName[0]': $_ \n");
188                     # $CppClasses{$CppName[0]}++;
189                     # $symbolCount++;
190                 }
191             } elsif ( my ($cfn) = m/^([A-Za-z0-9_]*)\(.*/ ) {
192                 &verbose ( "$ARGV[0]:  got global C++ function  $cfn with '$_'\n" );
193                 $CFuncs{$cfn}++;
194                 $symbolCount++;
195             } elsif ( /\(/) { # These are strange functions
196                 print STDERR "$ARGV[0]: Not sure what to do with '$_'\n";
197             } elsif ( /^_init/ ) {
198                 &verbose( "$ARGV[0]: Skipped initializer $_\n" );
199             } elsif ( /^_fini/ ) {
200                 &verbose( "$ARGV[0]: Skipped finilizer $_\n" );
201             } elsif ( /icu_/) {
202                 print STDERR "$ARGV[0]: Skipped strange mangled function $_\n";
203             } elsif ( /^vtable for /) {
204                 print STDERR "$ARGV[0]: Skipped vtable $_\n";
205             } elsif ( /^typeinfo/) {
206                 print STDERR "$ARGV[0]: Skipped typeinfo $_\n";
207             } elsif ( /operator\+/ ) {
208                 print STDERR "$ARGV[0]: Skipped ignored function $_\n";
209             } else { # This is regular C function 
210                 &verbose( "C func: $_\n");
211                 @funcname = split(/[\(\s+]/);
212                 $CFuncs{$funcname[0]}++;
213                 $symbolCount++;
214             }
215         } else {
216             &verbose( "Skipped: $_ $1\n");
217         }
218     }
219 }
220
221 if( $fileCount == 0 ) {
222   die "Error: $itemCount lines from $fileCount files processed, but $symbolCount symbols were found.\n";
223 }
224
225 if( $symbolCount == 0 ) {
226   die "Error: $itemCount lines from $fileCount files processed, but $symbolCount symbols were found.\n";
227 }
228
229 print " Loaded $symbolCount symbols from $itemCount lines in $fileCount files.\n";
230
231 print HEADER "\n/* C exports renaming data */\n\n";
232 foreach(sort keys(%CFuncs)) {
233     print HEADER "#define $_ U_ICU_ENTRY_POINT_RENAME($_)\n";
234 #    print HEADER "#define $_ $_$U_ICU_VERSION_SUFFIX\n";
235 }
236
237 print HEADER "\n#endif\n";
238 print HEADER "\n#endif\n";
239
240 close HEADER;
241
242 sub verbose {
243     if($VERBOSE) {
244         print STDERR @_;
245     }
246 }
247
248
249 sub printHelpMsgAndExit {
250     print STDERR <<"EndHelpText";
251 Usage: $0 [OPTIONS] LIBRARY_FILES
252   Options: 
253     -v - verbose
254     -h - help
255     -o - output file name (defaults to 'urename.h'
256     -S - suffix (defaults to _MAJOR_MINOR of current ICU version)
257 Will produce a renaming .h file
258
259 EndHelpText
260
261     exit 0;
262
263 }