|
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 } |