ignore const for the purposes of typemaps (from Hugo van der Sanden)
[p5sagit/p5-mst-13.2.git] / utils / h2xs.PL
1 #!/usr/local/bin/perl
2
3 use Config;
4 use File::Basename qw(&basename &dirname);
5 use Cwd;
6
7 # List explicitly here the variables you want Configure to
8 # generate.  Metaconfig only looks for shell variables, so you
9 # have to mention them as if they were shell variables, not
10 # %Config entries.  Thus you write
11 #  $startperl
12 # to ensure Configure will look for $Config{startperl}.
13
14 # This forces PL files to create target in same directory as PL file.
15 # This is so that make depend always knows where to find PL derivatives.
16 $origdir = cwd;
17 chdir dirname($0);
18 $file = basename($0, '.PL');
19 $file .= '.com' if $^O eq 'VMS';
20
21 open OUT,">$file" or die "Can't create $file: $!";
22
23 print "Extracting $file (with variable substitutions)\n";
24
25 # In this section, perl variables will be expanded during extraction.
26 # You can use $Config{...} to use Configure variables.
27
28 print OUT <<"!GROK!THIS!";
29 $Config{startperl}
30     eval 'exec $Config{perlpath} -S \$0 \${1+"\$@"}'
31         if \$running_under_some_shell;
32 !GROK!THIS!
33
34 # In the following, perl variables are not expanded during extraction.
35
36 print OUT <<'!NO!SUBS!';
37
38 =head1 NAME
39
40 h2xs - convert .h C header files to Perl extensions
41
42 =head1 SYNOPSIS
43
44 B<h2xs> [B<-ACOPXcdf>] [B<-v> version] [B<-n> module_name] [B<-p> prefix] [B<-s> sub] [headerfile ... [extra_libraries]]
45
46 B<h2xs> B<-h>
47
48 =head1 DESCRIPTION
49
50 I<h2xs> builds a Perl extension from C header files.  The extension
51 will include functions which can be used to retrieve the value of any
52 #define statement which was in the C header files.
53
54 The I<module_name> will be used for the name of the extension.  If
55 module_name is not supplied then the name of the first header file
56 will be used, with the first character capitalized.
57
58 If the extension might need extra libraries, they should be included
59 here.  The extension Makefile.PL will take care of checking whether
60 the libraries actually exist and how they should be loaded.
61 The extra libraries should be specified in the form -lm -lposix, etc,
62 just as on the cc command line.  By default, the Makefile.PL will
63 search through the library path determined by Configure.  That path
64 can be augmented by including arguments of the form B<-L/another/library/path>
65 in the extra-libraries argument.
66
67 =head1 OPTIONS
68
69 =over 5
70
71 =item B<-A>
72
73 Omit all autoload facilities.  This is the same as B<-c> but also removes the
74 S<C<use AutoLoader>> statement from the .pm file.
75
76 =item B<-C>
77
78 Omits creation of the F<Changes> file, and adds a HISTORY section to
79 the POD template.
80
81 =item B<-F>
82
83 Additional flags to specify to C preprocessor when scanning header for
84 function declarations.  Should not be used without B<-x>.
85
86 =item B<-M> I<regular expression>
87
88 selects functions/macros to process.
89
90 =item B<-O>
91
92 Allows a pre-existing extension directory to be overwritten.
93
94 =item B<-P>
95
96 Omit the autogenerated stub POD section. 
97
98 =item B<-X>
99
100 Omit the XS portion.  Used to generate templates for a module which is not
101 XS-based.  C<-c> and C<-f> are implicitly enabled.
102
103 =item B<-a>
104
105 Generate an accessor method for each element of structs and unions. The
106 generated methods are named after the element name; will return the current
107 value of the element if called without additional arguments; and will set
108 the element to the supplied value (and return the old value) if called with
109 an additional argument.
110
111 =item B<-c>
112
113 Omit C<constant()> from the .xs file and corresponding specialised
114 C<AUTOLOAD> from the .pm file.
115
116 =item B<-d>
117
118 Turn on debugging messages.
119
120 =item B<-f>
121
122 Allows an extension to be created for a header even if that header is
123 not found in standard include directories.
124
125 =item B<-h>
126
127 Print the usage, help and version for this h2xs and exit.
128
129 =item B<-n> I<module_name>
130
131 Specifies a name to be used for the extension, e.g., S<-n RPC::DCE>
132
133 =item B<-o> I<regular expression>
134
135 Use "opaque" data type for the C types matched by the regular
136 expression, even if these types are C<typedef>-equivalent to types
137 from typemaps.  Should not be used without B<-x>.
138
139 This may be useful since, say, types which are C<typedef>-equivalent
140 to integers may represent OS-related handles, and one may want to work
141 with these handles in OO-way, as in C<$handle-E<gt>do_something()>.
142 Use C<-o .> if you want to handle all the C<typedef>ed types as opaque types.
143
144 The type-to-match is whitewashed (except for commas, which have no
145 whitespace before them, and multiple C<*> which have no whitespace
146 between them).
147
148 =item B<-p> I<prefix>
149
150 Specify a prefix which should be removed from the Perl function names, e.g., S<-p sec_rgy_> 
151 This sets up the XS B<PREFIX> keyword and removes the prefix from functions that are
152 autoloaded via the C<constant()> mechanism.
153
154 =item B<-s> I<sub1,sub2>
155
156 Create a perl subroutine for the specified macros rather than autoload with the constant() subroutine.
157 These macros are assumed to have a return type of B<char *>, e.g., S<-s sec_rgy_wildcard_name,sec_rgy_wildcard_sid>.
158
159 =item B<-v> I<version>
160
161 Specify a version number for this extension.  This version number is added
162 to the templates.  The default is 0.01.
163
164 =item B<-x>
165
166 Automatically generate XSUBs basing on function declarations in the
167 header file.  The package C<C::Scan> should be installed. If this
168 option is specified, the name of the header file may look like
169 C<NAME1,NAME2>. In this case NAME1 is used instead of the specified string,
170 but XSUBs are emitted only for the declarations included from file NAME2.
171
172 Note that some types of arguments/return-values for functions may
173 result in XSUB-declarations/typemap-entries which need
174 hand-editing. Such may be objects which cannot be converted from/to a
175 pointer (like C<long long>), pointers to functions, or arrays.  See
176 also the section on L<LIMITATIONS of B<-x>>.
177
178 =back
179
180 =head1 EXAMPLES
181
182
183         # Default behavior, extension is Rusers
184         h2xs rpcsvc/rusers
185
186         # Same, but extension is RUSERS
187         h2xs -n RUSERS rpcsvc/rusers
188
189         # Extension is rpcsvc::rusers. Still finds <rpcsvc/rusers.h>
190         h2xs rpcsvc::rusers
191
192         # Extension is ONC::RPC.  Still finds <rpcsvc/rusers.h>
193         h2xs -n ONC::RPC rpcsvc/rusers
194
195         # Without constant() or AUTOLOAD
196         h2xs -c rpcsvc/rusers
197
198         # Creates templates for an extension named RPC
199         h2xs -cfn RPC
200
201         # Extension is ONC::RPC.
202         h2xs -cfn ONC::RPC
203
204         # Makefile.PL will look for library -lrpc in 
205         # additional directory /opt/net/lib
206         h2xs rpcsvc/rusers -L/opt/net/lib -lrpc
207
208         # Extension is DCE::rgynbase
209         # prefix "sec_rgy_" is dropped from perl function names
210         h2xs -n DCE::rgynbase -p sec_rgy_ dce/rgynbase
211
212         # Extension is DCE::rgynbase
213         # prefix "sec_rgy_" is dropped from perl function names
214         # subroutines are created for sec_rgy_wildcard_name and sec_rgy_wildcard_sid
215         h2xs -n DCE::rgynbase -p sec_rgy_ \
216         -s sec_rgy_wildcard_name,sec_rgy_wildcard_sid dce/rgynbase
217
218         # Make XS without defines in perl.h, but with function declarations
219         # visible from perl.h. Name of the extension is perl1.
220         # When scanning perl.h, define -DEXT=extern -DdEXT= -DINIT(x)=
221         # Extra backslashes below because the string is passed to shell.
222         # Note that a directory with perl header files would 
223         #  be added automatically to include path.
224         h2xs -xAn perl1 -F "-DEXT=extern -DdEXT= -DINIT\(x\)=" perl.h
225
226         # Same with function declaration in proto.h as visible from perl.h.
227         h2xs -xAn perl2 perl.h,proto.h
228
229         # Same but select only functions which match /^av_/
230         h2xs -M '^av_' -xAn perl2 perl.h,proto.h
231
232         # Same but treat SV* etc as "opaque" types
233         h2xs -o '^[S]V \*$' -M '^av_' -xAn perl2 perl.h,proto.h
234
235 =head1 ENVIRONMENT
236
237 No environment variables are used.
238
239 =head1 AUTHOR
240
241 Larry Wall and others
242
243 =head1 SEE ALSO
244
245 L<perl>, L<perlxstut>, L<ExtUtils::MakeMaker>, and L<AutoLoader>.
246
247 =head1 DIAGNOSTICS
248
249 The usual warnings if it cannot read or write the files involved.
250
251 =head1 LIMITATIONS of B<-x>
252
253 F<h2xs> would not distinguish whether an argument to a C function
254 which is of the form, say, C<int *>, is an input, output, or
255 input/output parameter.  In particular, argument declarations of the
256 form
257
258     int
259     foo(n)
260         int *n
261
262 should be better rewritten as
263
264     int
265     foo(n)
266         int &n
267
268 if C<n> is an input parameter.
269
270 Additionally, F<h2xs> has no facilities to intuit that a function
271
272    int
273    foo(addr,l)
274         char *addr
275         int   l
276
277 takes a pair of address and length of data at this address, so it is better
278 to rewrite this function as
279
280     int
281     foo(sv)
282             SV *addr
283         PREINIT:
284             STRLEN len;
285             char *s;
286         CODE:
287             s = SvPV(sv,len);
288             RETVAL = foo(s, len);
289         OUTPUT:
290             RETVAL
291
292 or alternately
293
294     static int
295     my_foo(SV *sv)
296     {
297         STRLEN len;
298         char *s = SvPV(sv,len);
299
300         return foo(s, len);
301     }
302
303     MODULE = foo        PACKAGE = foo   PREFIX = my_
304
305     int
306     foo(sv)
307         SV *sv
308
309 See L<perlxs> and L<perlxstut> for additional details.
310
311 =cut
312
313 use strict;
314
315
316 my( $H2XS_VERSION ) = ' $Revision: 1.20 $ ' =~ /\$Revision:\s+([^\s]+)/;
317 my $TEMPLATE_VERSION = '0.01';
318 my @ARGS = @ARGV;
319
320 use Getopt::Std;
321
322 sub usage{
323         warn "@_\n" if @_;
324     die "h2xs [-ACOPXcdfh] [-v version] [-n module_name] [-p prefix] [-s subs] [headerfile [extra_libraries]]
325 version: $H2XS_VERSION
326     -A   Omit all autoloading facilities (implies -c).
327     -C   Omit creating the Changes file, add HISTORY heading to stub POD.
328     -F   Additional flags for C preprocessor (used with -x).
329     -M   Mask to select C functions/macros (default is select all).
330     -O   Allow overwriting of a pre-existing extension directory.
331     -P   Omit the stub POD section.
332     -X   Omit the XS portion (implies both -c and -f).
333     -a   Generate get/set accessors for struct and union members (used with -x).
334     -c   Omit the constant() function and specialised AUTOLOAD from the XS file.
335     -d   Turn on debugging messages.
336     -f   Force creation of the extension even if the C header does not exist.
337     -h   Display this help message
338     -n   Specify a name to use for the extension (recommended).
339     -o   Regular expression for \"opaque\" types.
340     -p   Specify a prefix which should be removed from the Perl function names.
341     -s   Create subroutines for specified macros.
342     -v   Specify a version number for this extension.
343     -x   Autogenerate XSUBs using C::Scan.
344 extra_libraries
345          are any libraries that might be needed for loading the
346          extension, e.g. -lm would try to link in the math library.
347 ";
348 }
349
350
351 getopts("ACF:M:OPXacdfhn:o:p:s:v:x") || usage;
352 use vars qw($opt_A $opt_C $opt_F $opt_M $opt_O $opt_P $opt_X $opt_a $opt_c
353             $opt_d $opt_f $opt_h $opt_n $opt_o $opt_p $opt_s $opt_v $opt_x);
354
355 usage if $opt_h;
356
357 if( $opt_v ){
358         $TEMPLATE_VERSION = $opt_v;
359 }
360
361 # -A implies -c.
362 $opt_c = 1 if $opt_A;
363
364 # -X implies -c and -f
365 $opt_c = $opt_f = 1 if $opt_X;
366
367 my %const_xsub = map { $_,1 } split(/,+/, $opt_s) if $opt_s;
368 my $extralibs;
369 my @path_h;
370
371 while (my $arg = shift) {
372     if ($arg =~ /^-l/i) {
373         $extralibs = "$arg @ARGV";
374         last;
375     }
376     push(@path_h, $arg);
377 }
378
379 usage "Must supply header file or module name\n"
380         unless (@path_h or $opt_n);
381
382 my $fmask;
383 my $tmask;
384
385 $fmask = qr{$opt_M} if defined $opt_M;
386 $tmask = qr{$opt_o} if defined $opt_o;
387 my $tmask_all = $tmask && $opt_o eq '.';
388
389 if ($opt_x) {
390   eval {require C::Scan; 1}
391     or die <<EOD;
392 C::Scan required if you use -x option.
393 To install C::Scan, execute
394    perl -MCPAN -e "install C::Scan"
395 EOD
396   unless ($tmask_all) {
397     $C::Scan::VERSION >= 0.70
398       or die <<EOD;
399 C::Scan v. 0.70 or later required unless you use -o . option.
400 You have version $C::Scan::VERSION installed as $INC{'C/Scan.pm'}.
401 To install C::Scan, execute
402    perl -MCPAN -e "install C::Scan"
403 EOD
404   }
405 }
406 elsif ($opt_o or $opt_F) {
407   warn <<EOD;
408 Options -o and -F do not make sense without -x.
409 EOD
410 }
411
412 my @path_h_ini = @path_h;
413 my ($name, %fullpath, %prefix, %seen_define, %prefixless, %const_names);
414
415 if( @path_h ){
416     use Config;
417     use File::Spec;
418     my @paths;
419     if ($^O eq 'VMS') {  # Consider overrides of default location
420       # XXXX This is not equivalent to what the older version did:
421       #         it was looking at $hadsys header-file per header-file...
422       my($hadsys) = grep s!^sys/!!i , @path_h;
423       @paths = qw( Sys$Library VAXC$Include );
424       push @paths, ($hadsys ? 'GNU_CC_Include[vms]' : 'GNU_CC_Include[000000]');
425       push @paths, qw( DECC$Library_Include DECC$System_Include );
426     }
427     else {
428       @paths = (File::Spec->curdir(), $Config{usrinc},
429                 (split ' ', $Config{locincpth}), '/usr/include');
430     }
431     foreach my $path_h (@path_h) {
432         $name ||= $path_h;
433     if( $path_h =~ s#::#/#g && $opt_n ){
434         warn "Nesting of headerfile ignored with -n\n";
435     }
436     $path_h .= ".h" unless $path_h =~ /\.h$/;
437     my $fullpath = $path_h;
438     $path_h =~ s/,.*$// if $opt_x;
439     $fullpath{$path_h} = $fullpath;
440
441     if (not -f $path_h) {
442       my $tmp_path_h = $path_h;
443       for my $dir (@paths) {
444         last if -f ($path_h = File::Spec->catfile($dir, $tmp_path_h));
445       }
446     }
447
448     if (!$opt_c) {
449       die "Can't find $path_h\n" if ( ! $opt_f && ! -f $path_h );
450       # Scan the header file (we should deal with nested header files)
451       # Record the names of simple #define constants into const_names
452             # Function prototypes are processed below.
453       open(CH, "<$path_h") || die "Can't open $path_h: $!\n";
454     defines:
455       while (<CH>) {
456         if (/^[ \t]*#[ \t]*define\s+([\$\w]+)\b(?!\()\s*(?=[^" \t])(.*)/) {
457             my $def = $1;
458             my $rest = $2;
459             $rest =~ s!/\*.*?(\*/|\n)|//.*!!g; # Remove comments
460             $rest =~ s/^\s+//;
461             $rest =~ s/\s+$//;
462             # Cannot do: (-1) and ((LHANDLE)3) are OK:
463             #print("Skip non-wordy $def => $rest\n"),
464             #  next defines if $rest =~ /[^\w\$]/;
465             if ($rest =~ /"/) {
466               print("Skip stringy $def => $rest\n") if $opt_d;
467               next defines;
468             }
469             print "Matched $_ ($def)\n" if $opt_d;
470             $seen_define{$def} = $rest;
471             $_ = $def;
472             next if /^_.*_h_*$/i; # special case, but for what?
473             if (defined $opt_p) {
474               if (!/^$opt_p(\d)/) {
475                 ++$prefix{$_} if s/^$opt_p//;
476               }
477               else {
478                 warn "can't remove $opt_p prefix from '$_'!\n";
479               }
480             }
481             $prefixless{$def} = $_;
482             if (!$fmask or /$fmask/) {
483                 print "... Passes mask of -M.\n" if $opt_d and $fmask;
484                 $const_names{$_}++;
485             }
486           }
487       }
488       close(CH);
489     }
490     }
491 }
492
493
494 my $module = $opt_n || do {
495         $name =~ s/\.h$//;
496         if( $name !~ /::/ ){
497                 $name =~ s#^.*/##;
498                 $name = "\u$name";
499         }
500         $name;
501 };
502
503 my ($ext, $nested, @modparts, $modfname, $modpname);
504 (chdir 'ext', $ext = 'ext/') if -d 'ext';
505
506 if( $module =~ /::/ ){
507         $nested = 1;
508         @modparts = split(/::/,$module);
509         $modfname = $modparts[-1];
510         $modpname = join('/',@modparts);
511 }
512 else {
513         $nested = 0;
514         @modparts = ();
515         $modfname = $modpname = $module;
516 }
517
518
519 if ($opt_O) {
520         warn "Overwriting existing $ext$modpname!!!\n" if -e $modpname;
521 }
522 else {
523         die "Won't overwrite existing $ext$modpname\n" if -e $modpname;
524 }
525 if( $nested ){
526         my $modpath = "";
527         foreach (@modparts){
528                 mkdir("$modpath$_", 0777);
529                 $modpath .= "$_/";
530         }
531 }
532 mkdir($modpname, 0777);
533 chdir($modpname) || die "Can't chdir $ext$modpname: $!\n";
534
535 my %types_seen;
536 my %std_types;
537 my $fdecls = [];
538 my $fdecls_parsed = [];
539 my $typedef_rex;
540 my %typedefs_pre;
541 my %known_fnames;
542 my %structs;
543
544 my @fnames;
545 my @fnames_no_prefix;
546
547 if( ! $opt_X ){  # use XS, unless it was disabled
548   open(XS, ">$modfname.xs") || die "Can't create $ext$modpname/$modfname.xs: $!\n";
549   if ($opt_x) {
550     require Config;             # Run-time directive
551     warn "Scanning typemaps...\n";
552     get_typemap();
553     my @td;
554     my @good_td;
555     my $addflags = $opt_F || '';
556
557     foreach my $filename (@path_h) {
558       my $c;
559       my $filter;
560
561       if ($fullpath{$filename} =~ /,/) {
562         $filename = $`;
563         $filter = $';
564       }
565       warn "Scanning $filename for functions...\n";
566       $c = new C::Scan 'filename' => $filename, 'filename_filter' => $filter,
567         'add_cppflags' => $addflags, 'c_styles' => [qw(C++ C9X)];
568       $c->set('includeDirs' => ["$Config::Config{archlib}/CORE"]);
569
570       push @$fdecls_parsed, @{ $c->get('parsed_fdecls') };
571       push(@$fdecls, @{$c->get('fdecls')});
572
573       push @td, @{$c->get('typedefs_maybe')};
574       if ($opt_a) {
575         my $structs = $c->get('typedef_structs');
576         @structs{keys %$structs} = values %$structs;
577       }
578
579       unless ($tmask_all) {
580         warn "Scanning $filename for typedefs...\n";
581         my $td = $c->get('typedef_hash');
582         # eval {require 'dumpvar.pl'; ::dumpValue($td)} or warn $@ if $opt_d;
583         my @f_good_td = grep $td->{$_}[1] eq '', keys %$td;
584         push @good_td, @f_good_td;
585         @typedefs_pre{@f_good_td}  = map $_->[0], @$td{@f_good_td};
586       }
587     }
588     { local $" = '|';
589       $typedef_rex = qr(\b(?<!struct )(?:@good_td)\b);
590     }
591     %known_fnames = map @$_[1,3], @$fdecls_parsed; # [1,3] is NAME, FULLTEXT
592     if ($fmask) {
593       my @good;
594       for my $i (0..$#$fdecls_parsed) {
595         next unless $fdecls_parsed->[$i][1] =~ /$fmask/; # [1] is NAME
596         push @good, $i;
597         print "... Function $fdecls_parsed->[$i][1] passes -M mask.\n"
598           if $opt_d;
599       }
600       $fdecls = [@$fdecls[@good]];
601       $fdecls_parsed = [@$fdecls_parsed[@good]];
602     }
603     @fnames = sort map $_->[1], @$fdecls_parsed; # 1 is NAME
604     # Sort declarations:
605     {
606       my %h = map( ($_->[1], $_), @$fdecls_parsed);
607       $fdecls_parsed = [ @h{@fnames} ];
608     }
609     @fnames_no_prefix = @fnames;
610     @fnames_no_prefix
611       = sort map { ++$prefix{$_} if s/^$opt_p(?!\d)//; $_ } @fnames_no_prefix;
612     # Remove macros which expand to typedefs
613     print "Typedefs are @td.\n" if $opt_d;
614     my %td = map {($_, $_)} @td;
615     # Add some other possible but meaningless values for macros
616     for my $k (qw(char double float int long short unsigned signed void)) {
617       $td{"$_$k"} = "$_$k" for ('', 'signed ', 'unsigned ');
618     }
619     # eval {require 'dumpvar.pl'; ::dumpValue( [\@td, \%td] ); 1} or warn $@;
620     my $n = 0;
621     my %bad_macs;
622     while (keys %td > $n) {
623       $n = keys %td;
624       my ($k, $v);
625       while (($k, $v) = each %seen_define) {
626         # print("found '$k'=>'$v'\n"), 
627         $bad_macs{$k} = $td{$k} = $td{$v} if exists $td{$v};
628       }
629     }
630     # Now %bad_macs contains names of bad macros
631     for my $k (keys %bad_macs) {
632       delete $const_names{$prefixless{$k}};
633       print "Ignoring macro $k which expands to a typedef name '$bad_macs{$k}'\n" if $opt_d;
634     }
635   }
636 }
637 my @const_names = sort keys %const_names;
638
639 open(PM, ">$modfname.pm") || die "Can't create $ext$modpname/$modfname.pm: $!\n";
640
641 $" = "\n\t";
642 warn "Writing $ext$modpname/$modfname.pm\n";
643
644 print PM <<"END";
645 package $module;
646
647 require 5.005_62;
648 use strict;
649 END
650
651 unless( $opt_X || $opt_c || $opt_A ){
652         # we'll have an AUTOLOAD(), and it will have $AUTOLOAD and
653         # will want Carp.
654         print PM <<'END';
655 use Carp;
656 END
657 }
658
659 print PM <<'END';
660
661 require Exporter;
662 END
663
664 print PM <<"END" if ! $opt_X;  # use DynaLoader, unless XS was disabled
665 require DynaLoader;
666 END
667
668
669 # Are we using AutoLoader or not?
670 unless ($opt_A) { # no autoloader whatsoever.
671         unless ($opt_c) { # we're doing the AUTOLOAD
672                 print PM "use AutoLoader;\n";
673         }
674         else {
675                 print PM "use AutoLoader qw(AUTOLOAD);\n"
676         }
677 }
678
679 # Determine @ISA.
680 my $myISA = 'our @ISA = qw(Exporter';   # We seem to always want this.
681 $myISA .= ' DynaLoader'         unless $opt_X;  # no XS
682 $myISA .= ');';
683 print PM "\n$myISA\n\n";
684
685 my @exported_names = (@const_names, @fnames_no_prefix);
686
687 print PM<<"END";
688 # Items to export into callers namespace by default. Note: do not export
689 # names by default without a very good reason. Use EXPORT_OK instead.
690 # Do not simply export all your public functions/methods/constants.
691
692 # This allows declaration       use $module ':all';
693 # If you do not need this, moving things directly into \@EXPORT or \@EXPORT_OK
694 # will save memory.
695 our %EXPORT_TAGS = ( 'all' => [ qw(
696         @exported_names
697 ) ] );
698
699 our \@EXPORT_OK = ( \@{ \$EXPORT_TAGS{'all'} } );
700
701 our \@EXPORT = qw(
702         @const_names
703 );
704 our \$VERSION = '$TEMPLATE_VERSION';
705
706 END
707
708 print PM <<"END" unless $opt_c or $opt_X;
709 sub AUTOLOAD {
710     # This AUTOLOAD is used to 'autoload' constants from the constant()
711     # XS function.  If a constant is not found then control is passed
712     # to the AUTOLOAD in AutoLoader.
713
714     my \$constname;
715     our \$AUTOLOAD;
716     (\$constname = \$AUTOLOAD) =~ s/.*:://;
717     croak "&$module::constant not defined" if \$constname eq 'constant';
718     my \$val = constant(\$constname, \@_ ? \$_[0] : 0);
719     if (\$! != 0) {
720         if (\$! =~ /Invalid/ || \$!{EINVAL}) {
721             \$AutoLoader::AUTOLOAD = \$AUTOLOAD;
722             goto &AutoLoader::AUTOLOAD;
723         }
724         else {
725             croak "Your vendor has not defined $module macro \$constname";
726         }
727     }
728     {
729         no strict 'refs';
730         # Fixed between 5.005_53 and 5.005_61
731         if (\$] >= 5.00561) {
732             *\$AUTOLOAD = sub () { \$val };
733         }
734         else {
735             *\$AUTOLOAD = sub { \$val };
736         }
737     }
738     goto &\$AUTOLOAD;
739 }
740
741 END
742
743 if( ! $opt_X ){ # print bootstrap, unless XS is disabled
744         print PM <<"END";
745 bootstrap $module \$VERSION;
746 END
747 }
748
749 my $after;
750 if( $opt_P ){ # if POD is disabled
751         $after = '__END__';
752 }
753 else {
754         $after = '=cut';
755 }
756
757 print PM <<"END";
758
759 # Preloaded methods go here.
760 END
761
762 print PM <<"END" unless $opt_A;
763
764 # Autoload methods go after $after, and are processed by the autosplit program.
765 END
766
767 print PM <<"END";
768
769 1;
770 __END__
771 END
772
773 my $author = "A. U. Thor";
774 my $email = 'a.u.thor@a.galaxy.far.far.away';
775
776 my $revhist = '';
777 $revhist = <<EOT if $opt_C;
778
779 =head1 HISTORY
780
781 =over 8
782
783 =item $TEMPLATE_VERSION
784
785 Original version; created by h2xs $H2XS_VERSION with options
786
787   @ARGS
788
789 =back
790
791 EOT
792
793 my $exp_doc = <<EOD;
794
795 =head2 EXPORT
796
797 None by default.
798
799 EOD
800 if (@const_names and not $opt_P) {
801   $exp_doc .= <<EOD;
802 =head2 Exportable constants
803
804   @{[join "\n  ", @const_names]}
805
806 EOD
807 }
808 if (defined $fdecls and @$fdecls and not $opt_P) {
809   $exp_doc .= <<EOD;
810 =head2 Exportable functions
811
812 EOD
813   $exp_doc .= <<EOD if $opt_p;
814 When accessing these functions from Perl, prefix C<$opt_p> should be removed.
815
816 EOD
817   $exp_doc .= <<EOD;
818   @{[join "\n  ", @known_fnames{@fnames}]}
819
820 EOD
821 }
822
823 my $pod = <<"END" unless $opt_P;
824 ## Below is stub documentation for your module. You better edit it!
825 #
826 #=head1 NAME
827 #
828 #$module - Perl extension for blah blah blah
829 #
830 #=head1 SYNOPSIS
831 #
832 #  use $module;
833 #  blah blah blah
834 #
835 #=head1 DESCRIPTION
836 #
837 #Stub documentation for $module, created by h2xs. It looks like the
838 #author of the extension was negligent enough to leave the stub
839 #unedited.
840 #
841 #Blah blah blah.
842 #$exp_doc$revhist
843 #=head1 AUTHOR
844 #
845 #$author, $email
846 #
847 #=head1 SEE ALSO
848 #
849 #perl(1).
850 #
851 #=cut
852 END
853
854 $pod =~ s/^\#//gm unless $opt_P;
855 print PM $pod unless $opt_P;
856
857 close PM;
858
859
860 if( ! $opt_X ){ # print XS, unless it is disabled
861 warn "Writing $ext$modpname/$modfname.xs\n";
862
863 print XS <<"END";
864 #include "EXTERN.h"
865 #include "perl.h"
866 #include "XSUB.h"
867
868 END
869 if( @path_h ){
870     foreach my $path_h (@path_h_ini) {
871         my($h) = $path_h;
872         $h =~ s#^/usr/include/##;
873         if ($^O eq 'VMS') { $h =~ s#.*vms\]#sys/# or $h =~ s#.*[:>\]]##; }
874         print XS qq{#include <$h>\n};
875     }
876     print XS "\n";
877 }
878
879 my %pointer_typedefs;
880 my %struct_typedefs;
881
882 sub td_is_pointer {
883   my $type = shift;
884   my $out = $pointer_typedefs{$type};
885   return $out if defined $out;
886   my $otype = $type;
887   $out = ($type =~ /\*$/);
888   # This converts only the guys which do not have trailing part in the typedef
889   if (not $out
890       and $typedef_rex and $type =~ s/($typedef_rex)/$typedefs_pre{$1}/go) {
891     $type = normalize_type($type);
892     print "Is-Pointer: Type mutation via typedefs: $otype ==> $type\n"
893       if $opt_d;
894     $out = td_is_pointer($type);
895   }
896   return ($pointer_typedefs{$otype} = $out);
897 }
898
899 sub td_is_struct {
900   my $type = shift;
901   my $out = $struct_typedefs{$type};
902   return $out if defined $out;
903   my $otype = $type;
904   $out = ($type =~ /^struct\b/) && !td_is_pointer($type);
905   # This converts only the guys which do not have trailing part in the typedef
906   if (not $out
907       and $typedef_rex and $type =~ s/($typedef_rex)/$typedefs_pre{$1}/go) {
908     $type = normalize_type($type);
909     print "Is-Struct: Type mutation via typedefs: $otype ==> $type\n"
910       if $opt_d;
911     $out = td_is_struct($type);
912   }
913   return ($struct_typedefs{$otype} = $out);
914 }
915
916 # Some macros will bomb if you try to return them from a double-returning func.
917 # Say, ((char *)0), or strlen (if somebody #define STRLEN strlen).
918 # Fortunately, we can detect both these cases...
919 sub protect_convert_to_double {
920   my $in = shift;
921   my $val;
922   return '' unless defined ($val = $seen_define{$in});
923   return '(IV)' if $known_fnames{$val};
924   # OUT_t of ((OUT_t)-1):
925   return '' unless $val =~ /^\s*(\(\s*)?\(\s*([^()]*?)\s*\)/;
926   td_is_pointer($2) ? '(IV)' : '';
927 }
928
929 # For each of the generated functions, length($pref) leading
930 # letters are already checked.  Moreover, it is recommended that
931 # the generated functions uses switch on letter at offset at least
932 # $off + length($pref).
933 #
934 # The given list has length($pref) chars removed at front, it is
935 # guarantied that $off leading chars in the rest are the same for all
936 # elts of the list.
937 #
938 # Returns: how at which offset it was decided to make a switch, or -1 if none.
939
940 sub write_const;
941
942 sub write_const {
943   my ($fh, $pref, $off, $list) = (shift,shift,shift,shift);
944   my %leading;
945   my $offarg = length $pref;
946
947   if (@$list == 0) {            # Can happen on the initial iteration only
948     print $fh <<"END";
949 static double
950 constant(char *name, int len, int arg)
951 {
952     errno = EINVAL;
953     return 0;
954 }
955 END
956     return -1;
957   }
958
959   if (@$list == 1) {            # Can happen on the initial iteration only
960     my $protect = protect_convert_to_double("$pref$list->[0]");
961
962     print $fh <<"END";
963 static double
964 constant(char *name, int len, int arg)
965 {
966     errno = 0;
967     if (strEQ(name + $offarg, "$list->[0]")) {  /* $pref removed */
968 #ifdef $pref$list->[0]
969         return $protect$pref$list->[0];
970 #else
971         errno = ENOENT;
972         return 0;
973 #endif
974     }
975     errno = EINVAL;
976     return 0;
977 }
978 END
979     return -1;
980   }
981
982   for my $n (@$list) {
983     my $c = substr $n, $off, 1;
984     $leading{$c} = [] unless exists $leading{$c};
985     push @{$leading{$c}}, substr $n, $off + 1;
986   }
987
988   if (keys(%leading) == 1) {
989     return 1 + write_const $fh, $pref, $off + 1, $list;
990   }
991
992   my $leader = substr $list->[0], 0, $off;
993   foreach my $letter (keys %leading) {
994     write_const $fh, "$pref$leader$letter", 0, $leading{$letter}
995       if @{$leading{$letter}} > 1;
996   }
997
998   my $npref = "_$pref";
999   $npref = '' if $pref eq '';
1000
1001   print $fh <<"END";
1002 static double
1003 constant$npref(char *name, int len, int arg)
1004 {
1005 END
1006
1007   print $fh <<"END" if $npref eq '';
1008     errno = 0;
1009 END
1010
1011   print $fh <<"END" if $off;
1012     if ($offarg + $off >= len ) {
1013         errno = EINVAL;
1014         return 0;
1015     }
1016 END
1017
1018   print $fh <<"END";
1019     switch (name[$offarg + $off]) {
1020 END
1021
1022   foreach my $letter (sort keys %leading) {
1023     my $let = $letter;
1024     $let = '\0' if $letter eq '';
1025
1026     print $fh <<EOP;
1027     case '$let':
1028 EOP
1029     if (@{$leading{$letter}} > 1) {
1030       # It makes sense to call a function
1031       if ($off) {
1032         print $fh <<EOP;
1033         if (!strnEQ(name + $offarg,"$leader", $off))
1034             break;
1035 EOP
1036       }
1037       print $fh <<EOP;
1038         return constant_$pref$leader$letter(name, len, arg);
1039 EOP
1040     }
1041     else {
1042       # Do it ourselves
1043       my $protect
1044         = protect_convert_to_double("$pref$leader$letter$leading{$letter}[0]");
1045
1046       print $fh <<EOP;
1047         if (strEQ(name + $offarg, "$leader$letter$leading{$letter}[0]")) {      /* $pref removed */
1048 #ifdef $pref$leader$letter$leading{$letter}[0]
1049             return $protect$pref$leader$letter$leading{$letter}[0];
1050 #else
1051             goto not_there;
1052 #endif
1053         }
1054 EOP
1055     }
1056   }
1057   print $fh <<"END";
1058     }
1059     errno = EINVAL;
1060     return 0;
1061
1062 not_there:
1063     errno = ENOENT;
1064     return 0;
1065 }
1066
1067 END
1068
1069 }
1070
1071 if( ! $opt_c ) {
1072   print XS <<"END";
1073 static int
1074 not_here(char *s)
1075 {
1076     croak("$module::%s not implemented on this architecture", s);
1077     return -1;
1078 }
1079
1080 END
1081
1082   write_const(\*XS, '', 0, \@const_names);
1083 }
1084
1085 my $prefix;
1086 $prefix = "PREFIX = $opt_p" if defined $opt_p;
1087
1088 # Now switch from C to XS by issuing the first MODULE declaration:
1089 print XS <<"END";
1090
1091 MODULE = $module                PACKAGE = $module               $prefix
1092
1093 END
1094
1095 foreach (sort keys %const_xsub) {
1096     print XS <<"END";
1097 char *
1098 $_()
1099
1100     CODE:
1101 #ifdef $_
1102         RETVAL = $_;
1103 #else
1104         croak("Your vendor has not defined the $module macro $_");
1105 #endif
1106
1107     OUTPUT:
1108         RETVAL
1109
1110 END
1111 }
1112
1113 # If a constant() function was written then output a corresponding
1114 # XS declaration:
1115 print XS <<"END" unless $opt_c;
1116
1117 double
1118 constant(sv,arg)
1119     PREINIT:
1120         STRLEN          len;
1121     INPUT:
1122         SV *            sv
1123         char *          s = SvPV(sv, len);
1124         int             arg
1125     CODE:
1126         RETVAL = constant(s,len,arg);
1127     OUTPUT:
1128         RETVAL
1129
1130 END
1131
1132 my %seen_decl;
1133 my %typemap;
1134
1135 sub print_decl {
1136   my $fh = shift;
1137   my $decl = shift;
1138   my ($type, $name, $args) = @$decl;
1139   return if $seen_decl{$name}++; # Need to do the same for docs as well?
1140
1141   my @argnames = map {$_->[1]} @$args;
1142   my @argtypes = map { normalize_type( $_->[0], 1 ) } @$args;
1143   my @argarrays = map { $_->[4] || '' } @$args;
1144   my $numargs = @$args;
1145   if ($numargs and $argtypes[-1] eq '...') {
1146     $numargs--;
1147     $argnames[-1] = '...';
1148   }
1149   local $" = ', ';
1150   $type = normalize_type($type, 1);
1151
1152   print $fh <<"EOP";
1153
1154 $type
1155 $name(@argnames)
1156 EOP
1157
1158   for my $arg (0 .. $numargs - 1) {
1159     print $fh <<"EOP";
1160         $argtypes[$arg] $argnames[$arg]$argarrays[$arg]
1161 EOP
1162   }
1163 }
1164
1165 sub print_accessors {
1166   my($fh, $name, $struct) = @_;
1167   return unless defined $struct && $name !~ /\s|_ANON/;
1168   $name = normalize_type($name);
1169   my $ptrname = normalize_type("$name *");
1170   printf $fh <<"EOF";
1171
1172 MODULE = $module                PACKAGE = ${name}Ptr            $prefix
1173
1174 EOF
1175   my @items = @$struct;
1176   while (@items) {
1177     my $item = shift @items;
1178     if ($item->[0] =~ /_ANON/) {
1179       if (defined $item->[1]) {
1180         push @items, map [
1181           $_->[0], "$item->[1]_$_->[1]", "$item->[1].$_->[1]"
1182         ], @{ $structs{$item->[0]} };
1183       } else {
1184         push @items, @{ $structs{$item->[0]} };
1185       }
1186     } else {
1187       my $type = normalize_type($item->[0]);
1188       print $fh <<"EOF";
1189 $type
1190 $item->[1](THIS, __value = NO_INIT)
1191         $ptrname THIS
1192         $type __value
1193     PROTOTYPE: \$;\$
1194     CODE:
1195         RETVAL = THIS->$item->[-1];
1196         if (items > 1)
1197             THIS->$item->[-1] = __value;
1198     OUTPUT:
1199         RETVAL
1200
1201 EOF
1202     }
1203   }
1204 }
1205
1206 # Should be called before any actual call to normalize_type().
1207 sub get_typemap {
1208   # We do not want to read ./typemap by obvios reasons.
1209   my @tm =  qw(../../../typemap ../../typemap ../typemap);
1210   my $stdtypemap =  "$Config::Config{privlib}/ExtUtils/typemap";
1211   unshift @tm, $stdtypemap;
1212   my $proto_re = "[" . quotemeta('\$%&*@;') . "]" ;
1213
1214   # Start with useful default values
1215   $typemap{float} = 'T_DOUBLE';
1216
1217   foreach my $typemap (@tm) {
1218     next unless -e $typemap ;
1219     # skip directories, binary files etc.
1220     warn " Scanning $typemap\n";
1221     warn("Warning: ignoring non-text typemap file '$typemap'\n"), next 
1222       unless -T $typemap ;
1223     open(TYPEMAP, $typemap) 
1224       or warn ("Warning: could not open typemap file '$typemap': $!\n"), next;
1225     my $mode = 'Typemap';
1226     while (<TYPEMAP>) {
1227       next if /^\s*\#/;
1228       if (/^INPUT\s*$/)   { $mode = 'Input'; next; }
1229       elsif (/^OUTPUT\s*$/)  { $mode = 'Output'; next; }
1230       elsif (/^TYPEMAP\s*$/) { $mode = 'Typemap'; next; }
1231       elsif ($mode eq 'Typemap') {
1232         next if /^\s*($|\#)/ ;
1233         my ($type, $image);
1234         if ( ($type, $image) =
1235              /^\s*(.*?\S)\s+(\S+)\s*($proto_re*)\s*$/o
1236              # This may reference undefined functions:
1237              and not ($image eq 'T_PACKED' and $typemap eq $stdtypemap)) {
1238           $typemap{normalize_type($type)} = $image;
1239         }
1240       }
1241     }
1242     close(TYPEMAP) or die "Cannot close $typemap: $!";
1243   }
1244   %std_types = %types_seen;
1245   %types_seen = ();
1246 }
1247
1248
1249 sub normalize_type {            # Second arg: do not strip const's before \*
1250   my $type = shift;
1251   my $do_keep_deep_const = shift;
1252   # If $do_keep_deep_const this is heuristical only
1253   my $keep_deep_const = ($do_keep_deep_const ? '\b(?![^(,)]*\*)' : '');
1254   my $ignore_mods 
1255     = "(?:\\b(?:(?:__const__|const)$keep_deep_const|static|inline|__inline__)\\b\\s*)*";
1256   if ($do_keep_deep_const) {    # Keep different compiled /RExen/o separately!
1257     $type =~ s/$ignore_mods//go;
1258   }
1259   else {
1260     $type =~ s/$ignore_mods//go;
1261   }
1262   $type =~ s/([^\s\w])/ \1 /g;
1263   $type =~ s/\s+$//;
1264   $type =~ s/^\s+//;
1265   $type =~ s/\s+/ /g;
1266   $type =~ s/\* (?=\*)/*/g;
1267   $type =~ s/\. \. \./.../g;
1268   $type =~ s/ ,/,/g;
1269   $types_seen{$type}++ 
1270     unless $type eq '...' or $type eq 'void' or $std_types{$type};
1271   $type;
1272 }
1273
1274 my $need_opaque;
1275
1276 sub assign_typemap_entry {
1277   my $type = shift;
1278   my $otype = $type;
1279   my $entry;
1280   if ($tmask and $type =~ /$tmask/) {
1281     print "Type $type matches -o mask\n" if $opt_d;
1282     $entry = (td_is_struct($type) ? "T_OPAQUE_STRUCT" : "T_PTROBJ");
1283   }
1284   elsif ($typedef_rex and $type =~ s/($typedef_rex)/$typedefs_pre{$1}/go) {
1285     $type = normalize_type $type;
1286     print "Type mutation via typedefs: $otype ==> $type\n" if $opt_d;
1287     $entry = assign_typemap_entry($type);
1288   }
1289   $entry ||= $typemap{$otype}
1290     || (td_is_struct($type) ? "T_OPAQUE_STRUCT" : "T_PTROBJ");
1291   $typemap{$otype} = $entry;
1292   $need_opaque = 1 if $entry eq "T_OPAQUE_STRUCT";
1293   return $entry;
1294 }
1295
1296 if ($opt_x) {
1297     for my $decl (@$fdecls_parsed) { print_decl(\*XS, $decl) }
1298     if ($opt_a) {
1299         while (my($name, $struct) = each %structs) {
1300             print_accessors(\*XS, $name, $struct);
1301         }
1302     }
1303 }
1304
1305 close XS;
1306
1307 if (%types_seen) {
1308   my $type;
1309   warn "Writing $ext$modpname/typemap\n";
1310   open TM, ">typemap" or die "Cannot open typemap file for write: $!";
1311
1312   for $type (sort keys %types_seen) {
1313     my $entry = assign_typemap_entry $type;
1314     print TM $type, "\t" x (5 - int((length $type)/8)), "\t$entry\n"
1315   }
1316
1317   print TM <<'EOP' if $need_opaque; # Older Perls do not have correct entry
1318 #############################################################################
1319 INPUT
1320 T_OPAQUE_STRUCT
1321         if (sv_derived_from($arg, \"${ntype}\")) {
1322             STRLEN len;
1323             char  *s = SvPV((SV*)SvRV($arg), len);
1324
1325             if (len != sizeof($var))
1326                 croak(\"Size %d of packed data != expected %d\",
1327                         len, sizeof($var));
1328             $var = *($type *)s;
1329         }
1330         else
1331             croak(\"$var is not of type ${ntype}\")
1332 #############################################################################
1333 OUTPUT
1334 T_OPAQUE_STRUCT
1335         sv_setref_pvn($arg, \"${ntype}\", (char *)&$var, sizeof($var));
1336 EOP
1337
1338   close TM or die "Cannot close typemap file for write: $!";
1339 }
1340
1341 } # if( ! $opt_X )
1342
1343 warn "Writing $ext$modpname/Makefile.PL\n";
1344 open(PL, ">Makefile.PL") || die "Can't create $ext$modpname/Makefile.PL: $!\n";
1345
1346 print PL <<END;
1347 use ExtUtils::MakeMaker;
1348 # See lib/ExtUtils/MakeMaker.pm for details of how to influence
1349 # the contents of the Makefile that is written.
1350 WriteMakefile(
1351     'NAME'              => '$module',
1352     'VERSION_FROM'      => '$modfname.pm', # finds \$VERSION
1353     'PREREQ_PM'         => {}, # e.g., Module::Name => 1.1
1354 END
1355 if (!$opt_X) { # print C stuff, unless XS is disabled
1356   $opt_F = '' unless defined $opt_F;
1357   print PL <<END;
1358     'LIBS'              => ['$extralibs'], # e.g., '-lm'
1359     'DEFINE'            => '$opt_F', # e.g., '-DHAVE_SOMETHING'
1360     'INC'               => '', # e.g., '-I/usr/include/other'
1361 END
1362 }
1363 print PL ");\n";
1364 close(PL) || die "Can't close $ext$modpname/Makefile.PL: $!\n";
1365
1366 warn "Writing $ext$modpname/test.pl\n";
1367 open(EX, ">test.pl") || die "Can't create $ext$modpname/test.pl: $!\n";
1368 print EX <<'_END_';
1369 # Before `make install' is performed this script should be runnable with
1370 # `make test'. After `make install' it should work as `perl test.pl'
1371
1372 ######################### We start with some black magic to print on failure.
1373
1374 # Change 1..1 below to 1..last_test_to_print .
1375 # (It may become useful if the test is moved to ./t subdirectory.)
1376
1377 BEGIN { $| = 1; print "1..1\n"; }
1378 END {print "not ok 1\n" unless $loaded;}
1379 _END_
1380 print EX <<_END_;
1381 use $module;
1382 _END_
1383 print EX <<'_END_';
1384 $loaded = 1;
1385 print "ok 1\n";
1386
1387 ######################### End of black magic.
1388
1389 # Insert your test code below (better if it prints "ok 13"
1390 # (correspondingly "not ok 13") depending on the success of chunk 13
1391 # of the test code):
1392
1393 _END_
1394 close(EX) || die "Can't close $ext$modpname/test.pl: $!\n";
1395
1396 unless ($opt_C) {
1397   warn "Writing $ext$modpname/Changes\n";
1398   $" = ' ';
1399   open(EX, ">Changes") || die "Can't create $ext$modpname/Changes: $!\n";
1400   @ARGS = map {/[\s\"\'\`\$*?^|&<>\[\]\{\}\(\)]/ ? "'$_'" : $_} @ARGS;
1401   print EX <<EOP;
1402 Revision history for Perl extension $module.
1403
1404 $TEMPLATE_VERSION  @{[scalar localtime]}
1405 \t- original version; created by h2xs $H2XS_VERSION with options
1406 \t\t@ARGS
1407
1408 EOP
1409   close(EX) || die "Can't close $ext$modpname/Changes: $!\n";
1410 }
1411
1412 warn "Writing $ext$modpname/MANIFEST\n";
1413 open(MANI,'>MANIFEST') or die "Can't create MANIFEST: $!";
1414 my @files = <*>;
1415 if (!@files) {
1416   eval {opendir(D,'.');};
1417   unless ($@) { @files = readdir(D); closedir(D); }
1418 }
1419 if (!@files) { @files = map {chomp && $_} `ls`; }
1420 if ($^O eq 'VMS') {
1421   foreach (@files) {
1422     # Clip trailing '.' for portability -- non-VMS OSs don't expect it
1423     s%\.$%%;
1424     # Fix up for case-sensitive file systems
1425     s/$modfname/$modfname/i && next;
1426     $_ = "\U$_" if $_ eq 'manifest' or $_ eq 'changes';
1427     $_ = 'Makefile.PL' if $_ eq 'makefile.pl';
1428   }
1429 }
1430 print MANI join("\n",@files), "\n";
1431 close MANI;
1432 !NO!SUBS!
1433
1434 close OUT or die "Can't close $file: $!";
1435 chmod 0755, $file or die "Can't reset permissions for $file: $!\n";
1436 exec("$Config{'eunicefix'} $file") if $Config{'eunicefix'} ne ':';
1437 chdir $origdir;