intl/icu/source/tools/genren/genren.pl

Wed, 31 Dec 2014 07:22:50 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 07:22:50 +0100
branch
TOR_BUG_3246
changeset 4
fc2d59ddac77
permissions
-rwxr-xr-x

Correct previous dual key logic pending first delivery installment.

     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
    19 use POSIX qw(strftime);
    21 $headername = 'urename.h';
    23 $path = substr($0, 0, rindex($0, "/")+1)."../../common/unicode/uversion.h";
    25 $nmopts = '-Cg -f s';
    26 $post = '';
    28 $mode = 'POSIX';
    30 (-e $path) || die "Cannot find uversion.h";
    32 open(UVERSION, $path);
    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 }
    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 }
    56 unless(@ARGV > 0) {
    57     warn "No libraries, exiting...\n";
    58     &printHelpMsgAndExit;
    59 }
    61 #$headername = "uren".substr($ARGV[0], 6, index(".", $ARGV[0])-7).".h";
    63 $HEADERDEF = uc($headername);  # this is building the constant for #define
    64 $HEADERDEF =~ s/\./_/;
    67     open HEADER, ">$headername"; # opening a header file
    69 #We will print our copyright here + warnings
    71 $YEAR = strftime "%Y",localtime;
    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 */
    94 #ifndef $HEADERDEF
    95 #define $HEADERDEF
    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  */
   103 #include "unicode/uconfig.h"
   105 #if !U_DISABLE_RENAMING
   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  */
   112 #ifndef U_ICU_ENTRY_POINT_RENAME
   113 #include "unicode/umachine.h"
   114 #endif
   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
   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
   126 EndOfHeaderComment
   128 $fileCount = 0;
   129 $itemCount = 0;
   130 $symbolCount = 0;
   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
   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 }
   221 if( $fileCount == 0 ) {
   222   die "Error: $itemCount lines from $fileCount files processed, but $symbolCount symbols were found.\n";
   223 }
   225 if( $symbolCount == 0 ) {
   226   die "Error: $itemCount lines from $fileCount files processed, but $symbolCount symbols were found.\n";
   227 }
   229 print " Loaded $symbolCount symbols from $itemCount lines in $fileCount files.\n";
   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 }
   237 print HEADER "\n#endif\n";
   238 print HEADER "\n#endif\n";
   240 close HEADER;
   242 sub verbose {
   243     if($VERBOSE) {
   244         print STDERR @_;
   245     }
   246 }
   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
   259 EndHelpText
   261     exit 0;
   263 }

mercurial