Typo in DB_File.pm
[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       $c = new C::Scan 'filename' => $filename, 'filename_filter' => $filter,
812         'add_cppflags' => $addflags, 'c_styles' => [qw(C++ C9X)];
813       $c->set('includeDirs' => ["$Config::Config{archlib}/CORE"]);
814
815       push @$fdecls_parsed, @{ $c->get('parsed_fdecls') };
816       push(@$fdecls, @{$c->get('fdecls')});
817
818       push @td, @{$c->get('typedefs_maybe')};
819       if ($opt_a) {
820         my $structs = $c->get('typedef_structs');
821         @structs{keys %$structs} = values %$structs;
822       }
823
824       if ($opt_m) {
825         %vdecl_hash = %{ $c->get('vdecl_hash') };
826         @vdecls = sort keys %vdecl_hash;
827         for (local $_ = 0; $_ < @vdecls; ++$_) {
828           my $var = $vdecls[$_];
829           my($type, $post) = @{ $vdecl_hash{$var} };
830           if (defined $post) {
831             warn "Can't handle variable '$type $var $post', skipping.\n";
832             splice @vdecls, $_, 1;
833             redo;
834           }
835           $type = normalize_type($type);
836           $vdecl_hash{$var} = $type;
837         }
838       }
839
840       unless ($tmask_all) {
841         warn "Scanning $filename for typedefs...\n";
842         my $td = $c->get('typedef_hash');
843         # eval {require 'dumpvar.pl'; ::dumpValue($td)} or warn $@ if $opt_d;
844         my @f_good_td = grep $td->{$_}[1] eq '', keys %$td;
845         push @good_td, @f_good_td;
846         @typedefs_pre{@f_good_td}  = map $_->[0], @$td{@f_good_td};
847       }
848     }
849     { local $" = '|';
850       $typedef_rex = qr(\b(?<!struct )(?:@good_td)\b) if @good_td;
851     }
852     %known_fnames = map @$_[1,3], @$fdecls_parsed; # [1,3] is NAME, FULLTEXT
853     if ($fmask) {
854       my @good;
855       for my $i (0..$#$fdecls_parsed) {
856         next unless $fdecls_parsed->[$i][1] =~ /$fmask/; # [1] is NAME
857         push @good, $i;
858         print "... Function $fdecls_parsed->[$i][1] passes -M mask.\n"
859           if $opt_d;
860       }
861       $fdecls = [@$fdecls[@good]];
862       $fdecls_parsed = [@$fdecls_parsed[@good]];
863     }
864     @fnames = sort map $_->[1], @$fdecls_parsed; # 1 is NAME
865     # Sort declarations:
866     {
867       my %h = map( ($_->[1], $_), @$fdecls_parsed);
868       $fdecls_parsed = [ @h{@fnames} ];
869     }
870     @fnames_no_prefix = @fnames;
871     @fnames_no_prefix
872       = sort map { ++$prefix{$_} if s/^$opt_p(?!\d)//; $_ } @fnames_no_prefix;
873     # Remove macros which expand to typedefs
874     print "Typedefs are @td.\n" if $opt_d;
875     my %td = map {($_, $_)} @td;
876     # Add some other possible but meaningless values for macros
877     for my $k (qw(char double float int long short unsigned signed void)) {
878       $td{"$_$k"} = "$_$k" for ('', 'signed ', 'unsigned ');
879     }
880     # eval {require 'dumpvar.pl'; ::dumpValue( [\@td, \%td] ); 1} or warn $@;
881     my $n = 0;
882     my %bad_macs;
883     while (keys %td > $n) {
884       $n = keys %td;
885       my ($k, $v);
886       while (($k, $v) = each %seen_define) {
887         # print("found '$k'=>'$v'\n"), 
888         $bad_macs{$k} = $td{$k} = $td{$v} if exists $td{$v};
889       }
890     }
891     # Now %bad_macs contains names of bad macros
892     for my $k (keys %bad_macs) {
893       delete $const_names{$prefixless{$k}};
894       print "Ignoring macro $k which expands to a typedef name '$bad_macs{$k}'\n" if $opt_d;
895     }
896   }
897 }
898 my @const_names = sort keys %const_names;
899
900 open(PM, ">$modfname.pm") || die "Can't create $ext$modpname/$modfname.pm: $!\n";
901
902 $" = "\n\t";
903 warn "Writing $ext$modpname/$modfname.pm\n";
904
905 if ( $compat_version < 5.006 ) {
906 print PM <<"END";
907 package $module;
908
909 use $compat_version;
910 use strict;
911 END
912
913 else {
914 print PM <<"END";
915 package $module;
916
917 use 5.006;
918 use strict;
919 use warnings;
920 END
921 }
922
923 unless( $opt_X || $opt_c || $opt_A ){
924         # we'll have an AUTOLOAD(), and it will have $AUTOLOAD and
925         # will want Carp.
926         print PM <<'END';
927 use Carp;
928 END
929 }
930
931 print PM <<'END';
932
933 require Exporter;
934 END
935
936 print PM <<"END" if ! $opt_X;  # use DynaLoader, unless XS was disabled
937 require DynaLoader;
938 END
939
940
941 # Are we using AutoLoader or not?
942 unless ($opt_A) { # no autoloader whatsoever.
943         unless ($opt_c) { # we're doing the AUTOLOAD
944                 print PM "use AutoLoader;\n";
945         }
946         else {
947                 print PM "use AutoLoader qw(AUTOLOAD);\n"
948         }
949 }
950
951 if ( $compat_version < 5.006 ) {
952     if ( $opt_X || $opt_c || $opt_A ) {
953         print PM 'use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);';
954     } else {
955         print PM 'use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $AUTOLOAD);';
956     }
957 }
958
959 # Determine @ISA.
960 my $myISA = 'our @ISA = qw(Exporter';   # We seem to always want this.
961 $myISA .= ' DynaLoader'         unless $opt_X;  # no XS
962 $myISA .= ');';
963 $myISA =~ s/^our // if $compat_version < 5.006;
964
965 print PM "\n$myISA\n\n";
966
967 my @exported_names = (@const_names, @fnames_no_prefix, map '$'.$_, @vdecls);
968
969 my $tmp=<<"END";
970 # Items to export into callers namespace by default. Note: do not export
971 # names by default without a very good reason. Use EXPORT_OK instead.
972 # Do not simply export all your public functions/methods/constants.
973
974 # This allows declaration       use $module ':all';
975 # If you do not need this, moving things directly into \@EXPORT or \@EXPORT_OK
976 # will save memory.
977 our %EXPORT_TAGS = ( 'all' => [ qw(
978         @exported_names
979 ) ] );
980
981 our \@EXPORT_OK = ( \@{ \$EXPORT_TAGS{'all'} } );
982
983 our \@EXPORT = qw(
984         @const_names
985 );
986 our \$VERSION = '$TEMPLATE_VERSION';
987
988 END
989
990 $tmp =~ s/^our //mg if $compat_version < 5.006;
991 print PM $tmp;
992
993 if (@vdecls) {
994     printf PM "our(@{[ join ', ', map '$'.$_, @vdecls ]});\n\n";
995 }
996
997
998 print PM autoload ($module, $compat_version) unless $opt_c or $opt_X;
999
1000 if( ! $opt_X ){ # print bootstrap, unless XS is disabled
1001         print PM <<"END";
1002 bootstrap $module \$VERSION;
1003 END
1004 }
1005
1006 # tying the variables can happen only after bootstrap
1007 if (@vdecls) {
1008     printf PM <<END;
1009 {
1010 @{[ join "\n", map "    _tievar_$_(\$$_);", @vdecls ]}
1011 }
1012
1013 END
1014 }
1015
1016 my $after;
1017 if( $opt_P ){ # if POD is disabled
1018         $after = '__END__';
1019 }
1020 else {
1021         $after = '=cut';
1022 }
1023
1024 print PM <<"END";
1025
1026 # Preloaded methods go here.
1027 END
1028
1029 print PM <<"END" unless $opt_A;
1030
1031 # Autoload methods go after $after, and are processed by the autosplit program.
1032 END
1033
1034 print PM <<"END";
1035
1036 1;
1037 __END__
1038 END
1039
1040 my ($email,$author);
1041
1042 eval {
1043        my $user;
1044        ($user,$author) = (getpwuid($>))[0,6];
1045        $author =~ s/,.*$//; # in case of sub fields
1046        my $domain = $Config{'mydomain'};
1047        $domain =~ s/^\.//;
1048        $email = "$user\@$domain";
1049      };
1050
1051 $author ||= "A. U. Thor";
1052 $email  ||= 'a.u.thor@a.galaxy.far.far.away';
1053
1054 my $revhist = '';
1055 $revhist = <<EOT if $opt_C;
1056 #
1057 #=head1 HISTORY
1058 #
1059 #=over 8
1060 #
1061 #=item $TEMPLATE_VERSION
1062 #
1063 #Original version; created by h2xs $H2XS_VERSION with options
1064 #
1065 #  @ARGS
1066 #
1067 #=back
1068 #
1069 EOT
1070
1071 my $exp_doc = <<EOD;
1072 #
1073 #=head2 EXPORT
1074 #
1075 #None by default.
1076 #
1077 EOD
1078
1079 if (@const_names and not $opt_P) {
1080   $exp_doc .= <<EOD;
1081 #=head2 Exportable constants
1082 #
1083 #  @{[join "\n  ", @const_names]}
1084 #
1085 EOD
1086 }
1087
1088 if (defined $fdecls and @$fdecls and not $opt_P) {
1089   $exp_doc .= <<EOD;
1090 #=head2 Exportable functions
1091 #
1092 EOD
1093
1094 #  $exp_doc .= <<EOD if $opt_p;
1095 #When accessing these functions from Perl, prefix C<$opt_p> should be removed.
1096 #
1097 #EOD
1098   $exp_doc .= <<EOD;
1099 #  @{[join "\n  ", @known_fnames{@fnames}]}
1100 #
1101 EOD
1102 }
1103
1104 my $meth_doc = '';
1105
1106 if ($opt_x && $opt_a) {
1107   my($name, $struct);
1108   $meth_doc .= accessor_docs($name, $struct)
1109     while ($name, $struct) = each %structs;
1110 }
1111
1112 my $pod = <<"END" unless $opt_P;
1113 ## Below is stub documentation for your module. You better edit it!
1114 #
1115 #=head1 NAME
1116 #
1117 #$module - Perl extension for blah blah blah
1118 #
1119 #=head1 SYNOPSIS
1120 #
1121 #  use $module;
1122 #  blah blah blah
1123 #
1124 #=head1 ABSTRACT
1125 #
1126 #  This should be the abstract for $module.
1127 #  The abstract is used when making PPD (Perl Package Description) files.
1128 #  If you don't want an ABSTRACT you should also edit Makefile.PL to
1129 #  remove the ABSTRACT_FROM option.
1130 #
1131 #=head1 DESCRIPTION
1132 #
1133 #Stub documentation for $module, created by h2xs. It looks like the
1134 #author of the extension was negligent enough to leave the stub
1135 #unedited.
1136 #
1137 #Blah blah blah.
1138 $exp_doc$meth_doc$revhist
1139 #
1140 #=head1 SEE ALSO
1141 #
1142 #Mention other useful documentation such as the documentation of
1143 #related modules or operating system documentation (such as man pages
1144 #in UNIX), or any relevant external documentation such as RFCs or
1145 #standards.
1146 #
1147 #If you have a mailing list set up for your module, mention it here.
1148 #
1149 #If you have a web site set up for your module, mention it here.
1150 #
1151 #=head1 AUTHOR
1152 #
1153 #$author, E<lt>${email}E<gt>
1154 #
1155 #=head1 COPYRIGHT AND LICENSE
1156 #
1157 #Copyright ${\(1900 + (localtime) [5])} by $author
1158 #
1159 #This library is free software; you can redistribute it and/or modify
1160 #it under the same terms as Perl itself. 
1161 #
1162 #=cut
1163 END
1164
1165 $pod =~ s/^\#//gm unless $opt_P;
1166 print PM $pod unless $opt_P;
1167
1168 close PM;
1169
1170
1171 if( ! $opt_X ){ # print XS, unless it is disabled
1172 warn "Writing $ext$modpname/$modfname.xs\n";
1173
1174 print XS <<"END";
1175 #include "EXTERN.h"
1176 #include "perl.h"
1177 #include "XSUB.h"
1178
1179 END
1180 if( @path_h ){
1181     foreach my $path_h (@path_h_ini) {
1182         my($h) = $path_h;
1183         $h =~ s#^/usr/include/##;
1184         if ($^O eq 'VMS') { $h =~ s#.*vms\]#sys/# or $h =~ s#.*[:>\]]##; }
1185         print XS qq{#include <$h>\n};
1186     }
1187     print XS "\n";
1188 }
1189
1190 my %pointer_typedefs;
1191 my %struct_typedefs;
1192
1193 sub td_is_pointer {
1194   my $type = shift;
1195   my $out = $pointer_typedefs{$type};
1196   return $out if defined $out;
1197   my $otype = $type;
1198   $out = ($type =~ /\*$/);
1199   # This converts only the guys which do not have trailing part in the typedef
1200   if (not $out
1201       and $typedef_rex and $type =~ s/($typedef_rex)/$typedefs_pre{$1}/go) {
1202     $type = normalize_type($type);
1203     print "Is-Pointer: Type mutation via typedefs: $otype ==> $type\n"
1204       if $opt_d;
1205     $out = td_is_pointer($type);
1206   }
1207   return ($pointer_typedefs{$otype} = $out);
1208 }
1209
1210 sub td_is_struct {
1211   my $type = shift;
1212   my $out = $struct_typedefs{$type};
1213   return $out if defined $out;
1214   my $otype = $type;
1215   $out = ($type =~ /^(struct|union)\b/) && !td_is_pointer($type);
1216   # This converts only the guys which do not have trailing part in the typedef
1217   if (not $out
1218       and $typedef_rex and $type =~ s/($typedef_rex)/$typedefs_pre{$1}/go) {
1219     $type = normalize_type($type);
1220     print "Is-Struct: Type mutation via typedefs: $otype ==> $type\n"
1221       if $opt_d;
1222     $out = td_is_struct($type);
1223   }
1224   return ($struct_typedefs{$otype} = $out);
1225 }
1226
1227 my $types = {};
1228 # Important. Passing an undef scalar doesn't cause the
1229 # autovivified hashref to appear back out in this scope.
1230
1231 if( ! $opt_c ) {
1232   print XS constant_types(), "\n";
1233   foreach (C_constant ($module, undef, $opt_t, $types, undef, undef,
1234            @const_names)) {
1235     print XS $_, "\n";
1236   }
1237 }
1238
1239 print_tievar_subs(\*XS, $_, $vdecl_hash{$_}) for @vdecls;
1240
1241 my $prefix = defined $opt_p ? "PREFIX = $opt_p" : '';
1242
1243 # Now switch from C to XS by issuing the first MODULE declaration:
1244 print XS <<"END";
1245
1246 MODULE = $module                PACKAGE = $module               $prefix
1247
1248 END
1249
1250 foreach (sort keys %const_xsub) {
1251     print XS <<"END";
1252 char *
1253 $_()
1254
1255     CODE:
1256 #ifdef $_
1257         RETVAL = $_;
1258 #else
1259         croak("Your vendor has not defined the $module macro $_");
1260 #endif
1261
1262     OUTPUT:
1263         RETVAL
1264
1265 END
1266 }
1267
1268 # If a constant() function was written then output a corresponding
1269 # XS declaration:
1270 # XXX IVs
1271 print XS XS_constant ($module, $types) unless $opt_c;
1272
1273 my %seen_decl;
1274 my %typemap;
1275
1276 sub print_decl {
1277   my $fh = shift;
1278   my $decl = shift;
1279   my ($type, $name, $args) = @$decl;
1280   return if $seen_decl{$name}++; # Need to do the same for docs as well?
1281
1282   my @argnames = map {$_->[1]} @$args;
1283   my @argtypes = map { normalize_type( $_->[0], 1 ) } @$args;
1284   if ($opt_k) {
1285     s/^\s*const\b\s*// for @argtypes;
1286   }
1287   my @argarrays = map { $_->[4] || '' } @$args;
1288   my $numargs = @$args;
1289   if ($numargs and $argtypes[-1] eq '...') {
1290     $numargs--;
1291     $argnames[-1] = '...';
1292   }
1293   local $" = ', ';
1294   $type = normalize_type($type, 1);
1295
1296   print $fh <<"EOP";
1297
1298 $type
1299 $name(@argnames)
1300 EOP
1301
1302   for my $arg (0 .. $numargs - 1) {
1303     print $fh <<"EOP";
1304         $argtypes[$arg] $argnames[$arg]$argarrays[$arg]
1305 EOP
1306   }
1307 }
1308
1309 sub print_tievar_subs {
1310   my($fh, $name, $type) = @_;
1311   print $fh <<END;
1312 I32
1313 _get_$name(IV index, SV *sv) {
1314     dSP;
1315     PUSHMARK(SP);
1316     XPUSHs(sv);
1317     PUTBACK;
1318     (void)call_pv("$module\::_get_$name", G_DISCARD);
1319     return (I32)0;
1320 }
1321
1322 I32
1323 _set_$name(IV index, SV *sv) {
1324     dSP;
1325     PUSHMARK(SP);
1326     XPUSHs(sv);
1327     PUTBACK;
1328     (void)call_pv("$module\::_set_$name", G_DISCARD);
1329     return (I32)0;
1330 }
1331
1332 END
1333 }
1334
1335 sub print_tievar_xsubs {
1336   my($fh, $name, $type) = @_;
1337   print $fh <<END;
1338 void
1339 _tievar_$name(sv)
1340         SV* sv
1341     PREINIT:
1342         struct ufuncs uf;
1343     CODE:
1344         uf.uf_val = &_get_$name;
1345         uf.uf_set = &_set_$name;
1346         uf.uf_index = (IV)&_get_$name;
1347         sv_magic(sv, 0, 'U', (char*)&uf, sizeof(uf));
1348
1349 void
1350 _get_$name(THIS)
1351         $type THIS = NO_INIT
1352     CODE:
1353         THIS = $name;
1354     OUTPUT:
1355         SETMAGIC: DISABLE
1356         THIS
1357
1358 void
1359 _set_$name(THIS)
1360         $type THIS
1361     CODE:
1362         $name = THIS;
1363
1364 END
1365 }
1366
1367 sub print_accessors {
1368   my($fh, $name, $struct) = @_;
1369   return unless defined $struct && $name !~ /\s|_ANON/;
1370   $name = normalize_type($name);
1371   my $ptrname = normalize_type("$name *");
1372   print $fh <<"EOF";
1373
1374 MODULE = $module                PACKAGE = ${name}               $prefix
1375
1376 $name *
1377 _to_ptr(THIS)
1378         $name THIS = NO_INIT
1379     PROTOTYPE: \$
1380     CODE:
1381         if (sv_derived_from(ST(0), "$name")) {
1382             STRLEN len;
1383             char *s = SvPV((SV*)SvRV(ST(0)), len);
1384             if (len != sizeof(THIS))
1385                 croak("Size \%d of packed data != expected \%d",
1386                         len, sizeof(THIS));
1387             RETVAL = ($name *)s;
1388         }   
1389         else
1390             croak("THIS is not of type $name");
1391     OUTPUT:
1392         RETVAL
1393
1394 $name
1395 new(CLASS)
1396         char *CLASS = NO_INIT
1397     PROTOTYPE: \$
1398     CODE:
1399         Zero((void*)&RETVAL, sizeof(RETVAL), char);
1400     OUTPUT:
1401         RETVAL
1402
1403 MODULE = $module                PACKAGE = ${name}Ptr            $prefix
1404
1405 EOF
1406   my @items = @$struct;
1407   while (@items) {
1408     my $item = shift @items;
1409     if ($item->[0] =~ /_ANON/) {
1410       if (defined $item->[2]) {
1411         push @items, map [
1412           @$_[0, 1], "$item->[2]_$_->[2]", "$item->[2].$_->[2]",
1413         ], @{ $structs{$item->[0]} };
1414       } else {
1415         push @items, @{ $structs{$item->[0]} };
1416       }
1417     } else {
1418       my $type = normalize_type($item->[0]);
1419       my $ttype = $structs{$type} ? normalize_type("$type *") : $type;
1420       print $fh <<"EOF";
1421 $ttype
1422 $item->[2](THIS, __value = NO_INIT)
1423         $ptrname THIS
1424         $type __value
1425     PROTOTYPE: \$;\$
1426     CODE:
1427         if (items > 1)
1428             THIS->$item->[-1] = __value;
1429         RETVAL = @{[
1430             $type eq $ttype ? "THIS->$item->[-1]" : "&(THIS->$item->[-1])"
1431         ]};
1432     OUTPUT:
1433         RETVAL
1434
1435 EOF
1436     }
1437   }
1438 }
1439
1440 sub accessor_docs {
1441   my($name, $struct) = @_;
1442   return unless defined $struct && $name !~ /\s|_ANON/;
1443   $name = normalize_type($name);
1444   my $ptrname = $name . 'Ptr';
1445   my @items = @$struct;
1446   my @list;
1447   while (@items) {
1448     my $item = shift @items;
1449     if ($item->[0] =~ /_ANON/) {
1450       if (defined $item->[2]) {
1451         push @items, map [
1452           @$_[0, 1], "$item->[2]_$_->[2]", "$item->[2].$_->[2]",
1453         ], @{ $structs{$item->[0]} };
1454       } else {
1455         push @items, @{ $structs{$item->[0]} };
1456       }
1457     } else {
1458       push @list, $item->[2];
1459     }
1460   }
1461   my $methods = (join '(...)>, C<', @list) . '(...)';
1462
1463   my $pod = <<"EOF";
1464 #
1465 #=head2 Object and class methods for C<$name>/C<$ptrname>
1466 #
1467 #The principal Perl representation of a C object of type C<$name> is an
1468 #object of class C<$ptrname> which is a reference to an integer
1469 #representation of a C pointer.  To create such an object, one may use
1470 #a combination
1471 #
1472 #  my \$buffer = $name->new();
1473 #  my \$obj = \$buffer->_to_ptr();
1474 #
1475 #This exersizes the following two methods, and an additional class
1476 #C<$name>, the internal representation of which is a reference to a
1477 #packed string with the C structure.  Keep in mind that \$buffer should
1478 #better survive longer than \$obj.
1479 #
1480 #=over
1481 #
1482 #=item C<\$object_of_type_$name-E<gt>_to_ptr()>
1483 #
1484 #Converts an object of type C<$name> to an object of type C<$ptrname>.
1485 #
1486 #=item C<$name-E<gt>new()>
1487 #
1488 #Creates an empty object of type C<$name>.  The corresponding packed
1489 #string is zeroed out.
1490 #
1491 #=item C<$methods>
1492 #
1493 #return the current value of the corresponding element if called
1494 #without additional arguments.  Set the element to the supplied value
1495 #(and return the new value) if called with an additional argument.
1496 #
1497 #Applicable to objects of type C<$ptrname>.
1498 #
1499 #=back
1500 #
1501 EOF
1502   $pod =~ s/^\#//gm;
1503   return $pod;
1504 }
1505
1506 # Should be called before any actual call to normalize_type().
1507 sub get_typemap {
1508   # We do not want to read ./typemap by obvios reasons.
1509   my @tm =  qw(../../../typemap ../../typemap ../typemap);
1510   my $stdtypemap =  "$Config::Config{privlib}/ExtUtils/typemap";
1511   unshift @tm, $stdtypemap;
1512   my $proto_re = "[" . quotemeta('\$%&*@;') . "]" ;
1513
1514   # Start with useful default values
1515   $typemap{float} = 'T_NV';
1516
1517   foreach my $typemap (@tm) {
1518     next unless -e $typemap ;
1519     # skip directories, binary files etc.
1520     warn " Scanning $typemap\n";
1521     warn("Warning: ignoring non-text typemap file '$typemap'\n"), next 
1522       unless -T $typemap ;
1523     open(TYPEMAP, $typemap) 
1524       or warn ("Warning: could not open typemap file '$typemap': $!\n"), next;
1525     my $mode = 'Typemap';
1526     while (<TYPEMAP>) {
1527       next if /^\s*\#/;
1528       if (/^INPUT\s*$/)   { $mode = 'Input'; next; }
1529       elsif (/^OUTPUT\s*$/)  { $mode = 'Output'; next; }
1530       elsif (/^TYPEMAP\s*$/) { $mode = 'Typemap'; next; }
1531       elsif ($mode eq 'Typemap') {
1532         next if /^\s*($|\#)/ ;
1533         my ($type, $image);
1534         if ( ($type, $image) =
1535              /^\s*(.*?\S)\s+(\S+)\s*($proto_re*)\s*$/o
1536              # This may reference undefined functions:
1537              and not ($image eq 'T_PACKED' and $typemap eq $stdtypemap)) {
1538           $typemap{normalize_type($type)} = $image;
1539         }
1540       }
1541     }
1542     close(TYPEMAP) or die "Cannot close $typemap: $!";
1543   }
1544   %std_types = %types_seen;
1545   %types_seen = ();
1546 }
1547
1548
1549 sub normalize_type {            # Second arg: do not strip const's before \*
1550   my $type = shift;
1551   my $do_keep_deep_const = shift;
1552   # If $do_keep_deep_const this is heuristical only
1553   my $keep_deep_const = ($do_keep_deep_const ? '\b(?![^(,)]*\*)' : '');
1554   my $ignore_mods 
1555     = "(?:\\b(?:(?:__const__|const)$keep_deep_const|static|inline|__inline__)\\b\\s*)*";
1556   if ($do_keep_deep_const) {    # Keep different compiled /RExen/o separately!
1557     $type =~ s/$ignore_mods//go;
1558   }
1559   else {
1560     $type =~ s/$ignore_mods//go;
1561   }
1562   $type =~ s/([^\s\w])/ $1 /g;
1563   $type =~ s/\s+$//;
1564   $type =~ s/^\s+//;
1565   $type =~ s/\s+/ /g;
1566   $type =~ s/\* (?=\*)/*/g;
1567   $type =~ s/\. \. \./.../g;
1568   $type =~ s/ ,/,/g;
1569   $types_seen{$type}++ 
1570     unless $type eq '...' or $type eq 'void' or $std_types{$type};
1571   $type;
1572 }
1573
1574 my $need_opaque;
1575
1576 sub assign_typemap_entry {
1577   my $type = shift;
1578   my $otype = $type;
1579   my $entry;
1580   if ($tmask and $type =~ /$tmask/) {
1581     print "Type $type matches -o mask\n" if $opt_d;
1582     $entry = (td_is_struct($type) ? "T_OPAQUE_STRUCT" : "T_PTROBJ");
1583   }
1584   elsif ($typedef_rex and $type =~ s/($typedef_rex)/$typedefs_pre{$1}/go) {
1585     $type = normalize_type $type;
1586     print "Type mutation via typedefs: $otype ==> $type\n" if $opt_d;
1587     $entry = assign_typemap_entry($type);
1588   }
1589   $entry ||= $typemap{$otype}
1590     || (td_is_struct($type) ? "T_OPAQUE_STRUCT" : "T_PTROBJ");
1591   $typemap{$otype} = $entry;
1592   $need_opaque = 1 if $entry eq "T_OPAQUE_STRUCT";
1593   return $entry;
1594 }
1595
1596 for (@vdecls) {
1597   print_tievar_xsubs(\*XS, $_, $vdecl_hash{$_});
1598 }
1599
1600 if ($opt_x) {
1601   for my $decl (@$fdecls_parsed) { print_decl(\*XS, $decl) }
1602   if ($opt_a) {
1603     while (my($name, $struct) = each %structs) {
1604       print_accessors(\*XS, $name, $struct);
1605     }
1606   }
1607 }
1608
1609 close XS;
1610
1611 if (%types_seen) {
1612   my $type;
1613   warn "Writing $ext$modpname/typemap\n";
1614   open TM, ">typemap" or die "Cannot open typemap file for write: $!";
1615
1616   for $type (sort keys %types_seen) {
1617     my $entry = assign_typemap_entry $type;
1618     print TM $type, "\t" x (5 - int((length $type)/8)), "\t$entry\n"
1619   }
1620
1621   print TM <<'EOP' if $need_opaque; # Older Perls do not have correct entry
1622 #############################################################################
1623 INPUT
1624 T_OPAQUE_STRUCT
1625         if (sv_derived_from($arg, \"${ntype}\")) {
1626             STRLEN len;
1627             char  *s = SvPV((SV*)SvRV($arg), len);
1628
1629             if (len != sizeof($var))
1630                 croak(\"Size %d of packed data != expected %d\",
1631                         len, sizeof($var));
1632             $var = *($type *)s;
1633         }
1634         else
1635             croak(\"$var is not of type ${ntype}\")
1636 #############################################################################
1637 OUTPUT
1638 T_OPAQUE_STRUCT
1639         sv_setref_pvn($arg, \"${ntype}\", (char *)&$var, sizeof($var));
1640 EOP
1641
1642   close TM or die "Cannot close typemap file for write: $!";
1643 }
1644
1645 } # if( ! $opt_X )
1646
1647 warn "Writing $ext$modpname/Makefile.PL\n";
1648 open(PL, ">Makefile.PL") || die "Can't create $ext$modpname/Makefile.PL: $!\n";
1649
1650 my $prereq_pm;
1651
1652 if ( $compat_version < 5.00702 and $new_test )
1653 {
1654   $prereq_pm = q%'Test::More'  =>  0%;
1655 }
1656 else
1657 {
1658   $prereq_pm = '';
1659 }
1660
1661 print PL <<END;
1662 use ExtUtils::MakeMaker;
1663 # See lib/ExtUtils/MakeMaker.pm for details of how to influence
1664 # the contents of the Makefile that is written.
1665 WriteMakefile(
1666     'NAME'              => '$module',
1667     'VERSION_FROM'      => '$modfname.pm', # finds \$VERSION
1668     'PREREQ_PM'         => {$prereq_pm}, # e.g., Module::Name => 1.1
1669     (\$] >= 5.005 ?    ## Add these new keywords supported since 5.005
1670       (ABSTRACT_FROM => '$modfname.pm', # retrieve abstract from module
1671        AUTHOR     => '$author <$email>') : ()),
1672 END
1673 if (!$opt_X) { # print C stuff, unless XS is disabled
1674   $opt_F = '' unless defined $opt_F;
1675   my $I = (((glob '*.h') || (glob '*.hh')) ? '-I.' : '');
1676   my $Ihelp = ($I ? '-I. ' : '');
1677   my $Icomment = ($I ? '' : <<EOC);
1678         # Insert -I. if you add *.h files later:
1679 EOC
1680
1681   print PL <<END;
1682     'LIBS'              => ['$extralibs'], # e.g., '-lm'
1683     'DEFINE'            => '$opt_F', # e.g., '-DHAVE_SOMETHING'
1684 $Icomment    'INC'              => '$I', # e.g., '${Ihelp}-I/usr/include/other'
1685 END
1686
1687   my $C = grep $_ ne "$modfname.c", (glob '*.c'), (glob '*.cc'), (glob '*.C');
1688   my $Cpre = ($C ? '' : '# ');
1689   my $Ccomment = ($C ? '' : <<EOC);
1690         # Un-comment this if you add C files to link with later:
1691 EOC
1692
1693   print PL <<END;
1694 $Ccomment    $Cpre\'OBJECT'             => '\$(O_FILES)', # link all the C files too
1695 END
1696 }
1697 print PL ");\n";
1698 close(PL) || die "Can't close $ext$modpname/Makefile.PL: $!\n";
1699
1700 # Create a simple README since this is a CPAN requirement
1701 # and it doesnt hurt to have one
1702 warn "Writing $ext$modpname/README\n";
1703 open(RM, ">README") || die "Can't create $ext$modpname/README:$!\n";
1704 my $thisyear = (gmtime)[5] + 1900;
1705 my $rmhead = "$modpname version $TEMPLATE_VERSION";
1706 my $rmheadeq = "=" x length($rmhead);
1707
1708 my $rm_prereq;
1709
1710 if ( $compat_version < 5.00702 and $new_test )
1711 {
1712    $rm_prereq = 'Test::More';
1713 }
1714 else
1715 {
1716    $rm_prereq = 'blah blah blah';
1717 }
1718
1719 print RM <<_RMEND_;
1720 $rmhead
1721 $rmheadeq
1722
1723 The README is used to introduce the module and provide instructions on
1724 how to install the module, any machine dependencies it may have (for
1725 example C compilers and installed libraries) and any other information
1726 that should be provided before the module is installed.
1727
1728 A README file is required for CPAN modules since CPAN extracts the
1729 README file from a module distribution so that people browsing the
1730 archive can use it get an idea of the modules uses. It is usually a
1731 good idea to provide version information here so that people can
1732 decide whether fixes for the module are worth downloading.
1733
1734 INSTALLATION
1735
1736 To install this module type the following:
1737
1738    perl Makefile.PL
1739    make
1740    make test
1741    make install
1742
1743 DEPENDENCIES
1744
1745 This module requires these other modules and libraries:
1746
1747   $rm_prereq
1748
1749 COPYRIGHT AND LICENCE
1750
1751 Put the correct copyright and licence information here.
1752
1753 Copyright (C) $thisyear $author
1754
1755 This library is free software; you can redistribute it and/or modify
1756 it under the same terms as Perl itself. 
1757
1758 _RMEND_
1759 close(RM) || die "Can't close $ext$modpname/README: $!\n";
1760
1761 my $testdir  = "t";
1762 my $testfile = "$testdir/1.t";
1763 unless (-d "$testdir") {
1764   mkdir "$testdir" or die "Cannot mkdir $testdir: $!\n";
1765 }
1766 warn "Writing $ext$modpname/$testfile\n";
1767 my $tests = @const_names ? 2 : 1;
1768
1769 open EX, ">$testfile" or die "Can't create $ext$modpname/$testfile: $!\n";
1770
1771 print EX <<_END_;
1772 # Before `make install' is performed this script should be runnable with
1773 # `make test'. After `make install' it should work as `perl 1.t'
1774
1775 #########################
1776
1777 # change 'tests => $tests' to 'tests => last_test_to_print';
1778
1779 _END_
1780
1781 my $test_mod = 'Test::More';
1782
1783 if ( $old_test or ($compat_version < 5.007 and not $new_test ))
1784 {
1785   my $test_mod = 'Test';
1786
1787   print EX <<_END_;
1788 use Test;
1789 BEGIN { plan tests => $tests };
1790 use $module;
1791 ok(1); # If we made it this far, we're ok.
1792
1793 _END_
1794
1795    if (@const_names) {
1796      my $const_names = join " ", @const_names;
1797      print EX <<'_END_';
1798
1799 my $fail;
1800 foreach my $constname (qw(
1801 _END_
1802
1803      print EX wrap ("\t", "\t", $const_names);
1804      print EX (")) {\n");
1805
1806      print EX <<_END_;
1807   next if (eval "my \\\$a = \$constname; 1");
1808   if (\$\@ =~ /^Your vendor has not defined $module macro \$constname/) {
1809     print "# pass: \$\@";
1810   } else {
1811     print "# fail: \$\@";
1812     \$fail = 1;    
1813   }
1814 }
1815 if (\$fail) {
1816   print "not ok 2\\n";
1817 } else {
1818   print "ok 2\\n";
1819 }
1820
1821 _END_
1822   }
1823 }
1824 else
1825 {
1826   print EX <<_END_;
1827 use Test::More tests => $tests;
1828 BEGIN { use_ok('$module') };
1829
1830 _END_
1831
1832    if (@const_names) {
1833      my $const_names = join " ", @const_names;
1834      print EX <<'_END_';
1835
1836 my $fail = 0;
1837 foreach my $constname (qw(
1838 _END_
1839
1840      print EX wrap ("\t", "\t", $const_names);
1841      print EX (")) {\n");
1842
1843      print EX <<_END_;
1844   next if (eval "my \\\$a = \$constname; 1");
1845   if (\$\@ =~ /^Your vendor has not defined $module macro \$constname/) {
1846     print "# pass: \$\@";
1847   } else {
1848     print "# fail: \$\@";
1849     \$fail = 1;
1850   }
1851
1852 }
1853
1854 ok( \$fail == 0 , 'Constants' );
1855 _END_
1856   }
1857 }
1858
1859 print EX <<_END_;
1860 #########################
1861
1862 # Insert your test code below, the $test_mod module is use()ed here so read
1863 # its man page ( perldoc $test_mod ) for help writing this test script.
1864
1865 _END_
1866
1867 close(EX) || die "Can't close $ext$modpname/$testfile: $!\n";
1868
1869 unless ($opt_C) {
1870   warn "Writing $ext$modpname/Changes\n";
1871   $" = ' ';
1872   open(EX, ">Changes") || die "Can't create $ext$modpname/Changes: $!\n";
1873   @ARGS = map {/[\s\"\'\`\$*?^|&<>\[\]\{\}\(\)]/ ? "'$_'" : $_} @ARGS;
1874   print EX <<EOP;
1875 Revision history for Perl extension $module.
1876
1877 $TEMPLATE_VERSION  @{[scalar localtime]}
1878 \t- original version; created by h2xs $H2XS_VERSION with options
1879 \t\t@ARGS
1880
1881 EOP
1882   close(EX) || die "Can't close $ext$modpname/Changes: $!\n";
1883 }
1884
1885 warn "Writing $ext$modpname/MANIFEST\n";
1886 open(MANI,'>MANIFEST') or die "Can't create MANIFEST: $!";
1887 my @files = grep { -f } (<*>, <t/*>);
1888 if (!@files) {
1889   eval {opendir(D,'.');};
1890   unless ($@) { @files = readdir(D); closedir(D); }
1891 }
1892 if (!@files) { @files = map {chomp && $_} `ls`; }
1893 if ($^O eq 'VMS') {
1894   foreach (@files) {
1895     # Clip trailing '.' for portability -- non-VMS OSs don't expect it
1896     s%\.$%%;
1897     # Fix up for case-sensitive file systems
1898     s/$modfname/$modfname/i && next;
1899     $_ = "\U$_" if $_ eq 'manifest' or $_ eq 'changes';
1900     $_ = 'Makefile.PL' if $_ eq 'makefile.pl';
1901   }
1902 }
1903 print MANI join("\n",@files), "\n";
1904 close MANI;
1905 !NO!SUBS!
1906
1907 close OUT or die "Can't close $file: $!";
1908 chmod 0755, $file or die "Can't reset permissions for $file: $!\n";
1909 exec("$Config{'eunicefix'} $file") if $Config{'eunicefix'} ne ':';
1910 chdir $origdir;