fix optimizer bug in /^(?p{"a"})b/ (from Ilya Zakharevich)
[p5sagit/p5-mst-13.2.git] / utils / h2xs.PL
CommitLineData
4633a7c4 1#!/usr/local/bin/perl
2
3use Config;
4use File::Basename qw(&basename &dirname);
8a5546a1 5use Cwd;
4633a7c4 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.
8a5546a1 16$origdir = cwd;
44a8e56a 17chdir dirname($0);
18$file = basename($0, '.PL');
774d564b 19$file .= '.com' if $^O eq 'VMS';
4633a7c4 20
21open OUT,">$file" or die "Can't create $file: $!";
22
23print "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
28print OUT <<"!GROK!THIS!";
5f05dabc 29$Config{startperl}
30 eval 'exec $Config{perlpath} -S \$0 \${1+"\$@"}'
31 if \$running_under_some_shell;
40000a8c 32!GROK!THIS!
33
4633a7c4 34# In the following, perl variables are not expanded during extraction.
35
36print OUT <<'!NO!SUBS!';
cf35f3c1 37
3edbfbe5 38=head1 NAME
39
40h2xs - convert .h C header files to Perl extensions
41
42=head1 SYNOPSIS
43
c0f8b9cd 44B<h2xs> [B<-ACOPXcdf>] [B<-v> version] [B<-n> module_name] [B<-p> prefix] [B<-s> sub] [headerfile ... [extra_libraries]]
f508c652 45
46B<h2xs> B<-h>
3edbfbe5 47
48=head1 DESCRIPTION
49
a887ff11 50I<h2xs> builds a Perl extension from C header files. The extension
51will include functions which can be used to retrieve the value of any
52#define statement which was in the C header files.
3edbfbe5 53
54The I<module_name> will be used for the name of the extension. If
a887ff11 55module_name is not supplied then the name of the first header file
56will be used, with the first character capitalized.
3edbfbe5 57
58If the extension might need extra libraries, they should be included
59here. The extension Makefile.PL will take care of checking whether
60the libraries actually exist and how they should be loaded.
61The extra libraries should be specified in the form -lm -lposix, etc,
62just as on the cc command line. By default, the Makefile.PL will
63search through the library path determined by Configure. That path
64can be augmented by including arguments of the form B<-L/another/library/path>
65in the extra-libraries argument.
66
67=head1 OPTIONS
68
69=over 5
70
f508c652 71=item B<-A>
3edbfbe5 72
f508c652 73Omit all autoload facilities. This is the same as B<-c> but also removes the
9ef261b5 74S<C<use AutoLoader>> statement from the .pm file.
3edbfbe5 75
c0f8b9cd 76=item B<-C>
77
78Omits creation of the F<Changes> file, and adds a HISTORY section to
79the POD template.
80
b73edd97 81=item B<-F>
82
83Additional flags to specify to C preprocessor when scanning header for
ddf6bed1 84function declarations. Should not be used without B<-x>.
85
86=item B<-M> I<regular expression>
87
88selects functions/macros to process.
b73edd97 89
2920c5d2 90=item B<-O>
91
92Allows a pre-existing extension directory to be overwritten.
93
f508c652 94=item B<-P>
3edbfbe5 95
f508c652 96Omit the autogenerated stub POD section.
3edbfbe5 97
b73edd97 98=item B<-X>
99
100Omit the XS portion. Used to generate templates for a module which is not
9ef261b5 101XS-based. C<-c> and C<-f> are implicitly enabled.
b73edd97 102
7c1d48a5 103=item B<-a>
104
105Generate an accessor method for each element of structs and unions. The
106generated methods are named after the element name; will return the current
107value of the element if called without additional arguments; and will set
108the element to the supplied value (and return the old value) if called with
109an additional argument.
110
3edbfbe5 111=item B<-c>
112
113Omit C<constant()> from the .xs file and corresponding specialised
114C<AUTOLOAD> from the .pm file.
115
b73edd97 116=item B<-d>
117
118Turn on debugging messages.
119
f508c652 120=item B<-f>
3edbfbe5 121
f508c652 122Allows an extension to be created for a header even if that header is
ddf6bed1 123not found in standard include directories.
f508c652 124
125=item B<-h>
126
127Print the usage, help and version for this h2xs and exit.
128
129=item B<-n> I<module_name>
130
131Specifies a name to be used for the extension, e.g., S<-n RPC::DCE>
132
ddf6bed1 133=item B<-o> I<regular expression>
134
135Use "opaque" data type for the C types matched by the regular
136expression, even if these types are C<typedef>-equivalent to types
137from typemaps. Should not be used without B<-x>.
138
139This may be useful since, say, types which are C<typedef>-equivalent
140to integers may represent OS-related handles, and one may want to work
141with these handles in OO-way, as in C<$handle-E<gt>do_something()>.
142Use C<-o .> if you want to handle all the C<typedef>ed types as opaque types.
143
144The type-to-match is whitewashed (except for commas, which have no
145whitespace before them, and multiple C<*> which have no whitespace
146between them).
147
ead2a595 148=item B<-p> I<prefix>
149
150Specify a prefix which should be removed from the Perl function names, e.g., S<-p sec_rgy_>
151This sets up the XS B<PREFIX> keyword and removes the prefix from functions that are
98a6f11e 152autoloaded via the C<constant()> mechanism.
ead2a595 153
154=item B<-s> I<sub1,sub2>
155
156Create a perl subroutine for the specified macros rather than autoload with the constant() subroutine.
157These macros are assumed to have a return type of B<char *>, e.g., S<-s sec_rgy_wildcard_name,sec_rgy_wildcard_sid>.
158
f508c652 159=item B<-v> I<version>
160
161Specify a version number for this extension. This version number is added
162to the templates. The default is 0.01.
3edbfbe5 163
760ac839 164=item B<-x>
165
166Automatically generate XSUBs basing on function declarations in the
167header file. The package C<C::Scan> should be installed. If this
168option is specified, the name of the header file may look like
169C<NAME1,NAME2>. In this case NAME1 is used instead of the specified string,
b73edd97 170but XSUBs are emitted only for the declarations included from file NAME2.
760ac839 171
5273d82d 172Note that some types of arguments/return-values for functions may
173result in XSUB-declarations/typemap-entries which need
174hand-editing. Such may be objects which cannot be converted from/to a
ddf6bed1 175pointer (like C<long long>), pointers to functions, or arrays. See
176also the section on L<LIMITATIONS of B<-x>>.
5273d82d 177
3edbfbe5 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
ead2a595 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
3edbfbe5 217
5273d82d 218 # Make XS without defines in perl.h, but with function declarations
760ac839 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.
5273d82d 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
760ac839 225
226 # Same with function declaration in proto.h as visible from perl.h.
5273d82d 227 h2xs -xAn perl2 perl.h,proto.h
760ac839 228
ddf6bed1 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
3edbfbe5 235=head1 ENVIRONMENT
236
237No environment variables are used.
238
239=head1 AUTHOR
240
241Larry Wall and others
242
243=head1 SEE ALSO
244
f508c652 245L<perl>, L<perlxstut>, L<ExtUtils::MakeMaker>, and L<AutoLoader>.
3edbfbe5 246
247=head1 DIAGNOSTICS
248
760ac839 249The usual warnings if it cannot read or write the files involved.
3edbfbe5 250
ddf6bed1 251=head1 LIMITATIONS of B<-x>
252
253F<h2xs> would not distinguish whether an argument to a C function
254which is of the form, say, C<int *>, is an input, output, or
255input/output parameter. In particular, argument declarations of the
256form
257
258 int
259 foo(n)
260 int *n
261
262should be better rewritten as
263
264 int
265 foo(n)
266 int &n
267
268if C<n> is an input parameter.
269
270Additionally, F<h2xs> has no facilities to intuit that a function
271
272 int
273 foo(addr,l)
274 char *addr
275 int l
276
277takes a pair of address and length of data at this address, so it is better
278to rewrite this function as
279
280 int
281 foo(sv)
7aff18a2 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
ddf6bed1 291
292or 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
309See L<perlxs> and L<perlxstut> for additional details.
310
3edbfbe5 311=cut
312
3cb4da91 313use strict;
314
315
ddf6bed1 316my( $H2XS_VERSION ) = ' $Revision: 1.20 $ ' =~ /\$Revision:\s+([^\s]+)/;
f508c652 317my $TEMPLATE_VERSION = '0.01';
ddf6bed1 318my @ARGS = @ARGV;
a0d0e21e 319
320use Getopt::Std;
321
e1666bf5 322sub usage{
323 warn "@_\n" if @_;
c0f8b9cd 324 die "h2xs [-ACOPXcdfh] [-v version] [-n module_name] [-p prefix] [-s subs] [headerfile [extra_libraries]]
f508c652 325version: $H2XS_VERSION
3edbfbe5 326 -A Omit all autoloading facilities (implies -c).
c0f8b9cd 327 -C Omit creating the Changes file, add HISTORY heading to stub POD.
b73edd97 328 -F Additional flags for C preprocessor (used with -x).
ddf6bed1 329 -M Mask to select C functions/macros (default is select all).
2920c5d2 330 -O Allow overwriting of a pre-existing extension directory.
f508c652 331 -P Omit the stub POD section.
9ef261b5 332 -X Omit the XS portion (implies both -c and -f).
7c1d48a5 333 -a Generate get/set accessors for struct and union members (used with -x).
b73edd97 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).
ddf6bed1 339 -o Regular expression for \"opaque\" types.
b73edd97 340 -p Specify a prefix which should be removed from the Perl function names.
341 -s Create subroutines for specified macros.
f508c652 342 -v Specify a version number for this extension.
760ac839 343 -x Autogenerate XSUBs using C::Scan.
e1666bf5 344extra_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.
f508c652 347";
e1666bf5 348}
a0d0e21e 349
a0d0e21e 350
7c1d48a5 351getopts("ACF:M:OPXacdfhn:o:p:s:v:x") || usage;
352use vars qw($opt_A $opt_C $opt_F $opt_M $opt_O $opt_P $opt_X $opt_a $opt_c
3cb4da91 353 $opt_d $opt_f $opt_h $opt_n $opt_o $opt_p $opt_s $opt_v $opt_x);
a0d0e21e 354
e1666bf5 355usage if $opt_h;
f508c652 356
357if( $opt_v ){
358 $TEMPLATE_VERSION = $opt_v;
359}
9ef261b5 360
361# -A implies -c.
e1666bf5 362$opt_c = 1 if $opt_A;
9ef261b5 363
364# -X implies -c and -f
365$opt_c = $opt_f = 1 if $opt_X;
366
3cb4da91 367my %const_xsub = map { $_,1 } split(/,+/, $opt_s) if $opt_s;
368my $extralibs;
369my @path_h;
a0d0e21e 370
a887ff11 371while (my $arg = shift) {
372 if ($arg =~ /^-l/i) {
373 $extralibs = "$arg @ARGV";
374 last;
375 }
376 push(@path_h, $arg);
377}
e1666bf5 378
379usage "Must supply header file or module name\n"
a887ff11 380 unless (@path_h or $opt_n);
e1666bf5 381
ddf6bed1 382my $fmask;
3cb4da91 383my $tmask;
ddf6bed1 384
385$fmask = qr{$opt_M} if defined $opt_M;
386$tmask = qr{$opt_o} if defined $opt_o;
387my $tmask_all = $tmask && $opt_o eq '.';
388
389if ($opt_x) {
390 eval {require C::Scan; 1}
391 or die <<EOD;
392C::Scan required if you use -x option.
393To install C::Scan, execute
394 perl -MCPAN -e "install C::Scan"
395EOD
396 unless ($tmask_all) {
397 $C::Scan::VERSION >= 0.70
398 or die <<EOD;
399C::Scan v. 0.70 or later required unless you use -o . option.
400You have version $C::Scan::VERSION installed as $INC{'C/Scan.pm'}.
401To install C::Scan, execute
402 perl -MCPAN -e "install C::Scan"
403EOD
404 }
7aff18a2 405}
406elsif ($opt_o or $opt_F) {
ddf6bed1 407 warn <<EOD;
408Options -o and -F do not make sense without -x.
409EOD
410}
411
3cb4da91 412my @path_h_ini = @path_h;
413my ($name, %fullpath, %prefix, %seen_define, %prefixless, %const_names);
a0d0e21e 414
a887ff11 415if( @path_h ){
ddf6bed1 416 use Config;
417 use File::Spec;
418 my @paths;
419 if ($^O eq 'VMS') { # Consider overrides of default location
3cb4da91 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;
7aff18a2 423 @paths = qw( Sys$Library VAXC$Include );
ddf6bed1 424 push @paths, ($hadsys ? 'GNU_CC_Include[vms]' : 'GNU_CC_Include[000000]');
425 push @paths, qw( DECC$Library_Include DECC$System_Include );
7aff18a2 426 }
427 else {
ddf6bed1 428 @paths = (File::Spec->curdir(), $Config{usrinc},
429 (split ' ', $Config{locincpth}), '/usr/include');
430 }
a887ff11 431 foreach my $path_h (@path_h) {
432 $name ||= $path_h;
e1666bf5 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$/;
3cb4da91 437 my $fullpath = $path_h;
760ac839 438 $path_h =~ s/,.*$// if $opt_x;
3cb4da91 439 $fullpath{$path_h} = $fullpath;
ddf6bed1 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 }
ead2a595 446 }
5273d82d 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
a887ff11 452 # Function prototypes are processed below.
5273d82d 453 open(CH, "<$path_h") || die "Can't open $path_h: $!\n";
ddf6bed1 454 defines:
5273d82d 455 while (<CH>) {
3cb4da91 456 if (/^[ \t]*#[ \t]*define\s+([\$\w]+)\b(?!\()\s*(?=[^" \t])(.*)/) {
ddf6bed1 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;
e1666bf5 472 next if /^_.*_h_*$/i; # special case, but for what?
760ac839 473 if (defined $opt_p) {
5273d82d 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 }
ead2a595 480 }
ddf6bed1 481 $prefixless{$def} = $_;
482 if (!$fmask or /$fmask/) {
483 print "... Passes mask of -M.\n" if $opt_d and $fmask;
484 $const_names{$_}++;
485 }
5273d82d 486 }
487 }
488 close(CH);
e1666bf5 489 }
a887ff11 490 }
a0d0e21e 491}
492
e1666bf5 493
3cb4da91 494my $module = $opt_n || do {
a0d0e21e 495 $name =~ s/\.h$//;
496 if( $name !~ /::/ ){
497 $name =~ s#^.*/##;
498 $name = "\u$name";
499 }
500 $name;
501};
502
3cb4da91 503my ($ext, $nested, @modparts, $modfname, $modpname);
8e07c86e 504(chdir 'ext', $ext = 'ext/') if -d 'ext';
a0d0e21e 505
506if( $module =~ /::/ ){
507 $nested = 1;
508 @modparts = split(/::/,$module);
509 $modfname = $modparts[-1];
510 $modpname = join('/',@modparts);
511}
512else {
513 $nested = 0;
514 @modparts = ();
515 $modfname = $modpname = $module;
516}
517
518
2920c5d2 519if ($opt_O) {
520 warn "Overwriting existing $ext$modpname!!!\n" if -e $modpname;
7aff18a2 521}
522else {
2920c5d2 523 die "Won't overwrite existing $ext$modpname\n" if -e $modpname;
524}
c07a80fd 525if( $nested ){
3cb4da91 526 my $modpath = "";
c07a80fd 527 foreach (@modparts){
528 mkdir("$modpath$_", 0777);
529 $modpath .= "$_/";
530 }
531}
a0d0e21e 532mkdir($modpname, 0777);
8e07c86e 533chdir($modpname) || die "Can't chdir $ext$modpname: $!\n";
a0d0e21e 534
5273d82d 535my %types_seen;
536my %std_types;
f4d63e4e 537my $fdecls = [];
538my $fdecls_parsed = [];
ddf6bed1 539my $typedef_rex;
540my %typedefs_pre;
541my %known_fnames;
7c1d48a5 542my %structs;
5273d82d 543
3cb4da91 544my @fnames;
545my @fnames_no_prefix;
5273d82d 546
2920c5d2 547if( ! $opt_X ){ # use XS, unless it was disabled
548 open(XS, ">$modfname.xs") || die "Can't create $ext$modpname/$modfname.xs: $!\n";
5273d82d 549 if ($opt_x) {
5273d82d 550 require Config; # Run-time directive
551 warn "Scanning typemaps...\n";
552 get_typemap();
3cb4da91 553 my @td;
554 my @good_td;
555 my $addflags = $opt_F || '';
556
f4d63e4e 557 foreach my $filename (@path_h) {
3cb4da91 558 my $c;
559 my $filter;
560
561 if ($fullpath{$filename} =~ /,/) {
f4d63e4e 562 $filename = $`;
563 $filter = $';
564 }
565 warn "Scanning $filename for functions...\n";
566 $c = new C::Scan 'filename' => $filename, 'filename_filter' => $filter,
7c1d48a5 567 'add_cppflags' => $addflags, 'c_styles' => [qw(C++ C9X)];
f4d63e4e 568 $c->set('includeDirs' => ["$Config::Config{archlib}/CORE"]);
ddf6bed1 569
f4d63e4e 570 push @$fdecls_parsed, @{ $c->get('parsed_fdecls') };
571 push(@$fdecls, @{$c->get('fdecls')});
3cb4da91 572
573 push @td, @{$c->get('typedefs_maybe')};
7c1d48a5 574 if ($opt_a) {
575 my $structs = $c->get('typedef_structs');
576 @structs{keys %$structs} = values %$structs;
577 }
3cb4da91 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);
5273d82d 590 }
ddf6bed1 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 }
3cb4da91 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} ];
ddf6bed1 608 }
3cb4da91 609 @fnames_no_prefix = @fnames;
610 @fnames_no_prefix
611 = sort map { ++$prefix{$_} if s/^$opt_p(?!\d)//; $_ } @fnames_no_prefix;
ddf6bed1 612 # Remove macros which expand to typedefs
ddf6bed1 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;
5273d82d 634 }
5273d82d 635 }
2920c5d2 636}
3cb4da91 637my @const_names = sort keys %const_names;
5273d82d 638
8e07c86e 639open(PM, ">$modfname.pm") || die "Can't create $ext$modpname/$modfname.pm: $!\n";
a0d0e21e 640
a0d0e21e 641$" = "\n\t";
8e07c86e 642warn "Writing $ext$modpname/$modfname.pm\n";
a0d0e21e 643
a0d0e21e 644print PM <<"END";
645package $module;
646
51fac20b 647require 5.005_62;
2920c5d2 648use strict;
649END
650
aba05478 651unless( $opt_X || $opt_c || $opt_A ){
2920c5d2 652 # we'll have an AUTOLOAD(), and it will have $AUTOLOAD and
653 # will want Carp.
654 print PM <<'END';
655use Carp;
2920c5d2 656END
657}
658
659print PM <<'END';
660
a0d0e21e 661require Exporter;
2920c5d2 662END
663
664print PM <<"END" if ! $opt_X; # use DynaLoader, unless XS was disabled
a0d0e21e 665require DynaLoader;
3edbfbe5 666END
667
e1666bf5 668
9ef261b5 669# Are we using AutoLoader or not?
670unless ($opt_A) { # no autoloader whatsoever.
671 unless ($opt_c) { # we're doing the AUTOLOAD
672 print PM "use AutoLoader;\n";
2920c5d2 673 }
9ef261b5 674 else {
675 print PM "use AutoLoader qw(AUTOLOAD);\n"
2920c5d2 676 }
3edbfbe5 677}
3edbfbe5 678
9ef261b5 679# Determine @ISA.
77ca0c92 680my $myISA = 'our @ISA = qw(Exporter'; # We seem to always want this.
9ef261b5 681$myISA .= ' DynaLoader' unless $opt_X; # no XS
682$myISA .= ');';
683print PM "\n$myISA\n\n";
e1666bf5 684
3cb4da91 685my @exported_names = (@const_names, @fnames_no_prefix);
686
3edbfbe5 687print PM<<"END";
e1666bf5 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.
ddf6bed1 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.
51fac20b 695our %EXPORT_TAGS = ( 'all' => [ qw(
3cb4da91 696 @exported_names
ddf6bed1 697) ] );
698
51fac20b 699our \@EXPORT_OK = ( \@{ \$EXPORT_TAGS{'all'} } );
ddf6bed1 700
77ca0c92 701our \@EXPORT = qw(
e1666bf5 702 @const_names
a0d0e21e 703);
77ca0c92 704our \$VERSION = '$TEMPLATE_VERSION';
f508c652 705
e1666bf5 706END
707
2920c5d2 708print PM <<"END" unless $opt_c or $opt_X;
a0d0e21e 709sub AUTOLOAD {
3edbfbe5 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.
e1666bf5 713
2920c5d2 714 my \$constname;
65346fe1 715 our \$AUTOLOAD;
a0d0e21e 716 (\$constname = \$AUTOLOAD) =~ s/.*:://;
1d3434b8 717 croak "&$module::constant not defined" if \$constname eq 'constant';
2920c5d2 718 my \$val = constant(\$constname, \@_ ? \$_[0] : 0);
a0d0e21e 719 if (\$! != 0) {
265f5c4a 720 if (\$! =~ /Invalid/ || \$!{EINVAL}) {
a0d0e21e 721 \$AutoLoader::AUTOLOAD = \$AUTOLOAD;
722 goto &AutoLoader::AUTOLOAD;
723 }
724 else {
7aff18a2 725 croak "Your vendor has not defined $module macro \$constname";
a0d0e21e 726 }
727 }
7aff18a2 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 }
ddf6bed1 737 }
a0d0e21e 738 goto &\$AUTOLOAD;
739}
740
a0d0e21e 741END
a0d0e21e 742
2920c5d2 743if( ! $opt_X ){ # print bootstrap, unless XS is disabled
744 print PM <<"END";
f508c652 745bootstrap $module \$VERSION;
2920c5d2 746END
747}
748
3cb4da91 749my $after;
2920c5d2 750if( $opt_P ){ # if POD is disabled
751 $after = '__END__';
752}
753else {
754 $after = '=cut';
755}
756
757print PM <<"END";
a0d0e21e 758
e1666bf5 759# Preloaded methods go here.
9ef261b5 760END
761
762print PM <<"END" unless $opt_A;
a0d0e21e 763
2920c5d2 764# Autoload methods go after $after, and are processed by the autosplit program.
9ef261b5 765END
766
767print PM <<"END";
a0d0e21e 768
7691;
e1666bf5 770__END__
a0d0e21e 771END
a0d0e21e 772
3cb4da91 773my $author = "A. U. Thor";
774my $email = 'a.u.thor@a.galaxy.far.far.away';
f508c652 775
c0f8b9cd 776my $revhist = '';
777$revhist = <<EOT if $opt_C;
778
779=head1 HISTORY
780
781=over 8
782
783=item $TEMPLATE_VERSION
784
ddf6bed1 785Original version; created by h2xs $H2XS_VERSION with options
786
787 @ARGS
c0f8b9cd 788
789=back
790
791EOT
792
ddf6bed1 793my $exp_doc = <<EOD;
794
795=head2 EXPORT
796
797None by default.
798
799EOD
5273d82d 800if (@const_names and not $opt_P) {
ddf6bed1 801 $exp_doc .= <<EOD;
802=head2 Exportable constants
5273d82d 803
804 @{[join "\n ", @const_names]}
805
806EOD
807}
808if (defined $fdecls and @$fdecls and not $opt_P) {
ddf6bed1 809 $exp_doc .= <<EOD;
810=head2 Exportable functions
5273d82d 811
3cb4da91 812EOD
813 $exp_doc .= <<EOD if $opt_p;
814When accessing these functions from Perl, prefix C<$opt_p> should be removed.
815
816EOD
817 $exp_doc .= <<EOD;
ddf6bed1 818 @{[join "\n ", @known_fnames{@fnames}]}
5273d82d 819
820EOD
821}
822
3cb4da91 823my $pod = <<"END" unless $opt_P;
7aff18a2 824## Below is stub documentation for your module. You better edit it!
f508c652 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#
7aff18a2 837#Stub documentation for $module, created by h2xs. It looks like the
f508c652 838#author of the extension was negligent enough to leave the stub
839#unedited.
840#
841#Blah blah blah.
ddf6bed1 842#$exp_doc$revhist
f508c652 843#=head1 AUTHOR
844#
845#$author, $email
846#
847#=head1 SEE ALSO
848#
849#perl(1).
850#
851#=cut
852END
853
854$pod =~ s/^\#//gm unless $opt_P;
855print PM $pod unless $opt_P;
856
a0d0e21e 857close PM;
858
e1666bf5 859
2920c5d2 860if( ! $opt_X ){ # print XS, unless it is disabled
8e07c86e 861warn "Writing $ext$modpname/$modfname.xs\n";
e1666bf5 862
a0d0e21e 863print XS <<"END";
864#include "EXTERN.h"
865#include "perl.h"
866#include "XSUB.h"
867
868END
a887ff11 869if( @path_h ){
3cb4da91 870 foreach my $path_h (@path_h_ini) {
a0d0e21e 871 my($h) = $path_h;
872 $h =~ s#^/usr/include/##;
ead2a595 873 if ($^O eq 'VMS') { $h =~ s#.*vms\]#sys/# or $h =~ s#.*[:>\]]##; }
a887ff11 874 print XS qq{#include <$h>\n};
875 }
876 print XS "\n";
a0d0e21e 877}
878
ddf6bed1 879my %pointer_typedefs;
880my %struct_typedefs;
881
882sub 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
899sub 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...
919sub 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)' : '';
a0d0e21e 927}
928
ddf6bed1 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
940sub write_const;
941
942sub 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";
a0d0e21e 949static double
3cb4da91 950constant(char *name, int len, int arg)
a0d0e21e 951{
ddf6bed1 952 errno = EINVAL;
953 return 0;
954}
a0d0e21e 955END
a0d0e21e 956 return -1;
ddf6bed1 957 }
a0d0e21e 958
ddf6bed1 959 if (@$list == 1) { # Can happen on the initial iteration only
960 my $protect = protect_convert_to_double("$pref$list->[0]");
e1666bf5 961
ddf6bed1 962 print $fh <<"END";
963static double
3cb4da91 964constant(char *name, int len, int arg)
ddf6bed1 965{
daf40514 966 errno = 0;
ddf6bed1 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;
a0d0e21e 977}
ddf6bed1 978END
979 return -1;
980 }
a0d0e21e 981
ddf6bed1 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;
3cb4da91 993 foreach my $letter (keys %leading) {
ddf6bed1 994 write_const $fh, "$pref$leader$letter", 0, $leading{$letter}
995 if @{$leading{$letter}} > 1;
996 }
a0d0e21e 997
ddf6bed1 998 my $npref = "_$pref";
999 $npref = '' if $pref eq '';
a0d0e21e 1000
ddf6bed1 1001 print $fh <<"END";
a0d0e21e 1002static double
3cb4da91 1003constant$npref(char *name, int len, int arg)
a0d0e21e 1004{
daf40514 1005END
1006
1007 print $fh <<"END" if $npref eq '';
a0d0e21e 1008 errno = 0;
a0d0e21e 1009END
1010
3cb4da91 1011 print $fh <<"END" if $off;
1012 if ($offarg + $off >= len ) {
1013 errno = EINVAL;
1014 return 0;
1015 }
1016END
e1666bf5 1017
3cb4da91 1018 print $fh <<"END";
ddf6bed1 1019 switch (name[$offarg + $off]) {
1020END
a0d0e21e 1021
3cb4da91 1022 foreach my $letter (sort keys %leading) {
ddf6bed1 1023 my $let = $letter;
1024 $let = '\0' if $letter eq '';
a0d0e21e 1025
ddf6bed1 1026 print $fh <<EOP;
1027 case '$let':
1028EOP
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;
1035EOP
1036 }
1037 print $fh <<EOP;
3cb4da91 1038 return constant_$pref$leader$letter(name, len, arg);
ddf6bed1 1039EOP
7aff18a2 1040 }
1041 else {
ddf6bed1 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];
a0d0e21e 1050#else
1051 goto not_there;
1052#endif
ddf6bed1 1053 }
1054EOP
a0d0e21e 1055 }
ddf6bed1 1056 }
1057 print $fh <<"END";
a0d0e21e 1058 }
1059 errno = EINVAL;
1060 return 0;
1061
1062not_there:
1063 errno = ENOENT;
1064 return 0;
1065}
1066
e1666bf5 1067END
ddf6bed1 1068
e1666bf5 1069}
1070
ddf6bed1 1071if( ! $opt_c ) {
1072 print XS <<"END";
1073static int
1074not_here(char *s)
1075{
1076 croak("$module::%s not implemented on this architecture", s);
1077 return -1;
1078}
1079
1080END
1081
1082 write_const(\*XS, '', 0, \@const_names);
e1666bf5 1083}
1084
3cb4da91 1085my $prefix;
ead2a595 1086$prefix = "PREFIX = $opt_p" if defined $opt_p;
3cb4da91 1087
e1666bf5 1088# Now switch from C to XS by issuing the first MODULE declaration:
1089print XS <<"END";
a0d0e21e 1090
ead2a595 1091MODULE = $module PACKAGE = $module $prefix
1092
1093END
1094
1095foreach (sort keys %const_xsub) {
1096 print XS <<"END";
1097char *
1098$_()
1099
1100 CODE:
1101#ifdef $_
7aff18a2 1102 RETVAL = $_;
ead2a595 1103#else
7aff18a2 1104 croak("Your vendor has not defined the $module macro $_");
ead2a595 1105#endif
1106
1107 OUTPUT:
7aff18a2 1108 RETVAL
a0d0e21e 1109
e1666bf5 1110END
ead2a595 1111}
e1666bf5 1112
1113# If a constant() function was written then output a corresponding
1114# XS declaration:
1115print XS <<"END" unless $opt_c;
1116
a0d0e21e 1117double
3cb4da91 1118constant(sv,arg)
7aff18a2 1119 PREINIT:
3cb4da91 1120 STRLEN len;
7aff18a2 1121 INPUT:
3cb4da91 1122 SV * sv
1123 char * s = SvPV(sv, len);
a0d0e21e 1124 int arg
7aff18a2 1125 CODE:
3cb4da91 1126 RETVAL = constant(s,len,arg);
7aff18a2 1127 OUTPUT:
3cb4da91 1128 RETVAL
a0d0e21e 1129
1130END
a0d0e21e 1131
5273d82d 1132my %seen_decl;
ddf6bed1 1133my %typemap;
5273d82d 1134
ead2a595 1135sub print_decl {
1136 my $fh = shift;
1137 my $decl = shift;
1138 my ($type, $name, $args) = @$decl;
5273d82d 1139 return if $seen_decl{$name}++; # Need to do the same for docs as well?
1140
ead2a595 1141 my @argnames = map {$_->[1]} @$args;
ddf6bed1 1142 my @argtypes = map { normalize_type( $_->[0], 1 ) } @$args;
5273d82d 1143 my @argarrays = map { $_->[4] || '' } @$args;
ead2a595 1144 my $numargs = @$args;
1145 if ($numargs and $argtypes[-1] eq '...') {
1146 $numargs--;
1147 $argnames[-1] = '...';
1148 }
1149 local $" = ', ';
ddf6bed1 1150 $type = normalize_type($type, 1);
1151
ead2a595 1152 print $fh <<"EOP";
1153
1154$type
1155$name(@argnames)
1156EOP
1157
3cb4da91 1158 for my $arg (0 .. $numargs - 1) {
ead2a595 1159 print $fh <<"EOP";
5273d82d 1160 $argtypes[$arg] $argnames[$arg]$argarrays[$arg]
ead2a595 1161EOP
1162 }
1163}
1164
7c1d48a5 1165sub 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
1172MODULE = $module PACKAGE = ${name}Ptr $prefix
1173
1174EOF
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
1201EOF
1202 }
1203 }
1204}
1205
5273d82d 1206# Should be called before any actual call to normalize_type().
1207sub 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('\$%&*@;') . "]" ;
ddf6bed1 1213
1214 # Start with useful default values
1215 $typemap{float} = 'T_DOUBLE';
1216
3cb4da91 1217 foreach my $typemap (@tm) {
5273d82d 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*($|\#)/ ;
3cb4da91 1233 my ($type, $image);
ddf6bed1 1234 if ( ($type, $image) =
5273d82d 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)) {
ddf6bed1 1238 $typemap{normalize_type($type)} = $image;
5273d82d 1239 }
1240 }
1241 }
1242 close(TYPEMAP) or die "Cannot close $typemap: $!";
1243 }
1244 %std_types = %types_seen;
1245 %types_seen = ();
1246}
1247
ead2a595 1248
ddf6bed1 1249sub normalize_type { # Second arg: do not strip const's before \*
ead2a595 1250 my $type = shift;
3cb4da91 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(?![^(,)]*\*)' : '');
ddf6bed1 1254 my $ignore_mods
3cb4da91 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;
7aff18a2 1258 }
1259 else {
3cb4da91 1260 $type =~ s/$ignore_mods//go;
1261 }
ddf6bed1 1262 $type =~ s/([^\s\w])/ \1 /g;
ead2a595 1263 $type =~ s/\s+$//;
1264 $type =~ s/^\s+//;
ddf6bed1 1265 $type =~ s/\s+/ /g;
1266 $type =~ s/\* (?=\*)/*/g;
1267 $type =~ s/\. \. \./.../g;
1268 $type =~ s/ ,/,/g;
5273d82d 1269 $types_seen{$type}++
1270 unless $type eq '...' or $type eq 'void' or $std_types{$type};
ead2a595 1271 $type;
1272}
1273
ddf6bed1 1274my $need_opaque;
1275
1276sub 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
ead2a595 1296if ($opt_x) {
3cb4da91 1297 for my $decl (@$fdecls_parsed) { print_decl(\*XS, $decl) }
7c1d48a5 1298 if ($opt_a) {
1299 while (my($name, $struct) = each %structs) {
1300 print_accessors(\*XS, $name, $struct);
1301 }
1302 }
ead2a595 1303}
1304
a0d0e21e 1305close XS;
5273d82d 1306
1307if (%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
3cb4da91 1312 for $type (sort keys %types_seen) {
ddf6bed1 1313 my $entry = assign_typemap_entry $type;
1314 print TM $type, "\t" x (5 - int((length $type)/8)), "\t$entry\n"
5273d82d 1315 }
1316
ddf6bed1 1317 print TM <<'EOP' if $need_opaque; # Older Perls do not have correct entry
1318#############################################################################
1319INPUT
1320T_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#############################################################################
1333OUTPUT
1334T_OPAQUE_STRUCT
1335 sv_setref_pvn($arg, \"${ntype}\", (char *)&$var, sizeof($var));
1336EOP
1337
5273d82d 1338 close TM or die "Cannot close typemap file for write: $!";
1339}
1340
2920c5d2 1341} # if( ! $opt_X )
e1666bf5 1342
8e07c86e 1343warn "Writing $ext$modpname/Makefile.PL\n";
1344open(PL, ">Makefile.PL") || die "Can't create $ext$modpname/Makefile.PL: $!\n";
a0d0e21e 1345
8bc03d0d 1346print PL <<END;
a0d0e21e 1347use ExtUtils::MakeMaker;
1348# See lib/ExtUtils/MakeMaker.pm for details of how to influence
42793c05 1349# the contents of the Makefile that is written.
8bc03d0d 1350WriteMakefile(
1351 'NAME' => '$module',
1352 'VERSION_FROM' => '$modfname.pm', # finds \$VERSION
1353 'PREREQ_PM' => {}, # e.g., Module::Name => 1.1
a0d0e21e 1354END
8bc03d0d 1355if (!$opt_X) { # print C stuff, unless XS is disabled
ddf6bed1 1356 $opt_F = '' unless defined $opt_F;
8bc03d0d 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'
1361END
2920c5d2 1362}
a0d0e21e 1363print PL ");\n";
f508c652 1364close(PL) || die "Can't close $ext$modpname/Makefile.PL: $!\n";
1365
1366warn "Writing $ext$modpname/test.pl\n";
1367open(EX, ">test.pl") || die "Can't create $ext$modpname/test.pl: $!\n";
1368print 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
5ae7f1db 1377BEGIN { $| = 1; print "1..1\n"; }
f508c652 1378END {print "not ok 1\n" unless $loaded;}
1379_END_
1380print EX <<_END_;
1381use $module;
1382_END_
1383print EX <<'_END_';
1384$loaded = 1;
1385print "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):
e1666bf5 1392
f508c652 1393_END_
1394close(EX) || die "Can't close $ext$modpname/test.pl: $!\n";
a0d0e21e 1395
c0f8b9cd 1396unless ($opt_C) {
ddf6bed1 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;
1402Revision 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
1408EOP
1409 close(EX) || die "Can't close $ext$modpname/Changes: $!\n";
c0f8b9cd 1410}
c07a80fd 1411
1412warn "Writing $ext$modpname/MANIFEST\n";
5ae7f1db 1413open(MANI,'>MANIFEST') or die "Can't create MANIFEST: $!";
3cb4da91 1414my @files = <*>;
5ae7f1db 1415if (!@files) {
1416 eval {opendir(D,'.');};
1417 unless ($@) { @files = readdir(D); closedir(D); }
1418}
1419if (!@files) { @files = map {chomp && $_} `ls`; }
55497cff 1420if ($^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';
bbce6d69 1427 $_ = 'Makefile.PL' if $_ eq 'makefile.pl';
55497cff 1428 }
1429}
3e3baf6d 1430print MANI join("\n",@files), "\n";
5ae7f1db 1431close MANI;
40000a8c 1432!NO!SUBS!
4633a7c4 1433
1434close OUT or die "Can't close $file: $!";
1435chmod 0755, $file or die "Can't reset permissions for $file: $!\n";
1436exec("$Config{'eunicefix'} $file") if $Config{'eunicefix'} ne ':';
8a5546a1 1437chdir $origdir;