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