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