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