1*b8851fccSafresh1# This should eventually become part of MakeMaker as ExtUtils::Mkconst2perl. 2*b8851fccSafresh1# Documentation for this is very skimpy at this point. Full documentation 3*b8851fccSafresh1# will be added to ExtUtils::Mkconst2perl when it is created. 4*b8851fccSafresh1package # Hide from PAUSE 5*b8851fccSafresh1 ExtUtils::Myconst2perl; 6*b8851fccSafresh1 7*b8851fccSafresh1use strict; 8*b8851fccSafresh1use Config; 9*b8851fccSafresh1 10*b8851fccSafresh1use vars qw( @ISA @EXPORT @EXPORT_OK $VERSION ); 11*b8851fccSafresh1BEGIN { 12*b8851fccSafresh1 require Exporter; 13*b8851fccSafresh1 push @ISA, 'Exporter'; 14*b8851fccSafresh1 @EXPORT= qw( &Myconst2perl ); 15*b8851fccSafresh1 @EXPORT_OK= qw( &ParseAttribs ); 16*b8851fccSafresh1 $VERSION= 1.00; 17*b8851fccSafresh1} 18*b8851fccSafresh1 19*b8851fccSafresh1use Carp; 20*b8851fccSafresh1use File::Basename; 21*b8851fccSafresh1use ExtUtils::MakeMaker qw( neatvalue ); 22*b8851fccSafresh1 23*b8851fccSafresh1# Return the extension to use for a file of C++ source code: 24*b8851fccSafresh1sub _cc 25*b8851fccSafresh1{ 26*b8851fccSafresh1 # Some day, $Config{_cc} might be defined for us: 27*b8851fccSafresh1 return $Config{_cc} if $Config{_cc}; 28*b8851fccSafresh1 return ".cxx"; # Seems to be the most widely accepted extension. 29*b8851fccSafresh1} 30*b8851fccSafresh1 31*b8851fccSafresh1=item ParseAttribs 32*b8851fccSafresh1 33*b8851fccSafresh1Parses user-firendly options into coder-firendly specifics. 34*b8851fccSafresh1 35*b8851fccSafresh1=cut 36*b8851fccSafresh1 37*b8851fccSafresh1sub ParseAttribs 38*b8851fccSafresh1{ 39*b8851fccSafresh1 # Usage: ParseAttribs( "Package::Name", \%opts, {opt=>\$var} ); 40*b8851fccSafresh1 my( $pkg, $hvAttr, $hvRequests )= @_; 41*b8851fccSafresh1 my( $outfile, @perlfiles, %perlfilecodes, @cfiles, %cfilecodes ); 42*b8851fccSafresh1 my @importlist= @{$hvAttr->{IMPORT_LIST}}; 43*b8851fccSafresh1 my $perlcode= $hvAttr->{PERL_PE_CODE} || 44*b8851fccSafresh1 'last if /^\s*(bootstrap|XSLoader::load)\b/'; 45*b8851fccSafresh1 my $ccode= $hvAttr->{C_PE_CODE} || 46*b8851fccSafresh1 'last if m#/[/*]\s*CONSTS_DEFINED\b|^\s*MODULE\b#'; 47*b8851fccSafresh1 my $ifdef= $hvAttr->{IFDEF} || 0; 48*b8851fccSafresh1 my $writeperl= !! $hvAttr->{WRITE_PERL}; 49*b8851fccSafresh1 my $export= !! $hvAttr->{DO_EXPORT}; 50*b8851fccSafresh1 my $importto= $hvAttr->{IMPORT_TO} || "_constants"; 51*b8851fccSafresh1 my $cplusplus= $hvAttr->{CPLUSPLUS}; 52*b8851fccSafresh1 $cplusplus= "" if ! defined $cplusplus; 53*b8851fccSafresh1 my $object= ""; 54*b8851fccSafresh1 my $binary= ""; 55*b8851fccSafresh1 my $final= ""; 56*b8851fccSafresh1 my $norebuild= ""; 57*b8851fccSafresh1 my $subroutine= ""; 58*b8851fccSafresh1 my $base; 59*b8851fccSafresh1 my %params= ( 60*b8851fccSafresh1 PERL_PE_CODE => \$perlcode, 61*b8851fccSafresh1 PERL_FILE_LIST => \@perlfiles, 62*b8851fccSafresh1 PERL_FILE_CODES => \%perlfilecodes, 63*b8851fccSafresh1 PERL_FILES => sub { map {($_,$perlfilecodes{$_})} @perlfiles }, 64*b8851fccSafresh1 C_PE_CODE => \$ccode, 65*b8851fccSafresh1 C_FILE_LIST => \@cfiles, 66*b8851fccSafresh1 C_FILE_CODES => \%cfilecodes, 67*b8851fccSafresh1 C_FILES => sub { map {($_,$cfilecodes{$_})} @cfiles }, 68*b8851fccSafresh1 DO_EXPORT => \$export, 69*b8851fccSafresh1 IMPORT_TO => \$importto, 70*b8851fccSafresh1 IMPORT_LIST => \@importlist, 71*b8851fccSafresh1 SUBROUTINE => \$subroutine, 72*b8851fccSafresh1 IFDEF => \$ifdef, 73*b8851fccSafresh1 WRITE_PERL => \$writeperl, 74*b8851fccSafresh1 CPLUSPLUS => \$cplusplus, 75*b8851fccSafresh1 BASEFILENAME => \$base, 76*b8851fccSafresh1 OUTFILE => \$outfile, 77*b8851fccSafresh1 OBJECT => \$object, 78*b8851fccSafresh1 BINARY => \$binary, 79*b8851fccSafresh1 FINAL_PERL => \$final, 80*b8851fccSafresh1 NO_REBUILD => \$norebuild, 81*b8851fccSafresh1 ); 82*b8851fccSafresh1 { my @err= grep {! defined $params{$_}} keys %$hvAttr; 83*b8851fccSafresh1 carp "ExtUtils::Myconst2perl::ParseAttribs: ", 84*b8851fccSafresh1 "Unsupported option(s) (@err).\n" 85*b8851fccSafresh1 if @err; 86*b8851fccSafresh1 } 87*b8851fccSafresh1 $norebuild= $hvAttr->{NO_REBUILD} if exists $hvAttr->{NO_REBUILD}; 88*b8851fccSafresh1 my $module= ( split /::/, $pkg )[-1]; 89*b8851fccSafresh1 $base= "c".$module; 90*b8851fccSafresh1 $base= $hvAttr->{BASEFILENAME} if exists $hvAttr->{BASEFILENAME}; 91*b8851fccSafresh1 my $ext= ! $cplusplus ? ($Config{_c}||".c") 92*b8851fccSafresh1 : $cplusplus =~ /^[.]/ ? $cplusplus : _cc(); 93*b8851fccSafresh1 if( $writeperl ) { 94*b8851fccSafresh1 $outfile= $base . "_pc" . $ext; 95*b8851fccSafresh1 $object= $base . "_pc" . ($Config{_o}||$Config{obj_ext}); 96*b8851fccSafresh1 $object= $hvAttr->{OBJECT} if $hvAttr->{OBJECT}; 97*b8851fccSafresh1 $binary= $base . "_pc" . ($Config{_exe}||$Config{exe_ext}); 98*b8851fccSafresh1 $binary= $hvAttr->{BINARY} if $hvAttr->{BINARY}; 99*b8851fccSafresh1 $final= $base . ".pc"; 100*b8851fccSafresh1 $final= $hvAttr->{FINAL_PERL} if $hvAttr->{FINAL_PERL}; 101*b8851fccSafresh1 $subroutine= "main"; 102*b8851fccSafresh1 } elsif( $cplusplus ) { 103*b8851fccSafresh1 $outfile= $base . $ext; 104*b8851fccSafresh1 $object= $base . ($Config{_o}||$Config{obj_ext}); 105*b8851fccSafresh1 $object= $hvAttr->{OBJECT} if $hvAttr->{OBJECT}; 106*b8851fccSafresh1 $subroutine= "const2perl_" . $pkg; 107*b8851fccSafresh1 $subroutine =~ s/\W/_/g; 108*b8851fccSafresh1 } else { 109*b8851fccSafresh1 $outfile= $base . ".h"; 110*b8851fccSafresh1 } 111*b8851fccSafresh1 $outfile= $hvAttr->{OUTFILE} if $hvAttr->{OUTFILE}; 112*b8851fccSafresh1 if( $hvAttr->{PERL_FILES} ) { 113*b8851fccSafresh1 carp "ExtUtils::Myconst2perl: PERL_FILES option not allowed ", 114*b8851fccSafresh1 "with PERL_FILE_LIST nor PERL_FILE_CODES.\n" 115*b8851fccSafresh1 if $hvAttr->{PERL_FILE_LIST} || $hvAttr->{PERL_FILE_CODES}; 116*b8851fccSafresh1 %perlfilecodes= @{$hvAttr->{PERL_FILES}}; 117*b8851fccSafresh1 my $odd= 0; 118*b8851fccSafresh1 @perlfiles= grep {$odd= !$odd} @{$hvAttr->{PERL_FILES}}; 119*b8851fccSafresh1 } else { 120*b8851fccSafresh1 if( $hvAttr->{PERL_FILE_LIST} ) { 121*b8851fccSafresh1 @perlfiles= @{$hvAttr->{PERL_FILE_LIST}}; 122*b8851fccSafresh1 } elsif( $hvAttr->{PERL_FILE_CODES} ) { 123*b8851fccSafresh1 @perlfiles= keys %{$hvAttr->{PERL_FILE_CODES}}; 124*b8851fccSafresh1 } else { 125*b8851fccSafresh1 @perlfiles= ( "$module.pm" ); 126*b8851fccSafresh1 } 127*b8851fccSafresh1 %perlfilecodes= %{$hvAttr->{PERL_FILE_CODES}} 128*b8851fccSafresh1 if $hvAttr->{PERL_FILE_CODES}; 129*b8851fccSafresh1 } 130*b8851fccSafresh1 for my $file ( @perlfiles ) { 131*b8851fccSafresh1 $perlfilecodes{$file}= $perlcode if ! $perlfilecodes{$file}; 132*b8851fccSafresh1 } 133*b8851fccSafresh1 if( ! $subroutine ) { 134*b8851fccSafresh1 ; # Don't process any C source code files. 135*b8851fccSafresh1 } elsif( $hvAttr->{C_FILES} ) { 136*b8851fccSafresh1 carp "ExtUtils::Myconst2perl: C_FILES option not allowed ", 137*b8851fccSafresh1 "with C_FILE_LIST nor C_FILE_CODES.\n" 138*b8851fccSafresh1 if $hvAttr->{C_FILE_LIST} || $hvAttr->{C_FILE_CODES}; 139*b8851fccSafresh1 %cfilecodes= @{$hvAttr->{C_FILES}}; 140*b8851fccSafresh1 my $odd= 0; 141*b8851fccSafresh1 @cfiles= grep {$odd= !$odd} @{$hvAttr->{C_FILES}}; 142*b8851fccSafresh1 } else { 143*b8851fccSafresh1 if( $hvAttr->{C_FILE_LIST} ) { 144*b8851fccSafresh1 @cfiles= @{$hvAttr->{C_FILE_LIST}}; 145*b8851fccSafresh1 } elsif( $hvAttr->{C_FILE_CODES} ) { 146*b8851fccSafresh1 @cfiles= keys %{$hvAttr->{C_FILE_CODES}}; 147*b8851fccSafresh1 } elsif( $writeperl || $cplusplus ) { 148*b8851fccSafresh1 @cfiles= ( "$module.xs" ); 149*b8851fccSafresh1 } 150*b8851fccSafresh1 %cfilecodes= %{$hvAttr->{C_FILE_CODES}} if $hvAttr->{C_FILE_CODES}; 151*b8851fccSafresh1 } 152*b8851fccSafresh1 for my $file ( @cfiles ) { 153*b8851fccSafresh1 $cfilecodes{$file}= $ccode if ! $cfilecodes{$file}; 154*b8851fccSafresh1 } 155*b8851fccSafresh1 for my $key ( keys %$hvRequests ) { 156*b8851fccSafresh1 if( ! $params{$key} ) { 157*b8851fccSafresh1 carp "ExtUtils::Myconst2perl::ParseAttribs: ", 158*b8851fccSafresh1 "Unsupported output ($key).\n"; 159*b8851fccSafresh1 } elsif( "SCALAR" eq ref( $params{$key} ) ) { 160*b8851fccSafresh1 ${$hvRequests->{$key}}= ${$params{$key}}; 161*b8851fccSafresh1 } elsif( "ARRAY" eq ref( $params{$key} ) ) { 162*b8851fccSafresh1 @{$hvRequests->{$key}}= @{$params{$key}}; 163*b8851fccSafresh1 } elsif( "HASH" eq ref( $params{$key} ) ) { 164*b8851fccSafresh1 %{$hvRequests->{$key}}= %{$params{$key}}; 165*b8851fccSafresh1 } elsif( "CODE" eq ref( $params{$key} ) ) { 166*b8851fccSafresh1 @{$hvRequests->{$key}}= &{$params{$key}}; 167*b8851fccSafresh1 } else { 168*b8851fccSafresh1 die "Impossible value in \$params{$key}"; 169*b8851fccSafresh1 } 170*b8851fccSafresh1 } 171*b8851fccSafresh1} 172*b8851fccSafresh1 173*b8851fccSafresh1=item Myconst2perl 174*b8851fccSafresh1 175*b8851fccSafresh1Generates a file used to implement C constants as "constant subroutines" in 176*b8851fccSafresh1a Perl module. 177*b8851fccSafresh1 178*b8851fccSafresh1Extracts a list of constants from a module's export list by C<eval>ing the 179*b8851fccSafresh1first part of the Module's F<*.pm> file and then requesting some groups of 180*b8851fccSafresh1symbols be exported/imported into a dummy package. Then writes C or C++ 181*b8851fccSafresh1code that can convert each C constant into a Perl "constant subroutine" 182*b8851fccSafresh1whose name is the constant's name and whose value is the constant's value. 183*b8851fccSafresh1 184*b8851fccSafresh1=cut 185*b8851fccSafresh1 186*b8851fccSafresh1sub Myconst2perl 187*b8851fccSafresh1{ 188*b8851fccSafresh1 my( $pkg, %spec )= @_; 189*b8851fccSafresh1 my( $outfile, $writeperl, $ifdef, $export, $importto, @importlist, 190*b8851fccSafresh1 @perlfile, %perlcode, @cfile, %ccode, $routine ); 191*b8851fccSafresh1 ParseAttribs( $pkg, \%spec, { 192*b8851fccSafresh1 DO_EXPORT => \$export, 193*b8851fccSafresh1 IMPORT_TO => \$importto, 194*b8851fccSafresh1 IMPORT_LIST => \@importlist, 195*b8851fccSafresh1 IFDEF => \$ifdef, 196*b8851fccSafresh1 WRITE_PERL => \$writeperl, 197*b8851fccSafresh1 OUTFILE => \$outfile, 198*b8851fccSafresh1 PERL_FILE_LIST => \@perlfile, 199*b8851fccSafresh1 PERL_FILE_CODES => \%perlcode, 200*b8851fccSafresh1 C_FILE_LIST => \@cfile, 201*b8851fccSafresh1 C_FILE_CODES => \%ccode, 202*b8851fccSafresh1 SUBROUTINE => \$routine, 203*b8851fccSafresh1 } ); 204*b8851fccSafresh1 my $module= ( split /::/, $pkg )[-1]; 205*b8851fccSafresh1 206*b8851fccSafresh1 warn "Writing $outfile...\n"; 207*b8851fccSafresh1 open( STDOUT, ">$outfile" ) or die "Can't create $outfile: $!\n"; 208*b8851fccSafresh1 209*b8851fccSafresh1 my $code= ""; 210*b8851fccSafresh1 my $file; 211*b8851fccSafresh1 foreach $file ( @perlfile ) { 212*b8851fccSafresh1 warn "Reading Perl file, $file: $perlcode{$file}\n"; 213*b8851fccSafresh1 open( MODULE, "<$file" ) or die "Can't read Perl file, $file: $!\n"; 214*b8851fccSafresh1 eval qq[ 215*b8851fccSafresh1 while( <MODULE> ) { 216*b8851fccSafresh1 $perlcode{$file}; 217*b8851fccSafresh1 \$code .= \$_; 218*b8851fccSafresh1 } 219*b8851fccSafresh1 1; 220*b8851fccSafresh1 ] or die "$file eval: $@\n"; 221*b8851fccSafresh1 close( MODULE ); 222*b8851fccSafresh1 } 223*b8851fccSafresh1 224*b8851fccSafresh1 print 225*b8851fccSafresh1 "/* $outfile - Generated by ExtUtils::Myconst2perl::Myconst2perl */\n"; 226*b8851fccSafresh1 if( $routine ) { 227*b8851fccSafresh1 print "/* See start of $routine() for generation parameters used */\n"; 228*b8851fccSafresh1 #print "#define main _main_proto" 229*b8851fccSafresh1 # " /* Ignore Perl's main() prototype */\n\n"; 230*b8851fccSafresh1 if( $writeperl ) { 231*b8851fccSafresh1 # Here are more reasons why the WRITE_PERL option is discouraged. 232*b8851fccSafresh1 if( $Config{useperlio} ) { 233*b8851fccSafresh1 print "#define PERLIO_IS_STDIO 1\n"; 234*b8851fccSafresh1 } 235*b8851fccSafresh1 print "#define WIN32IO_IS_STDIO 1\n"; # May cause a warning 236*b8851fccSafresh1 print "#define NO_XSLOCKS 1\n"; # What a hack! 237*b8851fccSafresh1 } 238*b8851fccSafresh1 foreach $file ( @cfile ) { 239*b8851fccSafresh1 warn "Reading C file, $file: $ccode{$file}\n"; 240*b8851fccSafresh1 open( XS, "<$file" ) or die "Can't read C file, $file: $!\n"; 241*b8851fccSafresh1 my $code= $ccode{$file}; 242*b8851fccSafresh1 $code =~ s#\\#\\\\#g; 243*b8851fccSafresh1 $code =~ s#([^\s -~])#"\\x".sprintf "%02X",unpack "C",$1#ge; 244*b8851fccSafresh1 $code =~ s#[*]/#*\\/#g; 245*b8851fccSafresh1 print qq[\n/* Include $file: $code */\n]; 246*b8851fccSafresh1 print qq[\n#line 1 "$file"\n]; 247*b8851fccSafresh1 eval qq[ 248*b8851fccSafresh1 while( <XS> ) { 249*b8851fccSafresh1 $ccode{$file}; 250*b8851fccSafresh1 print; 251*b8851fccSafresh1 } 252*b8851fccSafresh1 1; 253*b8851fccSafresh1 ] or die "$file eval: $@\n"; 254*b8851fccSafresh1 close( XS ); 255*b8851fccSafresh1 } 256*b8851fccSafresh1 #print qq[\n#undef main\n]; 257*b8851fccSafresh1 print qq[\n#define CONST2WRITE_PERL\n]; 258*b8851fccSafresh1 print qq[\n#include "const2perl.h"\n\n]; 259*b8851fccSafresh1 if( $writeperl ) { 260*b8851fccSafresh1 print "int\nmain( int argc, char *argv[], char *envp[] )\n"; 261*b8851fccSafresh1 } else { 262*b8851fccSafresh1 print "void\n$routine( void )\n"; 263*b8851fccSafresh1 } 264*b8851fccSafresh1 } 265*b8851fccSafresh1 print "{\n"; 266*b8851fccSafresh1 267*b8851fccSafresh1 { 268*b8851fccSafresh1 @ExtUtils::Myconst2perl::importlist= @importlist; 269*b8851fccSafresh1 my $var= '@ExtUtils::Myconst2perl::importlist'; 270*b8851fccSafresh1 my $port= $export ? "export" : "import"; 271*b8851fccSafresh1 my $arg2= $export ? "q[$importto]," : ""; 272*b8851fccSafresh1 local( $^W )= 0; 273*b8851fccSafresh1 eval $code . "{\n" 274*b8851fccSafresh1 . " { package $importto;\n" 275*b8851fccSafresh1 . " warn qq[\u${port}ing to $importto: $var\\n];\n" 276*b8851fccSafresh1 . " \$pkg->$port( $arg2 $var );\n" 277*b8851fccSafresh1 . " }\n" 278*b8851fccSafresh1 . " { no strict 'refs';\n" 279*b8851fccSafresh1 . " $var= sort keys %{'_constants::'}; }\n" 280*b8851fccSafresh1 . " warn 0 + $var, qq[ symbols ${port}ed.\\n];\n" 281*b8851fccSafresh1 . "}\n1;\n" 282*b8851fccSafresh1 or die "eval: $@\n"; 283*b8851fccSafresh1 } 284*b8851fccSafresh1 my @syms= @ExtUtils::Myconst2perl::importlist; 285*b8851fccSafresh1 286*b8851fccSafresh1 my $if; 287*b8851fccSafresh1 my $const; 288*b8851fccSafresh1 print qq[ START_CONSTS( "$pkg" ) /* No ";" */\n]; 289*b8851fccSafresh1 { 290*b8851fccSafresh1 my( $head, $tail )= ( "/*", "\n" ); 291*b8851fccSafresh1 if( $writeperl ) { 292*b8851fccSafresh1 $head= ' printf( "#'; 293*b8851fccSafresh1 $tail= '\\n" );' . "\n"; 294*b8851fccSafresh1 print $head, " Generated by $outfile.", $tail; 295*b8851fccSafresh1 } 296*b8851fccSafresh1 print $head, " Package $pkg with options:", $tail; 297*b8851fccSafresh1 $head= " *" if ! $writeperl; 298*b8851fccSafresh1 my $key; 299*b8851fccSafresh1 foreach $key ( sort keys %spec ) { 300*b8851fccSafresh1 my $val= neatvalue($spec{$key}); 301*b8851fccSafresh1 $val =~ s/\\/\\\\/g if $writeperl; 302*b8851fccSafresh1 print $head, " $key => ", $val, $tail; 303*b8851fccSafresh1 } 304*b8851fccSafresh1 print $head, " Perl files eval'd:", $tail; 305*b8851fccSafresh1 foreach $key ( @perlfile ) { 306*b8851fccSafresh1 my $code= $perlcode{$key}; 307*b8851fccSafresh1 $code =~ s#\\#\\\\#g; 308*b8851fccSafresh1 $code =~ s#([^ -~])#"\\".sprintf "%03o",unpack "C",$1#ge; 309*b8851fccSafresh1 $code =~ s#"#\\"#g if $writeperl; 310*b8851fccSafresh1 print $head, " $key => ", $code, $tail; 311*b8851fccSafresh1 } 312*b8851fccSafresh1 if( $writeperl ) { 313*b8851fccSafresh1 print $head, " C files included:", $tail; 314*b8851fccSafresh1 foreach $key ( @cfile ) { 315*b8851fccSafresh1 my $code= $ccode{$key}; 316*b8851fccSafresh1 $code =~ s#\\#\\\\#g; 317*b8851fccSafresh1 $code =~ s#([^ -~])#"\\".sprintf "%03o",unpack "C",$1#ge; 318*b8851fccSafresh1 $code =~ s#"#\\"#g; 319*b8851fccSafresh1 print $head, " $key => ", $code, $tail; 320*b8851fccSafresh1 } 321*b8851fccSafresh1 } else { 322*b8851fccSafresh1 print " */\n"; 323*b8851fccSafresh1 } 324*b8851fccSafresh1 } 325*b8851fccSafresh1 if( ! ref($ifdef) && $ifdef =~ /[^\s\w]/ ) { 326*b8851fccSafresh1 my $sub= $ifdef; 327*b8851fccSafresh1 $sub= 'sub { local($_)= @_; ' . $sub . ' }' 328*b8851fccSafresh1 unless $sub =~ /^\s*sub\b/; 329*b8851fccSafresh1 $ifdef= eval $sub; 330*b8851fccSafresh1 die "$@: $sub\n" if $@; 331*b8851fccSafresh1 if( "CODE" ne ref($ifdef) ) { 332*b8851fccSafresh1 die "IFDEF didn't create subroutine reference: eval $sub\n"; 333*b8851fccSafresh1 } 334*b8851fccSafresh1 } 335*b8851fccSafresh1 foreach $const ( @syms ) { 336*b8851fccSafresh1 $if= "CODE" eq ref($ifdef) ? $ifdef->($const) : $ifdef; 337*b8851fccSafresh1 if( ! $if ) { 338*b8851fccSafresh1 $if= ""; 339*b8851fccSafresh1 } elsif( "1" eq $if ) { 340*b8851fccSafresh1 $if= "#ifdef $const\n"; 341*b8851fccSafresh1 } elsif( $if !~ /^#/ ) { 342*b8851fccSafresh1 $if= "#ifdef $if\n"; 343*b8851fccSafresh1 } else { 344*b8851fccSafresh1 $if= "$if\n"; 345*b8851fccSafresh1 } 346*b8851fccSafresh1 print $if 347*b8851fccSafresh1 . qq[ const2perl( $const );\n]; 348*b8851fccSafresh1 if( $if ) { 349*b8851fccSafresh1 print "#else\n" 350*b8851fccSafresh1 . qq[ noconst( $const );\n] 351*b8851fccSafresh1 . "#endif\n"; 352*b8851fccSafresh1 } 353*b8851fccSafresh1 } 354*b8851fccSafresh1 if( $writeperl ) { 355*b8851fccSafresh1 print 356*b8851fccSafresh1 qq[ printf( "1;\\n" );\n], 357*b8851fccSafresh1 qq[ return( 0 );\n]; 358*b8851fccSafresh1 } 359*b8851fccSafresh1 print "}\n"; 360*b8851fccSafresh1} 361*b8851fccSafresh1 362*b8851fccSafresh11; 363