| Index: icu46/source/tools/genren/genren.pl
|
| ===================================================================
|
| --- icu46/source/tools/genren/genren.pl (revision 0)
|
| +++ icu46/source/tools/genren/genren.pl (revision 0)
|
| @@ -0,0 +1,258 @@
|
| +#!/usr/bin/perl
|
| +#*
|
| +#*******************************************************************************
|
| +#* Copyright (C) 2001-2010, International Business Machines
|
| +#* Corporation and others. All Rights Reserved.
|
| +#*******************************************************************************
|
| +#*
|
| +#* file name: genren.pl
|
| +#* encoding: US-ASCII
|
| +#* tab size: 8 (not used)
|
| +#* indentation:4
|
| +#*
|
| +#* Created by: Vladimir Weinstein
|
| +#* 07/19/2001
|
| +#*
|
| +#* Used to generate renaming headers.
|
| +#* Run on UNIX platforms (linux) in order to catch all the exports
|
| +
|
| +use POSIX qw(strftime);
|
| +
|
| +$headername = 'urename.h';
|
| +
|
| +$path = substr($0, 0, rindex($0, "/")+1)."../../common/unicode/uversion.h";
|
| +
|
| +$nmopts = '-Cg -f s';
|
| +$post = '';
|
| +
|
| +$mode = 'POSIX';
|
| +
|
| +(-e $path) || die "Cannot find uversion.h";
|
| +
|
| +open(UVERSION, $path);
|
| +
|
| +while(<UVERSION>) {
|
| + if(/\#define U_ICU_VERSION_SUFFIX/) {
|
| + chop;
|
| + s/\#define U_ICU_VERSION_SUFFIX //;
|
| + $U_ICU_VERSION_SUFFIX = "$_";
|
| + last;
|
| + }
|
| +}
|
| +
|
| +while($ARGV[0] =~ /^-/) { # detects whether there are any arguments
|
| + $_ = shift @ARGV; # extracts the argument for processing
|
| + /^-v/ && ($VERBOSE++, next); # verbose
|
| + /^-h/ && (&printHelpMsgAndExit, next); # help
|
| + /^-o/ && (($headername = shift (@ARGV)), next); # output file
|
| + /^-n/ && (($nmopts = shift (@ARGV)), next); # nm opts
|
| + /^-p/ && (($post = shift (@ARGV)), next); # nm opts
|
| + /^-x/ && (($mode = shift (@ARGV)), next); # nm opts
|
| + /^-S/ && (($U_ICU_VERSION_SUFFIX = shift(@ARGV)), next); # pick the suffix
|
| + warn("Invalid option $_\n");
|
| + &printHelpMsgAndExit;
|
| +}
|
| +
|
| +unless(@ARGV > 0) {
|
| + warn "No libraries, exiting...\n";
|
| + &printHelpMsgAndExit;
|
| +}
|
| +
|
| +#$headername = "uren".substr($ARGV[0], 6, index(".", $ARGV[0])-7).".h";
|
| +
|
| +$HEADERDEF = uc($headername); # this is building the constant for #define
|
| +$HEADERDEF =~ s/\./_/;
|
| +
|
| +
|
| + open HEADER, ">$headername"; # opening a header file
|
| +
|
| +#We will print our copyright here + warnings
|
| +
|
| +$YEAR = strftime "%Y",localtime;
|
| +
|
| +print HEADER <<"EndOfHeaderComment";
|
| +/*
|
| +*******************************************************************************
|
| +* Copyright (C) 2002-$YEAR, International Business Machines
|
| +* Corporation and others. All Rights Reserved.
|
| +*******************************************************************************
|
| +*
|
| +* file name: $headername
|
| +* encoding: US-ASCII
|
| +* tab size: 8 (not used)
|
| +* indentation:4
|
| +*
|
| +* Created by: Perl script written by Vladimir Weinstein
|
| +*
|
| +* Contains data for renaming ICU exports.
|
| +* Gets included by umachine.h
|
| +*
|
| +* THIS FILE IS MACHINE-GENERATED, DON'T PLAY WITH IT IF YOU DON'T KNOW WHAT
|
| +* YOU ARE DOING, OTHERWISE VERY BAD THINGS WILL HAPPEN!
|
| +*/
|
| +
|
| +#ifndef $HEADERDEF
|
| +#define $HEADERDEF
|
| +
|
| +/* Uncomment the following line to disable renaming on platforms
|
| + that do not use Autoconf. */
|
| +/* #define U_DISABLE_RENAMING 1 */
|
| +
|
| +#if !U_DISABLE_RENAMING
|
| +
|
| +/* 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
|
| + the platform a chance to define it first.
|
| + Normally (if utypes.h or umachine.h was included first) this will not be necessary as it will already be defined.
|
| + */
|
| +#ifndef U_ICU_ENTRY_POINT_RENAME
|
| +#include "unicode/umachine.h"
|
| +#endif
|
| +
|
| +/* If we still don't have U_ICU_ENTRY_POINT_RENAME use the default. */
|
| +#ifndef U_ICU_ENTRY_POINT_RENAME
|
| +#include "unicode/uvernum.h"
|
| +#endif
|
| +
|
| +/* Error out before the following defines cause very strange and unexpected code breakage */
|
| +#ifndef U_ICU_ENTRY_POINT_RENAME
|
| +#error U_ICU_ENTRY_POINT_RENAME is not defined - cannot continue. Consider defining U_DISABLE_RENAMING if renaming should not be used.
|
| +#endif
|
| +
|
| +EndOfHeaderComment
|
| +
|
| +$fileCount = 0;
|
| +$itemCount = 0;
|
| +$symbolCount = 0;
|
| +
|
| +for(;@ARGV; shift(@ARGV)) {
|
| + $fileCount++;
|
| + @NMRESULT = `nm $nmopts $ARGV[0] $post`;
|
| + if($?) {
|
| + warn "Couldn't do 'nm' for $ARGV[0], continuing...\n";
|
| + next; # Couldn't do nm for the file
|
| + }
|
| + if($mode =~ /POSIX/) {
|
| + splice @NMRESULT, 0, 6;
|
| + } elsif ($mode =~ /Mach-O/) {
|
| +# splice @NMRESULT, 0, 10;
|
| + }
|
| + foreach (@NMRESULT) { # Process every line of result and stuff it in $_
|
| + $itemCount++;
|
| + if($mode =~ /POSIX/) {
|
| + ($_, $address, $type) = split(/\|/);
|
| + } elsif ($mode =~ /Mach-O/) {
|
| + if(/^(?:[0-9a-fA-F]){8} ([A-Z]) (?:_)?(.*)$/) {
|
| + ($_, $type) = ($2, $1);
|
| + } else {
|
| + next;
|
| + }
|
| + } else {
|
| + die "Unknown mode $mode";
|
| + }
|
| + &verbose( "type: \"$type\" ");
|
| + if(!($type =~ /[UAwW?]/)) {
|
| + if(/@@/) { # These would be imports
|
| + &verbose( "Import: $_ \"$type\"\n");
|
| + &verbose( "C++ method: $_\n");
|
| + } elsif (/^[^\(]*::/) { # C++ methods, stuff class name in associative array
|
| + ## DON'T match ... ( foo::bar ... want :: to be to the left of paren
|
| + ## icu_2_0::CharString::~CharString(void) -> CharString
|
| + @CppName = split(/::/); ## remove scope stuff
|
| + if(@CppName>1) {
|
| + ## MessageFormat virtual table -> MessageFormat
|
| + @CppName = split(/ /, $CppName[1]); ## remove debug stuff
|
| + }
|
| + ## ures_getUnicodeStringByIndex(UResourceBundle -> ures_getUnicodeStringByIndex
|
| + @CppName = split(/\(/, $CppName[0]); ## remove function args
|
| + if($CppName[0] =~ /^operator/) {
|
| + &verbose ("Skipping C++ function: $_\n");
|
| + } elsif($CppName[0] =~ /^~/) {
|
| + &verbose ("Skipping C++ destructor: $_\n");
|
| + } else {
|
| + &verbose( " Class: '$CppName[0]': $_ \n");
|
| + $CppClasses{$CppName[0]}++;
|
| + $symbolCount++;
|
| + }
|
| + } elsif ( my ($cfn) = m/^([A-Za-z0-9_]*)\(.*/ ) {
|
| + &verbose ( "$ARGV[0]: got global C++ function $cfn with '$_'\n" );
|
| + $CFuncs{$cfn}++;
|
| + $symbolCount++;
|
| + } elsif ( /\(/) { # These are strange functions
|
| + print STDERR "$ARGV[0]: Not sure what to do with '$_'\n";
|
| + } elsif ( /^_init/ ) {
|
| + &verbose( "$ARGV[0]: Skipped initializer $_\n" );
|
| + } elsif ( /^_fini/ ) {
|
| + &verbose( "$ARGV[0]: Skipped finilizer $_\n" );
|
| + } elsif ( /icu_/) {
|
| + print STDERR "$ARGV[0]: Skipped strange mangled function $_\n";
|
| + } elsif ( /^vtable for /) {
|
| + print STDERR "$ARGV[0]: Skipped vtable $_\n";
|
| + } elsif ( /^typeinfo for /) {
|
| + print STDERR "$ARGV[0]: Skipped typeinfo $_\n";
|
| + } elsif ( /operator\+/ ) {
|
| + print STDERR "$ARGV[0]: Skipped ignored function $_\n";
|
| + } else { # This is regular C function
|
| + &verbose( "C func: $_\n");
|
| + @funcname = split(/[\(\s+]/);
|
| + $CFuncs{$funcname[0]}++;
|
| + $symbolCount++;
|
| + }
|
| + } else {
|
| + &verbose( "Skipped: $_ $1\n");
|
| + }
|
| + }
|
| +}
|
| +
|
| +if( $fileCount == 0 ) {
|
| + die "Error: $itemCount lines from $fileCount files processed, but $symbolCount symbols were found.\n";
|
| +}
|
| +
|
| +if( $symbolCount == 0 ) {
|
| + die "Error: $itemCount lines from $fileCount files processed, but $symbolCount symbols were found.\n";
|
| +}
|
| +
|
| +print " Loaded $symbolCount symbols from $itemCount lines in $fileCount files.\n";
|
| +
|
| +print HEADER "\n/* C exports renaming data */\n\n";
|
| +foreach(sort keys(%CFuncs)) {
|
| + print HEADER "#define $_ U_ICU_ENTRY_POINT_RENAME($_)\n";
|
| +# print HEADER "#define $_ $_$U_ICU_VERSION_SUFFIX\n";
|
| +}
|
| +
|
| +print HEADER "\n\n";
|
| +print HEADER "/* C++ class names renaming defines */\n\n";
|
| +print HEADER "#ifdef XP_CPLUSPLUS\n";
|
| +print HEADER "#if !U_HAVE_NAMESPACE\n\n";
|
| +foreach(sort keys(%CppClasses)) {
|
| + print HEADER "#define $_ U_ICU_ENTRY_POINT_RENAME($_)\n";
|
| +}
|
| +print HEADER "\n#endif\n";
|
| +print HEADER "#endif\n";
|
| +print HEADER "\n#endif\n";
|
| +print HEADER "\n#endif\n";
|
| +
|
| +close HEADER;
|
| +
|
| +sub verbose {
|
| + if($VERBOSE) {
|
| + print STDERR @_;
|
| + }
|
| +}
|
| +
|
| +
|
| +sub printHelpMsgAndExit {
|
| + print STDERR <<"EndHelpText";
|
| +Usage: $0 [OPTIONS] LIBRARY_FILES
|
| + Options:
|
| + -v - verbose
|
| + -h - help
|
| + -o - output file name (defaults to 'urename.h'
|
| + -S - suffix (defaults to _MAJOR_MINOR of current ICU version)
|
| +Will produce a renaming .h file
|
| +
|
| +EndHelpText
|
| +
|
| + exit 0;
|
| +
|
| +}
|
| +
|
|
|
| Property changes on: icu46/source/tools/genren/genren.pl
|
| ___________________________________________________________________
|
| Added: svn:executable
|
| + *
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|