Allow for GNU-isms in h2xs
[p5sagit/p5-mst-13.2.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 use strict;
429
430
431 my( $H2XS_VERSION ) = ' $Revision: 1.21 $ ' =~ /\$Revision:\s+([^\s]+)/;
432 my $TEMPLATE_VERSION = '0.01';
433 my @ARGS = @ARGV;
434 my $compat_version = $];
435
436 use Getopt::Long;
437 use Config;
438 use Text::Wrap;
439 $Text::Wrap::huge = 'overflow';
440 $Text::Wrap::columns = 80;
441 use ExtUtils::Constant qw (constant_types C_constant XS_constant autoload);
442
443 sub usage {
444     warn "@_\n" if @_;
445     die <<EOFUSAGE;
446 h2xs [OPTIONS ... ] [headerfile [extra_libraries]]
447 version: $H2XS_VERSION
448 OPTIONS:
449     -A, --omit-autoload   Omit all autoloading facilities (implies -c).
450     -C, --omit-changes    Omit creating the Changes file, add HISTORY heading
451                           to stub POD.
452     -F, --cpp-flags       Additional flags for C preprocessor (used with -x).
453     -M, --func-mask       Mask to select C functions/macros
454                           (default is select all).
455     -O, --overwrite-ok    Allow overwriting of a pre-existing extension directory.
456     -P, --omit-pod        Omit the stub POD section.
457     -X, --omit-XS         Omit the XS portion (implies both -c and -f).
458     -a, --gen-accessors   Generate get/set accessors for struct and union members                           (used with -x).
459     -b, --compat-version  Specify a perl version to be backwards compatibile with
460     -c, --omit-constant   Omit the constant() function and specialised AUTOLOAD
461                           from the XS file.
462     -d, --debugging       Turn on debugging messages.
463     -f, --force           Force creation of the extension even if the C header
464                           does not exist.
465     -h, -?, --help        Display this help message
466     -k, --omit-const-func Omit 'const' attribute on function arguments
467                           (used with -x).
468     -m, --gen-tied-var    Generate tied variables for access to declared
469                           variables.
470     -n, --name            Specify a name to use for the extension (recommended).
471     -o, --opaque-re       Regular expression for \"opaque\" types.
472     -p, --remove-prefix   Specify a prefix which should be removed from the
473                           Perl function names.
474     -s, --const-subs      Create subroutines for specified macros.
475     -t, --default-type    Default type for autoloaded constants
476         --use-new-tests   Use Test::More in backward compatible modules
477         --use-old-tests   Use the module Test rather than Test::More
478     -v, --version         Specify a version number for this extension.
479     -x, --autogen-xsubs   Autogenerate XSUBs using C::Scan.
480
481 extra_libraries
482          are any libraries that might be needed for loading the
483          extension, e.g. -lm would try to link in the math library.
484 EOFUSAGE
485 }
486
487 my ($opt_A,
488     $opt_C,
489     $opt_F,
490     $opt_M,
491     $opt_O,
492     $opt_P,
493     $opt_X,
494     $opt_a,
495     $opt_c,
496     $opt_d,
497     $opt_f,
498     $opt_h,
499     $opt_k,
500     $opt_m,
501     $opt_n,
502     $opt_o,
503     $opt_p,
504     $opt_s,
505     $opt_v,
506     $opt_x,
507     $opt_b,
508     $opt_t,
509     $new_test,
510     $old_test
511    );
512
513 Getopt::Long::Configure('bundling');
514
515 my %options = (
516                 'omit-autoload|A'    => \$opt_A,
517                 'omit-changes|C'     => \$opt_C,
518                 'cpp-flags|F=s'      => \$opt_F,
519                 'func-mask|M=s'      => \$opt_M,
520                 'overwrite_ok|O'     => \$opt_O,
521                 'omit-pod|P'         => \$opt_P,
522                 'omit-XS|X'          => \$opt_X,
523                 'gen-accessors|a'    => \$opt_a,
524                 'compat-version|b=s' => \$opt_b,
525                 'omit-constant|c'    => \$opt_c,
526                 'debugging|d'        => \$opt_d,
527                 'force|f'            => \$opt_f,
528                 'help|h|?'           => \$opt_h,
529                 'omit-const-func|k'  => \$opt_k,
530                 'gen-tied-var|m'     => \$opt_m,
531                 'name|n=s'           => \$opt_n,
532                 'opaque-re|o=s'      => \$opt_o,
533                 'remove-prefix|p=s'  => \$opt_p,
534                 'const-subs|s=s'     => \$opt_s,
535                 'default-type|t=s'   => \$opt_t,
536                 'version|v=s'        => \$opt_v,
537                 'autogen-xsubs|x=s'  => \$opt_x,
538                 'use-new-tests'      => \$new_test,
539                 'use-old-tests'      => \$old_test
540               );
541
542 GetOptions(%options) || usage;
543
544 usage if $opt_h;
545
546 if( $opt_b ){
547     usage "You cannot use -b and -m at the same time.\n" if ($opt_b && $opt_m);
548     $opt_b =~ /^\d+\.\d+\.\d+/ ||
549     usage "You must provide the backwards compatibility version in X.Y.Z form. "
550           .  "(i.e. 5.5.0)\n";
551     my ($maj,$min,$sub) = split(/\./,$opt_b,3);
552     $compat_version = sprintf("%d.%03d%02d",$maj,$min,$sub);
553
554
555 if( $opt_v ){
556         $TEMPLATE_VERSION = $opt_v;
557 }
558
559 # -A implies -c.
560 $opt_c = 1 if $opt_A;
561
562 # -X implies -c and -f
563 $opt_c = $opt_f = 1 if $opt_X;
564
565 my %const_xsub = map { $_,1 } split(/,+/, $opt_s) if $opt_s;
566
567 my $extralibs = '';
568
569 my @path_h;
570
571 while (my $arg = shift) {
572     if ($arg =~ /^-l/i) {
573         $extralibs = "$arg @ARGV";
574         last;
575     }
576     push(@path_h, $arg);
577 }
578
579 usage "Must supply header file or module name\n"
580         unless (@path_h or $opt_n);
581
582 my $fmask;
583 my $tmask;
584
585 $fmask = qr{$opt_M} if defined $opt_M;
586 $tmask = qr{$opt_o} if defined $opt_o;
587 my $tmask_all = $tmask && $opt_o eq '.';
588
589 if ($opt_x) {
590   eval {require C::Scan; 1}
591     or die <<EOD;
592 C::Scan required if you use -x option.
593 To install C::Scan, execute
594    perl -MCPAN -e "install C::Scan"
595 EOD
596   unless ($tmask_all) {
597     $C::Scan::VERSION >= 0.70
598       or die <<EOD;
599 C::Scan v. 0.70 or later required unless you use -o . option.
600 You have version $C::Scan::VERSION installed as $INC{'C/Scan.pm'}.
601 To install C::Scan, execute
602    perl -MCPAN -e "install C::Scan"
603 EOD
604   }
605   if (($opt_m || $opt_a) && $C::Scan::VERSION < 0.73) {
606     die <<EOD;
607 C::Scan v. 0.73 or later required to use -m or -a options.
608 You have version $C::Scan::VERSION installed as $INC{'C/Scan.pm'}.
609 To install C::Scan, execute
610    perl -MCPAN -e "install C::Scan"
611 EOD
612   }
613 }
614 elsif ($opt_o or $opt_F) {
615   warn <<EOD;
616 Options -o and -F do not make sense without -x.
617 EOD
618 }
619
620 my @path_h_ini = @path_h;
621 my ($name, %fullpath, %prefix, %seen_define, %prefixless, %const_names);
622
623 my $module = $opt_n;
624
625 if( @path_h ){
626     use Config;
627     use File::Spec;
628     my @paths;
629     my $pre_sub_tri_graphs = 1;
630     if ($^O eq 'VMS') {  # Consider overrides of default location
631       # XXXX This is not equivalent to what the older version did:
632       #         it was looking at $hadsys header-file per header-file...
633       my($hadsys) = grep s!^sys/!!i , @path_h;
634       @paths = qw( Sys$Library VAXC$Include );
635       push @paths, ($hadsys ? 'GNU_CC_Include[vms]' : 'GNU_CC_Include[000000]');
636       push @paths, qw( DECC$Library_Include DECC$System_Include );
637     }
638     else {
639       @paths = (File::Spec->curdir(), $Config{usrinc},
640                 (split ' ', $Config{locincpth}), '/usr/include');
641     }
642     foreach my $path_h (@path_h) {
643         $name ||= $path_h;
644     $module ||= do {
645       $name =~ s/\.h$//;
646       if ( $name !~ /::/ ) {
647         $name =~ s#^.*/##;
648         $name = "\u$name";
649       }
650       $name;
651     };
652
653     if( $path_h =~ s#::#/#g && $opt_n ){
654         warn "Nesting of headerfile ignored with -n\n";
655     }
656     $path_h .= ".h" unless $path_h =~ /\.h$/;
657     my $fullpath = $path_h;
658     $path_h =~ s/,.*$// if $opt_x;
659     $fullpath{$path_h} = $fullpath;
660
661     # Minor trickery: we can't chdir() before we processed the headers
662     # (so know the name of the extension), but the header may be in the
663     # extension directory...
664     my $tmp_path_h = $path_h;
665     my $rel_path_h = $path_h;
666     my @dirs = @paths;
667     if (not -f $path_h) {
668       my $found;
669       for my $dir (@paths) {
670         $found++, last
671           if -f ($path_h = File::Spec->catfile($dir, $tmp_path_h));
672       }
673       if ($found) {
674         $rel_path_h = $path_h;
675       } else {
676         (my $epath = $module) =~ s,::,/,g;
677         $epath = File::Spec->catdir('ext', $epath) if -d 'ext';
678         $rel_path_h = File::Spec->catfile($epath, $tmp_path_h);
679         $path_h = $tmp_path_h;  # Used during -x
680         push @dirs, $epath;
681       }
682     }
683
684     if (!$opt_c) {
685       die "Can't find $tmp_path_h in @dirs\n" 
686         if ( ! $opt_f && ! -f "$rel_path_h" );
687       # Scan the header file (we should deal with nested header files)
688       # Record the names of simple #define constants into const_names
689             # Function prototypes are processed below.
690       open(CH, "<$rel_path_h") || die "Can't open $rel_path_h: $!\n";
691     defines:
692       while (<CH>) {
693         if ($pre_sub_tri_graphs) {
694             # Preprocess all tri-graphs 
695             # including things stuck in quoted string constants.
696             s/\?\?=/#/g;                         # | ??=|  #|
697             s/\?\?\!/|/g;                        # | ??!|  ||
698             s/\?\?'/^/g;                         # | ??'|  ^|
699             s/\?\?\(/[/g;                        # | ??(|  [|
700             s/\?\?\)/]/g;                        # | ??)|  ]|
701             s/\?\?\-/~/g;                        # | ??-|  ~|
702             s/\?\?\//\\/g;                       # | ??/|  \|
703             s/\?\?</{/g;                         # | ??<|  {|
704             s/\?\?>/}/g;                         # | ??>|  }|
705         }
706         if (/^[ \t]*#[ \t]*define\s+([\$\w]+)\b(?!\()\s*(?=[^" \t])(.*)/) {
707             my $def = $1;
708             my $rest = $2;
709             $rest =~ s!/\*.*?(\*/|\n)|//.*!!g; # Remove comments
710             $rest =~ s/^\s+//;
711             $rest =~ s/\s+$//;
712             # Cannot do: (-1) and ((LHANDLE)3) are OK:
713             #print("Skip non-wordy $def => $rest\n"),
714             #  next defines if $rest =~ /[^\w\$]/;
715             if ($rest =~ /"/) {
716               print("Skip stringy $def => $rest\n") if $opt_d;
717               next defines;
718             }
719             print "Matched $_ ($def)\n" if $opt_d;
720             $seen_define{$def} = $rest;
721             $_ = $def;
722             next if /^_.*_h_*$/i; # special case, but for what?
723             if (defined $opt_p) {
724               if (!/^$opt_p(\d)/) {
725                 ++$prefix{$_} if s/^$opt_p//;
726               }
727               else {
728                 warn "can't remove $opt_p prefix from '$_'!\n";
729               }
730             }
731             $prefixless{$def} = $_;
732             if (!$fmask or /$fmask/) {
733                 print "... Passes mask of -M.\n" if $opt_d and $fmask;
734                 $const_names{$_}++;
735             }
736           }
737       }
738       close(CH);
739     }
740     }
741 }
742
743
744
745 my ($ext, $nested, @modparts, $modfname, $modpname);
746
747 $ext = chdir 'ext' ? 'ext/' : '';
748
749 if( $module =~ /::/ ){
750         $nested = 1;
751         @modparts = split(/::/,$module);
752         $modfname = $modparts[-1];
753         $modpname = join('/',@modparts);
754 }
755 else {
756         $nested = 0;
757         @modparts = ();
758         $modfname = $modpname = $module;
759 }
760
761
762 if ($opt_O) {
763         warn "Overwriting existing $ext$modpname!!!\n" if -e $modpname;
764 }
765 else {
766         die "Won't overwrite existing $ext$modpname\n" if -e $modpname;
767 }
768 if( $nested ){
769         my $modpath = "";
770         foreach (@modparts){
771                 -d "$modpath$_" || mkdir("$modpath$_", 0777);
772                 $modpath .= "$_/";
773         }
774 }
775 -d "$modpname"   || mkdir($modpname, 0777);
776 chdir($modpname) || die "Can't chdir $ext$modpname: $!\n";
777
778 my %types_seen;
779 my %std_types;
780 my $fdecls = [];
781 my $fdecls_parsed = [];
782 my $typedef_rex;
783 my %typedefs_pre;
784 my %known_fnames;
785 my %structs;
786
787 my @fnames;
788 my @fnames_no_prefix;
789 my %vdecl_hash;
790 my @vdecls;
791
792 if( ! $opt_X ){  # use XS, unless it was disabled
793   open(XS, ">$modfname.xs") || die "Can't create $ext$modpname/$modfname.xs: $!\n";
794   if ($opt_x) {
795     require Config;             # Run-time directive
796     warn "Scanning typemaps...\n";
797     get_typemap();
798     my @td;
799     my @good_td;
800     my $addflags = $opt_F || '';
801
802     foreach my $filename (@path_h) {
803       my $c;
804       my $filter;
805
806       if ($fullpath{$filename} =~ /,/) {
807         $filename = $`;
808         $filter = $';
809       }
810       warn "Scanning $filename for functions...\n";
811       my @styles = $Config{gccversion} ? qw(C++ C9X GNU) : qw(C++ C9X);
812       $c = new C::Scan 'filename' => $filename, 'filename_filter' => $filter,
813         'add_cppflags' => $addflags, 'c_styles' => \@styles;
814       $c->set('includeDirs' => ["$Config::Config{archlib}/CORE"]);
815
816       push @$fdecls_parsed, @{ $c->get('parsed_fdecls') };
817       push(@$fdecls, @{$c->get('fdecls')});
818
819       push @td, @{$c->get('typedefs_maybe')};
820       if ($opt_a) {
821         my $structs = $c->get('typedef_structs');
822         @structs{keys %$structs} = values %$structs;
823       }
824
825       if ($opt_m) {
826         %vdecl_hash = %{ $c->get('vdecl_hash') };
827         @vdecls = sort keys %vdecl_hash;
828         for (local $_ = 0; $_ < @vdecls; ++$_) {
829           my $var = $vdecls[$_];
830           my($type, $post) = @{ $vdecl_hash{$var} };
831           if (defined $post) {
832             warn "Can't handle variable '$type $var $post', skipping.\n";
833             splice @vdecls, $_, 1;
834             redo;
835           }
836           $type = normalize_type($type);
837           $vdecl_hash{$var} = $type;
838         }
839       }
840
841       unless ($tmask_all) {
842         warn "Scanning $filename for typedefs...\n";
843         my $td = $c->get('typedef_hash');
844         # eval {require 'dumpvar.pl'; ::dumpValue($td)} or warn $@ if $opt_d;
845         my @f_good_td = grep $td->{$_}[1] eq '', keys %$td;
846         push @good_td, @f_good_td;
847         @typedefs_pre{@f_good_td}  = map $_->[0], @$td{@f_good_td};
848       }
849     }
850     { local $" = '|';
851       $typedef_rex = qr(\b(?<!struct )(?:@good_td)\b) if @good_td;
852     }
853     %known_fnames = map @$_[1,3], @$fdecls_parsed; # [1,3] is NAME, FULLTEXT
854     if ($fmask) {
855       my @good;
856       for my $i (0..$#$fdecls_parsed) {
857         next unless $fdecls_parsed->[$i][1] =~ /$fmask/; # [1] is NAME
858         push @good, $i;
859         print "... Function $fdecls_parsed->[$i][1] passes -M mask.\n"
860           if $opt_d;
861       }
862       $fdecls = [@$fdecls[@good]];
863       $fdecls_parsed = [@$fdecls_parsed[@good]];
864     }
865     @fnames = sort map $_->[1], @$fdecls_parsed; # 1 is NAME
866     # Sort declarations:
867     {
868       my %h = map( ($_->[1], $_), @$fdecls_parsed);
869       $fdecls_parsed = [ @h{@fnames} ];
870     }
871     @fnames_no_prefix = @fnames;
872     @fnames_no_prefix
873       = sort map { ++$prefix{$_} if s/^$opt_p(?!\d)//; $_ } @fnames_no_prefix;
874     # Remove macros which expand to typedefs
875     print "Typedefs are @td.\n" if $opt_d;
876     my %td = map {($_, $_)} @td;
877     # Add some other possible but meaningless values for macros
878     for my $k (qw(char double float int long short unsigned signed void)) {
879       $td{"$_$k"} = "$_$k" for ('', 'signed ', 'unsigned ');
880     }
881     # eval {require 'dumpvar.pl'; ::dumpValue( [\@td, \%td] ); 1} or warn $@;
882     my $n = 0;
883     my %bad_macs;
884     while (keys %td > $n) {
885       $n = keys %td;
886       my ($k, $v);
887       while (($k, $v) = each %seen_define) {
888         # print("found '$k'=>'$v'\n"), 
889         $bad_macs{$k} = $td{$k} = $td{$v} if exists $td{$v};
890       }
891     }
892     # Now %bad_macs contains names of bad macros
893     for my $k (keys %bad_macs) {
894       delete $const_names{$prefixless{$k}};
895       print "Ignoring macro $k which expands to a typedef name '$bad_macs{$k}'\n" if $opt_d;
896     }
897   }
898 }
899 my @const_names = sort keys %const_names;
900
901 open(PM, ">$modfname.pm") || die "Can't create $ext$modpname/$modfname.pm: $!\n";
902
903 $" = "\n\t";
904 warn "Writing $ext$modpname/$modfname.pm\n";
905
906 if ( $compat_version < 5.006 ) {
907 print PM <<"END";
908 package $module;
909
910 use $compat_version;
911 use strict;
912 END
913
914 else {
915 print PM <<"END";
916 package $module;
917
918 use 5.006;
919 use strict;
920 use warnings;
921 END
922 }
923
924 unless( $opt_X || $opt_c || $opt_A ){
925         # we'll have an AUTOLOAD(), and it will have $AUTOLOAD and
926         # will want Carp.
927         print PM <<'END';
928 use Carp;
929 END
930 }
931
932 print PM <<'END';
933
934 require Exporter;
935 END
936
937 print PM <<"END" if ! $opt_X;  # use DynaLoader, unless XS was disabled
938 require DynaLoader;
939 END
940
941
942 # Are we using AutoLoader or not?
943 unless ($opt_A) { # no autoloader whatsoever.
944         unless ($opt_c) { # we're doing the AUTOLOAD
945                 print PM "use AutoLoader;\n";
946         }
947         else {
948                 print PM "use AutoLoader qw(AUTOLOAD);\n"
949         }
950 }
951
952 if ( $compat_version < 5.006 ) {
953     if ( $opt_X || $opt_c || $opt_A ) {
954         print PM 'use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);';
955     } else {
956         print PM 'use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $AUTOLOAD);';
957     }
958 }
959
960 # Determine @ISA.
961 my $myISA = 'our @ISA = qw(Exporter';   # We seem to always want this.
962 $myISA .= ' DynaLoader'         unless $opt_X;  # no XS
963 $myISA .= ');';
964 $myISA =~ s/^our // if $compat_version < 5.006;
965
966 print PM "\n$myISA\n\n";
967
968 my @exported_names = (@const_names, @fnames_no_prefix, map '$'.$_, @vdecls);
969
970 my $tmp=<<"END";
971 # Items to export into callers namespace by default. Note: do not export
972 # names by default without a very good reason. Use EXPORT_OK instead.
973 # Do not simply export all your public functions/methods/constants.
974
975 # This allows declaration       use $module ':all';
976 # If you do not need this, moving things directly into \@EXPORT or \@EXPORT_OK
977 # will save memory.
978 our %EXPORT_TAGS = ( 'all' => [ qw(
979         @exported_names
980 ) ] );
981
982 our \@EXPORT_OK = ( \@{ \$EXPORT_TAGS{'all'} } );
983
984 our \@EXPORT = qw(
985         @const_names
986 );
987 our \$VERSION = '$TEMPLATE_VERSION';
988
989 END
990
991 $tmp =~ s/^our //mg if $compat_version < 5.006;
992 print PM $tmp;
993
994 if (@vdecls) {
995     printf PM "our(@{[ join ', ', map '$'.$_, @vdecls ]});\n\n";
996 }
997
998
999 print PM autoload ($module, $compat_version) unless $opt_c or $opt_X;
1000
1001 if( ! $opt_X ){ # print bootstrap, unless XS is disabled
1002         print PM <<"END";
1003 bootstrap $module \$VERSION;
1004 END
1005 }
1006
1007 # tying the variables can happen only after bootstrap
1008 if (@vdecls) {
1009     printf PM <<END;
1010 {
1011 @{[ join "\n", map "    _tievar_$_(\$$_);", @vdecls ]}
1012 }
1013
1014 END
1015 }
1016
1017 my $after;
1018 if( $opt_P ){ # if POD is disabled
1019         $after = '__END__';
1020 }
1021 else {
1022         $after = '=cut';
1023 }
1024
1025 print PM <<"END";
1026
1027 # Preloaded methods go here.
1028 END
1029
1030 print PM <<"END" unless $opt_A;
1031
1032 # Autoload methods go after $after, and are processed by the autosplit program.
1033 END
1034
1035 print PM <<"END";
1036
1037 1;
1038 __END__
1039 END
1040
1041 my ($email,$author);
1042
1043 eval {
1044        my $user;
1045        ($user,$author) = (getpwuid($>))[0,6];
1046        $author =~ s/,.*$//; # in case of sub fields
1047        my $domain = $Config{'mydomain'};
1048        $domain =~ s/^\.//;
1049        $email = "$user\@$domain";
1050      };
1051
1052 $author ||= "A. U. Thor";
1053 $email  ||= 'a.u.thor@a.galaxy.far.far.away';
1054
1055 my $revhist = '';
1056 $revhist = <<EOT if $opt_C;
1057 #
1058 #=head1 HISTORY
1059 #
1060 #=over 8
1061 #
1062 #=item $TEMPLATE_VERSION
1063 #
1064 #Original version; created by h2xs $H2XS_VERSION with options
1065 #
1066 #  @ARGS
1067 #
1068 #=back
1069 #
1070 EOT
1071
1072 my $exp_doc = <<EOD;
1073 #
1074 #=head2 EXPORT
1075 #
1076 #None by default.
1077 #
1078 EOD
1079
1080 if (@const_names and not $opt_P) {
1081   $exp_doc .= <<EOD;
1082 #=head2 Exportable constants
1083 #
1084 #  @{[join "\n  ", @const_names]}
1085 #
1086 EOD
1087 }
1088
1089 if (defined $fdecls and @$fdecls and not $opt_P) {
1090   $exp_doc .= <<EOD;
1091 #=head2 Exportable functions
1092 #
1093 EOD
1094
1095 #  $exp_doc .= <<EOD if $opt_p;
1096 #When accessing these functions from Perl, prefix C<$opt_p> should be removed.
1097 #
1098 #EOD
1099   $exp_doc .= <<EOD;
1100 #  @{[join "\n  ", @known_fnames{@fnames}]}
1101 #
1102 EOD
1103 }
1104
1105 my $meth_doc = '';
1106
1107 if ($opt_x && $opt_a) {
1108   my($name, $struct);
1109   $meth_doc .= accessor_docs($name, $struct)
1110     while ($name, $struct) = each %structs;
1111 }
1112
1113 my $pod = <<"END" unless $opt_P;
1114 ## Below is stub documentation for your module. You better edit it!
1115 #
1116 #=head1 NAME
1117 #
1118 #$module - Perl extension for blah blah blah
1119 #
1120 #=head1 SYNOPSIS
1121 #
1122 #  use $module;
1123 #  blah blah blah
1124 #
1125 #=head1 ABSTRACT
1126 #
1127 #  This should be the abstract for $module.
1128 #  The abstract is used when making PPD (Perl Package Description) files.
1129 #  If you don't want an ABSTRACT you should also edit Makefile.PL to
1130 #  remove the ABSTRACT_FROM option.
1131 #
1132 #=head1 DESCRIPTION
1133 #
1134 #Stub documentation for $module, created by h2xs. It looks like the
1135 #author of the extension was negligent enough to leave the stub
1136 #unedited.
1137 #
1138 #Blah blah blah.
1139 $exp_doc$meth_doc$revhist
1140 #
1141 #=head1 SEE ALSO
1142 #
1143 #Mention other useful documentation such as the documentation of
1144 #related modules or operating system documentation (such as man pages
1145 #in UNIX), or any relevant external documentation such as RFCs or
1146 #standards.
1147 #
1148 #If you have a mailing list set up for your module, mention it here.
1149 #
1150 #If you have a web site set up for your module, mention it here.
1151 #
1152 #=head1 AUTHOR
1153 #
1154 #$author, E<lt>${email}E<gt>
1155 #
1156 #=head1 COPYRIGHT AND LICENSE
1157 #
1158 #Copyright ${\(1900 + (localtime) [5])} by $author
1159 #
1160 #This library is free software; you can redistribute it and/or modify
1161 #it under the same terms as Perl itself. 
1162 #
1163 #=cut
1164 END
1165
1166 $pod =~ s/^\#//gm unless $opt_P;
1167 print PM $pod unless $opt_P;
1168
1169 close PM;
1170
1171
1172 if( ! $opt_X ){ # print XS, unless it is disabled
1173 warn "Writing $ext$modpname/$modfname.xs\n";
1174
1175 print XS <<"END";
1176 #include "EXTERN.h"
1177 #include "perl.h"
1178 #include "XSUB.h"
1179
1180 END
1181 if( @path_h ){
1182     foreach my $path_h (@path_h_ini) {
1183         my($h) = $path_h;
1184         $h =~ s#^/usr/include/##;
1185         if ($^O eq 'VMS') { $h =~ s#.*vms\]#sys/# or $h =~ s#.*[:>\]]##; }
1186         print XS qq{#include <$h>\n};
1187     }
1188     print XS "\n";
1189 }
1190
1191 my %pointer_typedefs;
1192 my %struct_typedefs;
1193
1194 sub td_is_pointer {
1195   my $type = shift;
1196   my $out = $pointer_typedefs{$type};
1197   return $out if defined $out;
1198   my $otype = $type;
1199   $out = ($type =~ /\*$/);
1200   # This converts only the guys which do not have trailing part in the typedef
1201   if (not $out
1202       and $typedef_rex and $type =~ s/($typedef_rex)/$typedefs_pre{$1}/go) {
1203     $type = normalize_type($type);
1204     print "Is-Pointer: Type mutation via typedefs: $otype ==> $type\n"
1205       if $opt_d;
1206     $out = td_is_pointer($type);
1207   }
1208   return ($pointer_typedefs{$otype} = $out);
1209 }
1210
1211 sub td_is_struct {
1212   my $type = shift;
1213   my $out = $struct_typedefs{$type};
1214   return $out if defined $out;
1215   my $otype = $type;
1216   $out = ($type =~ /^(struct|union)\b/) && !td_is_pointer($type);
1217   # This converts only the guys which do not have trailing part in the typedef
1218   if (not $out
1219       and $typedef_rex and $type =~ s/($typedef_rex)/$typedefs_pre{$1}/go) {
1220     $type = normalize_type($type);
1221     print "Is-Struct: Type mutation via typedefs: $otype ==> $type\n"
1222       if $opt_d;
1223     $out = td_is_struct($type);
1224   }
1225   return ($struct_typedefs{$otype} = $out);
1226 }
1227
1228 my $types = {};
1229 # Important. Passing an undef scalar doesn't cause the
1230 # autovivified hashref to appear back out in this scope.
1231
1232 if( ! $opt_c ) {
1233   print XS constant_types(), "\n";
1234   foreach (C_constant ($module, undef, $opt_t, $types, undef, undef,
1235            @const_names)) {
1236     print XS $_, "\n";
1237   }
1238 }
1239
1240 print_tievar_subs(\*XS, $_, $vdecl_hash{$_}) for @vdecls;
1241
1242 my $prefix = defined $opt_p ? "PREFIX = $opt_p" : '';
1243
1244 # Now switch from C to XS by issuing the first MODULE declaration:
1245 print XS <<"END";
1246
1247 MODULE = $module                PACKAGE = $module               $prefix
1248
1249 END
1250
1251 foreach (sort keys %const_xsub) {
1252     print XS <<"END";
1253 char *
1254 $_()
1255
1256     CODE:
1257 #ifdef $_
1258         RETVAL = $_;
1259 #else
1260         croak("Your vendor has not defined the $module macro $_");
1261 #endif
1262
1263     OUTPUT:
1264         RETVAL
1265
1266 END
1267 }
1268
1269 # If a constant() function was written then output a corresponding
1270 # XS declaration:
1271 # XXX IVs
1272 print XS XS_constant ($module, $types) unless $opt_c;
1273
1274 my %seen_decl;
1275 my %typemap;
1276
1277 sub print_decl {
1278   my $fh = shift;
1279   my $decl = shift;
1280   my ($type, $name, $args) = @$decl;
1281   return if $seen_decl{$name}++; # Need to do the same for docs as well?
1282
1283   my @argnames = map {$_->[1]} @$args;
1284   my @argtypes = map { normalize_type( $_->[0], 1 ) } @$args;
1285   if ($opt_k) {
1286     s/^\s*const\b\s*// for @argtypes;
1287   }
1288   my @argarrays = map { $_->[4] || '' } @$args;
1289   my $numargs = @$args;
1290   if ($numargs and $argtypes[-1] eq '...') {
1291     $numargs--;
1292     $argnames[-1] = '...';
1293   }
1294   local $" = ', ';
1295   $type = normalize_type($type, 1);
1296
1297   print $fh <<"EOP";
1298
1299 $type
1300 $name(@argnames)
1301 EOP
1302
1303   for my $arg (0 .. $numargs - 1) {
1304     print $fh <<"EOP";
1305         $argtypes[$arg] $argnames[$arg]$argarrays[$arg]
1306 EOP
1307   }
1308 }
1309
1310 sub print_tievar_subs {
1311   my($fh, $name, $type) = @_;
1312   print $fh <<END;
1313 I32
1314 _get_$name(IV index, SV *sv) {
1315     dSP;
1316     PUSHMARK(SP);
1317     XPUSHs(sv);
1318     PUTBACK;
1319     (void)call_pv("$module\::_get_$name", G_DISCARD);
1320     return (I32)0;
1321 }
1322
1323 I32
1324 _set_$name(IV index, SV *sv) {
1325     dSP;
1326     PUSHMARK(SP);
1327     XPUSHs(sv);
1328     PUTBACK;
1329     (void)call_pv("$module\::_set_$name", G_DISCARD);
1330     return (I32)0;
1331 }
1332
1333 END
1334 }
1335
1336 sub print_tievar_xsubs {
1337   my($fh, $name, $type) = @_;
1338   print $fh <<END;
1339 void
1340 _tievar_$name(sv)
1341         SV* sv
1342     PREINIT:
1343         struct ufuncs uf;
1344     CODE:
1345         uf.uf_val = &_get_$name;
1346         uf.uf_set = &_set_$name;
1347         uf.uf_index = (IV)&_get_$name;
1348         sv_magic(sv, 0, 'U', (char*)&uf, sizeof(uf));
1349
1350 void
1351 _get_$name(THIS)
1352         $type THIS = NO_INIT
1353     CODE:
1354         THIS = $name;
1355     OUTPUT:
1356         SETMAGIC: DISABLE
1357         THIS
1358
1359 void
1360 _set_$name(THIS)
1361         $type THIS
1362     CODE:
1363         $name = THIS;
1364
1365 END
1366 }
1367
1368 sub print_accessors {
1369   my($fh, $name, $struct) = @_;
1370   return unless defined $struct && $name !~ /\s|_ANON/;
1371   $name = normalize_type($name);
1372   my $ptrname = normalize_type("$name *");
1373   print $fh <<"EOF";
1374
1375 MODULE = $module                PACKAGE = ${name}               $prefix
1376
1377 $name *
1378 _to_ptr(THIS)
1379         $name THIS = NO_INIT
1380     PROTOTYPE: \$
1381     CODE:
1382         if (sv_derived_from(ST(0), "$name")) {
1383             STRLEN len;
1384             char *s = SvPV((SV*)SvRV(ST(0)), len);
1385             if (len != sizeof(THIS))
1386                 croak("Size \%d of packed data != expected \%d",
1387                         len, sizeof(THIS));
1388             RETVAL = ($name *)s;
1389         }   
1390         else
1391             croak("THIS is not of type $name");
1392     OUTPUT:
1393         RETVAL
1394
1395 $name
1396 new(CLASS)
1397         char *CLASS = NO_INIT
1398     PROTOTYPE: \$
1399     CODE:
1400         Zero((void*)&RETVAL, sizeof(RETVAL), char);
1401     OUTPUT:
1402         RETVAL
1403
1404 MODULE = $module                PACKAGE = ${name}Ptr            $prefix
1405
1406 EOF
1407   my @items = @$struct;
1408   while (@items) {
1409     my $item = shift @items;
1410     if ($item->[0] =~ /_ANON/) {
1411       if (defined $item->[2]) {
1412         push @items, map [
1413           @$_[0, 1], "$item->[2]_$_->[2]", "$item->[2].$_->[2]",
1414         ], @{ $structs{$item->[0]} };
1415       } else {
1416         push @items, @{ $structs{$item->[0]} };
1417       }
1418     } else {
1419       my $type = normalize_type($item->[0]);
1420       my $ttype = $structs{$type} ? normalize_type("$type *") : $type;
1421       print $fh <<"EOF";
1422 $ttype
1423 $item->[2](THIS, __value = NO_INIT)
1424         $ptrname THIS
1425         $type __value
1426     PROTOTYPE: \$;\$
1427     CODE:
1428         if (items > 1)
1429             THIS->$item->[-1] = __value;
1430         RETVAL = @{[
1431             $type eq $ttype ? "THIS->$item->[-1]" : "&(THIS->$item->[-1])"
1432         ]};
1433     OUTPUT:
1434         RETVAL
1435
1436 EOF
1437     }
1438   }
1439 }
1440
1441 sub accessor_docs {
1442   my($name, $struct) = @_;
1443   return unless defined $struct && $name !~ /\s|_ANON/;
1444   $name = normalize_type($name);
1445   my $ptrname = $name . 'Ptr';
1446   my @items = @$struct;
1447   my @list;
1448   while (@items) {
1449     my $item = shift @items;
1450     if ($item->[0] =~ /_ANON/) {
1451       if (defined $item->[2]) {
1452         push @items, map [
1453           @$_[0, 1], "$item->[2]_$_->[2]", "$item->[2].$_->[2]",
1454         ], @{ $structs{$item->[0]} };
1455       } else {
1456         push @items, @{ $structs{$item->[0]} };
1457       }
1458     } else {
1459       push @list, $item->[2];
1460     }
1461   }
1462   my $methods = (join '(...)>, C<', @list) . '(...)';
1463
1464   my $pod = <<"EOF";
1465 #
1466 #=head2 Object and class methods for C<$name>/C<$ptrname>
1467 #
1468 #The principal Perl representation of a C object of type C<$name> is an
1469 #object of class C<$ptrname> which is a reference to an integer
1470 #representation of a C pointer.  To create such an object, one may use
1471 #a combination
1472 #
1473 #  my \$buffer = $name->new();
1474 #  my \$obj = \$buffer->_to_ptr();
1475 #
1476 #This exersizes the following two methods, and an additional class
1477 #C<$name>, the internal representation of which is a reference to a
1478 #packed string with the C structure.  Keep in mind that \$buffer should
1479 #better survive longer than \$obj.
1480 #
1481 #=over
1482 #
1483 #=item C<\$object_of_type_$name-E<gt>_to_ptr()>
1484 #
1485 #Converts an object of type C<$name> to an object of type C<$ptrname>.
1486 #
1487 #=item C<$name-E<gt>new()>
1488 #
1489 #Creates an empty object of type C<$name>.  The corresponding packed
1490 #string is zeroed out.
1491 #
1492 #=item C<$methods>
1493 #
1494 #return the current value of the corresponding element if called
1495 #without additional arguments.  Set the element to the supplied value
1496 #(and return the new value) if called with an additional argument.
1497 #
1498 #Applicable to objects of type C<$ptrname>.
1499 #
1500 #=back
1501 #
1502 EOF
1503   $pod =~ s/^\#//gm;
1504   return $pod;
1505 }
1506
1507 # Should be called before any actual call to normalize_type().
1508 sub get_typemap {
1509   # We do not want to read ./typemap by obvios reasons.
1510   my @tm =  qw(../../../typemap ../../typemap ../typemap);
1511   my $stdtypemap =  "$Config::Config{privlib}/ExtUtils/typemap";
1512   unshift @tm, $stdtypemap;
1513   my $proto_re = "[" . quotemeta('\$%&*@;') . "]" ;
1514
1515   # Start with useful default values
1516   $typemap{float} = 'T_NV';
1517
1518   foreach my $typemap (@tm) {
1519     next unless -e $typemap ;
1520     # skip directories, binary files etc.
1521     warn " Scanning $typemap\n";
1522     warn("Warning: ignoring non-text typemap file '$typemap'\n"), next 
1523       unless -T $typemap ;
1524     open(TYPEMAP, $typemap) 
1525       or warn ("Warning: could not open typemap file '$typemap': $!\n"), next;
1526     my $mode = 'Typemap';
1527     while (<TYPEMAP>) {
1528       next if /^\s*\#/;
1529       if (/^INPUT\s*$/)   { $mode = 'Input'; next; }
1530       elsif (/^OUTPUT\s*$/)  { $mode = 'Output'; next; }
1531       elsif (/^TYPEMAP\s*$/) { $mode = 'Typemap'; next; }
1532       elsif ($mode eq 'Typemap') {
1533         next if /^\s*($|\#)/ ;
1534         my ($type, $image);
1535         if ( ($type, $image) =
1536              /^\s*(.*?\S)\s+(\S+)\s*($proto_re*)\s*$/o
1537              # This may reference undefined functions:
1538              and not ($image eq 'T_PACKED' and $typemap eq $stdtypemap)) {
1539           $typemap{normalize_type($type)} = $image;
1540         }
1541       }
1542     }
1543     close(TYPEMAP) or die "Cannot close $typemap: $!";
1544   }
1545   %std_types = %types_seen;
1546   %types_seen = ();
1547 }
1548
1549
1550 sub normalize_type {            # Second arg: do not strip const's before \*
1551   my $type = shift;
1552   my $do_keep_deep_const = shift;
1553   # If $do_keep_deep_const this is heuristical only
1554   my $keep_deep_const = ($do_keep_deep_const ? '\b(?![^(,)]*\*)' : '');
1555   my $ignore_mods 
1556     = "(?:\\b(?:(?:__const__|const)$keep_deep_const|static|inline|__inline__)\\b\\s*)*";
1557   if ($do_keep_deep_const) {    # Keep different compiled /RExen/o separately!
1558     $type =~ s/$ignore_mods//go;
1559   }
1560   else {
1561     $type =~ s/$ignore_mods//go;
1562   }
1563   $type =~ s/([^\s\w])/ $1 /g;
1564   $type =~ s/\s+$//;
1565   $type =~ s/^\s+//;
1566   $type =~ s/\s+/ /g;
1567   $type =~ s/\* (?=\*)/*/g;
1568   $type =~ s/\. \. \./.../g;
1569   $type =~ s/ ,/,/g;
1570   $types_seen{$type}++ 
1571     unless $type eq '...' or $type eq 'void' or $std_types{$type};
1572   $type;
1573 }
1574
1575 my $need_opaque;
1576
1577 sub assign_typemap_entry {
1578   my $type = shift;
1579   my $otype = $type;
1580   my $entry;
1581   if ($tmask and $type =~ /$tmask/) {
1582     print "Type $type matches -o mask\n" if $opt_d;
1583     $entry = (td_is_struct($type) ? "T_OPAQUE_STRUCT" : "T_PTROBJ");
1584   }
1585   elsif ($typedef_rex and $type =~ s/($typedef_rex)/$typedefs_pre{$1}/go) {
1586     $type = normalize_type $type;
1587     print "Type mutation via typedefs: $otype ==> $type\n" if $opt_d;
1588     $entry = assign_typemap_entry($type);
1589   }
1590   $entry ||= $typemap{$otype}
1591     || (td_is_struct($type) ? "T_OPAQUE_STRUCT" : "T_PTROBJ");
1592   $typemap{$otype} = $entry;
1593   $need_opaque = 1 if $entry eq "T_OPAQUE_STRUCT";
1594   return $entry;
1595 }
1596
1597 for (@vdecls) {
1598   print_tievar_xsubs(\*XS, $_, $vdecl_hash{$_});
1599 }
1600
1601 if ($opt_x) {
1602   for my $decl (@$fdecls_parsed) { print_decl(\*XS, $decl) }
1603   if ($opt_a) {
1604     while (my($name, $struct) = each %structs) {
1605       print_accessors(\*XS, $name, $struct);
1606     }
1607   }
1608 }
1609
1610 close XS;
1611
1612 if (%types_seen) {
1613   my $type;
1614   warn "Writing $ext$modpname/typemap\n";
1615   open TM, ">typemap" or die "Cannot open typemap file for write: $!";
1616
1617   for $type (sort keys %types_seen) {
1618     my $entry = assign_typemap_entry $type;
1619     print TM $type, "\t" x (5 - int((length $type)/8)), "\t$entry\n"
1620   }
1621
1622   print TM <<'EOP' if $need_opaque; # Older Perls do not have correct entry
1623 #############################################################################
1624 INPUT
1625 T_OPAQUE_STRUCT
1626         if (sv_derived_from($arg, \"${ntype}\")) {
1627             STRLEN len;
1628             char  *s = SvPV((SV*)SvRV($arg), len);
1629
1630             if (len != sizeof($var))
1631                 croak(\"Size %d of packed data != expected %d\",
1632                         len, sizeof($var));
1633             $var = *($type *)s;
1634         }
1635         else
1636             croak(\"$var is not of type ${ntype}\")
1637 #############################################################################
1638 OUTPUT
1639 T_OPAQUE_STRUCT
1640         sv_setref_pvn($arg, \"${ntype}\", (char *)&$var, sizeof($var));
1641 EOP
1642
1643   close TM or die "Cannot close typemap file for write: $!";
1644 }
1645
1646 } # if( ! $opt_X )
1647
1648 warn "Writing $ext$modpname/Makefile.PL\n";
1649 open(PL, ">Makefile.PL") || die "Can't create $ext$modpname/Makefile.PL: $!\n";
1650
1651 my $prereq_pm;
1652
1653 if ( $compat_version < 5.00702 and $new_test )
1654 {
1655   $prereq_pm = q%'Test::More'  =>  0%;
1656 }
1657 else
1658 {
1659   $prereq_pm = '';
1660 }
1661
1662 print PL <<END;
1663 use ExtUtils::MakeMaker;
1664 # See lib/ExtUtils/MakeMaker.pm for details of how to influence
1665 # the contents of the Makefile that is written.
1666 WriteMakefile(
1667     'NAME'              => '$module',
1668     'VERSION_FROM'      => '$modfname.pm', # finds \$VERSION
1669     'PREREQ_PM'         => {$prereq_pm}, # e.g., Module::Name => 1.1
1670     (\$] >= 5.005 ?    ## Add these new keywords supported since 5.005
1671       (ABSTRACT_FROM => '$modfname.pm', # retrieve abstract from module
1672        AUTHOR     => '$author <$email>') : ()),
1673 END
1674 if (!$opt_X) { # print C stuff, unless XS is disabled
1675   $opt_F = '' unless defined $opt_F;
1676   my $I = (((glob '*.h') || (glob '*.hh')) ? '-I.' : '');
1677   my $Ihelp = ($I ? '-I. ' : '');
1678   my $Icomment = ($I ? '' : <<EOC);
1679         # Insert -I. if you add *.h files later:
1680 EOC
1681
1682   print PL <<END;
1683     'LIBS'              => ['$extralibs'], # e.g., '-lm'
1684     'DEFINE'            => '$opt_F', # e.g., '-DHAVE_SOMETHING'
1685 $Icomment    'INC'              => '$I', # e.g., '${Ihelp}-I/usr/include/other'
1686 END
1687
1688   my $C = grep $_ ne "$modfname.c", (glob '*.c'), (glob '*.cc'), (glob '*.C');
1689   my $Cpre = ($C ? '' : '# ');
1690   my $Ccomment = ($C ? '' : <<EOC);
1691         # Un-comment this if you add C files to link with later:
1692 EOC
1693
1694   print PL <<END;
1695 $Ccomment    $Cpre\'OBJECT'             => '\$(O_FILES)', # link all the C files too
1696 END
1697 }
1698 print PL ");\n";
1699 close(PL) || die "Can't close $ext$modpname/Makefile.PL: $!\n";
1700
1701 # Create a simple README since this is a CPAN requirement
1702 # and it doesnt hurt to have one
1703 warn "Writing $ext$modpname/README\n";
1704 open(RM, ">README") || die "Can't create $ext$modpname/README:$!\n";
1705 my $thisyear = (gmtime)[5] + 1900;
1706 my $rmhead = "$modpname version $TEMPLATE_VERSION";
1707 my $rmheadeq = "=" x length($rmhead);
1708
1709 my $rm_prereq;
1710
1711 if ( $compat_version < 5.00702 and $new_test )
1712 {
1713    $rm_prereq = 'Test::More';
1714 }
1715 else
1716 {
1717    $rm_prereq = 'blah blah blah';
1718 }
1719
1720 print RM <<_RMEND_;
1721 $rmhead
1722 $rmheadeq
1723
1724 The README is used to introduce the module and provide instructions on
1725 how to install the module, any machine dependencies it may have (for
1726 example C compilers and installed libraries) and any other information
1727 that should be provided before the module is installed.
1728
1729 A README file is required for CPAN modules since CPAN extracts the
1730 README file from a module distribution so that people browsing the
1731 archive can use it get an idea of the modules uses. It is usually a
1732 good idea to provide version information here so that people can
1733 decide whether fixes for the module are worth downloading.
1734
1735 INSTALLATION
1736
1737 To install this module type the following:
1738
1739    perl Makefile.PL
1740    make
1741    make test
1742    make install
1743
1744 DEPENDENCIES
1745
1746 This module requires these other modules and libraries:
1747
1748   $rm_prereq
1749
1750 COPYRIGHT AND LICENCE
1751
1752 Put the correct copyright and licence information here.
1753
1754 Copyright (C) $thisyear $author
1755
1756 This library is free software; you can redistribute it and/or modify
1757 it under the same terms as Perl itself. 
1758
1759 _RMEND_
1760 close(RM) || die "Can't close $ext$modpname/README: $!\n";
1761
1762 my $testdir  = "t";
1763 my $testfile = "$testdir/1.t";
1764 unless (-d "$testdir") {
1765   mkdir "$testdir" or die "Cannot mkdir $testdir: $!\n";
1766 }
1767 warn "Writing $ext$modpname/$testfile\n";
1768 my $tests = @const_names ? 2 : 1;
1769
1770 open EX, ">$testfile" or die "Can't create $ext$modpname/$testfile: $!\n";
1771
1772 print EX <<_END_;
1773 # Before `make install' is performed this script should be runnable with
1774 # `make test'. After `make install' it should work as `perl 1.t'
1775
1776 #########################
1777
1778 # change 'tests => $tests' to 'tests => last_test_to_print';
1779
1780 _END_
1781
1782 my $test_mod = 'Test::More';
1783
1784 if ( $old_test or ($compat_version < 5.007 and not $new_test ))
1785 {
1786   my $test_mod = 'Test';
1787
1788   print EX <<_END_;
1789 use Test;
1790 BEGIN { plan tests => $tests };
1791 use $module;
1792 ok(1); # If we made it this far, we're ok.
1793
1794 _END_
1795
1796    if (@const_names) {
1797      my $const_names = join " ", @const_names;
1798      print EX <<'_END_';
1799
1800 my $fail;
1801 foreach my $constname (qw(
1802 _END_
1803
1804      print EX wrap ("\t", "\t", $const_names);
1805      print EX (")) {\n");
1806
1807      print EX <<_END_;
1808   next if (eval "my \\\$a = \$constname; 1");
1809   if (\$\@ =~ /^Your vendor has not defined $module macro \$constname/) {
1810     print "# pass: \$\@";
1811   } else {
1812     print "# fail: \$\@";
1813     \$fail = 1;    
1814   }
1815 }
1816 if (\$fail) {
1817   print "not ok 2\\n";
1818 } else {
1819   print "ok 2\\n";
1820 }
1821
1822 _END_
1823   }
1824 }
1825 else
1826 {
1827   print EX <<_END_;
1828 use Test::More tests => $tests;
1829 BEGIN { use_ok('$module') };
1830
1831 _END_
1832
1833    if (@const_names) {
1834      my $const_names = join " ", @const_names;
1835      print EX <<'_END_';
1836
1837 my $fail = 0;
1838 foreach my $constname (qw(
1839 _END_
1840
1841      print EX wrap ("\t", "\t", $const_names);
1842      print EX (")) {\n");
1843
1844      print EX <<_END_;
1845   next if (eval "my \\\$a = \$constname; 1");
1846   if (\$\@ =~ /^Your vendor has not defined $module macro \$constname/) {
1847     print "# pass: \$\@";
1848   } else {
1849     print "# fail: \$\@";
1850     \$fail = 1;
1851   }
1852
1853 }
1854
1855 ok( \$fail == 0 , 'Constants' );
1856 _END_
1857   }
1858 }
1859
1860 print EX <<_END_;
1861 #########################
1862
1863 # Insert your test code below, the $test_mod module is use()ed here so read
1864 # its man page ( perldoc $test_mod ) for help writing this test script.
1865
1866 _END_
1867
1868 close(EX) || die "Can't close $ext$modpname/$testfile: $!\n";
1869
1870 unless ($opt_C) {
1871   warn "Writing $ext$modpname/Changes\n";
1872   $" = ' ';
1873   open(EX, ">Changes") || die "Can't create $ext$modpname/Changes: $!\n";
1874   @ARGS = map {/[\s\"\'\`\$*?^|&<>\[\]\{\}\(\)]/ ? "'$_'" : $_} @ARGS;
1875   print EX <<EOP;
1876 Revision history for Perl extension $module.
1877
1878 $TEMPLATE_VERSION  @{[scalar localtime]}
1879 \t- original version; created by h2xs $H2XS_VERSION with options
1880 \t\t@ARGS
1881
1882 EOP
1883   close(EX) || die "Can't close $ext$modpname/Changes: $!\n";
1884 }
1885
1886 warn "Writing $ext$modpname/MANIFEST\n";
1887 open(MANI,'>MANIFEST') or die "Can't create MANIFEST: $!";
1888 my @files = grep { -f } (<*>, <t/*>);
1889 if (!@files) {
1890   eval {opendir(D,'.');};
1891   unless ($@) { @files = readdir(D); closedir(D); }
1892 }
1893 if (!@files) { @files = map {chomp && $_} `ls`; }
1894 if ($^O eq 'VMS') {
1895   foreach (@files) {
1896     # Clip trailing '.' for portability -- non-VMS OSs don't expect it
1897     s%\.$%%;
1898     # Fix up for case-sensitive file systems
1899     s/$modfname/$modfname/i && next;
1900     $_ = "\U$_" if $_ eq 'manifest' or $_ eq 'changes';
1901     $_ = 'Makefile.PL' if $_ eq 'makefile.pl';
1902   }
1903 }
1904 print MANI join("\n",@files), "\n";
1905 close MANI;
1906 !NO!SUBS!
1907
1908 close OUT or die "Can't close $file: $!";
1909 chmod 0755, $file or die "Can't reset permissions for $file: $!\n";
1910 exec("$Config{'eunicefix'} $file") if $Config{'eunicefix'} ne ':';
1911 chdir $origdir;