]>
Commit | Line | Data |
---|---|---|
73c04bcf A |
1 | #!/usr/bin/perl |
2 | #* | |
3 | #******************************************************************************* | |
4388f060 | 4 | #* Copyright (C) 2006-2011, International Business Machines |
73c04bcf A |
5 | #* Corporation and others. All Rights Reserved. |
6 | #******************************************************************************* | |
7 | #* | |
8 | #* file name: genheaders.pl | |
9 | #* encoding: US-ASCII | |
10 | #* tab size: 8 (not used) | |
11 | #* indentation:4 | |
12 | #* | |
13 | #* Created by: Ram Viswanadha | |
14 | #* | |
15 | #* This tool filters the deprecated.html and friends file generated by Doxygen and generates udarft.h | |
16 | #* udeprctd.h and uobslete.h | |
17 | #* | |
18 | ||
19 | use File::Find; | |
20 | use File::Basename; | |
21 | use IO::File; | |
22 | use Cwd; | |
23 | use File::Copy; | |
24 | use Getopt::Long; | |
25 | use File::Path; | |
26 | use File::Copy; | |
27 | ||
28 | $draftHeaderName = "udraft.h"; | |
29 | $draftAppend = "DRAFT_API_DO_NOT_USE"; | |
30 | $draftDefine = "U_HIDE_DRAFT_API"; | |
31 | ||
32 | $deprecatedHeaderName = "udeprctd.h"; | |
33 | $deprecatedAppend = "DEPRECATED_API_DO_NOT_USE"; | |
34 | $deprecatedDefine = "U_HIDE_DEPRECATED_API"; | |
35 | ||
36 | $obsoleteHeaderName = "uobslete.h"; | |
37 | $obsoleteAppend = "OBSOLETE_API_DO_NOT_USE"; | |
38 | $obsoleteDefine = "U_HIDE_OBSOLETE_API"; | |
39 | ||
40 | $systemHeaderName = "usystem.h"; | |
41 | $systemAppend = "SYSTEM_API_DO_NOT_USE"; | |
42 | $systemDefine = "U_HIDE_SYSTEM_API"; | |
43 | ||
44 | $internalHeaderName = "uintrnal.h"; | |
45 | $internalAppend = "INTERNAL_API_DO_NOT_USE"; | |
46 | $internalDefine = "U_HIDE_INTERNAL_API"; | |
47 | ||
48 | $versionAppend=""; | |
729e4ab9 | 49 | |
73c04bcf A |
50 | #run the program |
51 | main(); | |
52 | ||
53 | #--------------------------------------------------------------------- | |
54 | # The main program | |
55 | ||
56 | sub main(){ | |
57 | GetOptions( | |
58 | "--srcdir=s" => \$srcDir, | |
59 | "--destdir=s" => \$destDir, | |
60 | "--version=s" => \$version, | |
61 | "--exclusion-list=s" => \$exclude, | |
729e4ab9 A |
62 | "--include-types" => \$includeTypes, |
63 | "--verbose" => \$verbose | |
73c04bcf A |
64 | ); |
65 | usage() unless defined $srcDir; | |
66 | usage() unless defined $destDir; | |
67 | usage() unless defined $version; | |
68 | usage() unless defined $exclude; | |
69 | $draftFile = "$srcDir/draft.html"; | |
70 | $deprecatedFile = "$srcDir/deprecated.html"; | |
71 | $obsoleteFile = "$srcDir/obsolete.html"; | |
72 | $systemFile = "$srcDir/system.html"; | |
73 | $internalFile = "$srcDir/internal.html"; | |
74 | ||
75 | $versionAppend = $version; | |
4388f060 | 76 | $versionAppend=~ s/^([0-9]+)\.([0-9]+).*/\1\2/; # _48 |
73c04bcf A |
77 | $excludeFH = IO::File->new($exclude,"r") |
78 | or die "could not open the file $exclude for reading: $! \n"; | |
79 | my %exclude; | |
80 | while (defined ($line = <$excludeFH>)){ | |
81 | next if( $line =~ /^#/); | |
82 | $line =~ s/^\s+//; | |
83 | $line =~ s/\s+\n$//; | |
84 | $exclude{$line}="EXCLUDE"; | |
85 | } | |
86 | ||
87 | writeFile($draftFile, $draftHeaderName, $destDir, $draftAppend, $draftDefine, \%exclude); | |
88 | writeFile($deprecatedFile, $deprecatedHeaderName, $destDir, $deprecatedAppend, $deprecatedDefine, \%exclude); | |
89 | writeFile($obsoleteFile, $obsoleteHeaderName, $destDir, $obsoleteAppend, $obsoleteDefine, \%exclude); | |
90 | writeFile($systemFile, $systemHeaderName, $destDir, $systemAppend, $systemDefine, \%exclude); | |
91 | writeFile($internalFile, $internalHeaderName, $destDir, $internalAppend, $internalDefine, \%exclude); | |
92 | } | |
93 | ||
94 | #----------------------------------------------------------------------- | |
95 | sub getHeaderDef{ | |
96 | ($headerName) = @_; | |
97 | $headerDef = uc($headerName); # this is building the constant for #define | |
98 | $headerDef =~ s/\./_/; | |
99 | return $headerDef; | |
100 | } | |
101 | ||
102 | #----------------------------------------------------------------------- | |
103 | sub writeFile{ | |
104 | ($infile,$outfile,$destDir, $symbolAppend, $symbolDef, $exclude) = @_; | |
105 | ||
729e4ab9 | 106 | my $outFileName = $outfile; |
73c04bcf A |
107 | $headerDef = getHeaderDef($outfile); |
108 | ||
109 | $outfile = $destDir."/".$outfile; | |
110 | ||
111 | $inFH = IO::File->new($infile,"r") | |
112 | or die "could not open the file $infile for reading: $! \n"; | |
113 | $outFH = IO::File->new($outfile,"w") | |
114 | or die "could not open the file $outfile for writing: $! \n"; | |
115 | ||
116 | #print "$headerDef>>> $outfile\n"; | |
117 | printHeader($outFH, $outFileName, $headerDef, $symbolDef); | |
118 | parseWriteFile($inFH, $outFH, $symbolAppend, $exclude); | |
119 | printFooter($outFH, $headerDef, $symbolDef); | |
120 | close($inFH); | |
121 | close($outFH); | |
122 | } | |
123 | ||
124 | #----------------------------------------------------------------------- | |
125 | sub printHeader{ | |
126 | ($outFH, $headername, $HEADERDEF, $symbolDef) = @_; | |
127 | ($DAY, $MONTH, $YEAR) = (localtime)[3,4,5]; | |
128 | $YEAR += 1900; | |
129 | #We will print our copyright here + warnings | |
130 | print $outFH <<END_HEADER_COMMENT; | |
131 | /* | |
132 | ******************************************************************************* | |
133 | * Copyright (C) 2004-$YEAR, International Business Machines | |
134 | * Corporation and others. All Rights Reserved. | |
135 | ******************************************************************************* | |
136 | * | |
137 | * file name: $headername | |
138 | * encoding: US-ASCII | |
139 | * tab size: 8 (not used) | |
140 | * indentation:4 | |
141 | * | |
142 | * Created by: genheaders.pl, a perl script written by Ram Viswanadha | |
143 | * | |
144 | * Contains data for commenting out APIs. | |
145 | * Gets included by umachine.h | |
146 | * | |
147 | * THIS FILE IS MACHINE-GENERATED, DON'T PLAY WITH IT IF YOU DON'T KNOW WHAT | |
148 | * YOU ARE DOING, OTHERWISE VERY BAD THINGS WILL HAPPEN! | |
149 | */ | |
150 | ||
151 | #ifndef $HEADERDEF | |
152 | #define $HEADERDEF | |
153 | ||
154 | #ifdef $symbolDef | |
155 | ||
156 | END_HEADER_COMMENT | |
157 | } | |
158 | ||
159 | #----------------------------------------------------------------------- | |
160 | sub parseWriteFile{ | |
161 | ($inFH, $outFH, $symbolAppend, $exclude) = @_; | |
162 | %disableRenaming; | |
163 | %enableRenaning; | |
164 | while (defined ($line = <$inFH>)){ | |
165 | #just process C APIs for now | |
166 | if($line =~ /\<dt\>/ ){ | |
167 | #special cases | |
168 | if( ($line =~ /LEUnicode/)|| ($line =~ /LanguageCodes/) || | |
169 | ($line =~ /ScriptCodes/) || ($line =~ /\:+/) || | |
170 | ($line =~ /Class/) ){ | |
171 | next; | |
172 | } | |
729e4ab9 A |
173 | if( $line =~ /^\<dt\>File [^\>]*\>([^\<]*)/ ) { |
174 | print "Skipping file-scope $symbolAppend $1\n"; | |
175 | next; | |
176 | } | |
73c04bcf A |
177 | #<dt>Global <a class="el" href="utrans_8h.html#a21">utrans_unregister</a> </dt> |
178 | #<dt>Global <a class="el" href="classUnicodeString.html#w1w0">UnicodeString::kInvariant</a> </dt> | |
179 | # the below regular expression works for both the above formats. | |
4388f060 | 180 | $line=~ m/\<dt\>.*\<a class=\".*\" href=\".*\">(.*)\<\/a\>.*\<\/dt\>/; |
73c04bcf A |
181 | my $value = $1; |
182 | $value =~ s/\<\/a\>\s*//g; | |
183 | $value =~ s/^\s+//; | |
184 | $value =~ s/\s+$//; | |
185 | #print "$exclude->{$value}\n"; | |
186 | if($exclude->{$value} eq "EXCLUDE"){ | |
187 | #print "$value $exclude->{$value}\n"; | |
188 | next; | |
189 | } | |
729e4ab9 | 190 | print "$value $realSymbol $nonExSymbol :: $line\n" if defined $verbose; |
73c04bcf | 191 | next if(isStringAcceptable($value)==1); |
729e4ab9 A |
192 | if($value =~ /^operator[^a-zA-Z]/) { |
193 | print "Skipping operator $symbolAppend $value from $line\n"; | |
194 | next; | |
195 | } | |
73c04bcf A |
196 | $realSymbol = $value."_".$versionAppend; |
197 | $nonExSymbol = $value."_".$symbolAppend; | |
198 | $disableRenaming{$value} = $nonExSymbol; | |
199 | $enableRenaming{$realSymbol} = $nonExSymbol; | |
729e4ab9 | 200 | print "$value $realSymbol $nonExSymbol\n" if defined $verbose; |
73c04bcf A |
201 | |
202 | } | |
203 | } | |
204 | print "size of disableRenaming: " . keys( %disableRenaming) . ".\n"; | |
205 | print "size of enableRenaming: " . keys( %enableRenaming) . ".\n"; | |
206 | print $outFH "# if U_DISABLE_RENAMING\n"; | |
207 | foreach $key (sort (keys(%disableRenaming))) { | |
208 | print $outFH "# define $key $disableRenaming{$key}\n"; | |
209 | delete($disableRenaming{$key}); | |
210 | } | |
211 | print $outFH "# else\n"; | |
212 | foreach $key (sort (keys(%enableRenaming))) { | |
213 | print $outFH "# define $key $enableRenaming{$key}\n"; | |
214 | delete($enableRenaming{$key}); | |
215 | } | |
216 | print $outFH "# endif /* U_DISABLE_RENAMING */\n"; | |
217 | } | |
218 | #----------------------------------------------------------------------- | |
219 | sub isStringAcceptable{ | |
220 | ($string) = @_; | |
221 | @str = split(//, $string); | |
222 | $ret = 1; | |
223 | foreach $val (@str){ | |
224 | if(($val ne "_") && !($val =~ /[0-9A-Z]/)){ | |
225 | #print "$val\n"; | |
226 | $ret = 0; | |
227 | } | |
228 | } | |
229 | #print "$string : $ret\n"; | |
230 | if(!(defined $includeTypes)){ | |
231 | if($ret==0 && $str[0] eq 'U'){ | |
232 | $ret=1; | |
233 | } | |
234 | } | |
235 | return $ret; | |
236 | } | |
237 | ||
238 | #----------------------------------------------------------------------- | |
239 | sub printFooter{ | |
240 | ||
241 | ($outFH, $headerDef, $symbolDef ) = @_; | |
242 | #print the footer | |
243 | print $outFH <<END_FOOTER; | |
244 | ||
245 | #endif /* $symbolDef */ | |
246 | #endif /* $headerDef */ | |
247 | ||
248 | END_FOOTER | |
249 | } | |
250 | #----------------------------------------------------------------------- | |
251 | sub usage { | |
252 | print << "END"; | |
253 | Usage: | |
254 | gendraft.pl | |
255 | Options: | |
256 | --srcdir=<directory> | |
257 | --destdir=<directory> | |
258 | --version=<current version of ICU> | |
259 | --exclusion-list=<file name> | |
260 | --include-types | |
261 | e.g.: genheaders.pl --srcdir=<icu>/source/common/docs/html --destdir=<icu>/source/common/unicode --version=2.8 --exclusion-list=exclude.txt | |
262 | END | |
263 | exit(0); | |
264 | } |