OLD | NEW |
(Empty) | |
| 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 uni
code/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 nece
ssary 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 defin
ing 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 associati
ve 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_getUnico
deStringByIndex |
| 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 |
OLD | NEW |