]>
Commit | Line | Data |
---|---|---|
1 | #!/usr/bin/perl | |
2 | #* | |
3 | #******************************************************************************* | |
4 | #* Copyright (C) 2001-2010, 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 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 | /* Uncomment the following line to disable renaming on platforms | |
98 | that do not use Autoconf. */ | |
99 | /* #define U_DISABLE_RENAMING 1 */ | |
100 | ||
101 | #if !U_DISABLE_RENAMING | |
102 | ||
103 | /* 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 | |
104 | the platform a chance to define it first. | |
105 | Normally (if utypes.h or umachine.h was included first) this will not be necessary as it will already be defined. | |
106 | */ | |
107 | #ifndef U_ICU_ENTRY_POINT_RENAME | |
108 | #include "unicode/umachine.h" | |
109 | #endif | |
110 | ||
111 | /* If we still don't have U_ICU_ENTRY_POINT_RENAME use the default. */ | |
112 | #ifndef U_ICU_ENTRY_POINT_RENAME | |
113 | #include "unicode/uvernum.h" | |
114 | #endif | |
115 | ||
116 | /* Error out before the following defines cause very strange and unexpected code breakage */ | |
117 | #ifndef U_ICU_ENTRY_POINT_RENAME | |
118 | #error U_ICU_ENTRY_POINT_RENAME is not defined - cannot continue. Consider defining U_DISABLE_RENAMING if renaming should not be used. | |
119 | #endif | |
120 | ||
121 | EndOfHeaderComment | |
122 | ||
123 | $fileCount = 0; | |
124 | $itemCount = 0; | |
125 | $symbolCount = 0; | |
126 | ||
127 | for(;@ARGV; shift(@ARGV)) { | |
128 | $fileCount++; | |
129 | @NMRESULT = `nm $nmopts $ARGV[0] $post`; | |
130 | if($?) { | |
131 | warn "Couldn't do 'nm' for $ARGV[0], continuing...\n"; | |
132 | next; # Couldn't do nm for the file | |
133 | } | |
134 | if($mode =~ /POSIX/) { | |
135 | splice @NMRESULT, 0, 6; | |
136 | } elsif ($mode =~ /Mach-O/) { | |
137 | # splice @NMRESULT, 0, 10; | |
138 | } | |
139 | foreach (@NMRESULT) { # Process every line of result and stuff it in $_ | |
140 | $itemCount++; | |
141 | if($mode =~ /POSIX/) { | |
142 | ($_, $address, $type) = split(/\|/); | |
143 | } elsif ($mode =~ /Mach-O/) { | |
144 | if(/^(?:[0-9a-fA-F]){8} ([A-Z]) (?:_)?(.*)$/) { | |
145 | ($_, $type) = ($2, $1); | |
146 | } else { | |
147 | next; | |
148 | } | |
149 | } else { | |
150 | die "Unknown mode $mode"; | |
151 | } | |
152 | &verbose( "type: \"$type\" "); | |
153 | if(!($type =~ /[UAwW?]/)) { | |
154 | if(/@@/) { # These would be imports | |
155 | &verbose( "Import: $_ \"$type\"\n"); | |
156 | &verbose( "C++ method: $_\n"); | |
157 | } elsif (/^[^\(]*::/) { # C++ methods, stuff class name in associative array | |
158 | ## DON'T match ... ( foo::bar ... want :: to be to the left of paren | |
159 | ## icu_2_0::CharString::~CharString(void) -> CharString | |
160 | @CppName = split(/::/); ## remove scope stuff | |
161 | if(@CppName>1) { | |
162 | ## MessageFormat virtual table -> MessageFormat | |
163 | @CppName = split(/ /, $CppName[1]); ## remove debug stuff | |
164 | } | |
165 | ## ures_getUnicodeStringByIndex(UResourceBundle -> ures_getUnicodeStringByIndex | |
166 | @CppName = split(/\(/, $CppName[0]); ## remove function args | |
167 | if($CppName[0] =~ /^operator/) { | |
168 | &verbose ("Skipping C++ function: $_\n"); | |
169 | } elsif($CppName[0] =~ /^~/) { | |
170 | &verbose ("Skipping C++ destructor: $_\n"); | |
171 | } else { | |
172 | &verbose( " Class: '$CppName[0]': $_ \n"); | |
173 | $CppClasses{$CppName[0]}++; | |
174 | $symbolCount++; | |
175 | } | |
176 | } elsif ( my ($cfn) = m/^([A-Za-z0-9_]*)\(.*/ ) { | |
177 | &verbose ( "$ARGV[0]: got global C++ function $cfn with '$_'\n" ); | |
178 | $CFuncs{$cfn}++; | |
179 | $symbolCount++; | |
180 | } elsif ( /\(/) { # These are strange functions | |
181 | print STDERR "$ARGV[0]: Not sure what to do with '$_'\n"; | |
182 | } elsif ( /^_init/ ) { | |
183 | &verbose( "$ARGV[0]: Skipped initializer $_\n" ); | |
184 | } elsif ( /^_fini/ ) { | |
185 | &verbose( "$ARGV[0]: Skipped finilizer $_\n" ); | |
186 | } elsif ( /icu_/) { | |
187 | print STDERR "$ARGV[0]: Skipped strange mangled function $_\n"; | |
188 | } elsif ( /^vtable for /) { | |
189 | print STDERR "$ARGV[0]: Skipped vtable $_\n"; | |
190 | } elsif ( /^typeinfo for /) { | |
191 | print STDERR "$ARGV[0]: Skipped typeinfo $_\n"; | |
192 | } elsif ( /operator\+/ ) { | |
193 | print STDERR "$ARGV[0]: Skipped ignored function $_\n"; | |
194 | } else { # This is regular C function | |
195 | &verbose( "C func: $_\n"); | |
196 | @funcname = split(/[\(\s+]/); | |
197 | $CFuncs{$funcname[0]}++; | |
198 | $symbolCount++; | |
199 | } | |
200 | } else { | |
201 | &verbose( "Skipped: $_ $1\n"); | |
202 | } | |
203 | } | |
204 | } | |
205 | ||
206 | if( $fileCount == 0 ) { | |
207 | die "Error: $itemCount lines from $fileCount files processed, but $symbolCount symbols were found.\n"; | |
208 | } | |
209 | ||
210 | if( $symbolCount == 0 ) { | |
211 | die "Error: $itemCount lines from $fileCount files processed, but $symbolCount symbols were found.\n"; | |
212 | } | |
213 | ||
214 | print " Loaded $symbolCount symbols from $itemCount lines in $fileCount files.\n"; | |
215 | ||
216 | print HEADER "\n/* C exports renaming data */\n\n"; | |
217 | foreach(sort keys(%CFuncs)) { | |
218 | print HEADER "#define $_ U_ICU_ENTRY_POINT_RENAME($_)\n"; | |
219 | # print HEADER "#define $_ $_$U_ICU_VERSION_SUFFIX\n"; | |
220 | } | |
221 | ||
222 | print HEADER "\n\n"; | |
223 | print HEADER "/* C++ class names renaming defines */\n\n"; | |
224 | print HEADER "#ifdef XP_CPLUSPLUS\n"; | |
225 | print HEADER "#if !U_HAVE_NAMESPACE\n\n"; | |
226 | foreach(sort keys(%CppClasses)) { | |
227 | print HEADER "#define $_ U_ICU_ENTRY_POINT_RENAME($_)\n"; | |
228 | } | |
229 | print HEADER "\n#endif\n"; | |
230 | print HEADER "#endif\n"; | |
231 | print HEADER "\n#endif\n"; | |
232 | print HEADER "\n#endif\n"; | |
233 | ||
234 | close HEADER; | |
235 | ||
236 | sub verbose { | |
237 | if($VERBOSE) { | |
238 | print STDERR @_; | |
239 | } | |
240 | } | |
241 | ||
242 | ||
243 | sub printHelpMsgAndExit { | |
244 | print STDERR <<"EndHelpText"; | |
245 | Usage: $0 [OPTIONS] LIBRARY_FILES | |
246 | Options: | |
247 | -v - verbose | |
248 | -h - help | |
249 | -o - output file name (defaults to 'urename.h' | |
250 | -S - suffix (defaults to _MAJOR_MINOR of current ICU version) | |
251 | Will produce a renaming .h file | |
252 | ||
253 | EndHelpText | |
254 | ||
255 | exit 0; | |
256 | ||
257 | } | |
258 |