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