Re: useless use of void context work-around
[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.
be3174d2 16my $origdir = cwd;
44a8e56a 17chdir dirname($0);
be3174d2 18my $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
be3174d2 44B<h2xs> [B<-ACOPXacdfkmx>] [B<-F> addflags] [B<-M> fmask] [B<-n> module_name] [B<-o> tmask] [B<-p> prefix] [B<-s> subs] [B<-v> version] [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
be3174d2 81=item B<-F> I<addflags>
b73edd97 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
32fb2b78 108the element to the supplied value (and return the new value) if called with
109an additional argument. Embedded structures and unions are returned as a
110pointer rather than the complete structure, to facilitate chained calls.
111
112These methods all apply to the Ptr type for the structure; additionally
113two methods are constructed for the structure type itself, C<_to_ptr>
114which returns a Ptr type pointing to the same structure, and a C<new>
115method to construct and return a new structure, initialised to zeroes.
7c1d48a5 116
3edbfbe5 117=item B<-c>
118
119Omit C<constant()> from the .xs file and corresponding specialised
120C<AUTOLOAD> from the .pm file.
121
b73edd97 122=item B<-d>
123
124Turn on debugging messages.
125
f508c652 126=item B<-f>
3edbfbe5 127
f508c652 128Allows an extension to be created for a header even if that header is
ddf6bed1 129not found in standard include directories.
f508c652 130
131=item B<-h>
132
133Print the usage, help and version for this h2xs and exit.
134
32fb2b78 135=item B<-k>
136
137For function arguments declared as C<const>, omit the const attribute in the
138generated XS code.
139
140=item B<-m>
141
142B<Experimental>: for each variable declared in the header file(s), declare
143a perl variable of the same name magically tied to the C variable.
144
f508c652 145=item B<-n> I<module_name>
146
147Specifies a name to be used for the extension, e.g., S<-n RPC::DCE>
148
ddf6bed1 149=item B<-o> I<regular expression>
150
151Use "opaque" data type for the C types matched by the regular
152expression, even if these types are C<typedef>-equivalent to types
153from typemaps. Should not be used without B<-x>.
154
155This may be useful since, say, types which are C<typedef>-equivalent
156to integers may represent OS-related handles, and one may want to work
157with these handles in OO-way, as in C<$handle-E<gt>do_something()>.
158Use C<-o .> if you want to handle all the C<typedef>ed types as opaque types.
159
160The type-to-match is whitewashed (except for commas, which have no
161whitespace before them, and multiple C<*> which have no whitespace
162between them).
163
ead2a595 164=item B<-p> I<prefix>
165
166Specify a prefix which should be removed from the Perl function names, e.g., S<-p sec_rgy_>
167This sets up the XS B<PREFIX> keyword and removes the prefix from functions that are
98a6f11e 168autoloaded via the C<constant()> mechanism.
ead2a595 169
170=item B<-s> I<sub1,sub2>
171
172Create a perl subroutine for the specified macros rather than autoload with the constant() subroutine.
173These macros are assumed to have a return type of B<char *>, e.g., S<-s sec_rgy_wildcard_name,sec_rgy_wildcard_sid>.
174
f508c652 175=item B<-v> I<version>
176
177Specify a version number for this extension. This version number is added
178to the templates. The default is 0.01.
3edbfbe5 179
760ac839 180=item B<-x>
181
182Automatically generate XSUBs basing on function declarations in the
183header file. The package C<C::Scan> should be installed. If this
184option is specified, the name of the header file may look like
185C<NAME1,NAME2>. In this case NAME1 is used instead of the specified string,
b73edd97 186but XSUBs are emitted only for the declarations included from file NAME2.
760ac839 187
5273d82d 188Note that some types of arguments/return-values for functions may
189result in XSUB-declarations/typemap-entries which need
190hand-editing. Such may be objects which cannot be converted from/to a
ddf6bed1 191pointer (like C<long long>), pointers to functions, or arrays. See
192also the section on L<LIMITATIONS of B<-x>>.
5273d82d 193
be3174d2 194=item B<-b> I<version>
195
196Generates a .pm file which is backwards compatible with the specified
197perl version.
198
199For versions < 5.6.0, the changes are.
200 - no use of 'our' (uses 'use vars' instead)
201 - no 'use warnings'
202
203Specifying a compatibility version higher than the version of perl you
204are using to run h2xs will have no effect.
205
3edbfbe5 206=back
207
208=head1 EXAMPLES
209
210
211 # Default behavior, extension is Rusers
212 h2xs rpcsvc/rusers
213
214 # Same, but extension is RUSERS
215 h2xs -n RUSERS rpcsvc/rusers
216
217 # Extension is rpcsvc::rusers. Still finds <rpcsvc/rusers.h>
218 h2xs rpcsvc::rusers
219
220 # Extension is ONC::RPC. Still finds <rpcsvc/rusers.h>
221 h2xs -n ONC::RPC rpcsvc/rusers
222
223 # Without constant() or AUTOLOAD
224 h2xs -c rpcsvc/rusers
225
226 # Creates templates for an extension named RPC
227 h2xs -cfn RPC
228
229 # Extension is ONC::RPC.
230 h2xs -cfn ONC::RPC
231
232 # Makefile.PL will look for library -lrpc in
233 # additional directory /opt/net/lib
234 h2xs rpcsvc/rusers -L/opt/net/lib -lrpc
235
ead2a595 236 # Extension is DCE::rgynbase
237 # prefix "sec_rgy_" is dropped from perl function names
238 h2xs -n DCE::rgynbase -p sec_rgy_ dce/rgynbase
239
240 # Extension is DCE::rgynbase
241 # prefix "sec_rgy_" is dropped from perl function names
242 # subroutines are created for sec_rgy_wildcard_name and sec_rgy_wildcard_sid
243 h2xs -n DCE::rgynbase -p sec_rgy_ \
244 -s sec_rgy_wildcard_name,sec_rgy_wildcard_sid dce/rgynbase
3edbfbe5 245
5273d82d 246 # Make XS without defines in perl.h, but with function declarations
760ac839 247 # visible from perl.h. Name of the extension is perl1.
248 # When scanning perl.h, define -DEXT=extern -DdEXT= -DINIT(x)=
249 # Extra backslashes below because the string is passed to shell.
5273d82d 250 # Note that a directory with perl header files would
251 # be added automatically to include path.
252 h2xs -xAn perl1 -F "-DEXT=extern -DdEXT= -DINIT\(x\)=" perl.h
760ac839 253
254 # Same with function declaration in proto.h as visible from perl.h.
5273d82d 255 h2xs -xAn perl2 perl.h,proto.h
760ac839 256
ddf6bed1 257 # Same but select only functions which match /^av_/
258 h2xs -M '^av_' -xAn perl2 perl.h,proto.h
259
260 # Same but treat SV* etc as "opaque" types
261 h2xs -o '^[S]V \*$' -M '^av_' -xAn perl2 perl.h,proto.h
262
b68ece06 263=head2 Extension based on F<.h> and F<.c> files
264
265Suppose that you have some C files implementing some functionality,
266and the corresponding header files. How to create an extension which
267makes this functionality accessable in Perl? The example below
268assumes that the header files are F<interface_simple.h> and
269I<interface_hairy.h>, and you want the perl module be named as
270C<Ext::Ension>. If you need some preprocessor directives and/or
271linking with external libraries, see the flags C<-F>, C<-L> and C<-l>
272in L<"OPTIONS">.
273
274=over
275
276=item Find the directory name
277
278Start with a dummy run of h2xs:
279
280 h2xs -Afn Ext::Ension
281
282The only purpose of this step is to create the needed directories, and
283let you know the names of these directories. From the output you can
284see that the directory for the extension is F<Ext/Ension>.
285
286=item Copy C files
287
288Copy your header files and C files to this directory F<Ext/Ension>.
289
290=item Create the extension
291
292Run h2xs, overwriting older autogenerated files:
293
294 h2xs -Oxan Ext::Ension interface_simple.h interface_hairy.h
295
296h2xs looks for header files I<after> changing to the extension
297directory, so it will find your header files OK.
298
299=item Archive and test
300
301As usual, run
302
303 cd Ext/Ension
304 perl Makefile.PL
305 make dist
306 make
307 make test
308
309=item Hints
310
311It is important to do C<make dist> as early as possible. This way you
312can easily merge(1) your changes to autogenerated files if you decide
313to edit your C<.h> files and rerun h2xs.
314
315Do not forget to edit the documentation in the generated F<.pm> file.
316
317Consider the autogenerated files as skeletons only, you may invent
318better interfaces than what h2xs could guess.
319
320Consider this section as a guideline only, some other options of h2xs
321may better suit your needs.
322
323=back
324
3edbfbe5 325=head1 ENVIRONMENT
326
327No environment variables are used.
328
329=head1 AUTHOR
330
331Larry Wall and others
332
333=head1 SEE ALSO
334
f508c652 335L<perl>, L<perlxstut>, L<ExtUtils::MakeMaker>, and L<AutoLoader>.
3edbfbe5 336
337=head1 DIAGNOSTICS
338
760ac839 339The usual warnings if it cannot read or write the files involved.
3edbfbe5 340
ddf6bed1 341=head1 LIMITATIONS of B<-x>
342
343F<h2xs> would not distinguish whether an argument to a C function
344which is of the form, say, C<int *>, is an input, output, or
345input/output parameter. In particular, argument declarations of the
346form
347
348 int
349 foo(n)
350 int *n
351
352should be better rewritten as
353
354 int
355 foo(n)
356 int &n
357
358if C<n> is an input parameter.
359
360Additionally, F<h2xs> has no facilities to intuit that a function
361
362 int
363 foo(addr,l)
364 char *addr
365 int l
366
367takes a pair of address and length of data at this address, so it is better
368to rewrite this function as
369
370 int
371 foo(sv)
7aff18a2 372 SV *addr
373 PREINIT:
374 STRLEN len;
375 char *s;
376 CODE:
377 s = SvPV(sv,len);
378 RETVAL = foo(s, len);
379 OUTPUT:
380 RETVAL
ddf6bed1 381
382or alternately
383
384 static int
385 my_foo(SV *sv)
386 {
387 STRLEN len;
388 char *s = SvPV(sv,len);
389
390 return foo(s, len);
391 }
392
393 MODULE = foo PACKAGE = foo PREFIX = my_
394
395 int
396 foo(sv)
397 SV *sv
398
399See L<perlxs> and L<perlxstut> for additional details.
400
3edbfbe5 401=cut
402
3cb4da91 403use strict;
404
405
fcd67389 406my( $H2XS_VERSION ) = ' $Revision: 1.21 $ ' =~ /\$Revision:\s+([^\s]+)/;
f508c652 407my $TEMPLATE_VERSION = '0.01';
ddf6bed1 408my @ARGS = @ARGV;
be3174d2 409my $compat_version = $];
a0d0e21e 410
411use Getopt::Std;
412
e1666bf5 413sub usage{
414 warn "@_\n" if @_;
be3174d2 415 die "h2xs [-ACOPXacdfhkmx] [-F addflags] [-M fmask] [-n module_name] [-o tmask] [-p prefix] [-s subs] [-v version] [headerfile [extra_libraries]]
f508c652 416version: $H2XS_VERSION
3edbfbe5 417 -A Omit all autoloading facilities (implies -c).
c0f8b9cd 418 -C Omit creating the Changes file, add HISTORY heading to stub POD.
b73edd97 419 -F Additional flags for C preprocessor (used with -x).
ddf6bed1 420 -M Mask to select C functions/macros (default is select all).
2920c5d2 421 -O Allow overwriting of a pre-existing extension directory.
f508c652 422 -P Omit the stub POD section.
9ef261b5 423 -X Omit the XS portion (implies both -c and -f).
7c1d48a5 424 -a Generate get/set accessors for struct and union members (used with -x).
b73edd97 425 -c Omit the constant() function and specialised AUTOLOAD from the XS file.
426 -d Turn on debugging messages.
427 -f Force creation of the extension even if the C header does not exist.
428 -h Display this help message
32fb2b78 429 -k Omit 'const' attribute on function arguments (used with -x).
430 -m Generate tied variables for access to declared variables.
b73edd97 431 -n Specify a name to use for the extension (recommended).
ddf6bed1 432 -o Regular expression for \"opaque\" types.
b73edd97 433 -p Specify a prefix which should be removed from the Perl function names.
434 -s Create subroutines for specified macros.
f508c652 435 -v Specify a version number for this extension.
760ac839 436 -x Autogenerate XSUBs using C::Scan.
be3174d2 437 -b Specify a perl version to be backwards compatibile with
e1666bf5 438extra_libraries
439 are any libraries that might be needed for loading the
440 extension, e.g. -lm would try to link in the math library.
f508c652 441";
e1666bf5 442}
a0d0e21e 443
a0d0e21e 444
be3174d2 445getopts("ACF:M:OPXacdfhkmn:o:p:s:v:xb:") || usage;
32fb2b78 446use vars qw($opt_A $opt_C $opt_F $opt_M $opt_O $opt_P $opt_X $opt_a $opt_c $opt_d
be3174d2 447 $opt_f $opt_h $opt_k $opt_m $opt_n $opt_o $opt_p $opt_s $opt_v $opt_x
448 $opt_b);
a0d0e21e 449
e1666bf5 450usage if $opt_h;
f508c652 451
be3174d2 452if( $opt_b ){
453 usage "You cannot use -b and -m at the same time.\n" if ($opt_b && $opt_m);
454 $opt_b =~ /^\d+\.\d+\.\d+/ ||
455 usage "You must provide the backwards compatibility version in X.Y.Z form. " .
456 "(i.e. 5.5.0)\n";
457 my ($maj,$min,$sub) = split(/\./,$opt_b,3);
458 $compat_version = sprintf("%d.%03d%02d",$maj,$min,$sub);
459}
460
f508c652 461if( $opt_v ){
462 $TEMPLATE_VERSION = $opt_v;
463}
9ef261b5 464
465# -A implies -c.
e1666bf5 466$opt_c = 1 if $opt_A;
9ef261b5 467
468# -X implies -c and -f
469$opt_c = $opt_f = 1 if $opt_X;
470
3cb4da91 471my %const_xsub = map { $_,1 } split(/,+/, $opt_s) if $opt_s;
472my $extralibs;
473my @path_h;
a0d0e21e 474
a887ff11 475while (my $arg = shift) {
476 if ($arg =~ /^-l/i) {
477 $extralibs = "$arg @ARGV";
478 last;
479 }
480 push(@path_h, $arg);
481}
e1666bf5 482
483usage "Must supply header file or module name\n"
a887ff11 484 unless (@path_h or $opt_n);
e1666bf5 485
ddf6bed1 486my $fmask;
3cb4da91 487my $tmask;
ddf6bed1 488
489$fmask = qr{$opt_M} if defined $opt_M;
490$tmask = qr{$opt_o} if defined $opt_o;
491my $tmask_all = $tmask && $opt_o eq '.';
492
493if ($opt_x) {
494 eval {require C::Scan; 1}
495 or die <<EOD;
496C::Scan required if you use -x option.
497To install C::Scan, execute
498 perl -MCPAN -e "install C::Scan"
499EOD
500 unless ($tmask_all) {
501 $C::Scan::VERSION >= 0.70
502 or die <<EOD;
503C::Scan v. 0.70 or later required unless you use -o . option.
504You have version $C::Scan::VERSION installed as $INC{'C/Scan.pm'}.
505To install C::Scan, execute
506 perl -MCPAN -e "install C::Scan"
507EOD
508 }
32fb2b78 509 if (($opt_m || $opt_a) && $C::Scan::VERSION < 0.73) {
510 die <<EOD;
511C::Scan v. 0.73 or later required to use -m or -a options.
512You have version $C::Scan::VERSION installed as $INC{'C/Scan.pm'}.
513To install C::Scan, execute
514 perl -MCPAN -e "install C::Scan"
515EOD
516 }
7aff18a2 517}
518elsif ($opt_o or $opt_F) {
ddf6bed1 519 warn <<EOD;
520Options -o and -F do not make sense without -x.
521EOD
522}
523
3cb4da91 524my @path_h_ini = @path_h;
525my ($name, %fullpath, %prefix, %seen_define, %prefixless, %const_names);
a0d0e21e 526
8a9d2888 527my $module = $opt_n;
528
a887ff11 529if( @path_h ){
ddf6bed1 530 use Config;
531 use File::Spec;
532 my @paths;
533 if ($^O eq 'VMS') { # Consider overrides of default location
3cb4da91 534 # XXXX This is not equivalent to what the older version did:
535 # it was looking at $hadsys header-file per header-file...
536 my($hadsys) = grep s!^sys/!!i , @path_h;
7aff18a2 537 @paths = qw( Sys$Library VAXC$Include );
ddf6bed1 538 push @paths, ($hadsys ? 'GNU_CC_Include[vms]' : 'GNU_CC_Include[000000]');
539 push @paths, qw( DECC$Library_Include DECC$System_Include );
7aff18a2 540 }
541 else {
ddf6bed1 542 @paths = (File::Spec->curdir(), $Config{usrinc},
543 (split ' ', $Config{locincpth}), '/usr/include');
544 }
a887ff11 545 foreach my $path_h (@path_h) {
546 $name ||= $path_h;
8a9d2888 547 $module ||= do {
548 $name =~ s/\.h$//;
549 if ( $name !~ /::/ ) {
550 $name =~ s#^.*/##;
551 $name = "\u$name";
552 }
553 $name;
554 };
555
e1666bf5 556 if( $path_h =~ s#::#/#g && $opt_n ){
557 warn "Nesting of headerfile ignored with -n\n";
558 }
559 $path_h .= ".h" unless $path_h =~ /\.h$/;
3cb4da91 560 my $fullpath = $path_h;
760ac839 561 $path_h =~ s/,.*$// if $opt_x;
3cb4da91 562 $fullpath{$path_h} = $fullpath;
ddf6bed1 563
8a9d2888 564 # Minor trickery: we can't chdir() before we processed the headers
565 # (so know the name of the extension), but the header may be in the
566 # extension directory...
567 my $tmp_path_h = $path_h;
568 my $rel_path_h = $path_h;
569 my @dirs = @paths;
ddf6bed1 570 if (not -f $path_h) {
8a9d2888 571 my $found;
ddf6bed1 572 for my $dir (@paths) {
8a9d2888 573 $found++, last
574 if -f ($path_h = File::Spec->catfile($dir, $tmp_path_h));
575 }
576 if ($found) {
577 $rel_path_h = $path_h;
578 } else {
579 (my $epath = $module) =~ s,::,/,g;
580 $epath = File::Spec->catdir('ext', $epath) if -d 'ext';
581 $rel_path_h = File::Spec->catfile($epath, $tmp_path_h);
582 $path_h = $tmp_path_h; # Used during -x
583 push @dirs, $epath;
ddf6bed1 584 }
ead2a595 585 }
5273d82d 586
587 if (!$opt_c) {
8a9d2888 588 die "Can't find $tmp_path_h in @dirs\n"
589 if ( ! $opt_f && ! -f "$rel_path_h" );
5273d82d 590 # Scan the header file (we should deal with nested header files)
591 # Record the names of simple #define constants into const_names
a887ff11 592 # Function prototypes are processed below.
8a9d2888 593 open(CH, "<$rel_path_h") || die "Can't open $rel_path_h: $!\n";
ddf6bed1 594 defines:
5273d82d 595 while (<CH>) {
3cb4da91 596 if (/^[ \t]*#[ \t]*define\s+([\$\w]+)\b(?!\()\s*(?=[^" \t])(.*)/) {
ddf6bed1 597 my $def = $1;
598 my $rest = $2;
599 $rest =~ s!/\*.*?(\*/|\n)|//.*!!g; # Remove comments
600 $rest =~ s/^\s+//;
601 $rest =~ s/\s+$//;
602 # Cannot do: (-1) and ((LHANDLE)3) are OK:
603 #print("Skip non-wordy $def => $rest\n"),
604 # next defines if $rest =~ /[^\w\$]/;
605 if ($rest =~ /"/) {
606 print("Skip stringy $def => $rest\n") if $opt_d;
607 next defines;
608 }
609 print "Matched $_ ($def)\n" if $opt_d;
610 $seen_define{$def} = $rest;
611 $_ = $def;
e1666bf5 612 next if /^_.*_h_*$/i; # special case, but for what?
760ac839 613 if (defined $opt_p) {
5273d82d 614 if (!/^$opt_p(\d)/) {
615 ++$prefix{$_} if s/^$opt_p//;
616 }
617 else {
618 warn "can't remove $opt_p prefix from '$_'!\n";
619 }
ead2a595 620 }
ddf6bed1 621 $prefixless{$def} = $_;
622 if (!$fmask or /$fmask/) {
623 print "... Passes mask of -M.\n" if $opt_d and $fmask;
624 $const_names{$_}++;
625 }
5273d82d 626 }
627 }
628 close(CH);
e1666bf5 629 }
a887ff11 630 }
a0d0e21e 631}
632
e1666bf5 633
a0d0e21e 634
3cb4da91 635my ($ext, $nested, @modparts, $modfname, $modpname);
8e07c86e 636(chdir 'ext', $ext = 'ext/') if -d 'ext';
a0d0e21e 637
638if( $module =~ /::/ ){
639 $nested = 1;
640 @modparts = split(/::/,$module);
641 $modfname = $modparts[-1];
642 $modpname = join('/',@modparts);
643}
644else {
645 $nested = 0;
646 @modparts = ();
647 $modfname = $modpname = $module;
648}
649
650
2920c5d2 651if ($opt_O) {
652 warn "Overwriting existing $ext$modpname!!!\n" if -e $modpname;
7aff18a2 653}
654else {
2920c5d2 655 die "Won't overwrite existing $ext$modpname\n" if -e $modpname;
656}
c07a80fd 657if( $nested ){
3cb4da91 658 my $modpath = "";
c07a80fd 659 foreach (@modparts){
660 mkdir("$modpath$_", 0777);
661 $modpath .= "$_/";
662 }
663}
a0d0e21e 664mkdir($modpname, 0777);
8e07c86e 665chdir($modpname) || die "Can't chdir $ext$modpname: $!\n";
a0d0e21e 666
5273d82d 667my %types_seen;
668my %std_types;
f4d63e4e 669my $fdecls = [];
670my $fdecls_parsed = [];
ddf6bed1 671my $typedef_rex;
672my %typedefs_pre;
673my %known_fnames;
7c1d48a5 674my %structs;
5273d82d 675
3cb4da91 676my @fnames;
677my @fnames_no_prefix;
32fb2b78 678my %vdecl_hash;
679my @vdecls;
5273d82d 680
2920c5d2 681if( ! $opt_X ){ # use XS, unless it was disabled
682 open(XS, ">$modfname.xs") || die "Can't create $ext$modpname/$modfname.xs: $!\n";
5273d82d 683 if ($opt_x) {
5273d82d 684 require Config; # Run-time directive
685 warn "Scanning typemaps...\n";
686 get_typemap();
3cb4da91 687 my @td;
688 my @good_td;
689 my $addflags = $opt_F || '';
690
f4d63e4e 691 foreach my $filename (@path_h) {
3cb4da91 692 my $c;
693 my $filter;
694
695 if ($fullpath{$filename} =~ /,/) {
f4d63e4e 696 $filename = $`;
697 $filter = $';
698 }
699 warn "Scanning $filename for functions...\n";
700 $c = new C::Scan 'filename' => $filename, 'filename_filter' => $filter,
7c1d48a5 701 'add_cppflags' => $addflags, 'c_styles' => [qw(C++ C9X)];
f4d63e4e 702 $c->set('includeDirs' => ["$Config::Config{archlib}/CORE"]);
ddf6bed1 703
f4d63e4e 704 push @$fdecls_parsed, @{ $c->get('parsed_fdecls') };
705 push(@$fdecls, @{$c->get('fdecls')});
3cb4da91 706
707 push @td, @{$c->get('typedefs_maybe')};
7c1d48a5 708 if ($opt_a) {
709 my $structs = $c->get('typedef_structs');
710 @structs{keys %$structs} = values %$structs;
711 }
3cb4da91 712
32fb2b78 713 if ($opt_m) {
714 %vdecl_hash = %{ $c->get('vdecl_hash') };
715 @vdecls = sort keys %vdecl_hash;
716 for (local $_ = 0; $_ < @vdecls; ++$_) {
717 my $var = $vdecls[$_];
718 my($type, $post) = @{ $vdecl_hash{$var} };
719 if (defined $post) {
720 warn "Can't handle variable '$type $var $post', skipping.\n";
721 splice @vdecls, $_, 1;
722 redo;
723 }
724 $type = normalize_type($type);
725 $vdecl_hash{$var} = $type;
726 }
727 }
728
3cb4da91 729 unless ($tmask_all) {
730 warn "Scanning $filename for typedefs...\n";
731 my $td = $c->get('typedef_hash');
732 # eval {require 'dumpvar.pl'; ::dumpValue($td)} or warn $@ if $opt_d;
733 my @f_good_td = grep $td->{$_}[1] eq '', keys %$td;
734 push @good_td, @f_good_td;
735 @typedefs_pre{@f_good_td} = map $_->[0], @$td{@f_good_td};
736 }
737 }
738 { local $" = '|';
6542b28e 739 $typedef_rex = qr(\b(?<!struct )(?:@good_td)\b) if @good_td;
5273d82d 740 }
ddf6bed1 741 %known_fnames = map @$_[1,3], @$fdecls_parsed; # [1,3] is NAME, FULLTEXT
742 if ($fmask) {
743 my @good;
744 for my $i (0..$#$fdecls_parsed) {
745 next unless $fdecls_parsed->[$i][1] =~ /$fmask/; # [1] is NAME
746 push @good, $i;
747 print "... Function $fdecls_parsed->[$i][1] passes -M mask.\n"
748 if $opt_d;
749 }
750 $fdecls = [@$fdecls[@good]];
751 $fdecls_parsed = [@$fdecls_parsed[@good]];
752 }
3cb4da91 753 @fnames = sort map $_->[1], @$fdecls_parsed; # 1 is NAME
754 # Sort declarations:
755 {
756 my %h = map( ($_->[1], $_), @$fdecls_parsed);
757 $fdecls_parsed = [ @h{@fnames} ];
ddf6bed1 758 }
3cb4da91 759 @fnames_no_prefix = @fnames;
760 @fnames_no_prefix
761 = sort map { ++$prefix{$_} if s/^$opt_p(?!\d)//; $_ } @fnames_no_prefix;
ddf6bed1 762 # Remove macros which expand to typedefs
ddf6bed1 763 print "Typedefs are @td.\n" if $opt_d;
764 my %td = map {($_, $_)} @td;
765 # Add some other possible but meaningless values for macros
766 for my $k (qw(char double float int long short unsigned signed void)) {
767 $td{"$_$k"} = "$_$k" for ('', 'signed ', 'unsigned ');
768 }
769 # eval {require 'dumpvar.pl'; ::dumpValue( [\@td, \%td] ); 1} or warn $@;
770 my $n = 0;
771 my %bad_macs;
772 while (keys %td > $n) {
773 $n = keys %td;
774 my ($k, $v);
775 while (($k, $v) = each %seen_define) {
776 # print("found '$k'=>'$v'\n"),
777 $bad_macs{$k} = $td{$k} = $td{$v} if exists $td{$v};
778 }
779 }
780 # Now %bad_macs contains names of bad macros
781 for my $k (keys %bad_macs) {
782 delete $const_names{$prefixless{$k}};
783 print "Ignoring macro $k which expands to a typedef name '$bad_macs{$k}'\n" if $opt_d;
5273d82d 784 }
5273d82d 785 }
2920c5d2 786}
3cb4da91 787my @const_names = sort keys %const_names;
5273d82d 788
8e07c86e 789open(PM, ">$modfname.pm") || die "Can't create $ext$modpname/$modfname.pm: $!\n";
a0d0e21e 790
a0d0e21e 791$" = "\n\t";
8e07c86e 792warn "Writing $ext$modpname/$modfname.pm\n";
a0d0e21e 793
be3174d2 794if ( $compat_version < 5.006 ) {
795print PM <<"END";
796package $module;
797
798use $compat_version;
799use strict;
800END
801}
802else {
a0d0e21e 803print PM <<"END";
804package $module;
805
be573f63 806use 5.006;
2920c5d2 807use strict;
8cd79558 808use warnings;
2920c5d2 809END
be3174d2 810}
2920c5d2 811
aba05478 812unless( $opt_X || $opt_c || $opt_A ){
2920c5d2 813 # we'll have an AUTOLOAD(), and it will have $AUTOLOAD and
814 # will want Carp.
815 print PM <<'END';
816use Carp;
2920c5d2 817END
818}
819
820print PM <<'END';
821
a0d0e21e 822require Exporter;
2920c5d2 823END
824
825print PM <<"END" if ! $opt_X; # use DynaLoader, unless XS was disabled
a0d0e21e 826require DynaLoader;
3edbfbe5 827END
828
e1666bf5 829
9ef261b5 830# Are we using AutoLoader or not?
831unless ($opt_A) { # no autoloader whatsoever.
832 unless ($opt_c) { # we're doing the AUTOLOAD
833 print PM "use AutoLoader;\n";
2920c5d2 834 }
9ef261b5 835 else {
836 print PM "use AutoLoader qw(AUTOLOAD);\n"
2920c5d2 837 }
3edbfbe5 838}
3edbfbe5 839
be3174d2 840if ( $compat_version < 5.006 ) {
841 if ( $opt_X || $opt_c || $opt_A ) {
842 print PM 'use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);';
843 } else {
844 print PM 'use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $AUTOLOAD);';
845 }
846}
847
9ef261b5 848# Determine @ISA.
77ca0c92 849my $myISA = 'our @ISA = qw(Exporter'; # We seem to always want this.
9ef261b5 850$myISA .= ' DynaLoader' unless $opt_X; # no XS
851$myISA .= ');';
be3174d2 852$myISA =~ s/^our // if $compat_version < 5.006;
853
9ef261b5 854print PM "\n$myISA\n\n";
e1666bf5 855
32fb2b78 856my @exported_names = (@const_names, @fnames_no_prefix, map '$'.$_, @vdecls);
3cb4da91 857
be3174d2 858my $tmp=<<"END";
e1666bf5 859# Items to export into callers namespace by default. Note: do not export
860# names by default without a very good reason. Use EXPORT_OK instead.
861# Do not simply export all your public functions/methods/constants.
ddf6bed1 862
863# This allows declaration use $module ':all';
864# If you do not need this, moving things directly into \@EXPORT or \@EXPORT_OK
865# will save memory.
51fac20b 866our %EXPORT_TAGS = ( 'all' => [ qw(
3cb4da91 867 @exported_names
ddf6bed1 868) ] );
869
51fac20b 870our \@EXPORT_OK = ( \@{ \$EXPORT_TAGS{'all'} } );
ddf6bed1 871
77ca0c92 872our \@EXPORT = qw(
e1666bf5 873 @const_names
a0d0e21e 874);
77ca0c92 875our \$VERSION = '$TEMPLATE_VERSION';
f508c652 876
e1666bf5 877END
878
be3174d2 879$tmp =~ s/^our //mg if $compat_version < 5.006;
880print PM $tmp;
881
32fb2b78 882if (@vdecls) {
883 printf PM "our(@{[ join ', ', map '$'.$_, @vdecls ]});\n\n";
884}
885
be3174d2 886
887$tmp = ( $compat_version < 5.006 ? "" : "our \$AUTOLOAD;" );
2920c5d2 888print PM <<"END" unless $opt_c or $opt_X;
a0d0e21e 889sub AUTOLOAD {
3edbfbe5 890 # This AUTOLOAD is used to 'autoload' constants from the constant()
891 # XS function. If a constant is not found then control is passed
892 # to the AUTOLOAD in AutoLoader.
e1666bf5 893
2920c5d2 894 my \$constname;
be3174d2 895 $tmp
a0d0e21e 896 (\$constname = \$AUTOLOAD) =~ s/.*:://;
1d3434b8 897 croak "&$module::constant not defined" if \$constname eq 'constant';
2920c5d2 898 my \$val = constant(\$constname, \@_ ? \$_[0] : 0);
a0d0e21e 899 if (\$! != 0) {
265f5c4a 900 if (\$! =~ /Invalid/ || \$!{EINVAL}) {
a0d0e21e 901 \$AutoLoader::AUTOLOAD = \$AUTOLOAD;
902 goto &AutoLoader::AUTOLOAD;
903 }
904 else {
7aff18a2 905 croak "Your vendor has not defined $module macro \$constname";
a0d0e21e 906 }
907 }
7aff18a2 908 {
909 no strict 'refs';
910 # Fixed between 5.005_53 and 5.005_61
911 if (\$] >= 5.00561) {
912 *\$AUTOLOAD = sub () { \$val };
913 }
914 else {
915 *\$AUTOLOAD = sub { \$val };
916 }
ddf6bed1 917 }
a0d0e21e 918 goto &\$AUTOLOAD;
919}
920
a0d0e21e 921END
a0d0e21e 922
2920c5d2 923if( ! $opt_X ){ # print bootstrap, unless XS is disabled
924 print PM <<"END";
f508c652 925bootstrap $module \$VERSION;
2920c5d2 926END
927}
928
32fb2b78 929# tying the variables can happen only after bootstrap
930if (@vdecls) {
931 printf PM <<END;
932{
933@{[ join "\n", map " _tievar_$_(\$$_);", @vdecls ]}
934}
935
936END
937}
938
3cb4da91 939my $after;
2920c5d2 940if( $opt_P ){ # if POD is disabled
941 $after = '__END__';
942}
943else {
944 $after = '=cut';
945}
946
947print PM <<"END";
a0d0e21e 948
e1666bf5 949# Preloaded methods go here.
9ef261b5 950END
951
952print PM <<"END" unless $opt_A;
a0d0e21e 953
2920c5d2 954# Autoload methods go after $after, and are processed by the autosplit program.
9ef261b5 955END
956
957print PM <<"END";
a0d0e21e 958
9591;
e1666bf5 960__END__
a0d0e21e 961END
a0d0e21e 962
3cb4da91 963my $author = "A. U. Thor";
964my $email = 'a.u.thor@a.galaxy.far.far.away';
f508c652 965
c0f8b9cd 966my $revhist = '';
967$revhist = <<EOT if $opt_C;
497711e7 968#
969#=head1 HISTORY
970#
971#=over 8
972#
973#=item $TEMPLATE_VERSION
974#
975#Original version; created by h2xs $H2XS_VERSION with options
976#
977# @ARGS
978#
979#=back
980#
c0f8b9cd 981EOT
982
ddf6bed1 983my $exp_doc = <<EOD;
497711e7 984#
985#=head2 EXPORT
986#
987#None by default.
988#
ddf6bed1 989EOD
b7d5fa84 990
5273d82d 991if (@const_names and not $opt_P) {
ddf6bed1 992 $exp_doc .= <<EOD;
497711e7 993#=head2 Exportable constants
994#
995# @{[join "\n ", @const_names]}
996#
5273d82d 997EOD
998}
b7d5fa84 999
5273d82d 1000if (defined $fdecls and @$fdecls and not $opt_P) {
ddf6bed1 1001 $exp_doc .= <<EOD;
497711e7 1002#=head2 Exportable functions
1003#
3cb4da91 1004EOD
b7d5fa84 1005
497711e7 1006# $exp_doc .= <<EOD if $opt_p;
1007#When accessing these functions from Perl, prefix C<$opt_p> should be removed.
1008#
b7d5fa84 1009#EOD
3cb4da91 1010 $exp_doc .= <<EOD;
497711e7 1011# @{[join "\n ", @known_fnames{@fnames}]}
1012#
5273d82d 1013EOD
1014}
1015
b7d5fa84 1016my $meth_doc = '';
1017
1018if ($opt_x && $opt_a) {
1019 my($name, $struct);
1020 $meth_doc .= accessor_docs($name, $struct)
1021 while ($name, $struct) = each %structs;
1022}
1023
3cb4da91 1024my $pod = <<"END" unless $opt_P;
7aff18a2 1025## Below is stub documentation for your module. You better edit it!
f508c652 1026#
1027#=head1 NAME
1028#
1029#$module - Perl extension for blah blah blah
1030#
1031#=head1 SYNOPSIS
1032#
1033# use $module;
1034# blah blah blah
1035#
1036#=head1 DESCRIPTION
1037#
7aff18a2 1038#Stub documentation for $module, created by h2xs. It looks like the
f508c652 1039#author of the extension was negligent enough to leave the stub
1040#unedited.
1041#
1042#Blah blah blah.
b7d5fa84 1043$exp_doc$meth_doc$revhist
f508c652 1044#=head1 AUTHOR
1045#
fcd67389 1046#$author, E<lt>${email}E<gt>
f508c652 1047#
1048#=head1 SEE ALSO
1049#
be573f63 1050#L<perl>.
f508c652 1051#
1052#=cut
1053END
1054
1055$pod =~ s/^\#//gm unless $opt_P;
1056print PM $pod unless $opt_P;
1057
a0d0e21e 1058close PM;
1059
e1666bf5 1060
2920c5d2 1061if( ! $opt_X ){ # print XS, unless it is disabled
8e07c86e 1062warn "Writing $ext$modpname/$modfname.xs\n";
e1666bf5 1063
a0d0e21e 1064print XS <<"END";
1065#include "EXTERN.h"
1066#include "perl.h"
1067#include "XSUB.h"
1068
1069END
a887ff11 1070if( @path_h ){
3cb4da91 1071 foreach my $path_h (@path_h_ini) {
a0d0e21e 1072 my($h) = $path_h;
1073 $h =~ s#^/usr/include/##;
ead2a595 1074 if ($^O eq 'VMS') { $h =~ s#.*vms\]#sys/# or $h =~ s#.*[:>\]]##; }
a887ff11 1075 print XS qq{#include <$h>\n};
1076 }
1077 print XS "\n";
a0d0e21e 1078}
1079
ddf6bed1 1080my %pointer_typedefs;
1081my %struct_typedefs;
1082
1083sub td_is_pointer {
1084 my $type = shift;
1085 my $out = $pointer_typedefs{$type};
1086 return $out if defined $out;
1087 my $otype = $type;
1088 $out = ($type =~ /\*$/);
1089 # This converts only the guys which do not have trailing part in the typedef
1090 if (not $out
1091 and $typedef_rex and $type =~ s/($typedef_rex)/$typedefs_pre{$1}/go) {
1092 $type = normalize_type($type);
1093 print "Is-Pointer: Type mutation via typedefs: $otype ==> $type\n"
1094 if $opt_d;
1095 $out = td_is_pointer($type);
1096 }
1097 return ($pointer_typedefs{$otype} = $out);
1098}
1099
1100sub td_is_struct {
1101 my $type = shift;
1102 my $out = $struct_typedefs{$type};
1103 return $out if defined $out;
1104 my $otype = $type;
32fb2b78 1105 $out = ($type =~ /^(struct|union)\b/) && !td_is_pointer($type);
ddf6bed1 1106 # This converts only the guys which do not have trailing part in the typedef
1107 if (not $out
1108 and $typedef_rex and $type =~ s/($typedef_rex)/$typedefs_pre{$1}/go) {
1109 $type = normalize_type($type);
1110 print "Is-Struct: Type mutation via typedefs: $otype ==> $type\n"
1111 if $opt_d;
1112 $out = td_is_struct($type);
1113 }
1114 return ($struct_typedefs{$otype} = $out);
1115}
1116
1117# Some macros will bomb if you try to return them from a double-returning func.
1118# Say, ((char *)0), or strlen (if somebody #define STRLEN strlen).
1119# Fortunately, we can detect both these cases...
1120sub protect_convert_to_double {
1121 my $in = shift;
1122 my $val;
1123 return '' unless defined ($val = $seen_define{$in});
1124 return '(IV)' if $known_fnames{$val};
1125 # OUT_t of ((OUT_t)-1):
1126 return '' unless $val =~ /^\s*(\(\s*)?\(\s*([^()]*?)\s*\)/;
1127 td_is_pointer($2) ? '(IV)' : '';
a0d0e21e 1128}
1129
ddf6bed1 1130# For each of the generated functions, length($pref) leading
1131# letters are already checked. Moreover, it is recommended that
1132# the generated functions uses switch on letter at offset at least
1133# $off + length($pref).
1134#
1135# The given list has length($pref) chars removed at front, it is
1136# guarantied that $off leading chars in the rest are the same for all
1137# elts of the list.
1138#
1139# Returns: how at which offset it was decided to make a switch, or -1 if none.
1140
1141sub write_const;
1142
1143sub write_const {
1144 my ($fh, $pref, $off, $list) = (shift,shift,shift,shift);
1145 my %leading;
1146 my $offarg = length $pref;
1147
1148 if (@$list == 0) { # Can happen on the initial iteration only
1149 print $fh <<"END";
a0d0e21e 1150static double
3cb4da91 1151constant(char *name, int len, int arg)
a0d0e21e 1152{
ddf6bed1 1153 errno = EINVAL;
1154 return 0;
1155}
a0d0e21e 1156END
a0d0e21e 1157 return -1;
ddf6bed1 1158 }
a0d0e21e 1159
ddf6bed1 1160 if (@$list == 1) { # Can happen on the initial iteration only
1161 my $protect = protect_convert_to_double("$pref$list->[0]");
e1666bf5 1162
ddf6bed1 1163 print $fh <<"END";
1164static double
3cb4da91 1165constant(char *name, int len, int arg)
ddf6bed1 1166{
daf40514 1167 errno = 0;
ddf6bed1 1168 if (strEQ(name + $offarg, "$list->[0]")) { /* $pref removed */
1169#ifdef $pref$list->[0]
1170 return $protect$pref$list->[0];
1171#else
1172 errno = ENOENT;
1173 return 0;
1174#endif
1175 }
1176 errno = EINVAL;
1177 return 0;
a0d0e21e 1178}
ddf6bed1 1179END
1180 return -1;
1181 }
a0d0e21e 1182
ddf6bed1 1183 for my $n (@$list) {
1184 my $c = substr $n, $off, 1;
1185 $leading{$c} = [] unless exists $leading{$c};
1186 push @{$leading{$c}}, substr $n, $off + 1;
1187 }
1188
1189 if (keys(%leading) == 1) {
1190 return 1 + write_const $fh, $pref, $off + 1, $list;
1191 }
1192
1193 my $leader = substr $list->[0], 0, $off;
3cb4da91 1194 foreach my $letter (keys %leading) {
ddf6bed1 1195 write_const $fh, "$pref$leader$letter", 0, $leading{$letter}
1196 if @{$leading{$letter}} > 1;
1197 }
a0d0e21e 1198
ddf6bed1 1199 my $npref = "_$pref";
1200 $npref = '' if $pref eq '';
a0d0e21e 1201
ddf6bed1 1202 print $fh <<"END";
a0d0e21e 1203static double
3cb4da91 1204constant$npref(char *name, int len, int arg)
a0d0e21e 1205{
daf40514 1206END
1207
1208 print $fh <<"END" if $npref eq '';
a0d0e21e 1209 errno = 0;
a0d0e21e 1210END
1211
3cb4da91 1212 print $fh <<"END" if $off;
1213 if ($offarg + $off >= len ) {
1214 errno = EINVAL;
1215 return 0;
1216 }
1217END
e1666bf5 1218
3cb4da91 1219 print $fh <<"END";
ddf6bed1 1220 switch (name[$offarg + $off]) {
1221END
a0d0e21e 1222
3cb4da91 1223 foreach my $letter (sort keys %leading) {
ddf6bed1 1224 my $let = $letter;
1225 $let = '\0' if $letter eq '';
a0d0e21e 1226
ddf6bed1 1227 print $fh <<EOP;
1228 case '$let':
1229EOP
1230 if (@{$leading{$letter}} > 1) {
1231 # It makes sense to call a function
1232 if ($off) {
1233 print $fh <<EOP;
1234 if (!strnEQ(name + $offarg,"$leader", $off))
1235 break;
1236EOP
1237 }
1238 print $fh <<EOP;
3cb4da91 1239 return constant_$pref$leader$letter(name, len, arg);
ddf6bed1 1240EOP
7aff18a2 1241 }
1242 else {
ddf6bed1 1243 # Do it ourselves
1244 my $protect
1245 = protect_convert_to_double("$pref$leader$letter$leading{$letter}[0]");
1246
1247 print $fh <<EOP;
1248 if (strEQ(name + $offarg, "$leader$letter$leading{$letter}[0]")) { /* $pref removed */
1249#ifdef $pref$leader$letter$leading{$letter}[0]
1250 return $protect$pref$leader$letter$leading{$letter}[0];
a0d0e21e 1251#else
1252 goto not_there;
1253#endif
ddf6bed1 1254 }
1255EOP
a0d0e21e 1256 }
ddf6bed1 1257 }
1258 print $fh <<"END";
a0d0e21e 1259 }
1260 errno = EINVAL;
1261 return 0;
1262
1263not_there:
1264 errno = ENOENT;
1265 return 0;
1266}
1267
e1666bf5 1268END
ddf6bed1 1269
e1666bf5 1270}
1271
ddf6bed1 1272if( ! $opt_c ) {
1273 print XS <<"END";
1274static int
1275not_here(char *s)
1276{
1277 croak("$module::%s not implemented on this architecture", s);
1278 return -1;
1279}
1280
1281END
1282
1283 write_const(\*XS, '', 0, \@const_names);
e1666bf5 1284}
1285
32fb2b78 1286print_tievar_subs(\*XS, $_, $vdecl_hash{$_}) for @vdecls;
1287
3cb4da91 1288my $prefix;
ead2a595 1289$prefix = "PREFIX = $opt_p" if defined $opt_p;
3cb4da91 1290
e1666bf5 1291# Now switch from C to XS by issuing the first MODULE declaration:
1292print XS <<"END";
a0d0e21e 1293
ead2a595 1294MODULE = $module PACKAGE = $module $prefix
1295
1296END
1297
1298foreach (sort keys %const_xsub) {
1299 print XS <<"END";
1300char *
1301$_()
1302
1303 CODE:
1304#ifdef $_
7aff18a2 1305 RETVAL = $_;
ead2a595 1306#else
7aff18a2 1307 croak("Your vendor has not defined the $module macro $_");
ead2a595 1308#endif
1309
1310 OUTPUT:
7aff18a2 1311 RETVAL
a0d0e21e 1312
e1666bf5 1313END
ead2a595 1314}
e1666bf5 1315
1316# If a constant() function was written then output a corresponding
1317# XS declaration:
1318print XS <<"END" unless $opt_c;
1319
a0d0e21e 1320double
3cb4da91 1321constant(sv,arg)
7aff18a2 1322 PREINIT:
3cb4da91 1323 STRLEN len;
7aff18a2 1324 INPUT:
3cb4da91 1325 SV * sv
1326 char * s = SvPV(sv, len);
a0d0e21e 1327 int arg
7aff18a2 1328 CODE:
3cb4da91 1329 RETVAL = constant(s,len,arg);
7aff18a2 1330 OUTPUT:
3cb4da91 1331 RETVAL
a0d0e21e 1332
1333END
a0d0e21e 1334
5273d82d 1335my %seen_decl;
ddf6bed1 1336my %typemap;
5273d82d 1337
ead2a595 1338sub print_decl {
1339 my $fh = shift;
1340 my $decl = shift;
1341 my ($type, $name, $args) = @$decl;
5273d82d 1342 return if $seen_decl{$name}++; # Need to do the same for docs as well?
1343
ead2a595 1344 my @argnames = map {$_->[1]} @$args;
ddf6bed1 1345 my @argtypes = map { normalize_type( $_->[0], 1 ) } @$args;
32fb2b78 1346 if ($opt_k) {
1347 s/^\s*const\b\s*// for @argtypes;
1348 }
5273d82d 1349 my @argarrays = map { $_->[4] || '' } @$args;
ead2a595 1350 my $numargs = @$args;
1351 if ($numargs and $argtypes[-1] eq '...') {
1352 $numargs--;
1353 $argnames[-1] = '...';
1354 }
1355 local $" = ', ';
ddf6bed1 1356 $type = normalize_type($type, 1);
1357
ead2a595 1358 print $fh <<"EOP";
1359
1360$type
1361$name(@argnames)
1362EOP
1363
3cb4da91 1364 for my $arg (0 .. $numargs - 1) {
ead2a595 1365 print $fh <<"EOP";
5273d82d 1366 $argtypes[$arg] $argnames[$arg]$argarrays[$arg]
ead2a595 1367EOP
1368 }
1369}
1370
32fb2b78 1371sub print_tievar_subs {
1372 my($fh, $name, $type) = @_;
1373 print $fh <<END;
1374I32
1375_get_$name(IV index, SV *sv) {
1376 dSP;
1377 PUSHMARK(SP);
1378 XPUSHs(sv);
1379 PUTBACK;
1380 (void)call_pv("$module\::_get_$name", G_DISCARD);
1381 return (I32)0;
1382}
1383
1384I32
1385_set_$name(IV index, SV *sv) {
1386 dSP;
1387 PUSHMARK(SP);
1388 XPUSHs(sv);
1389 PUTBACK;
1390 (void)call_pv("$module\::_set_$name", G_DISCARD);
1391 return (I32)0;
1392}
1393
1394END
1395}
1396
1397sub print_tievar_xsubs {
1398 my($fh, $name, $type) = @_;
1399 print $fh <<END;
1400void
1401_tievar_$name(sv)
1402 SV* sv
1403 PREINIT:
1404 struct ufuncs uf;
1405 CODE:
1406 uf.uf_val = &_get_$name;
1407 uf.uf_set = &_set_$name;
1408 uf.uf_index = (IV)&_get_$name;
1409 sv_magic(sv, 0, 'U', (char*)&uf, sizeof(uf));
1410
1411void
1412_get_$name(THIS)
1413 $type THIS = NO_INIT
1414 CODE:
1415 THIS = $name;
1416 OUTPUT:
1417 SETMAGIC: DISABLE
1418 THIS
1419
1420void
1421_set_$name(THIS)
1422 $type THIS
1423 CODE:
1424 $name = THIS;
1425
1426END
1427}
1428
7c1d48a5 1429sub print_accessors {
1430 my($fh, $name, $struct) = @_;
1431 return unless defined $struct && $name !~ /\s|_ANON/;
1432 $name = normalize_type($name);
1433 my $ptrname = normalize_type("$name *");
32fb2b78 1434 print $fh <<"EOF";
1435
1436MODULE = $module PACKAGE = ${name} $prefix
1437
1438$name *
1439_to_ptr(THIS)
1440 $name THIS = NO_INIT
1441 PROTOTYPE: \$
1442 CODE:
1443 if (sv_derived_from(ST(0), "$name")) {
1444 STRLEN len;
1445 char *s = SvPV((SV*)SvRV(ST(0)), len);
1446 if (len != sizeof(THIS))
1447 croak("Size \%d of packed data != expected \%d",
1448 len, sizeof(THIS));
1449 RETVAL = ($name *)s;
1450 }
1451 else
1452 croak("THIS is not of type $name");
1453 OUTPUT:
1454 RETVAL
1455
1456$name
1457new(CLASS)
1458 char *CLASS = NO_INIT
1459 PROTOTYPE: \$
1460 CODE:
1461 Zero((void*)&RETVAL, sizeof(RETVAL), char);
1462 OUTPUT:
1463 RETVAL
7c1d48a5 1464
1465MODULE = $module PACKAGE = ${name}Ptr $prefix
1466
1467EOF
1468 my @items = @$struct;
1469 while (@items) {
1470 my $item = shift @items;
1471 if ($item->[0] =~ /_ANON/) {
32fb2b78 1472 if (defined $item->[2]) {
7c1d48a5 1473 push @items, map [
32fb2b78 1474 @$_[0, 1], "$item->[2]_$_->[2]", "$item->[2].$_->[2]",
7c1d48a5 1475 ], @{ $structs{$item->[0]} };
1476 } else {
1477 push @items, @{ $structs{$item->[0]} };
1478 }
1479 } else {
1480 my $type = normalize_type($item->[0]);
32fb2b78 1481 my $ttype = $structs{$type} ? normalize_type("$type *") : $type;
7c1d48a5 1482 print $fh <<"EOF";
32fb2b78 1483$ttype
1484$item->[2](THIS, __value = NO_INIT)
7c1d48a5 1485 $ptrname THIS
1486 $type __value
1487 PROTOTYPE: \$;\$
1488 CODE:
7c1d48a5 1489 if (items > 1)
1490 THIS->$item->[-1] = __value;
32fb2b78 1491 RETVAL = @{[
1492 $type eq $ttype ? "THIS->$item->[-1]" : "&(THIS->$item->[-1])"
1493 ]};
7c1d48a5 1494 OUTPUT:
1495 RETVAL
1496
1497EOF
1498 }
1499 }
1500}
1501
b7d5fa84 1502sub accessor_docs {
1503 my($name, $struct) = @_;
1504 return unless defined $struct && $name !~ /\s|_ANON/;
1505 $name = normalize_type($name);
1506 my $ptrname = $name . 'Ptr';
1507 my @items = @$struct;
1508 my @list;
1509 while (@items) {
1510 my $item = shift @items;
1511 if ($item->[0] =~ /_ANON/) {
1512 if (defined $item->[2]) {
1513 push @items, map [
1514 @$_[0, 1], "$item->[2]_$_->[2]", "$item->[2].$_->[2]",
1515 ], @{ $structs{$item->[0]} };
1516 } else {
1517 push @items, @{ $structs{$item->[0]} };
1518 }
1519 } else {
1520 push @list, $item->[2];
1521 }
1522 }
b68ece06 1523 my $methods = (join '(...)>, C<', @list) . '(...)';
b7d5fa84 1524
b68ece06 1525 my $pod = <<"EOF";
1526#
1527#=head2 Object and class methods for C<$name>/C<$ptrname>
1528#
1529#The principal Perl representation of a C object of type C<$name> is an
1530#object of class C<$ptrname> which is a reference to an integer
1531#representation of a C pointer. To create such an object, one may use
1532#a combination
1533#
1534# my \$buffer = $name->new();
1535# my \$obj = \$buffer->_to_ptr();
1536#
1537#This exersizes the following two methods, and an additional class
1538#C<$name>, the internal representation of which is a reference to a
1539#packed string with the C structure. Keep in mind that \$buffer should
1540#better survive longer than \$obj.
1541#
1542#=over
1543#
1544#=item C<\$object_of_type_$name-E<gt>_to_ptr()>
1545#
1546#Converts an object of type C<$name> to an object of type C<$ptrname>.
1547#
1548#=item C<$name-E<gt>new()>
1549#
1550#Creates an empty object of type C<$name>. The corresponding packed
1551#string is zeroed out.
1552#
1553#=item C<$methods>
1554#
1555#return the current value of the corresponding element if called
1556#without additional arguments. Set the element to the supplied value
1557#(and return the new value) if called with an additional argument.
1558#
1559#Applicable to objects of type C<$ptrname>.
1560#
1561#=back
1562#
b7d5fa84 1563EOF
b68ece06 1564 $pod =~ s/^\#//gm;
1565 return $pod;
b7d5fa84 1566}
1567
5273d82d 1568# Should be called before any actual call to normalize_type().
1569sub get_typemap {
1570 # We do not want to read ./typemap by obvios reasons.
1571 my @tm = qw(../../../typemap ../../typemap ../typemap);
1572 my $stdtypemap = "$Config::Config{privlib}/ExtUtils/typemap";
1573 unshift @tm, $stdtypemap;
1574 my $proto_re = "[" . quotemeta('\$%&*@;') . "]" ;
ddf6bed1 1575
1576 # Start with useful default values
1577 $typemap{float} = 'T_DOUBLE';
1578
3cb4da91 1579 foreach my $typemap (@tm) {
5273d82d 1580 next unless -e $typemap ;
1581 # skip directories, binary files etc.
1582 warn " Scanning $typemap\n";
1583 warn("Warning: ignoring non-text typemap file '$typemap'\n"), next
1584 unless -T $typemap ;
1585 open(TYPEMAP, $typemap)
1586 or warn ("Warning: could not open typemap file '$typemap': $!\n"), next;
1587 my $mode = 'Typemap';
1588 while (<TYPEMAP>) {
1589 next if /^\s*\#/;
1590 if (/^INPUT\s*$/) { $mode = 'Input'; next; }
1591 elsif (/^OUTPUT\s*$/) { $mode = 'Output'; next; }
1592 elsif (/^TYPEMAP\s*$/) { $mode = 'Typemap'; next; }
1593 elsif ($mode eq 'Typemap') {
1594 next if /^\s*($|\#)/ ;
3cb4da91 1595 my ($type, $image);
ddf6bed1 1596 if ( ($type, $image) =
5273d82d 1597 /^\s*(.*?\S)\s+(\S+)\s*($proto_re*)\s*$/o
1598 # This may reference undefined functions:
1599 and not ($image eq 'T_PACKED' and $typemap eq $stdtypemap)) {
ddf6bed1 1600 $typemap{normalize_type($type)} = $image;
5273d82d 1601 }
1602 }
1603 }
1604 close(TYPEMAP) or die "Cannot close $typemap: $!";
1605 }
1606 %std_types = %types_seen;
1607 %types_seen = ();
1608}
1609
ead2a595 1610
ddf6bed1 1611sub normalize_type { # Second arg: do not strip const's before \*
ead2a595 1612 my $type = shift;
3cb4da91 1613 my $do_keep_deep_const = shift;
1614 # If $do_keep_deep_const this is heuristical only
1615 my $keep_deep_const = ($do_keep_deep_const ? '\b(?![^(,)]*\*)' : '');
ddf6bed1 1616 my $ignore_mods
3cb4da91 1617 = "(?:\\b(?:(?:__const__|const)$keep_deep_const|static|inline|__inline__)\\b\\s*)*";
1618 if ($do_keep_deep_const) { # Keep different compiled /RExen/o separately!
1619 $type =~ s/$ignore_mods//go;
7aff18a2 1620 }
1621 else {
3cb4da91 1622 $type =~ s/$ignore_mods//go;
1623 }
ddf6bed1 1624 $type =~ s/([^\s\w])/ \1 /g;
ead2a595 1625 $type =~ s/\s+$//;
1626 $type =~ s/^\s+//;
ddf6bed1 1627 $type =~ s/\s+/ /g;
1628 $type =~ s/\* (?=\*)/*/g;
1629 $type =~ s/\. \. \./.../g;
1630 $type =~ s/ ,/,/g;
5273d82d 1631 $types_seen{$type}++
1632 unless $type eq '...' or $type eq 'void' or $std_types{$type};
ead2a595 1633 $type;
1634}
1635
ddf6bed1 1636my $need_opaque;
1637
1638sub assign_typemap_entry {
1639 my $type = shift;
1640 my $otype = $type;
1641 my $entry;
1642 if ($tmask and $type =~ /$tmask/) {
1643 print "Type $type matches -o mask\n" if $opt_d;
1644 $entry = (td_is_struct($type) ? "T_OPAQUE_STRUCT" : "T_PTROBJ");
1645 }
1646 elsif ($typedef_rex and $type =~ s/($typedef_rex)/$typedefs_pre{$1}/go) {
1647 $type = normalize_type $type;
1648 print "Type mutation via typedefs: $otype ==> $type\n" if $opt_d;
1649 $entry = assign_typemap_entry($type);
1650 }
1651 $entry ||= $typemap{$otype}
1652 || (td_is_struct($type) ? "T_OPAQUE_STRUCT" : "T_PTROBJ");
1653 $typemap{$otype} = $entry;
1654 $need_opaque = 1 if $entry eq "T_OPAQUE_STRUCT";
1655 return $entry;
1656}
1657
32fb2b78 1658for (@vdecls) {
1659 print_tievar_xsubs(\*XS, $_, $vdecl_hash{$_});
1660}
1661
ead2a595 1662if ($opt_x) {
32fb2b78 1663 for my $decl (@$fdecls_parsed) { print_decl(\*XS, $decl) }
1664 if ($opt_a) {
1665 while (my($name, $struct) = each %structs) {
1666 print_accessors(\*XS, $name, $struct);
7c1d48a5 1667 }
32fb2b78 1668 }
ead2a595 1669}
1670
a0d0e21e 1671close XS;
5273d82d 1672
1673if (%types_seen) {
1674 my $type;
1675 warn "Writing $ext$modpname/typemap\n";
1676 open TM, ">typemap" or die "Cannot open typemap file for write: $!";
1677
3cb4da91 1678 for $type (sort keys %types_seen) {
ddf6bed1 1679 my $entry = assign_typemap_entry $type;
1680 print TM $type, "\t" x (5 - int((length $type)/8)), "\t$entry\n"
5273d82d 1681 }
1682
ddf6bed1 1683 print TM <<'EOP' if $need_opaque; # Older Perls do not have correct entry
1684#############################################################################
1685INPUT
1686T_OPAQUE_STRUCT
1687 if (sv_derived_from($arg, \"${ntype}\")) {
1688 STRLEN len;
1689 char *s = SvPV((SV*)SvRV($arg), len);
1690
1691 if (len != sizeof($var))
1692 croak(\"Size %d of packed data != expected %d\",
1693 len, sizeof($var));
1694 $var = *($type *)s;
1695 }
1696 else
1697 croak(\"$var is not of type ${ntype}\")
1698#############################################################################
1699OUTPUT
1700T_OPAQUE_STRUCT
1701 sv_setref_pvn($arg, \"${ntype}\", (char *)&$var, sizeof($var));
1702EOP
1703
5273d82d 1704 close TM or die "Cannot close typemap file for write: $!";
1705}
1706
2920c5d2 1707} # if( ! $opt_X )
e1666bf5 1708
8e07c86e 1709warn "Writing $ext$modpname/Makefile.PL\n";
1710open(PL, ">Makefile.PL") || die "Can't create $ext$modpname/Makefile.PL: $!\n";
a0d0e21e 1711
8bc03d0d 1712print PL <<END;
a0d0e21e 1713use ExtUtils::MakeMaker;
1714# See lib/ExtUtils/MakeMaker.pm for details of how to influence
42793c05 1715# the contents of the Makefile that is written.
8bc03d0d 1716WriteMakefile(
1717 'NAME' => '$module',
1718 'VERSION_FROM' => '$modfname.pm', # finds \$VERSION
1719 'PREREQ_PM' => {}, # e.g., Module::Name => 1.1
fcd67389 1720 (\$] >= 5.005 ? ## Add these new keywords supported since 5.005
1721 (ABSTRACT_FROM => '$modfname.pm', # retrieve abstract from module
1722 AUTHOR => '$author <$email>') : ()),
a0d0e21e 1723END
8bc03d0d 1724if (!$opt_X) { # print C stuff, unless XS is disabled
ddf6bed1 1725 $opt_F = '' unless defined $opt_F;
b68ece06 1726 my $I = (((glob '*.h') || (glob '*.hh')) ? '-I.' : '');
1727 my $Ihelp = ($I ? '-I. ' : '');
1728 my $Icomment = ($I ? '' : <<EOC);
1729 # Insert -I. if you add *.h files later:
1730EOC
1731
8bc03d0d 1732 print PL <<END;
1733 'LIBS' => ['$extralibs'], # e.g., '-lm'
1734 'DEFINE' => '$opt_F', # e.g., '-DHAVE_SOMETHING'
b68ece06 1735$Icomment 'INC' => '$I', # e.g., '$Ihelp-I/usr/include/other'
1736END
1737
1738 my $C = grep $_ ne "$modfname.c", (glob '*.c'), (glob '*.cc'), (glob '*.C');
1739 my $Cpre = ($C ? '' : '# ');
1740 my $Ccomment = ($C ? '' : <<EOC);
1741 # Un-comment this if you add C files to link with later:
1742EOC
1743
1744 print PL <<END;
1745$Ccomment $Cpre\'OBJECT' => '\$(O_FILES)', # link all the C files too
8bc03d0d 1746END
2920c5d2 1747}
a0d0e21e 1748print PL ");\n";
f508c652 1749close(PL) || die "Can't close $ext$modpname/Makefile.PL: $!\n";
1750
fcd67389 1751# Create a simple README since this is a CPAN requirement
1752# and it doesnt hurt to have one
1753warn "Writing $ext$modpname/README\n";
1754open(RM, ">README") || die "Can't create $ext$modpname/README:$!\n";
1755my $thisyear = (gmtime)[5] + 1900;
1756my $rmhead = "$modpname version $TEMPLATE_VERSION";
1757my $rmheadeq = "=" x length($rmhead);
1758print RM <<_RMEND_;
1759$rmhead
1760$rmheadeq
1761
1762The README is used to introduce the module and provide instructions on
1763how to install the module, any machine dependencies it may have (for
1764example C compilers and installed libraries) and any other information
1765that should be provided before the module is installed.
1766
1767A README file is required for CPAN modules since CPAN extracts the
1768README file from a module distribution so that people browsing the
1769archive can use it get an idea of the modules uses. It is usually a
1770good idea to provide version information here so that people can
1771decide whether fixes for the module are worth downloading.
1772
1773INSTALLATION
1774
1775To install this module type the following:
1776
1777 perl Makefile.PL
1778 make
1779 make test
1780 make install
1781
1782DEPENDENCIES
1783
1784This module requires these other modules and libraries:
1785
1786 blah blah blah
1787
1788COPYRIGHT AND LICENCE
1789
1790Put the correct copyright and licence information here.
1791
1792Copyright (C) $thisyear $author blah blah blah
1793
1794_RMEND_
1795close(RM) || die "Can't close $ext$modpname/README: $!\n";
1796
f508c652 1797warn "Writing $ext$modpname/test.pl\n";
1798open(EX, ">test.pl") || die "Can't create $ext$modpname/test.pl: $!\n";
1799print EX <<'_END_';
1800# Before `make install' is performed this script should be runnable with
1801# `make test'. After `make install' it should work as `perl test.pl'
1802
452e8205 1803#########################
f508c652 1804
452e8205 1805# change 'tests => 1' to 'tests => last_test_to_print';
f508c652 1806
452e8205 1807use Test;
1808BEGIN { plan tests => 1 };
f508c652 1809_END_
1810print EX <<_END_;
1811use $module;
1812_END_
1813print EX <<'_END_';
452e8205 1814ok(1); # If we made it this far, we're ok.
f508c652 1815
452e8205 1816#########################
f508c652 1817
452e8205 1818# Insert your test code below, the Test module is use()ed here so read
1819# its man page ( perldoc Test ) for help writing this test script.
e1666bf5 1820
f508c652 1821_END_
1822close(EX) || die "Can't close $ext$modpname/test.pl: $!\n";
a0d0e21e 1823
c0f8b9cd 1824unless ($opt_C) {
ddf6bed1 1825 warn "Writing $ext$modpname/Changes\n";
1826 $" = ' ';
1827 open(EX, ">Changes") || die "Can't create $ext$modpname/Changes: $!\n";
1828 @ARGS = map {/[\s\"\'\`\$*?^|&<>\[\]\{\}\(\)]/ ? "'$_'" : $_} @ARGS;
1829 print EX <<EOP;
1830Revision history for Perl extension $module.
1831
1832$TEMPLATE_VERSION @{[scalar localtime]}
1833\t- original version; created by h2xs $H2XS_VERSION with options
1834\t\t@ARGS
1835
1836EOP
1837 close(EX) || die "Can't close $ext$modpname/Changes: $!\n";
c0f8b9cd 1838}
c07a80fd 1839
1840warn "Writing $ext$modpname/MANIFEST\n";
5ae7f1db 1841open(MANI,'>MANIFEST') or die "Can't create MANIFEST: $!";
3cb4da91 1842my @files = <*>;
5ae7f1db 1843if (!@files) {
1844 eval {opendir(D,'.');};
1845 unless ($@) { @files = readdir(D); closedir(D); }
1846}
1847if (!@files) { @files = map {chomp && $_} `ls`; }
55497cff 1848if ($^O eq 'VMS') {
1849 foreach (@files) {
1850 # Clip trailing '.' for portability -- non-VMS OSs don't expect it
1851 s%\.$%%;
1852 # Fix up for case-sensitive file systems
1853 s/$modfname/$modfname/i && next;
1854 $_ = "\U$_" if $_ eq 'manifest' or $_ eq 'changes';
bbce6d69 1855 $_ = 'Makefile.PL' if $_ eq 'makefile.pl';
55497cff 1856 }
1857}
3e3baf6d 1858print MANI join("\n",@files), "\n";
5ae7f1db 1859close MANI;
40000a8c 1860!NO!SUBS!
4633a7c4 1861
1862close OUT or die "Can't close $file: $!";
1863chmod 0755, $file or die "Can't reset permissions for $file: $!\n";
1864exec("$Config{'eunicefix'} $file") if $Config{'eunicefix'} ne ':';
8a5546a1 1865chdir $origdir;