xref: /openbsd-src/gnu/usr.bin/perl/cpan/Win32API-File/inc/ExtUtils/Myconst2perl.pm (revision b8851fcc53cbe24fd20b090f26dd149e353f6174)
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