blob: 1f5f868ba21d521c85852b78ee81d97fb6aaf60c [file] [log] [blame]
#!/usr/bin/perl
#*
#*******************************************************************************
#* Copyright (C) 2006-2011, International Business Machines
#* Corporation and others. All Rights Reserved.
#*******************************************************************************
#*
#* file name: genheaders.pl
#* encoding: US-ASCII
#* tab size: 8 (not used)
#* indentation:4
#*
#* Created by: Ram Viswanadha
#*
#* This tool filters the deprecated.html and friends file generated by Doxygen and generates udarft.h
#* udeprctd.h and uobslete.h
#*
use File::Find;
use File::Basename;
use IO::File;
use Cwd;
use File::Copy;
use Getopt::Long;
use File::Path;
use File::Copy;
$draftHeaderName = "udraft.h";
$draftAppend = "DRAFT_API_DO_NOT_USE";
$draftDefine = "U_HIDE_DRAFT_API";
$deprecatedHeaderName = "udeprctd.h";
$deprecatedAppend = "DEPRECATED_API_DO_NOT_USE";
$deprecatedDefine = "U_HIDE_DEPRECATED_API";
$obsoleteHeaderName = "uobslete.h";
$obsoleteAppend = "OBSOLETE_API_DO_NOT_USE";
$obsoleteDefine = "U_HIDE_OBSOLETE_API";
$systemHeaderName = "usystem.h";
$systemAppend = "SYSTEM_API_DO_NOT_USE";
$systemDefine = "U_HIDE_SYSTEM_API";
$internalHeaderName = "uintrnal.h";
$internalAppend = "INTERNAL_API_DO_NOT_USE";
$internalDefine = "U_HIDE_INTERNAL_API";
$versionAppend="";
#run the program
main();
#---------------------------------------------------------------------
# The main program
sub main(){
GetOptions(
"--srcdir=s" => \$srcDir,
"--destdir=s" => \$destDir,
"--version=s" => \$version,
"--exclusion-list=s" => \$exclude,
"--include-types" => \$includeTypes,
"--verbose" => \$verbose
);
usage() unless defined $srcDir;
usage() unless defined $destDir;
usage() unless defined $version;
usage() unless defined $exclude;
$draftFile = "$srcDir/draft.html";
$deprecatedFile = "$srcDir/deprecated.html";
$obsoleteFile = "$srcDir/obsolete.html";
$systemFile = "$srcDir/system.html";
$internalFile = "$srcDir/internal.html";
$versionAppend = $version;
$versionAppend=~ s/^([0-9]+)\.([0-9]+).*/\1\2/; # _48
$excludeFH = IO::File->new($exclude,"r")
or die "could not open the file $exclude for reading: $! \n";
my %exclude;
while (defined ($line = <$excludeFH>)){
next if( $line =~ /^#/);
$line =~ s/^\s+//;
$line =~ s/\s+\n$//;
$exclude{$line}="EXCLUDE";
}
writeFile($draftFile, $draftHeaderName, $destDir, $draftAppend, $draftDefine, \%exclude);
writeFile($deprecatedFile, $deprecatedHeaderName, $destDir, $deprecatedAppend, $deprecatedDefine, \%exclude);
writeFile($obsoleteFile, $obsoleteHeaderName, $destDir, $obsoleteAppend, $obsoleteDefine, \%exclude);
writeFile($systemFile, $systemHeaderName, $destDir, $systemAppend, $systemDefine, \%exclude);
writeFile($internalFile, $internalHeaderName, $destDir, $internalAppend, $internalDefine, \%exclude);
}
#-----------------------------------------------------------------------
sub getHeaderDef{
($headerName) = @_;
$headerDef = uc($headerName); # this is building the constant for #define
$headerDef =~ s/\./_/;
return $headerDef;
}
#-----------------------------------------------------------------------
sub writeFile{
($infile,$outfile,$destDir, $symbolAppend, $symbolDef, $exclude) = @_;
my $outFileName = $outfile;
$headerDef = getHeaderDef($outfile);
$outfile = $destDir."/".$outfile;
$inFH = IO::File->new($infile,"r")
or die "could not open the file $infile for reading: $! \n";
$outFH = IO::File->new($outfile,"w")
or die "could not open the file $outfile for writing: $! \n";
#print "$headerDef>>> $outfile\n";
printHeader($outFH, $outFileName, $headerDef, $symbolDef);
parseWriteFile($inFH, $outFH, $symbolAppend, $exclude);
printFooter($outFH, $headerDef, $symbolDef);
close($inFH);
close($outFH);
}
#-----------------------------------------------------------------------
sub printHeader{
($outFH, $headername, $HEADERDEF, $symbolDef) = @_;
($DAY, $MONTH, $YEAR) = (localtime)[3,4,5];
$YEAR += 1900;
#We will print our copyright here + warnings
print $outFH <<END_HEADER_COMMENT;
/*
*******************************************************************************
* Copyright (C) 2004-$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: genheaders.pl, a perl script written by Ram Viswanadha
*
* Contains data for commenting out APIs.
* 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
#ifdef $symbolDef
END_HEADER_COMMENT
}
#-----------------------------------------------------------------------
sub parseWriteFile{
($inFH, $outFH, $symbolAppend, $exclude) = @_;
%disableRenaming;
%enableRenaning;
while (defined ($line = <$inFH>)){
#just process C APIs for now
if($line =~ /\<dt\>/ ){
#special cases
if( ($line =~ /LEUnicode/)|| ($line =~ /LanguageCodes/) ||
($line =~ /ScriptCodes/) || ($line =~ /\:+/) ||
($line =~ /Class/) ){
next;
}
if( $line =~ /^\<dt\>File [^\>]*\>([^\<]*)/ ) {
print "Skipping file-scope $symbolAppend $1\n";
next;
}
#<dt>Global <a class="el" href="utrans_8h.html#a21">utrans_unregister</a> </dt>
#<dt>Global <a class="el" href="classUnicodeString.html#w1w0">UnicodeString::kInvariant</a> </dt>
# the below regular expression works for both the above formats.
$line=~ m/\<dt\>.*\<a class=\".*\" href=\".*\">(.*)\<\/a\>.*\<\/dt\>/;
my $value = $1;
$value =~ s/\<\/a\>\s*//g;
$value =~ s/^\s+//;
$value =~ s/\s+$//;
#print "$exclude->{$value}\n";
if($exclude->{$value} eq "EXCLUDE"){
#print "$value $exclude->{$value}\n";
next;
}
print "$value $realSymbol $nonExSymbol :: $line\n" if defined $verbose;
next if(isStringAcceptable($value)==1);
if($value =~ /^operator[^a-zA-Z]/) {
print "Skipping operator $symbolAppend $value from $line\n";
next;
}
$realSymbol = $value."_".$versionAppend;
$nonExSymbol = $value."_".$symbolAppend;
$disableRenaming{$value} = $nonExSymbol;
$enableRenaming{$realSymbol} = $nonExSymbol;
print "$value $realSymbol $nonExSymbol\n" if defined $verbose;
}
}
print "size of disableRenaming: " . keys( %disableRenaming) . ".\n";
print "size of enableRenaming: " . keys( %enableRenaming) . ".\n";
print $outFH "# if U_DISABLE_RENAMING\n";
foreach $key (sort (keys(%disableRenaming))) {
print $outFH "# define $key $disableRenaming{$key}\n";
delete($disableRenaming{$key});
}
print $outFH "# else\n";
foreach $key (sort (keys(%enableRenaming))) {
print $outFH "# define $key $enableRenaming{$key}\n";
delete($enableRenaming{$key});
}
print $outFH "# endif /* U_DISABLE_RENAMING */\n";
}
#-----------------------------------------------------------------------
sub isStringAcceptable{
($string) = @_;
@str = split(//, $string);
$ret = 1;
foreach $val (@str){
if(($val ne "_") && !($val =~ /[0-9A-Z]/)){
#print "$val\n";
$ret = 0;
}
}
#print "$string : $ret\n";
if(!(defined $includeTypes)){
if($ret==0 && $str[0] eq 'U'){
$ret=1;
}
}
return $ret;
}
#-----------------------------------------------------------------------
sub printFooter{
($outFH, $headerDef, $symbolDef ) = @_;
#print the footer
print $outFH <<END_FOOTER;
#endif /* $symbolDef */
#endif /* $headerDef */
END_FOOTER
}
#-----------------------------------------------------------------------
sub usage {
print << "END";
Usage:
gendraft.pl
Options:
--srcdir=<directory>
--destdir=<directory>
--version=<current version of ICU>
--exclusion-list=<file name>
--include-types
e.g.: genheaders.pl --srcdir=<icu>/source/common/docs/html --destdir=<icu>/source/common/unicode --version=2.8 --exclusion-list=exclude.txt
END
exit(0);
}