diff options
| author | fukachan <fukachan> | 2018-01-13 08:48:42 +0000 |
|---|---|---|
| committer | fukachan <fukachan> | 2018-01-13 08:48:42 +0000 |
| commit | 3890d3bba4d01c2964ac0b396ba4a8bb5604930f (patch) | |
| tree | f7bd79a27a28314faaac31fcf60f6221dd19aa95 | |
| parent | fda5c62ab6329be5804e5bebca7324391b33d78b (diff) | |
| download | fml8-3890d3bba4d01c2964ac0b396ba4a8bb5604930f.tar.gz fml8-3890d3bba4d01c2964ac0b396ba4a8bb5604930f.tar.bz2 fml8-3890d3bba4d01c2964ac0b396ba4a8bb5604930f.zip | |
Initial revision
57 files changed, 30954 insertions, 0 deletions
diff --git a/cpan/dist/MIME-Types/META.json b/cpan/dist/MIME-Types/META.json new file mode 100644 index 00000000..b1aa4ba1 --- /dev/null +++ b/cpan/dist/MIME-Types/META.json @@ -0,0 +1,44 @@ +{ + "abstract" : "Definition of MIME types", + "author" : [ + "Mark Overmeer" + ], + "dynamic_config" : 1, + "generated_by" : "ExtUtils::MakeMaker version 6.64, CPAN::Meta::Converter version 2.120630", + "license" : [ + "perl_5" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : 2 + }, + "name" : "MIME-Types", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : "0" + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "0" + } + }, + "runtime" : { + "requires" : { + "File::Basename" : "0", + "File::Spec" : "0", + "List::Util" : "0", + "Test::More" : "0.47" + } + } + }, + "release_status" : "stable", + "version" : "2.14" +} diff --git a/cpan/dist/MIME-Types/META.yml b/cpan/dist/MIME-Types/META.yml new file mode 100644 index 00000000..5a464263 --- /dev/null +++ b/cpan/dist/MIME-Types/META.yml @@ -0,0 +1,25 @@ +--- +abstract: 'Definition of MIME types' +author: + - 'Mark Overmeer' +build_requires: + ExtUtils::MakeMaker: 0 +configure_requires: + ExtUtils::MakeMaker: 0 +dynamic_config: 1 +generated_by: 'ExtUtils::MakeMaker version 6.64, CPAN::Meta::Converter version 2.120630' +license: perl +meta-spec: + url: http://module-build.sourceforge.net/META-spec-v1.4.html + version: 1.4 +name: MIME-Types +no_index: + directory: + - t + - inc +requires: + File::Basename: 0 + File::Spec: 0 + List::Util: 0 + Test::More: 0.47 +version: 2.14 diff --git a/cpan/dist/MIME-Types/bin/collect-types b/cpan/dist/MIME-Types/bin/collect-types new file mode 100644 index 00000000..e76e9038 --- /dev/null +++ b/cpan/dist/MIME-Types/bin/collect-types @@ -0,0 +1,411 @@ +#!/usr/bin/env perl +use warnings; +use strict; + +use HTML::Parser (); +use File::Glob qw/bsd_glob/; +use XML::LibXML::Simple; + +use Data::Dumper qw/Dumper/; +$Data::Dumper::Indent = 1; + +my $iana_root = 'sources/iana-media-types'; +my $my_own = 'sources/my-own'; +my $apache = 'sources/from-apache'; +my $sitepoint = 'sources/from-sitepoint'; +my $stdicon = 'sources/from-stdicon'; +my $broofa = 'sources/from-broofa'; +my $freedesktop = 'sources/from-freedesktop'; + +my $history = 'history'; +my $distributed = 'lib/MIME/types.db'; + +my @iana_basetypes = qw{ + text/plain + application/octet-stream +}; +my %iana_basetypes = map +($_ => 1), @iana_basetypes; + +sub iana(); +sub my_own(); +sub apache(); +sub sitepoint(); +sub stdicon(); +sub broofa(); +sub freedesktop(); + +sub simplify(); +sub write_tables(); +sub write_distributed(); +sub keep_sources($); +sub scan_dist_version(); +sub add_type($$$); + +my $dist_version = scan_dist_version; +print "*** producing for release $dist_version\n"; + +my $current = "$history/$dist_version"; +-d $current or mkdir $current or die "$current: $!"; + +my $types_list = "$current/types.csv"; +my $ext_list = "$current/ext.csv"; +my $save_source = "$current/sources"; + +# Collect the info, the order is important! +my (%mimes, %exts); +my $last_count = 0; +iana(); +my_own(); +apache(); +sitepoint(); +stdicon(); +broofa(); +freedesktop(); +#warn Dumper \%mimes; + +# Build the tables +simplify(); +write_tables(); +write_distributed(); +keep_sources($save_source); + +exit 0; + +# +### IANA +# +# Run updata_iana first +# The format of the iana files is not standardized, so it is hard to +# collect other info automatically. Therefore, that info is manually +# added to my-own list. +# + +sub iana() +{ print "* processing iana types\n"; + + foreach my $fn (bsd_glob "$iana_root/*/index.html") + { print " . parsing file $fn\n"; + my ($major) = $fn =~ m!/([^/]+)/index.html$!; + + open IANA, '<', $fn or die "$fn: $!"; + my @page = <IANA>; + close IANA; + + my $types_in_page = 0; + while(@page) + { $page[0] =~ m!^\<tr! or next; + $page[1] =~ m!^\<td\>\ ! or next; + $page[2] =~ m!^\<td\>(?:\<a[^>]*\>)?([^<]+)! or next; + my $minor = $1; + $page[3] =~ m!^\<td\>! or next; + splice @page, 0, 3; + + $minor =~ s/\s+.*//; # deprecation, etc + my $type = "$major/$minor"; + my $info = add_type $type, 'iana', []; + $types_in_page++; + } + continue + { shift @page; + } + + print " found $types_in_page types for $major\n"; + } + + $last_count = keys %mimes; + print " . found $last_count registered types\n"; +} + +# +### MY-OWN +# +# Based on years of existince of the MIME::Types module +# + +sub my_own() +{ print "* processing my old list\n"; + + # Exceptions + # vms:text/plain;doc;8bit + # mac:application/x-macbase64;;bin + # + # IE6 bug + # image/pjpeg;;base64 + + open OWN, '<', $my_own or die $!; + while(<OWN>) + { chomp; + next if /^#|^\s*$/; + my ($type, $ext, $enc) = split /\;/; + my @ext = $ext ? (split /\,/, $ext) : (); + my $info = add_type $type, 'my_own', \@ext; + $info->{enc} = $enc if $enc; + } + close OWN; + + print " . added ".(keys(%mimes) - $last_count)." types\n"; + $last_count = keys %mimes; + print " . now $last_count types\n"; +} + +# +### from Apache +# +# Apache uses the table to automatically add a mime-type for files on +# disk, based on the filename extension. + +sub apache() +{ print "* processing apache\n"; + + my $found = 0; + + open APACHE, '<', $apache or die $!; + while(<APACHE>) + { chomp; + next if /^#|^\s*$/; + my ($type, $ext) = split ' ', $_, 2; + my @ext = $ext ? (split ' ', $ext) : (); + my $info = add_type $type, 'apache', \@ext; + $found++; + } + close APACHE; + + print " . added ".(keys(%mimes) - $last_count)." new types from $found\n"; + $last_count = keys %mimes; + print " . now $last_count types\n"; +} + +# +### from Sitepoint +# +# The list contains all discovered extension/type combination. That +# results in too many options per extension, which should be filtered +# out later. + +sub sitepoint() +{ print "* processing sitepoint\n"; + + my $found = 0; + + open SITEP, '<', $sitepoint or die $!; + while(<SITEP>) + { chomp; + next if /^#|^\s*$/; + my ($ext, $type, $comment) = split /\s+/; + + $ext =~ s/^\.//; + my $info = add_type $type, 'sitepoint', [$ext]; + $found++; + } + close SITEP; + + print " . added ".(keys(%mimes) - $last_count)." new types from $found\n"; + $last_count = keys %mimes; + print " . now $last_count types\n"; +} + +# +### from Stdicon +# + +sub stdicon() +{ print "* processing stdicon\n"; + + my $found = 0; + + open STDICON, '<', $stdicon or die $!; + while(<STDICON>) + { chomp; + next if /^#|^\s*$/; + my ($ext, $type, $comment) = split /\s+/; + + $ext =~ s/^\.//; + add_type $type, 'stdicon', [$ext]; + $found++; + } + close STDICON; + + print " . added ".(keys(%mimes) - $last_count)." types from $found\n"; + $last_count = keys %mimes; + print " . now $last_count types\n"; +} + + +# +### from github broofa +# + +sub broofa() +{ print "* processing broofa\n"; + + my $found = 0; + + open BROOFA, '<', $broofa or die $!; + while(<BROOFA>) + { next if /^\#|^\s*$/; + chomp; + + my ($type, @ext) = split; + my $info = add_type $type, 'broofa', \@ext; + $found++; + } + close BROOFA; + + print " . added ".(keys(%mimes) - $last_count)." new types from $found\n"; + $last_count = keys %mimes; + print " . now $last_count types\n"; +} + +# +### from github freedesktop +# + +sub freedesktop() +{ print "* processing freedesktop\n"; + + my $c = XML::LibXML::Simple->new->XMLin($freedesktop); + my $mimes = $c->{'mime-type'} || []; + foreach my $record (@$mimes) + { my $type = $record->{type} or die; + my $glob = $record->{glob} || []; + $glob = [$glob] if ref $glob eq 'HASH'; # when only one pattern + my @patt = map +($_->{pattern} =~ /^\*\.(.*)/ ? $1 : ()), @$glob; + + # remove regex patterns + my @ext = grep !/[^a-zA-Z0-9+\-]/, @patt; + my $info = add_type $type, 'freedesktop', \@ext; + } + + print " . added ".(keys(%mimes) - $last_count)." new types from " + . @$mimes . "\n"; + $last_count = keys %mimes; + print " . now $last_count types\n"; +} + +# +### Simplify +# + +sub simplify() +{ print "* simplifying\n"; + + # order extensions + my %back = map +($_ => 1), @iana_basetypes; + foreach my $ext (keys %exts) + { my %seen; + my @types = grep !$seen{$_}++, @{$exts{$ext}}; + + my @last = grep $back{$_}, @types; + $exts{$ext} = [ (grep !$back{$_}, @types), @last ]; + } + + foreach my $type (keys %mimes) + { my $info = $mimes{$type}; + + # remove double extensions + my %seen_ext; + my @ext = grep !$seen_ext{$_}++, @{$info->{ext} || []}; + + if($iana_basetypes{$type}) + { @ext = grep $type eq $exts{$_}[0], @ext; + } + + $info->{ext} = \@ext; + } + + print " . found ".(keys %exts)." extensions\n"; +} + +# +### Write +# + +sub write_tables() +{ print "* write $types_list\n"; + open OUT, '>', $types_list or die $!; + foreach my $type (sort keys %mimes) + { my $info = $mimes{$type}; + my $ext = join ",", @{$info->{ext}}; + my $enc = $info->{enc} || ''; + print OUT "$type;$ext;$enc\n"; + } + close OUT; + + print "* write $ext_list\n"; + open OUT, '>', $ext_list or die $!; + foreach my $ext (sort keys %exts) + { my $types = $exts{$ext}; + print OUT $ext, ';', join(',', @$types), "\n"; + } + close OUT; +} + +sub write_distributed() +{ + my %sets; + foreach my $type (sort keys %mimes) + { my $info = $mimes{$type}; + my ($major, $minor) = split m!/!, $type, 2; + my @ext = @{$info->{ext} || []}; + + my $isIANA = $major =~ m{^x-} || $minor =~ m{^x-} ? '' : 'I'; + my $hasExt = @ext ? 'E' : ''; + my $ext = join ',', @ext; + my $enc = $info->{enc} || ''; + push @{$sets{"$major:$isIANA:$hasExt"}}, "$minor;$ext;$enc"; + } + foreach my $ext (sort keys %exts) + { my $types = $exts{$ext}; + push @{$sets{EXTENSIONS}}, join(';', $ext, $types->[0]); + } + + print "* write $distributed\n"; + open OUT, '>:encoding(utf8)', $distributed or die "$distributed: $!"; + foreach my $section (sort keys %sets) + { my $records = $sets{$section}; + print OUT join "\n" + , @$records.":$section" + , (sort @$records) + , '', ''; + } + close OUT; +} + +sub keep_sources($) +{ my $fn = shift . '.tjz'; + print "* saving sources to $fn\n"; + system "tar cf - sources/| bzip2 -9v >$fn" and die $!; +} + +my %iana_major; +sub add_type($$$) +{ my ($type, $from, $ext) = @_; + + my $simple = lc $type; + my ($major, $minor) = $simple =~ m!^(?:x-)?([^/]+)/(?:x-)?(.+)$!; + if($from eq 'iana') + { $iana_major{$major}++; + } + elsif(!$iana_major{$major}) + { $simple = "x-$major/x-$minor"; + } + elsif(!$mimes{$simple} && $minor !~ m/^(vnd|prs|x)\./) + { $simple = "$major/x-$minor"; + } + + my $info = $mimes{$simple} ||= {}; + push @{$info->{ext}}, @$ext; + $info->{by}{$from}++; + + push @{$exts{$_}}, $simple for @$ext; + $info; +} + +sub scan_dist_version() +{ open my($mf), '<', 'Makefile.PL' or die $!; + while(<$mf>) + { return $1 if m/\$version\s*\=\s*['"]([^'"]+)'\s*;/; + } + die "version not found"; +} + diff --git a/cpan/dist/MIME-Types/bin/update-iana b/cpan/dist/MIME-Types/bin/update-iana new file mode 100644 index 00000000..2478412c --- /dev/null +++ b/cpan/dist/MIME-Types/bin/update-iana @@ -0,0 +1,9 @@ +#!/bin/bash + +SOURCE="ftp://ftp.iana.org/assignments/media-types" +MIRROR="sources/iana-media-types" + +[ -d $MIRROR ] || mkdir $MIRROR +cd $MIRROR + +lftp -e "o $SOURCE/ && mirror -c -e -p && quit" diff --git a/cpan/dist/MIME-Types/lib/MIME/Type.pm b/cpan/dist/MIME-Types/lib/MIME/Type.pm new file mode 100644 index 00000000..1ceb0f24 --- /dev/null +++ b/cpan/dist/MIME-Types/lib/MIME/Type.pm @@ -0,0 +1,114 @@ +# Copyrights 1999,2001-2017 by [Mark Overmeer]. +# For other contributors see ChangeLog. +# See the manual pages for details on the licensing terms. +# Pod stripped from pm file by OODoc 2.02. +package MIME::Type; +use vars '$VERSION'; +$VERSION = '2.14'; + + +use strict; + +use Carp 'croak'; + + +#------------------------------------------- + + +use overload + '""' => 'type' + , cmp => 'cmp'; + +#------------------------------------------- + + +sub new(@) { (bless {}, shift)->init( {@_} ) } + +sub init($) +{ my ($self, $args) = @_; + + my $type = $self->{MT_type} = $args->{type} + or croak "ERROR: Type parameter is obligatory."; + + $self->{MT_simplified} = $args->{simplified} + || $self->simplified($type); + + $self->{MT_extensions} = $args->{extensions} || []; + + $self->{MT_encoding} + = $args->{encoding} ? $args->{encoding} + : $self->mediaType eq 'text' ? 'quoted-printable' + : 'base64'; + + $self->{MT_system} = $args->{system} + if defined $args->{system}; + + $self; +} + +#------------------------------------------- + +sub type() {shift->{MT_type}} + + +sub simplified(;$) +{ my $thing = shift; + return $thing->{MT_simplified} unless @_; + + my $mime = shift; + + $mime =~ m!^\s*(?:x\-)?([\w.+-]+)/(?:x\-)?([\w.+-]+)\s*$!i ? lc "$1/$2" + : $mime eq 'text' ? 'text/plain' # some silly mailers... + : undef; +} + + +sub extensions() { @{shift->{MT_extensions}} } +sub encoding() {shift->{MT_encoding}} +sub system() {shift->{MT_system}} + +#------------------------------------------- + + +sub mediaType() {shift->{MT_simplified} =~ m!^([\w.-]+)/! ? $1 : undef} +sub mainType() {shift->mediaType} # Backwards compatibility + + +sub subType() {shift->{MT_simplified} =~ m!/([\w+.-]+)$! ? $1 : undef} + + +sub isRegistered() { lc shift->{MT_type} !~ m{^x\-|/x\-} } + + +# http://tools.ietf.org/html/rfc4288#section-3 +sub isVendor() {shift->{MT_simplified} =~ m!/vnd\.!} +sub isPersonal() {shift->{MT_simplified} =~ m!/prs\.!} +sub isExperimental() {shift->{MT_simplified} =~ m!/x\.! } + + +sub isBinary() { shift->{MT_encoding} eq 'base64' } +sub isText() { shift->{MT_encoding} ne 'base64' } +*isAscii = \&isText; + + +# simplified names only! +my %sigs = map +($_ => 1), + qw(application/pgp-keys application/pgp application/pgp-signature + application/pkcs10 application/pkcs7-mime application/pkcs7-signature + text/vCard); + +sub isSignature() { $sigs{shift->{MT_simplified}} } + + +sub cmp($) +{ my ($self, $other) = @_; + + my $type = ref $other + ? $other->simplified + : (ref $self)->simplified($other); + + $self->simplified cmp $type; +} +sub equals($) { $_[0]->cmp($_[1])==0 } + +1; diff --git a/cpan/dist/MIME-Types/lib/MIME/Type.pod b/cpan/dist/MIME-Types/lib/MIME/Type.pod new file mode 100644 index 00000000..dc53058d --- /dev/null +++ b/cpan/dist/MIME-Types/lib/MIME/Type.pod @@ -0,0 +1,238 @@ +=encoding utf8 + +=head1 NAME + +MIME::Type - description of one MIME type + +=head1 SYNOPSIS + + use MIME::Types; + my $mimetypes = MIME::Types->new; + my MIME::Type $plaintext = $mimetypes->type('text/plain'); + print $plaintext->mediaType; # text + print $plaintext->subType; # plain + + my @ext = $plaintext->extensions; + print "@ext" # txt asc c cc h hh cpp + + print $plaintext->encoding # 8bit + if($plaintext->isBinary) # false + if($plaintext->isAscii) # true + if($plaintext->equals('text/plain') {...} + if($plaintext eq 'text/plain') # same + + print MIME::Type->simplified('x-appl/x-zip') # 'appl/zip' + +=head1 DESCRIPTION + +MIME types are used in MIME entities, for instance as part of e-mail +and HTTP traffic. Sometimes real knowledge about a mime-type is need. +Objects of C<MIME::Type> store the information on one such type. + +=head1 OVERLOADED + +=over 4 + +=item overload: B<string comparison> + +When a MIME::Type object is compared to either a string or another +MIME::TYpe, the L<equals()|MIME::Type/"Knowledge"> method is called. Comparison is smart, +which means that it extends common string comparison with some +features which are defined in the related RFCs. + +=item overload: B<stringification> + +The stringification (use of the object in a place where a string +is required) will result in the type name, the same as L<type()|MIME::Type/"Attributes"> +returns. + +example: use of stringification + + my $mime = MIME::Type->new('text/html'); + print "$mime\n"; # explicit stringification + print $mime; # implicit stringification + +=back + +=head1 METHODS + +=head2 Initiation + +=over 4 + +=item MIME::Type-E<gt>B<new>(%options) + +Create (I<instantiate>) a new MIME::Type object which manages one +mime type. + + -Option --Default + encoding <depends on type> + extensions [] + simplified <derived from type> + system undef + type <required> + +=over 2 + +=item encoding => '7bit'|'8bit'|'base64'|'quoted-printable' + +How must this data be encoded to be transported safely. The default +depends on the type: mimes with as main type C<text/> will default +to C<quoted-printable> and all other to C<base64>. + +=item extensions => REF-ARRAY + +An array of extensions which are using this mime. + +=item simplified => STRING + +The mime types main- and sub-label can both start with C<x->, to indicate +that is a non-registered name. Of course, after registration this flag +can disappear which adds to the confusion. The simplified string has the +C<x-> thingies removed and are translated to lower-case. + +=item system => REGEX + +Regular expression which defines for which systems this rule is valid. The +REGEX is matched on C<$^O>. + +=item type => STRING + +The type which is defined here. It consists of a I<type> and a I<sub-type>, +both case-insensitive. This module will return lower-case, but accept +upper-case. + +=back + +=back + +=head2 Attributes + +=over 4 + +=item $obj-E<gt>B<encoding>() + +Returns the type of encoding which is required to transport data of this +type safely. + +=item $obj-E<gt>B<extensions>() + +Returns a list of extensions which are known to be used for this +mime type. + +=item $obj-E<gt>B<simplified>( [$string] ) + +=item MIME::Type-E<gt>B<simplified>( [$string] ) + +Returns the simplified mime type for this object or the specified STRING. +Mime type names can get officially registered. Until then, they have to +carry an C<x-> preamble to indicate that. Of course, after recognition, +the C<x-> can disappear. In many cases, we prefer the simplified version +of the type. + +example: results of simplified() + + my $mime = MIME::Type->new(type => 'x-appl/x-zip'); + print $mime->simplified; # 'appl/zip' + + print $mime->simplified('text/PLAIN'); # 'text/plain' + print MIME::Type->simplified('x-xyz/x-abc'); # 'xyz/abc' + +=item $obj-E<gt>B<system>() + +Returns the regular expression which can be used to determine whether this +type is active on the system where you are working on. + +=item $obj-E<gt>B<type>() + +Returns the long type of this object, for instance C<'text/plain'> + +=back + +=head2 Knowledge + +=over 4 + +=item $obj-E<gt>B<equals>($string|$mime) + +Compare this mime-type object with a STRING or other object. In case of +a STRING, simplification will take place. + +=item $obj-E<gt>B<isAscii>() + +Old name for L<isText()|MIME::Type/"Knowledge">. + +=item $obj-E<gt>B<isBinary>() + +Returns true when the type is not known to be text. See L<isText()|MIME::Type/"Knowledge">. + +=item $obj-E<gt>B<isExperimental>() + +[2.00] Return C<true> when the type is defined for experimental +use; the subtype starts with C<x.> + +=item $obj-E<gt>B<isPersonal>() + +[2.00] Return C<true> when the type is defined by a person for +private use; the subtype starts with C<prs.> + +=item $obj-E<gt>B<isRegistered>() + +Mime-types which are not registered by IANA nor defined in RFCs shall +start with an C<x->. This counts for as well the media-type as the +sub-type. In case either one of the types starts with C<x-> this +method will return false. + +=item $obj-E<gt>B<isSignature>() + +Returns true when the type is in the list of known signatures. + +=item $obj-E<gt>B<isText>() + +[2.05] All types which may have the charset attribute, are text. However, +there is currently no record of attributes in this module... so we guess. + +=item $obj-E<gt>B<isVendor>() + +[2.00] Return C<true> when the type is defined by a vendor; the subtype +starts with C<vnd.> + +=item $obj-E<gt>B<mediaType>() + +The media type of the simplified mime. +For C<'text/plain'> it will return C<'text'>. + +For historical reasons, the C<'mainType'> method still can be used +to retrieve the same value. However, that method is deprecated. + +=item $obj-E<gt>B<subType>() + +The sub type of the simplified mime. +For C<'text/plain'> it will return C<'plain'>. + +=back + +=head1 DIAGNOSTICS + +=over 4 + +=item Error: Type parameter is obligatory. + +When a L<MIME::Type|MIME::Type> object is created, the type itself must be +specified with the C<type> option flag. + +=back + +=head1 SEE ALSO + +This module is part of MIME-Types distribution version 2.14, +built on November 08, 2017. Website: F<http://perl.overmeer.net/mimetypes/> + +=head1 LICENSE + +Copyrights 1999,2001-2017 by [Mark Overmeer]. For other contributors see ChangeLog. + +This program is free software; you can redistribute it and/or modify it +under the Artistic license. +See F<http://dev.perl.org/licenses/artistic.html> + diff --git a/cpan/dist/MIME-Types/lib/MIME/Types.pm b/cpan/dist/MIME-Types/lib/MIME/Types.pm new file mode 100644 index 00000000..1552b5e7 --- /dev/null +++ b/cpan/dist/MIME-Types/lib/MIME/Types.pm @@ -0,0 +1,284 @@ +# Copyrights 1999,2001-2017 by [Mark Overmeer]. +# For other contributors see ChangeLog. +# See the manual pages for details on the licensing terms. +# Pod stripped from pm file by OODoc 2.02. + +package MIME::Types; +use vars '$VERSION'; +$VERSION = '2.14'; + + +use strict; + +use MIME::Type (); +use File::Spec (); +use File::Basename qw(dirname); +use List::Util qw(first); + + +my %typedb; +sub new(@) { (bless {}, shift)->init( {@_} ) } + +sub init($) +{ my ($self, $args) = @_; + keys %typedb or $self->_read_db($args); + $self; +} + +sub _read_db($) +{ my ($self, $args) = @_; + my $skip_extensions = $args->{skip_extensions}; + my $only_complete = $args->{only_complete}; + my $only_iana = $args->{only_iana}; + + my $db = $ENV{PERL_MIME_TYPE_DB} + || $args->{db_file} + || File::Spec->catfile(dirname(__FILE__), 'types.db'); + + local *DB; + open DB, '<:encoding(utf8)', $db + or die "cannot open type database in $db: $!\n"; + + while(1) + { my $header = <DB>; + defined $header or last; + chomp $header; + + # This logic is entangled with the bin/collect_types script + my ($count, $major, $is_iana, $has_ext) = split /\:/, $header; + my $skip_section = $major eq 'EXTENSIONS' ? $skip_extensions + : (($only_iana && !$is_iana) || ($only_complete && !$has_ext)); + +#warn "Skipping section $header\n" if $skip_section; + (my $section = $major) =~ s/^x-//; + if($major eq 'EXTENSIONS') + { local $_; + while(<DB>) + { last if m/^$/; + next if $skip_section; + chomp; + $typedb{$section}{$1} = $2 if m/(.*);(.*)/; + } + } + else + { local $_; + while(<DB>) + { last if m/^$/; + next if $skip_section; + chomp; + $typedb{$section}{$1} = "$major/$_" if m/^(?:x-)?([^;]+)/; + } + } + } + + close DB; +} + +# Catalyst-Plugin-Static-Simple uses it :( +sub create_type_index {} + +#------------------------------------------- + +sub type($) +{ my $spec = lc $_[1]; + $spec = 'text/plain' if $spec eq 'text'; # old mailers + + $spec =~ m!^(?:x\-)?([^/]+)/(?:x-)?(.*)! + or return; + + my $section = $typedb{$1} or return; + my $record = $section->{$2} or return; + return $record if ref $record; # already extended + + my $simple = $2; + my ($type, $ext, $enc) = split m/\;/, $record; + my $os = undef; # XXX TODO + + $section->{$simple} = MIME::Type->new + ( type => $type + , extensions => [split /\,/, $ext] + , encoding => $enc + , system => $os + ); +} + + +sub mimeTypeOf($) +{ my ($self, $name) = @_; + (my $ext = lc $name) =~ s/.*\.//; + my $type = $typedb{EXTENSIONS}{$ext} or return; + $self->type($type); +} + + +sub addType(@) +{ my $self = shift; + + foreach my $type (@_) + { my ($major, $minor) = split m!/!, $type->simplified; + $typedb{$major}{$minor} = $type; + $typedb{EXTENSIONS}{$_} = $type for $type->extensions; + } + $self; +} + + +sub types() +{ my $self = shift; + my @types; + foreach my $section (keys %typedb) + { next if $section eq 'EXTENSIONS'; + push @types, map $_->type("$section/$_"), + sort keys %{$typedb{$section}}; + } + @types; +} + + +sub listTypes() +{ my $self = shift; + my @types; + foreach my $section (keys %typedb) + { next if $section eq 'EXTENSIONS'; + foreach my $sub (sort keys %{$typedb{$section}}) + { my $record = $typedb{$section}{$sub}; + push @types, ref $record ? $record->type + : $record =~ m/^([^;]+)/ ? $1 : die; + } + } + @types; +} + + +sub extensions { keys %{$typedb{EXTENSIONS}} } +sub _MojoExtTable() {$typedb{EXTENSIONS}} + +#------------- + +sub httpAccept($) +{ my $self = shift; + my @listed; + + foreach (split /\,\s*/, shift) + { + m!^ ([a-zA-Z0-9-]+ | \*) / ( [a-zA-Z0-9+-]+ | \* ) + \s* (?: \;\s*q\=\s* ([0-9]+(?:\.[0-9]*)?) \s* )? + (\;.* | ) + $ !x or next; + + my $mime = "$1/$2$4"; + my $q = defined $3 ? $3 : 1; # q, default=1 + + # most complex first + $q += $4 ? +0.01 : $1 eq '*' ? -0.02 : $2 eq '*' ? -0.01 : 0; + + # keep order + $q -= @listed*0.0001; + + push @listed, [ $mime => $q ]; + } + map $_->[0], sort {$b->[1] <=> $a->[1]} @listed; +} + + +sub httpAcceptBest($@) +{ my $self = shift; + my @accept = ref $_[0] eq 'ARRAY' ? @{(shift)} : $self->httpAccept(shift); + my $match; + + foreach my $acc (@accept) + { $acc =~ s/\s*\;.*//; # remove attributes + my $m = $acc !~ s#/\*$## ? first { $_->equals($acc) } @_ + : $acc eq '*' ? $_[0] # $acc eq */* + : first { $_->mediaType eq $acc } @_; + return $m if defined $m; + } + + (); +} + + +sub httpAcceptSelect($@) +{ my ($self, $accept) = (shift, shift); + my $fns = !@_ ? return () : ref $_[0] eq 'ARRAY' ? shift : [@_]; + + unless(defined $accept) + { my $fn = $fns->[0]; + return ($fn, $self->mimeTypeOf($fn)); + } + + # create mapping type -> filename + my (%have, @have); + foreach my $fn (@$fns) + { my $type = $self->mimeTypeOf($fn) or next; + $have{$type->simplified} = $fn; + push @have, $type; + } + + my $type = $self->httpAcceptBest($accept, @have); + defined $type ? ($have{$type}, $type) : (); +} + +#------------------------------------------- +# OLD INTERFACE (version 0.06 and lower) + + +use base 'Exporter'; +our @EXPORT_OK = qw(by_suffix by_mediatype import_mime_types); + + +my $mime_types; + +sub by_suffix($) +{ my $filename = shift; + $mime_types ||= MIME::Types->new; + my $mime = $mime_types->mimeTypeOf($filename); + + my @data = defined $mime ? ($mime->type, $mime->encoding) : ('',''); + wantarray ? @data : \@data; +} + + +sub by_mediatype($) +{ my $type = shift; + $mime_types ||= MIME::Types->new; + + my @found; + if(!ref $type && index($type, '/') >= 0) + { my $mime = $mime_types->type($type); + @found = $mime if $mime; + } + else + { my $search = ref $type eq 'Regexp' ? $type : qr/$type/i; + @found = map $mime_types->type($_), + grep $_ =~ $search, + $mime_types->listTypes; + } + + my @data; + foreach my $mime (@found) + { push @data, map [$_, $mime->type, $mime->encoding], + $mime->extensions; + } + + wantarray ? @data : \@data; +} + + +sub import_mime_types($) +{ my $filename = shift; + use Carp; + croak <<'CROAK'; +import_mime_types is not supported anymore: if you have types to add +please send them to the author. +CROAK +} + +1; +__END__ +# Exceptions +vms:text/plain;doc;8bit +mac:application/x-macbase64;;bin + +# IE6 bug +image/pjpeg;;base64 diff --git a/cpan/dist/MIME-Types/lib/MIME/Types.pod b/cpan/dist/MIME-Types/lib/MIME/Types.pod new file mode 100644 index 00000000..bb946ebd --- /dev/null +++ b/cpan/dist/MIME-Types/lib/MIME/Types.pod @@ -0,0 +1,267 @@ +=encoding utf8 + +=head1 NAME + +MIME::Types - Definition of MIME types + +=head1 INHERITANCE + + MIME::Types + is a Exporter + +=head1 SYNOPSIS + + use MIME::Types; + my $mt = MIME::Types->new(...); # MIME::Types object + my $type = $mt->type('text/plain'); # MIME::Type object + my $type = $mt->mimeTypeOf('gif'); + my $type = $mt->mimeTypeOf('picture.jpg'); + my @types = $mt->httpAccept('text/html, application/json;q=0.1') + +=head1 DESCRIPTION + +MIME types are used in many applications (for instance as part of e-mail +and HTTP traffic) to indicate the type of content which is transmitted. +or expected. See RFC2045 at F<https://www.ietf.org/rfc/rfc2045.txt> + +Sometimes detailed knowledge about a mime-type is need, however this +module only knows about the file-name extensions which relate to some +filetype. It can also be used to produce the right format: types +which are not registered at IANA need to use 'x-' prefixes. + +This object administers a huge list of known mime-types, combined +from various sources. For instance, it contains B<all IANA> types +and the knowledge of Apache. Probably the most complete table on +the net! + +=head2 MIME::Types and daemons (fork) + +If your program uses fork (usually for a daemon), then you want to have +the type table initialized before you start forking. So, first call + + my $mt = MIME::Types->new; + +Later, each time you create this object (you may, of course, also reuse +the object you create here) you will get access to B<the same global table> +of types. + +=head1 METHODS + +=head2 Constructors + +=over 4 + +=item MIME::Types-E<gt>B<new>(%options) + +Create a new C<MIME::Types> object which manages the data. In the current +implementation, it does not matter whether you create this object often +within your program, but in the future this may change. + + -Option --Default + db_file <installed source> + only_complete <false> + only_iana <false> + skip_extensions <false> + +=over 2 + +=item db_file => FILENAME + +The location of the database which contains the type information. Only the +first instantiation of this object will have this parameter obeyed. + +[2.10] This parameter can be globally overruled via the C<PERL_MIME_TYPE_DB> +environment variable, which may be needed in case of PAR or other tricky +installations. For PAR, you probably set this environment variable to +"inc/lib/MIME/types.db" + +=item only_complete => BOOLEAN + +Only include complete MIME type definitions: requires at least one known +extension. This will reduce the number of entries --and with that the +amount of memory consumed-- considerably. + +In your program you have to decide: the first time that you call +the creator (C<new>) determines whether you get the full or the partial +information. + +=item only_iana => BOOLEAN + +Only load the types which are currently known by IANA. + +=item skip_extensions => BOOLEAN + +Do not load the table to map extensions to types, which is quite large. + +=back + +=back + +=head2 Knowledge + +=over 4 + +=item $obj-E<gt>B<addType>($type, ...) + +Add one or more TYPEs to the set of known types. Each TYPE is a +C<MIME::Type> which must be experimental: either the main-type or +the sub-type must start with C<x->. + +Please inform the maintainer of this module when registered types +are missing. Before version MIME::Types version 1.14, a warning +was produced when an unknown IANA type was added. This has been +removed, because some people need that to get their application +to work locally... broken applications... + +=item $obj-E<gt>B<extensions>() + +Returns a list of all defined extensions. + +=item $obj-E<gt>B<listTypes>() + +Returns a list of all defined mime-types by name only. This will B<not> +instantiate L<MIME::Type|MIME::Type> objects. See L<types()|MIME::Types/"Knowledge"> + +=item $obj-E<gt>B<mimeTypeOf>($filename) + +Returns the C<MIME::Type> object which belongs to the FILENAME (or simply +its filename extension) or C<undef> if the file type is unknown. The extension +is used and considered case-insensitive. + +In some cases, more than one type is known for a certain filename extension. +In that case, the preferred one is taken (for an unclear definition of +preference) + +example: use of mimeTypeOf() + + my $types = MIME::Types->new; + my $mime = $types->mimeTypeOf('gif'); + + my $mime = $types->mimeTypeOf('picture.jpg'); + print $mime->isBinary; + +=item $obj-E<gt>B<type>($string) + +Returns the C<MIME::Type> which describes the type related to STRING. +[2.00] Only one type will be returned. + +[before 2.00] One type may be described more than once. Different +extensions may be in use for this type, and different operating systems +may cause more than one C<MIME::Type> object to be defined. In scalar +context, only the first is returned. + +=item $obj-E<gt>B<types>() + +Returns a list of all defined mime-types. For reasons of backwards +compatibility, this will instantiate L<MIME::Type|MIME::Type> objects, which will +be returned. See L<listTypes()|MIME::Types/"Knowledge">. + +=back + +=head2 HTTP support + +=over 4 + +=item $obj-E<gt>B<httpAccept>($header) + +[2.07] Decompose a typical HTTP-Accept header, and sort it based on the +included priority information. Returned is a sorted list of type names, +where the highest priority type is first. The list may contain '*/*' +(accept any) or a '*' as subtype. + +Ill-formated typenames are ignored. On equal qualities, the order is +kept. See RFC2616 section 14.1 + +example: + + my @types = $types->httpAccept('text/html, application/json;q=0.9'); + +=item $obj-E<gt>B<httpAcceptBest>($accept|\@types, @have) + +[2.07] The C<$accept> string is processed via L<httpAccept()|MIME::Types/"HTTP support"> to order the +types on preference. You may also provide a list of ordered C<@types> +which may have been the result of that method, called earlier. + +As second parameter, you pass a LIST of types you C<@have> to offer. +Those need to be L<MIME::Type|MIME::Type> objects. The preferred type will get +selected. When none of these are accepted by the client, this will +return C<undef>. It should result in a 406 server response. + +example: + + my $accept = $req->header('Accept'); + my @have = map $mt->type($_), qw[text/plain text/html]; + my @ext = $mt->httpAcceptBest($accept, @have); + +=item $obj-E<gt>B<httpAcceptSelect>($accept|\@types, @filenames|\@filenames) + +[2.07] Like L<httpAcceptBest()|MIME::Types/"HTTP support">, but now we do not return a pair with mime-type +and filename, not just the type. If $accept is C<undef>, the first +filename is returned. + +example: + + use HTTP::Status ':constants'; + use File::Glob 'bsd_glob'; # understands blanks in filename + + my @filenames = bsd_glob "$imagedir/$fnbase.*; + my $accept = $req->header('Accept'); + my ($fn, $mime) = $mt->httpAcceptSelect($accept, @filenames); + my $code = defined $mime ? HTTP_NOT_ACCEPTABLE : HTTP_OK; + +=back + +=head1 FUNCTIONS + +The next functions are provided for backward compatibility with MIME::Types +versions [0.06] and below. This code originates from Jeff Okamoto +F<okamoto@corp.hp.com> and others. + +=over 4 + +=item B<by_mediatype>(TYPE) + +This function takes a media type and returns a list or anonymous array of +anonymous three-element arrays whose values are the file name suffix used to +identify it, the media type, and a content encoding. + +TYPE can be a full type name (contains '/', and will be matched in full), +a partial type (which is used as regular expression) or a real regular +expression. + +=item B<by_suffix>(FILENAME|SUFFIX) + +Like C<mimeTypeOf>, but does not return an C<MIME::Type> object. If the file ++type is unknown, both the returned media type and encoding are empty strings. + +example: use of function by_suffix() + + use MIME::Types 'by_suffix'; + my ($mediatype, $encoding) = by_suffix('image.gif'); + + my $refdata = by_suffix('image.gif'); + my ($mediatype, $encoding) = @$refdata; + +=item B<import_mime_types>() + +This method has been removed: mime-types are only useful if understood +by many parties. Therefore, the IANA assigns names which can be used. +In the table kept by this C<MIME::Types> module all these names, plus +the most often used temporary names are kept. When names seem to be +missing, please contact the maintainer for inclusion. + +=back + +=head1 SEE ALSO + +This module is part of MIME-Types distribution version 2.14, +built on November 08, 2017. Website: F<http://perl.overmeer.net/mimetypes/> + +=head1 LICENSE + +Copyrights 1999,2001-2017 by [Mark Overmeer]. For other contributors see ChangeLog. + +This program is free software; you can redistribute it and/or modify it +under the Artistic license. +See F<http://dev.perl.org/licenses/artistic.html> + diff --git a/cpan/dist/MIME-Types/lib/MIME/types.db b/cpan/dist/MIME-Types/lib/MIME/types.db new file mode 100644 index 00000000..afd51a60 --- /dev/null +++ b/cpan/dist/MIME-Types/lib/MIME/types.db @@ -0,0 +1,4513 @@ +1792:EXTENSIONS +#;application/x-mathcad +%;application/x-trash +123;application/vnd.lotus-1-2-3 +323;text/x-h323 +32x;application/x-genesis-rom +3dm;x-world/x-3dmf +3dmf;x-world/x-3dmf +3dml;text/vnd.in3d.3dml +3ds;image/x-3ds +3g2;video/3gpp2 +3ga;video/3gpp +3gp2;video/3gpp2 +3gp;video/3gpp +3gpp2;video/3gpp2 +3gpp;video/3gpp +602;application/x-t602 +669;audio/x-mod +7z;application/x-7z-compressed +BLEND;application/x-blender +C;text/x-c++src +PAR2;application/x-par2 +PL;application/x-perl +Z;application/x-compress +a;application/x-archive +aab;application/x-authorware-bin +aac;audio/x-aac +aam;application/x-authorware-map +aas;application/x-authorware-seg +abc;text/vnd.abc +abw;application/x-abiword +ac3;audio/ac3 +ac;application/pkix-attr-cert +acc;application/vnd.americandynamics.acc +ace;application/x-ace-compressed +acgi;text/html +acu;application/vnd.acucobol +acutc;application/vnd.acucorp +adb;text/x-adasrc +adp;audio/x-adpcm +ads;text/x-adasrc +aep;application/vnd.audiograph +afl;video/x-animaflex +afm;application/x-font-type1 +afp;application/vnd.ibm.modcap +ag;image/x-applix-graphics +agb;application/x-gba-rom +ahead;application/vnd.ahead.space +ai;application/postscript +aif;audio/x-aiff +aifc;audio/x-aiff +aiff;audio/x-aiff +aiffc;audio/x-aifc +aim;application/x-aim +aip;text/x-audiosoft-intra +air;application/vnd.adobe.air-application-installer-package+zip +ait;application/vnd.dvb.ait +al;application/x-perl +alc;x-chemical/x-alchemy +alz;application/x-alz +ami;application/vnd.amiga.amu +amr;audio/amr +amz;audio/x-amzxml +ani;application/x-navi-animation +anx;application/x-annodex +aos;application/x-nokia-9000-communicator-add-on-software +ape;audio/x-ape +apk;application/vnd.android.package-archive +appcache;text/x-cache-manifest +application;application/x-ms-application +apr;application/vnd.lotus-approach +aps;application/x-mime +ar;application/x-archive +arc;application/x-freearc +arj;application/x-arj +art;image/x-jg +arw;image/x-sony-arw +as;application/x-applix-spreadsheet +asc;application/pgp-signature +asf;application/vnd.ms-asf +asm;text/x-asm +asn;x-chemical/x-ncbi-asn1 +aso;x-chemical/x-ncbi-asn1-binary +asp;text/x-asp +ass;text/x-ssa +asx;video/x-ms-asf +atc;application/vnd.acucorp +atom;application/atom+xml +atomcat;application/atomcat+xml +atomsrv;application/x-atomserv+xml +atomsvc;application/atomsvc+xml +atx;application/vnd.antix.game-component +au;audio/basic +avf;video/x-msvideo +avi;video/x-msvideo +avs;video/x-avs-video +aw;application/x-applixware +awb;audio/amr-wb +awk;application/x-awk +axa;audio/x-annodex +axv;video/x-annodex +azf;application/vnd.airzip.filesecure.azf +azs;application/vnd.airzip.filesecure.azs +azw;application/vnd.amazon.ebook +b;x-chemical/x-molconn-z +bak;application/x-trash +bat;application/x-msdos-program +bck;application/x-vmsbackup +bcpio;application/x-bcpio +bdf;application/x-font-bdf +bdm;application/vnd.syncml.dm+wbxml +bdmv;video/mp2t +bed;application/vnd.realvnc.bed +bh2;application/vnd.fujitsu.oasysprs +bib;text/x-bibtex +bin;application/x-mac-binary +bkm;application/vnd.nervana +blb;application/x-blorb +bleep;application/x-bleeper +blend;application/x-blender +blender;application/x-blender +blorb;application/x-blorb +bm;image/x-bmp +bmi;application/vnd.bmi +bmp;image/x-bmp +boo;text/x-boo +book;application/x-maker +box;application/vnd.previewsystems.box +boz;application/x-bzip2 +bpd;application/vnd.hbci +bpk;application/octet-stream +brf;text/plain +bsd;x-chemical/x-crossfire +bsh;application/x-bsh +btif;image/prs.btif +buffer;application/octet-stream +bz2;application/x-bzip2 +bz;application/x-bzip +c++;text/x-c++src +c11amc;application/vnd.cluetrust.cartomobile-config +c11amz;application/vnd.cluetrust.cartomobile-config-pkg +c3d;x-chemical/x-chem3d +c4d;application/vnd.clonk.c4group +c4f;application/vnd.clonk.c4group +c4g;application/vnd.clonk.c4group +c4p;application/vnd.clonk.c4group +c4u;application/vnd.clonk.c4group +c;text/x-csrc +cab;application/x-cab +cac;x-chemical/x-cache +cache;x-chemical/x-cache +caf;audio/x-caf +cap;application/x-cap +car;application/vnd.curl.car +cascii;x-chemical/x-cactvs-binary +cat;application/vnd.ms-pki.seccat +cb7;application/x-cbr +cba;application/x-cbr +cbin;x-chemical/x-cactvs-binary +cbl;text/x-cobol +cbr;application/x-cbr +cbt;application/x-cbr +cbz;application/x-cbz +cc;text/x-c++src +ccad;application/x-clariscad +ccc;text/vnd.net2phone.commcenter.command +ccmx;application/x-ccmx +cco;application/x-cocoa +cct;application/x-director +ccxml;application/ccxml+xml +cda;application/x-cdf +cdbcmsg;application/vnd.contact.cmsg +cdf;application/x-cdf +cdkey;application/vnd.mediastation.cdkey +cdmia;application/cdmi-capability +cdmic;application/cdmi-container +cdmid;application/cdmi-domain +cdmio;application/cdmi-object +cdmiq;application/cdmi-queue +cdr;image/x-coreldraw +cdt;image/x-coreldrawtemplate +cdx;x-chemical/x-cdx +cdxml;application/vnd.chemdraw+xml +cdy;application/vnd.cinderella +cef;x-chemical/x-cxf +cer;application/pkix-cert +cert;application/x-x509-ca-cert +cfs;application/x-cfs-compressed +cgb;application/x-gameboy-rom +cgm;image/cgm +cha;application/x-chat +chat;application/x-chat +chm;x-chemical/x-chemdraw +chrt;application/vnd.kde.kchart +cif;x-chemical/x-cif +cii;application/vnd.anser-web-certificate-issue-initiation +cil;application/vnd.ms-artgalry +cla;application/vnd.claymore +class;application/x-java-vm +clkk;application/vnd.crick.clicker.keyboard +clkp;application/vnd.crick.clicker.palette +clkt;application/vnd.crick.clicker.template +clkw;application/vnd.crick.clicker.wordbank +clkx;application/vnd.crick.clicker +clp;application/x-msclip +clpi;video/mp2t +cls;text/x-tex +cmake;text/x-cmake +cmc;application/vnd.cosmocaller +cmdf;x-chemical/x-cmdf +cml;x-chemical/x-cml +cmp;application/vnd.yellowriver-custom-menu +cmx;image/x-cmx +cob;text/x-cobol +cod;application/vnd.rim.cod +coffee;application/vnd.coffeescript +com;application/x-msdos-program +conf;text/plain +cpa;x-chemical/x-compass +cpi;video/mp2t +cpio;application/x-cpio +cpp;text/x-c++src +cpt;application/x-mac-compactpro +cr2;image/x-canon-cr2 +crd;application/x-mscardfile +crdownload;application/x-partial-download +crl;application/pkix-crl +crt;application/x-x509-ca-cert +crw;image/x-canon-crw +crx;application/x-chrome-extension +cryptonote;application/vnd.rig.cryptonote +cs;text/x-csharp +csf;x-chemical/x-cache-csf +csh;application/x-csh +csm;application/x-cu-seeme +csml;x-chemical/x-csml +csp;application/vnd.commonspace +css;text/css +cst;application/x-director +csv;text/csv +csvs;text/x-csv-schema +ctab;x-chemical/x-cactvs-binary +ctx;x-chemical/x-ctx +cu;application/x-cu-seeme +cub;x-chemical/x-gaussian-cube +cue;application/x-cue +cur;image/x-win-bitmap +curl;application/vnd.curl +cw;application/prs.cww +cww;application/prs.cww +cxf;x-chemical/x-cxf +cxt;application/x-director +cxx;text/x-c++src +d;text/x-dsrc +dae;model/vnd.collada+xml +daf;application/vnd.mobius.daf +dar;application/x-dar +dart;application/vnd.dart +dat;application/x-ns-proxy-autoconfig +dataless;application/vnd.fdsn.seed +davmount;application/x-davmount+xml +dbf;application/x-dbf +dbk;application/x-docbook+xml +dc;application/x-dc-rom +dcl;text/x-dcl +dcm;application/dicom +dcr;application/x-director +dcurl;text/vnd.curl.dcurl +dd2;application/vnd.oma.dd2+xml +ddd;application/vnd.fujixerox.ddd +dds;image/x-dds +deb;application/x-debian-package +deepv;application/x-deepv +def;text/plain +deploy;application/octet-stream +der;application/x-x509-ca-cert +desktop;application/x-desktop +dfac;application/vnd.dreamfactory +dgc;application/x-dgc-compressed +dgn;image/vnd.dgn +di;text/x-dsrc +dia;application/x-dia-diagram +dic;text/x-c +dif;video/dv +diff;text/x-diff +dir;application/x-director +dis;application/vnd.mobius.dis +dist;application/octet-stream +distz;application/octet-stream +divx;video/x-msvideo +djv;image/vnd.djvu +djvu;image/vnd.djvu +dl;video/x-dl +dll;application/x-msdos-program +dmg;application/x-apple-diskimage +dmp;application/vnd.tcpdump.pcap +dms;application/x-dms +dna;application/vnd.dna +dng;image/x-adobe-dng +doc;application/msword +docbook;application/x-docbook+xml +docm;application/vnd.ms-word.document.macroenabled.12 +docx;application/vnd.openxmlformats-officedocument.wordprocessingml.document +dot;application/msword +dotm;application/vnd.ms-word.template.macroenabled.12 +dotx;application/vnd.openxmlformats-officedocument.wordprocessingml.template +dp;application/vnd.osgi.dp +dpg;application/vnd.dpgraph +dra;audio/vnd.dra +drw;application/x-drafting +dsc;text/prs.lines.tag +dsl;text/x-dsl +dssc;application/dssc+der +dtb;application/x-dtbook+xml +dtd;application/xml-dtd +dts;audio/vnd.dts +dtshd;audio/vnd.dts.hd +dtx;text/x-tex +dump;application/octet-stream +dv;video/dv +dvb;video/vnd.dvb.file +dvi;application/x-dvi +dwf;x-drawing/x-dwf +dwg;image/vnd.dwg +dx;x-chemical/x-jcamp-dx +dxf;image/vnd.dxf +dxp;application/vnd.spotfire.dxp +dxr;application/x-director +e;text/x-eiffel +ecelp4800;audio/vnd.nuera.ecelp4800 +ecelp7470;audio/vnd.nuera.ecelp7470 +ecelp9600;audio/vnd.nuera.ecelp9600 +ecma;application/ecmascript +edm;application/vnd.novadigm.edm +edx;application/vnd.novadigm.edx +efif;application/vnd.picsel +egon;application/x-egon +ei6;application/vnd.pg.osasli +eif;text/x-eiffel +el;text/x-script.elisp +elc;application/x-bytecode.elisp +emb;x-chemical/x-embl-dl-nucleotide +embl;x-chemical/x-embl-dl-nucleotide +emf;application/x-msmetafile +eml;message/rfc822 +emm;application/vnd.ibm.electronic-media +emma;application/emma+xml +emp;application/vnd.emusic-emusic_package +emz;application/x-msmetafile +ent;application/vnd.nervana +entity;application/vnd.nervana +env;application/x-envoy +eol;audio/vnd.digital-winds +eot;application/vnd.ms-fontobject +eps2;application/postscript +eps3;application/postscript +eps;application/postscript +epsf;application/postscript +epsi;application/postscript +epub;application/x-epub+zip +erf;image/x-epson-erf +erl;text/x-erlang +es3;application/vnd.eszigno3+xml +es;application/ecmascript +esa;application/vnd.osgi.subsystem +esf;application/vnd.epson.esf +et3;application/vnd.eszigno3+xml +etheme;application/x-e-theme +etx;text/x-setext +eva;application/x-eva +evc;audio/evrc +event-stream;text/x-event-stream +evy;application/x-envoy +exe;application/x-msdos-program +exi;application/exi +exr;image/x-exr +ext;application/vnd.novadigm.ext +ez2;application/vnd.ezpix-album +ez3;application/vnd.ezpix-package +ez;application/andrew-inset +f4a;audio/mp4 +f4b;audio/mp4 +f4p;video/mp4 +f4v;video/mp4 +f77;text/x-fortran +f90;text/x-fortran +f95;text/x-fortran +f;text/x-fortran +fb2;application/x-fictionbook+xml +fb;application/x-maker +fbdoc;application/x-maker +fbs;image/vnd.fastbidsheet +fcdt;application/vnd.adobe.formscentral.fcdt +fch;x-chemical/x-gaussian-checkpoint +fchk;x-chemical/x-gaussian-checkpoint +fcs;application/vnd.isac.fcs +fdf;application/vnd.fdf +fe_launch;application/vnd.denovo.fcselayout-link +fg5;application/vnd.fujitsu.oasysgp +fgd;application/x-director +fh4;image/x-freehand +fh5;image/x-freehand +fh7;image/x-freehand +fh;image/x-freehand +fhc;image/x-freehand +fif;application/x-fractals +fig;application/x-xfig +fits;image/fits +fl;application/x-fluid +flac;audio/x-flac +flc;video/x-flic +fli;video/x-fli +flo;application/vnd.micrografx.flo +flv;video/x-flv +flw;application/vnd.kde.kivio +flx;text/vnd.fmi.flexstor +fly;text/vnd.fly +fm;application/x-maker +fmf;video/x-atomic3d-feature +fnc;application/vnd.frogans.fnc +fo;text/x-xslfo +fodg;application/vnd.oasis.opendocument.graphics-flat-xml +fodp;application/vnd.oasis.opendocument.presentation-flat-xml +fods;application/vnd.oasis.opendocument.spreadsheet-flat-xml +fodt;application/vnd.oasis.opendocument.text-flat-xml +for;text/x-fortran +fpx;image/vnd.fpx +frame;application/x-maker +frl;application/x-freeloader +frm;application/x-maker +fsc;application/vnd.fsc.weblauch +fst;image/vnd.fst +ftc;application/vnd.fluxtime.clip +fti;application/vnd.anser-web-funds-transfer-initiation +funk;audio/x-make +fvt;video/vnd.fvt +fxm;video/x-javafx +fxp;application/vnd.adobe.fxp +fxpl;application/vnd.adobe.fxp +fzs;application/vnd.fuzzysheet +g2w;application/vnd.geoplan +g3;image/g3fax +g3w;application/vnd.geospace +g;text/plain +gac;application/vnd.groove-account +gal;x-chemical/x-gaussian-log +gam;x-chemical/x-gamess-input +gamin;x-chemical/x-gamess-input +gau;x-chemical/x-gaussian-input +gb;application/x-gameboy-rom +gba;application/x-gba-rom +gbc;application/x-gameboy-rom +gbr;application/rpki-ghostbusters +gca;application/x-gca-compressed +gcd;text/x-pcs-gcd +gcf;application/x-graphing-calculator +gcg;x-chemical/x-gcg8-sequence +gcrd;text/vcard +gdl;model/vnd.gdl +ged;application/x-gedcom +gedcom;application/x-gedcom +gem;application/x-tar +gen;x-chemical/x-genbank +geo;application/vnd.dynageo +gex;application/vnd.geometry-explorer +gf;application/x-tex-gf +gg;application/x-sms-rom +ggb;application/vnd.geogebra.file +ggt;application/vnd.geogebra.tool +ghf;application/vnd.groove-help +gif;image/gif +gim;application/vnd.groove-identity-message +gjc;x-chemical/x-gaussian-input +gjf;x-chemical/x-gaussian-input +gl;video/x-gl +glade;application/x-glade +gml;application/x-gml+xml +gmo;application/x-gettext-translation +gmx;application/vnd.gmx +gnc;application/x-gnucash +gnd;application/x-gnunet-directory +gnucash;application/x-gnucash +gnumeric;application/x-gnumeric +gnuplot;application/x-gnuplot +go;text/x-go +gp;application/x-gnuplot +gpg;application/pgp-encrypted +gph;application/vnd.flographit +gplt;application/x-gnuplot +gpt;x-chemical/x-mopac-graph +gpx;application/x-gpx+xml +gqf;application/vnd.grafeq +gqs;application/vnd.grafeq +gra;application/x-graphite +gram;application/srgs +gramps;application/x-gramps-xml +gre;application/vnd.geometry-explorer +grv;application/vnd.groove-injector +grxml;application/srgs+xml +gs;text/x-genie +gsd;audio/x-gsm +gsf;application/x-font +gsm;audio/x-gsm +gsp;application/x-gsp +gss;application/x-gss +gtar;application/x-gtar +gtm;application/vnd.groove-tool-message +gtw;model/vnd.gtw +gv;text/vnd.graphviz +gvp;text/x-google-video-pointer +gxf;application/x-gxf +gxt;application/vnd.geonext +gz;application/x-gzip +gzip;application/x-gzip +h++;text/x-c++hdr +h261;video/h261 +h263;video/h263 +h264;video/h264 +h4;application/x-hdf +h5;application/x-hdf +h;text/x-chdr +hal;application/vnd.hal+xml +hbc;application/vnd.hbci +hbci;application/vnd.hbci +hdf4;application/x-hdf +hdf5;application/x-hdf +hdf;application/x-hdf +help;application/x-helpfile +hep;application/x-hep +hgl;application/vnd.hp-hpgl +hh;text/x-c++hdr +hin;x-chemical/x-hin +hlb;text/x-script +hlp;application/x-winhlp +hp;text/x-c++hdr +hpg;application/vnd.hp-hpgl +hpgl;application/vnd.hp-hpgl +hpid;application/vnd.hp-hpid +hpp;text/x-c++hdr +hps;application/vnd.hp-hps +hqx;application/mac-binhex40 +hs;text/x-haskell +hta;application/x-hta +htc;text/x-component +htke;application/vnd.kenameapp +htm;text/html +html;text/html +htmls;text/html +htmlx;text/html +htt;text/x-webviewhtml +htx;text/html +hvd;application/vnd.yamaha.hv-dic +hvp;application/vnd.yamaha.hv-voice +hvs;application/vnd.yamaha.hv-script +hwp;application/x-hwp +hwt;application/x-hwt +hxx;text/x-c++hdr +i2g;application/vnd.intergeo +ica;application/x-ica +icb;image/x-tga +icc;application/vnd.iccprofile +ice;x-conference/x-cooltalk +icm;application/vnd.iccprofile +icns;image/x-icns +ico;image/vnd.microsoft.icon +ics;text/calendar +icz;text/calendar +idc;text/plain +idl;text/x-idl +ief;image/ief +iefs;image/ief +ifb;text/calendar +iff;image/x-ilbm +ifm;application/vnd.shana.informed.formdata +iges;model/iges +igl;application/vnd.igloader +igm;application/vnd.insors.igm +igs;model/iges +igx;application/vnd.micrografx.igx +iif;application/vnd.shana.informed.interchange +iii;application/x-iphone +ilbm;image/x-ilbm +ima;application/x-ima +imagemap;application/x-imagemap +imap;application/x-imagemap +ime;text/x-imelody +img;application/x-raw-disk-image +imp;application/vnd.accpac.simply.imp +ims;application/vnd.ms-ims +imy;text/x-imelody +in;text/plain +inf;application/x-inf +info;application/x-info +ini;text/plain +ink;application/inkml+xml +inkml;application/inkml+xml +inp;x-chemical/x-gamess-input +ins;application/x-internet-signup +install;application/x-install-instructions +iota;application/vnd.astraea-software.iota +ip;application/x-ip2 +ipfix;application/ipfix +ipk;application/vnd.shana.informed.package +iptables;text/x-iptables +irm;application/vnd.ibm.rights-management +irp;application/vnd.irepository.package+xml +iso9660;application/x-cd-image +iso;application/x-iso9660-image +isp;application/x-internet-signup +ist;x-chemical/x-isostar +istr;x-chemical/x-isostar +isu;video/x-isvideo +it87;application/x-it87 +it;audio/x-it +itp;application/vnd.shana.informed.formtemplate +iv;application/x-inventor +ivp;application/vnd.immervision-ivp +ivr;x-i-world/x-i-vrml +ivu;application/vnd.immervision-ivu +ivy;application/x-livescreen +jad;text/vnd.sun.j2me.app-descriptor +jam;application/x-jam +jar;application/x-java-archive +jav;text/x-java-source +java;text/x-java +jceks;application/x-java-jce-keystore +jcm;application/x-java-commerce +jdx;x-chemical/x-jcamp-dx +jfif-tbnl;image/jpeg +jfif;image/jpeg +jisp;application/vnd.jisp +jks;application/x-java-keystore +jlt;application/vnd.hp-jlyt +jmz;application/x-jmol +jng;image/x-jng +jnlp;application/x-java-jnlp-file +joda;application/vnd.joost.joda-archive +jp2;image/jp2 +jpe;image/jpeg +jpeg;image/jpeg +jpf;image/jpx +jpg2;image/jp2 +jpg;image/jpeg +jpgm;image/jpm +jpgv;video/jpeg +jpm;image/jpm +jpr;application/x-jbuilder-project +jps;image/x-jps +jpx;image/jpx +jrd;application/x-jrd+json +js;application/javascript +jsm;application/javascript +json-patch;application/json-patch+json +json;application/json +jsonld;application/ld+json +jsonml;application/x-jsonml+json +jut;image/x-jutvision +k25;image/x-kodak-k25 +kar;audio/x-midi +karbon;application/vnd.kde.karbon +kcm;application/vnd.nervana +kdc;image/x-kodak-kdc +kdelnk;application/x-desktop +kexi;application/x-kexiproject-sqlite2 +kexic;application/x-kexi-connectiondata +kexis;application/x-kexiproject-shortcut +key;application/pgp-keys +kfo;application/vnd.kde.kformula +kia;application/vnd.kidspiration +kil;application/x-killustrator +kin;x-chemical/x-kinemage +kino;application/smil+xml +kml;application/vnd.google-earth.kml+xml +kmz;application/vnd.google-earth.kmz +kne;application/vnd.kinar +knp;application/vnd.kinar +kom;application/vnd.hbci +kon;application/vnd.kde.kontour +koz;audio/vnd.audiokoz +kpm;application/x-kpovmodeler +kpr;application/vnd.kde.kpresenter +kpt;application/vnd.kde.kpresenter +kpxx;application/vnd.ds-keypoint +kra;application/x-krita +ks;application/x-java-keystore +ksh;application/x-ksh +ksp;application/vnd.kde.kspread +ktr;application/vnd.kahootz +ktx;image/ktx +ktz;application/vnd.kahootz +kud;application/x-kugar +kwd;application/vnd.kde.kword +kwt;application/vnd.kde.kword +l16;audio/l16 +la;audio/x-nspaudio +lam;audio/x-liveaudio +lasxml;application/vnd.las.las+xml +latex;application/x-latex +lbd;application/vnd.llamagraphics.life-balance.desktop +lbe;application/vnd.llamagraphics.life-balance.exchange+xml +lbm;image/x-ilbm +ldif;text/x-ldif +les;application/vnd.hhe.lesson-player +lha;application/x-lha +lhs;text/x-literate-haskell +lhx;application/octet-stream +lhz;application/x-lhz +lin;application/x-bbolin +link66;application/vnd.route66.link66+xml +list3820;application/vnd.ibm.modcap +list;text/plain +listafp;application/vnd.ibm.modcap +lma;audio/x-nspaudio +lnk;application/x-ms-shortcut +log;text/x-log +lostxml;application/lost+xml +lrf;application/octet-stream +lrm;application/vnd.ms-lrm +lrv;video/mp4 +lrz;application/x-lrzip +lsf;video/x-la-asf +lsp;application/x-lisp +lst;text/plain +lsx;video/x-la-asf +ltf;application/vnd.frogans.ltf +ltx;text/x-tex +lua;text/x-lua +luac;application/x-lua-bytecode +lvp;audio/vnd.lucent.voice +lwo;image/x-lwo +lwob;image/x-lwo +lwp;application/vnd.lotus-wordpro +lws;image/x-lws +ly;text/x-lilypond +lyx;application/x-lyx +lz4;application/x-lz4 +lz;application/x-lzip +lzh;application/x-lzh +lzma;application/x-lzma +lzo;application/x-lzop +lzx;application/x-lzx +m13;application/x-msmediaview +m14;application/x-msmediaview +m15;audio/x-mod +m1u;video/vnd.mpegurl +m1v;video/mpeg +m21;application/mp21 +m2a;audio/mpeg +m2t;video/mp2t +m2ts;video/mp2t +m2v;video/mpeg +m3a;audio/mpeg +m3g;application/x-m3g +m3u8;application/vnd.apple.mpegurl +m3u;audio/x-mpegurl +m4;application/x-m4 +m4a;audio/mpeg +m4b;audio/x-m4b +m4p;application/mp4 +m4u;video/vnd.mpegurl +m4v;video/x-m4v +m;text/x-m +ma;application/mathematica +mab;application/x-markaby +mads;application/mads+xml +mag;application/vnd.ecowin.chart +mak;text/x-makefile +maker;application/x-maker +man;application/x-troff-man +manifest;text/x-cache-manifest +map;application/x-navimap +mar;application/octet-stream +markdown;text/x-markdown +mathml;application/mathml+xml +mb;application/mathematica +mbd;application/x-mbedlet +mbk;application/vnd.mobius.mbk +mbox;application/mbox +mc$;application/x-magic-cap-package-1.0 +mc1;application/vnd.medcalcdata +mcd;application/vnd.mcd +mcf;image/x-vasa +mcif;x-chemical/x-mmcif +mcm;x-chemical/x-macmolecule +mcp;application/x-netmc +mcurl;text/vnd.curl.mcurl +md;text/x-markdown +mda;application/x-msaccess +mdb;application/x-msaccess +mde;application/x-msaccess +mdf;application/x-msaccess +mdi;image/vnd.ms-modi +mdp;application/dash+xml +mdx;application/x-genesis-rom +me;application/x-troff-me +med;audio/x-mod +mesh;model/mesh +meta4;application/metalink4+xml +metalink;application/x-metalink+xml +mets;application/mets+xml +mfm;application/vnd.mfmp +mft;application/rpki-manifest +mgp;application/vnd.osgeo.mapguide.package +mgz;application/vnd.proteus.magazine +mht;message/rfc822 +mhtml;message/rfc822 +mid;audio/x-midi +midi;audio/x-midi +mie;application/x-mie +mif;application/vnd.mif +mime;message/rfc822 +minipsf;audio/x-minipsf +mj2;video/mj2 +mjf;audio/x-vnd.audioexplosion.mjuicemediafile +mjp2;video/mj2 +mjpg;video/x-motion-jpeg +mk3d;video/x-matroska +mk;text/x-makefile +mka;audio/x-matroska +mkd;text/x-markdown +mks;video/x-matroska +mkv;video/x-matroska +ml;text/x-ocaml +mli;text/x-ocaml +mlp;application/vnd.dolby.mlp +mm;application/x-freemind +mmd;x-chemical/x-macromodel-input +mme;application/x-base64 +mmf;application/vnd.smaf +mml;text/x-mathml +mmod;x-chemical/x-macromodel-input +mmr;image/vnd.fujixerox.edmics-mmr +mng;video/x-mng +mny;application/x-msmoney +mo3;audio/x-mo3 +mo;application/x-gettext-translation +mobi;application/x-mobipocket-ebook +moc;text/x-moc +mod;audio/x-mod +mods;application/mods+xml +mof;text/x-mof +mol2;x-chemical/x-mol2 +mol;x-chemical/x-mdl-molfile +moo;x-chemical/x-mopac-out +moov;video/quicktime +mop;x-chemical/x-mopac-input +mopcrt;x-chemical/x-mopac-input +mov;video/quicktime +movie;video/x-sgi-movie +mp+;audio/x-musepack +mp21;application/mp21 +mp2;audio/mpeg +mp2a;audio/mpeg +mp3;audio/mpeg +mp4;video/mp4 +mp4a;audio/mp4 +mp4s;application/mp4 +mp4v;video/mp4 +mpa;audio/mpeg +mpc;application/vnd.mophun.certificate +mpe;video/mpeg +mpeg;video/mpeg +mpega;audio/mpeg +mpg4;video/mp4 +mpg;video/mpeg +mpga;audio/mpeg +mpkg;application/vnd.apple.installer+xml +mpl;video/mp2t +mpls;video/mp2t +mpm;application/vnd.blueice.multipass +mpn;application/vnd.mophun.application +mpp;application/vnd.ms-project +mpt;application/vnd.ms-project +mpv;video/x-matroska +mpx;application/x-project +mpy;application/vnd.ibm.minipay +mqy;application/vnd.mobius.mqy +mrc;application/marc +mrcx;application/marcxml+xml +mrl;text/x-mrml +mrml;text/x-mrml +mrw;image/x-minolta-mrw +ms;application/x-troff-ms +mscml;application/mediaservercontrol+xml +mseed;application/vnd.fdsn.mseed +mseq;application/vnd.mseq +msf;application/vnd.epson.msf +msh;model/mesh +msi;application/x-msi +msl;application/vnd.mobius.msl +msod;image/x-msod +msty;application/vnd.muvee.style +msx;application/x-msx-rom +mtm;audio/x-mod +mts;model/vnd.mts +mup;text/x-mup +mus;application/vnd.musician +musicxml;application/vnd.recordare.musicxml+xml +mv;video/x-sgi-movie +mvb;x-chemical/x-mopac-vib +mwf;application/vnd.mfer +mxf;application/mxf +mxl;application/vnd.recordare.musicxml +mxmf;audio/vnd.nokia.mobile-xmf +mxml;application/xv+xml +mxs;application/vnd.triscape.mxs +mxu;video/vnd.mpegurl +my;audio/x-make +mzz;application/x-vnd.audioexplosion.mzz +n-gage;application/vnd.nokia.n-gage.symbian.install +n3;text/n3 +n64;application/x-n64-rom +nap;image/naplps +naplps;image/naplps +nb;application/mathematica +nbp;application/mathematica +nc;application/x-netcdf +ncm;application/vnd.nokia.configuration-message +ncx;application/x-dtbncx+xml +nds;application/x-nintendo-ds-rom +nef;image/x-nikon-nef +nes;application/x-nes-rom +nez;application/x-nes-rom +nfo;text/x-nfo +ngdat;application/vnd.nokia.n-gage.data +nif;image/x-niff +niff;image/x-niff +nim;video/vnd.nokia.interleaved-multimedia +nitf;application/vnd.nitf +nix;application/x-mix-transfer +nlu;application/vnd.neurolanguage.nlu +nml;application/vnd.enliven +nnd;application/vnd.noblenet-directory +nns;application/vnd.noblenet-sealer +nnw;application/vnd.noblenet-web +not;text/x-mup +npx;image/vnd.net-fpx +nsc;application/x-conference +nsf;application/vnd.lotus-notes +nsv;video/x-nsv +ntf;application/vnd.nitf +nvd;application/x-navidoc +nwc;application/x-nwc +nws;message/rfc822 +nzb;application/x-nzb +o;application/x-object +oa2;application/vnd.fujitsu.oasys2 +oa3;application/vnd.fujitsu.oasys3 +oas;application/vnd.fujitsu.oasys +obd;application/x-msbinder +obj;application/x-tgif +ocl;text/x-ocl +oda;application/oda +odb;application/vnd.oasis.opendocument.database +odc;application/vnd.oasis.opendocument.chart +odf;application/vnd.oasis.opendocument.formula +odft;application/vnd.oasis.opendocument.formula-template +odg;application/vnd.oasis.opendocument.graphics +odi;application/vnd.oasis.opendocument.image +odm;application/vnd.oasis.opendocument.text-master +odp;application/vnd.oasis.opendocument.presentation +ods;application/vnd.oasis.opendocument.spreadsheet +odt;application/vnd.oasis.opendocument.text +oga;audio/ogg +ogg;audio/ogg +ogm;video/x-ogm+ogg +ogv;video/ogg +ogx;application/ogg +old;application/x-trash +oleo;application/x-oleo +omc;application/x-omc +omcd;application/x-omcdatamaker +omcr;application/x-omcregerator +omdoc;application/x-omdoc+xml +onepkg;application/x-onenote +onetmp;application/x-onenote +onetoc2;application/x-onenote +onetoc;application/x-onenote +ooc;text/x-ooc +opf;application/x-oebps-package+xml +opml;text/x-opml +oprc;application/vnd.palm +opus;audio/ogg +ora;image/x-openraster +orf;image/x-olympus-orf +org;application/vnd.lotus-organizer +orq;application/ocsp-request +ors;application/ocsp-response +osf;application/vnd.yamaha.openscoreformat +osfpvg;application/vnd.yamaha.openscoreformat.osfpvg+xml +otc;application/vnd.oasis.opendocument.chart-template +otf;x-font/x-otf +otg;application/vnd.oasis.opendocument.graphics-template +oth;application/vnd.oasis.opendocument.text-web +oti;application/vnd.oasis.opendocument.image-template +otm;application/vnd.oasis.opendocument.text-master +otp;application/vnd.oasis.opendocument.presentation-template +ots;application/vnd.oasis.opendocument.spreadsheet-template +ott;application/vnd.oasis.opendocument.text-template +owl;application/rdf+xml +owx;application/x-owl+xml +oxps;application/oxps +oxt;application/vnd.openofficeorg.extension +oza;application/x-oz-application +p10;application/pkcs10 +p12;application/x-pkcs12 +p65;application/x-pagemaker +p7a;application/x-pkcs7-signature +p7b;application/x-pkcs7-certificates +p7c;application/pkcs7-mime +p7m;application/pkcs7-mime +p7r;application/x-pkcs7-certreqresp +p7s;application/pkcs7-signature +p8;application/pkcs8 +p;text/x-pascal +pac;application/x-ns-proxy-autoconfig +pack;application/x-java-pack200 +pak;application/x-pak +par2;application/x-par2 +part;application/x-pro_eng +pas;text/x-pascal +pat;image/x-coreldrawpattern +patch;text/x-diff +paw;application/vnd.pawaafile +pbd;application/vnd.powerbuilder6 +pbm;image/x-portable-bitmap +pcap;application/x-cap +pcd;image/x-photo-cd +pce;application/x-pc-engine-rom +pcf.z;application/x-font +pcf;application/x-font +pcl;application/vnd.hp-pcl +pclxl;application/vnd.hp-pclxl +pct;image/x-pict +pcurl;application/vnd.curl.pcurl +pcx;image/x-pcx +pdb;application/vnd.palm +pdc;application/x-aportisdoc +pdf;application/pdf +pef;image/x-pentax-pef +pem;application/x-x509-ca-cert +perl;application/x-perl +pfa;application/x-font +pfb;application/x-font +pfm;application/x-font-type1 +pfr;application/font-tdpfr +pfunk;audio/x-make +pfx;application/x-pkcs12 +pgb;image/vnd.glocalgraphics.pgb +pgm;image/x-portable-graymap +pgn;application/x-chess-pgn +pgp;application/pgp-signature +php3;application/x-httpd-php3 +php3p;application/x-httpd-php3-preprocessed +php4;application/x-httpd-php4 +php5;application/x-httpd-php5 +php;application/x-httpd-php +phps;application/x-httpd-php-source +pht;application/x-httpd-php +phtml;application/x-httpd-php +pic;image/x-pict +pict1;image/x-pict +pict2;image/x-pict +pict;image/x-pict +pk;application/x-tex-pk +pkd;application/vnd.hbci +pkg;application/x-newton-compatible-pkg +pki;application/pkixcmp +pkipath;application/x-pkix-pkipath +pko;application/vnd.ms-pki.pko +pkr;application/pgp-keys +pl;application/x-perl +pla;audio/x-iriver-pla +plb;application/vnd.3gpp.pic-bw-large +plc;application/vnd.mobius.plc +plf;application/vnd.pocketlearn +plj;audio/vnd.everad.plj +pln;application/x-planperfect +pls;audio/x-scpls +plt;application/vnd.hp-hpgl +plx;application/x-pixclscript +pm4;application/x-pagemaker +pm5;application/x-pagemaker +pm6;application/x-pagemaker +pm;application/x-pagemaker +pmd;application/x-pagemaker +pml;application/vnd.ctc-posml +png;image/png +pnm;image/x-portable-anymap +pntg;image/x-macpaint +po;text/x-gettext-translation +pod;application/x-perl +por;application/x-spss-por +portpkg;application/vnd.macports.portpkg +pot;application/vnd.ms-powerpoint +potm;application/vnd.ms-powerpoint.template.macroenabled.12 +potx;application/vnd.openxmlformats-officedocument.presentationml.template +pov;model/x-pov +ppa;application/vnd.ms-powerpoint +ppam;application/vnd.ms-powerpoint.addin.macroenabled.12 +ppd;application/vnd.cups-ppd +ppm;image/x-portable-pixmap +pps;application/vnd.ms-powerpoint +ppsm;application/vnd.ms-powerpoint.slideshow.macroenabled.12 +ppsx;application/vnd.openxmlformats-officedocument.presentationml.slideshow +ppt;application/vnd.ms-powerpoint +pptm;application/vnd.ms-powerpoint.presentation.macroenabled.12 +pptx;application/vnd.openxmlformats-officedocument.presentationml.presentation +ppz;application/x-mspowerpoint +pqa;application/vnd.palm +prc;application/vnd.palm +pre;application/vnd.lotus-freelance +prf;application/x-pics-rules +prt;x-chemical/x-ncbi-asn1-ascii +ps-z;application/postscript +ps;application/postscript +psb;application/vnd.3gpp.pic-bw-small +psd;image/x-photoshop +psf;application/x-font-linux-psf +psflib;audio/x-psflib +psid;audio/prs.sid +pskcxml;application/pskc+xml +psw;application/x-pocket-word +pt5;application/x-pagemaker +pti;application/vnd.pvi.ptid1 +ptid;application/vnd.pvi.ptid1 +pub;application/x-mspublisher +pvb;application/vnd.3gpp.pic-bw-var +pvu;x-paleovu/x-pv +pw;application/x-pw +pwn;application/vnd.3m.post-it-notes +pwz;application/vnd.ms-powerpoint +py;application/x-python +pya;audio/vnd.ms-playready.media.pya +pyc;application/x-python-code +pyo;application/x-python-code +pyv;video/vnd.ms-playready.media.pyv +pyx;text/x-python +qam;application/vnd.epson.quickanime +qbo;application/vnd.intu.qbo +qcp;audio/qcelp +qd3;x-world/x-3dmf +qd3d;x-world/x-3dmf +qfx;application/vnd.intu.qfx +qgs;application/x-qgis +qif;image/x-quicktime +qml;text/x-qml +qmlproject;text/x-qml +qmltypes;text/x-qml +qp;application/x-qpress +qps;application/vnd.publishare-delta-tree +qt;video/quicktime +qtc;video/x-qtc +qti;image/x-quicktime +qtif;image/x-quicktime +qtl;application/x-quicktimeplayer +qtvr;video/quicktime +qwd;application/vnd.quark.quarkxpress +qwt;application/vnd.quark.quarkxpress +qxb;application/vnd.quark.quarkxpress +qxd;application/vnd.quark.quarkxpress +qxl;application/vnd.quark.quarkxpress +qxt;application/vnd.quark.quarkxpress +ra;audio/x-pn-realaudio +raf;image/x-fuji-raf +ram;audio/x-pn-realaudio +rar;application/x-rar +ras;image/x-cmu-raster +rast;image/x-cmu-raster +raw-disk-image;application/x-raw-disk-image +raw;image/x-panasonic-raw +rax;audio/vnd.rn-realaudio +rb;application/x-ruby +rbw;application/x-ruby +rcprofile;application/vnd.ipunplugged.rcprofile +rct;application/prs.nprend +rd;x-chemical/x-mdl-rdfile +rdf;application/rdf+xml +rdfs;application/rdf+xml +rdz;application/vnd.data-vision.rdz +reg;text/x-ms-regedit +rej;text/x-reject +rep;application/vnd.businessobjects +req;application/vnd.nervana +request;application/vnd.nervana +res;application/x-dtbresource+xml +rexx;text/x-script.rexx +rf;image/vnd.rn-realflash +rgb;image/x-rgb +rhtml;application/x-html+ruby +rif;application/reginfo+xml +rip;audio/vnd.rip +ris;application/x-research-info-systems +rl;application/resource-lists+xml +rlc;image/vnd.fujixerox.edmics-rlc +rld;application/resource-lists-diff+xml +rle;image/x-rle +rm;audio/x-pn-realaudio +rmi;audio/x-midi +rmj;application/vnd.rn-realmedia +rmm;audio/x-pn-realaudio +rmp;audio/x-pn-realaudio-plugin +rms;application/vnd.jcp.javame.midlet-rms +rmvb;application/vnd.rn-realmedia-vbr +rmx;application/vnd.rn-realmedia +rnc;application/relax-ng-compact-syntax +rnd;application/prs.nprend +rng;application/x-ringing-tones +rnx;application/vnd.rn-realplayer +roa;application/rpki-roa +roff;application/x-troff +ros;x-chemical/x-rosdal +rp9;application/vnd.cloanto.rp9 +rp;image/vnd.rn-realpix +rpm;application/x-redhat-package-manager +rpss;application/vnd.nokia.radio-presets +rpst;application/vnd.nokia.radio-preset +rq;application/sparql-query +rs;application/rls-services+xml +rsd;application/x-rsd+xml +rss;application/x-rss+xml +rst;text/prs.fallenstein.rst +rt;text/richtext +rtf;application/rtf +rtx;text/richtext +rv;video/vnd.rn-realvideo +rvx;video/vnd.rn-realvideo +rw2;image/x-panasonic-raw2 +rxn;x-chemical/x-mdl-rxnfile +s11;video/vnd.sealed.mpeg1 +s14;video/vnd.sealed.mpeg4 +s1a;application/vnd.sealedmedia.softseal.pdf +s1e;application/vnd.sealed.xls +s1g;image/vnd.sealedmedia.softseal.gif +s1h;application/vnd.sealedmedia.softseal.html +s1j;image/vnd.sealedmedia.softseal.jpg +s1m;audio/vnd.sealedmedia.softseal.mpeg +s1n;image/vnd.sealed.png +s1p;application/vnd.sealed.ppt +s1q;video/vnd.sealedmedia.softseal.mov +s1w;application/vnd.sealed.doc +s3m;audio/x-s3m +s;text/x-asm +saf;application/vnd.yamaha.smaf-audio +sam;application/x-amipro +sami;application/x-sami +sav;application/x-spss +saveme;application/octet-stream +sbk;application/x-tbook +sbml;application/sbml+xml +sbs;application/x-spss +sc;application/vnd.ibm.secure-container +scala;text/x-scala +scd;application/x-msschedule +scm;application/vnd.lotus-screencam +scq;application/scvp-cv-request +scr;application/x-silverlight +scs;application/scvp-cv-response +sct;text/x-scriptlet +scurl;text/vnd.curl.scurl +sd2;audio/x-sd2 +sd;x-chemical/x-mdl-sdfile +sda;application/vnd.stardivision.draw +sdc;application/vnd.stardivision.calc +sdd;application/vnd.stardivision.impress +sdf;application/vnd.stardivision.math +sdkd;application/vnd.solent.sdkm+xml +sdkm;application/vnd.solent.sdkm+xml +sdml;text/plain +sdo;application/vnd.sealed.doc +sdoc;application/vnd.sealed.doc +sdp;application/sdp +sdr;application/x-sounder +sds;application/vnd.stardivision.chart +sdw;application/vnd.stardivision.writer +sea;application/x-sea +see;application/vnd.seemail +seed;application/vnd.fdsn.seed +sem;application/vnd.sealed.eml +sema;application/vnd.sema +semd;application/vnd.semd +semf;application/vnd.semf +seml;application/vnd.sealed.eml +ser;application/x-java-serialized-object +set;application/x-set +setpay;application/set-payment-initiation +setreg;application/set-registration-initiation +sfc;application/vnd.nintendo.snes.rom +sfd-hdstx;application/vnd.hydrostatix.sof-data +sfs;application/vnd.spotfire.sfs +sfv;text/x-sfv +sg;application/x-sms-rom +sgb;application/x-gameboy-rom +sgf;application/x-go-sgf +sgi;image/vnd.sealedmedia.softseal.gif +sgif;image/vnd.sealedmedia.softseal.gif +sgl;application/vnd.stardivision.writer-global +sgm;text/sgml +sgml;text/sgml +sh;application/x-sh +shape;application/x-dia-shape +shar;application/x-shar +shf;application/shf+xml +shn;application/x-shorten +shp;application/x-qgis +shtml;text/html +shx;application/x-qgis +si;text/vnd.wap.si +siag;application/x-siag +sic;application/vnd.wap.sic +sid;audio/prs.sid +sig;application/pgp-signature +sik;application/x-trash +sil;audio/x-silk +silo;model/mesh +sis;application/vnd.symbian.install +sisx;x-epoc/x-sisx-app +sit;application/x-stuffit +sitx;application/x-stuffit +siv;application/sieve +sjp;image/vnd.sealedmedia.softseal.jpg +sjpg;image/vnd.sealedmedia.softseal.jpg +sk1;image/x-skencil +sk;image/x-skencil +skd;application/x-koan +skm;application/x-koan +skp;application/x-koan +skr;application/pgp-keys +skt;application/x-koan +sl;text/vnd.wap.sl +slc;application/vnd.wap.slc +sldm;application/vnd.ms-powerpoint.slide.macroenabled.12 +sldx;application/vnd.openxmlformats-officedocument.presentationml.slide +slk;text/x-spreadsheet +slt;application/vnd.epson.salt +sm;application/vnd.stepmania.stepchart +smaf;application/x-smaf +smc;application/vnd.nintendo.snes.rom +smd;application/vnd.stardivision.mail +smf;application/vnd.stardivision.math +smh;application/vnd.sealed.mht +smht;application/vnd.sealed.mht +smi;application/smil +smil;application/smil +sml;application/smil+xml +smo;video/vnd.sealedmedia.softseal.mov +smov;video/vnd.sealedmedia.softseal.mov +smp3;audio/vnd.sealedmedia.softseal.mpeg +smp;audio/vnd.sealedmedia.softseal.mpeg +smpg;video/vnd.sealed.mpeg4 +sms;application/vnd.3gpp.sms +smv;audio/smv +smzip;application/vnd.stepmania.package +snd;audio/basic +snf;application/x-font-snf +so;application/x-sharedlib +soc;application/sgml-open-catalog +sol;application/x-solids +spc;x-chemical/x-galactic-spc +spd;application/vnd.sealedmedia.softseal.pdf +spdf;application/vnd.sealedmedia.softseal.pdf +spec;text/x-rpm-spec +spf;application/vnd.yamaha.smaf-phrase +spl;application/x-futuresplash +spm;application/x-source-rpm +spn;image/vnd.sealed.png +spng;image/vnd.sealed.png +spo;application/x-spss +spot;text/vnd.in3d.spot +spp;application/vnd.sealed.ppt +sppt;application/vnd.sealed.ppt +spq;application/scvp-vp-request +spr;application/x-sprite +sprite;application/x-sprite +sps;application/x-spss +spx;audio/ogg +sql;application/x-sql +sr2;image/x-sony-sr2 +src;application/x-wais-source +srf;image/x-sony-srf +srt;application/x-subrip +sru;application/sru+xml +srx;application/sparql-results+xml +ss;text/x-scheme +ssa;text/x-ssa +ssdl;application/x-ssdl+xml +sse;application/vnd.kodak-descriptor +ssf;application/vnd.epson.ssf +ssi;text/x-server-parsed-html +ssm;application/x-streamingmedia +ssml;application/ssml+xml +sst;application/vnd.ms-pki.certstore +ssw;video/vnd.sealed.swf +sswf;video/vnd.sealed.swf +st;application/vnd.sailingtracker.track +stc;application/vnd.sun.xml.calc.template +std;application/vnd.sun.xml.draw.template +step;application/x-step +stf;application/vnd.wt.stf +sti;application/vnd.sun.xml.impress.template +stk;application/hyperstudio +stl;application/vnd.ms-pki.stl +stm;application/vnd.sealedmedia.softseal.html +stml;application/vnd.sealedmedia.softseal.html +stp;application/x-step +str;application/vnd.pg.format +stw;application/vnd.sun.xml.writer.template +sty;text/x-tex +sub;image/vnd.dvb.subtitle +sun;image/x-sun-raster +sus;application/vnd.sus-calendar +susp;application/vnd.sus-calendar +sv4cpio;application/x-sv4cpio +sv4crc;application/x-sv4crc +sv;text/x-svsrc +svc;application/vnd.dvb.service +svd;application/vnd.svd +svf;image/vnd.dwg +svg;image/svg+xml +svgz;image/svg+xml +svh;text/x-svhdr +svr;application/x-world +sw;x-chemical/x-swissprot +swa;application/x-director +swf;application/x-shockwave-flash +swfl;application/x-shockwave-flash +swi;application/vnd.aristanetworks.swi +swm;application/x-ms-wim +sxc;application/vnd.sun.xml.calc +sxd;application/vnd.sun.xml.draw +sxg;application/vnd.sun.xml.writer.global +sxi;application/vnd.sun.xml.impress +sxl;application/vnd.sealed.xls +sxls;application/vnd.sealed.xls +sxm;application/vnd.sun.xml.math +sxw;application/vnd.sun.xml.writer +sylk;text/x-spreadsheet +t2t;text/x-txt2tags +t3;application/x-t3vm-image +t;application/x-troff +taglet;application/vnd.mynfc +talk;text/x-speech +tao;application/vnd.tao.intent-module-archive +tar;application/x-tar +taz;application/x-gtar +tb2;application/x-bzip-compressed-tar +tbk;application/x-toolbook +tbz2;application/x-gtar +tbz;application/x-gtar +tcap;application/vnd.3gpp2.tcap +tcl;application/x-tcl +tcsh;text/x-script.tcsh +teacher;application/vnd.smart.teacher +tei;application/tei+xml +teicorpus;application/tei+xml +tex;application/x-tex +texi;application/x-texinfo +texinfo;application/x-texinfo +text;application/x-plain +tfi;application/thraud+xml +tfm;application/x-tex-tfm +tga;image/x-targa +tgf;x-chemical/x-mdl-tgf +tgz;application/x-gtar +theme;application/x-theme +themepack;application/x-windows-themepack +thmx;application/vnd.ms-officetheme +tif;image/tiff +tiff;image/tiff +tk;text/x-tcl +tlrz;application/x-lrzip-compressed-tar +tlz;application/x-lzma-compressed-tar +tm;text/x-texmacs +tmo;application/vnd.tmobile-livetv +tnef;application/vnd.ms-tnef +tnf;application/vnd.ms-tnef +toc;application/x-cdrdao-toc +torrent;application/x-bittorrent +tpic;image/x-tga +tpl;application/vnd.groove-tool-template +tpt;application/vnd.trid.tpt +tr;application/x-troff +tra;application/vnd.trueapp +trig;application/x-trig +trm;application/x-msterminal +ts;text/x-texmacs +tsd;application/timestamped-data +tsi;audio/x-tsp-audio +tsp;application/x-dsptype +tsv;text/tab-separated-values +tta;audio/x-tta +ttc;x-font/x-collection +ttf;x-font/x-ttf +ttl;text/turtle +ttx;application/x-font-ttx +turbot;image/x-florian +twd;application/vnd.simtech-mindmapper +twds;application/vnd.simtech-mindmapper +txd;application/vnd.genomatix.tuxedo +txf;application/vnd.mobius.txf +txt;text/plain +txz;application/x-xz-compressed-tar +tzo;application/x-tzo +u32;application/x-authorware-bin +udeb;application/x-debian-package +ufd;application/vnd.ufdl +ufdl;application/vnd.ufdl +ufraw;application/x-ufraw +ui;application/x-designer +uil;text/x-uil +uls;text/x-iuls +ult;audio/x-mod +ulx;application/x-glulx +umj;application/vnd.umajin +unf;application/x-nes-rom +uni;text/uri-list +unif;application/x-nes-rom +unis;text/uri-list +unityweb;application/vnd.unity +unv;application/x-i-deas +uoml;application/vnd.uoml+xml +upa;application/vnd.hbci +uri;text/uri-list +uris;text/uri-list +url;application/x-mswinurl +urls;text/uri-list +ustar;application/x-ustar +utz;application/vnd.uiq.theme +uu;text/x-uuencode +uue;text/x-uuencode +uva;audio/vnd.dece.audio +uvd;application/vnd.dece.data +uvf;application/vnd.dece.data +uvg;image/vnd.dece.graphic +uvh;video/vnd.dece.hd +uvi;image/vnd.dece.graphic +uvm;video/vnd.dece.mobile +uvp;video/vnd.dece.pd +uvs;video/vnd.dece.sd +uvt;application/vnd.dece.ttml+xml +uvu;video/vnd.uvvu.mp4 +uvv;video/vnd.dece.video +uvva;audio/vnd.dece.audio +uvvd;application/vnd.dece.data +uvvf;application/vnd.dece.data +uvvg;image/vnd.dece.graphic +uvvh;video/vnd.dece.hd +uvvi;image/vnd.dece.graphic +uvvm;video/vnd.dece.mobile +uvvp;video/vnd.dece.pd +uvvs;video/vnd.dece.sd +uvvt;application/vnd.dece.ttml+xml +uvvu;video/vnd.uvvu.mp4 +uvvv;video/vnd.dece.video +uvvx;application/vnd.dece.unspecified +uvvz;application/vnd.dece.zip +uvx;application/vnd.dece.unspecified +uvz;application/vnd.dece.zip +v64;application/x-n64-rom +v;text/x-verilog +val;x-chemical/x-ncbi-asn1-binary +vala;text/x-vala +vapi;text/x-vala +vbk;audio/vnd.nortel.vbk +vcard;text/vcard +vcd;application/x-cdlink +vcf;text/x-vcard +vcg;application/vnd.groove-vcard +vcs;text/x-vcalendar +vct;text/vcard +vcx;application/vnd.vcx +vda;application/x-vda +vdo;video/x-vdo +vew;application/x-groupwise +vhd;text/x-vhdl +vhdl;text/x-vhdl +vis;application/vnd.visionary +viv;video/vnd.vivo +vivo;video/vnd.vivo +vlc;audio/x-mpegurl +vmd;x-chemical/x-vmd +vmf;application/x-vocaltec-media-file +vms;x-chemical/x-vamas-iso14976 +vob;video/x-ms-vob +voc;audio/x-voc +vor;application/vnd.stardivision.writer +vos;video/x-vosaic +vox;application/x-authorware-bin +vqe;audio/x-twinvq-plugin +vqf;audio/x-twinvq +vql;audio/x-twinvq-plugin +vrm;x-world/x-vrml +vrml;model/vrml +vrt;x-world/x-vrt +vsc;application/vnd.vidsoft.vidconference +vsd;application/vnd.visio +vsf;application/vnd.vsf +vss;application/vnd.visio +vst;application/vnd.visio +vsw;application/vnd.visio +vtt;text/x-vtt +vtu;model/vnd.vtu +vxml;application/voicexml+xml +w3d;application/x-director +w60;application/x-wordperfect6.0 +w61;application/x-wordperfect6.1 +w6w;application/msword +wad;application/x-doom +wav;audio/x-wav +wax;audio/x-ms-wax +wb1;application/x-qpro +wb2;application/x-quattropro +wb3;application/x-quattropro +wbmp;image/vnd.wap.wbmp +wbs;application/vnd.criticaltools.wbs+xml +wbxml;application/vnd.wap.wbxml +wcm;application/vnd.ms-works +wdb;application/vnd.ms-works +wdp;image/vnd.ms-photo +web;application/vnd.xara +weba;audio/x-webm +webapp;application/x-web-app-manifest+json +webm;video/x-webm +webp;image/x-webp +wg;application/vnd.pmi.widget +wgt;application/widget +wif;application/watcherinfo+xml +wim;application/x-ms-wim +wiz;application/msword +wk1;application/x-123 +wk3;application/vnd.lotus-1-2-3 +wk4;application/vnd.lotus-1-2-3 +wk;application/x-123 +wkdownload;application/x-partial-download +wks;application/vnd.lotus-1-2-3 +wm;video/x-ms-wm +wma;audio/x-ms-wma +wmd;application/x-ms-wmd +wmf;application/x-msmetafile +wml;text/vnd.wap.wml +wmlc;application/vnd.wap.wmlc +wmls;text/vnd.wap.wmlscript +wmlsc;application/vnd.wap.wmlscriptc +wmv;video/x-ms-wmv +wmx;video/x-ms-wmx +wmz;application/x-ms-wmz +woff2;x-font/x-woff2 +woff;x-font/x-woff +word;application/msword +wp4;application/vnd.wordperfect +wp5;application/vnd.wordperfect5.1 +wp6;application/x-wordperfect6.1 +wp;application/wordperfect5.1 +wpd;application/vnd.wordperfect +wpg;application/x-wpg +wpl;application/vnd.ms-wpl +wpp;application/vnd.wordperfect +wps;application/vnd.ms-works +wq1;application/x-lotus +wqd;application/vnd.wqd +wrd;application/x-msword +wri;application/x-mswrite +wrl;model/vrml +wrz;model/vrml +wsc;text/x-scriptlet +wsdl;application/wsdl+xml +wsgi;text/x-python +wspolicy;application/wspolicy+xml +wsrc;application/x-wais-source +wtb;application/vnd.webturbo +wtk;application/x-wintalk +wv;application/vnd.wv.csp+wbxml +wvc;audio/x-wavpack-correction +wvp;audio/x-wavpack +wvx;video/x-ms-wvx +wwf;application/x-wwf +wz;application/x-wingz +x-png;image/png +x32;application/x-authorware-bin +x3d;model/x3d+xml +x3db;model/x-x3d+binary +x3dbz;model/x-x3d+binary +x3dv;model/x-x3d+vrml +x3dvz;model/x-x3d+vrml +x3dz;model/x3d+xml +x3f;image/x-sigma-x3f +x_b;model/vnd.parasolid.transmit.binary +x_t;model/vnd.parasolid.transmit.text +xac;application/x-gnucash +xaml;application/x-xaml+xml +xap;application/x-silverlight-app +xar;application/vnd.xara +xbap;application/x-ms-xbap +xbd;application/vnd.fujixerox.docuworks.binder +xbel;application/x-xbel +xbl;application/xml +xbm;image/x-xbitmap +xcf;application/x-xcf +xdf;application/xcap-diff+xml +xdm;application/vnd.syncml.dm+xml +xdp;application/vnd.adobe.xdp+xml +xdr;video/x-amt-demorun +xdssc;application/dssc+xml +xdw;application/vnd.fujixerox.docuworks +xenc;application/xenc+xml +xer;application/patch-ops-error+xml +xfdf;application/vnd.adobe.xfdf +xfdl;application/vnd.xfdl +xgz;x-xgl/x-drawing +xht;application/xhtml+xml +xhtml;application/xhtml+xml +xhvml;application/xv+xml +xi;audio/x-xi +xif;image/vnd.xiff +xl;application/x-excel +xla;application/vnd.ms-excel +xlam;application/vnd.ms-excel.addin.macroenabled.12 +xlb;application/vnd.ms-excel +xlc;application/vnd.ms-excel +xld;application/x-excel +xlf;application/x-xliff+xml +xliff;application/x-xliff +xlk;application/x-excel +xll;application/x-excel +xlm;application/vnd.ms-excel +xlr;application/vnd.ms-works +xls;application/vnd.ms-excel +xlsb;application/vnd.ms-excel.sheet.binary.macroenabled.12 +xlsm;application/vnd.ms-excel.sheet.macroenabled.12 +xlsx;application/vnd.openxmlformats-officedocument.spreadsheetml.sheet +xlt;application/vnd.ms-excel +xltm;application/vnd.ms-excel.template.macroenabled.12 +xltx;application/vnd.openxmlformats-officedocument.spreadsheetml.template +xlv;application/x-excel +xlw;application/vnd.ms-excel +xm;audio/x-xm +xmf;audio/x-xmf +xmi;text/x-xmi +xml;application/xml +xmt_bin;model/vnd.parasolid.transmit.binary +xmt_txt;model/vnd.parasolid.transmit.text +xmz;x-xgl/x-movie +xo;application/vnd.olpc-sugar +xop;application/xop+xml +xpdl;application/xml +xpi;application/x-xpinstall +xpix;application/x-vnd.ls-xpix +xpl;application/x-xproc+xml +xpm;image/x-xpixmap +xpr;application/vnd.is-xpr +xps;application/vnd.ms-xpsdocument +xpw;application/vnd.intercon.formnet +xpx;application/vnd.intercon.formnet +xsd;application/xml +xsl;application/xml +xslfo;text/x-xslfo +xslt;application/xslt+xml +xsm;application/vnd.syncml+xml +xspf;application/x-xspf+xml +xsr;video/x-amt-showrun +xtel;x-chemical/x-xtel +xul;application/vnd.mozilla.xul+xml +xvm;application/xv+xml +xvml;application/xv+xml +xwd;image/x-xwindowdump +xyz;x-chemical/x-xyz +xz;application/x-xz +yaml;application/x-yaml +yang;application/yang +yin;application/yin+xml +yml;application/x-yaml +z1;application/x-zmachine +z2;application/x-zmachine +z3;application/x-zmachine +z4;application/x-zmachine +z5;application/x-zmachine +z64;application/x-n64-rom +z6;application/x-zmachine +z7;application/x-zmachine +z8;application/x-zmachine +z;application/x-compress +zabw;application/x-abiword +zaz;application/vnd.zzazz.deck+xml +zip;application/zip +zir;application/vnd.zul +zirz;application/vnd.zul +zmm;application/vnd.handheld-entertainment+xml +zmt;x-chemical/x-mopac-input +zoo;application/x-zoo +zsav;application/x-spss-sav +zsh;text/x-script.zsh +zz;application/zlib +~;application/x-trash + +134:application:: +x-3gpdash-qoe-report+xml;; +x-a2l;; +x-access;; +x-alto-costmap+json;; +x-alto-costmapfilter+json;; +x-alto-directory+json;; +x-alto-endpointcost+json;; +x-alto-endpointcostparams+json;; +x-alto-endpointprop+json;; +x-alto-endpointpropparams+json;; +x-alto-error+json;; +x-alto-networkmap+json;; +x-alto-networkmapfilter+json;; +x-amf;; +x-aml;; +x-appledouble;;base64 +x-arc;; +x-atf;; +x-atfx;; +x-atxml;; +x-auth-policy+xml;; +x-bacnet-xdd+zip;; +x-bzdvi;; +x-bzpdf;; +x-bzpostscript;; +x-calendar+json;; +x-cdfx+xml;; +x-cdni;; +x-cea;; +x-cellml+xml;; +x-class-file;; +x-cms;; +x-coap-group+json;; +x-core;; +x-cpio-compressed;; +x-csvm+json;; +x-dcd;; +x-dii;; +x-dit;; +x-efi;; +x-emergencycalldata.comment+xml;; +x-emergencycalldata.deviceinfo+xml;; +x-emergencycalldata.providerinfo+xml;; +x-emergencycalldata.serviceinfo+xml;; +x-emergencycalldata.subscriberinfo+xml;; +x-example;; +x-executable;; +x-font-dos;; +x-font-framemaker;; +x-font-libgrx;; +x-font-sunos-news;; +x-font-tex-tfm;; +x-font-tex;; +x-font-vfont;; +x-gdbm;; +x-geo+json;; +x-ghostview;; +x-gtktalog;; +x-gunzip;; +x-gz-font-linux-psf;; +x-gzdvi;; +x-gzpdf;; +x-gzpostscript;; +x-ideas;; +x-iff;; +x-ipod-firmware;; +x-java-applet;; +x-java-bean;; +x-jose+json;; +x-jose;; +x-json-seq;; +x-jwk+json;; +x-jwk-set+json;; +x-jwt;; +x-kdelnk;; +x-kspread-crypt;; +x-ksysv-package;; +x-kword-crypt;; +x-lgr+xml;; +x-load-control+xml;; +x-lotus-123;; +x-lxf;; +x-matroska;; +x-mbms-associated-procedure-description+xml;; +x-mbms-deregister+xml;; +x-mbms-envelope+xml;; +x-mbms-msk+xml;; +x-mbms-msk-response+xml;; +x-mbms-protection-description+xml;; +x-mbms-reception-report+xml;; +x-mbms-register+xml;; +x-mbms-register-response+xml;; +x-mbms-schedule+xml;; +x-mbms-user-service-description+xml;; +x-merge-patch+json;; +x-mf4;; +x-mozilla-bookmarks;; +x-ms-tnef;; +x-nautilus-link;; +x-news-message-id;; +x-odx;; +x-ole-storage;; +x-pdx;; +x-pef-executable;; +x-ppsp-tracker+json;; +x-problem+json;; +x-problem+xml;; +x-profile;; +x-qsig;; +x-raw-disk-image-xz-compressed;; +x-rdap+json;; +x-remote_printing;; +x-rfc+xml;; +x-riff;; +x-rx;; +x-sc;; +x-scaip+xml;; +x-scim+json;; +x-simple-message-summary;; +x-slp;; +x-sqlite2;; +x-sqlite3;; +x-toutdoux;; +x-troff-man-compressed;; +x-ttml+xml;; +x-videolan;; +x-vividence.scriptfile;; +x-word;;base64 +x-www-form-urlencoded;; +x-x400-bp;; +x-xml-patch+xml;; +x-xzpdf;; +x-zerosize;; +x-zip-compressed-fb2;; + +464:application::E +x-123;wk,wk1; +x-7z-compressed;7z; +x-abiword;abw,zabw; +x-acad;dwg; +x-ace-compressed;ace; +x-ace;ace; +x-aim;aim; +x-alz;alz; +x-amipro;sam; +x-annodex;anx; +x-aportisdoc;pdb,pdc; +x-apple-diskimage;dmg; +x-applix-spreadsheet;as; +x-applix-word;aw; +x-applixware;aw; +x-archive;a,ar; +x-arj;arj; +x-asp;asp; +x-atomserv+xml;atomsrv; +x-authorware-bin;aab,x32,u32,vox; +x-authorware-map;aam; +x-authorware-seg;aas; +x-awk;awk; +x-base64;mm,mme; +x-bbolin;lin; +x-bcpio;bcpio; +x-binary;bin; +x-binhex40;hqx; +x-binhex4;hqx; +x-binhex;hqx; +x-bittorrent;torrent; +x-bleeper;bleep;base64 +x-blender;blender,blend,BLEND; +x-blorb;blb,blorb; +x-book;boo,book; +x-bsh;bsh,sh,shar; +x-bytecode.elisp;elc; +x-bytecode.python;pyc; +x-bzip-compressed-tar;tbz2,tbz,tb2; +x-bzip2;bz2,boz; +x-bzip;bz,bz2; +x-cab;cab; +x-cap;cap,pcap; +x-cb7;cb7; +x-cbr;cbr,cba,cbt,cbz,cb7; +x-cbt;cbt; +x-cbz;cbz; +x-ccmx;ccmx; +x-cd-image;iso,iso9660; +x-cdf;cdf,cda; +x-cdlink;vcd; +x-cdrdao-toc;toc; +x-cfs-compressed;cfs; +x-chat;chat,cha; +x-chess-pgn;pgn; +x-chrome-extension;crx; +x-cisco-vpn-settings;pcf; +x-clariscad;ccad; +x-cmu-raster;ras; +x-cocoa;cco; +x-compactpro;cpt; +x-compress;z,Z;base64 +x-compressed-tar;tgz; +x-compressed;gz,tgz,z,zip; +x-conference;nsc; +x-cpio;cpio;base64 +x-cpt;cpt; +x-csh;csh;8bit +x-cu-seeme;cu,csm; +x-cue;cue; +x-dar;dar; +x-davmount+xml;davmount; +x-dbf;dbf; +x-dc-rom;dc; +x-debian-package;deb,udeb; +x-deepv;deepv; +x-designer;ui; +x-desktop;desktop,kdelnk; +x-dgc-compressed;dgc; +x-dia-diagram;dia; +x-dia-shape;shape; +x-director;dcr,dir,dxr,cst,cct,cxt,w3d,fgd,swa; +x-dms;dms; +x-docbook+xml;dbk,docbook; +x-doom;wad; +x-drafting;drw; +x-dsptype;tsp; +x-dtbncx+xml;ncx; +x-dtbook+xml;dtb; +x-dtbresource+xml;res; +x-dvi;dvi;base64 +x-dxf;dxf; +x-e-theme;etheme; +x-egon;egon; +x-elc;elc; +x-envoy;evy,env; +x-epub+zip;epub; +x-esrehber;es; +x-eva;eva; +x-excel;xl,xla,xlb,xlc,xld,xlk,xll,xlm,xls,xlt,xlv,xlw; +x-fictionbook+xml;fb2; +x-fluid;fl; +x-font-afm;afm; +x-font-bdf;bdf; +x-font-ghostscript;gsf; +x-font-linux-psf;psf; +x-font-otf;otf; +x-font-pcf;pcf; +x-font-snf;snf; +x-font-speedo;spd; +x-font-ttf;ttc,ttf; +x-font-ttx;ttx; +x-font-type1;pfa,pfb,pfm,afm,gsf; +x-font;pfa,pfb,gsf,pcf,pcf.z; +x-fractals;fif; +x-frame;mif; +x-freearc;arc; +x-freelance;pre; +x-freeloader;frl; +x-freemind;mm; +x-futuresplash;spl; +x-gameboy-rom;gb,gbc,cgb,sgb; +x-gamecube-rom;iso; +x-gba-rom;gba,agb; +x-gca-compressed;gca; +x-gedcom;ged,gedcom; +x-genesis-rom;gen,smd,32x,mdx; +x-gettext-translation;gmo,mo; +x-glade;glade; +x-glulx;ulx; +x-gml+xml;gml; +x-gnucash;gnucash,gnc,xac; +x-gnumeric;gnumeric; +x-gnunet-directory;gnd; +x-gnuplot;gp,gplt,gnuplot; +x-gnutar;tgz; +x-go-sgf;sgf; +x-gpx+xml;gpx; +x-gramps-xml;gramps; +x-graphing-calculator;gcf; +x-graphite;gra; +x-groupwise;vew; +x-gsp;gsp; +x-gss;gss; +x-gtar;gtar,tgz,tbz2,tbz,taz;base64 +x-gtk-builder;ui; +x-gxf;gxf; +x-gzip;gz,gzip,tgz;base64 +x-hdf;hdf,hdf4,h4,hdf5,h5; +x-helpfile;help,hlp; +x-hep;hep; +x-hlp;hlp; +x-hta;hta; +x-html+ruby;rhtml;8bit +x-httpd-eruby;rhtml; +x-httpd-imap;imap; +x-httpd-php-source;phps; +x-httpd-php3-preprocessed;php3p; +x-httpd-php3;php3; +x-httpd-php4;php4; +x-httpd-php5;php5; +x-httpd-php;phtml,pht,php;8bit +x-hwp;hwp; +x-hwt;hwt; +x-i-deas;unv; +x-ica;ica; +x-illustrator;ai; +x-ima;ima; +x-imagemap;imagemap,imap;8bit +x-inf;inf; +x-info;info; +x-install-instructions;install; +x-internet-signup;ins,isp; +x-internett-signup;ins; +x-inventor;iv; +x-ip2;ip; +x-iphone;iii; +x-iso9660-image;iso; +x-it87;it87; +x-iwork-keynote-sffkey;key; +x-jam;jam; +x-java-archive;jar; +x-java-byte-code;class; +x-java-class;class; +x-java-commerce;jcm; +x-java-jce-keystore;jceks; +x-java-jnlp-file;jnlp; +x-java-keystore;jks,ks; +x-java-pack200;pack; +x-java-serialized-object;ser; +x-java-vm;class; +x-java;class; +x-javascript;js; +x-jbuilder-project;jpr,jpx; +x-jmol;jmz; +x-jrd+json;jrd; +x-jsonml+json;jsonml; +x-karbon;karbon; +x-kchart;chrt; +x-kexi-connectiondata;kexic; +x-kexiproject-shortcut;kexis; +x-kexiproject-sqlite2;kexi; +x-kexiproject-sqlite3;kexi; +x-kformula;kfo; +x-killustrator;kil; +x-kivio;flw; +x-koan;skp,skd,skt,skm; +x-kontour;kon; +x-kpovmodeler;kpm; +x-kpresenter;kpr,kpt; +x-krita;kra; +x-ksh;ksh; +x-kspread;ksp; +x-kugar;kud; +x-kword;kwd,kwt; +x-latex;latex,ltx;8bit +x-lha;lha,lzh; +x-lhz;lhz; +x-lisp;lsp; +x-livescreen;ivy; +x-lotus;wq1; +x-lotusscreencam;scm; +x-lrzip-compressed-tar;tlrz; +x-lrzip;lrz; +x-lua-bytecode;luac; +x-lyx;lyx; +x-lz4;lz4; +x-lzh-compressed;lzh,lha; +x-lzh;lzh; +x-lzip;lz; +x-lzma-compressed-tar;tlz; +x-lzma;lzma; +x-lzop;lzo; +x-lzx;lzx; +x-m3g;m3g; +x-m4;m4; +x-mac-binary;bin; +x-mac-binhex40;hqx; +x-mac-binhex;hqx; +x-mac-compactpro;cpt; +x-macbinary;bin; +x-magic-cap-package-1.0;mc$; +x-magicpoint;mgp; +x-maker;frm,maker,frame,fm,fb,book,fbdoc; +x-markaby;mab; +x-mathcad;#,mcd;mcd, +x-mbedlet;mbd; +x-mcad;mcd; +x-meme;mm; +x-metalink+xml;metalink; +x-midi;mid,midi; +x-mie;mie; +x-mif;mif; +x-mime;aps; +x-mimearchive;mhtml,mht; +x-mix-transfer;nix; +x-mobipocket-ebook;prc,mobi; +x-mplayer2;asx; +x-ms-application;application; +x-ms-dos-executable;exe; +x-ms-shortcut;lnk; +x-ms-wim;wim,swm; +x-ms-wmd;wmd; +x-ms-wmz;wmz; +x-ms-xbap;xbap; +x-msaccess;mdb,mda,mde,mdf;base64 +x-msbinder;obd; +x-mscardfile;crd; +x-msclip;clp; +x-msdos-program;com,exe,bat,dll;base64 +x-msdownload;exe,dll,com,bat,msi;base64 +x-msexcel;xla,xls,xlw; +x-msi;msi; +x-msmediaview;mvb,m13,m14; +x-msmetafile;wmf,wmz,emf,emz; +x-msmoney;mny; +x-mspowerpoint;pot,pps,ppt,ppz; +x-mspublisher;pub; +x-msschedule;scd; +x-msterminal;trm; +x-mswinurl;url; +x-msword-template;dot; +x-msword;doc,dot,wrd;base64 +x-mswrite;wri; +x-msx-rom;msx; +x-n64-rom;n64,z64,v64; +x-navi-animation;ani; +x-navidoc;nvd; +x-navimap;map; +x-navistyle;stl; +x-nes-rom;nes,nez,unf,unif; +x-netcdf;nc,cdf; +x-netmc;mcp; +x-netshow-channel;nsc; +x-newton-compatible-pkg;pkg; +x-nintendo-ds-rom;nds; +x-nokia-9000-communicator-add-on-software;aos; +x-ns-proxy-autoconfig;pac,dat; +x-nwc;nwc; +x-nzb;nzb; +x-object;o; +x-oebps-package+xml;opf; +x-oleo;oleo; +x-omc;omc; +x-omcdatamaker;omcd; +x-omcregerator;omcr; +x-omdoc+xml;omdoc; +x-onenote;onetoc,onetoc2,onetmp,onepkg; +x-owl+xml;owx; +x-oz-application;oza; +x-pagemaker;pm5,pt5,pm,pm4,p65,pm6,pmd; +x-pak;pak; +x-par2;PAR2,par2; +x-partial-download;wkdownload,crdownload,part; +x-pc-engine-rom;pce; +x-pcl;pcl; +x-perl;pl,pm,PL,al,perl,pod,t;8bit +x-pgp;pgp; +x-php;php,php3,php4,php5,phps; +x-pics-rules;prf; +x-pixclscript;plx; +x-pkcs-12;p12; +x-pkcs-crl;crl; +x-pkcs10;p10; +x-pkcs12;p12,pfx; +x-pkcs7-certificates;p7b,spc; +x-pkcs7-certreqresp;p7r; +x-pkcs7-crl;crl; +x-pkcs7-mime;p7c,p7m; +x-pkcs7-signature;p7a; +x-pkix-pkipath;pkipath; +x-plain;text; +x-planperfect;pln; +x-pocket-word;psw; +x-pointplus;css; +x-portable-anymap;pnm; +x-powerpoint;ppt; +x-pro_eng;part,prt; +x-project;mpc,mpt,mpv,mpx; +x-pw;pw; +x-python-bytecode;pyc,pyo; +x-python-code;pyc,pyo; +x-python;py;8bit +x-qgis;qgs,shp,shx; +x-qpress;qp; +x-qpro;wb1; +x-qtiplot;qti; +x-quattropro;wb1,wb2,wb3; +x-quicktime-media-link;qtl; +x-quicktimeplayer;qtl; +x-qw;qif; +x-ram;ram; +x-rar-compressed;rar;base64 +x-rar;rar; +x-raw-disk-image;raw-disk-image,img; +x-redhat-package-manager;rpm; +x-research-info-systems;ris; +x-ringing-tones;rng; +x-rpm;rpm; +x-rsd+xml;rsd; +x-rss+xml;rss; +x-rtf;rtf; +x-ruby;rb,rbw;8bit +x-sami;smi,sami; +x-sdp;sdp; +x-sea;sea; +x-seelogo;sl; +x-set;set; +x-sh;sh;8bit +x-shar;shar,sh;8bit +x-shared-library-la;la; +x-sharedlib;so; +x-shellscript;sh; +x-shockwave-flash;swf,swfl; +x-shorten;shn; +x-siag;siag; +x-silverlight-app;xap; +x-silverlight;scr; +x-sit;sit; +x-sla;stl; +x-smaf;mmf,smaf; +x-sms-rom;sms,gg,sg; +x-solids;sol; +x-sounder;sdr; +x-source-rpm;spm; +x-sprite;spr,sprite; +x-spss-por;por; +x-spss-sav;sav,zsav; +x-spss;sav,sbs,sps,spo,spp; +x-sql;sql; +x-ssdl+xml;ssdl; +x-step;step,stp; +x-streamingmedia;ssm; +x-stuffit;sit,sitx;base64 +x-stuffitx;sitx; +x-subrip;srt; +x-sv4cpio;sv4cpio;base64 +x-sv4crc;sv4crc;base64 +x-t3vm-image;t3; +x-t602;602; +x-tads;gam; +x-tar;tar,gtar,gem;base64 +x-tarz;taz; +x-tbook;sbk,tbk; +x-tcl;tcl;8bit +x-tex-gf;gf; +x-tex-pk;pk; +x-tex-tfm;tfm; +x-tex;tex;8bit +x-texinfo;texinfo,texi;8bit +x-tgif;obj; +x-theme;theme; +x-toolbook;tbk; +x-trash;~,%,bak,old,sik; +x-trig;trig; +x-troff-man;man;8bit +x-troff-me;me; +x-troff-ms;ms; +x-troff-msvideo;avi; +x-troff;t,tr,roff;8bit +x-tzo;tzo; +x-ufraw;ufraw; +x-ustar;ustar;base64 +x-vda;vda; +x-visio;vsd,vst,vsw; +x-vmsbackup;bck;base64 +x-vnd.audioexplosion.mzz;mzz; +x-vnd.ls-xpix;xpix; +x-vocaltec-media-desc;vmd; +x-vocaltec-media-file;vmf; +x-vrml;vrml; +x-wais-source;src,wsrc; +x-web-app-manifest+json;webapp; +x-wii-rom;iso; +x-windows-themepack;themepack; +x-wingz;wz; +x-winhelp;hlp; +x-winhlp;hlp; +x-wintalk;wtk; +x-wordperfect6.0;w60,wp5; +x-wordperfect6.1;wp6,w61; +x-wordperfect;wp,wp5,wp6,wpd; +x-world;svr,wrl; +x-wpg;wpg; +x-wpwin;wpd; +x-wri;wri; +x-wwf;wwf; +x-x509-ca-cert;crt,der,cer,cert,pem;base64 +x-x509-user-cert;crt; +x-xaml+xml;xaml; +x-xbel;xbel; +x-xcf;xcf; +x-xfig;fig; +x-xliff+xml;xlf; +x-xliff;xlf,xliff; +x-xpinstall;xpi; +x-xproc+xml;xpl; +x-xspf+xml;xspf; +x-xz-compressed-tar;txz; +x-xz;xz; +x-yaml;yaml,yml; +x-zip-compressed;zip; +x-zmachine;z1,z2,z3,z4,z5,z6,z7,z8; +x-zoo;zoo; + +639:application:I: +1d-interleaved-parityfec;; +3gpp-ims+xml;; +activemessage;; +applefile;;base64 +atomdeleted+xml;; +atomicmail;; +batch-smtp;; +beep+xml;; +calendar+xml;; +call-completion;; +cals-1840;; +cbor;; +ccmp+xml;; +cea-2018+xml;; +cfw;; +cnrp+xml;; +conference-info+xml;; +cpl+xml;; +csrattrs;; +csta+xml;; +cstadata+xml;; +cybercash;; +dashdelta;; +dca-rft;; +dec-dx;; +dialog-info+xml;; +dns;; +dskpp+xml;; +dvcs;; +edi-consent;; +edi-x12;; +edifact;; +emotionml+xml;; +encaprtp;; +epp+xml;; +eshop;; +fastinfoset;; +fastsoap;; +fdt+xml;; +fits;; +font-sfnt;; +framework-attributes+xml;; +h224;; +held+xml;; +http;; +ibe-key-request+xml;; +ibe-pkg-reply+xml;; +ibe-pp-data;; +im-iscomposing+xml;; +index.cmd;; +index.obj;; +index.response;; +index.vnd;; +index;; +iotp;; +ipp;; +isup;; +its+xml;; +kpml-request+xml;; +kpml-response+xml;; +link-format;; +lostsync+xml;; +macwriteii;; +mathml-content+xml;; +mathml-presentation+xml;; +media-policy-dataset+xml;; +media_control+xml;; +mikey;; +moss-keys;; +moss-signature;; +mosskey-data;; +mosskey-request;; +mpeg4-generic;; +mpeg4-iod-xmt;; +mpeg4-iod;; +mrb-consumer+xml;; +mrb-publish+xml;; +msc-ivr+xml;; +msc-mixer+xml;; +nasdata;; +news-checkgroups;; +news-groupinfo;; +news-transmission;; +nlsml+xml;; +nss;; +p2p-overlay+xml;; +parityfec;; +pidf+xml;; +pidf-diff+xml;; +poc-settings+xml;; +provenance+xml;; +prs.alvestrand.titrax-sheet;; +prs.hpub+zip;; +prs.plucker;; +prs.rdf-xml-crypt;; +prs.xsf+xml;; +raptorfec;; +remote-printing;; +reputon+json;; +riscos;; +rlmi+xml;; +rpki-updown;; +rtploopback;; +rtx;; +samlassertion+xml;; +samlmetadata+xml;; +sep+xml;; +sep-exi;; +session-info;; +set-payment;; +set-registration;; +sgml;; +simple-filter+xml;; +simplesymbolcontainer;; +slate;; +smpte336m;; +soap+fastinfoset;; +soap+xml;; +spirits-event+xml;; +tamp-apex-update-confirm;; +tamp-apex-update;; +tamp-community-update-confirm;; +tamp-community-update;; +tamp-error;; +tamp-sequence-adjust-confirm;; +tamp-sequence-adjust;; +tamp-status-query;; +tamp-status-response;; +tamp-update-confirm;; +tamp-update;; +timestamp-query;; +timestamp-reply;; +tve-trigger;; +ulpfec;; +urc-grpsheet+xml;; +urc-ressheet+xml;; +urc-targetdesc+xml;; +urc-uisocketdesc+xml;; +vcard+json;; +vcard+xml;; +vemmi;; +vnd.3gpp-prose+xml;; +vnd.3gpp-prose-pc3ch+xml;; +vnd.3gpp.access-transfer-events+xml;; +vnd.3gpp.bsf+xml;; +vnd.3gpp.mid-call+xml;; +vnd.3gpp.sms+xml;; +vnd.3gpp.srvcc-ext+xml;; +vnd.3gpp.srvcc-info+xml;; +vnd.3gpp.state-and-event-info+xml;; +vnd.3gpp.ussd+xml;; +vnd.3gpp2.bcmcsinfo+xml;; +vnd.3gpp2.sms;; +vnd.3lightssoftware.imagescal;; +vnd.adobe.partial-upload;; +vnd.aether.imp;; +vnd.ah-barcode;; +vnd.amazon.mobi8-ebook;; +vnd.amundsen.maze+xml;; +vnd.anki;; +vnd.apache.thrift.binary;; +vnd.apache.thrift.compact;; +vnd.apache.thrift.json;; +vnd.api+json;; +vnd.artsquare;; +vnd.autopackage;; +vnd.avistar+xml;; +vnd.balsamiq.bmml+xml;; +vnd.balsamiq.bmpr;; +vnd.bekitzur-stech+json;; +vnd.biopax.rdf+xml;; +vnd.bluetooth.ep.oob;; +vnd.bluetooth.le.oob;; +vnd.cab-jscript;; +vnd.canon-cpdl;; +vnd.canon-lips;; +vnd.cendio.thinlinc.clientconf;; +vnd.century-systems.tcp_stream;; +vnd.chess-pgn;; +vnd.cirpack.isdn-ext;; +vnd.citationstyles.style+xml;; +vnd.collection+json;; +vnd.collection.doc+json;; +vnd.collection.next+json;; +vnd.comicbook+zip;; +vnd.commerce-battelle;; +vnd.comsocaller;; +vnd.coreos.ignition+json;; +vnd.ctct.ws+xml;; +vnd.cups-pdf;; +vnd.cups-postscript;; +vnd.cups-raster;; +vnd.cups-raw;; +vnd.cyan.dean.root+xml;; +vnd.cybank;; +vnd.desmume.movie;; +vnd.dir-bi.plate-dl-nosuffix;; +vnd.dm.delegation+xml;; +vnd.document+json;; +vnd.dolby.mobile.1;; +vnd.dolby.mobile.2;; +vnd.doremir.scorecloud-binary-document;; +vnd.drive+json;; +vnd.dtg.local.flash;; +vnd.dtg.local.html;; +vnd.dtg.local;; +vnd.dvb.dvbj;; +vnd.dvb.esgcontainer;; +vnd.dvb.ipdcdftnotifaccess;; +vnd.dvb.ipdcesgaccess2;; +vnd.dvb.ipdcesgaccess;; +vnd.dvb.ipdcesgpdd;; +vnd.dvb.ipdcroaming;; +vnd.dvb.iptv.alfec-base;; +vnd.dvb.iptv.alfec-enhancement;; +vnd.dvb.notif-aggregate-root+xml;; +vnd.dvb.notif-container+xml;; +vnd.dvb.notif-generic+xml;; +vnd.dvb.notif-ia-msglist+xml;; +vnd.dvb.notif-ia-registration-request+xml;; +vnd.dvb.notif-ia-registration-response+xml;; +vnd.dvb.notif-init+xml;; +vnd.dvb.pfr;; +vnd.dxr;; +vnd.dzr;; +vnd.easykaraoke.cdgdownload;; +vnd.ecdis-update;; +vnd.ecowin.filerequest;; +vnd.ecowin.fileupdate;; +vnd.ecowin.series;; +vnd.ecowin.seriesrequest;; +vnd.ecowin.seriesupdate;; +vnd.emclient.accessrequest+xml;; +vnd.enphase.envoy;; +vnd.eprints.data+xml;; +vnd.ericsson.quickcall;; +vnd.etsi.aoc+xml;; +vnd.etsi.asic-e+zip;; +vnd.etsi.asic-s+zip;; +vnd.etsi.cug+xml;; +vnd.etsi.iptvcommand+xml;; +vnd.etsi.iptvdiscovery+xml;; +vnd.etsi.iptvprofile+xml;; +vnd.etsi.iptvsad-bc+xml;; +vnd.etsi.iptvsad-cod+xml;; +vnd.etsi.iptvsad-npvr+xml;; +vnd.etsi.iptvservice+xml;; +vnd.etsi.iptvsync+xml;; +vnd.etsi.iptvueprofile+xml;; +vnd.etsi.mcid+xml;; +vnd.etsi.mheg5;; +vnd.etsi.overload-control-policy-dataset+xml;; +vnd.etsi.pstn+xml;; +vnd.etsi.sci+xml;; +vnd.etsi.simservs+xml;; +vnd.etsi.timestamp-token;; +vnd.etsi.tsl+xml;; +vnd.etsi.tsl.der;; +vnd.eudora.data;; +vnd.f-secure.mobile;; +vnd.fastcopy-disk-image;; +vnd.ffsns;; +vnd.filmit.zfc;; +vnd.fints;; +vnd.firemonkeys.cloudcell;; +vnd.font-fontforge-sfd;; +vnd.fujixerox.art-ex;; +vnd.fujixerox.art4;; +vnd.fujixerox.docuworks.container;; +vnd.fujixerox.hbpl;; +vnd.fut-misnet;; +vnd.geo+json;; +vnd.geocube+xml;; +vnd.gerber;; +vnd.globalplatform.card-content-mgt-response;; +vnd.globalplatform.card-content-mgt;; +vnd.gov.sk.e-form+xml;; +vnd.gov.sk.e-form+zip;; +vnd.gov.sk.xmldatacontainer+xml;; +vnd.gridmp;; +vnd.hal+json;; +vnd.hcl-bireports;; +vnd.hdt;; +vnd.heroku+json;; +vnd.httphone;; +vnd.hyperdrive+json;; +vnd.ibm.afplinedata;; +vnd.ieee.1905;; +vnd.ims.imsccv1p1;; +vnd.ims.imsccv1p2;; +vnd.ims.imsccv1p3;; +vnd.ims.lis.v2.result+json;; +vnd.ims.lti.v2.toolconsumerprofile+json;; +vnd.ims.lti.v2.toolproxy+json;; +vnd.ims.lti.v2.toolproxy.id+json;; +vnd.ims.lti.v2.toolsettings+json;; +vnd.ims.lti.v2.toolsettings.simple+json;; +vnd.informedcontrol.rms+xml;; +vnd.informix-visionary;; +vnd.infotech.project+xml;; +vnd.infotech.project;; +vnd.innopath.wamp.notification;; +vnd.intertrust.digibox;; +vnd.intertrust.nncp;; +vnd.iptc.g2.catalogitem+xml;; +vnd.iptc.g2.conceptitem+xml;; +vnd.iptc.g2.knowledgeitem+xml;; +vnd.iptc.g2.newsitem+xml;; +vnd.iptc.g2.newsmessage+xml;; +vnd.iptc.g2.packageitem+xml;; +vnd.iptc.g2.planningitem+xml;; +vnd.japannet-directory-service;; +vnd.japannet-jpnstore-wakeup;; +vnd.japannet-payment-wakeup;; +vnd.japannet-registration-wakeup;; +vnd.japannet-registration;; +vnd.japannet-setstore-wakeup;; +vnd.japannet-verification-wakeup;; +vnd.japannet-verification;; +vnd.jsk.isdn-ngn;; +vnd.liberty-request+xml;; +vnd.mapbox-vector-tile;; +vnd.marlin.drm.actiontoken+xml;; +vnd.marlin.drm.conftoken+xml;; +vnd.marlin.drm.license+xml;; +vnd.marlin.drm.mdcf;; +vnd.mason+json;; +vnd.maxmind.maxmind-db;; +vnd.meridian-slingshot;; +vnd.micro+json;; +vnd.microsoft.portable-executable;; +vnd.miele+json;; +vnd.minisoft-hp3000-save;; +vnd.mitsubishi.misty-guard.trustweb;; +vnd.motorola.flexsuite.adsi;; +vnd.motorola.flexsuite.fis;; +vnd.motorola.flexsuite.gotap;; +vnd.motorola.flexsuite.kmr;; +vnd.motorola.flexsuite.ttc;; +vnd.motorola.flexsuite.wem;; +vnd.motorola.flexsuite;; +vnd.motorola.iprm;; +vnd.ms-3mfdocument;; +vnd.ms-color.iccprofile;; +vnd.ms-office.activex+xml;; +vnd.ms-opentype;; +vnd.ms-package.obfuscated-opentype;; +vnd.ms-playready.initiator+xml;; +vnd.ms-printdevicecapabilities+xml;; +vnd.ms-printing.printticket+xml;; +vnd.ms-printschematicket+xml;; +vnd.ms-windows.devicepairing;; +vnd.ms-windows.nwprinting.oob;; +vnd.ms-windows.printerpairing;; +vnd.ms-windows.wsd.oob;; +vnd.ms-wmdrm.lic-chlg-req;; +vnd.ms-wmdrm.lic-resp;; +vnd.ms-wmdrm.meter-chlg-req;; +vnd.ms-wmdrm.meter-resp;; +vnd.msa-disk-image;; +vnd.msign;; +vnd.multiad.creator.cif;; +vnd.multiad.creator;; +vnd.music-niff;; +vnd.ncd.control;; +vnd.ncd.reference;; +vnd.netfpx;; +vnd.nintendo.nitro.rom;; +vnd.nokia.catalogs;; +vnd.nokia.conml+wbxml;; +vnd.nokia.conml+xml;; +vnd.nokia.iptv.config+xml;; +vnd.nokia.isds-radio-presets;; +vnd.nokia.landmark+wbxml;; +vnd.nokia.landmark+xml;; +vnd.nokia.landmarkcollection+xml;; +vnd.nokia.n-gage.ac+xml;; +vnd.nokia.ncd;; +vnd.nokia.pcd+wbxml;; +vnd.nokia.pcd+xml;; +vnd.ntt-local.content-share;; +vnd.ntt-local.file-transfer;; +vnd.ntt-local.ogw_remote-access;; +vnd.ntt-local.sip-ta_remote;; +vnd.ntt-local.sip-ta_tcp_stream;; +vnd.obn;; +vnd.oftn.l10n+json;; +vnd.oipf.contentaccessdownload+xml;; +vnd.oipf.contentaccessstreaming+xml;; +vnd.oipf.cspg-hexbinary;; +vnd.oipf.dae.svg+xml;; +vnd.oipf.dae.xhtml+xml;; +vnd.oipf.mippvcontrolmessage+xml;; +vnd.oipf.pae.gem;; +vnd.oipf.spdiscovery+xml;; +vnd.oipf.spdlist+xml;; +vnd.oipf.ueprofile+xml;; +vnd.oipf.userprofile+xml;; +vnd.oma-scws-config;; +vnd.oma-scws-http-request;; +vnd.oma-scws-http-response;; +vnd.oma.bcast.associated-procedure-parameter+xml;; +vnd.oma.bcast.drm-trigger+xml;; +vnd.oma.bcast.imd+xml;; +vnd.oma.bcast.ltkm;; +vnd.oma.bcast.notification+xml;; +vnd.oma.bcast.provisioningtrigger;; +vnd.oma.bcast.sgboot;; +vnd.oma.bcast.sgdd+xml;; +vnd.oma.bcast.sgdu;; +vnd.oma.bcast.simple-symbol-container;; +vnd.oma.bcast.smartcard-trigger+xml;; +vnd.oma.bcast.sprov+xml;; +vnd.oma.bcast.stkm;; +vnd.oma.cab-address-book+xml;; +vnd.oma.cab-feature-handler+xml;; +vnd.oma.cab-pcc+xml;; +vnd.oma.cab-subs-invite+xml;; +vnd.oma.cab-user-prefs+xml;; +vnd.oma.dcd;; +vnd.oma.dcdc;; +vnd.oma.drm.risd+xml;; +vnd.oma.group-usage-list+xml;; +vnd.oma.lwm2m+json;; +vnd.oma.lwm2m+tlv;; +vnd.oma.pal+xml;; +vnd.oma.poc.detailed-progress-report+xml;; +vnd.oma.poc.final-report+xml;; +vnd.oma.poc.groups+xml;; +vnd.oma.poc.invocation-descriptor+xml;; +vnd.oma.poc.optimized-progress-report+xml;; +vnd.oma.push;; +vnd.oma.scidm.messages+xml;; +vnd.oma.xcap-directory+xml;; +vnd.omads-email+xml;; +vnd.omads-file+xml;; +vnd.omads-folder+xml;; +vnd.omaloc-supl-init;; +vnd.onepager;; +vnd.openblox.game+xml;; +vnd.openblox.game-binary;; +vnd.openeye.oeb;; +vnd.openxmlformats-officedocument.custom-properties+xml;; +vnd.openxmlformats-officedocument.customxmlproperties+xml;; +vnd.openxmlformats-officedocument.drawing+xml;; +vnd.openxmlformats-officedocument.drawingml.chart+xml;; +vnd.openxmlformats-officedocument.drawingml.chartshapes+xml;; +vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml;; +vnd.openxmlformats-officedocument.drawingml.diagramdata+xml;; +vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml;; +vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml;; +vnd.openxmlformats-officedocument.extended-properties+xml;; +vnd.openxmlformats-officedocument.presentationml.commentauthors+xml;; +vnd.openxmlformats-officedocument.presentationml.comments+xml;; +vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml;; +vnd.openxmlformats-officedocument.presentationml.notesmaster+xml;; +vnd.openxmlformats-officedocument.presentationml.notesslide+xml;; +vnd.openxmlformats-officedocument.presentationml.presentation.main+xml;; +vnd.openxmlformats-officedocument.presentationml.presprops+xml;; +vnd.openxmlformats-officedocument.presentationml.slide+xml;; +vnd.openxmlformats-officedocument.presentationml.slidelayout+xml;; +vnd.openxmlformats-officedocument.presentationml.slidemaster+xml;; +vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml;; +vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml;; +vnd.openxmlformats-officedocument.presentationml.tablestyles+xml;; +vnd.openxmlformats-officedocument.presentationml.tags+xml;; +vnd.openxmlformats-officedocument.presentationml.template.main+xml;; +vnd.openxmlformats-officedocument.presentationml.viewprops+xml;; +vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml;; +vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml;; +vnd.openxmlformats-officedocument.spreadsheetml.comments+xml;; +vnd.openxmlformats-officedocument.spreadsheetml.connections+xml;; +vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml;; +vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml;; +vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml;; +vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml;; +vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml;; +vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml;; +vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml;; +vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml;; +vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml;; +vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml;; +vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml;; +vnd.openxmlformats-officedocument.spreadsheetml.styles+xml;; +vnd.openxmlformats-officedocument.spreadsheetml.table+xml;; +vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml;; +vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml;; +vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml;; +vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml;; +vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml;; +vnd.openxmlformats-officedocument.theme+xml;; +vnd.openxmlformats-officedocument.themeoverride+xml;; +vnd.openxmlformats-officedocument.vmldrawing;; +vnd.openxmlformats-officedocument.wordprocessingml.comments+xml;; +vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml;; +vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml;; +vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml;; +vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml;; +vnd.openxmlformats-officedocument.wordprocessingml.footer+xml;; +vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml;; +vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml;; +vnd.openxmlformats-officedocument.wordprocessingml.settings+xml;; +vnd.openxmlformats-officedocument.wordprocessingml.styles+xml;; +vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml;; +vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml;; +vnd.openxmlformats-package.core-properties+xml;; +vnd.openxmlformats-package.digital-signature-xmlsignature+xml;; +vnd.openxmlformats-package.relationships+xml;; +vnd.oracle.resource+json;; +vnd.orange.indata;; +vnd.osa.netdeploy;; +vnd.osgi.bundle;; +vnd.otps.ct-kip+xml;; +vnd.oxli.countgraph;; +vnd.pagerduty+json;; +vnd.panoply;; +vnd.paos.xml;; +vnd.pcos;; +vnd.piaccess.application-licence;; +vnd.poc.group-advertisement+xml;; +vnd.powerbuilder6-s;; +vnd.powerbuilder7-s;; +vnd.powerbuilder75-s;; +vnd.powerbuilder75;; +vnd.powerbuilder7;; +vnd.preminet;; +vnd.pwg-multiplexed;; +vnd.pwg-xhtml-print+xml;; +vnd.pwg-xmhtml-print+xml;; +vnd.qualcomm.brew-app-res;; +vnd.quarantainenet;; +vnd.quobject-quoxdocument;; +vnd.radisys.moml+xml;; +vnd.radisys.msml+xml;; +vnd.radisys.msml-audit+xml;; +vnd.radisys.msml-audit-conf+xml;; +vnd.radisys.msml-audit-conn+xml;; +vnd.radisys.msml-audit-dialog+xml;; +vnd.radisys.msml-audit-stream+xml;; +vnd.radisys.msml-conf+xml;; +vnd.radisys.msml-dialog+xml;; +vnd.radisys.msml-dialog-base+xml;; +vnd.radisys.msml-dialog-fax-detect+xml;; +vnd.radisys.msml-dialog-fax-sendrecv+xml;; +vnd.radisys.msml-dialog-group+xml;; +vnd.radisys.msml-dialog-speech+xml;; +vnd.radisys.msml-dialog-transform+xml;; +vnd.rainstor.data;; +vnd.rapid;; +vnd.rar;; +vnd.renlearn.rlprint;; +vnd.rs-274x;; +vnd.ruckus.download;; +vnd.s3sms;; +vnd.sbm.cid;; +vnd.sbm.mid2;; +vnd.scribus;; +vnd.sealed.3df;; +vnd.sealed.csf;; +vnd.sealed.net;; +vnd.sealed.tiff;; +vnd.siren+json;; +vnd.smart.notebook;; +vnd.software602.filler.form+xml;; +vnd.software602.filler.form-xml-zip;; +vnd.sss-cod;; +vnd.sss-dtf;; +vnd.sss-ntf;; +vnd.street-stream;; +vnd.sun.wadl+xml;; +vnd.swiftview-ics;; +vnd.syncml.dm.notification;; +vnd.syncml.dmddf+wbxml;; +vnd.syncml.dmddf+xml;; +vnd.syncml.dmtnds+wbxml;; +vnd.syncml.dmtnds+xml;; +vnd.syncml.ds.notification;; +vnd.tmd.mediaflex.api+xml;; +vnd.tml;; +vnd.truedoc;; +vnd.tve-trigger;; +vnd.ubisoft.webplayer;; +vnd.uplanet.alert-wbxml;; +vnd.uplanet.alert;; +vnd.uplanet.bearer-choice-wbxml;; +vnd.uplanet.bearer-choice;; +vnd.uplanet.cacheop-wbxml;; +vnd.uplanet.cacheop;; +vnd.uplanet.channel-wbxml;; +vnd.uplanet.channel;; +vnd.uplanet.list-wbxml;; +vnd.uplanet.list;; +vnd.uplanet.listcmd-wbxml;; +vnd.uplanet.listcmd;; +vnd.uplanet.signal;; +vnd.uri-map;; +vnd.valve.source.material;; +vnd.vd-study;; +vnd.vectorworks;; +vnd.vel+json;; +vnd.verimatrix.vcas;; +vnd.vividence.scriptfile;; +vnd.wfa.p2p;; +vnd.wfa.wsc;; +vnd.windows.devicepairing;; +vnd.wmc;; +vnd.wmf.bootstrap;; +vnd.wolfram.mathematica.package;; +vnd.wolfram.mathematica;; +vnd.wrq-hp3000-labelled;; +vnd.wv.csp+xml;;8bit +vnd.wv.ssp+xml;;8bit +vnd.xacml+json;; +vnd.xfdl.webform;; +vnd.xmi+xml;; +vnd.xmpie.cpkg;; +vnd.xmpie.dpkg;; +vnd.xmpie.plan;; +vnd.xmpie.ppkg;; +vnd.xmpie.xlim;; +vnd.yamaha.remote-setup;; +vnd.yamaha.through-ngn;; +vnd.yamaha.tunnel-udpencap;; +vnd.yaoweme;; +vq-rtcpxr;; +whoispp-query;; +whoispp-response;; +wita;; +x400-bp;; +xacml+xml;; +xcap-att+xml;; +xcap-caps+xml;; +xcap-el+xml;; +xcap-error+xml;; +xcap-ns+xml;; +xcon-conference-info+xml;; +xcon-conference-info-diff+xml;; +xhtml-voice+xml;; +xmpp+xml;; + +520:application:I:E +andrew-inset;ez; +atom+xml;atom;8bit +atomcat+xml;atomcat; +atomsvc+xml;atomsvc; +ccxml+xml;ccxml; +cdmi-capability;cdmia; +cdmi-container;cdmic; +cdmi-domain;cdmid; +cdmi-object;cdmio; +cdmi-queue;cdmiq; +commonground;dp; +dash+xml;mdp; +dicom;dcm; +dssc+der;dssc; +dssc+xml;xdssc; +ecmascript;es,ecma,js; +emma+xml;emma; +exi;exi; +font-tdpfr;pfr; +font-woff;woff; +gzip;gz; +hyperstudio;stk; +iges;iges,igs; +inkml+xml;ink,inkml; +ipfix;ipfix; +javascript;js,jsm;8bit +json-patch+json;json-patch; +json;json,map;8bit +ld+json;jsonld; +lost+xml;lostxml; +mac-binhex40;hqx;8bit +mads+xml;mads; +marc;mrc; +marcxml+xml;mrcx; +mathematica;nb,nbp,ma,mb; +mathml+xml;mathml,mml; +mbox;mbox; +mediaservercontrol+xml;mscml; +metalink4+xml;meta4; +mets+xml;mets; +mods+xml;mods; +mp21;m21,mp21; +mp4;mp4s,m4p; +msword;doc,dot,w6w,wiz,word; +mxf;mxf; +ocsp-request;orq; +ocsp-response;ors; +octet-stream;lrf,mar,dist,distz,bpk,dump,deploy,lhx,saveme,buffer;base64 +oda;oda; +ogg;ogx; +oxps;oxps,xps; +patch-ops-error+xml;xer; +pdf;pdf;base64 +pgp-encrypted;pgp,gpg,asc;7bit +pgp-keys;key,skr,pkr,asc,pgp,gpg;7bit +pgp-signature;sig,pgp,asc,gpg;base64 +pkcs10;p10; +pkcs7-mime;p7m,p7c; +pkcs7-signature;p7s; +pkcs8;p8; +pkix-attr-cert;ac; +pkix-cert;cer,crt; +pkix-crl;crl; +pkixcmp;pki; +pls+xml;pls; +postscript;ps-z,ps,ai,eps,epsi,epsf,eps2,eps3;base64 +prs.cww;cw,cww; +prs.nprend;rnd,rct; +pskc+xml;pskcxml; +rdf+xml;rdf,rdfs,owl;8bit +reginfo+xml;rif; +relax-ng-compact-syntax;rnc; +resource-lists+xml;rl; +resource-lists-diff+xml;rld; +rls-services+xml;rs; +rpki-ghostbusters;gbr; +rpki-manifest;mft; +rpki-roa;roa; +rtf;rtf,rtx;8bit +sbml+xml;sbml; +scvp-cv-request;scq; +scvp-cv-response;scs; +scvp-vp-request;spq; +scvp-vp-response;spp; +sdp;sdp; +set-payment-initiation;setpay; +set-registration-initiation;setreg; +sgml-open-catalog;soc; +shf+xml;shf; +sieve;siv; +smil+xml;smi,smil,sml,kino; +smil;smi,smil;8bit +sparql-query;rq; +sparql-results+xml;srx; +sql;sql; +srgs+xml;grxml; +srgs;gram; +sru+xml;sru; +ssml+xml;ssml; +tei+xml;tei,teicorpus; +thraud+xml;tfi; +timestamped-data;tsd; +vnd.3gpp.pic-bw-large;plb; +vnd.3gpp.pic-bw-small;psb; +vnd.3gpp.pic-bw-var;pvb; +vnd.3gpp.sms;sms; +vnd.3gpp2.tcap;tcap; +vnd.3m.post-it-notes;pwn; +vnd.accpac.simply.aso;aso; +vnd.accpac.simply.imp;imp; +vnd.acucobol;acu; +vnd.acucorp;atc,acutc;7bit +vnd.adobe.air-application-installer-package+zip;air; +vnd.adobe.flash.movie;swf,spl; +vnd.adobe.formscentral.fcdt;fcdt; +vnd.adobe.fxp;fxp,fxpl; +vnd.adobe.xdp+xml;xdp; +vnd.adobe.xfdf;xfdf; +vnd.ahead.space;ahead; +vnd.airzip.filesecure.azf;azf; +vnd.airzip.filesecure.azs;azs; +vnd.amazon.ebook;azw; +vnd.americandynamics.acc;acc; +vnd.amiga.ami;ami; +vnd.amiga.amu;ami; +vnd.android.package-archive;apk; +vnd.anser-web-certificate-issue-initiation;cii; +vnd.anser-web-funds-transfer-initiation;fti; +vnd.antix.game-component;atx; +vnd.apple.installer+xml;mpkg; +vnd.apple.mpegurl;m3u8,m3u; +vnd.arastra.swi;swi; +vnd.aristanetworks.swi;swi; +vnd.astraea-software.iota;iota; +vnd.audiograph;aep; +vnd.blueice.multipass;mpm; +vnd.bmi;bmi; +vnd.businessobjects;rep; +vnd.chemdraw+xml;cdxml; +vnd.chipnuts.karaoke-mmd;mmd; +vnd.cinderella;cdy; +vnd.claymore;cla; +vnd.cloanto.rp9;rp9; +vnd.clonk.c4group;c4g,c4d,c4f,c4p,c4u; +vnd.cluetrust.cartomobile-config-pkg;c11amz; +vnd.cluetrust.cartomobile-config;c11amc; +vnd.coffeescript;coffee; +vnd.commonspace;csp; +vnd.contact.cmsg;cdbcmsg; +vnd.corel-draw;cdr; +vnd.cosmocaller;cmc; +vnd.crick.clicker.keyboard;clkk; +vnd.crick.clicker.palette;clkp; +vnd.crick.clicker.template;clkt; +vnd.crick.clicker.wordbank;clkw; +vnd.crick.clicker;clkx; +vnd.criticaltools.wbs+xml;wbs; +vnd.ctc-posml;pml; +vnd.cups-ppd;ppd; +vnd.curl.car;car; +vnd.curl.pcurl;pcurl; +vnd.curl;curl; +vnd.dart;dart; +vnd.data-vision.rdz;rdz; +vnd.debian.binary-package;deb,udeb; +vnd.dece.data;uvf,uvvf,uvd,uvvd; +vnd.dece.ttml+xml;uvt,uvvt; +vnd.dece.unspecified;uvx,uvvx; +vnd.dece.zip;uvz,uvvz; +vnd.denovo.fcselayout-link;fe_launch; +vnd.dna;dna; +vnd.dolby.mlp;mlp; +vnd.dpgraph;dpg; +vnd.dreamfactory;dfac; +vnd.ds-keypoint;kpxx; +vnd.dvb.ait;ait; +vnd.dvb.service;svc; +vnd.dynageo;geo; +vnd.ecowin.chart;mag; +vnd.emusic-emusic_package;emp; +vnd.enliven;nml; +vnd.epson.esf;esf; +vnd.epson.msf;msf; +vnd.epson.quickanime;qam; +vnd.epson.salt;slt; +vnd.epson.ssf;ssf; +vnd.eszigno3+xml;es3,et3; +vnd.ezpix-album;ez2; +vnd.ezpix-package;ez3; +vnd.fdf;fdf; +vnd.fdsn.mseed;mseed; +vnd.fdsn.seed;seed,dataless; +vnd.flographit;gph; +vnd.fluxtime.clip;ftc; +vnd.framemaker;fm,frame,maker,book; +vnd.frogans.fnc;fnc; +vnd.frogans.ltf;ltf; +vnd.fsc.weblauch;fsc;7bit +vnd.fsc.weblaunch;fsc; +vnd.fujitsu.oasys2;oa2; +vnd.fujitsu.oasys3;oa3; +vnd.fujitsu.oasys;oas; +vnd.fujitsu.oasysgp;fg5; +vnd.fujitsu.oasysprs;bh2; +vnd.fujixerox.ddd;ddd; +vnd.fujixerox.docuworks.binder;xbd; +vnd.fujixerox.docuworks;xdw; +vnd.fuzzysheet;fzs; +vnd.genomatix.tuxedo;txd; +vnd.geogebra.file;ggb; +vnd.geogebra.tool;ggt; +vnd.geometry-explorer;gex,gre; +vnd.geonext;gxt; +vnd.geoplan;g2w; +vnd.geospace;g3w; +vnd.gmx;gmx; +vnd.google-earth.kml+xml;kml;8bit +vnd.google-earth.kmz;kmz;8bit +vnd.grafeq;gqf,gqs; +vnd.groove-account;gac; +vnd.groove-help;ghf; +vnd.groove-identity-message;gim; +vnd.groove-injector;grv; +vnd.groove-tool-message;gtm; +vnd.groove-tool-template;tpl; +vnd.groove-vcard;vcg; +vnd.hal+xml;hal; +vnd.handheld-entertainment+xml;zmm; +vnd.hbci;hbci,hbc,kom,upa,pkd,bpd; +vnd.hhe.lesson-player;les; +vnd.hp-hpgl;plt,hpgl,hgl,hpg; +vnd.hp-hpid;hpid; +vnd.hp-hps;hps; +vnd.hp-jlyt;jlt; +vnd.hp-pcl;pcl; +vnd.hp-pclxl;pclxl; +vnd.hydrostatix.sof-data;sfd-hdstx; +vnd.hzn-3d-crossword;x3d; +vnd.ibm.electronic-media;emm; +vnd.ibm.minipay;mpy; +vnd.ibm.modcap;afp,listafp,list3820; +vnd.ibm.rights-management;irm; +vnd.ibm.secure-container;sc; +vnd.iccprofile;icc,icm; +vnd.igloader;igl; +vnd.immervision-ivp;ivp; +vnd.immervision-ivu;ivu; +vnd.insors.igm;igm; +vnd.intercon.formnet;xpw,xpx; +vnd.intergeo;i2g; +vnd.intu.qbo;qbo; +vnd.intu.qfx;qfx; +vnd.ipunplugged.rcprofile;rcprofile; +vnd.irepository.package+xml;irp; +vnd.is-xpr;xpr; +vnd.isac.fcs;fcs; +vnd.jam;jam; +vnd.jcp.javame.midlet-rms;rms; +vnd.jisp;jisp; +vnd.joost.joda-archive;joda; +vnd.kahootz;ktz,ktr; +vnd.kde.karbon;karbon; +vnd.kde.kchart;chrt; +vnd.kde.kformula;kfo; +vnd.kde.kivio;flw; +vnd.kde.kontour;kon; +vnd.kde.kpresenter;kpr,kpt; +vnd.kde.kspread;ksp; +vnd.kde.kword;kwd,kwt; +vnd.kenameaapp;htke; +vnd.kenameapp;htke; +vnd.kidspiration;kia; +vnd.kinar;kne,knp; +vnd.koan;skp,skd,skt,skm; +vnd.kodak-descriptor;sse; +vnd.las.las+xml;lasxml; +vnd.llamagraphics.life-balance.desktop;lbd; +vnd.llamagraphics.life-balance.exchange+xml;lbe; +vnd.lotus-1-2-3;wks,123,wk1,wk3,wk4; +vnd.lotus-approach;apr; +vnd.lotus-freelance;pre; +vnd.lotus-notes;nsf; +vnd.lotus-organizer;org; +vnd.lotus-screencam;scm; +vnd.lotus-wordpro;lwp; +vnd.macports.portpkg;portpkg; +vnd.mcd;mcd; +vnd.medcalcdata;mc1; +vnd.mediastation.cdkey;cdkey; +vnd.mfer;mwf; +vnd.mfmp;mfm; +vnd.micrografx.flo;flo; +vnd.micrografx.igx;igx; +vnd.mif;mif; +vnd.mobius.daf;daf; +vnd.mobius.dis;dis; +vnd.mobius.mbk;mbk; +vnd.mobius.mqy;mqy; +vnd.mobius.msl;msl; +vnd.mobius.plc;plc; +vnd.mobius.txf;txf; +vnd.mophun.application;mpn; +vnd.mophun.certificate;mpc; +vnd.mozilla.xul+xml;xul; +vnd.ms-access;mdb; +vnd.ms-artgalry;cil; +vnd.ms-asf;asf; +vnd.ms-cab-compressed;cab; +vnd.ms-excel.addin.macroenabled.12;xlam; +vnd.ms-excel.sheet.binary.macroenabled.12;xlsb; +vnd.ms-excel.sheet.macroenabled.12;xlsm; +vnd.ms-excel.template.macroenabled.12;xltm; +vnd.ms-excel;xls,xlt,xlb,xla,xlm,xlc,xlw,xll,xld;base64 +vnd.ms-fontobject;eot; +vnd.ms-htmlhelp;chm; +vnd.ms-ims;ims; +vnd.ms-lrm;lrm; +vnd.ms-officetheme;thmx; +vnd.ms-pki.certstore;sst; +vnd.ms-pki.pko;pko; +vnd.ms-pki.seccat;cat; +vnd.ms-pki.stl;stl; +vnd.ms-powerpoint.addin.macroenabled.12;ppam; +vnd.ms-powerpoint.presentation.macroenabled.12;pptm; +vnd.ms-powerpoint.slide.macroenabled.12;sldm; +vnd.ms-powerpoint.slideshow.macroenabled.12;ppsm; +vnd.ms-powerpoint.template.macroenabled.12;potm; +vnd.ms-powerpoint;ppt,pps,pot,ppa,pwz,ppz;base64 +vnd.ms-project;mpp,mpt;base64 +vnd.ms-publisher;pub; +vnd.ms-tnef;tnef,tnf;base64 +vnd.ms-word.document.macroenabled.12;docm; +vnd.ms-word.template.macroenabled.12;dotm; +vnd.ms-works;wps,wks,wcm,wdb,xlr;base64 +vnd.ms-wpl;wpl;base64 +vnd.ms-xpsdocument;xps;8bit +vnd.mseq;mseq; +vnd.musician;mus; +vnd.muvee.style;msty; +vnd.mynfc;taglet; +vnd.nervana;ent,entity,req,request,bkm,kcm; +vnd.neurolanguage.nlu;nlu; +vnd.nintendo.snes.rom;sfc,smc; +vnd.nitf;ntf,nitf; +vnd.noblenet-directory;nnd; +vnd.noblenet-sealer;nns; +vnd.noblenet-web;nnw; +vnd.nokia.configuration-message;ncm; +vnd.nokia.n-gage.data;ngdat; +vnd.nokia.n-gage.symbian.install;n-gage; +vnd.nokia.radio-preset;rpst; +vnd.nokia.radio-presets;rpss; +vnd.nokia.ringing-tone;rng; +vnd.novadigm.edm;edm; +vnd.novadigm.edx;edx; +vnd.novadigm.ext;ext; +vnd.oasis.opendocument.chart-template;otc; +vnd.oasis.opendocument.chart;odc; +vnd.oasis.opendocument.database;odb; +vnd.oasis.opendocument.formula-template;odft,otf; +vnd.oasis.opendocument.formula;odf; +vnd.oasis.opendocument.graphics-flat-xml;fodg; +vnd.oasis.opendocument.graphics-template;otg; +vnd.oasis.opendocument.graphics;odg; +vnd.oasis.opendocument.image-template;oti; +vnd.oasis.opendocument.image;odi; +vnd.oasis.opendocument.presentation-flat-xml;fodp; +vnd.oasis.opendocument.presentation-template;otp; +vnd.oasis.opendocument.presentation;odp; +vnd.oasis.opendocument.spreadsheet-flat-xml;fods; +vnd.oasis.opendocument.spreadsheet-template;ots; +vnd.oasis.opendocument.spreadsheet;ods; +vnd.oasis.opendocument.text-flat-xml;fodt; +vnd.oasis.opendocument.text-master;odm,otm; +vnd.oasis.opendocument.text-template;ott; +vnd.oasis.opendocument.text-web;oth; +vnd.oasis.opendocument.text;odt; +vnd.olpc-sugar;xo; +vnd.oma.dd2+xml;dd2; +vnd.openofficeorg.extension;oxt; +vnd.openxmlformats-officedocument.presentationml.presentation;pptx;base64 +vnd.openxmlformats-officedocument.presentationml.slide;sldx; +vnd.openxmlformats-officedocument.presentationml.slideshow;ppsx;base64 +vnd.openxmlformats-officedocument.presentationml.template;potx;base64 +vnd.openxmlformats-officedocument.spreadsheetml.sheet;xlsx;base64 +vnd.openxmlformats-officedocument.spreadsheetml.template;xltx;base64 +vnd.openxmlformats-officedocument.wordprocessingml.document;docx;base64 +vnd.openxmlformats-officedocument.wordprocessingml.template;dotx;base64 +vnd.osgeo.mapguide.package;mgp; +vnd.osgi.dp;dp; +vnd.osgi.subsystem;esa; +vnd.palm;prc,pdb,pqa,oprc; +vnd.pawaafile;paw; +vnd.pg.format;str; +vnd.pg.osasli;ei6; +vnd.picsel;efif; +vnd.pmi.widget;wg; +vnd.pocketlearn;plf; +vnd.powerbuilder6;pbd; +vnd.previewsystems.box;box; +vnd.proteus.magazine;mgz; +vnd.publishare-delta-tree;qps; +vnd.pvi.ptid1;pti,ptid; +vnd.quark.quarkxpress;qxd,qxt,qwd,qwt,qxl,qxb;8bit +vnd.realvnc.bed;bed; +vnd.recordare.musicxml+xml;musicxml; +vnd.recordare.musicxml;mxl; +vnd.rig.cryptonote;cryptonote; +vnd.rim.cod;cod; +vnd.rn-realmedia-vbr;rmvb; +vnd.rn-realmedia;rm,rmj,rmm,rms,rmx,rmvb; +vnd.rn-realplayer;rnx; +vnd.route66.link66+xml;link66; +vnd.sailingtracker.track;st; +vnd.sealed.doc;sdoc,sdo,s1w; +vnd.sealed.eml;seml,sem; +vnd.sealed.mht;smht,smh; +vnd.sealed.ppt;sppt,spp,s1p; +vnd.sealed.xls;sxls,sxl,s1e; +vnd.sealedmedia.softseal.html;stml,stm,s1h; +vnd.sealedmedia.softseal.pdf;spdf,spd,s1a; +vnd.seemail;see; +vnd.sema;sema; +vnd.semd;semd; +vnd.semf;semf; +vnd.shana.informed.formdata;ifm; +vnd.shana.informed.formtemplate;itp; +vnd.shana.informed.interchange;iif; +vnd.shana.informed.package;ipk; +vnd.simtech-mindmapper;twd,twds; +vnd.smaf;mmf; +vnd.smart.teacher;teacher; +vnd.solent.sdkm+xml;sdkm,sdkd; +vnd.spotfire.dxp;dxp; +vnd.spotfire.sfs;sfs; +vnd.stardivision.calc;sdc; +vnd.stardivision.chart;sds; +vnd.stardivision.draw;sda; +vnd.stardivision.impress;sdd,sdp; +vnd.stardivision.mail;smd; +vnd.stardivision.math;sdf,smf; +vnd.stardivision.writer-global;sgl; +vnd.stardivision.writer;sdw,vor,sgl; +vnd.stepmania.package;smzip; +vnd.stepmania.stepchart;sm; +vnd.sun.xml.calc.template;stc; +vnd.sun.xml.calc;sxc; +vnd.sun.xml.draw.template;std; +vnd.sun.xml.draw;sxd; +vnd.sun.xml.impress.template;sti; +vnd.sun.xml.impress;sxi; +vnd.sun.xml.math;sxm; +vnd.sun.xml.writer.global;sxg; +vnd.sun.xml.writer.template;stw; +vnd.sun.xml.writer;sxw; +vnd.sus-calendar;sus,susp; +vnd.svd;svd; +vnd.symbian.install;sis,sisx; +vnd.syncml+xml;xsm; +vnd.syncml.dm+wbxml;bdm; +vnd.syncml.dm+xml;xdm; +vnd.tao.intent-module-archive;tao; +vnd.tcpdump.pcap;pcap,cap,dmp; +vnd.tmobile-livetv;tmo; +vnd.trid.tpt;tpt; +vnd.triscape.mxs;mxs; +vnd.trueapp;tra; +vnd.ufdl;ufd,ufdl; +vnd.uiq.theme;utz; +vnd.umajin;umj; +vnd.unity;unityweb; +vnd.uoml+xml;uoml; +vnd.vcx;vcx; +vnd.vidsoft.vidconference;vsc;8bit +vnd.visio;vsd,vst,vsw,vss; +vnd.visionary;vis; +vnd.vsf;vsf; +vnd.wap.sic;sic; +vnd.wap.slc;slc; +vnd.wap.wbxml;wbxml; +vnd.wap.wmlc;wmlc; +vnd.wap.wmlscriptc;wmlsc; +vnd.webturbo;wtb; +vnd.wolfram.player;nbp; +vnd.wordperfect5.1;wp5; +vnd.wordperfect;wpd,wp,wp4,wp5,wp6,wpp; +vnd.wqd;wqd; +vnd.wt.stf;stf; +vnd.wv.csp+wbxml;wv; +vnd.xara;xar,web; +vnd.xfdl;xfdl; +vnd.yamaha.hv-dic;hvd; +vnd.yamaha.hv-script;hvs; +vnd.yamaha.hv-voice;hvp; +vnd.yamaha.openscoreformat.osfpvg+xml;osfpvg; +vnd.yamaha.openscoreformat;osf; +vnd.yamaha.smaf-audio;saf; +vnd.yamaha.smaf-phrase;spf; +vnd.yellowriver-custom-menu;cmp; +vnd.zul;zir,zirz; +vnd.zzazz.deck+xml;zaz; +voicexml+xml;vxml; +watcherinfo+xml;wif; +widget;wgt; +wordperfect5.1;wp5,wp; +wsdl+xml;wsdl; +wspolicy+xml;wspolicy; +xcap-diff+xml;xdf; +xenc+xml;xenc; +xhtml+xml;xhtml,xht;8bit +xml-dtd;dtd;8bit +xml-external-parsed-entity;ent; +xml;xml,xsl,xsd,xpdl,xbl,rng;8bit +xop+xml;xop; +xslt+xml;xslt,xsl;8bit +xv+xml;mxml,xhvml,xvml,xvm; +yang;yang; +yin+xml;yin; +zip;zip;base64 +zlib;zz; + +18:audio:: +x-aptx;; +x-eac3;; +x-evrc1;; +x-evrcb0;; +x-evrcb1;; +x-evrcb;; +x-evrcwb0;; +x-evrcwb1;; +x-evrcwb;; +x-evs;; +x-example;; +x-g.722.1;; +x-g711-0;; +x-g7291;; +x-isac;; +x-opus;; +x-red;; +x-riff;; + +66:audio::E +x-aac;aac; +x-adpcm;adp,snd; +x-aifc;aifc,aiffc; +x-aiff;aif,aifc,aiff;base64 +x-amzxml;amz; +x-annodex;axa; +x-ape;ape; +x-au;au; +x-caf;caf; +x-flac+ogg;oga,ogg; +x-flac;flac; +x-gsm;gsm,gsd; +x-iriver-pla;pla; +x-it;it; +x-jam;jam; +x-liveaudio;lam; +x-m4b;m4b,f4b; +x-make.my.funk;pfunk; +x-make;funk,my,pfunk; +x-matroska;mka; +x-mid;mid,midi,rmi; +x-midi;mid,midi,kar,rmi;base64 +x-minipsf;minipsf; +x-mo3;mo3; +x-mod;mod,ult,uni,m15,mtm,669,med; +x-mp2;mp2; +x-mpeg-3;mp3; +x-mpeg3;mp3; +x-mpeg;mp2; +x-mpegurl;m3u,m3u8,vlc; +x-mpequrl;m3u; +x-ms-asx;asx,wax,wvx,wmx; +x-ms-wax;wax; +x-ms-wma;wma; +x-musepack;mpc,mpp,mp+; +x-nspaudio;la,lma; +x-opus+ogg;opus; +x-pn-realaudio-plugin;rpm,rmp,ra; +x-pn-realaudio;rm,ram,ra,rmm,rmp;base64 +x-psf;psf; +x-psflib;psflib; +x-psid;sid; +x-realaudio;ra;base64 +x-s3m;s3m; +x-scpls;pls; +x-sd2;sd2; +x-silk;sil; +x-speex+ogg;oga,ogg; +x-speex;spx; +x-stm;stm; +x-tsp-audio;tsi; +x-tsplayer;tsp; +x-tta;tta; +x-twinvq-plugin;vqe,vql; +x-twinvq;vqf; +x-vnd.audioexplosion.mjuicemediafile;mjf; +x-voc;voc; +x-vorbis+ogg;oga,ogg; +x-voxware;vox; +x-wav;wav;base64 +x-wavpack-correction;wvc; +x-wavpack;wv,wvp; +x-webm;weba;base64 +x-xi;xi; +x-xm;xm; +x-xmf;xmf; + +99:audio:I: +1d-interleaved-parityfec;; +32kadpcm;; +3gpp2;; +3gpp;; +amr-wb+;; +asc;; +atrac-advanced-lossless;; +atrac-x;; +atrac3;; +bv16;; +bv32;; +clearmode;; +cn;; +dat12;; +dls;; +dsr-es201108;; +dsr-es202050;; +dsr-es202211;; +dsr-es202212;; +dv;; +dvi4;; +encaprtp;; +evrc-qcp;; +evrc0;; +evrcnw0;; +evrcnw1;; +evrcnw;; +fwdred;; +g719;; +g7221;; +g722;; +g723;; +g726-16;; +g726-24;; +g726-32;; +g726-40;; +g728;; +g729;; +g729d;; +g729e;; +gsm-efr;; +gsm-hr-08;; +gsm;; +ilbc;; +ip-mr_v2.5;; +l20;; +l24;; +l8;; +lpc;; +mobile-xmf;; +mp4a-latm;; +mpa-robust;; +mpa;; +mpeg4-generic;; +parityfec;; +pcma-wb;; +pcma;; +pcmu-wb;; +pcmu;; +raptorfec;; +rtp-enc-aescm128;; +rtp-midi;; +rtploopback;; +rtx;; +smv-qcp;; +smv0;; +sp-midi;; +speex;; +t140c;; +t38;; +telephone-event;; +tone;; +uemclip;; +ulpfec;; +vdvi;; +vmr-wb;; +vnd.3gpp.iufp;; +vnd.4sb;; +vnd.celp;; +vnd.cisco.nse;; +vnd.cmles.radio-events;; +vnd.cns.anp1;; +vnd.cns.inf1;; +vnd.dlna.adts;; +vnd.dolby.heaac.1;; +vnd.dolby.heaac.2;; +vnd.dolby.mlp;; +vnd.dolby.mps;; +vnd.dolby.pl2;; +vnd.dolby.pl2x;; +vnd.dolby.pl2z;; +vnd.dolby.pulse.1;; +vnd.dvb.file;; +vnd.hns.audio;; +vnd.octel.sbc;; +vnd.rhetorex.32kadpcm;; +vnd.vmx.cvsd;; +vorbis-config;; +vorbis;; + +30:audio:I:E +ac3;ac3; +amr-wb;awb;base64 +amr;amr;base64 +basic;au,snd;base64 +evrc;evc; +l16;l16; +mp4;f4a,f4b,m4a,mp4a; +mpeg;mpga,mp2,mp3,mpega,m4a,mp2a,m2a,m3a,mpa,mpg;base64 +ogg;ogg,oga,spx,opus; +prs.sid;sid,psid; +qcelp;qcp; +smv;smv; +vnd.audiokoz;koz; +vnd.dece.audio;uva,uvva; +vnd.digital-winds;eol;7bit +vnd.dra;dra; +vnd.dts.hd;dtshd; +vnd.dts;dts; +vnd.everad.plj;plj; +vnd.lucent.voice;lvp; +vnd.ms-playready.media.pya;pya; +vnd.nokia.mobile-xmf;mxmf; +vnd.nortel.vbk;vbk; +vnd.nuera.ecelp4800;ecelp4800; +vnd.nuera.ecelp7470;ecelp7470; +vnd.nuera.ecelp9600;ecelp9600; +vnd.qcelp;qcp; +vnd.rip;rip; +vnd.rn-realaudio;ra,rax; +vnd.sealedmedia.softseal.mpeg;smp3,smp,s1m; + +12:image:: +x-bzeps;; +x-compressed-xcf;; +x-dcraw;; +x-dib;; +x-dicom-rle;; +x-dpx;; +x-example;; +x-fpx;; +x-gzeps;; +x-jls;; +x-tiff-multipage;; +x-xcursor;; + +84:image::E +x-3ds;3ds; +x-adobe-dng;dng; +x-applix-graphics;ag; +x-bmp;bmp,bm; +x-canon-cr2;cr2; +x-canon-crw;crw; +x-cmu-raster;ras,rast; +x-cmx;cmx; +x-coreldraw;cdr; +x-coreldrawpattern;pat; +x-coreldrawtemplate;cdt; +x-corelphotopaint;cpt; +x-dds;dds; +x-dwg;dwg,dxf,svf; +x-emf;emf; +x-eps;eps,epsi,epsf; +x-epson-erf;erf; +x-exr;exr; +x-fax-g3;g3; +x-fif;fif; +x-florian;flo,turbot; +x-freehand;fh,fhc,fh4,fh5,fh7; +x-fuji-raf;raf; +x-icns;icns; +x-icon;ico; +x-ilbm;iff,ilbm,lbm; +x-jg;art; +x-jng;jng; +x-jps;jps; +x-jutvision;jut; +x-kodak-dcr;dcr; +x-kodak-k25;k25; +x-kodak-kdc;kdc; +x-lwo;lwo,lwob; +x-lws;lws; +x-macpaint;pntg; +x-minolta-mrw;mrw; +x-mrsid-image;sid; +x-ms-bmp;bmp; +x-msod;msod; +x-niff;nif,niff; +x-nikon-nef;nef; +x-olympus-orf;orf; +x-openraster;ora; +x-panasonic-raw2;rw2; +x-panasonic-raw;raw; +x-pcx;pcx; +x-pentax-pef;pef; +x-photo-cd;pcd; +x-photoshop;psd; +x-pict;pic,pct,pict,pict1,pict2; +x-pjpeg;jfif,jpe,jpeg,jpg; +x-portable-anymap;pnm;base64 +x-portable-bitmap;pbm;base64 +x-portable-graymap;pgm;base64 +x-portable-greymap;pgm; +x-portable-pixmap;ppm;base64 +x-quicktime;qif,qti,qtif; +x-rgb;rgb;base64 +x-rle;rle; +x-sgi;sgi; +x-sigma-x3f;x3f; +x-skencil;sk,sk1; +x-sony-arw;arw; +x-sony-sr2;sr2; +x-sony-srf;srf; +x-sun-raster;sun; +x-svg+xml-compressed;svgz; +x-targa;tga; +x-tga;tga,icb,tpic,vda,vst; +x-tiff;tif,tiff; +x-vasa;mcf; +x-webp;webp; +x-win-bitmap;cur; +x-windows-bmp;bmp; +x-wmf;wmf; +x-xbitmap;xbm;7bit +x-xbm;xbm; +x-xcf;xcf; +x-xfig;fig; +x-xpixmap;xpm,pm;8bit +x-xpm;xpm; +x-xwd;xwd; +x-xwindowdump;xwd;base64 + +13:image:I: +prs.pti;; +pwg-raster;; +t38;; +tiff-fx;; +vnd.airzip.accelerator.azv;; +vnd.cns.inf2;; +vnd.globalgraphics.pgb;; +vnd.mix;; +vnd.mozilla.apng;; +vnd.radiance;; +vnd.svf;; +vnd.tencent.tap;; +vnd.valve.source.texture;; + +40:image:I:E +cgm;cgm; +fits;fits; +g3fax;g3; +gif;gif;base64 +ief;ief,iefs;base64 +jp2;jp2,jpg2,jpx,jpf;base64 +jpeg;jpeg,jpg,jpe,jfif,jfif-tbnl;base64 +jpm;jpm,jpgm; +jpx;jpf,jpx; +ktx;ktx; +naplps;nap,naplps; +png;png,x-png;base64 +prs.btif;btif; +svg+xml;svg,svgz;8bit +tiff;tiff,tif;base64 +vnd.adobe.photoshop;psd; +vnd.dece.graphic;uvi,uvvi,uvg,uvvg; +vnd.dgn;dgn; +vnd.djvu;djvu,djv; +vnd.dvb.subtitle;sub; +vnd.dwg;dwg,dxf,svf; +vnd.dxf;dxf; +vnd.fastbidsheet;fbs; +vnd.fpx;fpx; +vnd.fst;fst; +vnd.fujixerox.edmics-mmr;mmr; +vnd.fujixerox.edmics-rlc;rlc; +vnd.glocalgraphics.pgb;pgb; +vnd.microsoft.icon;ico; +vnd.ms-modi;mdi; +vnd.ms-photo;wdp; +vnd.net-fpx;npx,fpx; +vnd.rn-realflash;rf; +vnd.rn-realpix;rp; +vnd.sealed.png;spng,spn,s1n; +vnd.sealedmedia.softseal.gif;sgif,sgi,s1g; +vnd.sealedmedia.softseal.jpg;sjpg,sjp,s1j; +vnd.wap.wbmp;wbmp; +vnd.xiff;xif; +vnd.zbrush.pcx;pcx; + +2:message:: +x-example;; +x-gnu-rmail;; + +19:message:I: +cpim;; +delivery-status;; +disposition-notification;; +external-body;;8bit +feedback-report;; +global-delivery-status;; +global-disposition-notification;; +global-headers;; +global;; +http;; +imdn+xml;; +news;;8bit +partial;;8bit +s-http;; +sip;; +sipfrag;; +tracking-status;; +vnd.si.simp;; +vnd.wfa.wsc;; + +1:message:I:E +rfc822;eml,mime,mht,mhtml,nws;8bit + +4:model:: +x-example;; +x-gltf+json;; +x-x3d+fastinfoset;; +x-x3d-vrml;; + +3:model::E +x-pov;pov; +x-x3d+binary;x3db,x3dbz; +x-x3d+vrml;x3dv,x3dvz; + +7:model:I: +vnd.flatland.3dml;; +vnd.gs-gdl;; +vnd.gs.gdl;; +vnd.moml+xml;; +vnd.opengex;; +vnd.rosette.annotated-data-model;; +vnd.valve.source.compiled-map;; + +12:model:I:E +iges;igs,iges; +mesh;msh,mesh,silo; +vnd.collada+xml;dae; +vnd.dwf;dwf; +vnd.gdl;gdl; +vnd.gtw;gtw; +vnd.mts;mts; +vnd.parasolid.transmit.binary;x_b,xmt_bin; +vnd.parasolid.transmit.text;x_t,xmt_txt;quoted-printable +vnd.vtu;vtu; +vrml;wrl,vrml,wrz,vrm; +x3d+xml;x3d,x3dz; + +4:multipart:: +x-example;; +x-mixed-replace;; +x-tar;; +x-www-form-urlencoded;; + +3:multipart::E +x-gzip;gzip; +x-ustar;ustar; +x-zip;zip; + +13:multipart:I: +alternative;;8bit +appledouble;;8bit +byteranges;; +digest;;8bit +encrypted;; +form-data;; +header-set;; +mixed;;8bit +parallel;;8bit +related;; +report;; +signed;; +voice-message;; + +17:text:: +x-authors;; +x-changelog;; +x-comma-separated-values;;8bit +x-copying;; +x-credits;; +x-crontab;; +x-english;; +x-example;; +x-htmlh;; +x-install;; +x-jcr-cnd;; +x-meson;; +x-parameters;; +x-readme;; +x-scons;; +x-uri;; +x-xmcd;; + +125:text::E +x-adasrc;adb,ads; +x-asm;s,asm; +x-asp;asp; +x-audiosoft-intra;aip; +x-bibtex;bib; +x-boo;boo; +x-c++hdr;h++,hpp,hxx,hh,hp; +x-c++src;c++,cpp,cxx,cc,C; +x-c;c,cc,cxx,cpp,h,hh,dic; +x-cache-manifest;manifest,appcache; +x-chdr;h; +x-cmake;cmake; +x-cobol;cbl,cob; +x-component;htc;8bit +x-csh;csh; +x-csharp;cs; +x-csrc;c; +x-csv-schema;csvs; +x-dcl;dcl; +x-diff;diff,patch; +x-dsl;dsl; +x-dsrc;d,di; +x-eiffel;e,eif; +x-emacs-lisp;el; +x-erlang;erl; +x-event-stream;event-stream; +x-fortran;f,for,f77,f90,f95; +x-genie;gs; +x-gettext-translation-template;pot; +x-gettext-translation;po; +x-go;go; +x-google-video-pointer;gvp; +x-h323;323; +x-h;h,hh; +x-haskell;hs; +x-idl;idl; +x-imelody;imy,ime; +x-iptables;iptables; +x-iuls;uls; +x-java-source;java,jav; +x-java;java; +x-la-asf;lsx; +x-ldif;ldif; +x-lilypond;ly; +x-literate-haskell;lhs; +x-log;log; +x-lua;lua; +x-m;m; +x-makefile;mk,mak; +x-markdown;markdown,md,mkd; +x-mathml;mml; +x-matlab;m; +x-mcf;mcf; +x-microdvd;sub; +x-moc;moc; +x-modelica;mo; +x-mof;mof; +x-mpsub;sub; +x-mrml;mrml,mrl; +x-ms-regedit;reg; +x-mup;mup,not; +x-nfo;nfo; +x-objcsrc;m; +x-ocaml;ml,mli; +x-ocl;ocl; +x-ooc;ooc; +x-opml+xml;opml; +x-opml;opml; +x-pascal;p,pas; +x-patch;diff,patch; +x-pcs-gcd;gcd; +x-python;py,pyx,wsgi; +x-qml;qml,qmltypes,qmlproject; +x-reject;rej; +x-rpm-spec;spec; +x-rust;rs; +x-scala;scala; +x-scheme;scm,ss; +x-scriplet;wsc; +x-script.csh;csh; +x-script.elisp;el; +x-script.guile;scm; +x-script.ksh;ksh; +x-script.lisp;lsp; +x-script.perl-module;pm; +x-script.perl;pl; +x-script.phyton;py; +x-script.rexx;rexx; +x-script.scheme;scm; +x-script.sh;sh; +x-script.tcl;tcl; +x-script.tcsh;tcsh; +x-script.zsh;zsh; +x-script;hlb; +x-scriptlet;sct,wsc; +x-server-parsed-html;shtml,ssi; +x-setext;etx; +x-sfv;sfv; +x-sgml;sgml,sgm;8bit +x-sh;sh; +x-speech;spc,talk; +x-spreadsheet;sylk,slk; +x-ssa;ssa,ass; +x-subviewer;sub; +x-svhdr;svh; +x-svsrc;sv; +x-tcl;tcl,tk; +x-tex;tex,ltx,sty,cls,dtx,ins,latex; +x-texinfo;texi,texinfo; +x-texmacs;tm,ts; +x-troff-me;me; +x-troff-mm;mm; +x-troff-ms;ms; +x-txt2tags;t2t; +x-uil;uil; +x-uuencode;uu,uue; +x-vala;vala,vapi; +x-vcalendar;vcs;8bit +x-vcard;vcf;8bit +x-verilog;v; +x-vhdl;vhd,vhdl; +x-vtt;vtt; +x-webviewhtml;htt; +x-xmi;xmi; +x-xslfo;fo,xslfo; + +32:text:I: +1d-interleaved-parityfec;; +directory;; +dns;; +encaprtp;; +enriched;; +fwdred;; +grammar-ref-list;; +mizar;; +parityfec;; +provenance-notation;; +prs.prop.logic;; +raptorfec;; +red;; +rfc822-headers;; +rtp-enc-aescm128;; +rtploopback;; +rtx;; +t140;; +ulpfec;; +vnd.a;; +vnd.debian.copyright;; +vnd.dmclientscript;; +vnd.esmertec.theme-descriptor;; +vnd.flatland.3dml;; +vnd.iptc.newsml;; +vnd.iptc.nitf;; +vnd.latex-z;; +vnd.motorola.reflex;; +vnd.ms-mediapackage;; +vnd.radisys.msml-basic-layout;; +vnd.si.uricatalogue;; +xml-external-parsed-entity;; + +38:text:I:E +calendar;ics,icz,ifb,vcs; +css;css;8bit +csv;csv;8bit +ecmascript;js; +html;html,htm,htmlx,shtml,htx,acgi,htmls;8bit +javascript;js; +n3;n3; +plain;txt,brf,conf,def,list,in,g,idc,lst,sdml,ini;8bit +prs.fallenstein.rst;rst; +prs.lines.tag;dsc; +richtext;rtx,rt,rtf;8bit +rtf;rtf;8bit +sgml;sgml,sgm; +tab-separated-values;tsv; +troff;t,tr,roff,man,me,ms; +turtle;ttl; +uri-list;uri,uris,urls,uni,unis; +vcard;vcard,vcf,vct,gcrd; +vnd.abc;abc; +vnd.curl.dcurl;dcurl; +vnd.curl.mcurl;mcurl; +vnd.curl.scurl;scurl; +vnd.curl;curl; +vnd.dvb.subtitle;sub; +vnd.fly;fly; +vnd.fmi.flexstor;flx; +vnd.graphviz;gv,dot; +vnd.in3d.3dml;3dml; +vnd.in3d.spot;spot; +vnd.net2phone.commcenter.command;ccc; +vnd.rn-realtext;rt; +vnd.sun.j2me.app-descriptor;jad;8bit +vnd.trolltech.linguist;ts; +vnd.wap.si;si; +vnd.wap.sl;sl; +vnd.wap.wml;wml; +vnd.wap.wmlscript;wmls; +xml;xml; + +7:video:: +x-anim;; +x-example;; +x-h265;; +x-isivideo;; +x-iso.segment;; +x-vp8;; +x-wavelet;; + +44:video::E +x-amt-demorun;xdr; +x-amt-showrun;xsr; +x-animaflex;afl; +x-annodex;axv; +x-atomic3d-feature;fmf; +x-avi;avi; +x-avs-video;avs; +x-dl;dl;base64 +x-dv;dif,dv; +x-f4v;f4v; +x-fli;fli;base64 +x-flic;fli,flc; +x-flv;flv;base64 +x-gl;gl;base64 +x-isvideo;isu; +x-javafx;fxm; +x-jpm;jpm,jpgm; +x-la-asf;lsf,lsx; +x-m4v;m4v; +x-matroska-3d;mk3d; +x-matroska;mpv,mkv,mk3d,mks; +x-mng;mng; +x-motion-jpeg;mjpg; +x-mpeg;mp2,mp3; +x-mpeq2a;mp2; +x-ms-asf-plugin;asx; +x-ms-asf;asf,asx; +x-ms-vob;vob; +x-ms-wm;wm; +x-ms-wmv;wmv; +x-ms-wmx;wmx; +x-ms-wvx;wvx; +x-msvideo;avi,avf,divx;base64 +x-nsv;nsv; +x-ogm+ogg;ogm; +x-qtc;qtc; +x-scm;scm; +x-sgi-movie;movie,mv;base64 +x-smv;smv; +x-theora+ogg;ogg; +x-vdo;vdo; +x-vivo;viv,vivo; +x-vosaic;vos; +x-webm;webm;base64 + +45:video:I: +1d-interleaved-parityfec;; +3gpp-tt;; +bmpeg;; +bt656;; +celb;; +encaprtp;; +h263-1998;; +h263-2000;; +h264-rcdo;; +h264-svc;; +jpeg2000;; +mp1s;; +mp2p;; +mp4v-es;; +mpeg4-generic;; +mpv;; +nv;; +parityfec;; +pointer;; +raptorfec;; +raw;; +rtp-enc-aescm128;; +rtploopback;; +rtx;; +smpte292m;; +ulpfec;; +vc1;; +vnd.cctv;; +vnd.dece.mp4;; +vnd.directv.mpeg-tts;; +vnd.directv.mpeg;; +vnd.dlna.mpeg-tts;; +vnd.hns.video;; +vnd.iptvforum.1dparityfec-1010;; +vnd.iptvforum.1dparityfec-2005;; +vnd.iptvforum.2dparityfec-1010;; +vnd.iptvforum.2dparityfec-2005;; +vnd.iptvforum.ttsavc;; +vnd.iptvforum.ttsmpeg2;; +vnd.motorola.video;; +vnd.motorola.videop;; +vnd.mts;; +vnd.nokia.videovoip;; +vnd.radgamettools.bink;; +vnd.radgamettools.smacker;; + +31:video:I:E +3gpp2;3g2,3gpp2,3gp2;base64 +3gpp;3gp,3gpp,3ga;base64 +dv;dif,dv; +h261;h261; +h263;h263; +h264;h264; +jpeg;jpgv; +mj2;mj2,mjp2; +mp2t;ts,m2t,m2ts,mts,cpi,clpi,mpl,mpls,bdm,bdmv; +mp4;mp4,f4v,f4p,mp4v,mpg4,m4v,lrv; +mpeg;mp2,mpe,mpeg,mpg,m1v,m2v,mp3,mpa,vob;base64 +ogg;ogv,ogg; +quicktime;qt,mov,moov,qtvr;base64 +vnd.dece.hd;uvh,uvvh; +vnd.dece.mobile;uvm,uvvm; +vnd.dece.pd;uvp,uvvp; +vnd.dece.sd;uvs,uvvs; +vnd.dece.video;uvv,uvvv; +vnd.dvb.file;dvb; +vnd.fvt;fvt; +vnd.mpegurl;mxu,m4u,m1u;8bit +vnd.ms-playready.media.pyv;pyv; +vnd.nokia.interleaved-multimedia;nim; +vnd.objectvideo;mp4; +vnd.rn-realvideo;rv,rvx; +vnd.sealed.mpeg1;s11; +vnd.sealed.mpeg4;smpg,s14; +vnd.sealed.swf;sswf,ssw; +vnd.sealedmedia.softseal.mov;smov,smo,s1q; +vnd.uvvu.mp4;uvu,uvvu; +vnd.vivo;viv,vivo; + +54:x-chemical::E +x-alchemy;alc; +x-cache-csf;csf; +x-cache;cac,cache; +x-cactvs-binary;cbin,cascii,ctab; +x-cdx;cdx; +x-cerius;cer; +x-chem3d;c3d; +x-chemdraw;chm; +x-cif;cif; +x-cmdf;cmdf; +x-cml;cml; +x-compass;cpa; +x-crossfire;bsd; +x-csml;csml,csm; +x-ctx;ctx; +x-cxf;cxf,cef; +x-embl-dl-nucleotide;emb,embl; +x-galactic-spc;spc; +x-gamess-input;inp,gam,gamin; +x-gaussian-checkpoint;fch,fchk; +x-gaussian-cube;cub; +x-gaussian-input;gau,gjc,gjf; +x-gaussian-log;gal; +x-gcg8-sequence;gcg; +x-genbank;gen; +x-hin;hin; +x-isostar;istr,ist; +x-jcamp-dx;jdx,dx; +x-kinemage;kin; +x-macmolecule;mcm; +x-macromodel-input;mmd,mmod; +x-mdl-molfile;mol; +x-mdl-rdfile;rd; +x-mdl-rxnfile;rxn; +x-mdl-sdfile;sd,sdf; +x-mdl-tgf;tgf; +x-mmcif;mcif; +x-mol2;mol2; +x-molconn-z;b; +x-mopac-graph;gpt; +x-mopac-input;mop,mopcrt,mpc,zmt; +x-mopac-out;moo; +x-mopac-vib;mvb; +x-ncbi-asn1-ascii;prt,ent; +x-ncbi-asn1-binary;val,aso; +x-ncbi-asn1-spec;asn; +x-ncbi-asn1;asn; +x-pdb;pdb,ent,xyz; +x-rosdal;ros; +x-swissprot;sw; +x-vamas-iso14976;vms; +x-vmd;vmd; +x-xtel;xtel; +x-xyz;xyz; + +1:x-conference::E +x-cooltalk;ice; + +18:x-content:: +x-audio-cdda;; +x-audio-dvd;; +x-audio-player;; +x-blank-bd;; +x-blank-cd;; +x-blank-dvd;; +x-blank-hddvd;; +x-ebook-reader;; +x-image-dcf;; +x-image-picturecd;; +x-software;; +x-unix-software;; +x-video-bluray;; +x-video-dvd;; +x-video-hddvd;; +x-video-svcd;; +x-video-vcd;; +x-win32-software;; + +1:x-drawing::E +x-dwf;dwf; + +1:x-epoc::E +x-sisx-app;sisx; + +1:x-font:: +x-sfnt;; + +6:x-font::E +x-collection;ttc; +x-opentype;otf; +x-otf;otf; +x-ttf;ttf; +x-woff2;woff2; +x-woff;woff; + +1:x-i-world::E +x-i-vrml;ivr; + +8:x-inode:: +x-blockdevice;; +x-chardevice;; +x-directory-locked;; +x-directory;; +x-fifo;; +x-mount-point;; +x-socket;; +x-symlink;; + +3:x-music::E +x-crescendo;mid,midi; +x-karaoke;kar; +x-midi;mid,midi; + +1:x-paleovu::E +x-pv;pvu; + +1:x-windows::E +x-metafile;wmf; + +4:x-world::E +x-3dmf;3dm,3dmf,qd3,qd3d; +x-svr;svr; +x-vrml;wrl,vrml,vrm,wrz; +x-vrt;vrt; + +1:x-www::E +x-mime;mime; + +2:x-xgl::E +x-drawing;xgz; +x-movie;xmz; + diff --git a/cpan/dist/MIME-Types/lib/MojoX/MIME/Types.pm b/cpan/dist/MIME-Types/lib/MojoX/MIME/Types.pm new file mode 100644 index 00000000..9542036f --- /dev/null +++ b/cpan/dist/MIME-Types/lib/MojoX/MIME/Types.pm @@ -0,0 +1,60 @@ +# Copyrights 1999,2001-2017 by [Mark Overmeer]. +# For other contributors see ChangeLog. +# See the manual pages for details on the licensing terms. +# Pod stripped from pm file by OODoc 2.02. +package MojoX::MIME::Types; +use vars '$VERSION'; +$VERSION = '2.14'; + +use Mojo::Base -base; + +use MIME::Types (); + + +sub new(%) +{ # base new() constructor incorrect: should call init() + my $self = shift->SUPER::new(@_); + $self->{MMT_mt} = delete $self->{mime_types} || MIME::Types->new; + $self; +} + +#---------- + +sub mimeTypes() { shift->{MMT_mt} } + + +sub types(;$) +{ my $self = shift; + return $self->{MMT_ext} if $self->{MMT_ext}; + + my %exttable; + my $t = MIME::Types->_MojoExtTable; + while(my ($ext, $type) = each %$t) { $exttable{$ext} = [$type] } + $self->{MMT_ext} = \%exttable; +} + +#---------- + +sub detect($$;$) +{ my ($self, $accept, $prio) = @_; + my $mt = $self->mimeTypes; + my @ext = map $_->extensions, grep defined, map $mt->type($_), + grep !/\*/, $mt->httpAccept($accept); + \@ext; +} + + +sub type($;$) +{ my ($self, $ext, $types) = @_; + + my $mt = $self->mimeTypes; + defined $types + or return $mt->mimeTypeOf($ext); + + # stupid interface compatibility! + $self; +} + +#--------------- + +1; diff --git a/cpan/dist/MIME-Types/lib/MojoX/MIME/Types.pod b/cpan/dist/MIME-Types/lib/MojoX/MIME/Types.pod new file mode 100644 index 00000000..bd266fcd --- /dev/null +++ b/cpan/dist/MIME-Types/lib/MojoX/MIME/Types.pod @@ -0,0 +1,215 @@ +=encoding utf8 + +=head1 NAME + +MojoX::MIME::Types - MIME Types for Mojolicious + +=head1 INHERITANCE + + MojoX::MIME::Types + is a Mojo::Base + +=head1 SYNOPSIS + + use MojoX::MIME::Types; + + # set in Mojolicious as default + $app->types(MojoX::MIME::Types->new); + app->types(MojoX::MIME::Types->new); # ::Lite + + # basic interface translated into pure MIME::Types + $types->type(foo => 'text/foo'); + say $types->type('foo'); + +=head1 DESCRIPTION + +[Added to MIME::Types 2.07] +This module is a drop-in replacement for Mojolicious::Types, but +with a more correct handling plus a complete list of types... a huge +list of types. + +Some methods ignore information they receive: those parameters are +accepted for compatibility with the Mojolicious::Types interface, +but should not contain useful information. + +Read the L</DETAILS> below, about how to connect this module into +Mojolicious and the differences you get. + +=head1 METHODS + +=head2 Constructors + +=over 4 + +=item MojoX::MIME::Types-E<gt>B<new>(%options) + +Create the 'type' handler for Mojolicious. When you do not specify your +own MIME::Type object ($mime_type), it will be instantanted for you. +You create one yourself when you would like to pass some parameter to +the object constructor. + + -Option --Default + mime_types <created internally> + types undef + +=over 2 + +=item mime_types => MIME::Types-object + +Pass your own prepared L<MIME::Types|MIME::Types> object, when you need some +instantiation parameters different from the defaults. + +=item types => HASH + +Ignored. + +=back + +example: + + $app->types(MojoX::MIME::Types->new); + + # when you need to pass options to MIME::Types->new + my $mt = MIME::Types->new(%opts); + my $types = MojoX::MIME::Types->new(mime_types => $mt); + $app->types($types); + +=back + +=head2 Attributes + +=over 4 + +=item $obj-E<gt>B<mimeTypes>() + +Returns the internal mime types object. + +=item $obj-E<gt>B<types>( [\%table] ) + +In Mojolicious::Types, this attribute exposes the internal +administration of types, offering to change it with using a clean +abstract interface. That interface mistake bites now we have more +complex internals. + +B<Avoid this method!> The returned HASH is expensive to construct, +changes passed via C<%table> are ignored: L<MIME::Types|MIME::Types> is very complete! + +=back + +=head2 Actions + +=over 4 + +=item $obj-E<gt>B<detect>( $accept, [$prio] ) + +Returns a list of filename extensions. The $accept header in HTTP can +contain multiple types, with a priority indication ('q' attributes). +The returned list contains a list with extensions, the extensions related +to the highest priority type first. The C<$prio>-flag is ignored. +See L<MIME::Types::httpAccept()|MIME::Types/"HTTP support">. + +This detect() function is not the correct approach for the Accept header: +the "Accept" may contain wildcards ('*') in types for globbing, which +does not produce extensions. Better use L<MIME::Types::httpAcceptBest()|MIME::Types/"HTTP support"> +or L<MIME::Types::httpAcceptSelect()|MIME::Types/"HTTP support">. + +example: + + my $exts = $types->detect('application/json;q=9'); + my $exts = $types->detect('text/html, application/json;q=9'); + +=item $obj-E<gt>B<type>( $ext, [$type|\@types] ) + +Returns the first type name for an extension $ext, unless you specify +type names. + +When a single $type or an ARRAY of @types are specified, the C<$self> +object is returned. Nothing is done with the provided info. + +=back + +=head1 DETAILS + +=head2 Why? + +The Mojolicious::Types module has only very little knowledge about +what is really needed to treat types correctly, and only contains a tiny +list of extensions. L<MIME::Types|MIME::Types> tries to follow the standards +very closely and contains all types found in various lists on internet. + +=head2 How to use with Mojolicious + +Start your Mojo application like this: + + package MyApp; + use Mojo::Base 'Mojolicious'; + + sub startup { + my $self = shift; + ... + $self->types(MojoX::MIME::Types->new); + } + +If you have special options for L<MIME::Types::new()|MIME::Types/"Constructors">, then create +your own MIME::Types object first: + + my $mt = MIME::Types->new(%opts); + my $types = MojoX::MIME::Types->new(mime_types => $mt); + $self->types($types); + +In any case, you can reach the smart L<MIME::Types|MIME::Types> object later as + + my $mt = $app->types->mimeTypes; + my $mime = $mt->mimeTypeOf($filename); + +=head2 How to use with Mojolicious::Lite + +The use in Mojolicious::Lite applications is only slightly different +from above: + + app->types(MojoX::MIME::Types->new); + my $types = app->types; + +=head2 Differences with Mojolicious::Types + +There are a few major difference with Mojolicious::Types: + +=over 4 + +=item * + +the tables maintained by L<MIME::Types|MIME::Types> are complete. So: there shouldn't +be a need to add your own types, not via L<types()|MojoX::MIME::Types/"Attributes">, not via L<type()|MojoX::MIME::Types/"Actions">. +All attempts to add types are ignored; better remove them from your code. + +=item * + +This plugin understands the experimental flag 'x-' in types and handles +casing issues. + +=item * + +Updates to the internal hash via types() are simply ignored, because it +is expensive to implement (and won't add something new). + +=item * + +The L<detect()|MojoX::MIME::Types/"Actions"> is implemented in a compatible way, but does not understand +wildcards ('*'). You should use L<MIME::Types::httpAcceptBest()|MIME::Types/"HTTP support"> or +L<MIME::Types::httpAcceptSelect()|MIME::Types/"HTTP support"> to replace this broken function. + +=back + +=head1 SEE ALSO + +This module is part of MIME-Types distribution version 2.14, +built on November 08, 2017. Website: F<http://perl.overmeer.net/mimetypes/> + +=head1 LICENSE + +Copyrights 1999,2001-2017 by [Mark Overmeer]. For other contributors see ChangeLog. + +This program is free software; you can redistribute it and/or modify it +under the Artistic license. +See F<http://dev.perl.org/licenses/artistic.html> + diff --git a/cpan/dist/MIME-Types/t/21accept.t b/cpan/dist/MIME-Types/t/21accept.t new file mode 100644 index 00000000..395946ad --- /dev/null +++ b/cpan/dist/MIME-Types/t/21accept.t @@ -0,0 +1,36 @@ +#!/usr/bin/env perl +# +# Test httpAccept() +# + +use strict; +use warnings; + +use Test::More tests => 9; + +use lib qw(lib t); + +use MIME::Types; + +my $a = MIME::Types->new; +ok(defined $a); + +# simpelest case +my @t1 = $a->httpAccept('text/html'); +cmp_ok(scalar @t1, '==', 1, 'simpelest case'); +is($t1[0], 'text/html'); + +# more than one +my @t2 = $a->httpAccept('text/html, text/aap, text/noot'); +cmp_ok(scalar @t2, '==', 3, 'more than one'); +is($t2[0], 'text/html', 'order must be kept'); +is($t2[1], 'text/aap'); +is($t2[2], 'text/noot'); + +# with quality + +my @t3 = $a->httpAccept('*/*, text/*,text/aap, text/noot;q=3, text/mies;q=0.1'); +cmp_ok(scalar @t3, '==', 5, 'quality'); +is(join('#',@t3), 'text/noot#text/aap#text/*#*/*#text/mies'); + + diff --git a/cpan/dist/MIME-Types/t/22accbest.t b/cpan/dist/MIME-Types/t/22accbest.t new file mode 100644 index 00000000..6a123b0e --- /dev/null +++ b/cpan/dist/MIME-Types/t/22accbest.t @@ -0,0 +1,68 @@ +#!/usr/bin/env perl +# +# Test httpAcceptBest and httpAcceptSelect() +# + +use strict; +use warnings; + +use Test::More tests => 25; + +use lib qw(lib t); + +use MIME::Types; + +my $mt = MIME::Types->new; +ok(defined $mt); + +my @have = map $mt->type($_), qw[text/plain text/html application/pdf]; +cmp_ok(scalar @have, '==', 3, 'create offers'); +isa_ok($_, 'MIME::Type') for @have; + +ok($have[0]->equals('text/plain'), 'equal'); +ok(!$have[0]->equals('text/html'), 'not equal'); + +# remember that order is important +my $t0 = $mt->httpAcceptBest(['text/plain'], @have); +is($t0, 'text/plain', 'single'); + +my $t1 = $mt->httpAcceptBest(['text/plain', 'text/html'], @have); +is($t1, 'text/plain', 'first'); + +my $t2 = $mt->httpAcceptBest(['text/html', 'text/plain'], @have); +is($t2, 'text/html', 'second'); + +my $t3 = $mt->httpAcceptBest(['text/xyz', 'text/plain'], @have); +is($t3, 'text/plain', 'second2'); + +my $t4 = $mt->httpAcceptBest('text/html, application/pdf', @have); +is($t4, 'text/html', 'string'); + + + +### Select() + +is($mt->mimeTypeOf('txt'), 'text/plain', 'test mimeTypeOf'); +is($mt->mimeTypeOf('a.txt'), 'text/plain'); + +my ($f0, $m0) = $mt->httpAcceptSelect(undef, ['a.txt', 'a.html']); +is($f0, 'a.txt', 'no Accept, take first'); +isa_ok($m0, 'MIME::Type'); +is("$m0", 'text/plain'); + +my ($f1, $m1) + = $mt->httpAcceptSelect('text/plain, text/html', ['a.txt', 'a.html']); +is($f1, 'a.txt', 'select text'); +isa_ok($m1, 'MIME::Type'); +is("$m1", 'text/plain'); + +my ($f2, $m2) + = $mt->httpAcceptSelect('text/html, text/plain', ['a.txt', 'a.html']); +is($f2, 'a.html', 'select html'); +isa_ok($m2, 'MIME::Type'); +is("$m2", 'text/html'); + +my ($f3, $m3) + = $mt->httpAcceptSelect('text/html, text/plain', ['a.pdf', 'a.docx']); +ok(!defined $f3, 'not accepted'); +ok(!defined $m3); diff --git a/cpan/dist/MIME-Types/t/40mojo.t b/cpan/dist/MIME-Types/t/40mojo.t new file mode 100644 index 00000000..5c784358 --- /dev/null +++ b/cpan/dist/MIME-Types/t/40mojo.t @@ -0,0 +1,38 @@ +#!/usr/bin/env perl +# +# Test Mojo plugin +# + +use strict; +use warnings; + +use lib qw(lib t); +use Test::More; + +eval "require Mojo::Base"; +plan skip_all => 'Mojo probably not installed' if $@; + +plan tests => 14; + +require_ok('MojoX::MIME::Types'); + +my $m = MojoX::MIME::Types->new; +isa_ok($m, 'MojoX::MIME::Types'); +isa_ok($m->mimeTypes, 'MIME::Types'); + +my $t = $m->types; +isa_ok($t, 'HASH', 'types table (deprecated)'); +cmp_ok(keys %$t, '>', 1000, 'MIME::Types describes '.(keys %$t).' extensions'); +ok(exists $t->{txt}); +isa_ok($t->{txt}, 'ARRAY'); +cmp_ok(@{$t->{txt}}, '==', 1); +is($t->{txt}[0], 'text/plain'); + +my $ext = $m->detect('text/html, application/json;q=9'); +isa_ok($ext, 'ARRAY', 'detect() reports '.@$ext); +ok(grep $_ eq 'html', @$ext, 'contains html'); +ok(grep $_ eq 'json', @$ext, 'contains json'); + +is($m->type('html'), 'text/html', 'type($ext)'); + +is_deeply $m->detect('image/missing'), [], 'missing type'; diff --git a/cpan/dist/MIME-Types/xt/98perl.t b/cpan/dist/MIME-Types/xt/98perl.t new file mode 100644 index 00000000..d4b15d4c --- /dev/null +++ b/cpan/dist/MIME-Types/xt/98perl.t @@ -0,0 +1,8 @@ +#!/usr/bin/env perl +use warnings; +use strict; + +use Test::More; +use Test::MinimumVersion; +all_minimum_version_ok("5.008"); + diff --git a/cpan/dist/MIME-Types/xt/99pod.t b/cpan/dist/MIME-Types/xt/99pod.t new file mode 100644 index 00000000..a1c08e68 --- /dev/null +++ b/cpan/dist/MIME-Types/xt/99pod.t @@ -0,0 +1,15 @@ +#!/usr/bin/env perl +use warnings; +use strict; + +use Test::More; + +BEGIN +{ eval "use Test::Pod 1.00"; + plan skip_all => "Test::Pod 1.00 required for testing POD" if $@; + + plan skip_all => "devel home uses OODoc" + if $ENV{MARKOV_DEVEL}; +} + +all_pod_files_ok(); diff --git a/cpan/dist/PathTools/Changes b/cpan/dist/PathTools/Changes new file mode 100644 index 00000000..09e977aa --- /dev/null +++ b/cpan/dist/PathTools/Changes @@ -0,0 +1,927 @@ +Revision history for Perl distribution PathTools. + +3.62 - Mon Jan 11 08:39:19 EST 2016 +- ensure File::Spec::canonpath() preserves taint (CVE-2015-8607) + +3.61 - Sun Dec 20 12:00:00 EST 2015 (bleadperl only release) +- improve performance of cwd on Win32 miniperl + +3.60 - Wed Nov 18 21:28:01 EST 2015 +- add File::Spec::AmigaOS -- and actually ship it, this time + +3.59 - Fri Nov 13 18:38:01 EST 2015 +- no changes since 5.58_01 + +3.58_01 - Mon Nov 9 17:35:28 EST 2015 - TRIAL RELEASE +- add File::Spec::AmigaOS +- fix INSTALLDIRS on post-5.10 perls + +3.56_02 - Thu Jul 16 11:28:57 EDT 2015 - TRIAL RELEASE +- fix $VERSION in loaded modules + +3.56_01 - Sat Jul 11 18:07:28 EDT 2015 - TRIAL RELEASE +- CPAN release of the PathTools included in perl v5.22.0 +- support for z/OS sysplexed systems +- long-deprecated "fixpath" and "eliminate_macros" VMS functions removed +- avoid turning leading // into / on cygwin +- Force barename base to be a directory in File::Spec::VMS:abs2rel +- Revise Unix syntax detection File::Spec::VMS::abs2rel +- compiles on Android now +- fewer compiler warnings +- eliminate some runtime perl warnings, too + +3.47 - Fri May 23 18:52:00 2014 +- Improved Android support. +- File::Spec::Unix->tmpdir: Always return an absolute path +- File::Spec now has an XS version for performance. +- QNX and VMS portability +- tmpdir is updated when the environment changes. + +3.40 - Wed Jan 16 07:30:00 2013 +- Stop inadvertently skipping Spec.t on VMS. (Craig Berry) +- Rethink EFS in File::Spec::VMS. (Craig Berry) +- File::Spec::UNIX->abs2rel() gets it wrong with ".." components + [perl #111510] (Volker Schatz) +- Add C define to remove taint support from perl (Steffen Mueller) +- Remove "register" declarations as they are no longer + useful (Karl Williamson) +- Add test for fast_abs_path in LF dir + [perl #115962] (Father Chrysostomos) +- Cwd::fast_abs_path's untaint should allow for multiline + directories (Joel Berger) + +3.39_01 - Tue Dec 20 08:30:00 2011 +- [perl #51562] Problem & "solution" for building 5.10.0 with + win32+mingw+dmake (kmx) +- Fix various compiler warnings from XS code (Zefram) +- Fix typos (spelling errors) (Peter J. Acklam) +- Remove Mac OS classic only tests from Cwd's Spec.t + and special case code from Cwd's cwd.t (Nicholas Clark) +- Convert File::Spec's remaining tests to Test::More from Test + (Nicholas Clark) +- dist/Cwd/lib/File/Spec/Win32.pm: Fix broken link (Karl Williamson) +- In Cwd::_win32_cwd() avoid a string eval when checking if we're + miniperl (Nicholas Clark) +- Add PERL_NO_GET_CONTEXT to Cwd (Nicholas Clark) +- In Cwd.xs on VMS, don't compile bsd_realpath() at all (Nicholas Clark) +- Merge the implementation of Cwd::{fastcwd,getcwd} using + ALIAS (Nicholas Clark) +- In Cwd.xs, swap to defaulting to disabled prototypes (Nicholas Clark) +- Remove duplicate $VERSION handling code, made redundant + in 3.28_01 (Nicholas Clark) +- In Cwd.xs, tidy the conditional code related to symlinks + (Nicholas Clark) +- Keep verbatim pod within 80 cols (Father Chrysostomos) +- [RT #36079] Convert ` to ' in docs (Jim Keenan) +- [rt.cpan.org #45885] File::Spec: Don’t use tainted tmpdir + in 5.6 (Father Chrysostomos) + +3.33 - Mon Sep 20 18:00:00 2010 +- No functional changes since the previous release. +- Fixes POD links + (part of core change2a6dc37471bea77f0c24fd1fe90c598a270c9968, + Florian Ragwitz) + +3.32 - Sun Sep 19 18:00:00 2010 + +- Promote to stable release. + +3.31_03 - Fri Sep 17 20:00:00 2010 + +- Colon delimiter and escaped delimiters for File::Spec::VMS + This is core change 61196b433b2b (Craig A. Berry) + +3.31_02 - Fri Jul 23 20:00:00 2010 + +- Add TODO test for File::Spec->rel2abs() when under a symlink. +- Make catpath return an empty directory rather than the current + directory if the directory name is empty. This allows catpath + to play nice with non-rooted logical names, as in + catpath('sys$login:', '', 'login.com'); + (Craig A. Berry) +- Fix abs2rel bug in handling a Unix-style input. + (Craig A. Berry) +- Assorted clarification and simplification of the documentation. + (Craig A. Berry) + +3.31 - Sun Nov 1 15:15:00 2009 + +- Do not pack a Build.PL to avoid a circular dependency involving + ExtUtils::CBuilder (PathTools RT #50749) + +3.30_02 - Tue Sep 29 08:17:00 2009 + +- Remove more special logic required for core perl. + +3.30_01 - Mon Sep 21 14:39:00 2009 + +- Merge changes from core perl. + (Mostly changes regarding the lib->ext migration) + +3.30 - Sun May 10 10:55:00 2009 + +- Promote to stable release. + +3.29_01 - Thu May 7 20:22:00 2009 + +- Minor fixes for QNX6. [Sean Boudreau] + +- Update to support VMS in Unix compatible mode and/or file names using + extended character sets. (RT #42154) [John Malmberg] + +- VMS support for Unix and extended file specifications in File::Spec + (RT #42153) [John Malmberg] + +3.29 - Wed Oct 29 20:48:11 2008 + +- Promote to stable release. + +3.28_03 - Mon Oct 27 22:12:11 2008 + +- In Cwd.pm, pass the un-munged $VERSION to XSLoader/DynaLoader, + otherwise development releases fail tests on Win32. + +3.28_02 - Mon Oct 27 20:13:11 2008 + + - Fixed some issues on QNX/NTO related to paths with double + slashes. [Matt Kraai & Nicholas Clark] + +3.28_01 - Fri Jul 25 21:18:11 2008 + + - Fixed and clarified the behavior of splitpath() with a $no_file + argument on VMS. [Craig A. Berry, Peter Edwards] + + - Removed some function prototypes and other Perl::Critic violations. + + - canonpath() and catdir() and catfile() on Win32 now make an + explicit (and unnecessary) copy of their arguments right away, + because apparently if we don't, we sabotage all of Win32dom. [RT + #33675] + + - The Makefile.PL now has 'use 5.005;' to explicitly show what + minimum version of perl we support. [Spotted by Alexandr Ciornii] + +3.2701 - Mon Feb 11 21:43:51 2008 + + - Fixed an edge case for Win32 catdir('C:', 'foo') and catfile('C:', + 'foo.txt') (which the caller's not really supposed to do, that's + what catpath() is for) that changed between versions. Now we're + back to the old behavior, which was to return C:\foo and C:\foo.txt . + [Audrey Tang] + +3.27 - Wed Jan 16 20:20:49 2008 + + - If strlcpy() and strlcat() aren't available on the user's system, + we now use ppport.h to provide them, so our C code works. [Steve + Peters] + + - Upgraded to a newer version of ppport.h [Steve Peters] + +3.26 - Sun Jan 13 21:59:20 2008 + + - case_tolerant() on Cygwin will now avoid a painful death when + Cygwin::mount_flags() isn't defined, as is the case for perl < + 5.10. It will now just return 1, which is what it always did + before it got so smart. [Spotted by Emanuele Zeppieri] + + - abs_path() on Unix(ish) platforms has been upgraded to a much later + version of the underlying C code from BSD. [Michael Schwern] + +3.2501 - Mon Dec 24 20:33:02 2007 + + - Reimplemented abs_path() on VMS to use + VMS::Filespec::vms_realpath() when it's available. [John E. Malmberg] + + - tmpdir() on Cygwin now also looks in $ENV{TMP} and $ENV{TEMP}. + + - case_tolerant() on Cygwin and Win32 now take an optional path + argument, defaulting to the C drive, to check for case tolerance, + because this fact can vary on different volumes. + + - File::Spec on Unix now uses Cwd::getcwd() rather than Cwd::cwd() to + get the current directory because I guess someone on p5p thought it + was more appropriate. + + - Added a large set of File::Spec tests for the Cygwin platform. + + - abs_path() now behaves correctly with symbolic links on VMS. + + - Someone fixed a couple of mysterious edge cases in VMS' canonpath() + and splitdir(). + +3.25_01 - Sat Oct 13 21:13:57 2007 + + - Major fixes on Win32, including a rewrite of catdir(), catfile(), + and canonpath() in terms of a single body of code. [Heinrich Tegethoff] + + - For Win32 and Cygwin, case-tolerance can vary depending on the + volume under scrutiny. When Win32API::File is available, it will + be employed to determine case-sensitivity of the given filesystem + (C: by default), otherwise we still return the default of 1. [Reini + Urban] + + - On Cygwin, we added $ENV{'TMP'} and $ENV{'TEMP'} to the list of + possible places to look for tmpdir() return values. [Reini Urban] + + - Added lots more tests for Cygwin. [Reini Urban] + + - canonpath() with no arguments and canonpath(undef) now consistently + return undef on all platforms. [Spotted by Peter John Edwards] + + - Fixed splitdir('') and splitdir(undef) and splitdir() to return an + empty list on VMS and MacOS, like it does on other platforms. + [Craig A. Berry] + + - All .pm files now have the same $VERSION number, rather than a + hodgepodge of various numbers. + +3.25 - Mon May 21 21:07:26 2007 + + - Added a workaround for auto-vivication-of-function-args Perl bug + (triggered by OS/2-specific code). [Ilya Zakharevich] + + - Sync with a bleadperl change: miniperl can no longer use Win32::* + functions because it cannot load Win32.dll. [Jan Dubois] + + - We only need to load ppport.h when building outside the core, so we + avoid using it when in the core. + +3.24 - Sun Nov 19 22:52:49 2006 + + - Fixed a bug in the $ENV{PWD}-updating of Cwd::chdir() when a + dirhandle is passed in. [Steve Peters] + + - Add perl 5.005 to the list of requirements in the + Build.PL/Makefile.PL/META.yml. + + - Add ExtUtils::CBuilder to the list of build_requires in Build.PL. + + - Improved performance of canonpath() on Unix-ish platforms - on my + OS X laptop it looks like it's about twice as fast. [Ruslan Zakirov] + +3.23 - Wed Oct 11 12:11:25 2006 + + - Yet more Win32 fixes (sigh... seems like I'm fighting a neverending + waterbed...). This time, fixed file_name_is_absolute() to know + what it's doing when the path includes a volume but a relative + path, like C:foo.txt . This bug had impact in rel2abs() on Win32 + too. + +3.22 - Mon Oct 9 21:50:52 2006 + + - Fixed the t/crossplatform.t test on Win32 (and possibly other + volume-aware platforms) now that rel2abs() always adds a drive + letter. [Reported by several parties] + +3.21 - Wed Oct 4 21:16:43 2006 + + - Added a bunch of X<> tags to the File::Spec docs to help + podindex. [Gabor Szabo] + + - On Win32, abs2rel('C:\one\two\t\foo', 't\bar') should return + '..\foo' when the cwd is 'C:\one\two', but it wasn't noticing that + the two relevant volumes were the same so it would return the full + path 'C:\one\two\t\foo'. This is fixed. [Spotted by Alexandr + Ciornii] + + - On Win32, rel2abs() now always adds a volume (drive letter) if the + given path doesn't have a volume (drive letter or UNC volume). + Previously it could return a value that didn't have a volume if the + input was a semi-absolute path like /foo/bar instead of a + fully-absolute path like C:/foo/bar . + +3.19 Tue Jul 11 22:40:26 CDT 2006 + + - When abs2rel() is called with two relative paths + (e.g. abs2rel('foo/bar/baz', 'foo/bar')) the resolution algorithm + needlessly called cwd() (twice!) to turn both arguments into + absolute paths. Now it avoids the cwd() calls with a workaround, + making a big efficiency win when abs2rel() is called + repeatedly. [Brendan O'Dea] + + - Added a build-time dependency on ExtUtils::Install version 1.39 + when on Windows. This is necessary because version 1.39 knows how + to replace an in-use Cwd shared library, but previous versions + don't. [Suggested by Adam Kennedy] + + - Fixed File::Spec::Win32->canonpath('foo/../bar'), which was + returning \bar, and now properly returns just bar. [Spotted by + Heinrich Tegethoff] + +3.18 Thu Apr 27 22:01:38 CDT 2006 + + - Fixed some problems on VMS in which a directory called "0" would be + treated as a second-class citizen. [Peter (Stig) Edwards] + + - Added a couple of regression tests to make sure abs2rel('/foo/bar', + '/') works as expected. [Chia-liang Kao] + + - Added a couple of regression tests to make sure catdir('/', + 'foo/bar') works as expected. [Mark Grimes] + +3.17 Fri Mar 3 16:52:30 CST 2006 + + - The Cygwin version of Cwd::cwd() will croak if given any arguments + (which can happen if, for example, it's called as Cwd->cwd). Since + that croaking is bad, we now wrap the original cwd() in a + subroutine that ignores its arguments. We could skip this wrapping + if a future version of perl changes cygwin.c's cwd() to not barf + when fed an argument. [Jerry D. Hedden] + +3.16 Mon Jan 30 20:48:41 CST 2006 + + - Updated to version 3.06 of ppport.h, which provides backward + compatibility XS layers for older perl versions. + + - Clarify in the docs for File::Spec's abs2rel() and rel2abs() + methods that the cwd() function it discusses is + Cwd::cwd(). [Spotted by Steven Lembark] + + - Apparently the version of File::Path that ships with perl 5.8.5 + (and perhaps others) calls Cwd::getcwd() with an argument (perhaps + as a method?), which causes it to die with a prototyping error. + We've eliminated the prototype by using the "(...)" arglist, since + "PROTOTYPE: DISABLE" for the function didn't seem to work. [Spotted + by Eamon Daly and others] + +3.15 Tue Dec 27 14:17:39 CST 2005 + + - The Cwd::getcwd() function on *nix is now a direct pass-through to + the underlying getcwd() C library function when possible. This is + safer and faster than the previous implementation, which just did + abs_path('.'). The pure-perl version has been kept for cases in + which the XS version can't load, such as when running under + miniperl. [Suggested by Nick Ing-Simmons] + + - When Cwd searches for a 'pwd' executable in the $PATH, we now stop + after we find the first one rather than continuing the search. We + also avoid the $PATH search altogether when a 'pwd' was already + found in a well-known and well-trusted location like /bin or + /usr/bin. [Suggested by Nick Ing-Simmons] + + - On Win32 abs2rel($path, $base) was failing whenever $base is the + root of a volume (such as C:\ or \\share\dir). This has been + fixed. [Reported by Bryan Daimler] + + - In abs2rel() on VMS, we've fixed handling of directory trees so + that the test $file = File::Spec::VMS->abs2rel('[t1.t2.t3]file', + '[t1.t2.t3]') returns 'file' instead of an empty string. [John + E. Malmberg] + + - In canonpath() on VMS, '[]' was totally optimized away instead of + just returning '[]'. Now it's fixed. [John E. Malmberg] + +3.14 Thu Nov 17 18:08:44 CST 2005 + + - canonpath() has some logic in it that avoids collapsing a + //double/slash at the beginning of a pathname on platforms where + that means something special. It used to check the value of $^O + rather than the classname it was called as, which meant that + calling File::Spec::Cygwin->canonpath() didn't act like cygwin + unless you were actually *on* cygwin. Now it does. + + - Fixed a major bug on Cygwin in which catdir() could sometimes + create things that look like //network/paths in cases when it + shouldn't (e.g. catdir("/", "foo", "bar")). + +3.13 Tue Nov 15 23:50:37 CST 2005 + + - Calling tmpdir() on Win32 had the unintended side-effect of storing + some undef values in %INC for the TMPDIR, TEMP, and TMP entries if + they didn't exist already. This is probably a bug in perl itself + (submitted as #37441 on rt.perl.org), which we're now working + around. [Thomas L. Shinnick] + + - Integrated a change from bleadperl - a certain #ifdef in Cwd.xs + needs to apply to WIN32 but not WinCE. [Vadim Konovalov] + + - abs2rel() used to return the empty string when its two arguments + were identical, which made no sense. Now it returns + curdir(). [Spotted by David Golden] + + - The Unix and Win32 implementations of abs2rel() have been unified. + +3.12 Mon Oct 3 22:09:12 CDT 2005 + + - Fixed a testing error on OS/2 in which a drive letter for the root + directory was confusing things. [Ilya Zakharevich] + + - Integrated a patch from bleadperl for fixing path() on + Win32. [Gisle Aas] + +3.11 Sat Aug 27 20:12:55 CDT 2005 + + - Fixed a couple of typos in the documentation for + File::Spec::Mac. [Piotr Fusik] + +3.10 Thu Aug 25 22:24:57 CDT 2005 + + - eliminate_macros() and fixpath() in File::Spec::VMS are now + deprecated, since they are MakeMaker-specific and now live inside + MakeMaker. [Michael Schwern] + + - canonpath() on Win32 now collapses foo/.. (or foo\..) sections + correctly, rather than doing the "misguided" work it was previously + doing. Note that canonpath() on Unix still does NOT collapse these + sections, as doing so would be incorrect. [Michael Schwern] + +3.09 Tue Jun 14 20:36:50 CDT 2005 + + - Added some block delimiters (brackets) in the Perl_getcwd_sv() XS + function, which were necessary to separate the variable + declarations from the statements when HAS_GETCWD is not + defined. [Yves] + + - Apparently the _NT_cwd() routine is never defined externally like I + thought it was, so I simplified the code around it. + + - When cwd() is implemented using the _backtick_pwd() function, it + sometimes could create accidental undef entries in %ENV under perl + 5.6, because local($hash{key}) is somewhat broken. This is now + fixed with an appropriate workaround. [Neil Watkiss] + +3.08 Sat May 28 10:10:29 CDT 2005 + + - Fixed a test failure with fast_abs_path() on Windows - it was + sensitive to the rootdir() change from version 3.07. [Steve Hay] + +3.07 Fri May 6 07:46:45 CDT 2005 + + - Fixed a bug in which the special perl variable $^O would become + tainted under certain versions of perl. [Michael Schwern] + + - File::Spec->rootdir() was returning / on Win32. Now it returns \ . + [Michael Schwern] + + - We now avoid modifying @_ in tmpdir() when it's not strictly + necessary, which reportedly provides a modest performance + boost. [Richard Soderberg] + + - Made a couple of slight changes to the Win32 code so that it works + (or works better) on Symbian OS phones. [Jarkko Hietaniemi] + +3.06 Wed Apr 13 20:47:26 CDT 2005 + + (No changes in functionality) + + - Added a note to the canonpath() docs about why it doesn't collapse + foo/../bar sections. + + - The internal-only function bsd_realpath() in the XS file now uses + normal arg syntax instead of K&R syntax. [Nicholas Clark] + +3.05 Mon Feb 28 07:22:58 CST 2005 + + - Fixed a bug in fast_abs_path() on Win32 in which forward- and + backward-slashes were confusing things. [demerphq] + + - Failure to load the XS code in Cwd is no longer a fatal error + (though failure to compile it is still a fatal error in the build + process). This lets Cwd work under miniperl in the core. [Rafael + Garcia-Suarez] + + - In the t/cwd.t test, don't enforce loading from blib/ if we're + testing in the perl core. [Rafael Garcia-Suarez] + +3.04 Sun Feb 6 17:27:38 CST 2005 + + - For perls older than 5.006, the HAS_GETCWD symbol is not available, + because it wasn't checked for in older Configure scripts when perl + was built. We therefore just ask the user whether the getcwd() C + function is defined on their platform when their perl is old. + Maybe in the future we'll try to automate this. [Reported by + several parties] + + - Remove lib/ppport.h from the distribution, so that MakeMaker + doesn't accidentally pick it up and install it as a lib + file. [Jerry Hedden] + + - Fixed a testing error on VMS that occurred when a user had + read-access to the root of the current volume. [Craig A. Berry] + +3.03 Fri Jan 21 21:44:05 CST 2005 + + - Fixed a testing error if the first file we find in the root + directory is a symlink. [Blair Zajac] + + - Added a test to make sure Cwd.pm is loaded from blib/ during + testing, which seems to be an issue in some people's environments + and makes it awfully hard to debug things on my end. + + - Skip the _perl_abs_path() tests on Cygwin - they don't usually + pass, and this function isn't used there anyway, so I decided not + to push it. Let 'em use `cwd`. + +3.02 Sun Jan 9 19:29:52 CST 2005 + + - Fixed a bug in which Cwd::abs_path() called on a file in the root + directory returned strange results. [Bob Luckin] + + - Straightened out the licensing details for the portion of the Cwd + module that comes from BSD sources. [Hugo van der Sanden] + + - Removed the prototype from _perl_abs_path() and the XS version of + abs_path(), since all they seemed to be doing was causing people + grief, and since some platforms didn't have them anyway. + + - Fixed a testing bug in which sometimes the wrong version of Cwd + (the version already installed on the user's machine) would get + loaded instead of the one we're building & installing. + + - Sometimes getdcwd() returns a lower-case drive letter, so don't + require an upper-case letter in t/win32.t. [Jan Dubois] + + - Fixed a memory leak in getdcwd() on win32. [Steve Hay] + + - Added a copy of ppport.h to the distribution to aid compilation on + older versions of perl. [Suggested by Charlie Root] + + - Don't bother looking for a 'pwd' executable on MSWin32 - there + won't be one, and looking for it can be extremely slow when lots of + disks are mounted. [Several people, including Andrew Burke] + + - Eliminated a multi-argument form of open() that was causing a + syntax error on older versions of perl. [Fixed by Michael Schwern] + + - The bug-fix changes for revision 0.90 of File::Spec somehow were + lost when I merged it into the PathTools distribution. They're + restored now. [Craig A. Berry] + + - File::Spec->canonpath() will now reduce paths like '[d1.-]foo.dat' + down to '[000000]foo.dat' instead of '[]foo.dat' or 'foo.dat'. + This is in better accordance with the native filename syntax + parser. [Craig A. Berry] + + - In order to remove a recursive dependency (PathTools -> Test-Simple + -> Test-Harness -> PathTools), we now include a copy of Test::More in + the distribution. It is only used for testing, it won't be installed + with the rest of the stuff. + + - Removed some 5.6-isms from Cwd in order to get it to build with + older perls like 5.005. + + - abs_path() on Windows was trampling on $ENV{PWD} - fixed. [Spotted + by Neil MacMullen] + + - Added licensing/copyright statements to the POD in each .pm + file. [Spotted by Radoslaw Zielinski] + +3.01 Mon Sep 6 22:28:06 CDT 2004 + + - Removed an unnecessary and confusing dependency on File::Spec from + the Makefile.PL and the Build.PL. + + - Added a 'NAME' entry to the Makefile.PL, because otherwise it won't + even begin to work. [Reported by many] + +3.00 Thu Sep 2 22:15:07 CDT 2004 + + - Merged Cwd and File::Spec into a single PathTools distribution. + This was done because the two modules use each other fairly + extensively, and extracting the common stuff into another + distribution was deemed nigh-impossible. The code in revision 3.00 + of PathTools should be equivalent to the code in Cwd 2.21 and + File::Spec 0.90. + +================================================================== +Prior to revision 3.00, Cwd and File::Spec were maintained as two +separate distributions. The revision history for Cwd is shown here. +The revision history for File::Spec is further below. +================================================================== + +Cwd 2.21 Tue Aug 31 22:50:14 CDT 2004 + + - Removed "NO_META" from the Makefile.PL, since I'm not building the + distribution with MakeMaker anyway. [Rohan Carly] + + - Only test _perl_abs_path() on platforms where it's expected to work + (platforms with '/' as the directory separator). [Craig A. Berry] + +Cwd 2.20 Thu Jul 22 08:23:53 CDT 2004 + + - On some implementations of perl on Win32, a memory leak (or worse?) + occurred when calling getdcwd(). This has been fixed. [PodMaster] + + - Added tests for getdcwd() on Win32. + + - Fixed a problem in the pure-perl implementation _perl_abs_path() + that caused a fatal error when run on plain files. [Nicholas Clark] + To exercise the appropriate test code on platforms that wouldn't + otherwise use _perl_abs_path(), run the tests with $ENV{PERL_CORE} + or $ENV{TEST_PERL_CWD_CODE} set. + +Cwd 2.19 Thu Jul 15 08:32:18 CDT 2004 + + - The abs_path($arg) fix from 2.18 didn't work for VMS, now it's + fixed there. [Craig Berry] + +Cwd 2.18 Thu Jun 24 08:22:57 CDT 2004 + + - Fixed a problem in which abs_path($arg) on some platforms could + only be called on directories, and died when called on files. This + was a problem in the pure-perl implementation _perl_abs_path(). + + - Fixed fast_abs_path($arg) in the same way as abs_path($arg) above. + + - On Win32, a function getdcwd($vol) has been added, which gets the + current working directory of the specified drive/volume. + [Steve Hay] + + - Fixed a problem on perl 5.6.2 when built with the MULTIPLICITY + compile-time flags. [Yitzchak Scott-Thoennes] + + - When looking for a `pwd` system command, we no longer assume the + path separator is ':'. + + - On platforms where cwd() is implemented internally (like Win32), + don't look for a `pwd` command externally. This can greatly speed + up load time. [Stefan Scherer] + + - The pure-perl version of abs_path() now has the same prototype as + the XS version (;$). + +Cwd 2.17 Wed Mar 10 07:55:36 CST 2004 + + - The change in 2.16 created a testing failure when tested from + within a path that contains symlinks (for instance, /tmp -> + /private/tmp). + +Cwd 2.16 Sat Mar 6 17:56:31 CST 2004 + + - For VMS compatibility (and to conform to Cwd's documented + interface), in the regression tests we now compare output results + to an absolute path. [Craig A. Berry] + +Cwd 2.15 Fri Jan 16 08:09:44 CST 2004 + + - Fixed a problem on static perl builds - while creating + Makefile.aperl, it was loading a mismatched version of Cwd from + blib/ . [Reported by Blair Zajac] + +Cwd 2.14 Thu Jan 8 18:51:08 CST 2004 + + - We now use File::Spec->canonpath() and properly-escaped regular + expressions when comparing paths in the regression tests. This + fixes some testing failures in 2.13 on non-Unix platforms. No + changes were made in the actual Cwd module code. [Steve Hay] + +Cwd 2.13 Fri Jan 2 22:29:42 CST 2004 + + - Changed a '//' comment to a '/* */' comment in the XS code, so that + it'll compile properly under ANSI C rules. [Jarkko Hietaniemi] + + - Fixed a 1-character buffer overrun problem in the C code. [The BSD + people] + +Cwd 2.12 Fri Dec 19 17:04:52 CST 2003 + + - Fixed a bug on Cygwin - the output of realpath() should have been + tainted, but wasn't. [Reported by Tom Wyant] + +Cwd 2.10 Mon Dec 15 07:50:12 CST 2003 + + (Note that this release was mistakenly packaged as version 2.11, even + though it had an internal $VERSION variable of 2.10. Not sure how + THAT happened...) + + - There was a dependency in the Makefile.PL on Module::Build, which + isn't necessary. I've removed it. + +Cwd 2.09 Thu Dec 11 20:30:58 CST 2003 + + - The module should now build & install using version 5.6 of perl. + + - We now note a build-time dependency on version 0.19 of + Module::Build, which is necessary because we don't use the standard + lib/-based file layout. No version of Module::Build is required if + you use the Makefile.PL, just if you use the Build.PL . + + - Removed some gratuitous uses of 5.6-isms like our(), with the aim + of backporting this module to perl 5.005. + + - Simplified all code that autoloads Carp.pm and calls + carp()/croak(). + + - Removed some redundant OS/2 code at the suggestion of Michael + Schwern and Ilya Zakharevich. + + - Make sure the correct version of Cwd.pm is loaded in the regression + tests. [Sam Vilain] + +Cwd 2.08 Wed Oct 15 20:56 CDT 2003 + + - Code extracted from perl 5.8.1 and packaged as a separate CPAN + release by Ken Williams. + +================================================================== +Prior to revision 3.00, Cwd and File::Spec were maintained as two +separate distributions. The revision history for File::Spec is shown +here. The revision history for Cwd is above. +================================================================== + +File::Spec 0.90 Tue Aug 31 22:34:50 CDT 2004 + + - On VMS, directories use vmspath() and files use vmsify(), so + rel2abs() has to use some 'educated guessing' when dealing with + paths containing slashes. [Craig A. Berry] + +File::Spec 0.89 Sun Aug 29 19:02:32 CDT 2004 + + - Fixed some pathological cases on VMS which broke canonpath() and + splitdir(). [Richard Levitte and Craig A. Berry] + + - Fixed rel2abs() on VMS when passed a unix-style relative + path. [Craig A. Berry] + +File::Spec 0.88 Thu Jul 22 23:14:32 CDT 2004 + + - rel2abs() on Win32 will now use the new Cwd::getdcwd() function, so + that things like rel2abs('D:foo.txt') work properly when the + current drive isn't 'D'. This requires Cwd version 2.18. + [Steve Hay] + + - Got rid of a redundant double-backslash in a character + class. [Alexander Farber] + + - Added much markup to pod for enhanced readability. [Andy Lester] + +File::Spec 0.87 Fri Dec 19 08:03:28 CST 2003 + + - With a one-line change in the tests, backported to perl 5.004. + [Issue reported by Barry Kemble] + +File::Spec 0.86 Fri Sep 26 10:07:39 CDT 2003 + + - This is the version released with perl 5.8.1. It is identical to + the code in the File::Spec beta 0.85_03. + +File::Spec 0.85_03 Mon Sep 15 09:35:53 CDT 2003 + + - On VMS, if catpath() receives volume specifiers in both its first + two arguments, it will now use the volume in the first argument + only. Previously it returned a non-syntactical result which + included both volumes. This change is the same in spirit to the + catpath() MacOS change from version 0.85_02. + + - Fixed an abs2rel() bug on VMS - previously + abs2rel('[t1.t2.t3]file','[t1.t2]') returned '[t3]file', now it + properly returns '[.t3]file'. + +File::Spec 0.85_02 Fri Sep 12 17:11:13 CDT 2003 + + - abs2rel() now behaves more consistently across platforms with the + notion of a volume. If the volumes of the first and second + argument (the second argument may be implicit) do not agree, we do + not attempt to reconcile the paths, and simply return the first + argument. Previously the volume of the second argument was + (usually) ignored, resulting in sometimes-garbage output. + + - catpath() on MacOS now looks for a volume element (i.e. "Macintosh HD:") + in its first argument, and then its second argument. The first + volume found will be used, and if none is found, none will be used. + + - Fixed a problem in abs2rel() on Win32 in which the volume of the + current working directory would get added to the second argument if + none was specified. This might have been somewhat helpful, but it + was contrary to the documented behavior. For example, + abs2rel('C:/foo/bar', '/foo') used to return 'bar', now it returns + 'C:/foo/bar' because there's no guarantee /foo is actually C:/foo . + + - catdir('/', '../') on OS2 previously erroneously returned '//..', + and now it returns '/'. + +File::Spec 0.85_01 Thu Sep 11 16:18:54 CDT 2003 + + Working toward 0.86, the version that will be released with perl 5.8.1. + + - The t/rel2abs2rel.t test now is a little friendlier about emitting + its diagnostic debugging output. [Jarkko Hietaniemi] + + - We now only require() Cwd when it's needed, on demand. [Michael + Schwern, Tels] + + - Fixed some POD errors and redundancies in OS2.pm and Cygwin.pm. + [Michael Schwern] + + - The internal method cwd() has been renamed to _cwd(), since it was + never meant for public use. [Michael Schwern] + + - Several methods in File::Spec::Unix that just return constant + strings have been sped up. catdir() has also been sped up there. + [Tels] + + - Several canonpath() and catdir() bugs on Win32 have been fixed, and + tests added for them: + catdir('/', '../') -> '\\' (was '\..') + catdir('/', '..\\') -> '\\ (was '') + canonpath('\\../') -> '\\' (was '') + canonpath('\\..\\') -> '\\' (was '') + canonpath('/../') -> '\\' (was '\..') + canonpath('/..\\') -> '\\' (was '') + catdir('\\', 'foo') -> '\foo' (was '\\foo') + + - catpath($volume, $dirs, $file) on Mac OS now ignores any volume + that might be part of $dirs, enabling catpath($volume, + catdir(rootdir(), 'foo'), '') to work portably across platforms. + +File::Spec 0.85 Tue Jul 22 11:31 CDT 2003 + + A bug-fix release relative to 0.84. I've forked development into a + "stable" branch (this one) and a more aggressive branch (as yet + unreleased), with an eye toward getting the stable features in perl + 5.8.1. + + - File::Spec::Mac->case_tolerant() returned 0 when it should have + returned 1. + + - Many cases in File::Spec::Win32->abs2rel() were broken, because of + the way in which volumes were/weren't ignored. Unfortunately, part + of the regression tests were broken too. Now, if the $path + argument to abs2rel() is on a different volume than the $base + argument, the result will be an absolute path rather than the + broken relative path previous versions returned. + + - Fixed a problem in File::Spec::Win32->canonpath, which was turning + \../foo into "foo" rather than \foo + + - Greatly simplified the code in File::Spec::Unix->splitdir(). + +File::Spec 0.84_01 Fri Jul 11 16:14:29 CDT 2003 + + No actual code changes, just changes in other distribution files + + - Dependencies are now listed explicitly in the Makefile.PL and + Build.PL scripts, as well as in the META.yml file. + + - The t/abs2rel2abs.t test should now be more friendly about skipping + on platforms where it can't run properly. + +File::Spec 0.84 Wed Jul 9 22:21:23 CDT 2003 + + I (Ken)'ve taken the changes from bleadperl and created a new CPAN release + from them, since they're pretty important changes. The highlights, + from what I can tell, are listed here. + + - A huge number of changes to File::Spec::Mac in order to bring it in + line with the other platforms. This work was mostly/completely + done by Thomas Wegner. + + - The Epoc and Cygwin platforms are now supported. + + - Lots of generically-applicable documentation has been taken from + File::Spec::Unix and put in File::Spec. + + - A Build.PL has been provided for people who wish to install via + Module::Build. + + - Some spurious warnings and errors in the tests have been + eliminated. [Michael Schwern] + + - canonpath() on File::Spec::Unix now honors a //node-name at the + beginning of a path. + + - Cwd.pm wasn't being loaded properly on MacOS. [Chris Nandor] + + - Various POD fixups + + - Several testing patches for the Epoc and Cygwin platforms [Tels] + + - When running under taint mode and perl >= 5.8, all the tmpdir() + implementations now avoid returning a tainted path. + + - File::Spec::OS2 now implements canonpath(), splitpath(), + splitdir(), catpath(), abs2rel(), and rel2abs() directly rather + than inheriting them from File::Spec::Unix. + + - Added 'SYS:/temp' and 'C:/temp' to the list of possible tmpdir()s + on Win32. + + - catfile() on Win32 and VMS will now automatically call canonpath() + on its final argument. + + - canonpath() on Win32 now does a much more extensive cleanup of the + path. + + - abs2rel() on Win32 now defaults to using cwd() as the base of + relativity when no base is given. + + - abs2rel() on Win32 now explicitly ignores any volume component in + the $path argument. + + - canonpath() on VMS now does []foo ==> foo, and foo.000000] ==> foo]. + It also fixes a bug in multiple [000000.foo ==> [foo translations. + + - tmpdir() on VMS now uses 'sys$scratch:' instead of 'sys$scratch'. + + - abs2rel() on VMS now uses '000000' in both the path and the base. + +File::Spec 0.82 Wed Jun 28 11:24:05 EDT 2000 + - Mac.pm: file_name_is_absolute( '' ) now returns TRUE on all platforms + - Spec.pm: unbreak C<$VERSION = '0.xx'> to be C<$VERSION = 0.xx>, so + underscores can be used when I want to update CPAN without anyone + needing to update the perl repository. + - abs2rel, rel2abs doc tweaks + - VMS.pm: get $path =~ /\s/ checks from perl repository. + - Makefile.PL: added INSTALLDIRS => 'perl', since these are std. modules. + - Remove vestigial context prototypes from &rel2abs until some future + arrives where method prototypes are honored. diff --git a/cpan/dist/PathTools/Cwd.pm b/cpan/dist/PathTools/Cwd.pm new file mode 100644 index 00000000..9b5183e3 --- /dev/null +++ b/cpan/dist/PathTools/Cwd.pm @@ -0,0 +1,869 @@ +package Cwd; +use strict; +use Exporter; +use vars qw(@ISA @EXPORT @EXPORT_OK $VERSION); + +$VERSION = '3.62'; +my $xs_version = $VERSION; +$VERSION =~ tr/_//d; + +@ISA = qw/ Exporter /; +@EXPORT = qw(cwd getcwd fastcwd fastgetcwd); +push @EXPORT, qw(getdcwd) if $^O eq 'MSWin32'; +@EXPORT_OK = qw(chdir abs_path fast_abs_path realpath fast_realpath); + +# sys_cwd may keep the builtin command + +# All the functionality of this module may provided by builtins, +# there is no sense to process the rest of the file. +# The best choice may be to have this in BEGIN, but how to return from BEGIN? + +if ($^O eq 'os2') { + local $^W = 0; + + *cwd = defined &sys_cwd ? \&sys_cwd : \&_os2_cwd; + *getcwd = \&cwd; + *fastgetcwd = \&cwd; + *fastcwd = \&cwd; + + *fast_abs_path = \&sys_abspath if defined &sys_abspath; + *abs_path = \&fast_abs_path; + *realpath = \&fast_abs_path; + *fast_realpath = \&fast_abs_path; + + return 1; +} + +# Need to look up the feature settings on VMS. The preferred way is to use the +# VMS::Feature module, but that may not be available to dual life modules. + +my $use_vms_feature; +BEGIN { + if ($^O eq 'VMS') { + if (eval { local $SIG{__DIE__}; require VMS::Feature; }) { + $use_vms_feature = 1; + } + } +} + +# Need to look up the UNIX report mode. This may become a dynamic mode +# in the future. +sub _vms_unix_rpt { + my $unix_rpt; + if ($use_vms_feature) { + $unix_rpt = VMS::Feature::current("filename_unix_report"); + } else { + my $env_unix_rpt = $ENV{'DECC$FILENAME_UNIX_REPORT'} || ''; + $unix_rpt = $env_unix_rpt =~ /^[ET1]/i; + } + return $unix_rpt; +} + +# Need to look up the EFS character set mode. This may become a dynamic +# mode in the future. +sub _vms_efs { + my $efs; + if ($use_vms_feature) { + $efs = VMS::Feature::current("efs_charset"); + } else { + my $env_efs = $ENV{'DECC$EFS_CHARSET'} || ''; + $efs = $env_efs =~ /^[ET1]/i; + } + return $efs; +} + + +# If loading the XS stuff doesn't work, we can fall back to pure perl +if(! defined &getcwd && defined &DynaLoader::boot_DynaLoader) { + eval {#eval is questionable since we are handling potential errors like + #"Cwd object version 3.48 does not match bootstrap parameter 3.50 + #at lib/DynaLoader.pm line 216." by having this eval + if ( $] >= 5.006 ) { + require XSLoader; + XSLoader::load( __PACKAGE__, $xs_version); + } else { + require DynaLoader; + push @ISA, 'DynaLoader'; + __PACKAGE__->bootstrap( $xs_version ); + } + }; +} + +# Big nasty table of function aliases +my %METHOD_MAP = + ( + VMS => + { + cwd => '_vms_cwd', + getcwd => '_vms_cwd', + fastcwd => '_vms_cwd', + fastgetcwd => '_vms_cwd', + abs_path => '_vms_abs_path', + fast_abs_path => '_vms_abs_path', + }, + + MSWin32 => + { + # We assume that &_NT_cwd is defined as an XSUB or in the core. + cwd => '_NT_cwd', + getcwd => '_NT_cwd', + fastcwd => '_NT_cwd', + fastgetcwd => '_NT_cwd', + abs_path => 'fast_abs_path', + realpath => 'fast_abs_path', + }, + + dos => + { + cwd => '_dos_cwd', + getcwd => '_dos_cwd', + fastgetcwd => '_dos_cwd', + fastcwd => '_dos_cwd', + abs_path => 'fast_abs_path', + }, + + # QNX4. QNX6 has a $os of 'nto'. + qnx => + { + cwd => '_qnx_cwd', + getcwd => '_qnx_cwd', + fastgetcwd => '_qnx_cwd', + fastcwd => '_qnx_cwd', + abs_path => '_qnx_abs_path', + fast_abs_path => '_qnx_abs_path', + }, + + cygwin => + { + getcwd => 'cwd', + fastgetcwd => 'cwd', + fastcwd => 'cwd', + abs_path => 'fast_abs_path', + realpath => 'fast_abs_path', + }, + + epoc => + { + cwd => '_epoc_cwd', + getcwd => '_epoc_cwd', + fastgetcwd => '_epoc_cwd', + fastcwd => '_epoc_cwd', + abs_path => 'fast_abs_path', + }, + + MacOS => + { + getcwd => 'cwd', + fastgetcwd => 'cwd', + fastcwd => 'cwd', + abs_path => 'fast_abs_path', + }, + + amigaos => + { + getcwd => '_backtick_pwd', + fastgetcwd => '_backtick_pwd', + fastcwd => '_backtick_pwd', + abs_path => 'fast_abs_path', + } + ); + +$METHOD_MAP{NT} = $METHOD_MAP{MSWin32}; + + +# Find the pwd command in the expected locations. We assume these +# are safe. This prevents _backtick_pwd() consulting $ENV{PATH} +# so everything works under taint mode. +my $pwd_cmd; +if($^O ne 'MSWin32') { + foreach my $try ('/bin/pwd', + '/usr/bin/pwd', + '/QOpenSys/bin/pwd', # OS/400 PASE. + ) { + if( -x $try ) { + $pwd_cmd = $try; + last; + } + } +} + +# Android has a built-in pwd. Using $pwd_cmd will DTRT if +# this perl was compiled with -Dd_useshellcmds, which is the +# default for Android, but the block below is needed for the +# miniperl running on the host when cross-compiling, and +# potentially for native builds with -Ud_useshellcmds. +if ($^O =~ /android/) { + # If targetsh is executable, then we're either a full + # perl, or a miniperl for a native build. + if (-x $Config::Config{targetsh}) { + $pwd_cmd = "$Config::Config{targetsh} -c pwd" + } + else { + my $sh = $Config::Config{sh} || (-x '/system/bin/sh' ? '/system/bin/sh' : 'sh'); + $pwd_cmd = "$sh -c pwd" + } +} + +my $found_pwd_cmd = defined($pwd_cmd); +unless ($pwd_cmd) { + # Isn't this wrong? _backtick_pwd() will fail if someone has + # pwd in their path but it is not /bin/pwd or /usr/bin/pwd? + # See [perl #16774]. --jhi + $pwd_cmd = 'pwd'; +} + +# Lazy-load Carp +sub _carp { require Carp; Carp::carp(@_) } +sub _croak { require Carp; Carp::croak(@_) } + +# The 'natural and safe form' for UNIX (pwd may be setuid root) +sub _backtick_pwd { + + # Localize %ENV entries in a way that won't create new hash keys. + # Under AmigaOS we don't want to localize as it stops perl from + # finding 'sh' in the PATH. + my @localize = grep exists $ENV{$_}, qw(PATH IFS CDPATH ENV BASH_ENV) if $^O ne "amigaos"; + local @ENV{@localize} if @localize; + + my $cwd = `$pwd_cmd`; + # Belt-and-suspenders in case someone said "undef $/". + local $/ = "\n"; + # `pwd` may fail e.g. if the disk is full + chomp($cwd) if defined $cwd; + $cwd; +} + +# Since some ports may predefine cwd internally (e.g., NT) +# we take care not to override an existing definition for cwd(). + +unless ($METHOD_MAP{$^O}{cwd} or defined &cwd) { + # The pwd command is not available in some chroot(2)'ed environments + my $sep = $Config::Config{path_sep} || ':'; + my $os = $^O; # Protect $^O from tainting + + + # Try again to find a pwd, this time searching the whole PATH. + if (defined $ENV{PATH} and $os ne 'MSWin32') { # no pwd on Windows + my @candidates = split($sep, $ENV{PATH}); + while (!$found_pwd_cmd and @candidates) { + my $candidate = shift @candidates; + $found_pwd_cmd = 1 if -x "$candidate/pwd"; + } + } + + # MacOS has some special magic to make `pwd` work. + if( $os eq 'MacOS' || $found_pwd_cmd ) + { + *cwd = \&_backtick_pwd; + } + else { + *cwd = \&getcwd; + } +} + +if ($^O eq 'cygwin') { + # We need to make sure cwd() is called with no args, because it's + # got an arg-less prototype and will die if args are present. + local $^W = 0; + my $orig_cwd = \&cwd; + *cwd = sub { &$orig_cwd() } +} + + +# set a reasonable (and very safe) default for fastgetcwd, in case it +# isn't redefined later (20001212 rspier) +*fastgetcwd = \&cwd; + +# A non-XS version of getcwd() - also used to bootstrap the perl build +# process, when miniperl is running and no XS loading happens. +sub _perl_getcwd +{ + abs_path('.'); +} + +# By John Bazik +# +# Usage: $cwd = &fastcwd; +# +# This is a faster version of getcwd. It's also more dangerous because +# you might chdir out of a directory that you can't chdir back into. + +sub fastcwd_ { + my($odev, $oino, $cdev, $cino, $tdev, $tino); + my(@path, $path); + local(*DIR); + + my($orig_cdev, $orig_cino) = stat('.'); + ($cdev, $cino) = ($orig_cdev, $orig_cino); + for (;;) { + my $direntry; + ($odev, $oino) = ($cdev, $cino); + CORE::chdir('..') || return undef; + ($cdev, $cino) = stat('.'); + last if $odev == $cdev && $oino == $cino; + opendir(DIR, '.') || return undef; + for (;;) { + $direntry = readdir(DIR); + last unless defined $direntry; + next if $direntry eq '.'; + next if $direntry eq '..'; + + ($tdev, $tino) = lstat($direntry); + last unless $tdev != $odev || $tino != $oino; + } + closedir(DIR); + return undef unless defined $direntry; # should never happen + unshift(@path, $direntry); + } + $path = '/' . join('/', @path); + if ($^O eq 'apollo') { $path = "/".$path; } + # At this point $path may be tainted (if tainting) and chdir would fail. + # Untaint it then check that we landed where we started. + $path =~ /^(.*)\z/s # untaint + && CORE::chdir($1) or return undef; + ($cdev, $cino) = stat('.'); + die "Unstable directory path, current directory changed unexpectedly" + if $cdev != $orig_cdev || $cino != $orig_cino; + $path; +} +if (not defined &fastcwd) { *fastcwd = \&fastcwd_ } + + +# Keeps track of current working directory in PWD environment var +# Usage: +# use Cwd 'chdir'; +# chdir $newdir; + +my $chdir_init = 0; + +sub chdir_init { + if ($ENV{'PWD'} and $^O ne 'os2' and $^O ne 'dos' and $^O ne 'MSWin32') { + my($dd,$di) = stat('.'); + my($pd,$pi) = stat($ENV{'PWD'}); + if (!defined $dd or !defined $pd or $di != $pi or $dd != $pd) { + $ENV{'PWD'} = cwd(); + } + } + else { + my $wd = cwd(); + $wd = Win32::GetFullPathName($wd) if $^O eq 'MSWin32'; + $ENV{'PWD'} = $wd; + } + # Strip an automounter prefix (where /tmp_mnt/foo/bar == /foo/bar) + if ($^O ne 'MSWin32' and $ENV{'PWD'} =~ m|(/[^/]+(/[^/]+/[^/]+))(.*)|s) { + my($pd,$pi) = stat($2); + my($dd,$di) = stat($1); + if (defined $pd and defined $dd and $di == $pi and $dd == $pd) { + $ENV{'PWD'}="$2$3"; + } + } + $chdir_init = 1; +} + +sub chdir { + my $newdir = @_ ? shift : ''; # allow for no arg (chdir to HOME dir) + if ($^O eq "cygwin") { + $newdir =~ s|\A///+|//|; + $newdir =~ s|(?<=[^/])//+|/|g; + } + elsif ($^O ne 'MSWin32') { + $newdir =~ s|///*|/|g; + } + chdir_init() unless $chdir_init; + my $newpwd; + if ($^O eq 'MSWin32') { + # get the full path name *before* the chdir() + $newpwd = Win32::GetFullPathName($newdir); + } + + return 0 unless CORE::chdir $newdir; + + if ($^O eq 'VMS') { + return $ENV{'PWD'} = $ENV{'DEFAULT'} + } + elsif ($^O eq 'MacOS') { + return $ENV{'PWD'} = cwd(); + } + elsif ($^O eq 'MSWin32') { + $ENV{'PWD'} = $newpwd; + return 1; + } + + if (ref $newdir eq 'GLOB') { # in case a file/dir handle is passed in + $ENV{'PWD'} = cwd(); + } elsif ($newdir =~ m#^/#s) { + $ENV{'PWD'} = $newdir; + } else { + my @curdir = split(m#/#,$ENV{'PWD'}); + @curdir = ('') unless @curdir; + my $component; + foreach $component (split(m#/#, $newdir)) { + next if $component eq '.'; + pop(@curdir),next if $component eq '..'; + push(@curdir,$component); + } + $ENV{'PWD'} = join('/',@curdir) || '/'; + } + 1; +} + + +sub _perl_abs_path +{ + my $start = @_ ? shift : '.'; + my($dotdots, $cwd, @pst, @cst, $dir, @tst); + + unless (@cst = stat( $start )) + { + _carp("stat($start): $!"); + return ''; + } + + unless (-d _) { + # Make sure we can be invoked on plain files, not just directories. + # NOTE that this routine assumes that '/' is the only directory separator. + + my ($dir, $file) = $start =~ m{^(.*)/(.+)$} + or return cwd() . '/' . $start; + + # Can't use "-l _" here, because the previous stat was a stat(), not an lstat(). + if (-l $start) { + my $link_target = readlink($start); + die "Can't resolve link $start: $!" unless defined $link_target; + + require File::Spec; + $link_target = $dir . '/' . $link_target + unless File::Spec->file_name_is_absolute($link_target); + + return abs_path($link_target); + } + + return $dir ? abs_path($dir) . "/$file" : "/$file"; + } + + $cwd = ''; + $dotdots = $start; + do + { + $dotdots .= '/..'; + @pst = @cst; + local *PARENT; + unless (opendir(PARENT, $dotdots)) + { + # probably a permissions issue. Try the native command. + require File::Spec; + return File::Spec->rel2abs( $start, _backtick_pwd() ); + } + unless (@cst = stat($dotdots)) + { + _carp("stat($dotdots): $!"); + closedir(PARENT); + return ''; + } + if ($pst[0] == $cst[0] && $pst[1] == $cst[1]) + { + $dir = undef; + } + else + { + do + { + unless (defined ($dir = readdir(PARENT))) + { + _carp("readdir($dotdots): $!"); + closedir(PARENT); + return ''; + } + $tst[0] = $pst[0]+1 unless (@tst = lstat("$dotdots/$dir")) + } + while ($dir eq '.' || $dir eq '..' || $tst[0] != $pst[0] || + $tst[1] != $pst[1]); + } + $cwd = (defined $dir ? "$dir" : "" ) . "/$cwd" ; + closedir(PARENT); + } while (defined $dir); + chop($cwd) unless $cwd eq '/'; # drop the trailing / + $cwd; +} + + +my $Curdir; +sub fast_abs_path { + local $ENV{PWD} = $ENV{PWD} || ''; # Guard against clobberage + my $cwd = getcwd(); + require File::Spec; + my $path = @_ ? shift : ($Curdir ||= File::Spec->curdir); + + # Detaint else we'll explode in taint mode. This is safe because + # we're not doing anything dangerous with it. + ($path) = $path =~ /(.*)/s; + ($cwd) = $cwd =~ /(.*)/s; + + unless (-e $path) { + _croak("$path: No such file or directory"); + } + + unless (-d _) { + # Make sure we can be invoked on plain files, not just directories. + + my ($vol, $dir, $file) = File::Spec->splitpath($path); + return File::Spec->catfile($cwd, $path) unless length $dir; + + if (-l $path) { + my $link_target = readlink($path); + die "Can't resolve link $path: $!" unless defined $link_target; + + $link_target = File::Spec->catpath($vol, $dir, $link_target) + unless File::Spec->file_name_is_absolute($link_target); + + return fast_abs_path($link_target); + } + + return $dir eq File::Spec->rootdir + ? File::Spec->catpath($vol, $dir, $file) + : fast_abs_path(File::Spec->catpath($vol, $dir, '')) . '/' . $file; + } + + if (!CORE::chdir($path)) { + _croak("Cannot chdir to $path: $!"); + } + my $realpath = getcwd(); + if (! ((-d $cwd) && (CORE::chdir($cwd)))) { + _croak("Cannot chdir back to $cwd: $!"); + } + $realpath; +} + +# added function alias to follow principle of least surprise +# based on previous aliasing. --tchrist 27-Jan-00 +*fast_realpath = \&fast_abs_path; + + +# --- PORTING SECTION --- + +# VMS: $ENV{'DEFAULT'} points to default directory at all times +# 06-Mar-1996 Charles Bailey bailey@newman.upenn.edu +# Note: Use of Cwd::chdir() causes the logical name PWD to be defined +# in the process logical name table as the default device and directory +# seen by Perl. This may not be the same as the default device +# and directory seen by DCL after Perl exits, since the effects +# the CRTL chdir() function persist only until Perl exits. + +sub _vms_cwd { + return $ENV{'DEFAULT'}; +} + +sub _vms_abs_path { + return $ENV{'DEFAULT'} unless @_; + my $path = shift; + + my $efs = _vms_efs; + my $unix_rpt = _vms_unix_rpt; + + if (defined &VMS::Filespec::vmsrealpath) { + my $path_unix = 0; + my $path_vms = 0; + + $path_unix = 1 if ($path =~ m#(?<=\^)/#); + $path_unix = 1 if ($path =~ /^\.\.?$/); + $path_vms = 1 if ($path =~ m#[\[<\]]#); + $path_vms = 1 if ($path =~ /^--?$/); + + my $unix_mode = $path_unix; + if ($efs) { + # In case of a tie, the Unix report mode decides. + if ($path_vms == $path_unix) { + $unix_mode = $unix_rpt; + } else { + $unix_mode = 0 if $path_vms; + } + } + + if ($unix_mode) { + # Unix format + return VMS::Filespec::unixrealpath($path); + } + + # VMS format + + my $new_path = VMS::Filespec::vmsrealpath($path); + + # Perl expects directories to be in directory format + $new_path = VMS::Filespec::pathify($new_path) if -d $path; + return $new_path; + } + + # Fallback to older algorithm if correct ones are not + # available. + + if (-l $path) { + my $link_target = readlink($path); + die "Can't resolve link $path: $!" unless defined $link_target; + + return _vms_abs_path($link_target); + } + + # may need to turn foo.dir into [.foo] + my $pathified = VMS::Filespec::pathify($path); + $path = $pathified if defined $pathified; + + return VMS::Filespec::rmsexpand($path); +} + +sub _os2_cwd { + my $pwd = `cmd /c cd`; + chomp $pwd; + $pwd =~ s:\\:/:g ; + $ENV{'PWD'} = $pwd; + return $pwd; +} + +sub _win32_cwd_simple { + my $pwd = `cd`; + chomp $pwd; + $pwd =~ s:\\:/:g ; + $ENV{'PWD'} = $pwd; + return $pwd; +} + +sub _win32_cwd { + my $pwd; + $pwd = Win32::GetCwd(); + $pwd =~ s:\\:/:g ; + $ENV{'PWD'} = $pwd; + return $pwd; +} + +*_NT_cwd = defined &Win32::GetCwd ? \&_win32_cwd : \&_win32_cwd_simple; + +sub _dos_cwd { + my $pwd; + if (!defined &Dos::GetCwd) { + chomp($pwd = `command /c cd`); + $pwd =~ s:\\:/:g ; + } else { + $pwd = Dos::GetCwd(); + } + $ENV{'PWD'} = $pwd; + return $pwd; +} + +sub _qnx_cwd { + local $ENV{PATH} = ''; + local $ENV{CDPATH} = ''; + local $ENV{ENV} = ''; + my $pwd = `/usr/bin/fullpath -t`; + chomp $pwd; + $ENV{'PWD'} = $pwd; + return $pwd; +} + +sub _qnx_abs_path { + local $ENV{PATH} = ''; + local $ENV{CDPATH} = ''; + local $ENV{ENV} = ''; + my $path = @_ ? shift : '.'; + local *REALPATH; + + defined( open(REALPATH, '-|') || exec '/usr/bin/fullpath', '-t', $path ) or + die "Can't open /usr/bin/fullpath: $!"; + my $realpath = <REALPATH>; + close REALPATH; + chomp $realpath; + return $realpath; +} + +sub _epoc_cwd { + return $ENV{'PWD'} = EPOC::getcwd(); +} + + +# Now that all the base-level functions are set up, alias the +# user-level functions to the right places + +if (exists $METHOD_MAP{$^O}) { + my $map = $METHOD_MAP{$^O}; + foreach my $name (keys %$map) { + local $^W = 0; # assignments trigger 'subroutine redefined' warning + no strict 'refs'; + *{$name} = \&{$map->{$name}}; + } +} + +# In case the XS version doesn't load. +*abs_path = \&_perl_abs_path unless defined &abs_path; +*getcwd = \&_perl_getcwd unless defined &getcwd; + +# added function alias for those of us more +# used to the libc function. --tchrist 27-Jan-00 +*realpath = \&abs_path; + +1; +__END__ + +=head1 NAME + +Cwd - get pathname of current working directory + +=head1 SYNOPSIS + + use Cwd; + my $dir = getcwd; + + use Cwd 'abs_path'; + my $abs_path = abs_path($file); + +=head1 DESCRIPTION + +This module provides functions for determining the pathname of the +current working directory. It is recommended that getcwd (or another +*cwd() function) be used in I<all> code to ensure portability. + +By default, it exports the functions cwd(), getcwd(), fastcwd(), and +fastgetcwd() (and, on Win32, getdcwd()) into the caller's namespace. + + +=head2 getcwd and friends + +Each of these functions are called without arguments and return the +absolute path of the current working directory. + +=over 4 + +=item getcwd + + my $cwd = getcwd(); + +Returns the current working directory. + +Exposes the POSIX function getcwd(3) or re-implements it if it's not +available. + +=item cwd + + my $cwd = cwd(); + +The cwd() is the most natural form for the current architecture. For +most systems it is identical to `pwd` (but without the trailing line +terminator). + +=item fastcwd + + my $cwd = fastcwd(); + +A more dangerous version of getcwd(), but potentially faster. + +It might conceivably chdir() you out of a directory that it can't +chdir() you back into. If fastcwd encounters a problem it will return +undef but will probably leave you in a different directory. For a +measure of extra security, if everything appears to have worked, the +fastcwd() function will check that it leaves you in the same directory +that it started in. If it has changed it will C<die> with the message +"Unstable directory path, current directory changed +unexpectedly". That should never happen. + +=item fastgetcwd + + my $cwd = fastgetcwd(); + +The fastgetcwd() function is provided as a synonym for cwd(). + +=item getdcwd + + my $cwd = getdcwd(); + my $cwd = getdcwd('C:'); + +The getdcwd() function is also provided on Win32 to get the current working +directory on the specified drive, since Windows maintains a separate current +working directory for each drive. If no drive is specified then the current +drive is assumed. + +This function simply calls the Microsoft C library _getdcwd() function. + +=back + + +=head2 abs_path and friends + +These functions are exported only on request. They each take a single +argument and return the absolute pathname for it. If no argument is +given they'll use the current working directory. + +=over 4 + +=item abs_path + + my $abs_path = abs_path($file); + +Uses the same algorithm as getcwd(). Symbolic links and relative-path +components ("." and "..") are resolved to return the canonical +pathname, just like realpath(3). + +=item realpath + + my $abs_path = realpath($file); + +A synonym for abs_path(). + +=item fast_abs_path + + my $abs_path = fast_abs_path($file); + +A more dangerous, but potentially faster version of abs_path. + +=back + +=head2 $ENV{PWD} + +If you ask to override your chdir() built-in function, + + use Cwd qw(chdir); + +then your PWD environment variable will be kept up to date. Note that +it will only be kept up to date if all packages which use chdir import +it from Cwd. + + +=head1 NOTES + +=over 4 + +=item * + +Since the path separators are different on some operating systems ('/' +on Unix, ':' on MacPerl, etc...) we recommend you use the File::Spec +modules wherever portability is a concern. + +=item * + +Actually, on Mac OS, the C<getcwd()>, C<fastgetcwd()> and C<fastcwd()> +functions are all aliases for the C<cwd()> function, which, on Mac OS, +calls `pwd`. Likewise, the C<abs_path()> function is an alias for +C<fast_abs_path()>. + +=back + +=head1 AUTHOR + +Originally by the perl5-porters. + +Maintained by Ken Williams <KWILLIAMS@cpan.org> + +=head1 COPYRIGHT + +Copyright (c) 2004 by the Perl 5 Porters. All rights reserved. + +This program is free software; you can redistribute it and/or modify +it under the same terms as Perl itself. + +Portions of the C code in this library are copyright (c) 1994 by the +Regents of the University of California. All rights reserved. The +license on this code is compatible with the licensing of the rest of +the distribution - please see the source code in F<Cwd.xs> for the +details. + +=head1 SEE ALSO + +L<File::chdir> + +=cut diff --git a/cpan/dist/PathTools/Cwd.xs b/cpan/dist/PathTools/Cwd.xs new file mode 100644 index 00000000..3d018dc4 --- /dev/null +++ b/cpan/dist/PathTools/Cwd.xs @@ -0,0 +1,784 @@ +/* + * ex: set ts=8 sts=4 sw=4 et: + */ + +#define PERL_NO_GET_CONTEXT + +#include "EXTERN.h" +#include "perl.h" +#include "XSUB.h" +#define NEED_my_strlcpy +#define NEED_my_strlcat +#include "ppport.h" + +#ifdef I_UNISTD +# include <unistd.h> +#endif + +/* For special handling of os390 sysplexed systems */ +#define SYSNAME "$SYSNAME" +#define SYSNAME_LEN (sizeof(SYSNAME) - 1) + +/* The realpath() implementation from OpenBSD 3.9 to 4.2 (realpath.c 1.13) + * Renamed here to bsd_realpath() to avoid library conflicts. + */ + +/* See + * http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/2004-11/msg00979.html + * for the details of why the BSD license is compatible with the + * AL/GPL standard perl license. + */ + +/* + * Copyright (c) 2003 Constantin S. Svintsoff <kostik@iclub.nsu.ru> + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The names of the authors may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* OpenBSD system #includes removed since the Perl ones should do. --jhi */ + +#ifndef MAXSYMLINKS +#define MAXSYMLINKS 8 +#endif + +#ifndef VMS +/* + * char *realpath(const char *path, char resolved[MAXPATHLEN]); + * + * Find the real name of path, by removing all ".", ".." and symlink + * components. Returns (resolved) on success, or (NULL) on failure, + * in which case the path which caused trouble is left in (resolved). + */ +static +char * +bsd_realpath(const char *path, char resolved[MAXPATHLEN]) +{ + char *p, *q, *s; + size_t remaining_len, resolved_len; + unsigned symlinks; + int serrno; + char remaining[MAXPATHLEN], next_token[MAXPATHLEN]; + + serrno = errno; + symlinks = 0; + if (path[0] == '/') { + resolved[0] = '/'; + resolved[1] = '\0'; + if (path[1] == '\0') + return (resolved); + resolved_len = 1; + remaining_len = my_strlcpy(remaining, path + 1, sizeof(remaining)); + } else { + if (getcwd(resolved, MAXPATHLEN) == NULL) { + my_strlcpy(resolved, ".", MAXPATHLEN); + return (NULL); + } + resolved_len = strlen(resolved); + remaining_len = my_strlcpy(remaining, path, sizeof(remaining)); + } + if (remaining_len >= sizeof(remaining) || resolved_len >= MAXPATHLEN) { + errno = ENAMETOOLONG; + return (NULL); + } + + /* + * Iterate over path components in 'remaining'. + */ + while (remaining_len != 0) { + + /* + * Extract the next path component and adjust 'remaining' + * and its length. + */ + + p = strchr(remaining, '/'); + s = p ? p : remaining + remaining_len; + if ((STRLEN)(s - remaining) >= (STRLEN)sizeof(next_token)) { + errno = ENAMETOOLONG; + return (NULL); + } + memcpy(next_token, remaining, s - remaining); + next_token[s - remaining] = '\0'; + remaining_len -= s - remaining; + if (p != NULL) + memmove(remaining, s + 1, remaining_len + 1); + if (resolved[resolved_len - 1] != '/') { + if (resolved_len + 1 >= MAXPATHLEN) { + errno = ENAMETOOLONG; + return (NULL); + } + resolved[resolved_len++] = '/'; + resolved[resolved_len] = '\0'; + } + if (next_token[0] == '\0') + continue; + else if (strcmp(next_token, ".") == 0) + continue; + else if (strcmp(next_token, "..") == 0) { + /* + * Strip the last path component except when we have + * single "/" + */ + if (resolved_len > 1) { + resolved[resolved_len - 1] = '\0'; + q = strrchr(resolved, '/') + 1; + *q = '\0'; + resolved_len = q - resolved; + } + continue; + } + + /* + * Append the next path component and lstat() it. If + * lstat() fails we still can return successfully if + * there are no more path components left. + */ + resolved_len = my_strlcat(resolved, next_token, MAXPATHLEN); + if (resolved_len >= MAXPATHLEN) { + errno = ENAMETOOLONG; + return (NULL); + } +#if defined(HAS_LSTAT) && defined(HAS_READLINK) && defined(HAS_SYMLINK) + { + struct stat sb; + if (lstat(resolved, &sb) != 0) { + if (errno == ENOENT && p == NULL) { + errno = serrno; + return (resolved); + } + return (NULL); + } + if (S_ISLNK(sb.st_mode)) { + int slen; + char symlink[MAXPATHLEN]; + + if (symlinks++ > MAXSYMLINKS) { + errno = ELOOP; + return (NULL); + } + slen = readlink(resolved, symlink, sizeof(symlink) - 1); + if (slen < 0) + return (NULL); + symlink[slen] = '\0'; +# ifdef EBCDIC /* XXX Probably this should be only os390 */ + /* Replace all instances of $SYSNAME/foo simply by /foo */ + if (slen > SYSNAME_LEN + strlen(next_token) + && strnEQ(symlink, SYSNAME, SYSNAME_LEN) + && *(symlink + SYSNAME_LEN) == '/' + && strEQ(symlink + SYSNAME_LEN + 1, next_token)) + { + goto not_symlink; + } +# endif + if (symlink[0] == '/') { + resolved[1] = 0; + resolved_len = 1; + } else if (resolved_len > 1) { + /* Strip the last path component. */ + resolved[resolved_len - 1] = '\0'; + q = strrchr(resolved, '/') + 1; + *q = '\0'; + resolved_len = q - resolved; + } + + /* + * If there are any path components left, then + * append them to symlink. The result is placed + * in 'remaining'. + */ + if (p != NULL) { + if (symlink[slen - 1] != '/') { + if ((STRLEN)(slen + 1) >= (STRLEN)sizeof(symlink)) { + errno = ENAMETOOLONG; + return (NULL); + } + symlink[slen] = '/'; + symlink[slen + 1] = 0; + } + remaining_len = my_strlcat(symlink, remaining, sizeof(symlink)); + if (remaining_len >= sizeof(remaining)) { + errno = ENAMETOOLONG; + return (NULL); + } + } + remaining_len = my_strlcpy(remaining, symlink, sizeof(remaining)); + } +# ifdef EBCDIC + not_symlink: ; +# endif + } +#endif + } + + /* + * Remove trailing slash except when the resolved pathname + * is a single "/". + */ + if (resolved_len > 1 && resolved[resolved_len - 1] == '/') + resolved[resolved_len - 1] = '\0'; + return (resolved); +} +#endif + +#ifndef SV_CWD_RETURN_UNDEF +#define SV_CWD_RETURN_UNDEF \ +sv_setsv(sv, &PL_sv_undef); \ +return FALSE +#endif + +#ifndef OPpENTERSUB_HASTARG +#define OPpENTERSUB_HASTARG 32 /* Called from OP tree. */ +#endif + +#ifndef dXSTARG +#define dXSTARG SV * targ = ((PL_op->op_private & OPpENTERSUB_HASTARG) \ + ? PAD_SV(PL_op->op_targ) : sv_newmortal()) +#endif + +#ifndef XSprePUSH +#define XSprePUSH (sp = PL_stack_base + ax - 1) +#endif + +#ifndef SV_CWD_ISDOT +#define SV_CWD_ISDOT(dp) \ + (dp->d_name[0] == '.' && (dp->d_name[1] == '\0' || \ + (dp->d_name[1] == '.' && dp->d_name[2] == '\0'))) +#endif + +#ifndef getcwd_sv +/* Taken from perl 5.8's util.c */ +#define getcwd_sv(a) Perl_getcwd_sv(aTHX_ a) +int Perl_getcwd_sv(pTHX_ SV *sv) +{ +#ifndef PERL_MICRO + + SvTAINTED_on(sv); + +#ifdef HAS_GETCWD + { + char buf[MAXPATHLEN]; + + /* Some getcwd()s automatically allocate a buffer of the given + * size from the heap if they are given a NULL buffer pointer. + * The problem is that this behaviour is not portable. */ + if (getcwd(buf, sizeof(buf) - 1)) { + STRLEN len = strlen(buf); + sv_setpvn(sv, buf, len); + return TRUE; + } + else { + sv_setsv(sv, &PL_sv_undef); + return FALSE; + } + } + +#else + { + Stat_t statbuf; + int orig_cdev, orig_cino, cdev, cino, odev, oino, tdev, tino; + int namelen, pathlen=0; + DIR *dir; + Direntry_t *dp; + + (void)SvUPGRADE(sv, SVt_PV); + + if (PerlLIO_lstat(".", &statbuf) < 0) { + SV_CWD_RETURN_UNDEF; + } + + orig_cdev = statbuf.st_dev; + orig_cino = statbuf.st_ino; + cdev = orig_cdev; + cino = orig_cino; + + for (;;) { + odev = cdev; + oino = cino; + + if (PerlDir_chdir("..") < 0) { + SV_CWD_RETURN_UNDEF; + } + if (PerlLIO_stat(".", &statbuf) < 0) { + SV_CWD_RETURN_UNDEF; + } + + cdev = statbuf.st_dev; + cino = statbuf.st_ino; + + if (odev == cdev && oino == cino) { + break; + } + if (!(dir = PerlDir_open("."))) { + SV_CWD_RETURN_UNDEF; + } + + while ((dp = PerlDir_read(dir)) != NULL) { +#ifdef DIRNAMLEN + namelen = dp->d_namlen; +#else + namelen = strlen(dp->d_name); +#endif + /* skip . and .. */ + if (SV_CWD_ISDOT(dp)) { + continue; + } + + if (PerlLIO_lstat(dp->d_name, &statbuf) < 0) { + SV_CWD_RETURN_UNDEF; + } + + tdev = statbuf.st_dev; + tino = statbuf.st_ino; + if (tino == oino && tdev == odev) { + break; + } + } + + if (!dp) { + SV_CWD_RETURN_UNDEF; + } + + if (pathlen + namelen + 1 >= MAXPATHLEN) { + SV_CWD_RETURN_UNDEF; + } + + SvGROW(sv, pathlen + namelen + 1); + + if (pathlen) { + /* shift down */ + Move(SvPVX(sv), SvPVX(sv) + namelen + 1, pathlen, char); + } + + /* prepend current directory to the front */ + *SvPVX(sv) = '/'; + Move(dp->d_name, SvPVX(sv)+1, namelen, char); + pathlen += (namelen + 1); + +#ifdef VOID_CLOSEDIR + PerlDir_close(dir); +#else + if (PerlDir_close(dir) < 0) { + SV_CWD_RETURN_UNDEF; + } +#endif + } + + if (pathlen) { + SvCUR_set(sv, pathlen); + *SvEND(sv) = '\0'; + SvPOK_only(sv); + + if (PerlDir_chdir(SvPVX(sv)) < 0) { + SV_CWD_RETURN_UNDEF; + } + } + if (PerlLIO_stat(".", &statbuf) < 0) { + SV_CWD_RETURN_UNDEF; + } + + cdev = statbuf.st_dev; + cino = statbuf.st_ino; + + if (cdev != orig_cdev || cino != orig_cino) { + Perl_croak(aTHX_ "Unstable directory path, " + "current directory changed unexpectedly"); + } + + return TRUE; + } +#endif + +#else + return FALSE; +#endif +} + +#endif + +#if defined(START_MY_CXT) && defined(MY_CXT_CLONE) +# define USE_MY_CXT 1 +#else +# define USE_MY_CXT 0 +#endif + +#if USE_MY_CXT +# define MY_CXT_KEY "Cwd::_guts"XS_VERSION +typedef struct { + SV *empty_string_sv, *slash_string_sv; +} my_cxt_t; +START_MY_CXT +# define dUSE_MY_CXT dMY_CXT +# define EMPTY_STRING_SV MY_CXT.empty_string_sv +# define SLASH_STRING_SV MY_CXT.slash_string_sv +# define POPULATE_MY_CXT do { \ + MY_CXT.empty_string_sv = newSVpvs(""); \ + MY_CXT.slash_string_sv = newSVpvs("/"); \ + } while(0) +#else +# define dUSE_MY_CXT dNOOP +# define EMPTY_STRING_SV sv_2mortal(newSVpvs("")) +# define SLASH_STRING_SV sv_2mortal(newSVpvs("/")) +#endif + +#define invocant_is_unix(i) THX_invocant_is_unix(aTHX_ i) +static +bool +THX_invocant_is_unix(pTHX_ SV *invocant) +{ + /* + * This is used to enable optimisations that avoid method calls + * by knowing how they would resolve. False negatives, disabling + * the optimisation where it would actually behave correctly, are + * acceptable. + */ + return SvPOK(invocant) && SvCUR(invocant) == 16 && + !memcmp(SvPVX(invocant), "File::Spec::Unix", 16); +} + +#define unix_canonpath(p) THX_unix_canonpath(aTHX_ p) +static +SV * +THX_unix_canonpath(pTHX_ SV *path) +{ + SV *retval; + char const *p, *pe, *q; + STRLEN l; + char *o; + STRLEN plen; + SvGETMAGIC(path); + if(!SvOK(path)) return &PL_sv_undef; + p = SvPV_nomg(path, plen); + if(plen == 0) return newSVpvs(""); + pe = p + plen; + retval = newSV(plen); +#ifdef SvUTF8 + if(SvUTF8(path)) SvUTF8_on(retval); +#endif + o = SvPVX(retval); + if(DOUBLE_SLASHES_SPECIAL && p[0] == '/' && p[1] == '/' && p[2] != '/') { + q = (const char *) memchr(p+2, '/', pe-(p+2)); + if(!q) q = pe; + l = q - p; + memcpy(o, p, l); + p = q; + o += l; + } + /* + * The transformations performed here are: + * . squeeze multiple slashes + * . eliminate "." segments, except one if that's all there is + * . eliminate leading ".." segments + * . eliminate trailing slash, unless it's all there is + */ + if(p[0] == '/') { + *o++ = '/'; + while(1) { + do { p++; } while(p[0] == '/'); + if(p[0] == '.' && p[1] == '.' && (p+2 == pe || p[2] == '/')) { + p++; + /* advance past second "." next time round loop */ + } else if(p[0] == '.' && (p+1 == pe || p[1] == '/')) { + /* advance past "." next time round loop */ + } else { + break; + } + } + } else if(p[0] == '.' && p[1] == '/') { + do { + p++; + do { p++; } while(p[0] == '/'); + } while(p[0] == '.' && p[1] == '/'); + if(p == pe) *o++ = '.'; + } + if(p == pe) goto end; + while(1) { + q = (const char *) memchr(p, '/', pe-p); + if(!q) q = pe; + l = q - p; + memcpy(o, p, l); + p = q; + o += l; + if(p == pe) goto end; + while(1) { + do { p++; } while(p[0] == '/'); + if(p == pe) goto end; + if(p[0] != '.') break; + if(p+1 == pe) goto end; + if(p[1] != '/') break; + p++; + } + *o++ = '/'; + } + end: ; + *o = 0; + SvPOK_on(retval); + SvCUR_set(retval, o - SvPVX(retval)); + SvTAINT(retval); + return retval; +} + +MODULE = Cwd PACKAGE = Cwd + +PROTOTYPES: DISABLE + +BOOT: +#if USE_MY_CXT +{ + MY_CXT_INIT; + POPULATE_MY_CXT; +} +#endif + +#if USE_MY_CXT + +void +CLONE(...) +CODE: + PERL_UNUSED_VAR(items); + { MY_CXT_CLONE; POPULATE_MY_CXT; } + +#endif + +void +getcwd(...) +ALIAS: + fastcwd=1 +PPCODE: +{ + dXSTARG; + /* fastcwd takes zero parameters: */ + if (ix == 1 && items != 0) + croak_xs_usage(cv, ""); + getcwd_sv(TARG); + XSprePUSH; PUSHTARG; + SvTAINTED_on(TARG); +} + +void +abs_path(pathsv=Nullsv) + SV *pathsv +PPCODE: +{ + dXSTARG; + char *const path = pathsv ? SvPV_nolen(pathsv) : (char *)"."; + char buf[MAXPATHLEN]; + + if ( +#ifdef VMS + Perl_rmsexpand(aTHX_ path, buf, NULL, 0) +#else + bsd_realpath(path, buf) +#endif + ) { + sv_setpv_mg(TARG, buf); + SvPOK_only(TARG); + SvTAINTED_on(TARG); + } + else + sv_setsv(TARG, &PL_sv_undef); + + XSprePUSH; PUSHs(TARG); + SvTAINTED_on(TARG); +} + +#if defined(WIN32) && !defined(UNDER_CE) + +void +getdcwd(...) +PROTOTYPE: ENABLE +PPCODE: +{ + dXSTARG; + int drive; + char *dir; + + /* Drive 0 is the current drive, 1 is A:, 2 is B:, 3 is C: and so on. */ + if ( items == 0 || + (items == 1 && (!SvOK(ST(0)) || (SvPOK(ST(0)) && !SvCUR(ST(0)))))) + drive = 0; + else if (items == 1 && SvPOK(ST(0)) && SvCUR(ST(0)) && + isALPHA(SvPVX(ST(0))[0])) + drive = toUPPER(SvPVX(ST(0))[0]) - 'A' + 1; + else + croak("Usage: getdcwd(DRIVE)"); + + New(0,dir,MAXPATHLEN,char); + if (_getdcwd(drive, dir, MAXPATHLEN)) { + sv_setpv_mg(TARG, dir); + SvPOK_only(TARG); + } + else + sv_setsv(TARG, &PL_sv_undef); + + Safefree(dir); + + XSprePUSH; PUSHs(TARG); + SvTAINTED_on(TARG); +} + +#endif + +MODULE = Cwd PACKAGE = File::Spec::Unix + +SV * +canonpath(SV *self, SV *path = &PL_sv_undef, ...) +CODE: + PERL_UNUSED_VAR(self); + RETVAL = unix_canonpath(path); +OUTPUT: + RETVAL + +SV * +_fn_canonpath(SV *path = &PL_sv_undef, ...) +CODE: + RETVAL = unix_canonpath(path); +OUTPUT: + RETVAL + +SV * +catdir(SV *self, ...) +PREINIT: + dUSE_MY_CXT; + SV *joined; +CODE: + EXTEND(SP, items+1); + ST(items) = EMPTY_STRING_SV; + joined = sv_newmortal(); + do_join(joined, SLASH_STRING_SV, &ST(0), &ST(items)); + if(invocant_is_unix(self)) { + RETVAL = unix_canonpath(joined); + } else { + ENTER; + PUSHMARK(SP); + EXTEND(SP, 2); + PUSHs(self); + PUSHs(joined); + PUTBACK; + call_method("canonpath", G_SCALAR); + SPAGAIN; + RETVAL = POPs; + LEAVE; + SvREFCNT_inc(RETVAL); + } +OUTPUT: + RETVAL + +SV * +_fn_catdir(...) +PREINIT: + dUSE_MY_CXT; + SV *joined; +CODE: + EXTEND(SP, items+1); + ST(items) = EMPTY_STRING_SV; + joined = sv_newmortal(); + do_join(joined, SLASH_STRING_SV, &ST(-1), &ST(items)); + RETVAL = unix_canonpath(joined); +OUTPUT: + RETVAL + +SV * +catfile(SV *self, ...) +PREINIT: + dUSE_MY_CXT; +CODE: + if(invocant_is_unix(self)) { + if(items == 1) { + RETVAL = &PL_sv_undef; + } else { + SV *file = unix_canonpath(ST(items-1)); + if(items == 2) { + RETVAL = file; + } else { + SV *dir = sv_newmortal(); + sv_2mortal(file); + ST(items-1) = EMPTY_STRING_SV; + do_join(dir, SLASH_STRING_SV, &ST(0), &ST(items-1)); + RETVAL = unix_canonpath(dir); + if(SvCUR(RETVAL) == 0 || SvPVX(RETVAL)[SvCUR(RETVAL)-1] != '/') + sv_catsv(RETVAL, SLASH_STRING_SV); + sv_catsv(RETVAL, file); + } + } + } else { + SV *file, *dir; + ENTER; + PUSHMARK(SP); + EXTEND(SP, 2); + PUSHs(self); + PUSHs(items == 1 ? &PL_sv_undef : ST(items-1)); + PUTBACK; + call_method("canonpath", G_SCALAR); + SPAGAIN; + file = POPs; + LEAVE; + if(items <= 2) { + RETVAL = SvREFCNT_inc(file); + } else { + char const *pv; + STRLEN len; + bool need_slash; + SP--; + ENTER; + PUSHMARK(&ST(-1)); + PUTBACK; + call_method("catdir", G_SCALAR); + SPAGAIN; + dir = POPs; + LEAVE; + pv = SvPV(dir, len); + need_slash = len == 0 || pv[len-1] != '/'; + RETVAL = newSVsv(dir); + if(need_slash) sv_catsv(RETVAL, SLASH_STRING_SV); + sv_catsv(RETVAL, file); + } + } +OUTPUT: + RETVAL + +SV * +_fn_catfile(...) +PREINIT: + dUSE_MY_CXT; +CODE: + if(items == 0) { + RETVAL = &PL_sv_undef; + } else { + SV *file = unix_canonpath(ST(items-1)); + if(items == 1) { + RETVAL = file; + } else { + SV *dir = sv_newmortal(); + sv_2mortal(file); + ST(items-1) = EMPTY_STRING_SV; + do_join(dir, SLASH_STRING_SV, &ST(-1), &ST(items-1)); + RETVAL = unix_canonpath(dir); + if(SvCUR(RETVAL) == 0 || SvPVX(RETVAL)[SvCUR(RETVAL)-1] != '/') + sv_catsv(RETVAL, SLASH_STRING_SV); + sv_catsv(RETVAL, file); + } + } +OUTPUT: + RETVAL diff --git a/cpan/dist/PathTools/INSTALL b/cpan/dist/PathTools/INSTALL new file mode 100644 index 00000000..743a0ca7 --- /dev/null +++ b/cpan/dist/PathTools/INSTALL @@ -0,0 +1,21 @@ + Installation instructions for PathTools + +To install this module, do this: + + perl Build.PL + ./Build + ./Build test + ./Build install + +Alternatively, if you don't want to use the newer Module::Build module, +you can follow the standard steps for installing most Perl modules: + + perl Makefile.PL + make + make test + make install + +Or you may use the CPAN.pm module, which will automatically execute +these steps for you. See 'perldoc CPAN' for the details. + + -Ken diff --git a/cpan/dist/PathTools/MANIFEST b/cpan/dist/PathTools/MANIFEST new file mode 100644 index 00000000..36e47b18 --- /dev/null +++ b/cpan/dist/PathTools/MANIFEST @@ -0,0 +1,35 @@ +Changes +Cwd.pm +Cwd.xs +INSTALL +lib/File/Spec.pm +lib/File/Spec/AmigaOS.pm +lib/File/Spec/Cygwin.pm +lib/File/Spec/Epoc.pm +lib/File/Spec/Functions.pm +lib/File/Spec/Mac.pm +lib/File/Spec/OS2.pm +lib/File/Spec/Unix.pm +lib/File/Spec/VMS.pm +lib/File/Spec/Win32.pm +Makefile.PL +MANIFEST This list of files +ppport.h +README +t/abs2rel.t +t/crossplatform.t +t/cwd.t +t/Functions.t +t/lib/Test/Builder.pm +t/lib/Test/More.pm +t/lib/Test/Simple.pm +t/lib/Test/Tutorial.pod +t/rel2abs2rel.t +t/rel2abs_vs_symlink.t +t/Spec-taint.t +t/Spec.t +t/taint.t +t/tmpdir.t +t/win32.t +META.yml Module YAML meta-data (added by MakeMaker) +META.json Module JSON meta-data (added by MakeMaker) diff --git a/cpan/dist/PathTools/META.json b/cpan/dist/PathTools/META.json new file mode 100644 index 00000000..4932c331 --- /dev/null +++ b/cpan/dist/PathTools/META.json @@ -0,0 +1,46 @@ +{ + "abstract" : "unknown", + "author" : [ + "unknown" + ], + "dynamic_config" : 1, + "generated_by" : "ExtUtils::MakeMaker version 7.1, CPAN::Meta::Converter version 2.150005", + "license" : [ + "unknown" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "PathTools", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "ExtUtils::MakeMaker" : "0" + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "0" + } + }, + "runtime" : { + "requires" : { + "Carp" : "0", + "File::Basename" : "0", + "Scalar::Util" : "0", + "Test" : "0", + "Test::More" : "0.88" + } + } + }, + "release_status" : "stable", + "version" : "3.62", + "x_serialization_backend" : "JSON::PP version 2.27300" +} diff --git a/cpan/dist/PathTools/META.yml b/cpan/dist/PathTools/META.yml new file mode 100644 index 00000000..7026a49a --- /dev/null +++ b/cpan/dist/PathTools/META.yml @@ -0,0 +1,27 @@ +--- +abstract: unknown +author: + - unknown +build_requires: + ExtUtils::MakeMaker: '0' +configure_requires: + ExtUtils::MakeMaker: '0' +dynamic_config: 1 +generated_by: 'ExtUtils::MakeMaker version 7.1, CPAN::Meta::Converter version 2.150005' +license: unknown +meta-spec: + url: http://module-build.sourceforge.net/META-spec-v1.4.html + version: '1.4' +name: PathTools +no_index: + directory: + - t + - inc +requires: + Carp: '0' + File::Basename: '0' + Scalar::Util: '0' + Test: '0' + Test::More: '0.88' +version: '3.62' +x_serialization_backend: 'CPAN::Meta::YAML version 0.017' diff --git a/cpan/dist/PathTools/Makefile.PL b/cpan/dist/PathTools/Makefile.PL new file mode 100644 index 00000000..bc40baff --- /dev/null +++ b/cpan/dist/PathTools/Makefile.PL @@ -0,0 +1,27 @@ + +BEGIN { @INC = grep {!/blib/} @INC } + +require 5.005; +use ExtUtils::MakeMaker; +WriteMakefile +( + 'DISTNAME' => 'PathTools', + 'NAME' => 'Cwd', + 'VERSION_FROM' => 'Cwd.pm', + 'DEFINE' => join(" ", + "-DDOUBLE_SLASHES_SPECIAL=@{[$^O eq q(qnx) || $^O eq q(nto) ? 1 : 0]}", + ((grep { $_ eq 'PERL_CORE=1' } @ARGV) ? '-DNO_PPPORT_H' : ()), + ), + 'PREREQ_PM' => { + 'Carp' => '0', + 'File::Basename' => '0', + 'Scalar::Util' => '0', + 'Test' => '0', + # done_testing() is used in dist/Cwd/t/Spec.t + 'Test::More' => 0.88, + }, + ($] > 5.011) ? () : ( INSTALLDIRS => 'perl' ), # CPAN sourced versions should now install to site + 'EXE_FILES' => [], + 'PL_FILES' => {} + ) +; diff --git a/cpan/dist/PathTools/README b/cpan/dist/PathTools/README new file mode 100644 index 00000000..a04e895d --- /dev/null +++ b/cpan/dist/PathTools/README @@ -0,0 +1,2 @@ +This is the combined distribution for the File::Spec and Cwd modules. +Please see their respective documentation for details. diff --git a/cpan/dist/PathTools/lib/File/Spec.pm b/cpan/dist/PathTools/lib/File/Spec.pm new file mode 100644 index 00000000..2709c39f --- /dev/null +++ b/cpan/dist/PathTools/lib/File/Spec.pm @@ -0,0 +1,340 @@ +package File::Spec; + +use strict; +use vars qw(@ISA $VERSION); + +$VERSION = '3.62'; +$VERSION =~ tr/_//d; + +my %module = (MacOS => 'Mac', + MSWin32 => 'Win32', + os2 => 'OS2', + VMS => 'VMS', + epoc => 'Epoc', + NetWare => 'Win32', # Yes, File::Spec::Win32 works on NetWare. + symbian => 'Win32', # Yes, File::Spec::Win32 works on symbian. + dos => 'OS2', # Yes, File::Spec::OS2 works on DJGPP. + cygwin => 'Cygwin', + amigaos => 'AmigaOS'); + + +my $module = $module{$^O} || 'Unix'; + +require "File/Spec/$module.pm"; +@ISA = ("File::Spec::$module"); + +1; + +__END__ + +=head1 NAME + +File::Spec - portably perform operations on file names + +=head1 SYNOPSIS + + use File::Spec; + + $x=File::Spec->catfile('a', 'b', 'c'); + +which returns 'a/b/c' under Unix. Or: + + use File::Spec::Functions; + + $x = catfile('a', 'b', 'c'); + +=head1 DESCRIPTION + +This module is designed to support operations commonly performed on file +specifications (usually called "file names", but not to be confused with the +contents of a file, or Perl's file handles), such as concatenating several +directory and file names into a single path, or determining whether a path +is rooted. It is based on code directly taken from MakeMaker 5.17, code +written by Andreas KE<ouml>nig, Andy Dougherty, Charles Bailey, Ilya +Zakharevich, Paul Schinder, and others. + +Since these functions are different for most operating systems, each set of +OS specific routines is available in a separate module, including: + + File::Spec::Unix + File::Spec::Mac + File::Spec::OS2 + File::Spec::Win32 + File::Spec::VMS + +The module appropriate for the current OS is automatically loaded by +File::Spec. Since some modules (like VMS) make use of facilities available +only under that OS, it may not be possible to load all modules under all +operating systems. + +Since File::Spec is object oriented, subroutines should not be called directly, +as in: + + File::Spec::catfile('a','b'); + +but rather as class methods: + + File::Spec->catfile('a','b'); + +For simple uses, L<File::Spec::Functions> provides convenient functional +forms of these methods. + +=head1 METHODS + +=over 2 + +=item canonpath +X<canonpath> + +No physical check on the filesystem, but a logical cleanup of a +path. + + $cpath = File::Spec->canonpath( $path ) ; + +Note that this does *not* collapse F<x/../y> sections into F<y>. This +is by design. If F</foo> on your system is a symlink to F</bar/baz>, +then F</foo/../quux> is actually F</bar/quux>, not F</quux> as a naive +F<../>-removal would give you. If you want to do this kind of +processing, you probably want C<Cwd>'s C<realpath()> function to +actually traverse the filesystem cleaning up paths like this. + +=item catdir +X<catdir> + +Concatenate two or more directory names to form a complete path ending +with a directory. But remove the trailing slash from the resulting +string, because it doesn't look good, isn't necessary and confuses +OS/2. Of course, if this is the root directory, don't cut off the +trailing slash :-) + + $path = File::Spec->catdir( @directories ); + +=item catfile +X<catfile> + +Concatenate one or more directory names and a filename to form a +complete path ending with a filename + + $path = File::Spec->catfile( @directories, $filename ); + +=item curdir +X<curdir> + +Returns a string representation of the current directory. + + $curdir = File::Spec->curdir(); + +=item devnull +X<devnull> + +Returns a string representation of the null device. + + $devnull = File::Spec->devnull(); + +=item rootdir +X<rootdir> + +Returns a string representation of the root directory. + + $rootdir = File::Spec->rootdir(); + +=item tmpdir +X<tmpdir> + +Returns a string representation of the first writable directory from a +list of possible temporary directories. Returns the current directory +if no writable temporary directories are found. The list of directories +checked depends on the platform; e.g. File::Spec::Unix checks C<$ENV{TMPDIR}> +(unless taint is on) and F</tmp>. + + $tmpdir = File::Spec->tmpdir(); + +=item updir +X<updir> + +Returns a string representation of the parent directory. + + $updir = File::Spec->updir(); + +=item no_upwards + +Given a list of file names, strip out those that refer to a parent +directory. (Does not strip symlinks, only '.', '..', and equivalents.) + + @paths = File::Spec->no_upwards( @paths ); + +=item case_tolerant + +Returns a true or false value indicating, respectively, that alphabetic +case is not or is significant when comparing file specifications. +Cygwin and Win32 accept an optional drive argument. + + $is_case_tolerant = File::Spec->case_tolerant(); + +=item file_name_is_absolute + +Takes as its argument a path, and returns true if it is an absolute path. + + $is_absolute = File::Spec->file_name_is_absolute( $path ); + +This does not consult the local filesystem on Unix, Win32, OS/2, or +Mac OS (Classic). It does consult the working environment for VMS +(see L<File::Spec::VMS/file_name_is_absolute>). + +=item path +X<path> + +Takes no argument. Returns the environment variable C<PATH> (or the local +platform's equivalent) as a list. + + @PATH = File::Spec->path(); + +=item join +X<join, path> + +join is the same as catfile. + +=item splitpath +X<splitpath> X<split, path> + +Splits a path in to volume, directory, and filename portions. On systems +with no concept of volume, returns '' for volume. + + ($volume,$directories,$file) = + File::Spec->splitpath( $path ); + ($volume,$directories,$file) = + File::Spec->splitpath( $path, $no_file ); + +For systems with no syntax differentiating filenames from directories, +assumes that the last file is a path unless C<$no_file> is true or a +trailing separator or F</.> or F</..> is present. On Unix, this means that C<$no_file> +true makes this return ( '', $path, '' ). + +The directory portion may or may not be returned with a trailing '/'. + +The results can be passed to L</catpath()> to get back a path equivalent to +(usually identical to) the original path. + +=item splitdir +X<splitdir> X<split, dir> + +The opposite of L</catdir>. + + @dirs = File::Spec->splitdir( $directories ); + +C<$directories> must be only the directory portion of the path on systems +that have the concept of a volume or that have path syntax that differentiates +files from directories. + +Unlike just splitting the directories on the separator, empty +directory names (C<''>) can be returned, because these are significant +on some OSes. + +=item catpath() + +Takes volume, directory and file portions and returns an entire path. Under +Unix, C<$volume> is ignored, and directory and file are concatenated. A '/' is +inserted if need be. On other OSes, C<$volume> is significant. + + $full_path = File::Spec->catpath( $volume, $directory, $file ); + +=item abs2rel +X<abs2rel> X<absolute, path> X<relative, path> + +Takes a destination path and an optional base path returns a relative path +from the base path to the destination path: + + $rel_path = File::Spec->abs2rel( $path ) ; + $rel_path = File::Spec->abs2rel( $path, $base ) ; + +If C<$base> is not present or '', then L<Cwd::cwd()|Cwd> is used. If C<$base> is +relative, then it is converted to absolute form using +L</rel2abs()>. This means that it is taken to be relative to +L<Cwd::cwd()|Cwd>. + +On systems with the concept of volume, if C<$path> and C<$base> appear to be +on two different volumes, we will not attempt to resolve the two +paths, and we will instead simply return C<$path>. Note that previous +versions of this module ignored the volume of C<$base>, which resulted in +garbage results part of the time. + +On systems that have a grammar that indicates filenames, this ignores the +C<$base> filename as well. Otherwise all path components are assumed to be +directories. + +If C<$path> is relative, it is converted to absolute form using L</rel2abs()>. +This means that it is taken to be relative to L<Cwd::cwd()|Cwd>. + +No checks against the filesystem are made. On VMS, there is +interaction with the working environment, as logicals and +macros are expanded. + +Based on code written by Shigio Yamaguchi. + +=item rel2abs() +X<rel2abs> X<absolute, path> X<relative, path> + +Converts a relative path to an absolute path. + + $abs_path = File::Spec->rel2abs( $path ) ; + $abs_path = File::Spec->rel2abs( $path, $base ) ; + +If C<$base> is not present or '', then L<Cwd::cwd()|Cwd> is used. If C<$base> is relative, +then it is converted to absolute form using L</rel2abs()>. This means that it +is taken to be relative to L<Cwd::cwd()|Cwd>. + +On systems with the concept of volume, if C<$path> and C<$base> appear to be +on two different volumes, we will not attempt to resolve the two +paths, and we will instead simply return C<$path>. Note that previous +versions of this module ignored the volume of C<$base>, which resulted in +garbage results part of the time. + +On systems that have a grammar that indicates filenames, this ignores the +C<$base> filename as well. Otherwise all path components are assumed to be +directories. + +If C<$path> is absolute, it is cleaned up and returned using L</canonpath>. + +No checks against the filesystem are made. On VMS, there is +interaction with the working environment, as logicals and +macros are expanded. + +Based on code written by Shigio Yamaguchi. + +=back + +For further information, please see L<File::Spec::Unix>, +L<File::Spec::Mac>, L<File::Spec::OS2>, L<File::Spec::Win32>, or +L<File::Spec::VMS>. + +=head1 SEE ALSO + +L<File::Spec::Unix>, L<File::Spec::Mac>, L<File::Spec::OS2>, +L<File::Spec::Win32>, L<File::Spec::VMS>, L<File::Spec::Functions>, +L<ExtUtils::MakeMaker> + +=head1 AUTHOR + +Currently maintained by Ken Williams C<< <KWILLIAMS@cpan.org> >>. + +The vast majority of the code was written by +Kenneth Albanowski C<< <kjahds@kjahds.com> >>, +Andy Dougherty C<< <doughera@lafayette.edu> >>, +Andreas KE<ouml>nig C<< <A.Koenig@franz.ww.TU-Berlin.DE> >>, +Tim Bunce C<< <Tim.Bunce@ig.co.uk> >>. +VMS support by Charles Bailey C<< <bailey@newman.upenn.edu> >>. +OS/2 support by Ilya Zakharevich C<< <ilya@math.ohio-state.edu> >>. +Mac support by Paul Schinder C<< <schinder@pobox.com> >>, and +Thomas Wegner C<< <wegner_thomas@yahoo.com> >>. +abs2rel() and rel2abs() written by Shigio Yamaguchi C<< <shigio@tamacom.com> >>, +modified by Barrie Slaymaker C<< <barries@slaysys.com> >>. +splitpath(), splitdir(), catpath() and catdir() by Barrie Slaymaker. + +=head1 COPYRIGHT + +Copyright (c) 2004-2013 by the Perl 5 Porters. All rights reserved. + +This program is free software; you can redistribute it and/or modify +it under the same terms as Perl itself. + +=cut diff --git a/cpan/dist/PathTools/lib/File/Spec/AmigaOS.pm b/cpan/dist/PathTools/lib/File/Spec/AmigaOS.pm new file mode 100644 index 00000000..e6d6f5f2 --- /dev/null +++ b/cpan/dist/PathTools/lib/File/Spec/AmigaOS.pm @@ -0,0 +1,61 @@ +package File::Spec::AmigaOS; + +use strict; +use vars qw(@ISA $VERSION); +require File::Spec::Unix; + +$VERSION = '3.62'; +$VERSION =~ tr/_//d; + +@ISA = qw(File::Spec::Unix); + +=head1 NAME + +File::Spec::AmigaOS - File::Spec for AmigaOS + +=head1 SYNOPSIS + + require File::Spec::AmigaOS; # Done automatically by File::Spec if needed + +=head1 DESCRIPTION + +Methods for manipulating file specifications. + +=head1 METHODS + +=over 2 + +=item tmpdir + +Returns $ENV{TMPDIR} or if that is unset, "/t". + +=cut + +my $tmpdir; +sub tmpdir { + return $tmpdir if defined $tmpdir; + $tmpdir = $_[0]->_tmpdir( $ENV{TMPDIR}, "/t" ); +} + +=item file_name_is_absolute + +Returns true if there's a colon in the file name, +or if it begins with a slash. + +=cut + +sub file_name_is_absolute { + my ($self, $file) = @_; + + # Not 100% robust as a "/" must not preceded a ":" + # but this cannot happen in a well formed path. + return $file =~ m{^/|:}s; +} + +=back + +All the other methods are from L<File::Spec::Unix>. + +=cut + +1; diff --git a/cpan/dist/PathTools/lib/File/Spec/Cygwin.pm b/cpan/dist/PathTools/lib/File/Spec/Cygwin.pm new file mode 100644 index 00000000..67f056f5 --- /dev/null +++ b/cpan/dist/PathTools/lib/File/Spec/Cygwin.pm @@ -0,0 +1,160 @@ +package File::Spec::Cygwin; + +use strict; +use vars qw(@ISA $VERSION); +require File::Spec::Unix; + +$VERSION = '3.62'; +$VERSION =~ tr/_//d; + +@ISA = qw(File::Spec::Unix); + +=head1 NAME + +File::Spec::Cygwin - methods for Cygwin file specs + +=head1 SYNOPSIS + + require File::Spec::Cygwin; # Done internally by File::Spec if needed + +=head1 DESCRIPTION + +See L<File::Spec> and L<File::Spec::Unix>. This package overrides the +implementation of these methods, not the semantics. + +This module is still in beta. Cygwin-knowledgeable folks are invited +to offer patches and suggestions. + +=cut + +=pod + +=over 4 + +=item canonpath + +Any C<\> (backslashes) are converted to C</> (forward slashes), +and then File::Spec::Unix canonpath() is called on the result. + +=cut + +sub canonpath { + my($self,$path) = @_; + return unless defined $path; + + $path =~ s|\\|/|g; + + # Handle network path names beginning with double slash + my $node = ''; + if ( $path =~ s@^(//[^/]+)(?:/|\z)@/@s ) { + $node = $1; + } + return $node . $self->SUPER::canonpath($path); +} + +sub catdir { + my $self = shift; + return unless @_; + + # Don't create something that looks like a //network/path + if ($_[0] and ($_[0] eq '/' or $_[0] eq '\\')) { + shift; + return $self->SUPER::catdir('', @_); + } + + $self->SUPER::catdir(@_); +} + +=pod + +=item file_name_is_absolute + +True is returned if the file name begins with C<drive_letter:>, +and if not, File::Spec::Unix file_name_is_absolute() is called. + +=cut + + +sub file_name_is_absolute { + my ($self,$file) = @_; + return 1 if $file =~ m{^([a-z]:)?[\\/]}is; # C:/test + return $self->SUPER::file_name_is_absolute($file); +} + +=item tmpdir (override) + +Returns a string representation of the first existing directory +from the following list: + + $ENV{TMPDIR} + /tmp + $ENV{'TMP'} + $ENV{'TEMP'} + C:/temp + +If running under taint mode, and if the environment +variables are tainted, they are not used. + +=cut + +sub tmpdir { + my $cached = $_[0]->_cached_tmpdir(qw 'TMPDIR TMP TEMP'); + return $cached if defined $cached; + $_[0]->_cache_tmpdir( + $_[0]->_tmpdir( + $ENV{TMPDIR}, "/tmp", $ENV{'TMP'}, $ENV{'TEMP'}, 'C:/temp' + ), + qw 'TMPDIR TMP TEMP' + ); +} + +=item case_tolerant + +Override Unix. Cygwin case-tolerance depends on managed mount settings and +as with MsWin32 on GetVolumeInformation() $ouFsFlags == FS_CASE_SENSITIVE, +indicating the case significance when comparing file specifications. +Default: 1 + +=cut + +sub case_tolerant { + return 1 unless $^O eq 'cygwin' + and defined &Cygwin::mount_flags; + + my $drive = shift; + if (! $drive) { + my @flags = split(/,/, Cygwin::mount_flags('/cygwin')); + my $prefix = pop(@flags); + if (! $prefix || $prefix eq 'cygdrive') { + $drive = '/cygdrive/c'; + } elsif ($prefix eq '/') { + $drive = '/c'; + } else { + $drive = "$prefix/c"; + } + } + my $mntopts = Cygwin::mount_flags($drive); + if ($mntopts and ($mntopts =~ /,managed/)) { + return 0; + } + eval { require Win32API::File; } or return 1; + my $osFsType = "\0"x256; + my $osVolName = "\0"x256; + my $ouFsFlags = 0; + Win32API::File::GetVolumeInformation($drive, $osVolName, 256, [], [], $ouFsFlags, $osFsType, 256 ); + if ($ouFsFlags & Win32API::File::FS_CASE_SENSITIVE()) { return 0; } + else { return 1; } +} + +=back + +=head1 COPYRIGHT + +Copyright (c) 2004,2007 by the Perl 5 Porters. All rights reserved. + +This program is free software; you can redistribute it and/or modify +it under the same terms as Perl itself. + +=cut + +1; diff --git a/cpan/dist/PathTools/lib/File/Spec/Epoc.pm b/cpan/dist/PathTools/lib/File/Spec/Epoc.pm new file mode 100644 index 00000000..17e3f54d --- /dev/null +++ b/cpan/dist/PathTools/lib/File/Spec/Epoc.pm @@ -0,0 +1,79 @@ +package File::Spec::Epoc; + +use strict; +use vars qw($VERSION @ISA); + +$VERSION = '3.62'; +$VERSION =~ tr/_//d; + +require File::Spec::Unix; +@ISA = qw(File::Spec::Unix); + +=head1 NAME + +File::Spec::Epoc - methods for Epoc file specs + +=head1 SYNOPSIS + + require File::Spec::Epoc; # Done internally by File::Spec if needed + +=head1 DESCRIPTION + +See File::Spec::Unix for a documentation of the methods provided +there. This package overrides the implementation of these methods, not +the semantics. + +This package is still a work in progress. ;-) + +=cut + +sub case_tolerant { + return 1; +} + +=pod + +=over 4 + +=item canonpath() + +No physical check on the filesystem, but a logical cleanup of a +path. On UNIX eliminated successive slashes and successive "/.". + +=back + +=cut + +sub canonpath { + my ($self,$path) = @_; + return unless defined $path; + + $path =~ s|/+|/|g; # xx////xx -> xx/xx + $path =~ s|(/\.)+/|/|g; # xx/././xx -> xx/xx + $path =~ s|^(\./)+||s unless $path eq "./"; # ./xx -> xx + $path =~ s|^/(\.\./)+|/|s; # /../../xx -> xx + $path =~ s|/\Z(?!\n)|| unless $path eq "/"; # xx/ -> xx + return $path; +} + +=pod + +=head1 AUTHOR + +o.flebbe@gmx.de + +=head1 COPYRIGHT + +Copyright (c) 2004 by the Perl 5 Porters. All rights reserved. + +This program is free software; you can redistribute it and/or modify +it under the same terms as Perl itself. + +=head1 SEE ALSO + +See L<File::Spec> and L<File::Spec::Unix>. This package overrides the +implementation of these methods, not the semantics. + +=cut + +1; diff --git a/cpan/dist/PathTools/lib/File/Spec/Functions.pm b/cpan/dist/PathTools/lib/File/Spec/Functions.pm new file mode 100644 index 00000000..470c7718 --- /dev/null +++ b/cpan/dist/PathTools/lib/File/Spec/Functions.pm @@ -0,0 +1,130 @@ +package File::Spec::Functions; + +use File::Spec; +use strict; + +use vars qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $VERSION); + +$VERSION = '3.62'; +$VERSION =~ tr/_//d; + +require Exporter; + +@ISA = qw(Exporter); + +@EXPORT = qw( + canonpath + catdir + catfile + curdir + rootdir + updir + no_upwards + file_name_is_absolute + path +); + +@EXPORT_OK = qw( + devnull + tmpdir + splitpath + splitdir + catpath + abs2rel + rel2abs + case_tolerant +); + +%EXPORT_TAGS = ( ALL => [ @EXPORT_OK, @EXPORT ] ); + +require File::Spec::Unix; +my %udeps = ( + canonpath => [], + catdir => [qw(canonpath)], + catfile => [qw(canonpath catdir)], + case_tolerant => [], + curdir => [], + devnull => [], + rootdir => [], + updir => [], +); + +foreach my $meth (@EXPORT, @EXPORT_OK) { + my $sub = File::Spec->can($meth); + no strict 'refs'; + if (exists($udeps{$meth}) && $sub == File::Spec::Unix->can($meth) && + !(grep { + File::Spec->can($_) != File::Spec::Unix->can($_) + } @{$udeps{$meth}}) && + defined(&{"File::Spec::Unix::_fn_$meth"})) { + *{$meth} = \&{"File::Spec::Unix::_fn_$meth"}; + } else { + *{$meth} = sub {&$sub('File::Spec', @_)}; + } +} + + +1; +__END__ + +=head1 NAME + +File::Spec::Functions - portably perform operations on file names + +=head1 SYNOPSIS + + use File::Spec::Functions; + $x = catfile('a','b'); + +=head1 DESCRIPTION + +This module exports convenience functions for all of the class methods +provided by File::Spec. + +For a reference of available functions, please consult L<File::Spec::Unix>, +which contains the entire set, and which is inherited by the modules for +other platforms. For further information, please see L<File::Spec::Mac>, +L<File::Spec::OS2>, L<File::Spec::Win32>, or L<File::Spec::VMS>. + +=head2 Exports + +The following functions are exported by default. + + canonpath + catdir + catfile + curdir + rootdir + updir + no_upwards + file_name_is_absolute + path + + +The following functions are exported only by request. + + devnull + tmpdir + splitpath + splitdir + catpath + abs2rel + rel2abs + case_tolerant + +All the functions may be imported using the C<:ALL> tag. + +=head1 COPYRIGHT + +Copyright (c) 2004 by the Perl 5 Porters. All rights reserved. + +This program is free software; you can redistribute it and/or modify +it under the same terms as Perl itself. + +=head1 SEE ALSO + +File::Spec, File::Spec::Unix, File::Spec::Mac, File::Spec::OS2, +File::Spec::Win32, File::Spec::VMS, ExtUtils::MakeMaker + +=cut + diff --git a/cpan/dist/PathTools/lib/File/Spec/Mac.pm b/cpan/dist/PathTools/lib/File/Spec/Mac.pm new file mode 100644 index 00000000..329451fb --- /dev/null +++ b/cpan/dist/PathTools/lib/File/Spec/Mac.pm @@ -0,0 +1,786 @@ +package File::Spec::Mac; + +use strict; +use vars qw(@ISA $VERSION); +require File::Spec::Unix; + +$VERSION = '3.62'; +$VERSION =~ tr/_//d; + +@ISA = qw(File::Spec::Unix); + +my $macfiles; +if ($^O eq 'MacOS') { + $macfiles = eval { require Mac::Files }; +} + +sub case_tolerant { 1 } + + +=head1 NAME + +File::Spec::Mac - File::Spec for Mac OS (Classic) + +=head1 SYNOPSIS + + require File::Spec::Mac; # Done internally by File::Spec if needed + +=head1 DESCRIPTION + +Methods for manipulating file specifications. + +=head1 METHODS + +=over 2 + +=item canonpath + +On Mac OS, there's nothing to be done. Returns what it's given. + +=cut + +sub canonpath { + my ($self,$path) = @_; + return $path; +} + +=item catdir() + +Concatenate two or more directory names to form a path separated by colons +(":") ending with a directory. Resulting paths are B<relative> by default, +but can be forced to be absolute (but avoid this, see below). Automatically +puts a trailing ":" on the end of the complete path, because that's what's +done in MacPerl's environment and helps to distinguish a file path from a +directory path. + +B<IMPORTANT NOTE:> Beginning with version 1.3 of this module, the resulting +path is relative by default and I<not> absolute. This decision was made due +to portability reasons. Since C<File::Spec-E<gt>catdir()> returns relative paths +on all other operating systems, it will now also follow this convention on Mac +OS. Note that this may break some existing scripts. + +The intended purpose of this routine is to concatenate I<directory names>. +But because of the nature of Macintosh paths, some additional possibilities +are allowed to make using this routine give reasonable results for some +common situations. In other words, you are also allowed to concatenate +I<paths> instead of directory names (strictly speaking, a string like ":a" +is a path, but not a name, since it contains a punctuation character ":"). + +So, beside calls like + + catdir("a") = ":a:" + catdir("a","b") = ":a:b:" + catdir() = "" (special case) + +calls like the following + + catdir(":a:") = ":a:" + catdir(":a","b") = ":a:b:" + catdir(":a:","b") = ":a:b:" + catdir(":a:",":b:") = ":a:b:" + catdir(":") = ":" + +are allowed. + +Here are the rules that are used in C<catdir()>; note that we try to be as +compatible as possible to Unix: + +=over 2 + +=item 1. + +The resulting path is relative by default, i.e. the resulting path will have a +leading colon. + +=item 2. + +A trailing colon is added automatically to the resulting path, to denote a +directory. + +=item 3. + +Generally, each argument has one leading ":" and one trailing ":" +removed (if any). They are then joined together by a ":". Special +treatment applies for arguments denoting updir paths like "::lib:", +see (4), or arguments consisting solely of colons ("colon paths"), +see (5). + +=item 4. + +When an updir path like ":::lib::" is passed as argument, the number +of directories to climb up is handled correctly, not removing leading +or trailing colons when necessary. E.g. + + catdir(":::a","::b","c") = ":::a::b:c:" + catdir(":::a::","::b","c") = ":::a:::b:c:" + +=item 5. + +Adding a colon ":" or empty string "" to a path at I<any> position +doesn't alter the path, i.e. these arguments are ignored. (When a "" +is passed as the first argument, it has a special meaning, see +(6)). This way, a colon ":" is handled like a "." (curdir) on Unix, +while an empty string "" is generally ignored (see +C<Unix-E<gt>canonpath()> ). Likewise, a "::" is handled like a ".." +(updir), and a ":::" is handled like a "../.." etc. E.g. + + catdir("a",":",":","b") = ":a:b:" + catdir("a",":","::",":b") = ":a::b:" + +=item 6. + +If the first argument is an empty string "" or is a volume name, i.e. matches +the pattern /^[^:]+:/, the resulting path is B<absolute>. + +=item 7. + +Passing an empty string "" as the first argument to C<catdir()> is +like passingC<File::Spec-E<gt>rootdir()> as the first argument, i.e. + + catdir("","a","b") is the same as + + catdir(rootdir(),"a","b"). + +This is true on Unix, where C<catdir("","a","b")> yields "/a/b" and +C<rootdir()> is "/". Note that C<rootdir()> on Mac OS is the startup +volume, which is the closest in concept to Unix' "/". This should help +to run existing scripts originally written for Unix. + +=item 8. + +For absolute paths, some cleanup is done, to ensure that the volume +name isn't immediately followed by updirs. This is invalid, because +this would go beyond "root". Generally, these cases are handled like +their Unix counterparts: + + Unix: + Unix->catdir("","") = "/" + Unix->catdir("",".") = "/" + Unix->catdir("","..") = "/" # can't go + # beyond root + Unix->catdir("",".","..","..","a") = "/a" + Mac: + Mac->catdir("","") = rootdir() # (e.g. "HD:") + Mac->catdir("",":") = rootdir() + Mac->catdir("","::") = rootdir() # can't go + # beyond root + Mac->catdir("",":","::","::","a") = rootdir() . "a:" + # (e.g. "HD:a:") + +However, this approach is limited to the first arguments following +"root" (again, see C<Unix-E<gt>canonpath()> ). If there are more +arguments that move up the directory tree, an invalid path going +beyond root can be created. + +=back + +As you've seen, you can force C<catdir()> to create an absolute path +by passing either an empty string or a path that begins with a volume +name as the first argument. However, you are strongly encouraged not +to do so, since this is done only for backward compatibility. Newer +versions of File::Spec come with a method called C<catpath()> (see +below), that is designed to offer a portable solution for the creation +of absolute paths. It takes volume, directory and file portions and +returns an entire path. While C<catdir()> is still suitable for the +concatenation of I<directory names>, you are encouraged to use +C<catpath()> to concatenate I<volume names> and I<directory +paths>. E.g. + + $dir = File::Spec->catdir("tmp","sources"); + $abs_path = File::Spec->catpath("MacintoshHD:", $dir,""); + +yields + + "MacintoshHD:tmp:sources:" . + +=cut + +sub catdir { + my $self = shift; + return '' unless @_; + my @args = @_; + my $first_arg; + my $relative; + + # take care of the first argument + + if ($args[0] eq '') { # absolute path, rootdir + shift @args; + $relative = 0; + $first_arg = $self->rootdir; + + } elsif ($args[0] =~ /^[^:]+:/) { # absolute path, volume name + $relative = 0; + $first_arg = shift @args; + # add a trailing ':' if need be (may be it's a path like HD:dir) + $first_arg = "$first_arg:" unless ($first_arg =~ /:\Z(?!\n)/); + + } else { # relative path + $relative = 1; + if ( $args[0] =~ /^::+\Z(?!\n)/ ) { + # updir colon path ('::', ':::' etc.), don't shift + $first_arg = ':'; + } elsif ($args[0] eq ':') { + $first_arg = shift @args; + } else { + # add a trailing ':' if need be + $first_arg = shift @args; + $first_arg = "$first_arg:" unless ($first_arg =~ /:\Z(?!\n)/); + } + } + + # For all other arguments, + # (a) ignore arguments that equal ':' or '', + # (b) handle updir paths specially: + # '::' -> concatenate '::' + # '::' . '::' -> concatenate ':::' etc. + # (c) add a trailing ':' if need be + + my $result = $first_arg; + while (@args) { + my $arg = shift @args; + unless (($arg eq '') || ($arg eq ':')) { + if ($arg =~ /^::+\Z(?!\n)/ ) { # updir colon path like ':::' + my $updir_count = length($arg) - 1; + while ((@args) && ($args[0] =~ /^::+\Z(?!\n)/) ) { # while updir colon path + $arg = shift @args; + $updir_count += (length($arg) - 1); + } + $arg = (':' x $updir_count); + } else { + $arg =~ s/^://s; # remove a leading ':' if any + $arg = "$arg:" unless ($arg =~ /:\Z(?!\n)/); # ensure trailing ':' + } + $result .= $arg; + }#unless + } + + if ( ($relative) && ($result !~ /^:/) ) { + # add a leading colon if need be + $result = ":$result"; + } + + unless ($relative) { + # remove updirs immediately following the volume name + $result =~ s/([^:]+:)(:*)(.*)\Z(?!\n)/$1$3/; + } + + return $result; +} + +=item catfile + +Concatenate one or more directory names and a filename to form a +complete path ending with a filename. Resulting paths are B<relative> +by default, but can be forced to be absolute (but avoid this). + +B<IMPORTANT NOTE:> Beginning with version 1.3 of this module, the +resulting path is relative by default and I<not> absolute. This +decision was made due to portability reasons. Since +C<File::Spec-E<gt>catfile()> returns relative paths on all other +operating systems, it will now also follow this convention on Mac OS. +Note that this may break some existing scripts. + +The last argument is always considered to be the file portion. Since +C<catfile()> uses C<catdir()> (see above) for the concatenation of the +directory portions (if any), the following with regard to relative and +absolute paths is true: + + catfile("") = "" + catfile("file") = "file" + +but + + catfile("","") = rootdir() # (e.g. "HD:") + catfile("","file") = rootdir() . file # (e.g. "HD:file") + catfile("HD:","file") = "HD:file" + +This means that C<catdir()> is called only when there are two or more +arguments, as one might expect. + +Note that the leading ":" is removed from the filename, so that + + catfile("a","b","file") = ":a:b:file" and + + catfile("a","b",":file") = ":a:b:file" + +give the same answer. + +To concatenate I<volume names>, I<directory paths> and I<filenames>, +you are encouraged to use C<catpath()> (see below). + +=cut + +sub catfile { + my $self = shift; + return '' unless @_; + my $file = pop @_; + return $file unless @_; + my $dir = $self->catdir(@_); + $file =~ s/^://s; + return $dir.$file; +} + +=item curdir + +Returns a string representing the current directory. On Mac OS, this is ":". + +=cut + +sub curdir { + return ":"; +} + +=item devnull + +Returns a string representing the null device. On Mac OS, this is "Dev:Null". + +=cut + +sub devnull { + return "Dev:Null"; +} + +=item rootdir + +Returns a string representing the root directory. Under MacPerl, +returns the name of the startup volume, since that's the closest in +concept, although other volumes aren't rooted there. The name has a +trailing ":", because that's the correct specification for a volume +name on Mac OS. + +If Mac::Files could not be loaded, the empty string is returned. + +=cut + +sub rootdir { +# +# There's no real root directory on Mac OS. The name of the startup +# volume is returned, since that's the closest in concept. +# + return '' unless $macfiles; + my $system = Mac::Files::FindFolder(&Mac::Files::kOnSystemDisk, + &Mac::Files::kSystemFolderType); + $system =~ s/:.*\Z(?!\n)/:/s; + return $system; +} + +=item tmpdir + +Returns the contents of $ENV{TMPDIR}, if that directory exits or the +current working directory otherwise. Under MacPerl, $ENV{TMPDIR} will +contain a path like "MacintoshHD:Temporary Items:", which is a hidden +directory on your startup volume. + +=cut + +sub tmpdir { + my $cached = $_[0]->_cached_tmpdir('TMPDIR'); + return $cached if defined $cached; + $_[0]->_cache_tmpdir($_[0]->_tmpdir( $ENV{TMPDIR} ), 'TMPDIR'); +} + +=item updir + +Returns a string representing the parent directory. On Mac OS, this is "::". + +=cut + +sub updir { + return "::"; +} + +=item file_name_is_absolute + +Takes as argument a path and returns true, if it is an absolute path. +If the path has a leading ":", it's a relative path. Otherwise, it's an +absolute path, unless the path doesn't contain any colons, i.e. it's a name +like "a". In this particular case, the path is considered to be relative +(i.e. it is considered to be a filename). Use ":" in the appropriate place +in the path if you want to distinguish unambiguously. As a special case, +the filename '' is always considered to be absolute. Note that with version +1.2 of File::Spec::Mac, this does no longer consult the local filesystem. + +E.g. + + File::Spec->file_name_is_absolute("a"); # false (relative) + File::Spec->file_name_is_absolute(":a:b:"); # false (relative) + File::Spec->file_name_is_absolute("MacintoshHD:"); + # true (absolute) + File::Spec->file_name_is_absolute(""); # true (absolute) + + +=cut + +sub file_name_is_absolute { + my ($self,$file) = @_; + if ($file =~ /:/) { + return (! ($file =~ m/^:/s) ); + } elsif ( $file eq '' ) { + return 1 ; + } else { + return 0; # i.e. a file like "a" + } +} + +=item path + +Returns the null list for the MacPerl application, since the concept is +usually meaningless under Mac OS. But if you're using the MacPerl tool under +MPW, it gives back $ENV{Commands} suitably split, as is done in +:lib:ExtUtils:MM_Mac.pm. + +=cut + +sub path { +# +# The concept is meaningless under the MacPerl application. +# Under MPW, it has a meaning. +# + return unless exists $ENV{Commands}; + return split(/,/, $ENV{Commands}); +} + +=item splitpath + + ($volume,$directories,$file) = File::Spec->splitpath( $path ); + ($volume,$directories,$file) = File::Spec->splitpath( $path, + $no_file ); + +Splits a path into volume, directory, and filename portions. + +On Mac OS, assumes that the last part of the path is a filename unless +$no_file is true or a trailing separator ":" is present. + +The volume portion is always returned with a trailing ":". The directory portion +is always returned with a leading (to denote a relative path) and a trailing ":" +(to denote a directory). The file portion is always returned I<without> a leading ":". +Empty portions are returned as empty string ''. + +The results can be passed to C<catpath()> to get back a path equivalent to +(usually identical to) the original path. + + +=cut + +sub splitpath { + my ($self,$path, $nofile) = @_; + my ($volume,$directory,$file); + + if ( $nofile ) { + ( $volume, $directory ) = $path =~ m|^((?:[^:]+:)?)(.*)|s; + } + else { + $path =~ + m|^( (?: [^:]+: )? ) + ( (?: .*: )? ) + ( .* ) + |xs; + $volume = $1; + $directory = $2; + $file = $3; + } + + $volume = '' unless defined($volume); + $directory = ":$directory" if ( $volume && $directory ); # take care of "HD::dir" + if ($directory) { + # Make sure non-empty directories begin and end in ':' + $directory .= ':' unless (substr($directory,-1) eq ':'); + $directory = ":$directory" unless (substr($directory,0,1) eq ':'); + } else { + $directory = ''; + } + $file = '' unless defined($file); + + return ($volume,$directory,$file); +} + + +=item splitdir + +The opposite of C<catdir()>. + + @dirs = File::Spec->splitdir( $directories ); + +$directories should be only the directory portion of the path on systems +that have the concept of a volume or that have path syntax that differentiates +files from directories. Consider using C<splitpath()> otherwise. + +Unlike just splitting the directories on the separator, empty directory names +(C<"">) can be returned. Since C<catdir()> on Mac OS always appends a trailing +colon to distinguish a directory path from a file path, a single trailing colon +will be ignored, i.e. there's no empty directory name after it. + +Hence, on Mac OS, both + + File::Spec->splitdir( ":a:b::c:" ); and + File::Spec->splitdir( ":a:b::c" ); + +yield: + + ( "a", "b", "::", "c") + +while + + File::Spec->splitdir( ":a:b::c::" ); + +yields: + + ( "a", "b", "::", "c", "::") + + +=cut + +sub splitdir { + my ($self, $path) = @_; + my @result = (); + my ($head, $sep, $tail, $volume, $directories); + + return @result if ( (!defined($path)) || ($path eq '') ); + return (':') if ($path eq ':'); + + ( $volume, $sep, $directories ) = $path =~ m|^((?:[^:]+:)?)(:*)(.*)|s; + + # deprecated, but handle it correctly + if ($volume) { + push (@result, $volume); + $sep .= ':'; + } + + while ($sep || $directories) { + if (length($sep) > 1) { + my $updir_count = length($sep) - 1; + for (my $i=0; $i<$updir_count; $i++) { + # push '::' updir_count times; + # simulate Unix '..' updirs + push (@result, '::'); + } + } + $sep = ''; + if ($directories) { + ( $head, $sep, $tail ) = $directories =~ m|^((?:[^:]+)?)(:*)(.*)|s; + push (@result, $head); + $directories = $tail; + } + } + return @result; +} + + +=item catpath + + $path = File::Spec->catpath($volume,$directory,$file); + +Takes volume, directory and file portions and returns an entire path. On Mac OS, +$volume, $directory and $file are concatenated. A ':' is inserted if need be. You +may pass an empty string for each portion. If all portions are empty, the empty +string is returned. If $volume is empty, the result will be a relative path, +beginning with a ':'. If $volume and $directory are empty, a leading ":" (if any) +is removed form $file and the remainder is returned. If $file is empty, the +resulting path will have a trailing ':'. + + +=cut + +sub catpath { + my ($self,$volume,$directory,$file) = @_; + + if ( (! $volume) && (! $directory) ) { + $file =~ s/^:// if $file; + return $file ; + } + + # We look for a volume in $volume, then in $directory, but not both + + my ($dir_volume, $dir_dirs) = $self->splitpath($directory, 1); + + $volume = $dir_volume unless length $volume; + my $path = $volume; # may be '' + $path .= ':' unless (substr($path, -1) eq ':'); # ensure trailing ':' + + if ($directory) { + $directory = $dir_dirs if $volume; + $directory =~ s/^://; # remove leading ':' if any + $path .= $directory; + $path .= ':' unless (substr($path, -1) eq ':'); # ensure trailing ':' + } + + if ($file) { + $file =~ s/^://; # remove leading ':' if any + $path .= $file; + } + + return $path; +} + +=item abs2rel + +Takes a destination path and an optional base path and returns a relative path +from the base path to the destination path: + + $rel_path = File::Spec->abs2rel( $path ) ; + $rel_path = File::Spec->abs2rel( $path, $base ) ; + +Note that both paths are assumed to have a notation that distinguishes a +directory path (with trailing ':') from a file path (without trailing ':'). + +If $base is not present or '', then the current working directory is used. +If $base is relative, then it is converted to absolute form using C<rel2abs()>. +This means that it is taken to be relative to the current working directory. + +If $path and $base appear to be on two different volumes, we will not +attempt to resolve the two paths, and we will instead simply return +$path. Note that previous versions of this module ignored the volume +of $base, which resulted in garbage results part of the time. + +If $base doesn't have a trailing colon, the last element of $base is +assumed to be a filename. This filename is ignored. Otherwise all path +components are assumed to be directories. + +If $path is relative, it is converted to absolute form using C<rel2abs()>. +This means that it is taken to be relative to the current working directory. + +Based on code written by Shigio Yamaguchi. + + +=cut + +# maybe this should be done in canonpath() ? +sub _resolve_updirs { + my $path = shift @_; + my $proceed; + + # resolve any updirs, e.g. "HD:tmp::file" -> "HD:file" + do { + $proceed = ($path =~ s/^(.*):[^:]+::(.*?)\z/$1:$2/); + } while ($proceed); + + return $path; +} + + +sub abs2rel { + my($self,$path,$base) = @_; + + # Clean up $path + if ( ! $self->file_name_is_absolute( $path ) ) { + $path = $self->rel2abs( $path ) ; + } + + # Figure out the effective $base and clean it up. + if ( !defined( $base ) || $base eq '' ) { + $base = $self->_cwd(); + } + elsif ( ! $self->file_name_is_absolute( $base ) ) { + $base = $self->rel2abs( $base ) ; + $base = _resolve_updirs( $base ); # resolve updirs in $base + } + else { + $base = _resolve_updirs( $base ); + } + + # Split up paths - ignore $base's file + my ( $path_vol, $path_dirs, $path_file ) = $self->splitpath( $path ); + my ( $base_vol, $base_dirs ) = $self->splitpath( $base ); + + return $path unless lc( $path_vol ) eq lc( $base_vol ); + + # Now, remove all leading components that are the same + my @pathchunks = $self->splitdir( $path_dirs ); + my @basechunks = $self->splitdir( $base_dirs ); + + while ( @pathchunks && + @basechunks && + lc( $pathchunks[0] ) eq lc( $basechunks[0] ) ) { + shift @pathchunks ; + shift @basechunks ; + } + + # @pathchunks now has the directories to descend in to. + # ensure relative path, even if @pathchunks is empty + $path_dirs = $self->catdir( ':', @pathchunks ); + + # @basechunks now contains the number of directories to climb out of. + $base_dirs = (':' x @basechunks) . ':' ; + + return $self->catpath( '', $self->catdir( $base_dirs, $path_dirs ), $path_file ) ; +} + +=item rel2abs + +Converts a relative path to an absolute path: + + $abs_path = File::Spec->rel2abs( $path ) ; + $abs_path = File::Spec->rel2abs( $path, $base ) ; + +Note that both paths are assumed to have a notation that distinguishes a +directory path (with trailing ':') from a file path (without trailing ':'). + +If $base is not present or '', then $base is set to the current working +directory. If $base is relative, then it is converted to absolute form +using C<rel2abs()>. This means that it is taken to be relative to the +current working directory. + +If $base doesn't have a trailing colon, the last element of $base is +assumed to be a filename. This filename is ignored. Otherwise all path +components are assumed to be directories. + +If $path is already absolute, it is returned and $base is ignored. + +Based on code written by Shigio Yamaguchi. + +=cut + +sub rel2abs { + my ($self,$path,$base) = @_; + + if ( ! $self->file_name_is_absolute($path) ) { + # Figure out the effective $base and clean it up. + if ( !defined( $base ) || $base eq '' ) { + $base = $self->_cwd(); + } + elsif ( ! $self->file_name_is_absolute($base) ) { + $base = $self->rel2abs($base) ; + } + + # Split up paths + + # ignore $path's volume + my ( $path_dirs, $path_file ) = ($self->splitpath($path))[1,2] ; + + # ignore $base's file part + my ( $base_vol, $base_dirs ) = $self->splitpath($base) ; + + # Glom them together + $path_dirs = ':' if ($path_dirs eq ''); + $base_dirs =~ s/:$//; # remove trailing ':', if any + $base_dirs = $base_dirs . $path_dirs; + + $path = $self->catpath( $base_vol, $base_dirs, $path_file ); + } + return $path; +} + + +=back + +=head1 AUTHORS + +See the authors list in I<File::Spec>. Mac OS support by Paul Schinder +<schinder@pobox.com> and Thomas Wegner <wegner_thomas@yahoo.com>. + +=head1 COPYRIGHT + +Copyright (c) 2004 by the Perl 5 Porters. All rights reserved. + +This program is free software; you can redistribute it and/or modify +it under the same terms as Perl itself. + +=head1 SEE ALSO + +See L<File::Spec> and L<File::Spec::Unix>. This package overrides the +implementation of these methods, not the semantics. + +=cut + +1; diff --git a/cpan/dist/PathTools/lib/File/Spec/OS2.pm b/cpan/dist/PathTools/lib/File/Spec/OS2.pm new file mode 100644 index 00000000..55e6d335 --- /dev/null +++ b/cpan/dist/PathTools/lib/File/Spec/OS2.pm @@ -0,0 +1,276 @@ +package File::Spec::OS2; + +use strict; +use vars qw(@ISA $VERSION); +require File::Spec::Unix; + +$VERSION = '3.62'; +$VERSION =~ tr/_//d; + +@ISA = qw(File::Spec::Unix); + +sub devnull { + return "/dev/nul"; +} + +sub case_tolerant { + return 1; +} + +sub file_name_is_absolute { + my ($self,$file) = @_; + return scalar($file =~ m{^([a-z]:)?[\\/]}is); +} + +sub path { + my $path = $ENV{PATH}; + $path =~ s:\\:/:g; + my @path = split(';',$path); + foreach (@path) { $_ = '.' if $_ eq '' } + return @path; +} + +sub _cwd { + # In OS/2 the "require Cwd" is unnecessary bloat. + return Cwd::sys_cwd(); +} + +sub tmpdir { + my $cached = $_[0]->_cached_tmpdir(qw 'TMPDIR TEMP TMP'); + return $cached if defined $cached; + my @d = @ENV{qw(TMPDIR TEMP TMP)}; # function call could autovivivy + $_[0]->_cache_tmpdir( + $_[0]->_tmpdir( @d, '/tmp', '/' ), qw 'TMPDIR TEMP TMP' + ); +} + +sub catdir { + my $self = shift; + my @args = @_; + foreach (@args) { + tr[\\][/]; + # append a backslash to each argument unless it has one there + $_ .= "/" unless m{/$}; + } + return $self->canonpath(join('', @args)); +} + +sub canonpath { + my ($self,$path) = @_; + return unless defined $path; + + $path =~ s/^([a-z]:)/\l$1/s; + $path =~ s|\\|/|g; + $path =~ s|([^/])/+|$1/|g; # xx////xx -> xx/xx + $path =~ s|(/\.)+/|/|g; # xx/././xx -> xx/xx + $path =~ s|^(\./)+(?=[^/])||s; # ./xx -> xx + $path =~ s|/\Z(?!\n)|| + unless $path =~ m#^([a-z]:)?/\Z(?!\n)#si;# xx/ -> xx + $path =~ s{^/\.\.$}{/}; # /.. -> / + 1 while $path =~ s{^/\.\.}{}; # /../xx -> /xx + return $path; +} + + +sub splitpath { + my ($self,$path, $nofile) = @_; + my ($volume,$directory,$file) = ('','',''); + if ( $nofile ) { + $path =~ + m{^( (?:[a-zA-Z]:|(?:\\\\|//)[^\\/]+[\\/][^\\/]+)? ) + (.*) + }xs; + $volume = $1; + $directory = $2; + } + else { + $path =~ + m{^ ( (?: [a-zA-Z]: | + (?:\\\\|//)[^\\/]+[\\/][^\\/]+ + )? + ) + ( (?:.*[\\\\/](?:\.\.?\Z(?!\n))?)? ) + (.*) + }xs; + $volume = $1; + $directory = $2; + $file = $3; + } + + return ($volume,$directory,$file); +} + + +sub splitdir { + my ($self,$directories) = @_ ; + split m|[\\/]|, $directories, -1; +} + + +sub catpath { + my ($self,$volume,$directory,$file) = @_; + + # If it's UNC, make sure the glue separator is there, reusing + # whatever separator is first in the $volume + $volume .= $1 + if ( $volume =~ m@^([\\/])[\\/][^\\/]+[\\/][^\\/]+\Z(?!\n)@s && + $directory =~ m@^[^\\/]@s + ) ; + + $volume .= $directory ; + + # If the volume is not just A:, make sure the glue separator is + # there, reusing whatever separator is first in the $volume if possible. + if ( $volume !~ m@^[a-zA-Z]:\Z(?!\n)@s && + $volume =~ m@[^\\/]\Z(?!\n)@ && + $file =~ m@[^\\/]@ + ) { + $volume =~ m@([\\/])@ ; + my $sep = $1 ? $1 : '/' ; + $volume .= $sep ; + } + + $volume .= $file ; + + return $volume ; +} + + +sub abs2rel { + my($self,$path,$base) = @_; + + # Clean up $path + if ( ! $self->file_name_is_absolute( $path ) ) { + $path = $self->rel2abs( $path ) ; + } else { + $path = $self->canonpath( $path ) ; + } + + # Figure out the effective $base and clean it up. + if ( !defined( $base ) || $base eq '' ) { + $base = $self->_cwd(); + } elsif ( ! $self->file_name_is_absolute( $base ) ) { + $base = $self->rel2abs( $base ) ; + } else { + $base = $self->canonpath( $base ) ; + } + + # Split up paths + my ( $path_volume, $path_directories, $path_file ) = $self->splitpath( $path, 1 ) ; + my ( $base_volume, $base_directories ) = $self->splitpath( $base, 1 ) ; + return $path unless $path_volume eq $base_volume; + + # Now, remove all leading components that are the same + my @pathchunks = $self->splitdir( $path_directories ); + my @basechunks = $self->splitdir( $base_directories ); + + while ( @pathchunks && + @basechunks && + lc( $pathchunks[0] ) eq lc( $basechunks[0] ) + ) { + shift @pathchunks ; + shift @basechunks ; + } + + # No need to catdir, we know these are well formed. + $path_directories = CORE::join( '/', @pathchunks ); + $base_directories = CORE::join( '/', @basechunks ); + + # $base_directories now contains the directories the resulting relative + # path must ascend out of before it can descend to $path_directory. So, + # replace all names with $parentDir + + #FA Need to replace between backslashes... + $base_directories =~ s|[^\\/]+|..|g ; + + # Glue the two together, using a separator if necessary, and preventing an + # empty result. + + #FA Must check that new directories are not empty. + if ( $path_directories ne '' && $base_directories ne '' ) { + $path_directories = "$base_directories/$path_directories" ; + } else { + $path_directories = "$base_directories$path_directories" ; + } + + return $self->canonpath( + $self->catpath( "", $path_directories, $path_file ) + ) ; +} + + +sub rel2abs { + my ($self,$path,$base ) = @_; + + if ( ! $self->file_name_is_absolute( $path ) ) { + + if ( !defined( $base ) || $base eq '' ) { + $base = $self->_cwd(); + } + elsif ( ! $self->file_name_is_absolute( $base ) ) { + $base = $self->rel2abs( $base ) ; + } + else { + $base = $self->canonpath( $base ) ; + } + + my ( $path_directories, $path_file ) = + ($self->splitpath( $path, 1 ))[1,2] ; + + my ( $base_volume, $base_directories ) = + $self->splitpath( $base, 1 ) ; + + $path = $self->catpath( + $base_volume, + $self->catdir( $base_directories, $path_directories ), + $path_file + ) ; + } + + return $self->canonpath( $path ) ; +} + +1; +__END__ + +=head1 NAME + +File::Spec::OS2 - methods for OS/2 file specs + +=head1 SYNOPSIS + + require File::Spec::OS2; # Done internally by File::Spec if needed + +=head1 DESCRIPTION + +See L<File::Spec> and L<File::Spec::Unix>. This package overrides the +implementation of these methods, not the semantics. + +Amongst the changes made for OS/2 are... + +=over 4 + +=item tmpdir + +Modifies the list of places temp directory information is looked for. + + $ENV{TMPDIR} + $ENV{TEMP} + $ENV{TMP} + /tmp + / + +=item splitpath + +Volumes can be drive letters or UNC sharenames (\\server\share). + +=back + +=head1 COPYRIGHT + +Copyright (c) 2004 by the Perl 5 Porters. All rights reserved. + +This program is free software; you can redistribute it and/or modify +it under the same terms as Perl itself. + +=cut diff --git a/cpan/dist/PathTools/lib/File/Spec/Unix.pm b/cpan/dist/PathTools/lib/File/Spec/Unix.pm new file mode 100644 index 00000000..586e9b0a --- /dev/null +++ b/cpan/dist/PathTools/lib/File/Spec/Unix.pm @@ -0,0 +1,598 @@ +package File::Spec::Unix; + +use strict; +use vars qw($VERSION); + +$VERSION = '3.62'; +my $xs_version = $VERSION; +$VERSION =~ tr/_//d; + +#dont try to load XSLoader and DynaLoader only to ultimately fail on miniperl +if(!defined &canonpath && defined &DynaLoader::boot_DynaLoader) { + eval {#eval is questionable since we are handling potential errors like + #"Cwd object version 3.48 does not match bootstrap parameter 3.50 + #at lib/DynaLoader.pm line 216." by having this eval + if ( $] >= 5.006 ) { + require XSLoader; + XSLoader::load("Cwd", $xs_version); + } else { + require Cwd; + } + }; +} + +=head1 NAME + +File::Spec::Unix - File::Spec for Unix, base for other File::Spec modules + +=head1 SYNOPSIS + + require File::Spec::Unix; # Done automatically by File::Spec + +=head1 DESCRIPTION + +Methods for manipulating file specifications. Other File::Spec +modules, such as File::Spec::Mac, inherit from File::Spec::Unix and +override specific methods. + +=head1 METHODS + +=over 2 + +=item canonpath() + +No physical check on the filesystem, but a logical cleanup of a +path. On UNIX eliminates successive slashes and successive "/.". + + $cpath = File::Spec->canonpath( $path ) ; + +Note that this does *not* collapse F<x/../y> sections into F<y>. This +is by design. If F</foo> on your system is a symlink to F</bar/baz>, +then F</foo/../quux> is actually F</bar/quux>, not F</quux> as a naive +F<../>-removal would give you. If you want to do this kind of +processing, you probably want C<Cwd>'s C<realpath()> function to +actually traverse the filesystem cleaning up paths like this. + +=cut + +sub _pp_canonpath { + my ($self,$path) = @_; + return unless defined $path; + + # Handle POSIX-style node names beginning with double slash (qnx, nto) + # (POSIX says: "a pathname that begins with two successive slashes + # may be interpreted in an implementation-defined manner, although + # more than two leading slashes shall be treated as a single slash.") + my $node = ''; + my $double_slashes_special = $^O eq 'qnx' || $^O eq 'nto'; + + + if ( $double_slashes_special + && ( $path =~ s{^(//[^/]+)/?\z}{}s || $path =~ s{^(//[^/]+)/}{/}s ) ) { + $node = $1; + } + # This used to be + # $path =~ s|/+|/|g unless ($^O eq 'cygwin'); + # but that made tests 29, 30, 35, 46, and 213 (as of #13272) to fail + # (Mainly because trailing "" directories didn't get stripped). + # Why would cygwin avoid collapsing multiple slashes into one? --jhi + $path =~ s|/{2,}|/|g; # xx////xx -> xx/xx + $path =~ s{(?:/\.)+(?:/|\z)}{/}g; # xx/././xx -> xx/xx + $path =~ s|^(?:\./)+||s unless $path eq "./"; # ./xx -> xx + $path =~ s|^/(?:\.\./)+|/|; # /../../xx -> xx + $path =~ s|^/\.\.$|/|; # /.. -> / + $path =~ s|/\z|| unless $path eq "/"; # xx/ -> xx + return "$node$path"; +} +*canonpath = \&_pp_canonpath unless defined &canonpath; + +=item catdir() + +Concatenate two or more directory names to form a complete path ending +with a directory. But remove the trailing slash from the resulting +string, because it doesn't look good, isn't necessary and confuses +OS2. Of course, if this is the root directory, don't cut off the +trailing slash :-) + +=cut + +sub _pp_catdir { + my $self = shift; + + $self->canonpath(join('/', @_, '')); # '' because need a trailing '/' +} +*catdir = \&_pp_catdir unless defined &catdir; + +=item catfile + +Concatenate one or more directory names and a filename to form a +complete path ending with a filename + +=cut + +sub _pp_catfile { + my $self = shift; + my $file = $self->canonpath(pop @_); + return $file unless @_; + my $dir = $self->catdir(@_); + $dir .= "/" unless substr($dir,-1) eq "/"; + return $dir.$file; +} +*catfile = \&_pp_catfile unless defined &catfile; + +=item curdir + +Returns a string representation of the current directory. "." on UNIX. + +=cut + +sub curdir { '.' } +use constant _fn_curdir => "."; + +=item devnull + +Returns a string representation of the null device. "/dev/null" on UNIX. + +=cut + +sub devnull { '/dev/null' } +use constant _fn_devnull => "/dev/null"; + +=item rootdir + +Returns a string representation of the root directory. "/" on UNIX. + +=cut + +sub rootdir { '/' } +use constant _fn_rootdir => "/"; + +=item tmpdir + +Returns a string representation of the first writable directory from +the following list or the current directory if none from the list are +writable: + + $ENV{TMPDIR} + /tmp + +If running under taint mode, and if $ENV{TMPDIR} +is tainted, it is not used. + +=cut + +my ($tmpdir, %tmpenv); +# Cache and return the calculated tmpdir, recording which env vars +# determined it. +sub _cache_tmpdir { + @tmpenv{@_[2..$#_]} = @ENV{@_[2..$#_]}; + return $tmpdir = $_[1]; +} +# Retrieve the cached tmpdir, checking first whether relevant env vars have +# changed and invalidated the cache. +sub _cached_tmpdir { + shift; + local $^W; + return if grep $ENV{$_} ne $tmpenv{$_}, @_; + return $tmpdir; +} +sub _tmpdir { + my $self = shift; + my @dirlist = @_; + my $taint = do { no strict 'refs'; ${"\cTAINT"} }; + if ($taint) { # Check for taint mode on perl >= 5.8.0 + require Scalar::Util; + @dirlist = grep { ! Scalar::Util::tainted($_) } @dirlist; + } + elsif ($] < 5.007) { # No ${^TAINT} before 5.8 + @dirlist = grep { eval { eval('1'.substr $_,0,0) } } @dirlist; + } + + foreach (@dirlist) { + next unless defined && -d && -w _; + $tmpdir = $_; + last; + } + $tmpdir = $self->curdir unless defined $tmpdir; + $tmpdir = defined $tmpdir && $self->canonpath($tmpdir); + if ( !$self->file_name_is_absolute($tmpdir) ) { + # See [perl #120593] for the full details + # If possible, return a full path, rather than '.' or 'lib', but + # jump through some hoops to avoid returning a tainted value. + ($tmpdir) = grep { + $taint ? ! Scalar::Util::tainted($_) : + $] < 5.007 ? eval { eval('1'.substr $_,0,0) } : 1 + } $self->rel2abs($tmpdir), $tmpdir; + } + return $tmpdir; +} + +sub tmpdir { + my $cached = $_[0]->_cached_tmpdir('TMPDIR'); + return $cached if defined $cached; + $_[0]->_cache_tmpdir($_[0]->_tmpdir( $ENV{TMPDIR}, "/tmp" ), 'TMPDIR'); +} + +=item updir + +Returns a string representation of the parent directory. ".." on UNIX. + +=cut + +sub updir { '..' } +use constant _fn_updir => ".."; + +=item no_upwards + +Given a list of file names, strip out those that refer to a parent +directory. (Does not strip symlinks, only '.', '..', and equivalents.) + +=cut + +sub no_upwards { + my $self = shift; + return grep(!/^\.{1,2}\z/s, @_); +} + +=item case_tolerant + +Returns a true or false value indicating, respectively, that alphabetic +is not or is significant when comparing file specifications. + +=cut + +sub case_tolerant { 0 } +use constant _fn_case_tolerant => 0; + +=item file_name_is_absolute + +Takes as argument a path and returns true if it is an absolute path. + +This does not consult the local filesystem on Unix, Win32, OS/2 or Mac +OS (Classic). It does consult the working environment for VMS (see +L<File::Spec::VMS/file_name_is_absolute>). + +=cut + +sub file_name_is_absolute { + my ($self,$file) = @_; + return scalar($file =~ m:^/:s); +} + +=item path + +Takes no argument, returns the environment variable PATH as an array. + +=cut + +sub path { + return () unless exists $ENV{PATH}; + my @path = split(':', $ENV{PATH}); + foreach (@path) { $_ = '.' if $_ eq '' } + return @path; +} + +=item join + +join is the same as catfile. + +=cut + +sub join { + my $self = shift; + return $self->catfile(@_); +} + +=item splitpath + + ($volume,$directories,$file) = File::Spec->splitpath( $path ); + ($volume,$directories,$file) = File::Spec->splitpath( $path, + $no_file ); + +Splits a path into volume, directory, and filename portions. On systems +with no concept of volume, returns '' for volume. + +For systems with no syntax differentiating filenames from directories, +assumes that the last file is a path unless $no_file is true or a +trailing separator or /. or /.. is present. On Unix this means that $no_file +true makes this return ( '', $path, '' ). + +The directory portion may or may not be returned with a trailing '/'. + +The results can be passed to L</catpath()> to get back a path equivalent to +(usually identical to) the original path. + +=cut + +sub splitpath { + my ($self,$path, $nofile) = @_; + + my ($volume,$directory,$file) = ('','',''); + + if ( $nofile ) { + $directory = $path; + } + else { + $path =~ m|^ ( (?: .* / (?: \.\.?\z )? )? ) ([^/]*) |xs; + $directory = $1; + $file = $2; + } + + return ($volume,$directory,$file); +} + + +=item splitdir + +The opposite of L</catdir()>. + + @dirs = File::Spec->splitdir( $directories ); + +$directories must be only the directory portion of the path on systems +that have the concept of a volume or that have path syntax that differentiates +files from directories. + +Unlike just splitting the directories on the separator, empty +directory names (C<''>) can be returned, because these are significant +on some OSs. + +On Unix, + + File::Spec->splitdir( "/a/b//c/" ); + +Yields: + + ( '', 'a', 'b', '', 'c', '' ) + +=cut + +sub splitdir { + return split m|/|, $_[1], -1; # Preserve trailing fields +} + + +=item catpath() + +Takes volume, directory and file portions and returns an entire path. Under +Unix, $volume is ignored, and directory and file are concatenated. A '/' is +inserted if needed (though if the directory portion doesn't start with +'/' it is not added). On other OSs, $volume is significant. + +=cut + +sub catpath { + my ($self,$volume,$directory,$file) = @_; + + if ( $directory ne '' && + $file ne '' && + substr( $directory, -1 ) ne '/' && + substr( $file, 0, 1 ) ne '/' + ) { + $directory .= "/$file" ; + } + else { + $directory .= $file ; + } + + return $directory ; +} + +=item abs2rel + +Takes a destination path and an optional base path returns a relative path +from the base path to the destination path: + + $rel_path = File::Spec->abs2rel( $path ) ; + $rel_path = File::Spec->abs2rel( $path, $base ) ; + +If $base is not present or '', then L<cwd()|Cwd> is used. If $base is +relative, then it is converted to absolute form using +L</rel2abs()>. This means that it is taken to be relative to +L<cwd()|Cwd>. + +On systems that have a grammar that indicates filenames, this ignores the +$base filename. Otherwise all path components are assumed to be +directories. + +If $path is relative, it is converted to absolute form using L</rel2abs()>. +This means that it is taken to be relative to L<cwd()|Cwd>. + +No checks against the filesystem are made, so the result may not be correct if +C<$base> contains symbolic links. (Apply +L<Cwd::abs_path()|Cwd/abs_path> beforehand if that +is a concern.) On VMS, there is interaction with the working environment, as +logicals and macros are expanded. + +Based on code written by Shigio Yamaguchi. + +=cut + +sub abs2rel { + my($self,$path,$base) = @_; + $base = $self->_cwd() unless defined $base and length $base; + + ($path, $base) = map $self->canonpath($_), $path, $base; + + my $path_directories; + my $base_directories; + + if (grep $self->file_name_is_absolute($_), $path, $base) { + ($path, $base) = map $self->rel2abs($_), $path, $base; + + my ($path_volume) = $self->splitpath($path, 1); + my ($base_volume) = $self->splitpath($base, 1); + + # Can't relativize across volumes + return $path unless $path_volume eq $base_volume; + + $path_directories = ($self->splitpath($path, 1))[1]; + $base_directories = ($self->splitpath($base, 1))[1]; + + # For UNC paths, the user might give a volume like //foo/bar that + # strictly speaking has no directory portion. Treat it as if it + # had the root directory for that volume. + if (!length($base_directories) and $self->file_name_is_absolute($base)) { + $base_directories = $self->rootdir; + } + } + else { + my $wd= ($self->splitpath($self->_cwd(), 1))[1]; + $path_directories = $self->catdir($wd, $path); + $base_directories = $self->catdir($wd, $base); + } + + # Now, remove all leading components that are the same + my @pathchunks = $self->splitdir( $path_directories ); + my @basechunks = $self->splitdir( $base_directories ); + + if ($base_directories eq $self->rootdir) { + return $self->curdir if $path_directories eq $self->rootdir; + shift @pathchunks; + return $self->canonpath( $self->catpath('', $self->catdir( @pathchunks ), '') ); + } + + my @common; + while (@pathchunks && @basechunks && $self->_same($pathchunks[0], $basechunks[0])) { + push @common, shift @pathchunks ; + shift @basechunks ; + } + return $self->curdir unless @pathchunks || @basechunks; + + # @basechunks now contains the directories the resulting relative path + # must ascend out of before it can descend to $path_directory. If there + # are updir components, we must descend into the corresponding directories + # (this only works if they are no symlinks). + my @reverse_base; + while( defined(my $dir= shift @basechunks) ) { + if( $dir ne $self->updir ) { + unshift @reverse_base, $self->updir; + push @common, $dir; + } + elsif( @common ) { + if( @reverse_base && $reverse_base[0] eq $self->updir ) { + shift @reverse_base; + pop @common; + } + else { + unshift @reverse_base, pop @common; + } + } + } + my $result_dirs = $self->catdir( @reverse_base, @pathchunks ); + return $self->canonpath( $self->catpath('', $result_dirs, '') ); +} + +sub _same { + $_[1] eq $_[2]; +} + +=item rel2abs() + +Converts a relative path to an absolute path. + + $abs_path = File::Spec->rel2abs( $path ) ; + $abs_path = File::Spec->rel2abs( $path, $base ) ; + +If $base is not present or '', then L<cwd()|Cwd> is used. If $base is +relative, then it is converted to absolute form using +L</rel2abs()>. This means that it is taken to be relative to +L<cwd()|Cwd>. + +On systems that have a grammar that indicates filenames, this ignores +the $base filename. Otherwise all path components are assumed to be +directories. + +If $path is absolute, it is cleaned up and returned using L</canonpath()>. + +No checks against the filesystem are made. On VMS, there is +interaction with the working environment, as logicals and +macros are expanded. + +Based on code written by Shigio Yamaguchi. + +=cut + +sub rel2abs { + my ($self,$path,$base ) = @_; + + # Clean up $path + if ( ! $self->file_name_is_absolute( $path ) ) { + # Figure out the effective $base and clean it up. + if ( !defined( $base ) || $base eq '' ) { + $base = $self->_cwd(); + } + elsif ( ! $self->file_name_is_absolute( $base ) ) { + $base = $self->rel2abs( $base ) ; + } + else { + $base = $self->canonpath( $base ) ; + } + + # Glom them together + $path = $self->catdir( $base, $path ) ; + } + + return $self->canonpath( $path ) ; +} + +=back + +=head1 COPYRIGHT + +Copyright (c) 2004 by the Perl 5 Porters. All rights reserved. + +This program is free software; you can redistribute it and/or modify +it under the same terms as Perl itself. + +Please submit bug reports and patches to perlbug@perl.org. + +=head1 SEE ALSO + +L<File::Spec> + +=cut + +# Internal routine to File::Spec, no point in making this public since +# it is the standard Cwd interface. Most of the platform-specific +# File::Spec subclasses use this. +sub _cwd { + require Cwd; + Cwd::getcwd(); +} + + +# Internal method to reduce xx\..\yy -> yy +sub _collapse { + my($fs, $path) = @_; + + my $updir = $fs->updir; + my $curdir = $fs->curdir; + + my($vol, $dirs, $file) = $fs->splitpath($path); + my @dirs = $fs->splitdir($dirs); + pop @dirs if @dirs && $dirs[-1] eq ''; + + my @collapsed; + foreach my $dir (@dirs) { + if( $dir eq $updir and # if we have an updir + @collapsed and # and something to collapse + length $collapsed[-1] and # and its not the rootdir + $collapsed[-1] ne $updir and # nor another updir + $collapsed[-1] ne $curdir # nor the curdir + ) + { # then + pop @collapsed; # collapse + } + else { # else + push @collapsed, $dir; # just hang onto it + } + } + + return $fs->catpath($vol, + $fs->catdir(@collapsed), + $file + ); +} + + +1; diff --git a/cpan/dist/PathTools/lib/File/Spec/VMS.pm b/cpan/dist/PathTools/lib/File/Spec/VMS.pm new file mode 100644 index 00000000..600c49fa --- /dev/null +++ b/cpan/dist/PathTools/lib/File/Spec/VMS.pm @@ -0,0 +1,568 @@ +package File::Spec::VMS; + +use strict; +use vars qw(@ISA $VERSION); +require File::Spec::Unix; + +$VERSION = '3.62'; +$VERSION =~ tr/_//d; + +@ISA = qw(File::Spec::Unix); + +use File::Basename; +use VMS::Filespec; + +=head1 NAME + +File::Spec::VMS - methods for VMS file specs + +=head1 SYNOPSIS + + require File::Spec::VMS; # Done internally by File::Spec if needed + +=head1 DESCRIPTION + +See File::Spec::Unix for a documentation of the methods provided +there. This package overrides the implementation of these methods, not +the semantics. + +The default behavior is to allow either VMS or Unix syntax on input and to +return VMS syntax on output unless Unix syntax has been explicitly requested +via the C<DECC$FILENAME_UNIX_REPORT> CRTL feature. + +=over 4 + +=cut + +# Need to look up the feature settings. The preferred way is to use the +# VMS::Feature module, but that may not be available to dual life modules. + +my $use_feature; +BEGIN { + if (eval { local $SIG{__DIE__}; require VMS::Feature; }) { + $use_feature = 1; + } +} + +# Need to look up the UNIX report mode. This may become a dynamic mode +# in the future. +sub _unix_rpt { + my $unix_rpt; + if ($use_feature) { + $unix_rpt = VMS::Feature::current("filename_unix_report"); + } else { + my $env_unix_rpt = $ENV{'DECC$FILENAME_UNIX_REPORT'} || ''; + $unix_rpt = $env_unix_rpt =~ /^[ET1]/i; + } + return $unix_rpt; +} + +=item canonpath (override) + +Removes redundant portions of file specifications and returns results +in native syntax unless Unix filename reporting has been enabled. + +=cut + + +sub canonpath { + my($self,$path) = @_; + + return undef unless defined $path; + + my $unix_rpt = $self->_unix_rpt; + + if ($path =~ m|/|) { + my $pathify = $path =~ m|/\Z(?!\n)|; + $path = $self->SUPER::canonpath($path); + + return $path if $unix_rpt; + $path = $pathify ? vmspath($path) : vmsify($path); + } + + $path =~ s/(?<!\^)</[/; # < and > ==> [ and ] + $path =~ s/(?<!\^)>/]/; + $path =~ s/(?<!\^)\]\[\./\.\]\[/g; # ][. ==> .][ + $path =~ s/(?<!\^)\[000000\.\]\[/\[/g; # [000000.][ ==> [ + $path =~ s/(?<!\^)\[000000\./\[/g; # [000000. ==> [ + $path =~ s/(?<!\^)\.\]\[000000\]/\]/g; # .][000000] ==> ] + $path =~ s/(?<!\^)\.\]\[/\./g; # foo.][bar ==> foo.bar + 1 while ($path =~ s/(?<!\^)([\[\.])(-+)\.(-+)([\.\]])/$1$2$3$4/); + # That loop does the following + # with any amount of dashes: + # .-.-. ==> .--. + # [-.-. ==> [--. + # .-.-] ==> .--] + # [-.-] ==> [--] + 1 while ($path =~ s/(?<!\^)([\[\.])[^\]\.]+\.-(-+)([\]\.])/$1$2$3/); + # That loop does the following + # with any amount (minimum 2) + # of dashes: + # .foo.--. ==> .-. + # .foo.--] ==> .-] + # [foo.--. ==> [-. + # [foo.--] ==> [-] + # + # And then, the remaining cases + $path =~ s/(?<!\^)\[\.-/[-/; # [.- ==> [- + $path =~ s/(?<!\^)\.[^\]\.]+\.-\./\./g; # .foo.-. ==> . + $path =~ s/(?<!\^)\[[^\]\.]+\.-\./\[/g; # [foo.-. ==> [ + $path =~ s/(?<!\^)\.[^\]\.]+\.-\]/\]/g; # .foo.-] ==> ] + # [foo.-] ==> [000000] + $path =~ s/(?<!\^)\[[^\]\.]+\.-\]/\[000000\]/g; + # [] ==> + $path =~ s/(?<!\^)\[\]// unless $path eq '[]'; + return $unix_rpt ? unixify($path) : $path; +} + +=item catdir (override) + +Concatenates a list of file specifications, and returns the result as a +native directory specification unless the Unix filename reporting feature +has been enabled. No check is made for "impossible" cases (e.g. elements +other than the first being absolute filespecs). + +=cut + +sub catdir { + my $self = shift; + my $dir = pop; + + my $unix_rpt = $self->_unix_rpt; + + my @dirs = grep {defined() && length()} @_; + + my $rslt; + if (@dirs) { + my $path = (@dirs == 1 ? $dirs[0] : $self->catdir(@dirs)); + my ($spath,$sdir) = ($path,$dir); + $spath =~ s/\.dir\Z(?!\n)//i; $sdir =~ s/\.dir\Z(?!\n)//i; + + if ($unix_rpt) { + $spath = unixify($spath) unless $spath =~ m#/#; + $sdir= unixify($sdir) unless $sdir =~ m#/#; + return $self->SUPER::catdir($spath, $sdir) + } + + $rslt = vmspath( unixify($spath) . '/' . unixify($sdir)); + + # Special case for VMS absolute directory specs: these will have + # had device prepended during trip through Unix syntax in + # eliminate_macros(), since Unix syntax has no way to express + # "absolute from the top of this device's directory tree". + if ($spath =~ /^[\[<][^.\-]/s) { $rslt =~ s/^[^\[<]+//s; } + + } else { + # Single directory. Return an empty string on null input; otherwise + # just return a canonical path. + + if (not defined $dir or not length $dir) { + $rslt = ''; + } else { + $rslt = $unix_rpt ? $dir : vmspath($dir); + } + } + return $self->canonpath($rslt); +} + +=item catfile (override) + +Concatenates a list of directory specifications with a filename specification +to build a path. + +=cut + +sub catfile { + my $self = shift; + my $tfile = pop(); + my $file = $self->canonpath($tfile); + my @files = grep {defined() && length()} @_; + + my $unix_rpt = $self->_unix_rpt; + + my $rslt; + if (@files) { + my $path = (@files == 1 ? $files[0] : $self->catdir(@files)); + my $spath = $path; + + # Something building a VMS path in pieces may try to pass a + # directory name in filename format, so normalize it. + $spath =~ s/\.dir\Z(?!\n)//i; + + # If the spath ends with a directory delimiter and the file is bare, + # then just concatenate them. + if ($spath =~ /^(?<!\^)[^\)\]\/:>]+\)\Z(?!\n)/s && basename($file) eq $file) { + $rslt = "$spath$file"; + } else { + $rslt = unixify($spath); + $rslt .= (defined($rslt) && length($rslt) ? '/' : '') . unixify($file); + $rslt = vmsify($rslt) unless $unix_rpt; + } + } + else { + # Only passed a single file? + my $xfile = (defined($file) && length($file)) ? $file : ''; + + $rslt = $unix_rpt ? $xfile : vmsify($xfile); + } + return $self->canonpath($rslt) unless $unix_rpt; + + # In Unix report mode, do not strip off redundant path information. + return $rslt; +} + + +=item curdir (override) + +Returns a string representation of the current directory: '[]' or '.' + +=cut + +sub curdir { + my $self = shift @_; + return '.' if ($self->_unix_rpt); + return '[]'; +} + +=item devnull (override) + +Returns a string representation of the null device: '_NLA0:' or '/dev/null' + +=cut + +sub devnull { + my $self = shift @_; + return '/dev/null' if ($self->_unix_rpt); + return "_NLA0:"; +} + +=item rootdir (override) + +Returns a string representation of the root directory: 'SYS$DISK:[000000]' +or '/' + +=cut + +sub rootdir { + my $self = shift @_; + if ($self->_unix_rpt) { + # Root may exist, try it first. + my $try = '/'; + my ($dev1, $ino1) = stat('/'); + my ($dev2, $ino2) = stat('.'); + + # Perl falls back to '.' if it can not determine '/' + if (($dev1 != $dev2) || ($ino1 != $ino2)) { + return $try; + } + # Fall back to UNIX format sys$disk. + return '/sys$disk/'; + } + return 'SYS$DISK:[000000]'; +} + +=item tmpdir (override) + +Returns a string representation of the first writable directory +from the following list or '' if none are writable: + + /tmp if C<DECC$FILENAME_UNIX_REPORT> is enabled. + sys$scratch: + $ENV{TMPDIR} + +If running under taint mode, and if $ENV{TMPDIR} +is tainted, it is not used. + +=cut + +sub tmpdir { + my $self = shift @_; + my $tmpdir = $self->_cached_tmpdir('TMPDIR'); + return $tmpdir if defined $tmpdir; + if ($self->_unix_rpt) { + $tmpdir = $self->_tmpdir('/tmp', '/sys$scratch', $ENV{TMPDIR}); + } + else { + $tmpdir = $self->_tmpdir( 'sys$scratch:', $ENV{TMPDIR} ); + } + $self->_cache_tmpdir($tmpdir, 'TMPDIR'); +} + +=item updir (override) + +Returns a string representation of the parent directory: '[-]' or '..' + +=cut + +sub updir { + my $self = shift @_; + return '..' if ($self->_unix_rpt); + return '[-]'; +} + +=item case_tolerant (override) + +VMS file specification syntax is case-tolerant. + +=cut + +sub case_tolerant { + return 1; +} + +=item path (override) + +Translate logical name DCL$PATH as a searchlist, rather than trying +to C<split> string value of C<$ENV{'PATH'}>. + +=cut + +sub path { + my (@dirs,$dir,$i); + while ($dir = $ENV{'DCL$PATH;' . $i++}) { push(@dirs,$dir); } + return @dirs; +} + +=item file_name_is_absolute (override) + +Checks for VMS directory spec as well as Unix separators. + +=cut + +sub file_name_is_absolute { + my ($self,$file) = @_; + # If it's a logical name, expand it. + $file = $ENV{$file} while $file =~ /^[\w\$\-]+\Z(?!\n)/s && $ENV{$file}; + return scalar($file =~ m!^/!s || + $file =~ m![<\[][^.\-\]>]! || + $file =~ /^[A-Za-z0-9_\$\-\~]+(?<!\^):/); +} + +=item splitpath (override) + + ($volume,$directories,$file) = File::Spec->splitpath( $path ); + ($volume,$directories,$file) = File::Spec->splitpath( $path, + $no_file ); + +Passing a true value for C<$no_file> indicates that the path being +split only contains directory components, even on systems where you +can usually (when not supporting a foreign syntax) tell the difference +between directories and files at a glance. + +=cut + +sub splitpath { + my($self,$path, $nofile) = @_; + my($dev,$dir,$file) = ('','',''); + my $vmsify_path = vmsify($path); + + if ( $nofile ) { + #vmsify('d1/d2/d3') returns '[.d1.d2]d3' + #vmsify('/d1/d2/d3') returns 'd1:[d2]d3' + if( $vmsify_path =~ /(.*)\](.+)/ ){ + $vmsify_path = $1.'.'.$2.']'; + } + $vmsify_path =~ /(.+:)?(.*)/s; + $dir = defined $2 ? $2 : ''; # dir can be '0' + return ($1 || '',$dir,$file); + } + else { + $vmsify_path =~ /(.+:)?([\[<].*[\]>])?(.*)/s; + return ($1 || '',$2 || '',$3); + } +} + +=item splitdir (override) + +Split a directory specification into the components. + +=cut + +sub splitdir { + my($self,$dirspec) = @_; + my @dirs = (); + return @dirs if ( (!defined $dirspec) || ('' eq $dirspec) ); + + $dirspec =~ s/(?<!\^)</[/; # < and > ==> [ and ] + $dirspec =~ s/(?<!\^)>/]/; + $dirspec =~ s/(?<!\^)\]\[\./\.\]\[/g; # ][. ==> .][ + $dirspec =~ s/(?<!\^)\[000000\.\]\[/\[/g; # [000000.][ ==> [ + $dirspec =~ s/(?<!\^)\[000000\./\[/g; # [000000. ==> [ + $dirspec =~ s/(?<!\^)\.\]\[000000\]/\]/g; # .][000000] ==> ] + $dirspec =~ s/(?<!\^)\.\]\[/\./g; # foo.][bar ==> foo.bar + while ($dirspec =~ s/(^|[\[\<\.])\-(\-+)($|[\]\>\.])/$1-.$2$3/g) {} + # That loop does the following + # with any amount of dashes: + # .--. ==> .-.-. + # [--. ==> [-.-. + # .--] ==> .-.-] + # [--] ==> [-.-] + $dirspec = "[$dirspec]" unless $dirspec =~ /(?<!\^)[\[<]/; # make legal + $dirspec =~ s/^(\[|<)\./$1/; + @dirs = split /(?<!\^)\./, vmspath($dirspec); + $dirs[0] =~ s/^[\[<]//s; $dirs[-1] =~ s/[\]>]\Z(?!\n)//s; + @dirs; +} + + +=item catpath (override) + +Construct a complete filespec. + +=cut + +sub catpath { + my($self,$dev,$dir,$file) = @_; + + # We look for a volume in $dev, then in $dir, but not both + my ($dir_volume, $dir_dir, $dir_file) = $self->splitpath($dir); + $dev = $dir_volume unless length $dev; + $dir = length $dir_file ? $self->catfile($dir_dir, $dir_file) : $dir_dir; + + if ($dev =~ m|^(?<!\^)/+([^/]+)|) { $dev = "$1:"; } + else { $dev .= ':' unless $dev eq '' or $dev =~ /:\Z(?!\n)/; } + if (length($dev) or length($dir)) { + $dir = "[$dir]" unless $dir =~ /(?<!\^)[\[<\/]/; + $dir = vmspath($dir); + } + $dir = '' if length($dev) && ($dir eq '[]' || $dir eq '<>'); + "$dev$dir$file"; +} + +=item abs2rel (override) + +Attempt to convert an absolute file specification to a relative specification. + +=cut + +sub abs2rel { + my $self = shift; + return vmspath(File::Spec::Unix::abs2rel( $self, @_ )) + if ((grep m{/}, @_) && !(grep m{(?<!\^)[\[<:]}, @_)); + + my($path,$base) = @_; + $base = $self->_cwd() unless defined $base and length $base; + + # If there is no device or directory syntax on $base, make sure it + # is treated as a directory. + $base = VMS::Filespec::vmspath($base) unless $base =~ m{(?<!\^)[\[<:]}; + + for ($path, $base) { $_ = $self->rel2abs($_) } + + # Are we even starting $path on the same (node::)device as $base? Note that + # logical paths or nodename differences may be on the "same device" + # but the comparison that ignores device differences so as to concatenate + # [---] up directory specs is not even a good idea in cases where there is + # a logical path difference between $path and $base nodename and/or device. + # Hence we fall back to returning the absolute $path spec + # if there is a case blind device (or node) difference of any sort + # and we do not even try to call $parse() or consult %ENV for $trnlnm() + # (this module needs to run on non VMS platforms after all). + + my ($path_volume, $path_directories, $path_file) = $self->splitpath($path); + my ($base_volume, $base_directories, $base_file) = $self->splitpath($base); + return $path unless lc($path_volume) eq lc($base_volume); + + # Now, remove all leading components that are the same + my @pathchunks = $self->splitdir( $path_directories ); + my $pathchunks = @pathchunks; + unshift(@pathchunks,'000000') unless $pathchunks[0] eq '000000'; + my @basechunks = $self->splitdir( $base_directories ); + my $basechunks = @basechunks; + unshift(@basechunks,'000000') unless $basechunks[0] eq '000000'; + + while ( @pathchunks && + @basechunks && + lc( $pathchunks[0] ) eq lc( $basechunks[0] ) + ) { + shift @pathchunks ; + shift @basechunks ; + } + + # @basechunks now contains the directories to climb out of, + # @pathchunks now has the directories to descend in to. + if ((@basechunks > 0) || ($basechunks != $pathchunks)) { + $path_directories = join '.', ('-' x @basechunks, @pathchunks) ; + } + else { + $path_directories = join '.', @pathchunks; + } + $path_directories = '['.$path_directories.']'; + return $self->canonpath( $self->catpath( '', $path_directories, $path_file ) ) ; +} + + +=item rel2abs (override) + +Return an absolute file specification from a relative one. + +=cut + +sub rel2abs { + my $self = shift ; + my ($path,$base ) = @_; + return undef unless defined $path; + if ($path =~ m/\//) { + $path = ( -d $path || $path =~ m/\/\z/ # educated guessing about + ? vmspath($path) # whether it's a directory + : vmsify($path) ); + } + $base = vmspath($base) if defined $base && $base =~ m/\//; + + # Clean up and split up $path + if ( ! $self->file_name_is_absolute( $path ) ) { + # Figure out the effective $base and clean it up. + if ( !defined( $base ) || $base eq '' ) { + $base = $self->_cwd; + } + elsif ( ! $self->file_name_is_absolute( $base ) ) { + $base = $self->rel2abs( $base ) ; + } + else { + $base = $self->canonpath( $base ) ; + } + + # Split up paths + my ( $path_directories, $path_file ) = + ($self->splitpath( $path ))[1,2] ; + + my ( $base_volume, $base_directories ) = + $self->splitpath( $base ) ; + + $path_directories = '' if $path_directories eq '[]' || + $path_directories eq '<>'; + my $sep = '' ; + $sep = '.' + if ( $base_directories =~ m{[^.\]>]\Z(?!\n)} && + $path_directories =~ m{^[^.\[<]}s + ) ; + $base_directories = "$base_directories$sep$path_directories"; + $base_directories =~ s{\.?[\]>][\[<]\.?}{.}; + + $path = $self->catpath( $base_volume, $base_directories, $path_file ); + } + + return $self->canonpath( $path ) ; +} + + +=back + +=head1 COPYRIGHT + +Copyright (c) 2004-14 by the Perl 5 Porters. All rights reserved. + +This program is free software; you can redistribute it and/or modify +it under the same terms as Perl itself. + +=head1 SEE ALSO + +See L<File::Spec> and L<File::Spec::Unix>. This package overrides the +implementation of these methods, not the semantics. + +An explanation of VMS file specs can be found at +L<http://h71000.www7.hp.com/doc/731FINAL/4506/4506pro_014.html#apps_locating_naming_files>. + +=cut + +1; diff --git a/cpan/dist/PathTools/lib/File/Spec/Win32.pm b/cpan/dist/PathTools/lib/File/Spec/Win32.pm new file mode 100644 index 00000000..6df7ee87 --- /dev/null +++ b/cpan/dist/PathTools/lib/File/Spec/Win32.pm @@ -0,0 +1,446 @@ +package File::Spec::Win32; + +use strict; + +use vars qw(@ISA $VERSION); +require File::Spec::Unix; + +$VERSION = '3.62'; +$VERSION =~ tr/_//d; + +@ISA = qw(File::Spec::Unix); + +# Some regexes we use for path splitting +my $DRIVE_RX = '[a-zA-Z]:'; +my $UNC_RX = '(?:\\\\\\\\|//)[^\\\\/]+[\\\\/][^\\\\/]+'; +my $VOL_RX = "(?:$DRIVE_RX|$UNC_RX)"; + + +=head1 NAME + +File::Spec::Win32 - methods for Win32 file specs + +=head1 SYNOPSIS + + require File::Spec::Win32; # Done internally by File::Spec if needed + +=head1 DESCRIPTION + +See File::Spec::Unix for a documentation of the methods provided +there. This package overrides the implementation of these methods, not +the semantics. + +=over 4 + +=item devnull + +Returns a string representation of the null device. + +=cut + +sub devnull { + return "nul"; +} + +sub rootdir { '\\' } + + +=item tmpdir + +Returns a string representation of the first existing directory +from the following list: + + $ENV{TMPDIR} + $ENV{TEMP} + $ENV{TMP} + SYS:/temp + C:\system\temp + C:/temp + /tmp + / + +The SYS:/temp is preferred in Novell NetWare and the C:\system\temp +for Symbian (the File::Spec::Win32 is used also for those platforms). + +If running under taint mode, and if the environment +variables are tainted, they are not used. + +=cut + +sub tmpdir { + my $tmpdir = $_[0]->_cached_tmpdir(qw(TMPDIR TEMP TMP)); + return $tmpdir if defined $tmpdir; + $tmpdir = $_[0]->_tmpdir( map( $ENV{$_}, qw(TMPDIR TEMP TMP) ), + 'SYS:/temp', + 'C:\system\temp', + 'C:/temp', + '/tmp', + '/' ); + $_[0]->_cache_tmpdir($tmpdir, qw(TMPDIR TEMP TMP)); +} + +=item case_tolerant + +MSWin32 case-tolerance depends on GetVolumeInformation() $ouFsFlags == FS_CASE_SENSITIVE, +indicating the case significance when comparing file specifications. +Since XP FS_CASE_SENSITIVE is effectively disabled for the NT subsubsystem. +See http://cygwin.com/ml/cygwin/2007-07/msg00891.html +Default: 1 + +=cut + +sub case_tolerant { + eval { require Win32API::File; } or return 1; + my $drive = shift || "C:"; + my $osFsType = "\0"x256; + my $osVolName = "\0"x256; + my $ouFsFlags = 0; + Win32API::File::GetVolumeInformation($drive, $osVolName, 256, [], [], $ouFsFlags, $osFsType, 256 ); + if ($ouFsFlags & Win32API::File::FS_CASE_SENSITIVE()) { return 0; } + else { return 1; } +} + +=item file_name_is_absolute + +As of right now, this returns 2 if the path is absolute with a +volume, 1 if it's absolute with no volume, 0 otherwise. + +=cut + +sub file_name_is_absolute { + + my ($self,$file) = @_; + + if ($file =~ m{^($VOL_RX)}o) { + my $vol = $1; + return ($vol =~ m{^$UNC_RX}o ? 2 + : $file =~ m{^$DRIVE_RX[\\/]}o ? 2 + : 0); + } + return $file =~ m{^[\\/]} ? 1 : 0; +} + +=item catfile + +Concatenate one or more directory names and a filename to form a +complete path ending with a filename + +=cut + +sub catfile { + shift; + + # Legacy / compatibility support + # + shift, return _canon_cat( "/", @_ ) + if $_[0] eq ""; + + # Compatibility with File::Spec <= 3.26: + # catfile('A:', 'foo') should return 'A:\foo'. + return _canon_cat( ($_[0].'\\'), @_[1..$#_] ) + if $_[0] =~ m{^$DRIVE_RX\z}o; + + return _canon_cat( @_ ); +} + +sub catdir { + shift; + + # Legacy / compatibility support + # + return "" + unless @_; + shift, return _canon_cat( "/", @_ ) + if $_[0] eq ""; + + # Compatibility with File::Spec <= 3.26: + # catdir('A:', 'foo') should return 'A:\foo'. + return _canon_cat( ($_[0].'\\'), @_[1..$#_] ) + if $_[0] =~ m{^$DRIVE_RX\z}o; + + return _canon_cat( @_ ); +} + +sub path { + my @path = split(';', $ENV{PATH}); + s/"//g for @path; + @path = grep length, @path; + unshift(@path, "."); + return @path; +} + +=item canonpath + +No physical check on the filesystem, but a logical cleanup of a +path. On UNIX eliminated successive slashes and successive "/.". +On Win32 makes + + dir1\dir2\dir3\..\..\dir4 -> \dir\dir4 and even + dir1\dir2\dir3\...\dir4 -> \dir\dir4 + +=cut + +sub canonpath { + # Legacy / compatibility support + # + return $_[1] if !defined($_[1]) or $_[1] eq ''; + return _canon_cat( $_[1] ); +} + +=item splitpath + + ($volume,$directories,$file) = File::Spec->splitpath( $path ); + ($volume,$directories,$file) = File::Spec->splitpath( $path, + $no_file ); + +Splits a path into volume, directory, and filename portions. Assumes that +the last file is a path unless the path ends in '\\', '\\.', '\\..' +or $no_file is true. On Win32 this means that $no_file true makes this return +( $volume, $path, '' ). + +Separators accepted are \ and /. + +Volumes can be drive letters or UNC sharenames (\\server\share). + +The results can be passed to L</catpath> to get back a path equivalent to +(usually identical to) the original path. + +=cut + +sub splitpath { + my ($self,$path, $nofile) = @_; + my ($volume,$directory,$file) = ('','',''); + if ( $nofile ) { + $path =~ + m{^ ( $VOL_RX ? ) (.*) }sox; + $volume = $1; + $directory = $2; + } + else { + $path =~ + m{^ ( $VOL_RX ? ) + ( (?:.*[\\/](?:\.\.?\Z(?!\n))?)? ) + (.*) + }sox; + $volume = $1; + $directory = $2; + $file = $3; + } + + return ($volume,$directory,$file); +} + + +=item splitdir + +The opposite of L<catdir()|File::Spec/catdir>. + + @dirs = File::Spec->splitdir( $directories ); + +$directories must be only the directory portion of the path on systems +that have the concept of a volume or that have path syntax that differentiates +files from directories. + +Unlike just splitting the directories on the separator, leading empty and +trailing directory entries can be returned, because these are significant +on some OSs. So, + + File::Spec->splitdir( "/a/b/c" ); + +Yields: + + ( '', 'a', 'b', '', 'c', '' ) + +=cut + +sub splitdir { + my ($self,$directories) = @_ ; + # + # split() likes to forget about trailing null fields, so here we + # check to be sure that there will not be any before handling the + # simple case. + # + if ( $directories !~ m|[\\/]\Z(?!\n)| ) { + return split( m|[\\/]|, $directories ); + } + else { + # + # since there was a trailing separator, add a file name to the end, + # then do the split, then replace it with ''. + # + my( @directories )= split( m|[\\/]|, "${directories}dummy" ) ; + $directories[ $#directories ]= '' ; + return @directories ; + } +} + + +=item catpath + +Takes volume, directory and file portions and returns an entire path. Under +Unix, $volume is ignored, and this is just like catfile(). On other OSs, +the $volume become significant. + +=cut + +sub catpath { + my ($self,$volume,$directory,$file) = @_; + + # If it's UNC, make sure the glue separator is there, reusing + # whatever separator is first in the $volume + my $v; + $volume .= $v + if ( (($v) = $volume =~ m@^([\\/])[\\/][^\\/]+[\\/][^\\/]+\Z(?!\n)@s) && + $directory =~ m@^[^\\/]@s + ) ; + + $volume .= $directory ; + + # If the volume is not just A:, make sure the glue separator is + # there, reusing whatever separator is first in the $volume if possible. + if ( $volume !~ m@^[a-zA-Z]:\Z(?!\n)@s && + $volume =~ m@[^\\/]\Z(?!\n)@ && + $file =~ m@[^\\/]@ + ) { + $volume =~ m@([\\/])@ ; + my $sep = $1 ? $1 : '\\' ; + $volume .= $sep ; + } + + $volume .= $file ; + + return $volume ; +} + +sub _same { + lc($_[1]) eq lc($_[2]); +} + +sub rel2abs { + my ($self,$path,$base ) = @_; + + my $is_abs = $self->file_name_is_absolute($path); + + # Check for volume (should probably document the '2' thing...) + return $self->canonpath( $path ) if $is_abs == 2; + + if ($is_abs) { + # It's missing a volume, add one + my $vol = ($self->splitpath( $self->_cwd() ))[0]; + return $self->canonpath( $vol . $path ); + } + + if ( !defined( $base ) || $base eq '' ) { + require Cwd ; + $base = Cwd::getdcwd( ($self->splitpath( $path ))[0] ) if defined &Cwd::getdcwd ; + $base = $self->_cwd() unless defined $base ; + } + elsif ( ! $self->file_name_is_absolute( $base ) ) { + $base = $self->rel2abs( $base ) ; + } + else { + $base = $self->canonpath( $base ) ; + } + + my ( $path_directories, $path_file ) = + ($self->splitpath( $path, 1 ))[1,2] ; + + my ( $base_volume, $base_directories ) = + $self->splitpath( $base, 1 ) ; + + $path = $self->catpath( + $base_volume, + $self->catdir( $base_directories, $path_directories ), + $path_file + ) ; + + return $self->canonpath( $path ) ; +} + +=back + +=head2 Note For File::Spec::Win32 Maintainers + +Novell NetWare inherits its File::Spec behaviour from File::Spec::Win32. + +=head1 COPYRIGHT + +Copyright (c) 2004,2007 by the Perl 5 Porters. All rights reserved. + +This program is free software; you can redistribute it and/or modify +it under the same terms as Perl itself. + +=head1 SEE ALSO + +See L<File::Spec> and L<File::Spec::Unix>. This package overrides the +implementation of these methods, not the semantics. + +=cut + + +sub _canon_cat # @path -> path +{ + my ($first, @rest) = @_; + + my $volume = $first =~ s{ \A ([A-Za-z]:) ([\\/]?) }{}x # drive letter + ? ucfirst( $1 ).( $2 ? "\\" : "" ) + : $first =~ s{ \A (?:\\\\|//) ([^\\/]+) + (?: [\\/] ([^\\/]+) )? + [\\/]? }{}xs # UNC volume + ? "\\\\$1".( defined $2 ? "\\$2" : "" )."\\" + : $first =~ s{ \A [\\/] }{}x # root dir + ? "\\" + : ""; + my $path = join "\\", $first, @rest; + + $path =~ tr#\\/#\\\\#s; # xx/yy --> xx\yy & xx\\yy --> xx\yy + + # xx/././yy --> xx/yy + $path =~ s{(?: + (?:\A|\\) # at begin or after a slash + \. + (?:\\\.)* # and more + (?:\\|\z) # at end or followed by slash + )+ # performance boost -- I do not know why + }{\\}gx; + + # XXX I do not know whether more dots are supported by the OS supporting + # this ... annotation (NetWare or symbian but not MSWin32). + # Then .... could easily become ../../.. etc: + # Replace \.\.\. by (\.\.\.+) and substitute with + # { $1 . ".." . "\\.." x (length($2)-2) }gex + # ... --> ../.. + $path =~ s{ (\A|\\) # at begin or after a slash + \.\.\. + (?=\\|\z) # at end or followed by slash + }{$1..\\..}gx; + # xx\yy\..\zz --> xx\zz + while ( $path =~ s{(?: + (?:\A|\\) # at begin or after a slash + [^\\]+ # rip this 'yy' off + \\\.\. + (?<!\A\.\.\\\.\.) # do *not* replace ^..\.. + (?<!\\\.\.\\\.\.) # do *not* replace \..\.. + (?:\\|\z) # at end or followed by slash + )+ # performance boost -- I do not know why + }{\\}sx ) {} + + $path =~ s#\A\\##; # \xx --> xx NOTE: this is *not* root + $path =~ s#\\\z##; # xx\ --> xx + + if ( $volume =~ m#\\\z# ) + { # <vol>\.. --> <vol>\ + $path =~ s{ \A # at begin + \.\. + (?:\\\.\.)* # and more + (?:\\|\z) # at end or followed by slash + }{}x; + + return $1 # \\HOST\SHARE\ --> \\HOST\SHARE + if $path eq "" + and $volume =~ m#\A(\\\\.*)\\\z#s; + } + return $path ne "" || $volume ? $volume.$path : "."; +} + +1; diff --git a/cpan/dist/PathTools/ppport.h b/cpan/dist/PathTools/ppport.h new file mode 100644 index 00000000..dd8b73cf --- /dev/null +++ b/cpan/dist/PathTools/ppport.h @@ -0,0 +1,7748 @@ +#if 0 +<<'SKIP'; +#endif +/* +---------------------------------------------------------------------- + + ppport.h -- Perl/Pollution/Portability Version 3.31 + + Automatically created by Devel::PPPort running under perl 5.023001. + + Do NOT edit this file directly! -- Edit PPPort_pm.PL and the + includes in parts/inc/ instead. + + Use 'perldoc ppport.h' to view the documentation below. + +---------------------------------------------------------------------- + +SKIP + +=pod + +=head1 NAME + +ppport.h - Perl/Pollution/Portability version 3.31 + +=head1 SYNOPSIS + + perl ppport.h [options] [source files] + + Searches current directory for files if no [source files] are given + + --help show short help + + --version show version + + --patch=file write one patch file with changes + --copy=suffix write changed copies with suffix + --diff=program use diff program and options + + --compat-version=version provide compatibility with Perl version + --cplusplus accept C++ comments + + --quiet don't output anything except fatal errors + --nodiag don't show diagnostics + --nohints don't show hints + --nochanges don't suggest changes + --nofilter don't filter input files + + --strip strip all script and doc functionality from + ppport.h + + --list-provided list provided API + --list-unsupported list unsupported API + --api-info=name show Perl API portability information + +=head1 COMPATIBILITY + +This version of F<ppport.h> is designed to support operation with Perl +installations back to 5.003, and has been tested up to 5.20. + +=head1 OPTIONS + +=head2 --help + +Display a brief usage summary. + +=head2 --version + +Display the version of F<ppport.h>. + +=head2 --patch=I<file> + +If this option is given, a single patch file will be created if +any changes are suggested. This requires a working diff program +to be installed on your system. + +=head2 --copy=I<suffix> + +If this option is given, a copy of each file will be saved with +the given suffix that contains the suggested changes. This does +not require any external programs. Note that this does not +automagically add a dot between the original filename and the +suffix. If you want the dot, you have to include it in the option +argument. + +If neither C<--patch> or C<--copy> are given, the default is to +simply print the diffs for each file. This requires either +C<Text::Diff> or a C<diff> program to be installed. + +=head2 --diff=I<program> + +Manually set the diff program and options to use. The default +is to use C<Text::Diff>, when installed, and output unified +context diffs. + +=head2 --compat-version=I<version> + +Tell F<ppport.h> to check for compatibility with the given +Perl version. The default is to check for compatibility with Perl +version 5.003. You can use this option to reduce the output +of F<ppport.h> if you intend to be backward compatible only +down to a certain Perl version. + +=head2 --cplusplus + +Usually, F<ppport.h> will detect C++ style comments and +replace them with C style comments for portability reasons. +Using this option instructs F<ppport.h> to leave C++ +comments untouched. + +=head2 --quiet + +Be quiet. Don't print anything except fatal errors. + +=head2 --nodiag + +Don't output any diagnostic messages. Only portability +alerts will be printed. + +=head2 --nohints + +Don't output any hints. Hints often contain useful portability +notes. Warnings will still be displayed. + +=head2 --nochanges + +Don't suggest any changes. Only give diagnostic output and hints +unless these are also deactivated. + +=head2 --nofilter + +Don't filter the list of input files. By default, files not looking +like source code (i.e. not *.xs, *.c, *.cc, *.cpp or *.h) are skipped. + +=head2 --strip + +Strip all script and documentation functionality from F<ppport.h>. +This reduces the size of F<ppport.h> dramatically and may be useful +if you want to include F<ppport.h> in smaller modules without +increasing their distribution size too much. + +The stripped F<ppport.h> will have a C<--unstrip> option that allows +you to undo the stripping, but only if an appropriate C<Devel::PPPort> +module is installed. + +=head2 --list-provided + +Lists the API elements for which compatibility is provided by +F<ppport.h>. Also lists if it must be explicitly requested, +if it has dependencies, and if there are hints or warnings for it. + +=head2 --list-unsupported + +Lists the API elements that are known not to be supported by +F<ppport.h> and below which version of Perl they probably +won't be available or work. + +=head2 --api-info=I<name> + +Show portability information for API elements matching I<name>. +If I<name> is surrounded by slashes, it is interpreted as a regular +expression. + +=head1 DESCRIPTION + +In order for a Perl extension (XS) module to be as portable as possible +across differing versions of Perl itself, certain steps need to be taken. + +=over 4 + +=item * + +Including this header is the first major one. This alone will give you +access to a large part of the Perl API that hasn't been available in +earlier Perl releases. Use + + perl ppport.h --list-provided + +to see which API elements are provided by ppport.h. + +=item * + +You should avoid using deprecated parts of the API. For example, using +global Perl variables without the C<PL_> prefix is deprecated. Also, +some API functions used to have a C<perl_> prefix. Using this form is +also deprecated. You can safely use the supported API, as F<ppport.h> +will provide wrappers for older Perl versions. + +=item * + +If you use one of a few functions or variables that were not present in +earlier versions of Perl, and that can't be provided using a macro, you +have to explicitly request support for these functions by adding one or +more C<#define>s in your source code before the inclusion of F<ppport.h>. + +These functions or variables will be marked C<explicit> in the list shown +by C<--list-provided>. + +Depending on whether you module has a single or multiple files that +use such functions or variables, you want either C<static> or global +variants. + +For a C<static> function or variable (used only in a single source +file), use: + + #define NEED_function + #define NEED_variable + +For a global function or variable (used in multiple source files), +use: + + #define NEED_function_GLOBAL + #define NEED_variable_GLOBAL + +Note that you mustn't have more than one global request for the +same function or variable in your project. + + Function / Variable Static Request Global Request + ----------------------------------------------------------------------------------------- + PL_parser NEED_PL_parser NEED_PL_parser_GLOBAL + PL_signals NEED_PL_signals NEED_PL_signals_GLOBAL + caller_cx() NEED_caller_cx NEED_caller_cx_GLOBAL + eval_pv() NEED_eval_pv NEED_eval_pv_GLOBAL + grok_bin() NEED_grok_bin NEED_grok_bin_GLOBAL + grok_hex() NEED_grok_hex NEED_grok_hex_GLOBAL + grok_number() NEED_grok_number NEED_grok_number_GLOBAL + grok_numeric_radix() NEED_grok_numeric_radix NEED_grok_numeric_radix_GLOBAL + grok_oct() NEED_grok_oct NEED_grok_oct_GLOBAL + load_module() NEED_load_module NEED_load_module_GLOBAL + mg_findext() NEED_mg_findext NEED_mg_findext_GLOBAL + my_snprintf() NEED_my_snprintf NEED_my_snprintf_GLOBAL + my_sprintf() NEED_my_sprintf NEED_my_sprintf_GLOBAL + my_strlcat() NEED_my_strlcat NEED_my_strlcat_GLOBAL + my_strlcpy() NEED_my_strlcpy NEED_my_strlcpy_GLOBAL + newCONSTSUB() NEED_newCONSTSUB NEED_newCONSTSUB_GLOBAL + newRV_noinc() NEED_newRV_noinc NEED_newRV_noinc_GLOBAL + newSV_type() NEED_newSV_type NEED_newSV_type_GLOBAL + newSVpvn_flags() NEED_newSVpvn_flags NEED_newSVpvn_flags_GLOBAL + newSVpvn_share() NEED_newSVpvn_share NEED_newSVpvn_share_GLOBAL + pv_display() NEED_pv_display NEED_pv_display_GLOBAL + pv_escape() NEED_pv_escape NEED_pv_escape_GLOBAL + pv_pretty() NEED_pv_pretty NEED_pv_pretty_GLOBAL + sv_2pv_flags() NEED_sv_2pv_flags NEED_sv_2pv_flags_GLOBAL + sv_2pvbyte() NEED_sv_2pvbyte NEED_sv_2pvbyte_GLOBAL + sv_catpvf_mg() NEED_sv_catpvf_mg NEED_sv_catpvf_mg_GLOBAL + sv_catpvf_mg_nocontext() NEED_sv_catpvf_mg_nocontext NEED_sv_catpvf_mg_nocontext_GLOBAL + sv_pvn_force_flags() NEED_sv_pvn_force_flags NEED_sv_pvn_force_flags_GLOBAL + sv_setpvf_mg() NEED_sv_setpvf_mg NEED_sv_setpvf_mg_GLOBAL + sv_setpvf_mg_nocontext() NEED_sv_setpvf_mg_nocontext NEED_sv_setpvf_mg_nocontext_GLOBAL + sv_unmagicext() NEED_sv_unmagicext NEED_sv_unmagicext_GLOBAL + vload_module() NEED_vload_module NEED_vload_module_GLOBAL + vnewSVpvf() NEED_vnewSVpvf NEED_vnewSVpvf_GLOBAL + warner() NEED_warner NEED_warner_GLOBAL + +To avoid namespace conflicts, you can change the namespace of the +explicitly exported functions / variables using the C<DPPP_NAMESPACE> +macro. Just C<#define> the macro before including C<ppport.h>: + + #define DPPP_NAMESPACE MyOwnNamespace_ + #include "ppport.h" + +The default namespace is C<DPPP_>. + +=back + +The good thing is that most of the above can be checked by running +F<ppport.h> on your source code. See the next section for +details. + +=head1 EXAMPLES + +To verify whether F<ppport.h> is needed for your module, whether you +should make any changes to your code, and whether any special defines +should be used, F<ppport.h> can be run as a Perl script to check your +source code. Simply say: + + perl ppport.h + +The result will usually be a list of patches suggesting changes +that should at least be acceptable, if not necessarily the most +efficient solution, or a fix for all possible problems. + +If you know that your XS module uses features only available in +newer Perl releases, if you're aware that it uses C++ comments, +and if you want all suggestions as a single patch file, you could +use something like this: + + perl ppport.h --compat-version=5.6.0 --cplusplus --patch=test.diff + +If you only want your code to be scanned without any suggestions +for changes, use: + + perl ppport.h --nochanges + +You can specify a different C<diff> program or options, using +the C<--diff> option: + + perl ppport.h --diff='diff -C 10' + +This would output context diffs with 10 lines of context. + +If you want to create patched copies of your files instead, use: + + perl ppport.h --copy=.new + +To display portability information for the C<newSVpvn> function, +use: + + perl ppport.h --api-info=newSVpvn + +Since the argument to C<--api-info> can be a regular expression, +you can use + + perl ppport.h --api-info=/_nomg$/ + +to display portability information for all C<_nomg> functions or + + perl ppport.h --api-info=/./ + +to display information for all known API elements. + +=head1 BUGS + +If this version of F<ppport.h> is causing failure during +the compilation of this module, please check if newer versions +of either this module or C<Devel::PPPort> are available on CPAN +before sending a bug report. + +If F<ppport.h> was generated using the latest version of +C<Devel::PPPort> and is causing failure of this module, please +file a bug report here: L<https://github.com/mhx/Devel-PPPort/issues/> + +Please include the following information: + +=over 4 + +=item 1. + +The complete output from running "perl -V" + +=item 2. + +This file. + +=item 3. + +The name and version of the module you were trying to build. + +=item 4. + +A full log of the build that failed. + +=item 5. + +Any other information that you think could be relevant. + +=back + +For the latest version of this code, please get the C<Devel::PPPort> +module from CPAN. + +=head1 COPYRIGHT + +Version 3.x, Copyright (c) 2004-2013, Marcus Holland-Moritz. + +Version 2.x, Copyright (C) 2001, Paul Marquess. + +Version 1.x, Copyright (C) 1999, Kenneth Albanowski. + +This program is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. + +=head1 SEE ALSO + +See L<Devel::PPPort>. + +=cut + +use strict; + +# Disable broken TRIE-optimization +BEGIN { eval '${^RE_TRIE_MAXBUF} = -1' if $] >= 5.009004 && $] <= 5.009005 } + +my $VERSION = 3.31; + +my %opt = ( + quiet => 0, + diag => 1, + hints => 1, + changes => 1, + cplusplus => 0, + filter => 1, + strip => 0, + version => 0, +); + +my($ppport) = $0 =~ /([\w.]+)$/; +my $LF = '(?:\r\n|[\r\n])'; # line feed +my $HS = "[ \t]"; # horizontal whitespace + +# Never use C comments in this file! +my $ccs = '/'.'*'; +my $cce = '*'.'/'; +my $rccs = quotemeta $ccs; +my $rcce = quotemeta $cce; + +eval { + require Getopt::Long; + Getopt::Long::GetOptions(\%opt, qw( + help quiet diag! filter! hints! changes! cplusplus strip version + patch=s copy=s diff=s compat-version=s + list-provided list-unsupported api-info=s + )) or usage(); +}; + +if ($@ and grep /^-/, @ARGV) { + usage() if "@ARGV" =~ /^--?h(?:elp)?$/; + die "Getopt::Long not found. Please don't use any options.\n"; +} + +if ($opt{version}) { + print "This is $0 $VERSION.\n"; + exit 0; +} + +usage() if $opt{help}; +strip() if $opt{strip}; + +if (exists $opt{'compat-version'}) { + my($r,$v,$s) = eval { parse_version($opt{'compat-version'}) }; + if ($@) { + die "Invalid version number format: '$opt{'compat-version'}'\n"; + } + die "Only Perl 5 is supported\n" if $r != 5; + die "Invalid version number: $opt{'compat-version'}\n" if $v >= 1000 || $s >= 1000; + $opt{'compat-version'} = sprintf "%d.%03d%03d", $r, $v, $s; +} +else { + $opt{'compat-version'} = 5; +} + +my %API = map { /^(\w+)\|([^|]*)\|([^|]*)\|(\w*)$/ + ? ( $1 => { + ($2 ? ( base => $2 ) : ()), + ($3 ? ( todo => $3 ) : ()), + (index($4, 'v') >= 0 ? ( varargs => 1 ) : ()), + (index($4, 'p') >= 0 ? ( provided => 1 ) : ()), + (index($4, 'n') >= 0 ? ( nothxarg => 1 ) : ()), + } ) + : die "invalid spec: $_" } qw( +ASCII_TO_NEED||5.007001|n +AvFILLp|5.004050||p +AvFILL||| +BhkDISABLE||5.021008| +BhkENABLE||5.021008| +BhkENTRY_set||5.021008| +BhkENTRY||| +BhkFLAGS||| +CALL_BLOCK_HOOKS||| +CLASS|||n +CPERLscope|5.005000||p +CX_CURPAD_SAVE||| +CX_CURPAD_SV||| +CopFILEAV|5.006000||p +CopFILEGV_set|5.006000||p +CopFILEGV|5.006000||p +CopFILESV|5.006000||p +CopFILE_set|5.006000||p +CopFILE|5.006000||p +CopSTASHPV_set|5.006000||p +CopSTASHPV|5.006000||p +CopSTASH_eq|5.006000||p +CopSTASH_set|5.006000||p +CopSTASH|5.006000||p +CopyD|5.009002|5.004050|p +Copy||| +CvPADLIST||5.008001| +CvSTASH||| +CvWEAKOUTSIDE||| +DEFSV_set|5.010001||p +DEFSV|5.004050||p +END_EXTERN_C|5.005000||p +ENTER||| +ERRSV|5.004050||p +EXTEND||| +EXTERN_C|5.005000||p +F0convert|||n +FREETMPS||| +GIMME_V||5.004000|n +GIMME|||n +GROK_NUMERIC_RADIX|5.007002||p +G_ARRAY||| +G_DISCARD||| +G_EVAL||| +G_METHOD|5.006001||p +G_NOARGS||| +G_SCALAR||| +G_VOID||5.004000| +GetVars||| +GvAV||| +GvCV||| +GvHV||| +GvSVn|5.009003||p +GvSV||| +Gv_AMupdate||5.011000| +HEf_SVKEY|5.003070||p +HeHASH||5.003070| +HeKEY||5.003070| +HeKLEN||5.003070| +HePV||5.004000| +HeSVKEY_force||5.003070| +HeSVKEY_set||5.004000| +HeSVKEY||5.003070| +HeUTF8|5.010001|5.008000|p +HeVAL||5.003070| +HvENAMELEN||5.015004| +HvENAMEUTF8||5.015004| +HvENAME||5.013007| +HvNAMELEN_get|5.009003||p +HvNAMELEN||5.015004| +HvNAMEUTF8||5.015004| +HvNAME_get|5.009003||p +HvNAME||| +INT2PTR|5.006000||p +IN_LOCALE_COMPILETIME|5.007002||p +IN_LOCALE_RUNTIME|5.007002||p +IN_LOCALE|5.007002||p +IN_PERL_COMPILETIME|5.008001||p +IS_NUMBER_GREATER_THAN_UV_MAX|5.007002||p +IS_NUMBER_INFINITY|5.007002||p +IS_NUMBER_IN_UV|5.007002||p +IS_NUMBER_NAN|5.007003||p +IS_NUMBER_NEG|5.007002||p +IS_NUMBER_NOT_INT|5.007002||p +IVSIZE|5.006000||p +IVTYPE|5.006000||p +IVdf|5.006000||p +LEAVE||| +LINKLIST||5.013006| +LVRET||| +MARK||| +MULTICALL||5.021008| +MUTABLE_PTR|5.010001||p +MUTABLE_SV|5.010001||p +MY_CXT_CLONE|5.009002||p +MY_CXT_INIT|5.007003||p +MY_CXT|5.007003||p +MoveD|5.009002|5.004050|p +Move||| +NATIVE_TO_NEED||5.007001|n +NOOP|5.005000||p +NUM2PTR|5.006000||p +NVTYPE|5.006000||p +NVef|5.006001||p +NVff|5.006001||p +NVgf|5.006001||p +Newxc|5.009003||p +Newxz|5.009003||p +Newx|5.009003||p +Nullav||| +Nullch||| +Nullcv||| +Nullhv||| +Nullsv||| +OP_CLASS||5.013007| +OP_DESC||5.007003| +OP_NAME||5.007003| +OP_TYPE_IS_OR_WAS||5.019010| +OP_TYPE_IS||5.019007| +ORIGMARK||| +OpHAS_SIBLING||5.021007| +OpSIBLING_set||5.021007| +OpSIBLING||5.021007| +PAD_BASE_SV||| +PAD_CLONE_VARS||| +PAD_COMPNAME_FLAGS||| +PAD_COMPNAME_GEN_set||| +PAD_COMPNAME_GEN||| +PAD_COMPNAME_OURSTASH||| +PAD_COMPNAME_PV||| +PAD_COMPNAME_TYPE||| +PAD_RESTORE_LOCAL||| +PAD_SAVE_LOCAL||| +PAD_SAVE_SETNULLPAD||| +PAD_SETSV||| +PAD_SET_CUR_NOSAVE||| +PAD_SET_CUR||| +PAD_SVl||| +PAD_SV||| +PERLIO_FUNCS_CAST|5.009003||p +PERLIO_FUNCS_DECL|5.009003||p +PERL_ABS|5.008001||p +PERL_BCDVERSION|5.021008||p +PERL_GCC_BRACE_GROUPS_FORBIDDEN|5.008001||p +PERL_HASH|5.003070||p +PERL_INT_MAX|5.003070||p +PERL_INT_MIN|5.003070||p +PERL_LONG_MAX|5.003070||p +PERL_LONG_MIN|5.003070||p +PERL_MAGIC_arylen|5.007002||p +PERL_MAGIC_backref|5.007002||p +PERL_MAGIC_bm|5.007002||p +PERL_MAGIC_collxfrm|5.007002||p +PERL_MAGIC_dbfile|5.007002||p +PERL_MAGIC_dbline|5.007002||p +PERL_MAGIC_defelem|5.007002||p +PERL_MAGIC_envelem|5.007002||p +PERL_MAGIC_env|5.007002||p +PERL_MAGIC_ext|5.007002||p +PERL_MAGIC_fm|5.007002||p +PERL_MAGIC_glob|5.021008||p +PERL_MAGIC_isaelem|5.007002||p +PERL_MAGIC_isa|5.007002||p +PERL_MAGIC_mutex|5.021008||p +PERL_MAGIC_nkeys|5.007002||p +PERL_MAGIC_overload_elem|5.021008||p +PERL_MAGIC_overload_table|5.007002||p +PERL_MAGIC_overload|5.021008||p +PERL_MAGIC_pos|5.007002||p +PERL_MAGIC_qr|5.007002||p +PERL_MAGIC_regdata|5.007002||p +PERL_MAGIC_regdatum|5.007002||p +PERL_MAGIC_regex_global|5.007002||p +PERL_MAGIC_shared_scalar|5.007003||p +PERL_MAGIC_shared|5.007003||p +PERL_MAGIC_sigelem|5.007002||p +PERL_MAGIC_sig|5.007002||p +PERL_MAGIC_substr|5.007002||p +PERL_MAGIC_sv|5.007002||p +PERL_MAGIC_taint|5.007002||p +PERL_MAGIC_tiedelem|5.007002||p +PERL_MAGIC_tiedscalar|5.007002||p +PERL_MAGIC_tied|5.007002||p +PERL_MAGIC_utf8|5.008001||p +PERL_MAGIC_uvar_elem|5.007003||p +PERL_MAGIC_uvar|5.007002||p +PERL_MAGIC_vec|5.007002||p +PERL_MAGIC_vstring|5.008001||p +PERL_PV_ESCAPE_ALL|5.009004||p +PERL_PV_ESCAPE_FIRSTCHAR|5.009004||p +PERL_PV_ESCAPE_NOBACKSLASH|5.009004||p +PERL_PV_ESCAPE_NOCLEAR|5.009004||p +PERL_PV_ESCAPE_QUOTE|5.009004||p +PERL_PV_ESCAPE_RE|5.009005||p +PERL_PV_ESCAPE_UNI_DETECT|5.009004||p +PERL_PV_ESCAPE_UNI|5.009004||p +PERL_PV_PRETTY_DUMP|5.009004||p +PERL_PV_PRETTY_ELLIPSES|5.010000||p +PERL_PV_PRETTY_LTGT|5.009004||p +PERL_PV_PRETTY_NOCLEAR|5.010000||p +PERL_PV_PRETTY_QUOTE|5.009004||p +PERL_PV_PRETTY_REGPROP|5.009004||p +PERL_QUAD_MAX|5.003070||p +PERL_QUAD_MIN|5.003070||p +PERL_REVISION|5.006000||p +PERL_SCAN_ALLOW_UNDERSCORES|5.007003||p +PERL_SCAN_DISALLOW_PREFIX|5.007003||p +PERL_SCAN_GREATER_THAN_UV_MAX|5.007003||p +PERL_SCAN_SILENT_ILLDIGIT|5.008001||p +PERL_SHORT_MAX|5.003070||p +PERL_SHORT_MIN|5.003070||p +PERL_SIGNALS_UNSAFE_FLAG|5.008001||p +PERL_SUBVERSION|5.006000||p +PERL_SYS_INIT3||5.006000| +PERL_SYS_INIT||| +PERL_SYS_TERM||5.021008| +PERL_UCHAR_MAX|5.003070||p +PERL_UCHAR_MIN|5.003070||p +PERL_UINT_MAX|5.003070||p +PERL_UINT_MIN|5.003070||p +PERL_ULONG_MAX|5.003070||p +PERL_ULONG_MIN|5.003070||p +PERL_UNUSED_ARG|5.009003||p +PERL_UNUSED_CONTEXT|5.009004||p +PERL_UNUSED_DECL|5.007002||p +PERL_UNUSED_VAR|5.007002||p +PERL_UQUAD_MAX|5.003070||p +PERL_UQUAD_MIN|5.003070||p +PERL_USE_GCC_BRACE_GROUPS|5.009004||p +PERL_USHORT_MAX|5.003070||p +PERL_USHORT_MIN|5.003070||p +PERL_VERSION|5.006000||p +PL_DBsignal|5.005000||p +PL_DBsingle|||pn +PL_DBsub|||pn +PL_DBtrace|||pn +PL_Sv|5.005000||p +PL_bufend|5.021008||p +PL_bufptr|5.021008||p +PL_check||5.006000| +PL_compiling|5.004050||p +PL_comppad_name||5.017004| +PL_comppad||5.008001| +PL_copline|5.021008||p +PL_curcop|5.004050||p +PL_curpad||5.005000| +PL_curstash|5.004050||p +PL_debstash|5.004050||p +PL_defgv|5.004050||p +PL_diehook|5.004050||p +PL_dirty|5.004050||p +PL_dowarn|||pn +PL_errgv|5.004050||p +PL_error_count|5.021008||p +PL_expect|5.021008||p +PL_hexdigit|5.005000||p +PL_hints|5.005000||p +PL_in_my_stash|5.021008||p +PL_in_my|5.021008||p +PL_keyword_plugin||5.011002| +PL_last_in_gv|||n +PL_laststatval|5.005000||p +PL_lex_state|5.021008||p +PL_lex_stuff|5.021008||p +PL_linestr|5.021008||p +PL_modglobal||5.005000|n +PL_na|5.004050||pn +PL_no_modify|5.006000||p +PL_ofsgv|||n +PL_opfreehook||5.011000|n +PL_parser|5.009005||p +PL_peepp||5.007003|n +PL_perl_destruct_level|5.004050||p +PL_perldb|5.004050||p +PL_ppaddr|5.006000||p +PL_rpeepp||5.013005|n +PL_rsfp_filters|5.021008||p +PL_rsfp|5.021008||p +PL_rs|||n +PL_signals|5.008001||p +PL_stack_base|5.004050||p +PL_stack_sp|5.004050||p +PL_statcache|5.005000||p +PL_stdingv|5.004050||p +PL_sv_arenaroot|5.004050||p +PL_sv_no|5.004050||pn +PL_sv_undef|5.004050||pn +PL_sv_yes|5.004050||pn +PL_tainted|5.004050||p +PL_tainting|5.004050||p +PL_tokenbuf|5.021008||p +POP_MULTICALL||5.021008| +POPi|||n +POPl|||n +POPn|||n +POPpbytex||5.007001|n +POPpx||5.005030|n +POPp|||n +POPs|||n +PTR2IV|5.006000||p +PTR2NV|5.006000||p +PTR2UV|5.006000||p +PTR2nat|5.009003||p +PTR2ul|5.007001||p +PTRV|5.006000||p +PUSHMARK||| +PUSH_MULTICALL||5.021008| +PUSHi||| +PUSHmortal|5.009002||p +PUSHn||| +PUSHp||| +PUSHs||| +PUSHu|5.004000||p +PUTBACK||| +PadARRAY||5.021008| +PadMAX||5.021008| +PadlistARRAY||5.021008| +PadlistMAX||5.021008| +PadlistNAMESARRAY||5.021008| +PadlistNAMESMAX||5.021008| +PadlistNAMES||5.021008| +PadlistREFCNT||5.017004| +PadnameIsOUR||| +PadnameIsSTATE||| +PadnameLEN||5.021008| +PadnameOURSTASH||| +PadnameOUTER||| +PadnamePV||5.021008| +PadnameREFCNT_dec||5.021008| +PadnameREFCNT||5.021008| +PadnameSV||5.021008| +PadnameTYPE||| +PadnameUTF8||5.021007| +PadnamelistARRAY||5.021008| +PadnamelistMAX||5.021008| +PadnamelistREFCNT_dec||5.021008| +PadnamelistREFCNT||5.021008| +PerlIO_clearerr||5.007003| +PerlIO_close||5.007003| +PerlIO_context_layers||5.009004| +PerlIO_eof||5.007003| +PerlIO_error||5.007003| +PerlIO_fileno||5.007003| +PerlIO_fill||5.007003| +PerlIO_flush||5.007003| +PerlIO_get_base||5.007003| +PerlIO_get_bufsiz||5.007003| +PerlIO_get_cnt||5.007003| +PerlIO_get_ptr||5.007003| +PerlIO_read||5.007003| +PerlIO_restore_errno||| +PerlIO_save_errno||| +PerlIO_seek||5.007003| +PerlIO_set_cnt||5.007003| +PerlIO_set_ptrcnt||5.007003| +PerlIO_setlinebuf||5.007003| +PerlIO_stderr||5.007003| +PerlIO_stdin||5.007003| +PerlIO_stdout||5.007003| +PerlIO_tell||5.007003| +PerlIO_unread||5.007003| +PerlIO_write||5.007003| +Perl_signbit||5.009005|n +PoisonFree|5.009004||p +PoisonNew|5.009004||p +PoisonWith|5.009004||p +Poison|5.008000||p +READ_XDIGIT||5.017006| +RETVAL|||n +Renewc||| +Renew||| +SAVECLEARSV||| +SAVECOMPPAD||| +SAVEPADSV||| +SAVETMPS||| +SAVE_DEFSV|5.004050||p +SPAGAIN||| +SP||| +START_EXTERN_C|5.005000||p +START_MY_CXT|5.007003||p +STMT_END|||p +STMT_START|||p +STR_WITH_LEN|5.009003||p +ST||| +SV_CONST_RETURN|5.009003||p +SV_COW_DROP_PV|5.008001||p +SV_COW_SHARED_HASH_KEYS|5.009005||p +SV_GMAGIC|5.007002||p +SV_HAS_TRAILING_NUL|5.009004||p +SV_IMMEDIATE_UNREF|5.007001||p +SV_MUTABLE_RETURN|5.009003||p +SV_NOSTEAL|5.009002||p +SV_SMAGIC|5.009003||p +SV_UTF8_NO_ENCODING|5.008001||p +SVfARG|5.009005||p +SVf_UTF8|5.006000||p +SVf|5.006000||p +SVt_INVLIST||5.019002| +SVt_IV||| +SVt_NULL||| +SVt_NV||| +SVt_PVAV||| +SVt_PVCV||| +SVt_PVFM||| +SVt_PVGV||| +SVt_PVHV||| +SVt_PVIO||| +SVt_PVIV||| +SVt_PVLV||| +SVt_PVMG||| +SVt_PVNV||| +SVt_PV||| +SVt_REGEXP||5.011000| +Safefree||| +Slab_Alloc||| +Slab_Free||| +Slab_to_ro||| +Slab_to_rw||| +StructCopy||| +SvCUR_set||| +SvCUR||| +SvEND||| +SvGAMAGIC||5.006001| +SvGETMAGIC|5.004050||p +SvGROW||| +SvIOK_UV||5.006000| +SvIOK_notUV||5.006000| +SvIOK_off||| +SvIOK_only_UV||5.006000| +SvIOK_only||| +SvIOK_on||| +SvIOKp||| +SvIOK||| +SvIVX||| +SvIV_nomg|5.009001||p +SvIV_set||| +SvIVx||| +SvIV||| +SvIsCOW_shared_hash||5.008003| +SvIsCOW||5.008003| +SvLEN_set||| +SvLEN||| +SvLOCK||5.007003| +SvMAGIC_set|5.009003||p +SvNIOK_off||| +SvNIOKp||| +SvNIOK||| +SvNOK_off||| +SvNOK_only||| +SvNOK_on||| +SvNOKp||| +SvNOK||| +SvNVX||| +SvNV_nomg||5.013002| +SvNV_set||| +SvNVx||| +SvNV||| +SvOK||| +SvOOK_offset||5.011000| +SvOOK||| +SvPOK_off||| +SvPOK_only_UTF8||5.006000| +SvPOK_only||| +SvPOK_on||| +SvPOKp||| +SvPOK||| +SvPVX_const|5.009003||p +SvPVX_mutable|5.009003||p +SvPVX||| +SvPV_const|5.009003||p +SvPV_flags_const_nolen|5.009003||p +SvPV_flags_const|5.009003||p +SvPV_flags_mutable|5.009003||p +SvPV_flags|5.007002||p +SvPV_force_flags_mutable|5.009003||p +SvPV_force_flags_nolen|5.009003||p +SvPV_force_flags|5.007002||p +SvPV_force_mutable|5.009003||p +SvPV_force_nolen|5.009003||p +SvPV_force_nomg_nolen|5.009003||p +SvPV_force_nomg|5.007002||p +SvPV_force|||p +SvPV_mutable|5.009003||p +SvPV_nolen_const|5.009003||p +SvPV_nolen|5.006000||p +SvPV_nomg_const_nolen|5.009003||p +SvPV_nomg_const|5.009003||p +SvPV_nomg_nolen|5.013007||p +SvPV_nomg|5.007002||p +SvPV_renew|5.009003||p +SvPV_set||| +SvPVbyte_force||5.009002| +SvPVbyte_nolen||5.006000| +SvPVbytex_force||5.006000| +SvPVbytex||5.006000| +SvPVbyte|5.006000||p +SvPVutf8_force||5.006000| +SvPVutf8_nolen||5.006000| +SvPVutf8x_force||5.006000| +SvPVutf8x||5.006000| +SvPVutf8||5.006000| +SvPVx||| +SvPV||| +SvREFCNT_dec_NN||5.017007| +SvREFCNT_dec||| +SvREFCNT_inc_NN|5.009004||p +SvREFCNT_inc_simple_NN|5.009004||p +SvREFCNT_inc_simple_void_NN|5.009004||p +SvREFCNT_inc_simple_void|5.009004||p +SvREFCNT_inc_simple|5.009004||p +SvREFCNT_inc_void_NN|5.009004||p +SvREFCNT_inc_void|5.009004||p +SvREFCNT_inc|||p +SvREFCNT||| +SvROK_off||| +SvROK_on||| +SvROK||| +SvRV_set|5.009003||p +SvRV||| +SvRXOK||5.009005| +SvRX||5.009005| +SvSETMAGIC||| +SvSHARED_HASH|5.009003||p +SvSHARE||5.007003| +SvSTASH_set|5.009003||p +SvSTASH||| +SvSetMagicSV_nosteal||5.004000| +SvSetMagicSV||5.004000| +SvSetSV_nosteal||5.004000| +SvSetSV||| +SvTAINTED_off||5.004000| +SvTAINTED_on||5.004000| +SvTAINTED||5.004000| +SvTAINT||| +SvTHINKFIRST||| +SvTRUE_nomg||5.013006| +SvTRUE||| +SvTYPE||| +SvUNLOCK||5.007003| +SvUOK|5.007001|5.006000|p +SvUPGRADE||| +SvUTF8_off||5.006000| +SvUTF8_on||5.006000| +SvUTF8||5.006000| +SvUVXx|5.004000||p +SvUVX|5.004000||p +SvUV_nomg|5.009001||p +SvUV_set|5.009003||p +SvUVx|5.004000||p +SvUV|5.004000||p +SvVOK||5.008001| +SvVSTRING_mg|5.009004||p +THIS|||n +UNDERBAR|5.009002||p +UTF8_MAXBYTES|5.009002||p +UVSIZE|5.006000||p +UVTYPE|5.006000||p +UVXf|5.007001||p +UVof|5.006000||p +UVuf|5.006000||p +UVxf|5.006000||p +WARN_ALL|5.006000||p +WARN_AMBIGUOUS|5.006000||p +WARN_ASSERTIONS|5.021008||p +WARN_BAREWORD|5.006000||p +WARN_CLOSED|5.006000||p +WARN_CLOSURE|5.006000||p +WARN_DEBUGGING|5.006000||p +WARN_DEPRECATED|5.006000||p +WARN_DIGIT|5.006000||p +WARN_EXEC|5.006000||p +WARN_EXITING|5.006000||p +WARN_GLOB|5.006000||p +WARN_INPLACE|5.006000||p +WARN_INTERNAL|5.006000||p +WARN_IO|5.006000||p +WARN_LAYER|5.008000||p +WARN_MALLOC|5.006000||p +WARN_MISC|5.006000||p +WARN_NEWLINE|5.006000||p +WARN_NUMERIC|5.006000||p +WARN_ONCE|5.006000||p +WARN_OVERFLOW|5.006000||p +WARN_PACK|5.006000||p +WARN_PARENTHESIS|5.006000||p +WARN_PIPE|5.006000||p +WARN_PORTABLE|5.006000||p +WARN_PRECEDENCE|5.006000||p +WARN_PRINTF|5.006000||p +WARN_PROTOTYPE|5.006000||p +WARN_QW|5.006000||p +WARN_RECURSION|5.006000||p +WARN_REDEFINE|5.006000||p +WARN_REGEXP|5.006000||p +WARN_RESERVED|5.006000||p +WARN_SEMICOLON|5.006000||p +WARN_SEVERE|5.006000||p +WARN_SIGNAL|5.006000||p +WARN_SUBSTR|5.006000||p +WARN_SYNTAX|5.006000||p +WARN_TAINT|5.006000||p +WARN_THREADS|5.008000||p +WARN_UNINITIALIZED|5.006000||p +WARN_UNOPENED|5.006000||p +WARN_UNPACK|5.006000||p +WARN_UNTIE|5.006000||p +WARN_UTF8|5.006000||p +WARN_VOID|5.006000||p +WIDEST_UTYPE|5.015004||p +XCPT_CATCH|5.009002||p +XCPT_RETHROW|5.009002||p +XCPT_TRY_END|5.009002||p +XCPT_TRY_START|5.009002||p +XPUSHi||| +XPUSHmortal|5.009002||p +XPUSHn||| +XPUSHp||| +XPUSHs||| +XPUSHu|5.004000||p +XSPROTO|5.010000||p +XSRETURN_EMPTY||| +XSRETURN_IV||| +XSRETURN_NO||| +XSRETURN_NV||| +XSRETURN_PV||| +XSRETURN_UNDEF||| +XSRETURN_UV|5.008001||p +XSRETURN_YES||| +XSRETURN|||p +XST_mIV||| +XST_mNO||| +XST_mNV||| +XST_mPV||| +XST_mUNDEF||| +XST_mUV|5.008001||p +XST_mYES||| +XS_APIVERSION_BOOTCHECK||5.021008| +XS_EXTERNAL||5.021008| +XS_INTERNAL||5.021008| +XS_VERSION_BOOTCHECK||5.021008| +XS_VERSION||| +XSprePUSH|5.006000||p +XS||| +XopDISABLE||5.021008| +XopENABLE||5.021008| +XopENTRYCUSTOM||5.021008| +XopENTRY_set||5.021008| +XopENTRY||5.021008| +XopFLAGS||5.013007| +ZeroD|5.009002||p +Zero||| +_aMY_CXT|5.007003||p +_add_range_to_invlist||| +_append_range_to_invlist||| +_core_swash_init||| +_get_encoding||| +_get_regclass_nonbitmap_data||| +_get_swash_invlist||| +_invlist_array_init|||n +_invlist_contains_cp|||n +_invlist_contents||| +_invlist_dump||| +_invlist_intersection_maybe_complement_2nd||| +_invlist_intersection||| +_invlist_invert||| +_invlist_len|||n +_invlist_populate_swatch|||n +_invlist_search|||n +_invlist_subtract||| +_invlist_union_maybe_complement_2nd||| +_invlist_union||| +_is_cur_LC_category_utf8||| +_is_in_locale_category||5.021001| +_is_uni_FOO||5.017008| +_is_uni_perl_idcont||5.017008| +_is_uni_perl_idstart||5.017007| +_is_utf8_FOO||5.017008| +_is_utf8_char_slow||5.021001|n +_is_utf8_idcont||5.021001| +_is_utf8_idstart||5.021001| +_is_utf8_mark||5.017008| +_is_utf8_perl_idcont||5.017008| +_is_utf8_perl_idstart||5.017007| +_is_utf8_xidcont||5.021001| +_is_utf8_xidstart||5.021001| +_load_PL_utf8_foldclosures||| +_make_exactf_invlist||| +_new_invlist_C_array||| +_new_invlist||| +_pMY_CXT|5.007003||p +_setup_canned_invlist||| +_swash_inversion_hash||| +_swash_to_invlist||| +_to_fold_latin1||| +_to_uni_fold_flags||5.014000| +_to_upper_title_latin1||| +_to_utf8_fold_flags||5.019009| +_to_utf8_lower_flags||5.019009| +_to_utf8_title_flags||5.019009| +_to_utf8_upper_flags||5.019009| +_warn_problematic_locale|||n +aMY_CXT_|5.007003||p +aMY_CXT|5.007003||p +aTHXR_|5.021008||p +aTHXR|5.021008||p +aTHX_|5.006000||p +aTHX|5.006000||p +aassign_common_vars||| +add_above_Latin1_folds||| +add_cp_to_invlist||| +add_data|||n +add_multi_match||| +add_utf16_textfilter||| +adjust_size_and_find_bucket|||n +advance_one_SB||| +advance_one_WB||| +alloc_maybe_populate_EXACT||| +alloccopstash||| +allocmy||| +amagic_call||| +amagic_cmp_locale||| +amagic_cmp||| +amagic_deref_call||5.013007| +amagic_i_ncmp||| +amagic_is_enabled||| +amagic_ncmp||| +anonymise_cv_maybe||| +any_dup||| +ao||| +append_utf8_from_native_byte||5.019004|n +apply_attrs_my||| +apply_attrs_string||5.006001| +apply_attrs||| +apply||| +assert_uft8_cache_coherent||| +assignment_type||| +atfork_lock||5.007003|n +atfork_unlock||5.007003|n +av_arylen_p||5.009003| +av_clear||| +av_create_and_push||5.009005| +av_create_and_unshift_one||5.009005| +av_delete||5.006000| +av_exists||5.006000| +av_extend_guts||| +av_extend||| +av_fetch||| +av_fill||| +av_iter_p||5.011000| +av_len||| +av_make||| +av_pop||| +av_push||| +av_reify||| +av_shift||| +av_store||| +av_tindex||5.017009| +av_top_index||5.017009| +av_undef||| +av_unshift||| +ax|||n +backup_one_SB||| +backup_one_WB||| +bad_type_gv||| +bad_type_pv||| +bind_match||| +block_end||5.004000| +block_gimme||5.004000| +block_start||5.004000| +blockhook_register||5.013003| +boolSV|5.004000||p +boot_core_PerlIO||| +boot_core_UNIVERSAL||| +boot_core_mro||| +bytes_cmp_utf8||5.013007| +bytes_from_utf8||5.007001| +bytes_to_utf8||5.006001| +call_argv|5.006000||p +call_atexit||5.006000| +call_list||5.004000| +call_method|5.006000||p +call_pv|5.006000||p +call_sv|5.006000||p +caller_cx|5.013005|5.006000|p +calloc||5.007002|n +cando||| +cast_i32||5.006000|n +cast_iv||5.006000|n +cast_ulong||5.006000|n +cast_uv||5.006000|n +check_locale_boundary_crossing||| +check_type_and_open||| +check_uni||| +check_utf8_print||| +checkcomma||| +ckWARN|5.006000||p +ck_entersub_args_core||| +ck_entersub_args_list||5.013006| +ck_entersub_args_proto_or_list||5.013006| +ck_entersub_args_proto||5.013006| +ck_warner_d||5.011001|v +ck_warner||5.011001|v +ckwarn_common||| +ckwarn_d||5.009003| +ckwarn||5.009003| +clear_placeholders||| +clear_special_blocks||| +clone_params_del|||n +clone_params_new|||n +closest_cop||| +cntrl_to_mnemonic|||n +compute_EXACTish|||n +construct_ahocorasick_from_trie||| +cop_fetch_label||5.015001| +cop_free||| +cop_hints_2hv||5.013007| +cop_hints_fetch_pvn||5.013007| +cop_hints_fetch_pvs||5.013007| +cop_hints_fetch_pv||5.013007| +cop_hints_fetch_sv||5.013007| +cop_store_label||5.015001| +cophh_2hv||5.013007| +cophh_copy||5.013007| +cophh_delete_pvn||5.013007| +cophh_delete_pvs||5.013007| +cophh_delete_pv||5.013007| +cophh_delete_sv||5.013007| +cophh_fetch_pvn||5.013007| +cophh_fetch_pvs||5.013007| +cophh_fetch_pv||5.013007| +cophh_fetch_sv||5.013007| +cophh_free||5.013007| +cophh_new_empty||5.021008| +cophh_store_pvn||5.013007| +cophh_store_pvs||5.013007| +cophh_store_pv||5.013007| +cophh_store_sv||5.013007| +core_prototype||| +coresub_op||| +could_it_be_a_POSIX_class|||n +cr_textfilter||| +create_eval_scope||| +croak_memory_wrap||5.019003|n +croak_no_mem|||n +croak_no_modify||5.013003|n +croak_nocontext|||vn +croak_popstack|||n +croak_sv||5.013001| +croak_xs_usage||5.010001|n +croak|||v +csighandler||5.009003|n +current_re_engine||| +curse||| +custom_op_desc||5.007003| +custom_op_get_field||| +custom_op_name||5.007003| +custom_op_register||5.013007| +custom_op_xop||5.013007| +cv_ckproto_len_flags||| +cv_clone_into||| +cv_clone||| +cv_const_sv_or_av|||n +cv_const_sv||5.003070|n +cv_dump||| +cv_forget_slab||| +cv_get_call_checker||5.013006| +cv_name||5.021005| +cv_set_call_checker_flags||5.021004| +cv_set_call_checker||5.013006| +cv_undef_flags||| +cv_undef||| +cvgv_from_hek||| +cvgv_set||| +cvstash_set||| +cx_dump||5.005000| +cx_dup||| +cxinc||| +dAXMARK|5.009003||p +dAX|5.007002||p +dITEMS|5.007002||p +dMARK||| +dMULTICALL||5.009003| +dMY_CXT_SV|5.007003||p +dMY_CXT|5.007003||p +dNOOP|5.006000||p +dORIGMARK||| +dSP||| +dTHR|5.004050||p +dTHXR|5.021008||p +dTHXa|5.006000||p +dTHXoa|5.006000||p +dTHX|5.006000||p +dUNDERBAR|5.009002||p +dVAR|5.009003||p +dXCPT|5.009002||p +dXSARGS||| +dXSI32||| +dXSTARG|5.006000||p +deb_curcv||| +deb_nocontext|||vn +deb_stack_all||| +deb_stack_n||| +debop||5.005000| +debprofdump||5.005000| +debprof||| +debstackptrs||5.007003| +debstack||5.007003| +debug_start_match||| +deb||5.007003|v +defelem_target||| +del_sv||| +delete_eval_scope||| +delimcpy||5.004000|n +deprecate_commaless_var_list||| +despatch_signals||5.007001| +destroy_matcher||| +die_nocontext|||vn +die_sv||5.013001| +die_unwind||| +die|||v +dirp_dup||| +div128||| +djSP||| +do_aexec5||| +do_aexec||| +do_aspawn||| +do_binmode||5.004050| +do_chomp||| +do_close||| +do_delete_local||| +do_dump_pad||| +do_eof||| +do_exec3||| +do_execfree||| +do_exec||| +do_gv_dump||5.006000| +do_gvgv_dump||5.006000| +do_hv_dump||5.006000| +do_ipcctl||| +do_ipcget||| +do_join||| +do_magic_dump||5.006000| +do_msgrcv||| +do_msgsnd||| +do_ncmp||| +do_oddball||| +do_op_dump||5.006000| +do_open6||| +do_open9||5.006000| +do_open_raw||| +do_openn||5.007001| +do_open||5.003070| +do_pmop_dump||5.006000| +do_print||| +do_readline||| +do_seek||| +do_semop||| +do_shmio||| +do_smartmatch||| +do_spawn_nowait||| +do_spawn||| +do_sprintf||| +do_sv_dump||5.006000| +do_sysseek||| +do_tell||| +do_trans_complex_utf8||| +do_trans_complex||| +do_trans_count_utf8||| +do_trans_count||| +do_trans_simple_utf8||| +do_trans_simple||| +do_trans||| +do_vecget||| +do_vecset||| +do_vop||| +docatch||| +doeval||| +dofile||| +dofindlabel||| +doform||| +doing_taint||5.008001|n +dooneliner||| +doopen_pm||| +doparseform||| +dopoptoeval||| +dopoptogiven||| +dopoptolabel||| +dopoptoloop||| +dopoptosub_at||| +dopoptowhen||| +doref||5.009003| +dounwind||| +dowantarray||| +drand48_init_r|||n +drand48_r|||n +dump_all_perl||| +dump_all||5.006000| +dump_c_backtrace||| +dump_eval||5.006000| +dump_exec_pos||| +dump_form||5.006000| +dump_indent||5.006000|v +dump_mstats||| +dump_packsubs_perl||| +dump_packsubs||5.006000| +dump_sub_perl||| +dump_sub||5.006000| +dump_sv_child||| +dump_trie_interim_list||| +dump_trie_interim_table||| +dump_trie||| +dump_vindent||5.006000| +dumpuntil||| +dup_attrlist||| +emulate_cop_io||| +eval_pv|5.006000||p +eval_sv|5.006000||p +exec_failed||| +expect_number||| +fbm_compile||5.005000| +fbm_instr||5.005000| +feature_is_enabled||| +filter_add||| +filter_del||| +filter_gets||| +filter_read||| +finalize_optree||| +finalize_op||| +find_and_forget_pmops||| +find_array_subscript||| +find_beginning||| +find_byclass||| +find_default_stash||| +find_hash_subscript||| +find_in_my_stash||| +find_lexical_cv||| +find_runcv_where||| +find_runcv||5.008001| +find_rundefsv2||| +find_rundefsvoffset||5.009002| +find_rundefsv||5.013002| +find_script||| +find_uninit_var||| +first_symbol|||n +fixup_errno_string||| +foldEQ_latin1||5.013008|n +foldEQ_locale||5.013002|n +foldEQ_utf8_flags||5.013010| +foldEQ_utf8||5.013002| +foldEQ||5.013002|n +fold_constants||| +forbid_setid||| +force_ident_maybe_lex||| +force_ident||| +force_list||| +force_next||| +force_strict_version||| +force_version||| +force_word||| +forget_pmop||| +form_nocontext|||vn +form_short_octal_warning||| +form||5.004000|v +fp_dup||| +fprintf_nocontext|||vn +free_c_backtrace||| +free_global_struct||| +free_tied_hv_pool||| +free_tmps||| +gen_constant_list||| +get_ANYOF_cp_list_for_ssc||| +get_and_check_backslash_N_name||| +get_aux_mg||| +get_av|5.006000||p +get_c_backtrace_dump||| +get_c_backtrace||| +get_context||5.006000|n +get_cvn_flags|5.009005||p +get_cvs|5.011000||p +get_cv|5.006000||p +get_db_sub||| +get_debug_opts||| +get_hash_seed||| +get_hv|5.006000||p +get_invlist_iter_addr|||n +get_invlist_offset_addr|||n +get_invlist_previous_index_addr|||n +get_mstats||| +get_no_modify||| +get_num||| +get_op_descs||5.005000| +get_op_names||5.005000| +get_opargs||| +get_ppaddr||5.006000| +get_re_arg||| +get_sv|5.006000||p +get_vtbl||5.005030| +getcwd_sv||5.007002| +getenv_len||| +glob_2number||| +glob_assign_glob||| +gp_dup||| +gp_free||| +gp_ref||| +grok_atoUV|||n +grok_bin|5.007003||p +grok_bslash_N||| +grok_bslash_c||| +grok_bslash_o||| +grok_bslash_x||| +grok_hex|5.007003||p +grok_infnan||5.021004| +grok_number_flags||5.021002| +grok_number|5.007002||p +grok_numeric_radix|5.007002||p +grok_oct|5.007003||p +group_end||| +gv_AVadd||| +gv_HVadd||| +gv_IOadd||| +gv_SVadd||| +gv_add_by_type||5.011000| +gv_autoload4||5.004000| +gv_autoload_pvn||5.015004| +gv_autoload_pv||5.015004| +gv_autoload_sv||5.015004| +gv_check||| +gv_const_sv||5.009003| +gv_dump||5.006000| +gv_efullname3||5.003070| +gv_efullname4||5.006001| +gv_efullname||| +gv_fetchfile_flags||5.009005| +gv_fetchfile||| +gv_fetchmeth_autoload||5.007003| +gv_fetchmeth_internal||| +gv_fetchmeth_pv_autoload||5.015004| +gv_fetchmeth_pvn_autoload||5.015004| +gv_fetchmeth_pvn||5.015004| +gv_fetchmeth_pv||5.015004| +gv_fetchmeth_sv_autoload||5.015004| +gv_fetchmeth_sv||5.015004| +gv_fetchmethod_autoload||5.004000| +gv_fetchmethod_pv_flags||5.015004| +gv_fetchmethod_pvn_flags||5.015004| +gv_fetchmethod_sv_flags||5.015004| +gv_fetchmethod||| +gv_fetchmeth||| +gv_fetchpvn_flags|5.009002||p +gv_fetchpvs|5.009004||p +gv_fetchpv||| +gv_fetchsv|5.009002||p +gv_fullname3||5.003070| +gv_fullname4||5.006001| +gv_fullname||| +gv_handler||5.007001| +gv_init_pvn||5.015004| +gv_init_pv||5.015004| +gv_init_svtype||| +gv_init_sv||5.015004| +gv_init||| +gv_is_in_main||| +gv_magicalize_isa||| +gv_magicalize||| +gv_name_set||5.009004| +gv_override||| +gv_setref||| +gv_stashpvn_internal||| +gv_stashpvn|5.003070||p +gv_stashpvs|5.009003||p +gv_stashpv||| +gv_stashsvpvn_cached||| +gv_stashsv||| +gv_try_downgrade||| +handle_regex_sets||| +he_dup||| +hek_dup||| +hfree_next_entry||| +hfreeentries||| +hsplit||| +hv_assert||| +hv_auxinit_internal|||n +hv_auxinit||| +hv_backreferences_p||| +hv_clear_placeholders||5.009001| +hv_clear||| +hv_common_key_len||5.010000| +hv_common||5.010000| +hv_copy_hints_hv||5.009004| +hv_delayfree_ent||5.004000| +hv_delete_common||| +hv_delete_ent||5.003070| +hv_delete||| +hv_eiter_p||5.009003| +hv_eiter_set||5.009003| +hv_ename_add||| +hv_ename_delete||| +hv_exists_ent||5.003070| +hv_exists||| +hv_fetch_ent||5.003070| +hv_fetchs|5.009003||p +hv_fetch||| +hv_fill||5.013002| +hv_free_ent_ret||| +hv_free_ent||5.004000| +hv_iterinit||| +hv_iterkeysv||5.003070| +hv_iterkey||| +hv_iternext_flags||5.008000| +hv_iternextsv||| +hv_iternext||| +hv_iterval||| +hv_kill_backrefs||| +hv_ksplit||5.003070| +hv_magic_check|||n +hv_magic||| +hv_name_set||5.009003| +hv_notallowed||| +hv_placeholders_get||5.009003| +hv_placeholders_p||| +hv_placeholders_set||5.009003| +hv_rand_set||5.018000| +hv_riter_p||5.009003| +hv_riter_set||5.009003| +hv_scalar||5.009001| +hv_store_ent||5.003070| +hv_store_flags||5.008000| +hv_stores|5.009004||p +hv_store||| +hv_undef_flags||| +hv_undef||| +ibcmp_locale||5.004000| +ibcmp_utf8||5.007003| +ibcmp||| +incline||| +incpush_if_exists||| +incpush_use_sep||| +incpush||| +ingroup||| +init_argv_symbols||| +init_constants||| +init_dbargs||| +init_debugger||| +init_global_struct||| +init_i18nl10n||5.006000| +init_i18nl14n||5.006000| +init_ids||| +init_interp||| +init_main_stash||| +init_perllib||| +init_postdump_symbols||| +init_predump_symbols||| +init_stacks||5.005000| +init_tm||5.007002| +inplace_aassign||| +instr|||n +intro_my||5.004000| +intuit_method||| +intuit_more||| +invert||| +invlist_array|||n +invlist_clone||| +invlist_extend||| +invlist_highest|||n +invlist_is_iterating|||n +invlist_iterfinish|||n +invlist_iterinit|||n +invlist_iternext|||n +invlist_max|||n +invlist_previous_index|||n +invlist_set_len||| +invlist_set_previous_index|||n +invlist_trim|||n +invoke_exception_hook||| +io_close||| +isALNUMC|5.006000||p +isALNUM_lazy||5.021001| +isALPHANUMERIC||5.017008| +isALPHA||| +isASCII|5.006000||p +isBLANK|5.006001||p +isCNTRL|5.006000||p +isDIGIT||| +isFOO_lc||| +isFOO_utf8_lc||| +isGCB|||n +isGRAPH|5.006000||p +isGV_with_GP|5.009004||p +isIDCONT||5.017008| +isIDFIRST_lazy||5.021001| +isIDFIRST||| +isLOWER||| +isOCTAL||5.013005| +isPRINT|5.004000||p +isPSXSPC|5.006001||p +isPUNCT|5.006000||p +isSB||| +isSPACE||| +isUPPER||| +isUTF8_CHAR||5.021001| +isWB||| +isWORDCHAR||5.013006| +isXDIGIT|5.006000||p +is_an_int||| +is_ascii_string||5.011000| +is_handle_constructor|||n +is_invariant_string||5.021007|n +is_lvalue_sub||5.007001| +is_safe_syscall||5.019004| +is_ssc_worth_it|||n +is_uni_alnum_lc||5.006000| +is_uni_alnumc_lc||5.017007| +is_uni_alnumc||5.017007| +is_uni_alnum||5.006000| +is_uni_alpha_lc||5.006000| +is_uni_alpha||5.006000| +is_uni_ascii_lc||5.006000| +is_uni_ascii||5.006000| +is_uni_blank_lc||5.017002| +is_uni_blank||5.017002| +is_uni_cntrl_lc||5.006000| +is_uni_cntrl||5.006000| +is_uni_digit_lc||5.006000| +is_uni_digit||5.006000| +is_uni_graph_lc||5.006000| +is_uni_graph||5.006000| +is_uni_idfirst_lc||5.006000| +is_uni_idfirst||5.006000| +is_uni_lower_lc||5.006000| +is_uni_lower||5.006000| +is_uni_print_lc||5.006000| +is_uni_print||5.006000| +is_uni_punct_lc||5.006000| +is_uni_punct||5.006000| +is_uni_space_lc||5.006000| +is_uni_space||5.006000| +is_uni_upper_lc||5.006000| +is_uni_upper||5.006000| +is_uni_xdigit_lc||5.006000| +is_uni_xdigit||5.006000| +is_utf8_alnumc||5.017007| +is_utf8_alnum||5.006000| +is_utf8_alpha||5.006000| +is_utf8_ascii||5.006000| +is_utf8_blank||5.017002| +is_utf8_char_buf||5.015008|n +is_utf8_char||5.006000|n +is_utf8_cntrl||5.006000| +is_utf8_common||| +is_utf8_digit||5.006000| +is_utf8_graph||5.006000| +is_utf8_idcont||5.008000| +is_utf8_idfirst||5.006000| +is_utf8_lower||5.006000| +is_utf8_mark||5.006000| +is_utf8_perl_space||5.011001| +is_utf8_perl_word||5.011001| +is_utf8_posix_digit||5.011001| +is_utf8_print||5.006000| +is_utf8_punct||5.006000| +is_utf8_space||5.006000| +is_utf8_string_loclen||5.009003|n +is_utf8_string_loc||5.008001|n +is_utf8_string||5.006001|n +is_utf8_upper||5.006000| +is_utf8_xdigit||5.006000| +is_utf8_xidcont||5.013010| +is_utf8_xidfirst||5.013010| +isa_lookup||| +isinfnansv||| +isinfnan||5.021004|n +items|||n +ix|||n +jmaybe||| +join_exact||| +keyword_plugin_standard||| +keyword||| +leave_common||| +leave_scope||| +lex_bufutf8||5.011002| +lex_discard_to||5.011002| +lex_grow_linestr||5.011002| +lex_next_chunk||5.011002| +lex_peek_unichar||5.011002| +lex_read_space||5.011002| +lex_read_to||5.011002| +lex_read_unichar||5.011002| +lex_start||5.009005| +lex_stuff_pvn||5.011002| +lex_stuff_pvs||5.013005| +lex_stuff_pv||5.013006| +lex_stuff_sv||5.011002| +lex_unstuff||5.011002| +listkids||| +list||| +load_module_nocontext|||vn +load_module|5.006000||pv +localize||| +looks_like_bool||| +looks_like_number||| +lop||| +mPUSHi|5.009002||p +mPUSHn|5.009002||p +mPUSHp|5.009002||p +mPUSHs|5.010001||p +mPUSHu|5.009002||p +mXPUSHi|5.009002||p +mXPUSHn|5.009002||p +mXPUSHp|5.009002||p +mXPUSHs|5.010001||p +mXPUSHu|5.009002||p +magic_clear_all_env||| +magic_cleararylen_p||| +magic_clearenv||| +magic_clearhints||| +magic_clearhint||| +magic_clearisa||| +magic_clearpack||| +magic_clearsig||| +magic_copycallchecker||| +magic_dump||5.006000| +magic_existspack||| +magic_freearylen_p||| +magic_freeovrld||| +magic_getarylen||| +magic_getdebugvar||| +magic_getdefelem||| +magic_getnkeys||| +magic_getpack||| +magic_getpos||| +magic_getsig||| +magic_getsubstr||| +magic_gettaint||| +magic_getuvar||| +magic_getvec||| +magic_get||| +magic_killbackrefs||| +magic_methcall1||| +magic_methcall|||v +magic_methpack||| +magic_nextpack||| +magic_regdata_cnt||| +magic_regdatum_get||| +magic_regdatum_set||| +magic_scalarpack||| +magic_set_all_env||| +magic_setarylen||| +magic_setcollxfrm||| +magic_setdbline||| +magic_setdebugvar||| +magic_setdefelem||| +magic_setenv||| +magic_sethint||| +magic_setisa||| +magic_setlvref||| +magic_setmglob||| +magic_setnkeys||| +magic_setpack||| +magic_setpos||| +magic_setregexp||| +magic_setsig||| +magic_setsubstr||| +magic_settaint||| +magic_setutf8||| +magic_setuvar||| +magic_setvec||| +magic_set||| +magic_sizepack||| +magic_wipepack||| +make_matcher||| +make_trie||| +malloc_good_size|||n +malloced_size|||n +malloc||5.007002|n +markstack_grow||5.021001| +matcher_matches_sv||| +maybe_multimagic_gv||| +mayberelocate||| +measure_struct||| +memEQs|5.009005||p +memEQ|5.004000||p +memNEs|5.009005||p +memNE|5.004000||p +mem_collxfrm||| +mem_log_common|||n +mess_alloc||| +mess_nocontext|||vn +mess_sv||5.013001| +mess||5.006000|v +mfree||5.007002|n +mg_clear||| +mg_copy||| +mg_dup||| +mg_find_mglob||| +mg_findext|5.013008||pn +mg_find|||n +mg_free_type||5.013006| +mg_free||| +mg_get||| +mg_length||5.005000| +mg_localize||| +mg_magical|||n +mg_set||| +mg_size||5.005000| +mini_mktime||5.007002|n +minus_v||| +missingterm||| +mode_from_discipline||| +modkids||| +more_bodies||| +more_sv||| +moreswitches||| +move_proto_attr||| +mro_clean_isarev||| +mro_gather_and_rename||| +mro_get_from_name||5.010001| +mro_get_linear_isa_dfs||| +mro_get_linear_isa||5.009005| +mro_get_private_data||5.010001| +mro_isa_changed_in||| +mro_meta_dup||| +mro_meta_init||| +mro_method_changed_in||5.009005| +mro_package_moved||| +mro_register||5.010001| +mro_set_mro||5.010001| +mro_set_private_data||5.010001| +mul128||| +mulexp10|||n +multideref_stringify||| +my_atof2||5.007002| +my_atof||5.006000| +my_attrs||| +my_bcopy|||n +my_bytes_to_utf8|||n +my_bzero|||n +my_chsize||| +my_clearenv||| +my_cxt_index||| +my_cxt_init||| +my_dirfd||5.009005|n +my_exit_jump||| +my_exit||| +my_failure_exit||5.004000| +my_fflush_all||5.006000| +my_fork||5.007003|n +my_kid||| +my_lstat_flags||| +my_lstat||5.021008| +my_memcmp|||n +my_memset|||n +my_pclose||5.003070| +my_popen_list||5.007001| +my_popen||5.003070| +my_setenv||| +my_setlocale||| +my_snprintf|5.009004||pvn +my_socketpair||5.007003|n +my_sprintf|5.009003||pvn +my_stat_flags||| +my_stat||5.021008| +my_strerror||5.021001| +my_strftime||5.007002| +my_strlcat|5.009004||pn +my_strlcpy|5.009004||pn +my_unexec||| +my_vsnprintf||5.009004|n +need_utf8|||n +newANONATTRSUB||5.006000| +newANONHASH||| +newANONLIST||| +newANONSUB||| +newASSIGNOP||| +newATTRSUB_x||| +newATTRSUB||5.006000| +newAVREF||| +newAV||| +newBINOP||| +newCONDOP||| +newCONSTSUB_flags||5.015006| +newCONSTSUB|5.004050||p +newCVREF||| +newDEFSVOP||5.021006| +newFORM||| +newFOROP||5.013007| +newGIVENOP||5.009003| +newGIVWHENOP||| +newGP||| +newGVOP||| +newGVREF||| +newGVgen_flags||5.015004| +newGVgen||| +newHVREF||| +newHVhv||5.005000| +newHV||| +newIO||| +newLISTOP||| +newLOGOP||| +newLOOPEX||| +newLOOPOP||| +newMETHOP_internal||| +newMETHOP_named||5.021005| +newMETHOP||5.021005| +newMYSUB||5.017004| +newNULLLIST||| +newOP||| +newPADNAMELIST||5.021007|n +newPADNAMEouter||5.021007|n +newPADNAMEpvn||5.021007|n +newPADOP||| +newPMOP||| +newPROG||| +newPVOP||| +newRANGE||| +newRV_inc|5.004000||p +newRV_noinc|5.004000||p +newRV||| +newSLICEOP||| +newSTATEOP||| +newSTUB||| +newSUB||| +newSVOP||| +newSVREF||| +newSV_type|5.009005||p +newSVavdefelem||| +newSVhek||5.009003| +newSViv||| +newSVnv||| +newSVpadname||5.017004| +newSVpv_share||5.013006| +newSVpvf_nocontext|||vn +newSVpvf||5.004000|v +newSVpvn_flags|5.010001||p +newSVpvn_share|5.007001||p +newSVpvn_utf8|5.010001||p +newSVpvn|5.004050||p +newSVpvs_flags|5.010001||p +newSVpvs_share|5.009003||p +newSVpvs|5.009003||p +newSVpv||| +newSVrv||| +newSVsv||| +newSVuv|5.006000||p +newSV||| +newUNOP_AUX||5.021007| +newUNOP||| +newWHENOP||5.009003| +newWHILEOP||5.013007| +newXS_deffile||| +newXS_flags||5.009004| +newXS_len_flags||| +newXSproto||5.006000| +newXS||5.006000| +new_collate||5.006000| +new_constant||| +new_ctype||5.006000| +new_he||| +new_logop||| +new_numeric||5.006000| +new_stackinfo||5.005000| +new_version||5.009000| +new_warnings_bitfield||| +next_symbol||| +nextargv||| +nextchar||| +ninstr|||n +no_bareword_allowed||| +no_fh_allowed||| +no_op||| +noperl_die|||vn +not_a_number||| +not_incrementable||| +nothreadhook||5.008000| +nuke_stacks||| +num_overflow|||n +oopsAV||| +oopsHV||| +op_append_elem||5.013006| +op_append_list||5.013006| +op_clear||| +op_contextualize||5.013006| +op_convert_list||5.021006| +op_dump||5.006000| +op_free||| +op_integerize||| +op_linklist||5.013006| +op_lvalue_flags||| +op_lvalue||5.013007| +op_null||5.007002| +op_parent||5.021002|n +op_prepend_elem||5.013006| +op_refcnt_dec||| +op_refcnt_inc||| +op_refcnt_lock||5.009002| +op_refcnt_unlock||5.009002| +op_relocate_sv||| +op_scope||5.013007| +op_sibling_splice||5.021002|n +op_std_init||| +op_unscope||| +open_script||| +openn_cleanup||| +openn_setup||| +opmethod_stash||| +opslab_force_free||| +opslab_free_nopad||| +opslab_free||| +pMY_CXT_|5.007003||p +pMY_CXT|5.007003||p +pTHX_|5.006000||p +pTHX|5.006000||p +packWARN|5.007003||p +pack_cat||5.007003| +pack_rec||| +package_version||| +package||| +packlist||5.008001| +pad_add_anon||5.008001| +pad_add_name_pvn||5.015001| +pad_add_name_pvs||5.015001| +pad_add_name_pv||5.015001| +pad_add_name_sv||5.015001| +pad_add_weakref||| +pad_alloc_name||| +pad_alloc||| +pad_block_start||| +pad_check_dup||| +pad_compname_type||5.009003| +pad_findlex||| +pad_findmy_pvn||5.015001| +pad_findmy_pvs||5.015001| +pad_findmy_pv||5.015001| +pad_findmy_sv||5.015001| +pad_fixup_inner_anons||| +pad_free||| +pad_leavemy||| +pad_new||5.008001| +pad_push||| +pad_reset||| +pad_setsv||| +pad_sv||| +pad_swipe||| +pad_tidy||5.008001| +padlist_dup||| +padlist_store||| +padname_dup||| +padname_free||| +padnamelist_dup||| +padnamelist_fetch||5.021007|n +padnamelist_free||| +padnamelist_store||5.021007| +parse_arithexpr||5.013008| +parse_barestmt||5.013007| +parse_block||5.013007| +parse_body||| +parse_fullexpr||5.013008| +parse_fullstmt||5.013005| +parse_gv_stash_name||| +parse_ident||| +parse_label||5.013007| +parse_listexpr||5.013008| +parse_lparen_question_flags||| +parse_stmtseq||5.013006| +parse_subsignature||| +parse_termexpr||5.013008| +parse_unicode_opts||| +parser_dup||| +parser_free_nexttoke_ops||| +parser_free||| +path_is_searchable|||n +peep||| +pending_ident||| +perl_alloc_using|||n +perl_alloc|||n +perl_clone_using|||n +perl_clone|||n +perl_construct|||n +perl_destruct||5.007003|n +perl_free|||n +perl_parse||5.006000|n +perl_run|||n +pidgone||| +pm_description||| +pmop_dump||5.006000| +pmruntime||| +pmtrans||| +pop_scope||| +populate_ANYOF_from_invlist||| +populate_isa|||v +pregcomp||5.009005| +pregexec||| +pregfree2||5.011000| +pregfree||| +prescan_version||5.011004| +printbuf||| +printf_nocontext|||vn +process_special_blocks||| +ptr_hash|||n +ptr_table_clear||5.009005| +ptr_table_fetch||5.009005| +ptr_table_find|||n +ptr_table_free||5.009005| +ptr_table_new||5.009005| +ptr_table_split||5.009005| +ptr_table_store||5.009005| +push_scope||| +put_charclass_bitmap_innards||| +put_code_point||| +put_range||| +pv_display|5.006000||p +pv_escape|5.009004||p +pv_pretty|5.009004||p +pv_uni_display||5.007003| +qerror||| +qsortsvu||| +quadmath_format_needed|||n +quadmath_format_single|||n +re_compile||5.009005| +re_croak2||| +re_dup_guts||| +re_intuit_start||5.019001| +re_intuit_string||5.006000| +re_op_compile||| +realloc||5.007002|n +reentrant_free||5.021008| +reentrant_init||5.021008| +reentrant_retry||5.021008|vn +reentrant_size||5.021008| +ref_array_or_hash||| +refcounted_he_chain_2hv||| +refcounted_he_fetch_pvn||| +refcounted_he_fetch_pvs||| +refcounted_he_fetch_pv||| +refcounted_he_fetch_sv||| +refcounted_he_free||| +refcounted_he_inc||| +refcounted_he_new_pvn||| +refcounted_he_new_pvs||| +refcounted_he_new_pv||| +refcounted_he_new_sv||| +refcounted_he_value||| +refkids||| +refto||| +ref||5.021008| +reg2Lanode||| +reg_check_named_buff_matched|||n +reg_named_buff_all||5.009005| +reg_named_buff_exists||5.009005| +reg_named_buff_fetch||5.009005| +reg_named_buff_firstkey||5.009005| +reg_named_buff_iter||| +reg_named_buff_nextkey||5.009005| +reg_named_buff_scalar||5.009005| +reg_named_buff||| +reg_node||| +reg_numbered_buff_fetch||| +reg_numbered_buff_length||| +reg_numbered_buff_store||| +reg_qr_package||| +reg_recode||| +reg_scan_name||| +reg_skipcomment|||n +reg_temp_copy||| +reganode||| +regatom||| +regbranch||| +regclass_swash||5.009004| +regclass||| +regcppop||| +regcppush||| +regcurly|||n +regdump_extflags||| +regdump_intflags||| +regdump||5.005000| +regdupe_internal||| +regexec_flags||5.005000| +regfree_internal||5.009005| +reghop3|||n +reghop4|||n +reghopmaybe3|||n +reginclass||| +reginitcolors||5.006000| +reginsert||| +regmatch||| +regnext||5.005000| +regnode_guts||| +regpatws|||n +regpiece||| +regpposixcc||| +regprop||| +regrepeat||| +regtail_study||| +regtail||| +regtry||| +reg||| +repeatcpy|||n +report_evil_fh||| +report_redefined_cv||| +report_uninit||| +report_wrongway_fh||| +require_pv||5.006000| +require_tie_mod||| +restore_magic||| +rninstr|||n +rpeep||| +rsignal_restore||| +rsignal_save||| +rsignal_state||5.004000| +rsignal||5.004000| +run_body||| +run_user_filter||| +runops_debug||5.005000| +runops_standard||5.005000| +rv2cv_op_cv||5.013006| +rvpv_dup||| +rxres_free||| +rxres_restore||| +rxres_save||| +safesyscalloc||5.006000|n +safesysfree||5.006000|n +safesysmalloc||5.006000|n +safesysrealloc||5.006000|n +same_dirent||| +save_I16||5.004000| +save_I32||| +save_I8||5.006000| +save_adelete||5.011000| +save_aelem_flags||5.011000| +save_aelem||5.004050| +save_aliased_sv||| +save_alloc||5.006000| +save_aptr||| +save_ary||| +save_bool||5.008001| +save_clearsv||| +save_delete||| +save_destructor_x||5.006000| +save_destructor||5.006000| +save_freeop||| +save_freepv||| +save_freesv||| +save_generic_pvref||5.006001| +save_generic_svref||5.005030| +save_gp||5.004000| +save_hash||| +save_hdelete||5.011000| +save_hek_flags|||n +save_helem_flags||5.011000| +save_helem||5.004050| +save_hints||5.010001| +save_hptr||| +save_int||| +save_item||| +save_iv||5.005000| +save_lines||| +save_list||| +save_long||| +save_magic_flags||| +save_mortalizesv||5.007001| +save_nogv||| +save_op||5.005000| +save_padsv_and_mortalize||5.010001| +save_pptr||| +save_pushi32ptr||5.010001| +save_pushptri32ptr||| +save_pushptrptr||5.010001| +save_pushptr||5.010001| +save_re_context||5.006000| +save_scalar_at||| +save_scalar||| +save_set_svflags||5.009000| +save_shared_pvref||5.007003| +save_sptr||| +save_strlen||| +save_svref||| +save_vptr||5.006000| +savepvn||| +savepvs||5.009003| +savepv||| +savesharedpvn||5.009005| +savesharedpvs||5.013006| +savesharedpv||5.007003| +savesharedsvpv||5.013006| +savestack_grow_cnt||5.008001| +savestack_grow||| +savesvpv||5.009002| +sawparens||| +scalar_mod_type|||n +scalarboolean||| +scalarkids||| +scalarseq||| +scalarvoid||| +scalar||| +scan_bin||5.006000| +scan_commit||| +scan_const||| +scan_formline||| +scan_heredoc||| +scan_hex||| +scan_ident||| +scan_inputsymbol||| +scan_num||5.007001| +scan_oct||| +scan_pat||| +scan_str||| +scan_subst||| +scan_trans||| +scan_version||5.009001| +scan_vstring||5.009005| +scan_word||| +search_const||| +seed||5.008001| +sequence_num||| +set_ANYOF_arg||| +set_caret_X||| +set_context||5.006000|n +set_numeric_local||5.006000| +set_numeric_radix||5.006000| +set_numeric_standard||5.006000| +set_padlist|||n +setdefout||| +share_hek_flags||| +share_hek||5.004000| +should_warn_nl|||n +si_dup||| +sighandler|||n +simplify_sort||| +skipspace_flags||| +softref2xv||| +sortcv_stacked||| +sortcv_xsub||| +sortcv||| +sortsv_flags||5.009003| +sortsv||5.007003| +space_join_names_mortal||| +ss_dup||| +ssc_add_range||| +ssc_and||| +ssc_anything||| +ssc_clear_locale|||n +ssc_cp_and||| +ssc_finalize||| +ssc_init||| +ssc_intersection||| +ssc_is_anything|||n +ssc_is_cp_posixl_init|||n +ssc_or||| +ssc_union||| +stack_grow||| +start_glob||| +start_subparse||5.004000| +stdize_locale||| +strEQ||| +strGE||| +strGT||| +strLE||| +strLT||| +strNE||| +str_to_version||5.006000| +strip_return||| +strnEQ||| +strnNE||| +study_chunk||| +sub_crush_depth||| +sublex_done||| +sublex_push||| +sublex_start||| +sv_2bool_flags||5.013006| +sv_2bool||| +sv_2cv||| +sv_2io||| +sv_2iuv_common||| +sv_2iuv_non_preserve||| +sv_2iv_flags||5.009001| +sv_2iv||| +sv_2mortal||| +sv_2num||| +sv_2nv_flags||5.013001| +sv_2pv_flags|5.007002||p +sv_2pv_nolen|5.006000||p +sv_2pvbyte_nolen|5.006000||p +sv_2pvbyte|5.006000||p +sv_2pvutf8_nolen||5.006000| +sv_2pvutf8||5.006000| +sv_2pv||| +sv_2uv_flags||5.009001| +sv_2uv|5.004000||p +sv_add_arena||| +sv_add_backref||| +sv_backoff|||n +sv_bless||| +sv_buf_to_ro||| +sv_buf_to_rw||| +sv_cat_decode||5.008001| +sv_catpv_flags||5.013006| +sv_catpv_mg|5.004050||p +sv_catpv_nomg||5.013006| +sv_catpvf_mg_nocontext|||pvn +sv_catpvf_mg|5.006000|5.004000|pv +sv_catpvf_nocontext|||vn +sv_catpvf||5.004000|v +sv_catpvn_flags||5.007002| +sv_catpvn_mg|5.004050||p +sv_catpvn_nomg|5.007002||p +sv_catpvn||| +sv_catpvs_flags||5.013006| +sv_catpvs_mg||5.013006| +sv_catpvs_nomg||5.013006| +sv_catpvs|5.009003||p +sv_catpv||| +sv_catsv_flags||5.007002| +sv_catsv_mg|5.004050||p +sv_catsv_nomg|5.007002||p +sv_catsv||| +sv_chop||| +sv_clean_all||| +sv_clean_objs||| +sv_clear||| +sv_cmp_flags||5.013006| +sv_cmp_locale_flags||5.013006| +sv_cmp_locale||5.004000| +sv_cmp||| +sv_collxfrm_flags||5.013006| +sv_collxfrm||| +sv_copypv_flags||5.017002| +sv_copypv_nomg||5.017002| +sv_copypv||| +sv_dec_nomg||5.013002| +sv_dec||| +sv_del_backref||| +sv_derived_from_pvn||5.015004| +sv_derived_from_pv||5.015004| +sv_derived_from_sv||5.015004| +sv_derived_from||5.004000| +sv_destroyable||5.010000| +sv_display||| +sv_does_pvn||5.015004| +sv_does_pv||5.015004| +sv_does_sv||5.015004| +sv_does||5.009004| +sv_dump||| +sv_dup_common||| +sv_dup_inc_multiple||| +sv_dup_inc||| +sv_dup||| +sv_eq_flags||5.013006| +sv_eq||| +sv_exp_grow||| +sv_force_normal_flags||5.007001| +sv_force_normal||5.006000| +sv_free2||| +sv_free_arenas||| +sv_free||| +sv_get_backrefs||5.021008|n +sv_gets||5.003070| +sv_grow||| +sv_i_ncmp||| +sv_inc_nomg||5.013002| +sv_inc||| +sv_insert_flags||5.010001| +sv_insert||| +sv_isa||| +sv_isobject||| +sv_iv||5.005000| +sv_kill_backrefs||| +sv_len_utf8_nomg||| +sv_len_utf8||5.006000| +sv_len||| +sv_magic_portable|5.021008|5.004000|p +sv_magicext_mglob||| +sv_magicext||5.007003| +sv_magic||| +sv_mortalcopy_flags||| +sv_mortalcopy||| +sv_ncmp||| +sv_newmortal||| +sv_newref||| +sv_nolocking||5.007003| +sv_nosharing||5.007003| +sv_nounlocking||| +sv_nv||5.005000| +sv_only_taint_gmagic|||n +sv_or_pv_pos_u2b||| +sv_peek||5.005000| +sv_pos_b2u_flags||5.019003| +sv_pos_b2u_midway||| +sv_pos_b2u||5.006000| +sv_pos_u2b_cached||| +sv_pos_u2b_flags||5.011005| +sv_pos_u2b_forwards|||n +sv_pos_u2b_midway|||n +sv_pos_u2b||5.006000| +sv_pvbyten_force||5.006000| +sv_pvbyten||5.006000| +sv_pvbyte||5.006000| +sv_pvn_force_flags|5.007002||p +sv_pvn_force||| +sv_pvn_nomg|5.007003|5.005000|p +sv_pvn||5.005000| +sv_pvutf8n_force||5.006000| +sv_pvutf8n||5.006000| +sv_pvutf8||5.006000| +sv_pv||5.006000| +sv_recode_to_utf8||5.007003| +sv_reftype||| +sv_ref||| +sv_release_COW||| +sv_replace||| +sv_report_used||| +sv_resetpvn||| +sv_reset||| +sv_rvweaken||5.006000| +sv_sethek||| +sv_setiv_mg|5.004050||p +sv_setiv||| +sv_setnv_mg|5.006000||p +sv_setnv||| +sv_setpv_mg|5.004050||p +sv_setpvf_mg_nocontext|||pvn +sv_setpvf_mg|5.006000|5.004000|pv +sv_setpvf_nocontext|||vn +sv_setpvf||5.004000|v +sv_setpviv_mg||5.008001| +sv_setpviv||5.008001| +sv_setpvn_mg|5.004050||p +sv_setpvn||| +sv_setpvs_mg||5.013006| +sv_setpvs|5.009004||p +sv_setpv||| +sv_setref_iv||| +sv_setref_nv||| +sv_setref_pvn||| +sv_setref_pvs||5.021008| +sv_setref_pv||| +sv_setref_uv||5.007001| +sv_setsv_cow||| +sv_setsv_flags||5.007002| +sv_setsv_mg|5.004050||p +sv_setsv_nomg|5.007002||p +sv_setsv||| +sv_setuv_mg|5.004050||p +sv_setuv|5.004000||p +sv_tainted||5.004000| +sv_taint||5.004000| +sv_true||5.005000| +sv_unglob||| +sv_uni_display||5.007003| +sv_unmagicext|5.013008||p +sv_unmagic||| +sv_unref_flags||5.007001| +sv_unref||| +sv_untaint||5.004000| +sv_upgrade||| +sv_usepvn_flags||5.009004| +sv_usepvn_mg|5.004050||p +sv_usepvn||| +sv_utf8_decode||5.006000| +sv_utf8_downgrade||5.006000| +sv_utf8_encode||5.006000| +sv_utf8_upgrade_flags_grow||5.011000| +sv_utf8_upgrade_flags||5.007002| +sv_utf8_upgrade_nomg||5.007002| +sv_utf8_upgrade||5.007001| +sv_uv|5.005000||p +sv_vcatpvf_mg|5.006000|5.004000|p +sv_vcatpvfn_flags||5.017002| +sv_vcatpvfn||5.004000| +sv_vcatpvf|5.006000|5.004000|p +sv_vsetpvf_mg|5.006000|5.004000|p +sv_vsetpvfn||5.004000| +sv_vsetpvf|5.006000|5.004000|p +svtype||| +swallow_bom||| +swash_fetch||5.007002| +swash_init||5.006000| +swash_scan_list_line||| +swatch_get||| +sync_locale||5.021004| +sys_init3||5.010000|n +sys_init||5.010000|n +sys_intern_clear||| +sys_intern_dup||| +sys_intern_init||| +sys_term||5.010000|n +taint_env||| +taint_proper||| +tied_method|||v +tmps_grow_p||| +toFOLD_uni||5.007003| +toFOLD_utf8||5.019001| +toFOLD||5.019001| +toLOWER_L1||5.019001| +toLOWER_LC||5.004000| +toLOWER_uni||5.007003| +toLOWER_utf8||5.015007| +toLOWER||| +toTITLE_uni||5.007003| +toTITLE_utf8||5.015007| +toTITLE||5.019001| +toUPPER_uni||5.007003| +toUPPER_utf8||5.015007| +toUPPER||| +to_byte_substr||| +to_lower_latin1|||n +to_uni_fold||5.007003| +to_uni_lower_lc||5.006000| +to_uni_lower||5.007003| +to_uni_title_lc||5.006000| +to_uni_title||5.007003| +to_uni_upper_lc||5.006000| +to_uni_upper||5.007003| +to_utf8_case||5.007003| +to_utf8_fold||5.015007| +to_utf8_lower||5.015007| +to_utf8_substr||| +to_utf8_title||5.015007| +to_utf8_upper||5.015007| +tokenize_use||| +tokeq||| +tokereport||| +too_few_arguments_pv||| +too_many_arguments_pv||| +translate_substr_offsets|||n +try_amagic_bin||| +try_amagic_un||| +uiv_2buf|||n +unlnk||| +unpack_rec||| +unpack_str||5.007003| +unpackstring||5.008001| +unreferenced_to_tmp_stack||| +unshare_hek_or_pvn||| +unshare_hek||| +unsharepvn||5.003070| +unwind_handler_stack||| +update_debugger_info||| +upg_version||5.009005| +usage||| +utf16_textfilter||| +utf16_to_utf8_reversed||5.006001| +utf16_to_utf8||5.006001| +utf8_distance||5.006000| +utf8_hop||5.006000|n +utf8_length||5.007001| +utf8_mg_len_cache_update||| +utf8_mg_pos_cache_update||| +utf8_to_bytes||5.006001| +utf8_to_uvchr_buf||5.015009| +utf8_to_uvchr||5.007001| +utf8_to_uvuni_buf||5.015009| +utf8_to_uvuni||5.007001| +utf8n_to_uvchr||5.007001| +utf8n_to_uvuni||5.007001| +utilize||| +uvchr_to_utf8_flags||5.007003| +uvchr_to_utf8||5.007001| +uvoffuni_to_utf8_flags||5.019004| +uvuni_to_utf8_flags||5.007003| +uvuni_to_utf8||5.007001| +valid_utf8_to_uvchr||5.015009| +valid_utf8_to_uvuni||5.015009| +validate_proto||| +validate_suid||| +varname||| +vcmp||5.009000| +vcroak||5.006000| +vdeb||5.007003| +vform||5.006000| +visit||| +vivify_defelem||| +vivify_ref||| +vload_module|5.006000||p +vmess||5.006000| +vnewSVpvf|5.006000|5.004000|p +vnormal||5.009002| +vnumify||5.009000| +vstringify||5.009000| +vverify||5.009003| +vwarner||5.006000| +vwarn||5.006000| +wait4pid||| +warn_nocontext|||vn +warn_sv||5.013001| +warner_nocontext|||vn +warner|5.006000|5.004000|pv +warn|||v +was_lvalue_sub||| +watch||| +whichsig_pvn||5.015004| +whichsig_pv||5.015004| +whichsig_sv||5.015004| +whichsig||| +win32_croak_not_implemented|||n +with_queued_errors||| +wrap_op_checker||5.015008| +write_to_stderr||| +xs_boot_epilog||| +xs_handshake|||vn +xs_version_bootcheck||| +yyerror_pvn||| +yyerror_pv||| +yyerror||| +yylex||| +yyparse||| +yyunlex||| +yywarn||| +); + +if (exists $opt{'list-unsupported'}) { + my $f; + for $f (sort { lc $a cmp lc $b } keys %API) { + next unless $API{$f}{todo}; + print "$f ", '.'x(40-length($f)), " ", format_version($API{$f}{todo}), "\n"; + } + exit 0; +} + +# Scan for possible replacement candidates + +my(%replace, %need, %hints, %warnings, %depends); +my $replace = 0; +my($hint, $define, $function); + +sub find_api +{ + my $code = shift; + $code =~ s{ + / (?: \*[^*]*\*+(?:[^$ccs][^*]*\*+)* / | /[^\r\n]*) + | "[^"\\]*(?:\\.[^"\\]*)*" + | '[^'\\]*(?:\\.[^'\\]*)*' }{}egsx; + grep { exists $API{$_} } $code =~ /(\w+)/mg; +} + +while (<DATA>) { + if ($hint) { + my $h = $hint->[0] eq 'Hint' ? \%hints : \%warnings; + if (m{^\s*\*\s(.*?)\s*$}) { + for (@{$hint->[1]}) { + $h->{$_} ||= ''; # suppress warning with older perls + $h->{$_} .= "$1\n"; + } + } + else { undef $hint } + } + + $hint = [$1, [split /,?\s+/, $2]] + if m{^\s*$rccs\s+(Hint|Warning):\s+(\w+(?:,?\s+\w+)*)\s*$}; + + if ($define) { + if ($define->[1] =~ /\\$/) { + $define->[1] .= $_; + } + else { + if (exists $API{$define->[0]} && $define->[1] !~ /^DPPP_\(/) { + my @n = find_api($define->[1]); + push @{$depends{$define->[0]}}, @n if @n + } + undef $define; + } + } + + $define = [$1, $2] if m{^\s*#\s*define\s+(\w+)(?:\([^)]*\))?\s+(.*)}; + + if ($function) { + if (/^}/) { + if (exists $API{$function->[0]}) { + my @n = find_api($function->[1]); + push @{$depends{$function->[0]}}, @n if @n + } + undef $function; + } + else { + $function->[1] .= $_; + } + } + + $function = [$1, ''] if m{^DPPP_\(my_(\w+)\)}; + + $replace = $1 if m{^\s*$rccs\s+Replace:\s+(\d+)\s+$rcce\s*$}; + $replace{$2} = $1 if $replace and m{^\s*#\s*define\s+(\w+)(?:\([^)]*\))?\s+(\w+)}; + $replace{$2} = $1 if m{^\s*#\s*define\s+(\w+)(?:\([^)]*\))?\s+(\w+).*$rccs\s+Replace\s+$rcce}; + $replace{$1} = $2 if m{^\s*$rccs\s+Replace (\w+) with (\w+)\s+$rcce\s*$}; + + if (m{^\s*$rccs\s+(\w+(\s*,\s*\w+)*)\s+depends\s+on\s+(\w+(\s*,\s*\w+)*)\s+$rcce\s*$}) { + my @deps = map { s/\s+//g; $_ } split /,/, $3; + my $d; + for $d (map { s/\s+//g; $_ } split /,/, $1) { + push @{$depends{$d}}, @deps; + } + } + + $need{$1} = 1 if m{^#if\s+defined\(NEED_(\w+)(?:_GLOBAL)?\)}; +} + +for (values %depends) { + my %s; + $_ = [sort grep !$s{$_}++, @$_]; +} + +if (exists $opt{'api-info'}) { + my $f; + my $count = 0; + my $match = $opt{'api-info'} =~ m!^/(.*)/$! ? $1 : "^\Q$opt{'api-info'}\E\$"; + for $f (sort { lc $a cmp lc $b } keys %API) { + next unless $f =~ /$match/; + print "\n=== $f ===\n\n"; + my $info = 0; + if ($API{$f}{base} || $API{$f}{todo}) { + my $base = format_version($API{$f}{base} || $API{$f}{todo}); + print "Supported at least starting from perl-$base.\n"; + $info++; + } + if ($API{$f}{provided}) { + my $todo = $API{$f}{todo} ? format_version($API{$f}{todo}) : "5.003"; + print "Support by $ppport provided back to perl-$todo.\n"; + print "Support needs to be explicitly requested by NEED_$f.\n" if exists $need{$f}; + print "Depends on: ", join(', ', @{$depends{$f}}), ".\n" if exists $depends{$f}; + print "\n$hints{$f}" if exists $hints{$f}; + print "\nWARNING:\n$warnings{$f}" if exists $warnings{$f}; + $info++; + } + print "No portability information available.\n" unless $info; + $count++; + } + $count or print "Found no API matching '$opt{'api-info'}'."; + print "\n"; + exit 0; +} + +if (exists $opt{'list-provided'}) { + my $f; + for $f (sort { lc $a cmp lc $b } keys %API) { + next unless $API{$f}{provided}; + my @flags; + push @flags, 'explicit' if exists $need{$f}; + push @flags, 'depend' if exists $depends{$f}; + push @flags, 'hint' if exists $hints{$f}; + push @flags, 'warning' if exists $warnings{$f}; + my $flags = @flags ? ' ['.join(', ', @flags).']' : ''; + print "$f$flags\n"; + } + exit 0; +} + +my @files; +my @srcext = qw( .xs .c .h .cc .cpp -c.inc -xs.inc ); +my $srcext = join '|', map { quotemeta $_ } @srcext; + +if (@ARGV) { + my %seen; + for (@ARGV) { + if (-e) { + if (-f) { + push @files, $_ unless $seen{$_}++; + } + else { warn "'$_' is not a file.\n" } + } + else { + my @new = grep { -f } glob $_ + or warn "'$_' does not exist.\n"; + push @files, grep { !$seen{$_}++ } @new; + } + } +} +else { + eval { + require File::Find; + File::Find::find(sub { + $File::Find::name =~ /($srcext)$/i + and push @files, $File::Find::name; + }, '.'); + }; + if ($@) { + @files = map { glob "*$_" } @srcext; + } +} + +if (!@ARGV || $opt{filter}) { + my(@in, @out); + my %xsc = map { /(.*)\.xs$/ ? ("$1.c" => 1, "$1.cc" => 1) : () } @files; + for (@files) { + my $out = exists $xsc{$_} || /\b\Q$ppport\E$/i || !/($srcext)$/i; + push @{ $out ? \@out : \@in }, $_; + } + if (@ARGV && @out) { + warning("Skipping the following files (use --nofilter to avoid this):\n| ", join "\n| ", @out); + } + @files = @in; +} + +die "No input files given!\n" unless @files; + +my(%files, %global, %revreplace); +%revreplace = reverse %replace; +my $filename; +my $patch_opened = 0; + +for $filename (@files) { + unless (open IN, "<$filename") { + warn "Unable to read from $filename: $!\n"; + next; + } + + info("Scanning $filename ..."); + + my $c = do { local $/; <IN> }; + close IN; + + my %file = (orig => $c, changes => 0); + + # Temporarily remove C/XS comments and strings from the code + my @ccom; + + $c =~ s{ + ( ^$HS*\#$HS*include\b[^\r\n]+\b(?:\Q$ppport\E|XSUB\.h)\b[^\r\n]* + | ^$HS*\#$HS*(?:define|elif|if(?:def)?)\b[^\r\n]* ) + | ( ^$HS*\#[^\r\n]* + | "[^"\\]*(?:\\.[^"\\]*)*" + | '[^'\\]*(?:\\.[^'\\]*)*' + | / (?: \*[^*]*\*+(?:[^$ccs][^*]*\*+)* / | /[^\r\n]* ) ) + }{ defined $2 and push @ccom, $2; + defined $1 ? $1 : "$ccs$#ccom$cce" }mgsex; + + $file{ccom} = \@ccom; + $file{code} = $c; + $file{has_inc_ppport} = $c =~ /^$HS*#$HS*include[^\r\n]+\b\Q$ppport\E\b/m; + + my $func; + + for $func (keys %API) { + my $match = $func; + $match .= "|$revreplace{$func}" if exists $revreplace{$func}; + if ($c =~ /\b(?:Perl_)?($match)\b/) { + $file{uses_replace}{$1}++ if exists $revreplace{$func} && $1 eq $revreplace{$func}; + $file{uses_Perl}{$func}++ if $c =~ /\bPerl_$func\b/; + if (exists $API{$func}{provided}) { + $file{uses_provided}{$func}++; + if (!exists $API{$func}{base} || $API{$func}{base} > $opt{'compat-version'}) { + $file{uses}{$func}++; + my @deps = rec_depend($func); + if (@deps) { + $file{uses_deps}{$func} = \@deps; + for (@deps) { + $file{uses}{$_} = 0 unless exists $file{uses}{$_}; + } + } + for ($func, @deps) { + $file{needs}{$_} = 'static' if exists $need{$_}; + } + } + } + if (exists $API{$func}{todo} && $API{$func}{todo} > $opt{'compat-version'}) { + if ($c =~ /\b$func\b/) { + $file{uses_todo}{$func}++; + } + } + } + } + + while ($c =~ /^$HS*#$HS*define$HS+(NEED_(\w+?)(_GLOBAL)?)\b/mg) { + if (exists $need{$2}) { + $file{defined $3 ? 'needed_global' : 'needed_static'}{$2}++; + } + else { warning("Possibly wrong #define $1 in $filename") } + } + + for (qw(uses needs uses_todo needed_global needed_static)) { + for $func (keys %{$file{$_}}) { + push @{$global{$_}{$func}}, $filename; + } + } + + $files{$filename} = \%file; +} + +# Globally resolve NEED_'s +my $need; +for $need (keys %{$global{needs}}) { + if (@{$global{needs}{$need}} > 1) { + my @targets = @{$global{needs}{$need}}; + my @t = grep $files{$_}{needed_global}{$need}, @targets; + @targets = @t if @t; + @t = grep /\.xs$/i, @targets; + @targets = @t if @t; + my $target = shift @targets; + $files{$target}{needs}{$need} = 'global'; + for (@{$global{needs}{$need}}) { + $files{$_}{needs}{$need} = 'extern' if $_ ne $target; + } + } +} + +for $filename (@files) { + exists $files{$filename} or next; + + info("=== Analyzing $filename ==="); + + my %file = %{$files{$filename}}; + my $func; + my $c = $file{code}; + my $warnings = 0; + + for $func (sort keys %{$file{uses_Perl}}) { + if ($API{$func}{varargs}) { + unless ($API{$func}{nothxarg}) { + my $changes = ($c =~ s{\b(Perl_$func\s*\(\s*)(?!aTHX_?)(\)|[^\s)]*\))} + { $1 . ($2 eq ')' ? 'aTHX' : 'aTHX_ ') . $2 }ge); + if ($changes) { + warning("Doesn't pass interpreter argument aTHX to Perl_$func"); + $file{changes} += $changes; + } + } + } + else { + warning("Uses Perl_$func instead of $func"); + $file{changes} += ($c =~ s{\bPerl_$func(\s*)\((\s*aTHX_?)?\s*} + {$func$1(}g); + } + } + + for $func (sort keys %{$file{uses_replace}}) { + warning("Uses $func instead of $replace{$func}"); + $file{changes} += ($c =~ s/\b$func\b/$replace{$func}/g); + } + + for $func (sort keys %{$file{uses_provided}}) { + if ($file{uses}{$func}) { + if (exists $file{uses_deps}{$func}) { + diag("Uses $func, which depends on ", join(', ', @{$file{uses_deps}{$func}})); + } + else { + diag("Uses $func"); + } + } + $warnings += hint($func); + } + + unless ($opt{quiet}) { + for $func (sort keys %{$file{uses_todo}}) { + print "*** WARNING: Uses $func, which may not be portable below perl ", + format_version($API{$func}{todo}), ", even with '$ppport'\n"; + $warnings++; + } + } + + for $func (sort keys %{$file{needed_static}}) { + my $message = ''; + if (not exists $file{uses}{$func}) { + $message = "No need to define NEED_$func if $func is never used"; + } + elsif (exists $file{needs}{$func} && $file{needs}{$func} ne 'static') { + $message = "No need to define NEED_$func when already needed globally"; + } + if ($message) { + diag($message); + $file{changes} += ($c =~ s/^$HS*#$HS*define$HS+NEED_$func\b.*$LF//mg); + } + } + + for $func (sort keys %{$file{needed_global}}) { + my $message = ''; + if (not exists $global{uses}{$func}) { + $message = "No need to define NEED_${func}_GLOBAL if $func is never used"; + } + elsif (exists $file{needs}{$func}) { + if ($file{needs}{$func} eq 'extern') { + $message = "No need to define NEED_${func}_GLOBAL when already needed globally"; + } + elsif ($file{needs}{$func} eq 'static') { + $message = "No need to define NEED_${func}_GLOBAL when only used in this file"; + } + } + if ($message) { + diag($message); + $file{changes} += ($c =~ s/^$HS*#$HS*define$HS+NEED_${func}_GLOBAL\b.*$LF//mg); + } + } + + $file{needs_inc_ppport} = keys %{$file{uses}}; + + if ($file{needs_inc_ppport}) { + my $pp = ''; + + for $func (sort keys %{$file{needs}}) { + my $type = $file{needs}{$func}; + next if $type eq 'extern'; + my $suffix = $type eq 'global' ? '_GLOBAL' : ''; + unless (exists $file{"needed_$type"}{$func}) { + if ($type eq 'global') { + diag("Files [@{$global{needs}{$func}}] need $func, adding global request"); + } + else { + diag("File needs $func, adding static request"); + } + $pp .= "#define NEED_$func$suffix\n"; + } + } + + if ($pp && ($c =~ s/^(?=$HS*#$HS*define$HS+NEED_\w+)/$pp/m)) { + $pp = ''; + $file{changes}++; + } + + unless ($file{has_inc_ppport}) { + diag("Needs to include '$ppport'"); + $pp .= qq(#include "$ppport"\n) + } + + if ($pp) { + $file{changes} += ($c =~ s/^($HS*#$HS*define$HS+NEED_\w+.*?)^/$1$pp/ms) + || ($c =~ s/^(?=$HS*#$HS*include.*\Q$ppport\E)/$pp/m) + || ($c =~ s/^($HS*#$HS*include.*XSUB.*\s*?)^/$1$pp/m) + || ($c =~ s/^/$pp/); + } + } + else { + if ($file{has_inc_ppport}) { + diag("No need to include '$ppport'"); + $file{changes} += ($c =~ s/^$HS*?#$HS*include.*\Q$ppport\E.*?$LF//m); + } + } + + # put back in our C comments + my $ix; + my $cppc = 0; + my @ccom = @{$file{ccom}}; + for $ix (0 .. $#ccom) { + if (!$opt{cplusplus} && $ccom[$ix] =~ s!^//!!) { + $cppc++; + $file{changes} += $c =~ s/$rccs$ix$rcce/$ccs$ccom[$ix] $cce/; + } + else { + $c =~ s/$rccs$ix$rcce/$ccom[$ix]/; + } + } + + if ($cppc) { + my $s = $cppc != 1 ? 's' : ''; + warning("Uses $cppc C++ style comment$s, which is not portable"); + } + + my $s = $warnings != 1 ? 's' : ''; + my $warn = $warnings ? " ($warnings warning$s)" : ''; + info("Analysis completed$warn"); + + if ($file{changes}) { + if (exists $opt{copy}) { + my $newfile = "$filename$opt{copy}"; + if (-e $newfile) { + error("'$newfile' already exists, refusing to write copy of '$filename'"); + } + else { + local *F; + if (open F, ">$newfile") { + info("Writing copy of '$filename' with changes to '$newfile'"); + print F $c; + close F; + } + else { + error("Cannot open '$newfile' for writing: $!"); + } + } + } + elsif (exists $opt{patch} || $opt{changes}) { + if (exists $opt{patch}) { + unless ($patch_opened) { + if (open PATCH, ">$opt{patch}") { + $patch_opened = 1; + } + else { + error("Cannot open '$opt{patch}' for writing: $!"); + delete $opt{patch}; + $opt{changes} = 1; + goto fallback; + } + } + mydiff(\*PATCH, $filename, $c); + } + else { +fallback: + info("Suggested changes:"); + mydiff(\*STDOUT, $filename, $c); + } + } + else { + my $s = $file{changes} == 1 ? '' : 's'; + info("$file{changes} potentially required change$s detected"); + } + } + else { + info("Looks good"); + } +} + +close PATCH if $patch_opened; + +exit 0; + + +sub try_use { eval "use @_;"; return $@ eq '' } + +sub mydiff +{ + local *F = shift; + my($file, $str) = @_; + my $diff; + + if (exists $opt{diff}) { + $diff = run_diff($opt{diff}, $file, $str); + } + + if (!defined $diff and try_use('Text::Diff')) { + $diff = Text::Diff::diff($file, \$str, { STYLE => 'Unified' }); + $diff = <<HEADER . $diff; +--- $file ++++ $file.patched +HEADER + } + + if (!defined $diff) { + $diff = run_diff('diff -u', $file, $str); + } + + if (!defined $diff) { + $diff = run_diff('diff', $file, $str); + } + + if (!defined $diff) { + error("Cannot generate a diff. Please install Text::Diff or use --copy."); + return; + } + + print F $diff; +} + +sub run_diff +{ + my($prog, $file, $str) = @_; + my $tmp = 'dppptemp'; + my $suf = 'aaa'; + my $diff = ''; + local *F; + + while (-e "$tmp.$suf") { $suf++ } + $tmp = "$tmp.$suf"; + + if (open F, ">$tmp") { + print F $str; + close F; + + if (open F, "$prog $file $tmp |") { + while (<F>) { + s/\Q$tmp\E/$file.patched/; + $diff .= $_; + } + close F; + unlink $tmp; + return $diff; + } + + unlink $tmp; + } + else { + error("Cannot open '$tmp' for writing: $!"); + } + + return undef; +} + +sub rec_depend +{ + my($func, $seen) = @_; + return () unless exists $depends{$func}; + $seen = {%{$seen||{}}}; + return () if $seen->{$func}++; + my %s; + grep !$s{$_}++, map { ($_, rec_depend($_, $seen)) } @{$depends{$func}}; +} + +sub parse_version +{ + my $ver = shift; + + if ($ver =~ /^(\d+)\.(\d+)\.(\d+)$/) { + return ($1, $2, $3); + } + elsif ($ver !~ /^\d+\.[\d_]+$/) { + die "cannot parse version '$ver'\n"; + } + + $ver =~ s/_//g; + $ver =~ s/$/000000/; + + my($r,$v,$s) = $ver =~ /(\d+)\.(\d{3})(\d{3})/; + + $v = int $v; + $s = int $s; + + if ($r < 5 || ($r == 5 && $v < 6)) { + if ($s % 10) { + die "cannot parse version '$ver'\n"; + } + } + + return ($r, $v, $s); +} + +sub format_version +{ + my $ver = shift; + + $ver =~ s/$/000000/; + my($r,$v,$s) = $ver =~ /(\d+)\.(\d{3})(\d{3})/; + + $v = int $v; + $s = int $s; + + if ($r < 5 || ($r == 5 && $v < 6)) { + if ($s % 10) { + die "invalid version '$ver'\n"; + } + $s /= 10; + + $ver = sprintf "%d.%03d", $r, $v; + $s > 0 and $ver .= sprintf "_%02d", $s; + + return $ver; + } + + return sprintf "%d.%d.%d", $r, $v, $s; +} + +sub info +{ + $opt{quiet} and return; + print @_, "\n"; +} + +sub diag +{ + $opt{quiet} and return; + $opt{diag} and print @_, "\n"; +} + +sub warning +{ + $opt{quiet} and return; + print "*** ", @_, "\n"; +} + +sub error +{ + print "*** ERROR: ", @_, "\n"; +} + +my %given_hints; +my %given_warnings; +sub hint +{ + $opt{quiet} and return; + my $func = shift; + my $rv = 0; + if (exists $warnings{$func} && !$given_warnings{$func}++) { + my $warn = $warnings{$func}; + $warn =~ s!^!*** !mg; + print "*** WARNING: $func\n", $warn; + $rv++; + } + if ($opt{hints} && exists $hints{$func} && !$given_hints{$func}++) { + my $hint = $hints{$func}; + $hint =~ s/^/ /mg; + print " --- hint for $func ---\n", $hint; + } + $rv; +} + +sub usage +{ + my($usage) = do { local(@ARGV,$/)=($0); <> } =~ /^=head\d$HS+SYNOPSIS\s*^(.*?)\s*^=/ms; + my %M = ( 'I' => '*' ); + $usage =~ s/^\s*perl\s+\S+/$^X $0/; + $usage =~ s/([A-Z])<([^>]+)>/$M{$1}$2$M{$1}/g; + + print <<ENDUSAGE; + +Usage: $usage + +See perldoc $0 for details. + +ENDUSAGE + + exit 2; +} + +sub strip +{ + my $self = do { local(@ARGV,$/)=($0); <> }; + my($copy) = $self =~ /^=head\d\s+COPYRIGHT\s*^(.*?)^=\w+/ms; + $copy =~ s/^(?=\S+)/ /gms; + $self =~ s/^$HS+Do NOT edit.*?(?=^-)/$copy/ms; + $self =~ s/^SKIP.*(?=^__DATA__)/SKIP +if (\@ARGV && \$ARGV[0] eq '--unstrip') { + eval { require Devel::PPPort }; + \$@ and die "Cannot require Devel::PPPort, please install.\\n"; + if (eval \$Devel::PPPort::VERSION < $VERSION) { + die "$0 was originally generated with Devel::PPPort $VERSION.\\n" + . "Your Devel::PPPort is only version \$Devel::PPPort::VERSION.\\n" + . "Please install a newer version, or --unstrip will not work.\\n"; + } + Devel::PPPort::WriteFile(\$0); + exit 0; +} +print <<END; + +Sorry, but this is a stripped version of \$0. + +To be able to use its original script and doc functionality, +please try to regenerate this file using: + + \$^X \$0 --unstrip + +END +/ms; + my($pl, $c) = $self =~ /(.*^__DATA__)(.*)/ms; + $c =~ s{ + / (?: \*[^*]*\*+(?:[^$ccs][^*]*\*+)* / | /[^\r\n]*) + | ( "[^"\\]*(?:\\.[^"\\]*)*" + | '[^'\\]*(?:\\.[^'\\]*)*' ) + | ($HS+) }{ defined $2 ? ' ' : ($1 || '') }gsex; + $c =~ s!\s+$!!mg; + $c =~ s!^$LF!!mg; + $c =~ s!^\s*#\s*!#!mg; + $c =~ s!^\s+!!mg; + + open OUT, ">$0" or die "cannot strip $0: $!\n"; + print OUT "$pl$c\n"; + + exit 0; +} + +__DATA__ +*/ + +#ifndef _P_P_PORTABILITY_H_ +#define _P_P_PORTABILITY_H_ + +#ifndef DPPP_NAMESPACE +# define DPPP_NAMESPACE DPPP_ +#endif + +#define DPPP_CAT2(x,y) CAT2(x,y) +#define DPPP_(name) DPPP_CAT2(DPPP_NAMESPACE, name) + +#ifndef PERL_REVISION +# if !defined(__PATCHLEVEL_H_INCLUDED__) && !(defined(PATCHLEVEL) && defined(SUBVERSION)) +# define PERL_PATCHLEVEL_H_IMPLICIT +# include <patchlevel.h> +# endif +# if !(defined(PERL_VERSION) || (defined(SUBVERSION) && defined(PATCHLEVEL))) +# include <could_not_find_Perl_patchlevel.h> +# endif +# ifndef PERL_REVISION +# define PERL_REVISION (5) + /* Replace: 1 */ +# define PERL_VERSION PATCHLEVEL +# define PERL_SUBVERSION SUBVERSION + /* Replace PERL_PATCHLEVEL with PERL_VERSION */ + /* Replace: 0 */ +# endif +#endif + +#define _dpppDEC2BCD(dec) ((((dec)/100)<<8)|((((dec)%100)/10)<<4)|((dec)%10)) +#define PERL_BCDVERSION ((_dpppDEC2BCD(PERL_REVISION)<<24)|(_dpppDEC2BCD(PERL_VERSION)<<12)|_dpppDEC2BCD(PERL_SUBVERSION)) + +/* It is very unlikely that anyone will try to use this with Perl 6 + (or greater), but who knows. + */ +#if PERL_REVISION != 5 +# error ppport.h only works with Perl version 5 +#endif /* PERL_REVISION != 5 */ +#ifndef dTHR +# define dTHR dNOOP +#endif +#ifndef dTHX +# define dTHX dNOOP +#endif + +#ifndef dTHXa +# define dTHXa(x) dNOOP +#endif +#ifndef pTHX +# define pTHX void +#endif + +#ifndef pTHX_ +# define pTHX_ +#endif + +#ifndef aTHX +# define aTHX +#endif + +#ifndef aTHX_ +# define aTHX_ +#endif + +#if (PERL_BCDVERSION < 0x5006000) +# ifdef USE_THREADS +# define aTHXR thr +# define aTHXR_ thr, +# else +# define aTHXR +# define aTHXR_ +# endif +# define dTHXR dTHR +#else +# define aTHXR aTHX +# define aTHXR_ aTHX_ +# define dTHXR dTHX +#endif +#ifndef dTHXoa +# define dTHXoa(x) dTHXa(x) +#endif + +#ifdef I_LIMITS +# include <limits.h> +#endif + +#ifndef PERL_UCHAR_MIN +# define PERL_UCHAR_MIN ((unsigned char)0) +#endif + +#ifndef PERL_UCHAR_MAX +# ifdef UCHAR_MAX +# define PERL_UCHAR_MAX ((unsigned char)UCHAR_MAX) +# else +# ifdef MAXUCHAR +# define PERL_UCHAR_MAX ((unsigned char)MAXUCHAR) +# else +# define PERL_UCHAR_MAX ((unsigned char)~(unsigned)0) +# endif +# endif +#endif + +#ifndef PERL_USHORT_MIN +# define PERL_USHORT_MIN ((unsigned short)0) +#endif + +#ifndef PERL_USHORT_MAX +# ifdef USHORT_MAX +# define PERL_USHORT_MAX ((unsigned short)USHORT_MAX) +# else +# ifdef MAXUSHORT +# define PERL_USHORT_MAX ((unsigned short)MAXUSHORT) +# else +# ifdef USHRT_MAX +# define PERL_USHORT_MAX ((unsigned short)USHRT_MAX) +# else +# define PERL_USHORT_MAX ((unsigned short)~(unsigned)0) +# endif +# endif +# endif +#endif + +#ifndef PERL_SHORT_MAX +# ifdef SHORT_MAX +# define PERL_SHORT_MAX ((short)SHORT_MAX) +# else +# ifdef MAXSHORT /* Often used in <values.h> */ +# define PERL_SHORT_MAX ((short)MAXSHORT) +# else +# ifdef SHRT_MAX +# define PERL_SHORT_MAX ((short)SHRT_MAX) +# else +# define PERL_SHORT_MAX ((short) (PERL_USHORT_MAX >> 1)) +# endif +# endif +# endif +#endif + +#ifndef PERL_SHORT_MIN +# ifdef SHORT_MIN +# define PERL_SHORT_MIN ((short)SHORT_MIN) +# else +# ifdef MINSHORT +# define PERL_SHORT_MIN ((short)MINSHORT) +# else +# ifdef SHRT_MIN +# define PERL_SHORT_MIN ((short)SHRT_MIN) +# else +# define PERL_SHORT_MIN (-PERL_SHORT_MAX - ((3 & -1) == 3)) +# endif +# endif +# endif +#endif + +#ifndef PERL_UINT_MAX +# ifdef UINT_MAX +# define PERL_UINT_MAX ((unsigned int)UINT_MAX) +# else +# ifdef MAXUINT +# define PERL_UINT_MAX ((unsigned int)MAXUINT) +# else +# define PERL_UINT_MAX (~(unsigned int)0) +# endif +# endif +#endif + +#ifndef PERL_UINT_MIN +# define PERL_UINT_MIN ((unsigned int)0) +#endif + +#ifndef PERL_INT_MAX +# ifdef INT_MAX +# define PERL_INT_MAX ((int)INT_MAX) +# else +# ifdef MAXINT /* Often used in <values.h> */ +# define PERL_INT_MAX ((int)MAXINT) +# else +# define PERL_INT_MAX ((int)(PERL_UINT_MAX >> 1)) +# endif +# endif +#endif + +#ifndef PERL_INT_MIN +# ifdef INT_MIN +# define PERL_INT_MIN ((int)INT_MIN) +# else +# ifdef MININT +# define PERL_INT_MIN ((int)MININT) +# else +# define PERL_INT_MIN (-PERL_INT_MAX - ((3 & -1) == 3)) +# endif +# endif +#endif + +#ifndef PERL_ULONG_MAX +# ifdef ULONG_MAX +# define PERL_ULONG_MAX ((unsigned long)ULONG_MAX) +# else +# ifdef MAXULONG +# define PERL_ULONG_MAX ((unsigned long)MAXULONG) +# else +# define PERL_ULONG_MAX (~(unsigned long)0) +# endif +# endif +#endif + +#ifndef PERL_ULONG_MIN +# define PERL_ULONG_MIN ((unsigned long)0L) +#endif + +#ifndef PERL_LONG_MAX +# ifdef LONG_MAX +# define PERL_LONG_MAX ((long)LONG_MAX) +# else +# ifdef MAXLONG +# define PERL_LONG_MAX ((long)MAXLONG) +# else +# define PERL_LONG_MAX ((long) (PERL_ULONG_MAX >> 1)) +# endif +# endif +#endif + +#ifndef PERL_LONG_MIN +# ifdef LONG_MIN +# define PERL_LONG_MIN ((long)LONG_MIN) +# else +# ifdef MINLONG +# define PERL_LONG_MIN ((long)MINLONG) +# else +# define PERL_LONG_MIN (-PERL_LONG_MAX - ((3 & -1) == 3)) +# endif +# endif +#endif + +#if defined(HAS_QUAD) && (defined(convex) || defined(uts)) +# ifndef PERL_UQUAD_MAX +# ifdef ULONGLONG_MAX +# define PERL_UQUAD_MAX ((unsigned long long)ULONGLONG_MAX) +# else +# ifdef MAXULONGLONG +# define PERL_UQUAD_MAX ((unsigned long long)MAXULONGLONG) +# else +# define PERL_UQUAD_MAX (~(unsigned long long)0) +# endif +# endif +# endif + +# ifndef PERL_UQUAD_MIN +# define PERL_UQUAD_MIN ((unsigned long long)0L) +# endif + +# ifndef PERL_QUAD_MAX +# ifdef LONGLONG_MAX +# define PERL_QUAD_MAX ((long long)LONGLONG_MAX) +# else +# ifdef MAXLONGLONG +# define PERL_QUAD_MAX ((long long)MAXLONGLONG) +# else +# define PERL_QUAD_MAX ((long long) (PERL_UQUAD_MAX >> 1)) +# endif +# endif +# endif + +# ifndef PERL_QUAD_MIN +# ifdef LONGLONG_MIN +# define PERL_QUAD_MIN ((long long)LONGLONG_MIN) +# else +# ifdef MINLONGLONG +# define PERL_QUAD_MIN ((long long)MINLONGLONG) +# else +# define PERL_QUAD_MIN (-PERL_QUAD_MAX - ((3 & -1) == 3)) +# endif +# endif +# endif +#endif + +/* This is based on code from 5.003 perl.h */ +#ifdef HAS_QUAD +# ifdef cray +#ifndef IVTYPE +# define IVTYPE int +#endif + +#ifndef IV_MIN +# define IV_MIN PERL_INT_MIN +#endif + +#ifndef IV_MAX +# define IV_MAX PERL_INT_MAX +#endif + +#ifndef UV_MIN +# define UV_MIN PERL_UINT_MIN +#endif + +#ifndef UV_MAX +# define UV_MAX PERL_UINT_MAX +#endif + +# ifdef INTSIZE +#ifndef IVSIZE +# define IVSIZE INTSIZE +#endif + +# endif +# else +# if defined(convex) || defined(uts) +#ifndef IVTYPE +# define IVTYPE long long +#endif + +#ifndef IV_MIN +# define IV_MIN PERL_QUAD_MIN +#endif + +#ifndef IV_MAX +# define IV_MAX PERL_QUAD_MAX +#endif + +#ifndef UV_MIN +# define UV_MIN PERL_UQUAD_MIN +#endif + +#ifndef UV_MAX +# define UV_MAX PERL_UQUAD_MAX +#endif + +# ifdef LONGLONGSIZE +#ifndef IVSIZE +# define IVSIZE LONGLONGSIZE +#endif + +# endif +# else +#ifndef IVTYPE +# define IVTYPE long +#endif + +#ifndef IV_MIN +# define IV_MIN PERL_LONG_MIN +#endif + +#ifndef IV_MAX +# define IV_MAX PERL_LONG_MAX +#endif + +#ifndef UV_MIN +# define UV_MIN PERL_ULONG_MIN +#endif + +#ifndef UV_MAX +# define UV_MAX PERL_ULONG_MAX +#endif + +# ifdef LONGSIZE +#ifndef IVSIZE +# define IVSIZE LONGSIZE +#endif + +# endif +# endif +# endif +#ifndef IVSIZE +# define IVSIZE 8 +#endif + +#ifndef LONGSIZE +# define LONGSIZE 8 +#endif + +#ifndef PERL_QUAD_MIN +# define PERL_QUAD_MIN IV_MIN +#endif + +#ifndef PERL_QUAD_MAX +# define PERL_QUAD_MAX IV_MAX +#endif + +#ifndef PERL_UQUAD_MIN +# define PERL_UQUAD_MIN UV_MIN +#endif + +#ifndef PERL_UQUAD_MAX +# define PERL_UQUAD_MAX UV_MAX +#endif + +#else +#ifndef IVTYPE +# define IVTYPE long +#endif + +#ifndef LONGSIZE +# define LONGSIZE 4 +#endif + +#ifndef IV_MIN +# define IV_MIN PERL_LONG_MIN +#endif + +#ifndef IV_MAX +# define IV_MAX PERL_LONG_MAX +#endif + +#ifndef UV_MIN +# define UV_MIN PERL_ULONG_MIN +#endif + +#ifndef UV_MAX +# define UV_MAX PERL_ULONG_MAX +#endif + +#endif + +#ifndef IVSIZE +# ifdef LONGSIZE +# define IVSIZE LONGSIZE +# else +# define IVSIZE 4 /* A bold guess, but the best we can make. */ +# endif +#endif +#ifndef UVTYPE +# define UVTYPE unsigned IVTYPE +#endif + +#ifndef UVSIZE +# define UVSIZE IVSIZE +#endif +#ifndef sv_setuv +# define sv_setuv(sv, uv) \ + STMT_START { \ + UV TeMpUv = uv; \ + if (TeMpUv <= IV_MAX) \ + sv_setiv(sv, TeMpUv); \ + else \ + sv_setnv(sv, (double)TeMpUv); \ + } STMT_END +#endif +#ifndef newSVuv +# define newSVuv(uv) ((uv) <= IV_MAX ? newSViv((IV)uv) : newSVnv((NV)uv)) +#endif +#ifndef sv_2uv +# define sv_2uv(sv) ((PL_Sv = (sv)), (UV) (SvNOK(PL_Sv) ? SvNV(PL_Sv) : sv_2nv(PL_Sv))) +#endif + +#ifndef SvUVX +# define SvUVX(sv) ((UV)SvIVX(sv)) +#endif + +#ifndef SvUVXx +# define SvUVXx(sv) SvUVX(sv) +#endif + +#ifndef SvUV +# define SvUV(sv) (SvIOK(sv) ? SvUVX(sv) : sv_2uv(sv)) +#endif + +#ifndef SvUVx +# define SvUVx(sv) ((PL_Sv = (sv)), SvUV(PL_Sv)) +#endif + +/* Hint: sv_uv + * Always use the SvUVx() macro instead of sv_uv(). + */ +#ifndef sv_uv +# define sv_uv(sv) SvUVx(sv) +#endif + +#if !defined(SvUOK) && defined(SvIOK_UV) +# define SvUOK(sv) SvIOK_UV(sv) +#endif +#ifndef XST_mUV +# define XST_mUV(i,v) (ST(i) = sv_2mortal(newSVuv(v)) ) +#endif + +#ifndef XSRETURN_UV +# define XSRETURN_UV(v) STMT_START { XST_mUV(0,v); XSRETURN(1); } STMT_END +#endif +#ifndef PUSHu +# define PUSHu(u) STMT_START { sv_setuv(TARG, (UV)(u)); PUSHTARG; } STMT_END +#endif + +#ifndef XPUSHu +# define XPUSHu(u) STMT_START { sv_setuv(TARG, (UV)(u)); XPUSHTARG; } STMT_END +#endif + +#ifdef HAS_MEMCMP +#ifndef memNE +# define memNE(s1,s2,l) (memcmp(s1,s2,l)) +#endif + +#ifndef memEQ +# define memEQ(s1,s2,l) (!memcmp(s1,s2,l)) +#endif + +#else +#ifndef memNE +# define memNE(s1,s2,l) (bcmp(s1,s2,l)) +#endif + +#ifndef memEQ +# define memEQ(s1,s2,l) (!bcmp(s1,s2,l)) +#endif + +#endif +#ifndef memEQs +# define memEQs(s1, l, s2) \ + (sizeof(s2)-1 == l && memEQ(s1, (s2 ""), (sizeof(s2)-1))) +#endif + +#ifndef memNEs +# define memNEs(s1, l, s2) !memEQs(s1, l, s2) +#endif +#ifndef MoveD +# define MoveD(s,d,n,t) memmove((char*)(d),(char*)(s), (n) * sizeof(t)) +#endif + +#ifndef CopyD +# define CopyD(s,d,n,t) memcpy((char*)(d),(char*)(s), (n) * sizeof(t)) +#endif + +#ifdef HAS_MEMSET +#ifndef ZeroD +# define ZeroD(d,n,t) memzero((char*)(d), (n) * sizeof(t)) +#endif + +#else +#ifndef ZeroD +# define ZeroD(d,n,t) ((void)memzero((char*)(d), (n) * sizeof(t)), d) +#endif + +#endif +#ifndef PoisonWith +# define PoisonWith(d,n,t,b) (void)memset((char*)(d), (U8)(b), (n) * sizeof(t)) +#endif + +#ifndef PoisonNew +# define PoisonNew(d,n,t) PoisonWith(d,n,t,0xAB) +#endif + +#ifndef PoisonFree +# define PoisonFree(d,n,t) PoisonWith(d,n,t,0xEF) +#endif + +#ifndef Poison +# define Poison(d,n,t) PoisonFree(d,n,t) +#endif +#ifndef Newx +# define Newx(v,n,t) New(0,v,n,t) +#endif + +#ifndef Newxc +# define Newxc(v,n,t,c) Newc(0,v,n,t,c) +#endif + +#ifndef Newxz +# define Newxz(v,n,t) Newz(0,v,n,t) +#endif + +#ifndef PERL_UNUSED_DECL +# ifdef HASATTRIBUTE +# if (defined(__GNUC__) && defined(__cplusplus)) || defined(__INTEL_COMPILER) +# define PERL_UNUSED_DECL +# else +# define PERL_UNUSED_DECL __attribute__((unused)) +# endif +# else +# define PERL_UNUSED_DECL +# endif +#endif + +#ifndef PERL_UNUSED_ARG +# if defined(lint) && defined(S_SPLINT_S) /* www.splint.org */ +# include <note.h> +# define PERL_UNUSED_ARG(x) NOTE(ARGUNUSED(x)) +# else +# define PERL_UNUSED_ARG(x) ((void)x) +# endif +#endif + +#ifndef PERL_UNUSED_VAR +# define PERL_UNUSED_VAR(x) ((void)x) +#endif + +#ifndef PERL_UNUSED_CONTEXT +# ifdef USE_ITHREADS +# define PERL_UNUSED_CONTEXT PERL_UNUSED_ARG(my_perl) +# else +# define PERL_UNUSED_CONTEXT +# endif +#endif +#ifndef NOOP +# define NOOP /*EMPTY*/(void)0 +#endif + +#ifndef dNOOP +# define dNOOP extern int /*@unused@*/ Perl___notused PERL_UNUSED_DECL +#endif + +#ifndef NVTYPE +# if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE) +# define NVTYPE long double +# else +# define NVTYPE double +# endif +typedef NVTYPE NV; +#endif + +#ifndef INT2PTR +# if (IVSIZE == PTRSIZE) && (UVSIZE == PTRSIZE) +# define PTRV UV +# define INT2PTR(any,d) (any)(d) +# else +# if PTRSIZE == LONGSIZE +# define PTRV unsigned long +# else +# define PTRV unsigned +# endif +# define INT2PTR(any,d) (any)(PTRV)(d) +# endif +#endif + +#ifndef PTR2ul +# if PTRSIZE == LONGSIZE +# define PTR2ul(p) (unsigned long)(p) +# else +# define PTR2ul(p) INT2PTR(unsigned long,p) +# endif +#endif +#ifndef PTR2nat +# define PTR2nat(p) (PTRV)(p) +#endif + +#ifndef NUM2PTR +# define NUM2PTR(any,d) (any)PTR2nat(d) +#endif + +#ifndef PTR2IV +# define PTR2IV(p) INT2PTR(IV,p) +#endif + +#ifndef PTR2UV +# define PTR2UV(p) INT2PTR(UV,p) +#endif + +#ifndef PTR2NV +# define PTR2NV(p) NUM2PTR(NV,p) +#endif + +#undef START_EXTERN_C +#undef END_EXTERN_C +#undef EXTERN_C +#ifdef __cplusplus +# define START_EXTERN_C extern "C" { +# define END_EXTERN_C } +# define EXTERN_C extern "C" +#else +# define START_EXTERN_C +# define END_EXTERN_C +# define EXTERN_C extern +#endif + +#if defined(PERL_GCC_PEDANTIC) +# ifndef PERL_GCC_BRACE_GROUPS_FORBIDDEN +# define PERL_GCC_BRACE_GROUPS_FORBIDDEN +# endif +#endif + +#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN) && !defined(__cplusplus) +# ifndef PERL_USE_GCC_BRACE_GROUPS +# define PERL_USE_GCC_BRACE_GROUPS +# endif +#endif + +#undef STMT_START +#undef STMT_END +#ifdef PERL_USE_GCC_BRACE_GROUPS +# define STMT_START (void)( /* gcc supports ``({ STATEMENTS; })'' */ +# define STMT_END ) +#else +# if defined(VOIDFLAGS) && (VOIDFLAGS) && (defined(sun) || defined(__sun__)) && !defined(__GNUC__) +# define STMT_START if (1) +# define STMT_END else (void)0 +# else +# define STMT_START do +# define STMT_END while (0) +# endif +#endif +#ifndef boolSV +# define boolSV(b) ((b) ? &PL_sv_yes : &PL_sv_no) +#endif + +/* DEFSV appears first in 5.004_56 */ +#ifndef DEFSV +# define DEFSV GvSV(PL_defgv) +#endif + +#ifndef SAVE_DEFSV +# define SAVE_DEFSV SAVESPTR(GvSV(PL_defgv)) +#endif + +#ifndef DEFSV_set +# define DEFSV_set(sv) (DEFSV = (sv)) +#endif + +/* Older perls (<=5.003) lack AvFILLp */ +#ifndef AvFILLp +# define AvFILLp AvFILL +#endif +#ifndef ERRSV +# define ERRSV get_sv("@",FALSE) +#endif + +/* Hint: gv_stashpvn + * This function's backport doesn't support the length parameter, but + * rather ignores it. Portability can only be ensured if the length + * parameter is used for speed reasons, but the length can always be + * correctly computed from the string argument. + */ +#ifndef gv_stashpvn +# define gv_stashpvn(str,len,create) gv_stashpv(str,create) +#endif + +/* Replace: 1 */ +#ifndef get_cv +# define get_cv perl_get_cv +#endif + +#ifndef get_sv +# define get_sv perl_get_sv +#endif + +#ifndef get_av +# define get_av perl_get_av +#endif + +#ifndef get_hv +# define get_hv perl_get_hv +#endif + +/* Replace: 0 */ +#ifndef dUNDERBAR +# define dUNDERBAR dNOOP +#endif + +#ifndef UNDERBAR +# define UNDERBAR DEFSV +#endif +#ifndef dAX +# define dAX I32 ax = MARK - PL_stack_base + 1 +#endif + +#ifndef dITEMS +# define dITEMS I32 items = SP - MARK +#endif +#ifndef dXSTARG +# define dXSTARG SV * targ = sv_newmortal() +#endif +#ifndef dAXMARK +# define dAXMARK I32 ax = POPMARK; \ + register SV ** const mark = PL_stack_base + ax++ +#endif +#ifndef XSprePUSH +# define XSprePUSH (sp = PL_stack_base + ax - 1) +#endif + +#if (PERL_BCDVERSION < 0x5005000) +# undef XSRETURN +# define XSRETURN(off) \ + STMT_START { \ + PL_stack_sp = PL_stack_base + ax + ((off) - 1); \ + return; \ + } STMT_END +#endif +#ifndef XSPROTO +# define XSPROTO(name) void name(pTHX_ CV* cv) +#endif + +#ifndef SVfARG +# define SVfARG(p) ((void*)(p)) +#endif +#ifndef PERL_ABS +# define PERL_ABS(x) ((x) < 0 ? -(x) : (x)) +#endif +#ifndef dVAR +# define dVAR dNOOP +#endif +#ifndef SVf +# define SVf "_" +#endif +#ifndef UTF8_MAXBYTES +# define UTF8_MAXBYTES UTF8_MAXLEN +#endif +#ifndef CPERLscope +# define CPERLscope(x) x +#endif +#ifndef PERL_HASH +# define PERL_HASH(hash,str,len) \ + STMT_START { \ + const char *s_PeRlHaSh = str; \ + I32 i_PeRlHaSh = len; \ + U32 hash_PeRlHaSh = 0; \ + while (i_PeRlHaSh--) \ + hash_PeRlHaSh = hash_PeRlHaSh * 33 + *s_PeRlHaSh++; \ + (hash) = hash_PeRlHaSh; \ + } STMT_END +#endif + +#ifndef PERLIO_FUNCS_DECL +# ifdef PERLIO_FUNCS_CONST +# define PERLIO_FUNCS_DECL(funcs) const PerlIO_funcs funcs +# define PERLIO_FUNCS_CAST(funcs) (PerlIO_funcs*)(funcs) +# else +# define PERLIO_FUNCS_DECL(funcs) PerlIO_funcs funcs +# define PERLIO_FUNCS_CAST(funcs) (funcs) +# endif +#endif + +/* provide these typedefs for older perls */ +#if (PERL_BCDVERSION < 0x5009003) + +# ifdef ARGSproto +typedef OP* (CPERLscope(*Perl_ppaddr_t))(ARGSproto); +# else +typedef OP* (CPERLscope(*Perl_ppaddr_t))(pTHX); +# endif + +typedef OP* (CPERLscope(*Perl_check_t)) (pTHX_ OP*); + +#endif +#ifndef isPSXSPC +# define isPSXSPC(c) (isSPACE(c) || (c) == '\v') +#endif + +#ifndef isBLANK +# define isBLANK(c) ((c) == ' ' || (c) == '\t') +#endif + +#ifdef EBCDIC +#ifndef isALNUMC +# define isALNUMC(c) isalnum(c) +#endif + +#ifndef isASCII +# define isASCII(c) isascii(c) +#endif + +#ifndef isCNTRL +# define isCNTRL(c) iscntrl(c) +#endif + +#ifndef isGRAPH +# define isGRAPH(c) isgraph(c) +#endif + +#ifndef isPRINT +# define isPRINT(c) isprint(c) +#endif + +#ifndef isPUNCT +# define isPUNCT(c) ispunct(c) +#endif + +#ifndef isXDIGIT +# define isXDIGIT(c) isxdigit(c) +#endif + +#else +# if (PERL_BCDVERSION < 0x5010000) +/* Hint: isPRINT + * The implementation in older perl versions includes all of the + * isSPACE() characters, which is wrong. The version provided by + * Devel::PPPort always overrides a present buggy version. + */ +# undef isPRINT +# endif + +#ifdef HAS_QUAD +# ifdef U64TYPE +# define WIDEST_UTYPE U64TYPE +# else +# define WIDEST_UTYPE Quad_t +# endif +#else +# define WIDEST_UTYPE U32 +#endif +#ifndef isALNUMC +# define isALNUMC(c) (isALPHA(c) || isDIGIT(c)) +#endif + +#ifndef isASCII +# define isASCII(c) ((WIDEST_UTYPE) (c) <= 127) +#endif + +#ifndef isCNTRL +# define isCNTRL(c) ((WIDEST_UTYPE) (c) < ' ' || (c) == 127) +#endif + +#ifndef isGRAPH +# define isGRAPH(c) (isALNUM(c) || isPUNCT(c)) +#endif + +#ifndef isPRINT +# define isPRINT(c) (((c) >= 32 && (c) < 127)) +#endif + +#ifndef isPUNCT +# define isPUNCT(c) (((c) >= 33 && (c) <= 47) || ((c) >= 58 && (c) <= 64) || ((c) >= 91 && (c) <= 96) || ((c) >= 123 && (c) <= 126)) +#endif + +#ifndef isXDIGIT +# define isXDIGIT(c) (isDIGIT(c) || ((c) >= 'a' && (c) <= 'f') || ((c) >= 'A' && (c) <= 'F')) +#endif + +#endif + +/* Until we figure out how to support this in older perls... */ +#if (PERL_BCDVERSION >= 0x5008000) +#ifndef HeUTF8 +# define HeUTF8(he) ((HeKLEN(he) == HEf_SVKEY) ? \ + SvUTF8(HeKEY_sv(he)) : \ + (U32)HeKUTF8(he)) +#endif + +#endif + +#ifndef PERL_SIGNALS_UNSAFE_FLAG + +#define PERL_SIGNALS_UNSAFE_FLAG 0x0001 + +#if (PERL_BCDVERSION < 0x5008000) +# define D_PPP_PERL_SIGNALS_INIT PERL_SIGNALS_UNSAFE_FLAG +#else +# define D_PPP_PERL_SIGNALS_INIT 0 +#endif + +#if defined(NEED_PL_signals) +static U32 DPPP_(my_PL_signals) = D_PPP_PERL_SIGNALS_INIT; +#elif defined(NEED_PL_signals_GLOBAL) +U32 DPPP_(my_PL_signals) = D_PPP_PERL_SIGNALS_INIT; +#else +extern U32 DPPP_(my_PL_signals); +#endif +#define PL_signals DPPP_(my_PL_signals) + +#endif + +/* Hint: PL_ppaddr + * Calling an op via PL_ppaddr requires passing a context argument + * for threaded builds. Since the context argument is different for + * 5.005 perls, you can use aTHXR (supplied by ppport.h), which will + * automatically be defined as the correct argument. + */ + +#if (PERL_BCDVERSION <= 0x5005005) +/* Replace: 1 */ +# define PL_ppaddr ppaddr +# define PL_no_modify no_modify +/* Replace: 0 */ +#endif + +#if (PERL_BCDVERSION <= 0x5004005) +/* Replace: 1 */ +# define PL_DBsignal DBsignal +# define PL_DBsingle DBsingle +# define PL_DBsub DBsub +# define PL_DBtrace DBtrace +# define PL_Sv Sv +# define PL_bufend bufend +# define PL_bufptr bufptr +# define PL_compiling compiling +# define PL_copline copline +# define PL_curcop curcop +# define PL_curstash curstash +# define PL_debstash debstash +# define PL_defgv defgv +# define PL_diehook diehook +# define PL_dirty dirty +# define PL_dowarn dowarn +# define PL_errgv errgv +# define PL_error_count error_count +# define PL_expect expect +# define PL_hexdigit hexdigit +# define PL_hints hints +# define PL_in_my in_my +# define PL_laststatval laststatval +# define PL_lex_state lex_state +# define PL_lex_stuff lex_stuff +# define PL_linestr linestr +# define PL_na na +# define PL_perl_destruct_level perl_destruct_level +# define PL_perldb perldb +# define PL_rsfp_filters rsfp_filters +# define PL_rsfp rsfp +# define PL_stack_base stack_base +# define PL_stack_sp stack_sp +# define PL_statcache statcache +# define PL_stdingv stdingv +# define PL_sv_arenaroot sv_arenaroot +# define PL_sv_no sv_no +# define PL_sv_undef sv_undef +# define PL_sv_yes sv_yes +# define PL_tainted tainted +# define PL_tainting tainting +# define PL_tokenbuf tokenbuf +/* Replace: 0 */ +#endif + +/* Warning: PL_parser + * For perl versions earlier than 5.9.5, this is an always + * non-NULL dummy. Also, it cannot be dereferenced. Don't + * use it if you can avoid is and unless you absolutely know + * what you're doing. + * If you always check that PL_parser is non-NULL, you can + * define DPPP_PL_parser_NO_DUMMY to avoid the creation of + * a dummy parser structure. + */ + +#if (PERL_BCDVERSION >= 0x5009005) +# ifdef DPPP_PL_parser_NO_DUMMY +# define D_PPP_my_PL_parser_var(var) ((PL_parser ? PL_parser : \ + (croak("panic: PL_parser == NULL in %s:%d", \ + __FILE__, __LINE__), (yy_parser *) NULL))->var) +# else +# ifdef DPPP_PL_parser_NO_DUMMY_WARNING +# define D_PPP_parser_dummy_warning(var) +# else +# define D_PPP_parser_dummy_warning(var) \ + warn("warning: dummy PL_" #var " used in %s:%d", __FILE__, __LINE__), +# endif +# define D_PPP_my_PL_parser_var(var) ((PL_parser ? PL_parser : \ + (D_PPP_parser_dummy_warning(var) &DPPP_(dummy_PL_parser)))->var) +#if defined(NEED_PL_parser) +static yy_parser DPPP_(dummy_PL_parser); +#elif defined(NEED_PL_parser_GLOBAL) +yy_parser DPPP_(dummy_PL_parser); +#else +extern yy_parser DPPP_(dummy_PL_parser); +#endif + +# endif + +/* PL_expect, PL_copline, PL_rsfp, PL_rsfp_filters, PL_linestr, PL_bufptr, PL_bufend, PL_lex_state, PL_lex_stuff, PL_tokenbuf depends on PL_parser */ +/* Warning: PL_expect, PL_copline, PL_rsfp, PL_rsfp_filters, PL_linestr, PL_bufptr, PL_bufend, PL_lex_state, PL_lex_stuff, PL_tokenbuf + * Do not use this variable unless you know exactly what you're + * doint. It is internal to the perl parser and may change or even + * be removed in the future. As of perl 5.9.5, you have to check + * for (PL_parser != NULL) for this variable to have any effect. + * An always non-NULL PL_parser dummy is provided for earlier + * perl versions. + * If PL_parser is NULL when you try to access this variable, a + * dummy is being accessed instead and a warning is issued unless + * you define DPPP_PL_parser_NO_DUMMY_WARNING. + * If DPPP_PL_parser_NO_DUMMY is defined, the code trying to access + * this variable will croak with a panic message. + */ + +# define PL_expect D_PPP_my_PL_parser_var(expect) +# define PL_copline D_PPP_my_PL_parser_var(copline) +# define PL_rsfp D_PPP_my_PL_parser_var(rsfp) +# define PL_rsfp_filters D_PPP_my_PL_parser_var(rsfp_filters) +# define PL_linestr D_PPP_my_PL_parser_var(linestr) +# define PL_bufptr D_PPP_my_PL_parser_var(bufptr) +# define PL_bufend D_PPP_my_PL_parser_var(bufend) +# define PL_lex_state D_PPP_my_PL_parser_var(lex_state) +# define PL_lex_stuff D_PPP_my_PL_parser_var(lex_stuff) +# define PL_tokenbuf D_PPP_my_PL_parser_var(tokenbuf) +# define PL_in_my D_PPP_my_PL_parser_var(in_my) +# define PL_in_my_stash D_PPP_my_PL_parser_var(in_my_stash) +# define PL_error_count D_PPP_my_PL_parser_var(error_count) + + +#else + +/* ensure that PL_parser != NULL and cannot be dereferenced */ +# define PL_parser ((void *) 1) + +#endif +#ifndef mPUSHs +# define mPUSHs(s) PUSHs(sv_2mortal(s)) +#endif + +#ifndef PUSHmortal +# define PUSHmortal PUSHs(sv_newmortal()) +#endif + +#ifndef mPUSHp +# define mPUSHp(p,l) sv_setpvn(PUSHmortal, (p), (l)) +#endif + +#ifndef mPUSHn +# define mPUSHn(n) sv_setnv(PUSHmortal, (NV)(n)) +#endif + +#ifndef mPUSHi +# define mPUSHi(i) sv_setiv(PUSHmortal, (IV)(i)) +#endif + +#ifndef mPUSHu +# define mPUSHu(u) sv_setuv(PUSHmortal, (UV)(u)) +#endif +#ifndef mXPUSHs +# define mXPUSHs(s) XPUSHs(sv_2mortal(s)) +#endif + +#ifndef XPUSHmortal +# define XPUSHmortal XPUSHs(sv_newmortal()) +#endif + +#ifndef mXPUSHp +# define mXPUSHp(p,l) STMT_START { EXTEND(sp,1); sv_setpvn(PUSHmortal, (p), (l)); } STMT_END +#endif + +#ifndef mXPUSHn +# define mXPUSHn(n) STMT_START { EXTEND(sp,1); sv_setnv(PUSHmortal, (NV)(n)); } STMT_END +#endif + +#ifndef mXPUSHi +# define mXPUSHi(i) STMT_START { EXTEND(sp,1); sv_setiv(PUSHmortal, (IV)(i)); } STMT_END +#endif + +#ifndef mXPUSHu +# define mXPUSHu(u) STMT_START { EXTEND(sp,1); sv_setuv(PUSHmortal, (UV)(u)); } STMT_END +#endif + +/* Replace: 1 */ +#ifndef call_sv +# define call_sv perl_call_sv +#endif + +#ifndef call_pv +# define call_pv perl_call_pv +#endif + +#ifndef call_argv +# define call_argv perl_call_argv +#endif + +#ifndef call_method +# define call_method perl_call_method +#endif +#ifndef eval_sv +# define eval_sv perl_eval_sv +#endif + +/* Replace: 0 */ +#ifndef PERL_LOADMOD_DENY +# define PERL_LOADMOD_DENY 0x1 +#endif + +#ifndef PERL_LOADMOD_NOIMPORT +# define PERL_LOADMOD_NOIMPORT 0x2 +#endif + +#ifndef PERL_LOADMOD_IMPORT_OPS +# define PERL_LOADMOD_IMPORT_OPS 0x4 +#endif + +#ifndef G_METHOD +# define G_METHOD 64 +# ifdef call_sv +# undef call_sv +# endif +# if (PERL_BCDVERSION < 0x5006000) +# define call_sv(sv, flags) ((flags) & G_METHOD ? perl_call_method((char *) SvPV_nolen_const(sv), \ + (flags) & ~G_METHOD) : perl_call_sv(sv, flags)) +# else +# define call_sv(sv, flags) ((flags) & G_METHOD ? Perl_call_method(aTHX_ (char *) SvPV_nolen_const(sv), \ + (flags) & ~G_METHOD) : Perl_call_sv(aTHX_ sv, flags)) +# endif +#endif + +/* Replace perl_eval_pv with eval_pv */ + +#ifndef eval_pv +#if defined(NEED_eval_pv) +static SV* DPPP_(my_eval_pv)(char *p, I32 croak_on_error); +static +#else +extern SV* DPPP_(my_eval_pv)(char *p, I32 croak_on_error); +#endif + +#ifdef eval_pv +# undef eval_pv +#endif +#define eval_pv(a,b) DPPP_(my_eval_pv)(aTHX_ a,b) +#define Perl_eval_pv DPPP_(my_eval_pv) + +#if defined(NEED_eval_pv) || defined(NEED_eval_pv_GLOBAL) + +SV* +DPPP_(my_eval_pv)(char *p, I32 croak_on_error) +{ + dSP; + SV* sv = newSVpv(p, 0); + + PUSHMARK(sp); + eval_sv(sv, G_SCALAR); + SvREFCNT_dec(sv); + + SPAGAIN; + sv = POPs; + PUTBACK; + + if (croak_on_error && SvTRUE(GvSV(errgv))) + croak(SvPVx(GvSV(errgv), na)); + + return sv; +} + +#endif +#endif + +#ifndef vload_module +#if defined(NEED_vload_module) +static void DPPP_(my_vload_module)(U32 flags, SV *name, SV *ver, va_list *args); +static +#else +extern void DPPP_(my_vload_module)(U32 flags, SV *name, SV *ver, va_list *args); +#endif + +#ifdef vload_module +# undef vload_module +#endif +#define vload_module(a,b,c,d) DPPP_(my_vload_module)(aTHX_ a,b,c,d) +#define Perl_vload_module DPPP_(my_vload_module) + +#if defined(NEED_vload_module) || defined(NEED_vload_module_GLOBAL) + +void +DPPP_(my_vload_module)(U32 flags, SV *name, SV *ver, va_list *args) +{ + dTHR; + dVAR; + OP *veop, *imop; + + OP * const modname = newSVOP(OP_CONST, 0, name); + /* 5.005 has a somewhat hacky force_normal that doesn't croak on + SvREADONLY() if PL_compling is true. Current perls take care in + ck_require() to correctly turn off SvREADONLY before calling + force_normal_flags(). This seems a better fix than fudging PL_compling + */ + SvREADONLY_off(((SVOP*)modname)->op_sv); + modname->op_private |= OPpCONST_BARE; + if (ver) { + veop = newSVOP(OP_CONST, 0, ver); + } + else + veop = NULL; + if (flags & PERL_LOADMOD_NOIMPORT) { + imop = sawparens(newNULLLIST()); + } + else if (flags & PERL_LOADMOD_IMPORT_OPS) { + imop = va_arg(*args, OP*); + } + else { + SV *sv; + imop = NULL; + sv = va_arg(*args, SV*); + while (sv) { + imop = append_elem(OP_LIST, imop, newSVOP(OP_CONST, 0, sv)); + sv = va_arg(*args, SV*); + } + } + { + const line_t ocopline = PL_copline; + COP * const ocurcop = PL_curcop; + const int oexpect = PL_expect; + +#if (PERL_BCDVERSION >= 0x5004000) + utilize(!(flags & PERL_LOADMOD_DENY), start_subparse(FALSE, 0), + veop, modname, imop); +#elif (PERL_BCDVERSION > 0x5003000) + utilize(!(flags & PERL_LOADMOD_DENY), start_subparse(), + veop, modname, imop); +#else + utilize(!(flags & PERL_LOADMOD_DENY), start_subparse(), + modname, imop); +#endif + PL_expect = oexpect; + PL_copline = ocopline; + PL_curcop = ocurcop; + } +} + +#endif +#endif + +#ifndef load_module +#if defined(NEED_load_module) +static void DPPP_(my_load_module)(U32 flags, SV *name, SV *ver, ...); +static +#else +extern void DPPP_(my_load_module)(U32 flags, SV *name, SV *ver, ...); +#endif + +#ifdef load_module +# undef load_module +#endif +#define load_module DPPP_(my_load_module) +#define Perl_load_module DPPP_(my_load_module) + +#if defined(NEED_load_module) || defined(NEED_load_module_GLOBAL) + +void +DPPP_(my_load_module)(U32 flags, SV *name, SV *ver, ...) +{ + va_list args; + va_start(args, ver); + vload_module(flags, name, ver, &args); + va_end(args); +} + +#endif +#endif +#ifndef newRV_inc +# define newRV_inc(sv) newRV(sv) /* Replace */ +#endif + +#ifndef newRV_noinc +#if defined(NEED_newRV_noinc) +static SV * DPPP_(my_newRV_noinc)(SV *sv); +static +#else +extern SV * DPPP_(my_newRV_noinc)(SV *sv); +#endif + +#ifdef newRV_noinc +# undef newRV_noinc +#endif +#define newRV_noinc(a) DPPP_(my_newRV_noinc)(aTHX_ a) +#define Perl_newRV_noinc DPPP_(my_newRV_noinc) + +#if defined(NEED_newRV_noinc) || defined(NEED_newRV_noinc_GLOBAL) +SV * +DPPP_(my_newRV_noinc)(SV *sv) +{ + SV *rv = (SV *)newRV(sv); + SvREFCNT_dec(sv); + return rv; +} +#endif +#endif + +/* Hint: newCONSTSUB + * Returns a CV* as of perl-5.7.1. This return value is not supported + * by Devel::PPPort. + */ + +/* newCONSTSUB from IO.xs is in the core starting with 5.004_63 */ +#if (PERL_BCDVERSION < 0x5004063) && (PERL_BCDVERSION != 0x5004005) +#if defined(NEED_newCONSTSUB) +static void DPPP_(my_newCONSTSUB)(HV *stash, const char *name, SV *sv); +static +#else +extern void DPPP_(my_newCONSTSUB)(HV *stash, const char *name, SV *sv); +#endif + +#ifdef newCONSTSUB +# undef newCONSTSUB +#endif +#define newCONSTSUB(a,b,c) DPPP_(my_newCONSTSUB)(aTHX_ a,b,c) +#define Perl_newCONSTSUB DPPP_(my_newCONSTSUB) + +#if defined(NEED_newCONSTSUB) || defined(NEED_newCONSTSUB_GLOBAL) + +/* This is just a trick to avoid a dependency of newCONSTSUB on PL_parser */ +/* (There's no PL_parser in perl < 5.005, so this is completely safe) */ +#define D_PPP_PL_copline PL_copline + +void +DPPP_(my_newCONSTSUB)(HV *stash, const char *name, SV *sv) +{ + U32 oldhints = PL_hints; + HV *old_cop_stash = PL_curcop->cop_stash; + HV *old_curstash = PL_curstash; + line_t oldline = PL_curcop->cop_line; + PL_curcop->cop_line = D_PPP_PL_copline; + + PL_hints &= ~HINT_BLOCK_SCOPE; + if (stash) + PL_curstash = PL_curcop->cop_stash = stash; + + newSUB( + +#if (PERL_BCDVERSION < 0x5003022) + start_subparse(), +#elif (PERL_BCDVERSION == 0x5003022) + start_subparse(0), +#else /* 5.003_23 onwards */ + start_subparse(FALSE, 0), +#endif + + newSVOP(OP_CONST, 0, newSVpv((char *) name, 0)), + newSVOP(OP_CONST, 0, &PL_sv_no), /* SvPV(&PL_sv_no) == "" -- GMB */ + newSTATEOP(0, Nullch, newSVOP(OP_CONST, 0, sv)) + ); + + PL_hints = oldhints; + PL_curcop->cop_stash = old_cop_stash; + PL_curstash = old_curstash; + PL_curcop->cop_line = oldline; +} +#endif +#endif + +/* + * Boilerplate macros for initializing and accessing interpreter-local + * data from C. All statics in extensions should be reworked to use + * this, if you want to make the extension thread-safe. See ext/re/re.xs + * for an example of the use of these macros. + * + * Code that uses these macros is responsible for the following: + * 1. #define MY_CXT_KEY to a unique string, e.g. "DynaLoader_guts" + * 2. Declare a typedef named my_cxt_t that is a structure that contains + * all the data that needs to be interpreter-local. + * 3. Use the START_MY_CXT macro after the declaration of my_cxt_t. + * 4. Use the MY_CXT_INIT macro such that it is called exactly once + * (typically put in the BOOT: section). + * 5. Use the members of the my_cxt_t structure everywhere as + * MY_CXT.member. + * 6. Use the dMY_CXT macro (a declaration) in all the functions that + * access MY_CXT. + */ + +#if defined(MULTIPLICITY) || defined(PERL_OBJECT) || \ + defined(PERL_CAPI) || defined(PERL_IMPLICIT_CONTEXT) + +#ifndef START_MY_CXT + +/* This must appear in all extensions that define a my_cxt_t structure, + * right after the definition (i.e. at file scope). The non-threads + * case below uses it to declare the data as static. */ +#define START_MY_CXT + +#if (PERL_BCDVERSION < 0x5004068) +/* Fetches the SV that keeps the per-interpreter data. */ +#define dMY_CXT_SV \ + SV *my_cxt_sv = get_sv(MY_CXT_KEY, FALSE) +#else /* >= perl5.004_68 */ +#define dMY_CXT_SV \ + SV *my_cxt_sv = *hv_fetch(PL_modglobal, MY_CXT_KEY, \ + sizeof(MY_CXT_KEY)-1, TRUE) +#endif /* < perl5.004_68 */ + +/* This declaration should be used within all functions that use the + * interpreter-local data. */ +#define dMY_CXT \ + dMY_CXT_SV; \ + my_cxt_t *my_cxtp = INT2PTR(my_cxt_t*,SvUV(my_cxt_sv)) + +/* Creates and zeroes the per-interpreter data. + * (We allocate my_cxtp in a Perl SV so that it will be released when + * the interpreter goes away.) */ +#define MY_CXT_INIT \ + dMY_CXT_SV; \ + /* newSV() allocates one more than needed */ \ + my_cxt_t *my_cxtp = (my_cxt_t*)SvPVX(newSV(sizeof(my_cxt_t)-1));\ + Zero(my_cxtp, 1, my_cxt_t); \ + sv_setuv(my_cxt_sv, PTR2UV(my_cxtp)) + +/* This macro must be used to access members of the my_cxt_t structure. + * e.g. MYCXT.some_data */ +#define MY_CXT (*my_cxtp) + +/* Judicious use of these macros can reduce the number of times dMY_CXT + * is used. Use is similar to pTHX, aTHX etc. */ +#define pMY_CXT my_cxt_t *my_cxtp +#define pMY_CXT_ pMY_CXT, +#define _pMY_CXT ,pMY_CXT +#define aMY_CXT my_cxtp +#define aMY_CXT_ aMY_CXT, +#define _aMY_CXT ,aMY_CXT + +#endif /* START_MY_CXT */ + +#ifndef MY_CXT_CLONE +/* Clones the per-interpreter data. */ +#define MY_CXT_CLONE \ + dMY_CXT_SV; \ + my_cxt_t *my_cxtp = (my_cxt_t*)SvPVX(newSV(sizeof(my_cxt_t)-1));\ + Copy(INT2PTR(my_cxt_t*, SvUV(my_cxt_sv)), my_cxtp, 1, my_cxt_t);\ + sv_setuv(my_cxt_sv, PTR2UV(my_cxtp)) +#endif + +#else /* single interpreter */ + +#ifndef START_MY_CXT + +#define START_MY_CXT static my_cxt_t my_cxt; +#define dMY_CXT_SV dNOOP +#define dMY_CXT dNOOP +#define MY_CXT_INIT NOOP +#define MY_CXT my_cxt + +#define pMY_CXT void +#define pMY_CXT_ +#define _pMY_CXT +#define aMY_CXT +#define aMY_CXT_ +#define _aMY_CXT + +#endif /* START_MY_CXT */ + +#ifndef MY_CXT_CLONE +#define MY_CXT_CLONE NOOP +#endif + +#endif + +#ifndef IVdf +# if IVSIZE == LONGSIZE +# define IVdf "ld" +# define UVuf "lu" +# define UVof "lo" +# define UVxf "lx" +# define UVXf "lX" +# elif IVSIZE == INTSIZE +# define IVdf "d" +# define UVuf "u" +# define UVof "o" +# define UVxf "x" +# define UVXf "X" +# else +# error "cannot define IV/UV formats" +# endif +#endif + +#ifndef NVef +# if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE) && \ + defined(PERL_PRIfldbl) && (PERL_BCDVERSION != 0x5006000) + /* Not very likely, but let's try anyway. */ +# define NVef PERL_PRIeldbl +# define NVff PERL_PRIfldbl +# define NVgf PERL_PRIgldbl +# else +# define NVef "e" +# define NVff "f" +# define NVgf "g" +# endif +#endif + +#ifndef SvREFCNT_inc +# ifdef PERL_USE_GCC_BRACE_GROUPS +# define SvREFCNT_inc(sv) \ + ({ \ + SV * const _sv = (SV*)(sv); \ + if (_sv) \ + (SvREFCNT(_sv))++; \ + _sv; \ + }) +# else +# define SvREFCNT_inc(sv) \ + ((PL_Sv=(SV*)(sv)) ? (++(SvREFCNT(PL_Sv)),PL_Sv) : NULL) +# endif +#endif + +#ifndef SvREFCNT_inc_simple +# ifdef PERL_USE_GCC_BRACE_GROUPS +# define SvREFCNT_inc_simple(sv) \ + ({ \ + if (sv) \ + (SvREFCNT(sv))++; \ + (SV *)(sv); \ + }) +# else +# define SvREFCNT_inc_simple(sv) \ + ((sv) ? (SvREFCNT(sv)++,(SV*)(sv)) : NULL) +# endif +#endif + +#ifndef SvREFCNT_inc_NN +# ifdef PERL_USE_GCC_BRACE_GROUPS +# define SvREFCNT_inc_NN(sv) \ + ({ \ + SV * const _sv = (SV*)(sv); \ + SvREFCNT(_sv)++; \ + _sv; \ + }) +# else +# define SvREFCNT_inc_NN(sv) \ + (PL_Sv=(SV*)(sv),++(SvREFCNT(PL_Sv)),PL_Sv) +# endif +#endif + +#ifndef SvREFCNT_inc_void +# ifdef PERL_USE_GCC_BRACE_GROUPS +# define SvREFCNT_inc_void(sv) \ + ({ \ + SV * const _sv = (SV*)(sv); \ + if (_sv) \ + (void)(SvREFCNT(_sv)++); \ + }) +# else +# define SvREFCNT_inc_void(sv) \ + (void)((PL_Sv=(SV*)(sv)) ? ++(SvREFCNT(PL_Sv)) : 0) +# endif +#endif +#ifndef SvREFCNT_inc_simple_void +# define SvREFCNT_inc_simple_void(sv) STMT_START { if (sv) SvREFCNT(sv)++; } STMT_END +#endif + +#ifndef SvREFCNT_inc_simple_NN +# define SvREFCNT_inc_simple_NN(sv) (++SvREFCNT(sv), (SV*)(sv)) +#endif + +#ifndef SvREFCNT_inc_void_NN +# define SvREFCNT_inc_void_NN(sv) (void)(++SvREFCNT((SV*)(sv))) +#endif + +#ifndef SvREFCNT_inc_simple_void_NN +# define SvREFCNT_inc_simple_void_NN(sv) (void)(++SvREFCNT((SV*)(sv))) +#endif + +#ifndef newSV_type + +#if defined(NEED_newSV_type) +static SV* DPPP_(my_newSV_type)(pTHX_ svtype const t); +static +#else +extern SV* DPPP_(my_newSV_type)(pTHX_ svtype const t); +#endif + +#ifdef newSV_type +# undef newSV_type +#endif +#define newSV_type(a) DPPP_(my_newSV_type)(aTHX_ a) +#define Perl_newSV_type DPPP_(my_newSV_type) + +#if defined(NEED_newSV_type) || defined(NEED_newSV_type_GLOBAL) + +SV* +DPPP_(my_newSV_type)(pTHX_ svtype const t) +{ + SV* const sv = newSV(0); + sv_upgrade(sv, t); + return sv; +} + +#endif + +#endif + +#if (PERL_BCDVERSION < 0x5006000) +# define D_PPP_CONSTPV_ARG(x) ((char *) (x)) +#else +# define D_PPP_CONSTPV_ARG(x) (x) +#endif +#ifndef newSVpvn +# define newSVpvn(data,len) ((data) \ + ? ((len) ? newSVpv((data), (len)) : newSVpv("", 0)) \ + : newSV(0)) +#endif +#ifndef newSVpvn_utf8 +# define newSVpvn_utf8(s, len, u) newSVpvn_flags((s), (len), (u) ? SVf_UTF8 : 0) +#endif +#ifndef SVf_UTF8 +# define SVf_UTF8 0 +#endif + +#ifndef newSVpvn_flags + +#if defined(NEED_newSVpvn_flags) +static SV * DPPP_(my_newSVpvn_flags)(pTHX_ const char *s, STRLEN len, U32 flags); +static +#else +extern SV * DPPP_(my_newSVpvn_flags)(pTHX_ const char *s, STRLEN len, U32 flags); +#endif + +#ifdef newSVpvn_flags +# undef newSVpvn_flags +#endif +#define newSVpvn_flags(a,b,c) DPPP_(my_newSVpvn_flags)(aTHX_ a,b,c) +#define Perl_newSVpvn_flags DPPP_(my_newSVpvn_flags) + +#if defined(NEED_newSVpvn_flags) || defined(NEED_newSVpvn_flags_GLOBAL) + +SV * +DPPP_(my_newSVpvn_flags)(pTHX_ const char *s, STRLEN len, U32 flags) +{ + SV *sv = newSVpvn(D_PPP_CONSTPV_ARG(s), len); + SvFLAGS(sv) |= (flags & SVf_UTF8); + return (flags & SVs_TEMP) ? sv_2mortal(sv) : sv; +} + +#endif + +#endif + +/* Backwards compatibility stuff... :-( */ +#if !defined(NEED_sv_2pv_flags) && defined(NEED_sv_2pv_nolen) +# define NEED_sv_2pv_flags +#endif +#if !defined(NEED_sv_2pv_flags_GLOBAL) && defined(NEED_sv_2pv_nolen_GLOBAL) +# define NEED_sv_2pv_flags_GLOBAL +#endif + +/* Hint: sv_2pv_nolen + * Use the SvPV_nolen() or SvPV_nolen_const() macros instead of sv_2pv_nolen(). + */ +#ifndef sv_2pv_nolen +# define sv_2pv_nolen(sv) SvPV_nolen(sv) +#endif + +#ifdef SvPVbyte + +/* Hint: SvPVbyte + * Does not work in perl-5.6.1, ppport.h implements a version + * borrowed from perl-5.7.3. + */ + +#if (PERL_BCDVERSION < 0x5007000) + +#if defined(NEED_sv_2pvbyte) +static char * DPPP_(my_sv_2pvbyte)(pTHX_ SV *sv, STRLEN *lp); +static +#else +extern char * DPPP_(my_sv_2pvbyte)(pTHX_ SV *sv, STRLEN *lp); +#endif + +#ifdef sv_2pvbyte +# undef sv_2pvbyte +#endif +#define sv_2pvbyte(a,b) DPPP_(my_sv_2pvbyte)(aTHX_ a,b) +#define Perl_sv_2pvbyte DPPP_(my_sv_2pvbyte) + +#if defined(NEED_sv_2pvbyte) || defined(NEED_sv_2pvbyte_GLOBAL) + +char * +DPPP_(my_sv_2pvbyte)(pTHX_ SV *sv, STRLEN *lp) +{ + sv_utf8_downgrade(sv,0); + return SvPV(sv,*lp); +} + +#endif + +/* Hint: sv_2pvbyte + * Use the SvPVbyte() macro instead of sv_2pvbyte(). + */ + +#undef SvPVbyte + +#define SvPVbyte(sv, lp) \ + ((SvFLAGS(sv) & (SVf_POK|SVf_UTF8)) == (SVf_POK) \ + ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_2pvbyte(sv, &lp)) + +#endif + +#else + +# define SvPVbyte SvPV +# define sv_2pvbyte sv_2pv + +#endif +#ifndef sv_2pvbyte_nolen +# define sv_2pvbyte_nolen(sv) sv_2pv_nolen(sv) +#endif + +/* Hint: sv_pvn + * Always use the SvPV() macro instead of sv_pvn(). + */ + +/* Hint: sv_pvn_force + * Always use the SvPV_force() macro instead of sv_pvn_force(). + */ + +/* If these are undefined, they're not handled by the core anyway */ +#ifndef SV_IMMEDIATE_UNREF +# define SV_IMMEDIATE_UNREF 0 +#endif + +#ifndef SV_GMAGIC +# define SV_GMAGIC 0 +#endif + +#ifndef SV_COW_DROP_PV +# define SV_COW_DROP_PV 0 +#endif + +#ifndef SV_UTF8_NO_ENCODING +# define SV_UTF8_NO_ENCODING 0 +#endif + +#ifndef SV_NOSTEAL +# define SV_NOSTEAL 0 +#endif + +#ifndef SV_CONST_RETURN +# define SV_CONST_RETURN 0 +#endif + +#ifndef SV_MUTABLE_RETURN +# define SV_MUTABLE_RETURN 0 +#endif + +#ifndef SV_SMAGIC +# define SV_SMAGIC 0 +#endif + +#ifndef SV_HAS_TRAILING_NUL +# define SV_HAS_TRAILING_NUL 0 +#endif + +#ifndef SV_COW_SHARED_HASH_KEYS +# define SV_COW_SHARED_HASH_KEYS 0 +#endif + +#if (PERL_BCDVERSION < 0x5007002) + +#if defined(NEED_sv_2pv_flags) +static char * DPPP_(my_sv_2pv_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags); +static +#else +extern char * DPPP_(my_sv_2pv_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags); +#endif + +#ifdef sv_2pv_flags +# undef sv_2pv_flags +#endif +#define sv_2pv_flags(a,b,c) DPPP_(my_sv_2pv_flags)(aTHX_ a,b,c) +#define Perl_sv_2pv_flags DPPP_(my_sv_2pv_flags) + +#if defined(NEED_sv_2pv_flags) || defined(NEED_sv_2pv_flags_GLOBAL) + +char * +DPPP_(my_sv_2pv_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags) +{ + STRLEN n_a = (STRLEN) flags; + return sv_2pv(sv, lp ? lp : &n_a); +} + +#endif + +#if defined(NEED_sv_pvn_force_flags) +static char * DPPP_(my_sv_pvn_force_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags); +static +#else +extern char * DPPP_(my_sv_pvn_force_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags); +#endif + +#ifdef sv_pvn_force_flags +# undef sv_pvn_force_flags +#endif +#define sv_pvn_force_flags(a,b,c) DPPP_(my_sv_pvn_force_flags)(aTHX_ a,b,c) +#define Perl_sv_pvn_force_flags DPPP_(my_sv_pvn_force_flags) + +#if defined(NEED_sv_pvn_force_flags) || defined(NEED_sv_pvn_force_flags_GLOBAL) + +char * +DPPP_(my_sv_pvn_force_flags)(pTHX_ SV *sv, STRLEN *lp, I32 flags) +{ + STRLEN n_a = (STRLEN) flags; + return sv_pvn_force(sv, lp ? lp : &n_a); +} + +#endif + +#endif + +#if (PERL_BCDVERSION < 0x5008008) || ( (PERL_BCDVERSION >= 0x5009000) && (PERL_BCDVERSION < 0x5009003) ) +# define DPPP_SVPV_NOLEN_LP_ARG &PL_na +#else +# define DPPP_SVPV_NOLEN_LP_ARG 0 +#endif +#ifndef SvPV_const +# define SvPV_const(sv, lp) SvPV_flags_const(sv, lp, SV_GMAGIC) +#endif + +#ifndef SvPV_mutable +# define SvPV_mutable(sv, lp) SvPV_flags_mutable(sv, lp, SV_GMAGIC) +#endif +#ifndef SvPV_flags +# define SvPV_flags(sv, lp, flags) \ + ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \ + ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_2pv_flags(sv, &lp, flags)) +#endif +#ifndef SvPV_flags_const +# define SvPV_flags_const(sv, lp, flags) \ + ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \ + ? ((lp = SvCUR(sv)), SvPVX_const(sv)) : \ + (const char*) sv_2pv_flags(sv, &lp, flags|SV_CONST_RETURN)) +#endif +#ifndef SvPV_flags_const_nolen +# define SvPV_flags_const_nolen(sv, flags) \ + ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \ + ? SvPVX_const(sv) : \ + (const char*) sv_2pv_flags(sv, DPPP_SVPV_NOLEN_LP_ARG, flags|SV_CONST_RETURN)) +#endif +#ifndef SvPV_flags_mutable +# define SvPV_flags_mutable(sv, lp, flags) \ + ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \ + ? ((lp = SvCUR(sv)), SvPVX_mutable(sv)) : \ + sv_2pv_flags(sv, &lp, flags|SV_MUTABLE_RETURN)) +#endif +#ifndef SvPV_force +# define SvPV_force(sv, lp) SvPV_force_flags(sv, lp, SV_GMAGIC) +#endif + +#ifndef SvPV_force_nolen +# define SvPV_force_nolen(sv) SvPV_force_flags_nolen(sv, SV_GMAGIC) +#endif + +#ifndef SvPV_force_mutable +# define SvPV_force_mutable(sv, lp) SvPV_force_flags_mutable(sv, lp, SV_GMAGIC) +#endif + +#ifndef SvPV_force_nomg +# define SvPV_force_nomg(sv, lp) SvPV_force_flags(sv, lp, 0) +#endif + +#ifndef SvPV_force_nomg_nolen +# define SvPV_force_nomg_nolen(sv) SvPV_force_flags_nolen(sv, 0) +#endif +#ifndef SvPV_force_flags +# define SvPV_force_flags(sv, lp, flags) \ + ((SvFLAGS(sv) & (SVf_POK|SVf_THINKFIRST)) == SVf_POK \ + ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_pvn_force_flags(sv, &lp, flags)) +#endif +#ifndef SvPV_force_flags_nolen +# define SvPV_force_flags_nolen(sv, flags) \ + ((SvFLAGS(sv) & (SVf_POK|SVf_THINKFIRST)) == SVf_POK \ + ? SvPVX(sv) : sv_pvn_force_flags(sv, DPPP_SVPV_NOLEN_LP_ARG, flags)) +#endif +#ifndef SvPV_force_flags_mutable +# define SvPV_force_flags_mutable(sv, lp, flags) \ + ((SvFLAGS(sv) & (SVf_POK|SVf_THINKFIRST)) == SVf_POK \ + ? ((lp = SvCUR(sv)), SvPVX_mutable(sv)) \ + : sv_pvn_force_flags(sv, &lp, flags|SV_MUTABLE_RETURN)) +#endif +#ifndef SvPV_nolen +# define SvPV_nolen(sv) \ + ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \ + ? SvPVX(sv) : sv_2pv_flags(sv, DPPP_SVPV_NOLEN_LP_ARG, SV_GMAGIC)) +#endif +#ifndef SvPV_nolen_const +# define SvPV_nolen_const(sv) \ + ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \ + ? SvPVX_const(sv) : sv_2pv_flags(sv, DPPP_SVPV_NOLEN_LP_ARG, SV_GMAGIC|SV_CONST_RETURN)) +#endif +#ifndef SvPV_nomg +# define SvPV_nomg(sv, lp) SvPV_flags(sv, lp, 0) +#endif + +#ifndef SvPV_nomg_const +# define SvPV_nomg_const(sv, lp) SvPV_flags_const(sv, lp, 0) +#endif + +#ifndef SvPV_nomg_const_nolen +# define SvPV_nomg_const_nolen(sv) SvPV_flags_const_nolen(sv, 0) +#endif + +#ifndef SvPV_nomg_nolen +# define SvPV_nomg_nolen(sv) ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \ + ? SvPVX(sv) : sv_2pv_flags(sv, DPPP_SVPV_NOLEN_LP_ARG, 0)) +#endif +#ifndef SvPV_renew +# define SvPV_renew(sv,n) STMT_START { SvLEN_set(sv, n); \ + SvPV_set((sv), (char *) saferealloc( \ + (Malloc_t)SvPVX(sv), (MEM_SIZE)((n)))); \ + } STMT_END +#endif +#ifndef SvMAGIC_set +# define SvMAGIC_set(sv, val) \ + STMT_START { assert(SvTYPE(sv) >= SVt_PVMG); \ + (((XPVMG*) SvANY(sv))->xmg_magic = (val)); } STMT_END +#endif + +#if (PERL_BCDVERSION < 0x5009003) +#ifndef SvPVX_const +# define SvPVX_const(sv) ((const char*) (0 + SvPVX(sv))) +#endif + +#ifndef SvPVX_mutable +# define SvPVX_mutable(sv) (0 + SvPVX(sv)) +#endif +#ifndef SvRV_set +# define SvRV_set(sv, val) \ + STMT_START { assert(SvTYPE(sv) >= SVt_RV); \ + (((XRV*) SvANY(sv))->xrv_rv = (val)); } STMT_END +#endif + +#else +#ifndef SvPVX_const +# define SvPVX_const(sv) ((const char*)((sv)->sv_u.svu_pv)) +#endif + +#ifndef SvPVX_mutable +# define SvPVX_mutable(sv) ((sv)->sv_u.svu_pv) +#endif +#ifndef SvRV_set +# define SvRV_set(sv, val) \ + STMT_START { assert(SvTYPE(sv) >= SVt_RV); \ + ((sv)->sv_u.svu_rv = (val)); } STMT_END +#endif + +#endif +#ifndef SvSTASH_set +# define SvSTASH_set(sv, val) \ + STMT_START { assert(SvTYPE(sv) >= SVt_PVMG); \ + (((XPVMG*) SvANY(sv))->xmg_stash = (val)); } STMT_END +#endif + +#if (PERL_BCDVERSION < 0x5004000) +#ifndef SvUV_set +# define SvUV_set(sv, val) \ + STMT_START { assert(SvTYPE(sv) == SVt_IV || SvTYPE(sv) >= SVt_PVIV); \ + (((XPVIV*) SvANY(sv))->xiv_iv = (IV) (val)); } STMT_END +#endif + +#else +#ifndef SvUV_set +# define SvUV_set(sv, val) \ + STMT_START { assert(SvTYPE(sv) == SVt_IV || SvTYPE(sv) >= SVt_PVIV); \ + (((XPVUV*) SvANY(sv))->xuv_uv = (val)); } STMT_END +#endif + +#endif + +#if (PERL_BCDVERSION >= 0x5004000) && !defined(vnewSVpvf) +#if defined(NEED_vnewSVpvf) +static SV * DPPP_(my_vnewSVpvf)(pTHX_ const char *pat, va_list *args); +static +#else +extern SV * DPPP_(my_vnewSVpvf)(pTHX_ const char *pat, va_list *args); +#endif + +#ifdef vnewSVpvf +# undef vnewSVpvf +#endif +#define vnewSVpvf(a,b) DPPP_(my_vnewSVpvf)(aTHX_ a,b) +#define Perl_vnewSVpvf DPPP_(my_vnewSVpvf) + +#if defined(NEED_vnewSVpvf) || defined(NEED_vnewSVpvf_GLOBAL) + +SV * +DPPP_(my_vnewSVpvf)(pTHX_ const char *pat, va_list *args) +{ + register SV *sv = newSV(0); + sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*)); + return sv; +} + +#endif +#endif + +#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_vcatpvf) +# define sv_vcatpvf(sv, pat, args) sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*)) +#endif + +#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_vsetpvf) +# define sv_vsetpvf(sv, pat, args) sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*)) +#endif + +#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_catpvf_mg) +#if defined(NEED_sv_catpvf_mg) +static void DPPP_(my_sv_catpvf_mg)(pTHX_ SV *sv, const char *pat, ...); +static +#else +extern void DPPP_(my_sv_catpvf_mg)(pTHX_ SV *sv, const char *pat, ...); +#endif + +#define Perl_sv_catpvf_mg DPPP_(my_sv_catpvf_mg) + +#if defined(NEED_sv_catpvf_mg) || defined(NEED_sv_catpvf_mg_GLOBAL) + +void +DPPP_(my_sv_catpvf_mg)(pTHX_ SV *sv, const char *pat, ...) +{ + va_list args; + va_start(args, pat); + sv_vcatpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*)); + SvSETMAGIC(sv); + va_end(args); +} + +#endif +#endif + +#ifdef PERL_IMPLICIT_CONTEXT +#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_catpvf_mg_nocontext) +#if defined(NEED_sv_catpvf_mg_nocontext) +static void DPPP_(my_sv_catpvf_mg_nocontext)(SV *sv, const char *pat, ...); +static +#else +extern void DPPP_(my_sv_catpvf_mg_nocontext)(SV *sv, const char *pat, ...); +#endif + +#define sv_catpvf_mg_nocontext DPPP_(my_sv_catpvf_mg_nocontext) +#define Perl_sv_catpvf_mg_nocontext DPPP_(my_sv_catpvf_mg_nocontext) + +#if defined(NEED_sv_catpvf_mg_nocontext) || defined(NEED_sv_catpvf_mg_nocontext_GLOBAL) + +void +DPPP_(my_sv_catpvf_mg_nocontext)(SV *sv, const char *pat, ...) +{ + dTHX; + va_list args; + va_start(args, pat); + sv_vcatpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*)); + SvSETMAGIC(sv); + va_end(args); +} + +#endif +#endif +#endif + +/* sv_catpvf_mg depends on sv_catpvf_mg_nocontext */ +#ifndef sv_catpvf_mg +# ifdef PERL_IMPLICIT_CONTEXT +# define sv_catpvf_mg Perl_sv_catpvf_mg_nocontext +# else +# define sv_catpvf_mg Perl_sv_catpvf_mg +# endif +#endif + +#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_vcatpvf_mg) +# define sv_vcatpvf_mg(sv, pat, args) \ + STMT_START { \ + sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*)); \ + SvSETMAGIC(sv); \ + } STMT_END +#endif + +#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_setpvf_mg) +#if defined(NEED_sv_setpvf_mg) +static void DPPP_(my_sv_setpvf_mg)(pTHX_ SV *sv, const char *pat, ...); +static +#else +extern void DPPP_(my_sv_setpvf_mg)(pTHX_ SV *sv, const char *pat, ...); +#endif + +#define Perl_sv_setpvf_mg DPPP_(my_sv_setpvf_mg) + +#if defined(NEED_sv_setpvf_mg) || defined(NEED_sv_setpvf_mg_GLOBAL) + +void +DPPP_(my_sv_setpvf_mg)(pTHX_ SV *sv, const char *pat, ...) +{ + va_list args; + va_start(args, pat); + sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*)); + SvSETMAGIC(sv); + va_end(args); +} + +#endif +#endif + +#ifdef PERL_IMPLICIT_CONTEXT +#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_setpvf_mg_nocontext) +#if defined(NEED_sv_setpvf_mg_nocontext) +static void DPPP_(my_sv_setpvf_mg_nocontext)(SV *sv, const char *pat, ...); +static +#else +extern void DPPP_(my_sv_setpvf_mg_nocontext)(SV *sv, const char *pat, ...); +#endif + +#define sv_setpvf_mg_nocontext DPPP_(my_sv_setpvf_mg_nocontext) +#define Perl_sv_setpvf_mg_nocontext DPPP_(my_sv_setpvf_mg_nocontext) + +#if defined(NEED_sv_setpvf_mg_nocontext) || defined(NEED_sv_setpvf_mg_nocontext_GLOBAL) + +void +DPPP_(my_sv_setpvf_mg_nocontext)(SV *sv, const char *pat, ...) +{ + dTHX; + va_list args; + va_start(args, pat); + sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*)); + SvSETMAGIC(sv); + va_end(args); +} + +#endif +#endif +#endif + +/* sv_setpvf_mg depends on sv_setpvf_mg_nocontext */ +#ifndef sv_setpvf_mg +# ifdef PERL_IMPLICIT_CONTEXT +# define sv_setpvf_mg Perl_sv_setpvf_mg_nocontext +# else +# define sv_setpvf_mg Perl_sv_setpvf_mg +# endif +#endif + +#if (PERL_BCDVERSION >= 0x5004000) && !defined(sv_vsetpvf_mg) +# define sv_vsetpvf_mg(sv, pat, args) \ + STMT_START { \ + sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*)); \ + SvSETMAGIC(sv); \ + } STMT_END +#endif + +/* Hint: newSVpvn_share + * The SVs created by this function only mimic the behaviour of + * shared PVs without really being shared. Only use if you know + * what you're doing. + */ + +#ifndef newSVpvn_share + +#if defined(NEED_newSVpvn_share) +static SV * DPPP_(my_newSVpvn_share)(pTHX_ const char *src, I32 len, U32 hash); +static +#else +extern SV * DPPP_(my_newSVpvn_share)(pTHX_ const char *src, I32 len, U32 hash); +#endif + +#ifdef newSVpvn_share +# undef newSVpvn_share +#endif +#define newSVpvn_share(a,b,c) DPPP_(my_newSVpvn_share)(aTHX_ a,b,c) +#define Perl_newSVpvn_share DPPP_(my_newSVpvn_share) + +#if defined(NEED_newSVpvn_share) || defined(NEED_newSVpvn_share_GLOBAL) + +SV * +DPPP_(my_newSVpvn_share)(pTHX_ const char *src, I32 len, U32 hash) +{ + SV *sv; + if (len < 0) + len = -len; + if (!hash) + PERL_HASH(hash, (char*) src, len); + sv = newSVpvn((char *) src, len); + sv_upgrade(sv, SVt_PVIV); + SvIVX(sv) = hash; + SvREADONLY_on(sv); + SvPOK_on(sv); + return sv; +} + +#endif + +#endif +#ifndef SvSHARED_HASH +# define SvSHARED_HASH(sv) (0 + SvUVX(sv)) +#endif +#ifndef HvNAME_get +# define HvNAME_get(hv) HvNAME(hv) +#endif +#ifndef HvNAMELEN_get +# define HvNAMELEN_get(hv) (HvNAME_get(hv) ? (I32)strlen(HvNAME_get(hv)) : 0) +#endif +#ifndef GvSVn +# define GvSVn(gv) GvSV(gv) +#endif + +#ifndef isGV_with_GP +# define isGV_with_GP(gv) isGV(gv) +#endif + +#ifndef gv_fetchpvn_flags +# define gv_fetchpvn_flags(name, len, flags, svt) gv_fetchpv(name, flags, svt) +#endif + +#ifndef gv_fetchsv +# define gv_fetchsv(name, flags, svt) gv_fetchpv(SvPV_nolen_const(name), flags, svt) +#endif +#ifndef get_cvn_flags +# define get_cvn_flags(name, namelen, flags) get_cv(name, flags) +#endif +#ifndef WARN_ALL +# define WARN_ALL 0 +#endif + +#ifndef WARN_CLOSURE +# define WARN_CLOSURE 1 +#endif + +#ifndef WARN_DEPRECATED +# define WARN_DEPRECATED 2 +#endif + +#ifndef WARN_EXITING +# define WARN_EXITING 3 +#endif + +#ifndef WARN_GLOB +# define WARN_GLOB 4 +#endif + +#ifndef WARN_IO +# define WARN_IO 5 +#endif + +#ifndef WARN_CLOSED +# define WARN_CLOSED 6 +#endif + +#ifndef WARN_EXEC +# define WARN_EXEC 7 +#endif + +#ifndef WARN_LAYER +# define WARN_LAYER 8 +#endif + +#ifndef WARN_NEWLINE +# define WARN_NEWLINE 9 +#endif + +#ifndef WARN_PIPE +# define WARN_PIPE 10 +#endif + +#ifndef WARN_UNOPENED +# define WARN_UNOPENED 11 +#endif + +#ifndef WARN_MISC +# define WARN_MISC 12 +#endif + +#ifndef WARN_NUMERIC +# define WARN_NUMERIC 13 +#endif + +#ifndef WARN_ONCE +# define WARN_ONCE 14 +#endif + +#ifndef WARN_OVERFLOW +# define WARN_OVERFLOW 15 +#endif + +#ifndef WARN_PACK +# define WARN_PACK 16 +#endif + +#ifndef WARN_PORTABLE +# define WARN_PORTABLE 17 +#endif + +#ifndef WARN_RECURSION +# define WARN_RECURSION 18 +#endif + +#ifndef WARN_REDEFINE +# define WARN_REDEFINE 19 +#endif + +#ifndef WARN_REGEXP +# define WARN_REGEXP 20 +#endif + +#ifndef WARN_SEVERE +# define WARN_SEVERE 21 +#endif + +#ifndef WARN_DEBUGGING +# define WARN_DEBUGGING 22 +#endif + +#ifndef WARN_INPLACE +# define WARN_INPLACE 23 +#endif + +#ifndef WARN_INTERNAL +# define WARN_INTERNAL 24 +#endif + +#ifndef WARN_MALLOC +# define WARN_MALLOC 25 +#endif + +#ifndef WARN_SIGNAL +# define WARN_SIGNAL 26 +#endif + +#ifndef WARN_SUBSTR +# define WARN_SUBSTR 27 +#endif + +#ifndef WARN_SYNTAX +# define WARN_SYNTAX 28 +#endif + +#ifndef WARN_AMBIGUOUS +# define WARN_AMBIGUOUS 29 +#endif + +#ifndef WARN_BAREWORD +# define WARN_BAREWORD 30 +#endif + +#ifndef WARN_DIGIT +# define WARN_DIGIT 31 +#endif + +#ifndef WARN_PARENTHESIS +# define WARN_PARENTHESIS 32 +#endif + +#ifndef WARN_PRECEDENCE +# define WARN_PRECEDENCE 33 +#endif + +#ifndef WARN_PRINTF +# define WARN_PRINTF 34 +#endif + +#ifndef WARN_PROTOTYPE +# define WARN_PROTOTYPE 35 +#endif + +#ifndef WARN_QW +# define WARN_QW 36 +#endif + +#ifndef WARN_RESERVED +# define WARN_RESERVED 37 +#endif + +#ifndef WARN_SEMICOLON +# define WARN_SEMICOLON 38 +#endif + +#ifndef WARN_TAINT +# define WARN_TAINT 39 +#endif + +#ifndef WARN_THREADS +# define WARN_THREADS 40 +#endif + +#ifndef WARN_UNINITIALIZED +# define WARN_UNINITIALIZED 41 +#endif + +#ifndef WARN_UNPACK +# define WARN_UNPACK 42 +#endif + +#ifndef WARN_UNTIE +# define WARN_UNTIE 43 +#endif + +#ifndef WARN_UTF8 +# define WARN_UTF8 44 +#endif + +#ifndef WARN_VOID +# define WARN_VOID 45 +#endif + +#ifndef WARN_ASSERTIONS +# define WARN_ASSERTIONS 46 +#endif +#ifndef packWARN +# define packWARN(a) (a) +#endif + +#ifndef ckWARN +# ifdef G_WARN_ON +# define ckWARN(a) (PL_dowarn & G_WARN_ON) +# else +# define ckWARN(a) PL_dowarn +# endif +#endif + +#if (PERL_BCDVERSION >= 0x5004000) && !defined(warner) +#if defined(NEED_warner) +static void DPPP_(my_warner)(U32 err, const char *pat, ...); +static +#else +extern void DPPP_(my_warner)(U32 err, const char *pat, ...); +#endif + +#define Perl_warner DPPP_(my_warner) + +#if defined(NEED_warner) || defined(NEED_warner_GLOBAL) + +void +DPPP_(my_warner)(U32 err, const char *pat, ...) +{ + SV *sv; + va_list args; + + PERL_UNUSED_ARG(err); + + va_start(args, pat); + sv = vnewSVpvf(pat, &args); + va_end(args); + sv_2mortal(sv); + warn("%s", SvPV_nolen(sv)); +} + +#define warner Perl_warner + +#define Perl_warner_nocontext Perl_warner + +#endif +#endif + +/* concatenating with "" ensures that only literal strings are accepted as argument + * note that STR_WITH_LEN() can't be used as argument to macros or functions that + * under some configurations might be macros + */ +#ifndef STR_WITH_LEN +# define STR_WITH_LEN(s) (s ""), (sizeof(s)-1) +#endif +#ifndef newSVpvs +# define newSVpvs(str) newSVpvn(str "", sizeof(str) - 1) +#endif + +#ifndef newSVpvs_flags +# define newSVpvs_flags(str, flags) newSVpvn_flags(str "", sizeof(str) - 1, flags) +#endif + +#ifndef newSVpvs_share +# define newSVpvs_share(str) newSVpvn_share(str "", sizeof(str) - 1, 0) +#endif + +#ifndef sv_catpvs +# define sv_catpvs(sv, str) sv_catpvn(sv, str "", sizeof(str) - 1) +#endif + +#ifndef sv_setpvs +# define sv_setpvs(sv, str) sv_setpvn(sv, str "", sizeof(str) - 1) +#endif + +#ifndef hv_fetchs +# define hv_fetchs(hv, key, lval) hv_fetch(hv, key "", sizeof(key) - 1, lval) +#endif + +#ifndef hv_stores +# define hv_stores(hv, key, val) hv_store(hv, key "", sizeof(key) - 1, val, 0) +#endif +#ifndef gv_fetchpvs +# define gv_fetchpvs(name, flags, svt) gv_fetchpvn_flags(name "", sizeof(name) - 1, flags, svt) +#endif + +#ifndef gv_stashpvs +# define gv_stashpvs(name, flags) gv_stashpvn(name "", sizeof(name) - 1, flags) +#endif +#ifndef get_cvs +# define get_cvs(name, flags) get_cvn_flags(name "", sizeof(name)-1, flags) +#endif +#ifndef SvGETMAGIC +# define SvGETMAGIC(x) STMT_START { if (SvGMAGICAL(x)) mg_get(x); } STMT_END +#endif + +/* Some random bits for sv_unmagicext. These should probably be pulled in for + real and organized at some point */ +#ifndef HEf_SVKEY +# define HEf_SVKEY -2 +#endif + +#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN) +# define MUTABLE_PTR(p) ({ void *_p = (p); _p; }) +#else +# define MUTABLE_PTR(p) ((void *) (p)) +#endif + +#define MUTABLE_SV(p) ((SV *)MUTABLE_PTR(p)) + +/* end of random bits */ +#ifndef PERL_MAGIC_sv +# define PERL_MAGIC_sv '\0' +#endif + +#ifndef PERL_MAGIC_overload +# define PERL_MAGIC_overload 'A' +#endif + +#ifndef PERL_MAGIC_overload_elem +# define PERL_MAGIC_overload_elem 'a' +#endif + +#ifndef PERL_MAGIC_overload_table +# define PERL_MAGIC_overload_table 'c' +#endif + +#ifndef PERL_MAGIC_bm +# define PERL_MAGIC_bm 'B' +#endif + +#ifndef PERL_MAGIC_regdata +# define PERL_MAGIC_regdata 'D' +#endif + +#ifndef PERL_MAGIC_regdatum +# define PERL_MAGIC_regdatum 'd' +#endif + +#ifndef PERL_MAGIC_env +# define PERL_MAGIC_env 'E' +#endif + +#ifndef PERL_MAGIC_envelem +# define PERL_MAGIC_envelem 'e' +#endif + +#ifndef PERL_MAGIC_fm +# define PERL_MAGIC_fm 'f' +#endif + +#ifndef PERL_MAGIC_regex_global +# define PERL_MAGIC_regex_global 'g' +#endif + +#ifndef PERL_MAGIC_isa +# define PERL_MAGIC_isa 'I' +#endif + +#ifndef PERL_MAGIC_isaelem +# define PERL_MAGIC_isaelem 'i' +#endif + +#ifndef PERL_MAGIC_nkeys +# define PERL_MAGIC_nkeys 'k' +#endif + +#ifndef PERL_MAGIC_dbfile +# define PERL_MAGIC_dbfile 'L' +#endif + +#ifndef PERL_MAGIC_dbline +# define PERL_MAGIC_dbline 'l' +#endif + +#ifndef PERL_MAGIC_mutex +# define PERL_MAGIC_mutex 'm' +#endif + +#ifndef PERL_MAGIC_shared +# define PERL_MAGIC_shared 'N' +#endif + +#ifndef PERL_MAGIC_shared_scalar +# define PERL_MAGIC_shared_scalar 'n' +#endif + +#ifndef PERL_MAGIC_collxfrm +# define PERL_MAGIC_collxfrm 'o' +#endif + +#ifndef PERL_MAGIC_tied +# define PERL_MAGIC_tied 'P' +#endif + +#ifndef PERL_MAGIC_tiedelem +# define PERL_MAGIC_tiedelem 'p' +#endif + +#ifndef PERL_MAGIC_tiedscalar +# define PERL_MAGIC_tiedscalar 'q' +#endif + +#ifndef PERL_MAGIC_qr +# define PERL_MAGIC_qr 'r' +#endif + +#ifndef PERL_MAGIC_sig +# define PERL_MAGIC_sig 'S' +#endif + +#ifndef PERL_MAGIC_sigelem +# define PERL_MAGIC_sigelem 's' +#endif + +#ifndef PERL_MAGIC_taint +# define PERL_MAGIC_taint 't' +#endif + +#ifndef PERL_MAGIC_uvar +# define PERL_MAGIC_uvar 'U' +#endif + +#ifndef PERL_MAGIC_uvar_elem +# define PERL_MAGIC_uvar_elem 'u' +#endif + +#ifndef PERL_MAGIC_vstring +# define PERL_MAGIC_vstring 'V' +#endif + +#ifndef PERL_MAGIC_vec +# define PERL_MAGIC_vec 'v' +#endif + +#ifndef PERL_MAGIC_utf8 +# define PERL_MAGIC_utf8 'w' +#endif + +#ifndef PERL_MAGIC_substr +# define PERL_MAGIC_substr 'x' +#endif + +#ifndef PERL_MAGIC_defelem +# define PERL_MAGIC_defelem 'y' +#endif + +#ifndef PERL_MAGIC_glob +# define PERL_MAGIC_glob '*' +#endif + +#ifndef PERL_MAGIC_arylen +# define PERL_MAGIC_arylen '#' +#endif + +#ifndef PERL_MAGIC_pos +# define PERL_MAGIC_pos '.' +#endif + +#ifndef PERL_MAGIC_backref +# define PERL_MAGIC_backref '<' +#endif + +#ifndef PERL_MAGIC_ext +# define PERL_MAGIC_ext '~' +#endif + +/* That's the best we can do... */ +#ifndef sv_catpvn_nomg +# define sv_catpvn_nomg sv_catpvn +#endif + +#ifndef sv_catsv_nomg +# define sv_catsv_nomg sv_catsv +#endif + +#ifndef sv_setsv_nomg +# define sv_setsv_nomg sv_setsv +#endif + +#ifndef sv_pvn_nomg +# define sv_pvn_nomg sv_pvn +#endif + +#ifndef SvIV_nomg +# define SvIV_nomg SvIV +#endif + +#ifndef SvUV_nomg +# define SvUV_nomg SvUV +#endif + +#ifndef sv_catpv_mg +# define sv_catpv_mg(sv, ptr) \ + STMT_START { \ + SV *TeMpSv = sv; \ + sv_catpv(TeMpSv,ptr); \ + SvSETMAGIC(TeMpSv); \ + } STMT_END +#endif + +#ifndef sv_catpvn_mg +# define sv_catpvn_mg(sv, ptr, len) \ + STMT_START { \ + SV *TeMpSv = sv; \ + sv_catpvn(TeMpSv,ptr,len); \ + SvSETMAGIC(TeMpSv); \ + } STMT_END +#endif + +#ifndef sv_catsv_mg +# define sv_catsv_mg(dsv, ssv) \ + STMT_START { \ + SV *TeMpSv = dsv; \ + sv_catsv(TeMpSv,ssv); \ + SvSETMAGIC(TeMpSv); \ + } STMT_END +#endif + +#ifndef sv_setiv_mg +# define sv_setiv_mg(sv, i) \ + STMT_START { \ + SV *TeMpSv = sv; \ + sv_setiv(TeMpSv,i); \ + SvSETMAGIC(TeMpSv); \ + } STMT_END +#endif + +#ifndef sv_setnv_mg +# define sv_setnv_mg(sv, num) \ + STMT_START { \ + SV *TeMpSv = sv; \ + sv_setnv(TeMpSv,num); \ + SvSETMAGIC(TeMpSv); \ + } STMT_END +#endif + +#ifndef sv_setpv_mg +# define sv_setpv_mg(sv, ptr) \ + STMT_START { \ + SV *TeMpSv = sv; \ + sv_setpv(TeMpSv,ptr); \ + SvSETMAGIC(TeMpSv); \ + } STMT_END +#endif + +#ifndef sv_setpvn_mg +# define sv_setpvn_mg(sv, ptr, len) \ + STMT_START { \ + SV *TeMpSv = sv; \ + sv_setpvn(TeMpSv,ptr,len); \ + SvSETMAGIC(TeMpSv); \ + } STMT_END +#endif + +#ifndef sv_setsv_mg +# define sv_setsv_mg(dsv, ssv) \ + STMT_START { \ + SV *TeMpSv = dsv; \ + sv_setsv(TeMpSv,ssv); \ + SvSETMAGIC(TeMpSv); \ + } STMT_END +#endif + +#ifndef sv_setuv_mg +# define sv_setuv_mg(sv, i) \ + STMT_START { \ + SV *TeMpSv = sv; \ + sv_setuv(TeMpSv,i); \ + SvSETMAGIC(TeMpSv); \ + } STMT_END +#endif + +#ifndef sv_usepvn_mg +# define sv_usepvn_mg(sv, ptr, len) \ + STMT_START { \ + SV *TeMpSv = sv; \ + sv_usepvn(TeMpSv,ptr,len); \ + SvSETMAGIC(TeMpSv); \ + } STMT_END +#endif +#ifndef SvVSTRING_mg +# define SvVSTRING_mg(sv) (SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_vstring) : NULL) +#endif + +/* Hint: sv_magic_portable + * This is a compatibility function that is only available with + * Devel::PPPort. It is NOT in the perl core. + * Its purpose is to mimic the 5.8.0 behaviour of sv_magic() when + * it is being passed a name pointer with namlen == 0. In that + * case, perl 5.8.0 and later store the pointer, not a copy of it. + * The compatibility can be provided back to perl 5.004. With + * earlier versions, the code will not compile. + */ + +#if (PERL_BCDVERSION < 0x5004000) + + /* code that uses sv_magic_portable will not compile */ + +#elif (PERL_BCDVERSION < 0x5008000) + +# define sv_magic_portable(sv, obj, how, name, namlen) \ + STMT_START { \ + SV *SvMp_sv = (sv); \ + char *SvMp_name = (char *) (name); \ + I32 SvMp_namlen = (namlen); \ + if (SvMp_name && SvMp_namlen == 0) \ + { \ + MAGIC *mg; \ + sv_magic(SvMp_sv, obj, how, 0, 0); \ + mg = SvMAGIC(SvMp_sv); \ + mg->mg_len = -42; /* XXX: this is the tricky part */ \ + mg->mg_ptr = SvMp_name; \ + } \ + else \ + { \ + sv_magic(SvMp_sv, obj, how, SvMp_name, SvMp_namlen); \ + } \ + } STMT_END + +#else + +# define sv_magic_portable(a, b, c, d, e) sv_magic(a, b, c, d, e) + +#endif + +#if !defined(mg_findext) +#if defined(NEED_mg_findext) +static MAGIC * DPPP_(my_mg_findext)(SV * sv, int type, const MGVTBL *vtbl); +static +#else +extern MAGIC * DPPP_(my_mg_findext)(SV * sv, int type, const MGVTBL *vtbl); +#endif + +#define mg_findext DPPP_(my_mg_findext) +#define Perl_mg_findext DPPP_(my_mg_findext) + +#if defined(NEED_mg_findext) || defined(NEED_mg_findext_GLOBAL) + +MAGIC * +DPPP_(my_mg_findext)(SV * sv, int type, const MGVTBL *vtbl) { + if (sv) { + MAGIC *mg; + +#ifdef AvPAD_NAMELIST + assert(!(SvTYPE(sv) == SVt_PVAV && AvPAD_NAMELIST(sv))); +#endif + + for (mg = SvMAGIC (sv); mg; mg = mg->mg_moremagic) { + if (mg->mg_type == type && mg->mg_virtual == vtbl) + return mg; + } + } + + return NULL; +} + +#endif +#endif + +#if !defined(sv_unmagicext) +#if defined(NEED_sv_unmagicext) +static int DPPP_(my_sv_unmagicext)(pTHX_ SV * const sv, const int type, MGVTBL * vtbl); +static +#else +extern int DPPP_(my_sv_unmagicext)(pTHX_ SV * const sv, const int type, MGVTBL * vtbl); +#endif + +#ifdef sv_unmagicext +# undef sv_unmagicext +#endif +#define sv_unmagicext(a,b,c) DPPP_(my_sv_unmagicext)(aTHX_ a,b,c) +#define Perl_sv_unmagicext DPPP_(my_sv_unmagicext) + +#if defined(NEED_sv_unmagicext) || defined(NEED_sv_unmagicext_GLOBAL) + +int +DPPP_(my_sv_unmagicext)(pTHX_ SV *const sv, const int type, MGVTBL *vtbl) +{ + MAGIC* mg; + MAGIC** mgp; + + if (SvTYPE(sv) < SVt_PVMG || !SvMAGIC(sv)) + return 0; + mgp = &(SvMAGIC(sv)); + for (mg = *mgp; mg; mg = *mgp) { + const MGVTBL* const virt = mg->mg_virtual; + if (mg->mg_type == type && virt == vtbl) { + *mgp = mg->mg_moremagic; + if (virt && virt->svt_free) + virt->svt_free(aTHX_ sv, mg); + if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) { + if (mg->mg_len > 0) + Safefree(mg->mg_ptr); + else if (mg->mg_len == HEf_SVKEY) /* Questionable on older perls... */ + SvREFCNT_dec(MUTABLE_SV(mg->mg_ptr)); + else if (mg->mg_type == PERL_MAGIC_utf8) + Safefree(mg->mg_ptr); + } + if (mg->mg_flags & MGf_REFCOUNTED) + SvREFCNT_dec(mg->mg_obj); + Safefree(mg); + } + else + mgp = &mg->mg_moremagic; + } + if (SvMAGIC(sv)) { + if (SvMAGICAL(sv)) /* if we're under save_magic, wait for restore_magic; */ + mg_magical(sv); /* else fix the flags now */ + } + else { + SvMAGICAL_off(sv); + SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_IOK|SVp_NOK|SVp_POK)) >> PRIVSHIFT; + } + return 0; +} + +#endif +#endif + +#ifdef USE_ITHREADS +#ifndef CopFILE +# define CopFILE(c) ((c)->cop_file) +#endif + +#ifndef CopFILEGV +# define CopFILEGV(c) (CopFILE(c) ? gv_fetchfile(CopFILE(c)) : Nullgv) +#endif + +#ifndef CopFILE_set +# define CopFILE_set(c,pv) ((c)->cop_file = savepv(pv)) +#endif + +#ifndef CopFILESV +# define CopFILESV(c) (CopFILE(c) ? GvSV(gv_fetchfile(CopFILE(c))) : Nullsv) +#endif + +#ifndef CopFILEAV +# define CopFILEAV(c) (CopFILE(c) ? GvAV(gv_fetchfile(CopFILE(c))) : Nullav) +#endif + +#ifndef CopSTASHPV +# define CopSTASHPV(c) ((c)->cop_stashpv) +#endif + +#ifndef CopSTASHPV_set +# define CopSTASHPV_set(c,pv) ((c)->cop_stashpv = ((pv) ? savepv(pv) : Nullch)) +#endif + +#ifndef CopSTASH +# define CopSTASH(c) (CopSTASHPV(c) ? gv_stashpv(CopSTASHPV(c),GV_ADD) : Nullhv) +#endif + +#ifndef CopSTASH_set +# define CopSTASH_set(c,hv) CopSTASHPV_set(c, (hv) ? HvNAME(hv) : Nullch) +#endif + +#ifndef CopSTASH_eq +# define CopSTASH_eq(c,hv) ((hv) && (CopSTASHPV(c) == HvNAME(hv) \ + || (CopSTASHPV(c) && HvNAME(hv) \ + && strEQ(CopSTASHPV(c), HvNAME(hv))))) +#endif + +#else +#ifndef CopFILEGV +# define CopFILEGV(c) ((c)->cop_filegv) +#endif + +#ifndef CopFILEGV_set +# define CopFILEGV_set(c,gv) ((c)->cop_filegv = (GV*)SvREFCNT_inc(gv)) +#endif + +#ifndef CopFILE_set +# define CopFILE_set(c,pv) CopFILEGV_set((c), gv_fetchfile(pv)) +#endif + +#ifndef CopFILESV +# define CopFILESV(c) (CopFILEGV(c) ? GvSV(CopFILEGV(c)) : Nullsv) +#endif + +#ifndef CopFILEAV +# define CopFILEAV(c) (CopFILEGV(c) ? GvAV(CopFILEGV(c)) : Nullav) +#endif + +#ifndef CopFILE +# define CopFILE(c) (CopFILESV(c) ? SvPVX(CopFILESV(c)) : Nullch) +#endif + +#ifndef CopSTASH +# define CopSTASH(c) ((c)->cop_stash) +#endif + +#ifndef CopSTASH_set +# define CopSTASH_set(c,hv) ((c)->cop_stash = (hv)) +#endif + +#ifndef CopSTASHPV +# define CopSTASHPV(c) (CopSTASH(c) ? HvNAME(CopSTASH(c)) : Nullch) +#endif + +#ifndef CopSTASHPV_set +# define CopSTASHPV_set(c,pv) CopSTASH_set((c), gv_stashpv(pv,GV_ADD)) +#endif + +#ifndef CopSTASH_eq +# define CopSTASH_eq(c,hv) (CopSTASH(c) == (hv)) +#endif + +#endif /* USE_ITHREADS */ + +#if (PERL_BCDVERSION >= 0x5006000) +#ifndef caller_cx + +# if defined(NEED_caller_cx) || defined(NEED_caller_cx_GLOBAL) +static I32 +DPPP_dopoptosub_at(const PERL_CONTEXT *cxstk, I32 startingblock) +{ + I32 i; + + for (i = startingblock; i >= 0; i--) { + register const PERL_CONTEXT * const cx = &cxstk[i]; + switch (CxTYPE(cx)) { + default: + continue; + case CXt_EVAL: + case CXt_SUB: + case CXt_FORMAT: + return i; + } + } + return i; +} +# endif + +# if defined(NEED_caller_cx) +static const PERL_CONTEXT * DPPP_(my_caller_cx)(pTHX_ I32 count, const PERL_CONTEXT **dbcxp); +static +#else +extern const PERL_CONTEXT * DPPP_(my_caller_cx)(pTHX_ I32 count, const PERL_CONTEXT **dbcxp); +#endif + +#ifdef caller_cx +# undef caller_cx +#endif +#define caller_cx(a,b) DPPP_(my_caller_cx)(aTHX_ a,b) +#define Perl_caller_cx DPPP_(my_caller_cx) + +#if defined(NEED_caller_cx) || defined(NEED_caller_cx_GLOBAL) + +const PERL_CONTEXT * +DPPP_(my_caller_cx)(pTHX_ I32 count, const PERL_CONTEXT **dbcxp) +{ + register I32 cxix = DPPP_dopoptosub_at(cxstack, cxstack_ix); + register const PERL_CONTEXT *cx; + register const PERL_CONTEXT *ccstack = cxstack; + const PERL_SI *top_si = PL_curstackinfo; + + for (;;) { + /* we may be in a higher stacklevel, so dig down deeper */ + while (cxix < 0 && top_si->si_type != PERLSI_MAIN) { + top_si = top_si->si_prev; + ccstack = top_si->si_cxstack; + cxix = DPPP_dopoptosub_at(ccstack, top_si->si_cxix); + } + if (cxix < 0) + return NULL; + /* caller() should not report the automatic calls to &DB::sub */ + if (PL_DBsub && GvCV(PL_DBsub) && cxix >= 0 && + ccstack[cxix].blk_sub.cv == GvCV(PL_DBsub)) + count++; + if (!count--) + break; + cxix = DPPP_dopoptosub_at(ccstack, cxix - 1); + } + + cx = &ccstack[cxix]; + if (dbcxp) *dbcxp = cx; + + if (CxTYPE(cx) == CXt_SUB || CxTYPE(cx) == CXt_FORMAT) { + const I32 dbcxix = DPPP_dopoptosub_at(ccstack, cxix - 1); + /* We expect that ccstack[dbcxix] is CXt_SUB, anyway, the + field below is defined for any cx. */ + /* caller() should not report the automatic calls to &DB::sub */ + if (PL_DBsub && GvCV(PL_DBsub) && dbcxix >= 0 && ccstack[dbcxix].blk_sub.cv == GvCV(PL_DBsub)) + cx = &ccstack[dbcxix]; + } + + return cx; +} + +# endif +#endif /* caller_cx */ +#endif /* 5.6.0 */ +#ifndef IN_PERL_COMPILETIME +# define IN_PERL_COMPILETIME (PL_curcop == &PL_compiling) +#endif + +#ifndef IN_LOCALE_RUNTIME +# define IN_LOCALE_RUNTIME (PL_curcop->op_private & HINT_LOCALE) +#endif + +#ifndef IN_LOCALE_COMPILETIME +# define IN_LOCALE_COMPILETIME (PL_hints & HINT_LOCALE) +#endif + +#ifndef IN_LOCALE +# define IN_LOCALE (IN_PERL_COMPILETIME ? IN_LOCALE_COMPILETIME : IN_LOCALE_RUNTIME) +#endif +#ifndef IS_NUMBER_IN_UV +# define IS_NUMBER_IN_UV 0x01 +#endif + +#ifndef IS_NUMBER_GREATER_THAN_UV_MAX +# define IS_NUMBER_GREATER_THAN_UV_MAX 0x02 +#endif + +#ifndef IS_NUMBER_NOT_INT +# define IS_NUMBER_NOT_INT 0x04 +#endif + +#ifndef IS_NUMBER_NEG +# define IS_NUMBER_NEG 0x08 +#endif + +#ifndef IS_NUMBER_INFINITY +# define IS_NUMBER_INFINITY 0x10 +#endif + +#ifndef IS_NUMBER_NAN +# define IS_NUMBER_NAN 0x20 +#endif +#ifndef GROK_NUMERIC_RADIX +# define GROK_NUMERIC_RADIX(sp, send) grok_numeric_radix(sp, send) +#endif +#ifndef PERL_SCAN_GREATER_THAN_UV_MAX +# define PERL_SCAN_GREATER_THAN_UV_MAX 0x02 +#endif + +#ifndef PERL_SCAN_SILENT_ILLDIGIT +# define PERL_SCAN_SILENT_ILLDIGIT 0x04 +#endif + +#ifndef PERL_SCAN_ALLOW_UNDERSCORES +# define PERL_SCAN_ALLOW_UNDERSCORES 0x01 +#endif + +#ifndef PERL_SCAN_DISALLOW_PREFIX +# define PERL_SCAN_DISALLOW_PREFIX 0x02 +#endif + +#ifndef grok_numeric_radix +#if defined(NEED_grok_numeric_radix) +static bool DPPP_(my_grok_numeric_radix)(pTHX_ const char ** sp, const char * send); +static +#else +extern bool DPPP_(my_grok_numeric_radix)(pTHX_ const char ** sp, const char * send); +#endif + +#ifdef grok_numeric_radix +# undef grok_numeric_radix +#endif +#define grok_numeric_radix(a,b) DPPP_(my_grok_numeric_radix)(aTHX_ a,b) +#define Perl_grok_numeric_radix DPPP_(my_grok_numeric_radix) + +#if defined(NEED_grok_numeric_radix) || defined(NEED_grok_numeric_radix_GLOBAL) +bool +DPPP_(my_grok_numeric_radix)(pTHX_ const char **sp, const char *send) +{ +#ifdef USE_LOCALE_NUMERIC +#ifdef PL_numeric_radix_sv + if (PL_numeric_radix_sv && IN_LOCALE) { + STRLEN len; + char* radix = SvPV(PL_numeric_radix_sv, len); + if (*sp + len <= send && memEQ(*sp, radix, len)) { + *sp += len; + return TRUE; + } + } +#else + /* older perls don't have PL_numeric_radix_sv so the radix + * must manually be requested from locale.h + */ +#include <locale.h> + dTHR; /* needed for older threaded perls */ + struct lconv *lc = localeconv(); + char *radix = lc->decimal_point; + if (radix && IN_LOCALE) { + STRLEN len = strlen(radix); + if (*sp + len <= send && memEQ(*sp, radix, len)) { + *sp += len; + return TRUE; + } + } +#endif +#endif /* USE_LOCALE_NUMERIC */ + /* always try "." if numeric radix didn't match because + * we may have data from different locales mixed */ + if (*sp < send && **sp == '.') { + ++*sp; + return TRUE; + } + return FALSE; +} +#endif +#endif + +#ifndef grok_number +#if defined(NEED_grok_number) +static int DPPP_(my_grok_number)(pTHX_ const char * pv, STRLEN len, UV * valuep); +static +#else +extern int DPPP_(my_grok_number)(pTHX_ const char * pv, STRLEN len, UV * valuep); +#endif + +#ifdef grok_number +# undef grok_number +#endif +#define grok_number(a,b,c) DPPP_(my_grok_number)(aTHX_ a,b,c) +#define Perl_grok_number DPPP_(my_grok_number) + +#if defined(NEED_grok_number) || defined(NEED_grok_number_GLOBAL) +int +DPPP_(my_grok_number)(pTHX_ const char *pv, STRLEN len, UV *valuep) +{ + const char *s = pv; + const char *send = pv + len; + const UV max_div_10 = UV_MAX / 10; + const char max_mod_10 = UV_MAX % 10; + int numtype = 0; + int sawinf = 0; + int sawnan = 0; + + while (s < send && isSPACE(*s)) + s++; + if (s == send) { + return 0; + } else if (*s == '-') { + s++; + numtype = IS_NUMBER_NEG; + } + else if (*s == '+') + s++; + + if (s == send) + return 0; + + /* next must be digit or the radix separator or beginning of infinity */ + if (isDIGIT(*s)) { + /* UVs are at least 32 bits, so the first 9 decimal digits cannot + overflow. */ + UV value = *s - '0'; + /* This construction seems to be more optimiser friendly. + (without it gcc does the isDIGIT test and the *s - '0' separately) + With it gcc on arm is managing 6 instructions (6 cycles) per digit. + In theory the optimiser could deduce how far to unroll the loop + before checking for overflow. */ + if (++s < send) { + int digit = *s - '0'; + if (digit >= 0 && digit <= 9) { + value = value * 10 + digit; + if (++s < send) { + digit = *s - '0'; + if (digit >= 0 && digit <= 9) { + value = value * 10 + digit; + if (++s < send) { + digit = *s - '0'; + if (digit >= 0 && digit <= 9) { + value = value * 10 + digit; + if (++s < send) { + digit = *s - '0'; + if (digit >= 0 && digit <= 9) { + value = value * 10 + digit; + if (++s < send) { + digit = *s - '0'; + if (digit >= 0 && digit <= 9) { + value = value * 10 + digit; + if (++s < send) { + digit = *s - '0'; + if (digit >= 0 && digit <= 9) { + value = value * 10 + digit; + if (++s < send) { + digit = *s - '0'; + if (digit >= 0 && digit <= 9) { + value = value * 10 + digit; + if (++s < send) { + digit = *s - '0'; + if (digit >= 0 && digit <= 9) { + value = value * 10 + digit; + if (++s < send) { + /* Now got 9 digits, so need to check + each time for overflow. */ + digit = *s - '0'; + while (digit >= 0 && digit <= 9 + && (value < max_div_10 + || (value == max_div_10 + && digit <= max_mod_10))) { + value = value * 10 + digit; + if (++s < send) + digit = *s - '0'; + else + break; + } + if (digit >= 0 && digit <= 9 + && (s < send)) { + /* value overflowed. + skip the remaining digits, don't + worry about setting *valuep. */ + do { + s++; + } while (s < send && isDIGIT(*s)); + numtype |= + IS_NUMBER_GREATER_THAN_UV_MAX; + goto skip_value; + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + numtype |= IS_NUMBER_IN_UV; + if (valuep) + *valuep = value; + + skip_value: + if (GROK_NUMERIC_RADIX(&s, send)) { + numtype |= IS_NUMBER_NOT_INT; + while (s < send && isDIGIT(*s)) /* optional digits after the radix */ + s++; + } + } + else if (GROK_NUMERIC_RADIX(&s, send)) { + numtype |= IS_NUMBER_NOT_INT | IS_NUMBER_IN_UV; /* valuep assigned below */ + /* no digits before the radix means we need digits after it */ + if (s < send && isDIGIT(*s)) { + do { + s++; + } while (s < send && isDIGIT(*s)); + if (valuep) { + /* integer approximation is valid - it's 0. */ + *valuep = 0; + } + } + else + return 0; + } else if (*s == 'I' || *s == 'i') { + s++; if (s == send || (*s != 'N' && *s != 'n')) return 0; + s++; if (s == send || (*s != 'F' && *s != 'f')) return 0; + s++; if (s < send && (*s == 'I' || *s == 'i')) { + s++; if (s == send || (*s != 'N' && *s != 'n')) return 0; + s++; if (s == send || (*s != 'I' && *s != 'i')) return 0; + s++; if (s == send || (*s != 'T' && *s != 't')) return 0; + s++; if (s == send || (*s != 'Y' && *s != 'y')) return 0; + s++; + } + sawinf = 1; + } else if (*s == 'N' || *s == 'n') { + /* XXX TODO: There are signaling NaNs and quiet NaNs. */ + s++; if (s == send || (*s != 'A' && *s != 'a')) return 0; + s++; if (s == send || (*s != 'N' && *s != 'n')) return 0; + s++; + sawnan = 1; + } else + return 0; + + if (sawinf) { + numtype &= IS_NUMBER_NEG; /* Keep track of sign */ + numtype |= IS_NUMBER_INFINITY | IS_NUMBER_NOT_INT; + } else if (sawnan) { + numtype &= IS_NUMBER_NEG; /* Keep track of sign */ + numtype |= IS_NUMBER_NAN | IS_NUMBER_NOT_INT; + } else if (s < send) { + /* we can have an optional exponent part */ + if (*s == 'e' || *s == 'E') { + /* The only flag we keep is sign. Blow away any "it's UV" */ + numtype &= IS_NUMBER_NEG; + numtype |= IS_NUMBER_NOT_INT; + s++; + if (s < send && (*s == '-' || *s == '+')) + s++; + if (s < send && isDIGIT(*s)) { + do { + s++; + } while (s < send && isDIGIT(*s)); + } + else + return 0; + } + } + while (s < send && isSPACE(*s)) + s++; + if (s >= send) + return numtype; + if (len == 10 && memEQ(pv, "0 but true", 10)) { + if (valuep) + *valuep = 0; + return IS_NUMBER_IN_UV; + } + return 0; +} +#endif +#endif + +/* + * The grok_* routines have been modified to use warn() instead of + * Perl_warner(). Also, 'hexdigit' was the former name of PL_hexdigit, + * which is why the stack variable has been renamed to 'xdigit'. + */ + +#ifndef grok_bin +#if defined(NEED_grok_bin) +static UV DPPP_(my_grok_bin)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result); +static +#else +extern UV DPPP_(my_grok_bin)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result); +#endif + +#ifdef grok_bin +# undef grok_bin +#endif +#define grok_bin(a,b,c,d) DPPP_(my_grok_bin)(aTHX_ a,b,c,d) +#define Perl_grok_bin DPPP_(my_grok_bin) + +#if defined(NEED_grok_bin) || defined(NEED_grok_bin_GLOBAL) +UV +DPPP_(my_grok_bin)(pTHX_ const char *start, STRLEN *len_p, I32 *flags, NV *result) +{ + const char *s = start; + STRLEN len = *len_p; + UV value = 0; + NV value_nv = 0; + + const UV max_div_2 = UV_MAX / 2; + bool allow_underscores = *flags & PERL_SCAN_ALLOW_UNDERSCORES; + bool overflowed = FALSE; + + if (!(*flags & PERL_SCAN_DISALLOW_PREFIX)) { + /* strip off leading b or 0b. + for compatibility silently suffer "b" and "0b" as valid binary + numbers. */ + if (len >= 1) { + if (s[0] == 'b') { + s++; + len--; + } + else if (len >= 2 && s[0] == '0' && s[1] == 'b') { + s+=2; + len-=2; + } + } + } + + for (; len-- && *s; s++) { + char bit = *s; + if (bit == '0' || bit == '1') { + /* Write it in this wonky order with a goto to attempt to get the + compiler to make the common case integer-only loop pretty tight. + With gcc seems to be much straighter code than old scan_bin. */ + redo: + if (!overflowed) { + if (value <= max_div_2) { + value = (value << 1) | (bit - '0'); + continue; + } + /* Bah. We're just overflowed. */ + warn("Integer overflow in binary number"); + overflowed = TRUE; + value_nv = (NV) value; + } + value_nv *= 2.0; + /* If an NV has not enough bits in its mantissa to + * represent a UV this summing of small low-order numbers + * is a waste of time (because the NV cannot preserve + * the low-order bits anyway): we could just remember when + * did we overflow and in the end just multiply value_nv by the + * right amount. */ + value_nv += (NV)(bit - '0'); + continue; + } + if (bit == '_' && len && allow_underscores && (bit = s[1]) + && (bit == '0' || bit == '1')) + { + --len; + ++s; + goto redo; + } + if (!(*flags & PERL_SCAN_SILENT_ILLDIGIT)) + warn("Illegal binary digit '%c' ignored", *s); + break; + } + + if ( ( overflowed && value_nv > 4294967295.0) +#if UVSIZE > 4 + || (!overflowed && value > 0xffffffff ) +#endif + ) { + warn("Binary number > 0b11111111111111111111111111111111 non-portable"); + } + *len_p = s - start; + if (!overflowed) { + *flags = 0; + return value; + } + *flags = PERL_SCAN_GREATER_THAN_UV_MAX; + if (result) + *result = value_nv; + return UV_MAX; +} +#endif +#endif + +#ifndef grok_hex +#if defined(NEED_grok_hex) +static UV DPPP_(my_grok_hex)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result); +static +#else +extern UV DPPP_(my_grok_hex)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result); +#endif + +#ifdef grok_hex +# undef grok_hex +#endif +#define grok_hex(a,b,c,d) DPPP_(my_grok_hex)(aTHX_ a,b,c,d) +#define Perl_grok_hex DPPP_(my_grok_hex) + +#if defined(NEED_grok_hex) || defined(NEED_grok_hex_GLOBAL) +UV +DPPP_(my_grok_hex)(pTHX_ const char *start, STRLEN *len_p, I32 *flags, NV *result) +{ + const char *s = start; + STRLEN len = *len_p; + UV value = 0; + NV value_nv = 0; + + const UV max_div_16 = UV_MAX / 16; + bool allow_underscores = *flags & PERL_SCAN_ALLOW_UNDERSCORES; + bool overflowed = FALSE; + const char *xdigit; + + if (!(*flags & PERL_SCAN_DISALLOW_PREFIX)) { + /* strip off leading x or 0x. + for compatibility silently suffer "x" and "0x" as valid hex numbers. + */ + if (len >= 1) { + if (s[0] == 'x') { + s++; + len--; + } + else if (len >= 2 && s[0] == '0' && s[1] == 'x') { + s+=2; + len-=2; + } + } + } + + for (; len-- && *s; s++) { + xdigit = strchr((char *) PL_hexdigit, *s); + if (xdigit) { + /* Write it in this wonky order with a goto to attempt to get the + compiler to make the common case integer-only loop pretty tight. + With gcc seems to be much straighter code than old scan_hex. */ + redo: + if (!overflowed) { + if (value <= max_div_16) { + value = (value << 4) | ((xdigit - PL_hexdigit) & 15); + continue; + } + warn("Integer overflow in hexadecimal number"); + overflowed = TRUE; + value_nv = (NV) value; + } + value_nv *= 16.0; + /* If an NV has not enough bits in its mantissa to + * represent a UV this summing of small low-order numbers + * is a waste of time (because the NV cannot preserve + * the low-order bits anyway): we could just remember when + * did we overflow and in the end just multiply value_nv by the + * right amount of 16-tuples. */ + value_nv += (NV)((xdigit - PL_hexdigit) & 15); + continue; + } + if (*s == '_' && len && allow_underscores && s[1] + && (xdigit = strchr((char *) PL_hexdigit, s[1]))) + { + --len; + ++s; + goto redo; + } + if (!(*flags & PERL_SCAN_SILENT_ILLDIGIT)) + warn("Illegal hexadecimal digit '%c' ignored", *s); + break; + } + + if ( ( overflowed && value_nv > 4294967295.0) +#if UVSIZE > 4 + || (!overflowed && value > 0xffffffff ) +#endif + ) { + warn("Hexadecimal number > 0xffffffff non-portable"); + } + *len_p = s - start; + if (!overflowed) { + *flags = 0; + return value; + } + *flags = PERL_SCAN_GREATER_THAN_UV_MAX; + if (result) + *result = value_nv; + return UV_MAX; +} +#endif +#endif + +#ifndef grok_oct +#if defined(NEED_grok_oct) +static UV DPPP_(my_grok_oct)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result); +static +#else +extern UV DPPP_(my_grok_oct)(pTHX_ const char * start, STRLEN * len_p, I32 * flags, NV * result); +#endif + +#ifdef grok_oct +# undef grok_oct +#endif +#define grok_oct(a,b,c,d) DPPP_(my_grok_oct)(aTHX_ a,b,c,d) +#define Perl_grok_oct DPPP_(my_grok_oct) + +#if defined(NEED_grok_oct) || defined(NEED_grok_oct_GLOBAL) +UV +DPPP_(my_grok_oct)(pTHX_ const char *start, STRLEN *len_p, I32 *flags, NV *result) +{ + const char *s = start; + STRLEN len = *len_p; + UV value = 0; + NV value_nv = 0; + + const UV max_div_8 = UV_MAX / 8; + bool allow_underscores = *flags & PERL_SCAN_ALLOW_UNDERSCORES; + bool overflowed = FALSE; + + for (; len-- && *s; s++) { + /* gcc 2.95 optimiser not smart enough to figure that this subtraction + out front allows slicker code. */ + int digit = *s - '0'; + if (digit >= 0 && digit <= 7) { + /* Write it in this wonky order with a goto to attempt to get the + compiler to make the common case integer-only loop pretty tight. + */ + redo: + if (!overflowed) { + if (value <= max_div_8) { + value = (value << 3) | digit; + continue; + } + /* Bah. We're just overflowed. */ + warn("Integer overflow in octal number"); + overflowed = TRUE; + value_nv = (NV) value; + } + value_nv *= 8.0; + /* If an NV has not enough bits in its mantissa to + * represent a UV this summing of small low-order numbers + * is a waste of time (because the NV cannot preserve + * the low-order bits anyway): we could just remember when + * did we overflow and in the end just multiply value_nv by the + * right amount of 8-tuples. */ + value_nv += (NV)digit; + continue; + } + if (digit == ('_' - '0') && len && allow_underscores + && (digit = s[1] - '0') && (digit >= 0 && digit <= 7)) + { + --len; + ++s; + goto redo; + } + /* Allow \octal to work the DWIM way (that is, stop scanning + * as soon as non-octal characters are seen, complain only iff + * someone seems to want to use the digits eight and nine). */ + if (digit == 8 || digit == 9) { + if (!(*flags & PERL_SCAN_SILENT_ILLDIGIT)) + warn("Illegal octal digit '%c' ignored", *s); + } + break; + } + + if ( ( overflowed && value_nv > 4294967295.0) +#if UVSIZE > 4 + || (!overflowed && value > 0xffffffff ) +#endif + ) { + warn("Octal number > 037777777777 non-portable"); + } + *len_p = s - start; + if (!overflowed) { + *flags = 0; + return value; + } + *flags = PERL_SCAN_GREATER_THAN_UV_MAX; + if (result) + *result = value_nv; + return UV_MAX; +} +#endif +#endif + +#if !defined(my_snprintf) +#if defined(NEED_my_snprintf) +static int DPPP_(my_my_snprintf)(char * buffer, const Size_t len, const char * format, ...); +static +#else +extern int DPPP_(my_my_snprintf)(char * buffer, const Size_t len, const char * format, ...); +#endif + +#define my_snprintf DPPP_(my_my_snprintf) +#define Perl_my_snprintf DPPP_(my_my_snprintf) + +#if defined(NEED_my_snprintf) || defined(NEED_my_snprintf_GLOBAL) + +int +DPPP_(my_my_snprintf)(char *buffer, const Size_t len, const char *format, ...) +{ + dTHX; + int retval; + va_list ap; + va_start(ap, format); +#ifdef HAS_VSNPRINTF + retval = vsnprintf(buffer, len, format, ap); +#else + retval = vsprintf(buffer, format, ap); +#endif + va_end(ap); + if (retval < 0 || (len > 0 && (Size_t)retval >= len)) + Perl_croak(aTHX_ "panic: my_snprintf buffer overflow"); + return retval; +} + +#endif +#endif + +#if !defined(my_sprintf) +#if defined(NEED_my_sprintf) +static int DPPP_(my_my_sprintf)(char * buffer, const char * pat, ...); +static +#else +extern int DPPP_(my_my_sprintf)(char * buffer, const char * pat, ...); +#endif + +#define my_sprintf DPPP_(my_my_sprintf) +#define Perl_my_sprintf DPPP_(my_my_sprintf) + +#if defined(NEED_my_sprintf) || defined(NEED_my_sprintf_GLOBAL) + +int +DPPP_(my_my_sprintf)(char *buffer, const char* pat, ...) +{ + va_list args; + va_start(args, pat); + vsprintf(buffer, pat, args); + va_end(args); + return strlen(buffer); +} + +#endif +#endif + +#ifdef NO_XSLOCKS +# ifdef dJMPENV +# define dXCPT dJMPENV; int rEtV = 0 +# define XCPT_TRY_START JMPENV_PUSH(rEtV); if (rEtV == 0) +# define XCPT_TRY_END JMPENV_POP; +# define XCPT_CATCH if (rEtV != 0) +# define XCPT_RETHROW JMPENV_JUMP(rEtV) +# else +# define dXCPT Sigjmp_buf oldTOP; int rEtV = 0 +# define XCPT_TRY_START Copy(top_env, oldTOP, 1, Sigjmp_buf); rEtV = Sigsetjmp(top_env, 1); if (rEtV == 0) +# define XCPT_TRY_END Copy(oldTOP, top_env, 1, Sigjmp_buf); +# define XCPT_CATCH if (rEtV != 0) +# define XCPT_RETHROW Siglongjmp(top_env, rEtV) +# endif +#endif + +#if !defined(my_strlcat) +#if defined(NEED_my_strlcat) +static Size_t DPPP_(my_my_strlcat)(char * dst, const char * src, Size_t size); +static +#else +extern Size_t DPPP_(my_my_strlcat)(char * dst, const char * src, Size_t size); +#endif + +#define my_strlcat DPPP_(my_my_strlcat) +#define Perl_my_strlcat DPPP_(my_my_strlcat) + +#if defined(NEED_my_strlcat) || defined(NEED_my_strlcat_GLOBAL) + +Size_t +DPPP_(my_my_strlcat)(char *dst, const char *src, Size_t size) +{ + Size_t used, length, copy; + + used = strlen(dst); + length = strlen(src); + if (size > 0 && used < size - 1) { + copy = (length >= size - used) ? size - used - 1 : length; + memcpy(dst + used, src, copy); + dst[used + copy] = '\0'; + } + return used + length; +} +#endif +#endif + +#if !defined(my_strlcpy) +#if defined(NEED_my_strlcpy) +static Size_t DPPP_(my_my_strlcpy)(char * dst, const char * src, Size_t size); +static +#else +extern Size_t DPPP_(my_my_strlcpy)(char * dst, const char * src, Size_t size); +#endif + +#define my_strlcpy DPPP_(my_my_strlcpy) +#define Perl_my_strlcpy DPPP_(my_my_strlcpy) + +#if defined(NEED_my_strlcpy) || defined(NEED_my_strlcpy_GLOBAL) + +Size_t +DPPP_(my_my_strlcpy)(char *dst, const char *src, Size_t size) +{ + Size_t length, copy; + + length = strlen(src); + if (size > 0) { + copy = (length >= size) ? size - 1 : length; + memcpy(dst, src, copy); + dst[copy] = '\0'; + } + return length; +} + +#endif +#endif +#ifndef PERL_PV_ESCAPE_QUOTE +# define PERL_PV_ESCAPE_QUOTE 0x0001 +#endif + +#ifndef PERL_PV_PRETTY_QUOTE +# define PERL_PV_PRETTY_QUOTE PERL_PV_ESCAPE_QUOTE +#endif + +#ifndef PERL_PV_PRETTY_ELLIPSES +# define PERL_PV_PRETTY_ELLIPSES 0x0002 +#endif + +#ifndef PERL_PV_PRETTY_LTGT +# define PERL_PV_PRETTY_LTGT 0x0004 +#endif + +#ifndef PERL_PV_ESCAPE_FIRSTCHAR +# define PERL_PV_ESCAPE_FIRSTCHAR 0x0008 +#endif + +#ifndef PERL_PV_ESCAPE_UNI +# define PERL_PV_ESCAPE_UNI 0x0100 +#endif + +#ifndef PERL_PV_ESCAPE_UNI_DETECT +# define PERL_PV_ESCAPE_UNI_DETECT 0x0200 +#endif + +#ifndef PERL_PV_ESCAPE_ALL +# define PERL_PV_ESCAPE_ALL 0x1000 +#endif + +#ifndef PERL_PV_ESCAPE_NOBACKSLASH +# define PERL_PV_ESCAPE_NOBACKSLASH 0x2000 +#endif + +#ifndef PERL_PV_ESCAPE_NOCLEAR +# define PERL_PV_ESCAPE_NOCLEAR 0x4000 +#endif + +#ifndef PERL_PV_ESCAPE_RE +# define PERL_PV_ESCAPE_RE 0x8000 +#endif + +#ifndef PERL_PV_PRETTY_NOCLEAR +# define PERL_PV_PRETTY_NOCLEAR PERL_PV_ESCAPE_NOCLEAR +#endif +#ifndef PERL_PV_PRETTY_DUMP +# define PERL_PV_PRETTY_DUMP PERL_PV_PRETTY_ELLIPSES|PERL_PV_PRETTY_QUOTE +#endif + +#ifndef PERL_PV_PRETTY_REGPROP +# define PERL_PV_PRETTY_REGPROP PERL_PV_PRETTY_ELLIPSES|PERL_PV_PRETTY_LTGT|PERL_PV_ESCAPE_RE +#endif + +/* Hint: pv_escape + * Note that unicode functionality is only backported to + * those perl versions that support it. For older perl + * versions, the implementation will fall back to bytes. + */ + +#ifndef pv_escape +#if defined(NEED_pv_escape) +static char * DPPP_(my_pv_escape)(pTHX_ SV * dsv, char const * const str, const STRLEN count, const STRLEN max, STRLEN * const escaped, const U32 flags); +static +#else +extern char * DPPP_(my_pv_escape)(pTHX_ SV * dsv, char const * const str, const STRLEN count, const STRLEN max, STRLEN * const escaped, const U32 flags); +#endif + +#ifdef pv_escape +# undef pv_escape +#endif +#define pv_escape(a,b,c,d,e,f) DPPP_(my_pv_escape)(aTHX_ a,b,c,d,e,f) +#define Perl_pv_escape DPPP_(my_pv_escape) + +#if defined(NEED_pv_escape) || defined(NEED_pv_escape_GLOBAL) + +char * +DPPP_(my_pv_escape)(pTHX_ SV *dsv, char const * const str, + const STRLEN count, const STRLEN max, + STRLEN * const escaped, const U32 flags) +{ + const char esc = flags & PERL_PV_ESCAPE_RE ? '%' : '\\'; + const char dq = flags & PERL_PV_ESCAPE_QUOTE ? '"' : esc; + char octbuf[32] = "%123456789ABCDF"; + STRLEN wrote = 0; + STRLEN chsize = 0; + STRLEN readsize = 1; +#if defined(is_utf8_string) && defined(utf8_to_uvchr) + bool isuni = flags & PERL_PV_ESCAPE_UNI ? 1 : 0; +#endif + const char *pv = str; + const char * const end = pv + count; + octbuf[0] = esc; + + if (!(flags & PERL_PV_ESCAPE_NOCLEAR)) + sv_setpvs(dsv, ""); + +#if defined(is_utf8_string) && defined(utf8_to_uvchr) + if ((flags & PERL_PV_ESCAPE_UNI_DETECT) && is_utf8_string((U8*)pv, count)) + isuni = 1; +#endif + + for (; pv < end && (!max || wrote < max) ; pv += readsize) { + const UV u = +#if defined(is_utf8_string) && defined(utf8_to_uvchr) + isuni ? utf8_to_uvchr((U8*)pv, &readsize) : +#endif + (U8)*pv; + const U8 c = (U8)u & 0xFF; + + if (u > 255 || (flags & PERL_PV_ESCAPE_ALL)) { + if (flags & PERL_PV_ESCAPE_FIRSTCHAR) + chsize = my_snprintf(octbuf, sizeof octbuf, + "%" UVxf, u); + else + chsize = my_snprintf(octbuf, sizeof octbuf, + "%cx{%" UVxf "}", esc, u); + } else if (flags & PERL_PV_ESCAPE_NOBACKSLASH) { + chsize = 1; + } else { + if (c == dq || c == esc || !isPRINT(c)) { + chsize = 2; + switch (c) { + case '\\' : /* fallthrough */ + case '%' : if (c == esc) + octbuf[1] = esc; + else + chsize = 1; + break; + case '\v' : octbuf[1] = 'v'; break; + case '\t' : octbuf[1] = 't'; break; + case '\r' : octbuf[1] = 'r'; break; + case '\n' : octbuf[1] = 'n'; break; + case '\f' : octbuf[1] = 'f'; break; + case '"' : if (dq == '"') + octbuf[1] = '"'; + else + chsize = 1; + break; + default: chsize = my_snprintf(octbuf, sizeof octbuf, + pv < end && isDIGIT((U8)*(pv+readsize)) + ? "%c%03o" : "%c%o", esc, c); + } + } else { + chsize = 1; + } + } + if (max && wrote + chsize > max) { + break; + } else if (chsize > 1) { + sv_catpvn(dsv, octbuf, chsize); + wrote += chsize; + } else { + char tmp[2]; + my_snprintf(tmp, sizeof tmp, "%c", c); + sv_catpvn(dsv, tmp, 1); + wrote++; + } + if (flags & PERL_PV_ESCAPE_FIRSTCHAR) + break; + } + if (escaped != NULL) + *escaped= pv - str; + return SvPVX(dsv); +} + +#endif +#endif + +#ifndef pv_pretty +#if defined(NEED_pv_pretty) +static char * DPPP_(my_pv_pretty)(pTHX_ SV * dsv, char const * const str, const STRLEN count, const STRLEN max, char const * const start_color, char const * const end_color, const U32 flags); +static +#else +extern char * DPPP_(my_pv_pretty)(pTHX_ SV * dsv, char const * const str, const STRLEN count, const STRLEN max, char const * const start_color, char const * const end_color, const U32 flags); +#endif + +#ifdef pv_pretty +# undef pv_pretty +#endif +#define pv_pretty(a,b,c,d,e,f,g) DPPP_(my_pv_pretty)(aTHX_ a,b,c,d,e,f,g) +#define Perl_pv_pretty DPPP_(my_pv_pretty) + +#if defined(NEED_pv_pretty) || defined(NEED_pv_pretty_GLOBAL) + +char * +DPPP_(my_pv_pretty)(pTHX_ SV *dsv, char const * const str, const STRLEN count, + const STRLEN max, char const * const start_color, char const * const end_color, + const U32 flags) +{ + const U8 dq = (flags & PERL_PV_PRETTY_QUOTE) ? '"' : '%'; + STRLEN escaped; + + if (!(flags & PERL_PV_PRETTY_NOCLEAR)) + sv_setpvs(dsv, ""); + + if (dq == '"') + sv_catpvs(dsv, "\""); + else if (flags & PERL_PV_PRETTY_LTGT) + sv_catpvs(dsv, "<"); + + if (start_color != NULL) + sv_catpv(dsv, D_PPP_CONSTPV_ARG(start_color)); + + pv_escape(dsv, str, count, max, &escaped, flags | PERL_PV_ESCAPE_NOCLEAR); + + if (end_color != NULL) + sv_catpv(dsv, D_PPP_CONSTPV_ARG(end_color)); + + if (dq == '"') + sv_catpvs(dsv, "\""); + else if (flags & PERL_PV_PRETTY_LTGT) + sv_catpvs(dsv, ">"); + + if ((flags & PERL_PV_PRETTY_ELLIPSES) && escaped < count) + sv_catpvs(dsv, "..."); + + return SvPVX(dsv); +} + +#endif +#endif + +#ifndef pv_display +#if defined(NEED_pv_display) +static char * DPPP_(my_pv_display)(pTHX_ SV * dsv, const char * pv, STRLEN cur, STRLEN len, STRLEN pvlim); +static +#else +extern char * DPPP_(my_pv_display)(pTHX_ SV * dsv, const char * pv, STRLEN cur, STRLEN len, STRLEN pvlim); +#endif + +#ifdef pv_display +# undef pv_display +#endif +#define pv_display(a,b,c,d,e) DPPP_(my_pv_display)(aTHX_ a,b,c,d,e) +#define Perl_pv_display DPPP_(my_pv_display) + +#if defined(NEED_pv_display) || defined(NEED_pv_display_GLOBAL) + +char * +DPPP_(my_pv_display)(pTHX_ SV *dsv, const char *pv, STRLEN cur, STRLEN len, STRLEN pvlim) +{ + pv_pretty(dsv, pv, cur, pvlim, NULL, NULL, PERL_PV_PRETTY_DUMP); + if (len > cur && pv[cur] == '\0') + sv_catpvs(dsv, "\\0"); + return SvPVX(dsv); +} + +#endif +#endif + +#endif /* _P_P_PORTABILITY_H_ */ + +/* End of File ppport.h */ diff --git a/cpan/dist/PathTools/t/Functions.t b/cpan/dist/PathTools/t/Functions.t new file mode 100644 index 00000000..122c529a --- /dev/null +++ b/cpan/dist/PathTools/t/Functions.t @@ -0,0 +1,19 @@ +#!/usr/bin/perl -w + +use Test::More tests => 15; +BEGIN {use_ok('File::Spec::Functions', ':ALL');} + +is(canonpath('a/b/c'), File::Spec->canonpath('a/b/c')); +is(case_tolerant(), File::Spec->case_tolerant()); +is(catdir(), File::Spec->catdir()); +is(catdir('a'), File::Spec->catdir('a')); +is(catdir('a','b'), File::Spec->catdir('a','b')); +is(catdir('a','b','c'), File::Spec->catdir('a','b','c')); +is(catfile(), File::Spec->catfile()); +is(catfile('a'), File::Spec->catfile('a')); +is(catfile('a','b'), File::Spec->catfile('a','b')); +is(catfile('a','b','c'), File::Spec->catfile('a','b','c')); +is(curdir(), File::Spec->curdir()); +is(devnull(), File::Spec->devnull()); +is(rootdir(), File::Spec->rootdir()); +is(updir(), File::Spec->updir()); diff --git a/cpan/dist/PathTools/t/Spec-taint.t b/cpan/dist/PathTools/t/Spec-taint.t new file mode 100644 index 00000000..ef4f1ee3 --- /dev/null +++ b/cpan/dist/PathTools/t/Spec-taint.t @@ -0,0 +1,17 @@ +#!./perl -Tw +# Testing File::Spec under taint mode. + +use strict; + +chdir 't' unless $ENV{PERL_CORE}; + +use File::Spec; +use lib File::Spec->catdir('t', 'lib'); +use Test::More tests => 2; + +use Scalar::Util qw/tainted/; + +my $ret; +eval { $ret = File::Spec->tmpdir }; +is( $@, '', "tmpdir should not explode under taint mode" ); +ok( !tainted($ret), "its return value should not be tainted" ); diff --git a/cpan/dist/PathTools/t/Spec.t b/cpan/dist/PathTools/t/Spec.t new file mode 100644 index 00000000..74c18aac --- /dev/null +++ b/cpan/dist/PathTools/t/Spec.t @@ -0,0 +1,841 @@ +#!/usr/bin/perl -w + +use strict; +use Test::More; + +require_ok('File::Spec'); + +require Cwd; + +my $vms_unix_rpt; + +if ($^O eq 'VMS') { + if (eval 'require VMS::Feature') { + $vms_unix_rpt = VMS::Feature::current("filename_unix_report"); + } else { + my $unix_rpt = $ENV{'DECC$FILENAME_UNIX_REPORT'} || ''; + $vms_unix_rpt = $unix_rpt =~ /^[ET1]/i; + } +} + + +my $skip_exception = "Needs VMS::Filespec (and thus VMS)" ; + +eval { + require VMS::Filespec ; +} ; + +if ( $@ ) { + # Not pretty, but it allows testing of things not implemented solely + # on VMS. It might be better to change File::Spec::VMS to do this, + # making it more usable when running on (say) Unix but working with + # VMS paths. + eval qq- + sub File::Spec::VMS::vmsify { die "$skip_exception" } + sub File::Spec::VMS::unixify { die "$skip_exception" } + sub File::Spec::VMS::vmspath { die "$skip_exception" } + - ; + $INC{"VMS/Filespec.pm"} = 1 ; +} + +foreach (qw(Unix Win32 VMS OS2 Mac Epoc Cygwin)) { + require_ok("File::Spec::$_"); +} + +# Each element in this array is a single test. Storing them this way makes +# maintenance easy, and should be OK since perl should be pretty functional +# before these tests are run. + +my @tests = ( +# [ Function , Expected , Platform ] + +[ "Unix->case_tolerant()", '0' ], + +[ "Unix->catfile('a','b','c')", 'a/b/c' ], +[ "Unix->catfile('a','b','./c')", 'a/b/c' ], +[ "Unix->catfile('./a','b','c')", 'a/b/c' ], +[ "Unix->catfile('c')", 'c' ], +[ "Unix->catfile('./c')", 'c' ], +[ "Unix->catfile('a', 'b'.chr(0xaf))", 'a/b'.chr(0xaf) ], +($] >= 5.008 ? ( +[ "Unix->catfile('a', do { my \$x = 'b'.chr(0xaf); use utf8 (); utf8::upgrade(\$x); \$x })", 'a/b'.chr(0xaf) ], +) : ()), +[ "Unix->catfile(substr('foo', 2))", 'o' ], + +[ "Unix->splitpath('file')", ',,file' ], +[ "Unix->splitpath('/d1/d2/d3/')", ',/d1/d2/d3/,' ], +[ "Unix->splitpath('d1/d2/d3/')", ',d1/d2/d3/,' ], +[ "Unix->splitpath('/d1/d2/d3/.')", ',/d1/d2/d3/.,' ], +[ "Unix->splitpath('/d1/d2/d3/..')", ',/d1/d2/d3/..,' ], +[ "Unix->splitpath('/d1/d2/d3/.file')", ',/d1/d2/d3/,.file' ], +[ "Unix->splitpath('d1/d2/d3/file')", ',d1/d2/d3/,file' ], +[ "Unix->splitpath('/../../d1/')", ',/../../d1/,' ], +[ "Unix->splitpath('/././d1/')", ',/././d1/,' ], + +[ "Unix->catpath('','','file')", 'file' ], +[ "Unix->catpath('','/d1/d2/d3/','')", '/d1/d2/d3/' ], +[ "Unix->catpath('','d1/d2/d3/','')", 'd1/d2/d3/' ], +[ "Unix->catpath('','/d1/d2/d3/.','')", '/d1/d2/d3/.' ], +[ "Unix->catpath('','/d1/d2/d3/..','')", '/d1/d2/d3/..' ], +[ "Unix->catpath('','/d1/d2/d3/','.file')", '/d1/d2/d3/.file' ], +[ "Unix->catpath('','d1/d2/d3/','file')", 'd1/d2/d3/file' ], +[ "Unix->catpath('','/../../d1/','')", '/../../d1/' ], +[ "Unix->catpath('','/././d1/','')", '/././d1/' ], +[ "Unix->catpath('d1','d2/d3/','')", 'd2/d3/' ], +[ "Unix->catpath('d1','d2','d3/')", 'd2/d3/' ], + +[ "Unix->splitdir('')", '' ], +[ "Unix->splitdir('/d1/d2/d3/')", ',d1,d2,d3,' ], +[ "Unix->splitdir('d1/d2/d3/')", 'd1,d2,d3,' ], +[ "Unix->splitdir('/d1/d2/d3')", ',d1,d2,d3' ], +[ "Unix->splitdir('d1/d2/d3')", 'd1,d2,d3' ], + +[ "Unix->catdir()", '' ], +[ "Unix->catdir('')", '/' ], +[ "Unix->catdir('/')", '/' ], +[ "Unix->catdir('','d1','d2','d3','')", '/d1/d2/d3' ], +[ "Unix->catdir('d1','d2','d3','')", 'd1/d2/d3' ], +[ "Unix->catdir('','d1','d2','d3')", '/d1/d2/d3' ], +[ "Unix->catdir('d1','d2','d3')", 'd1/d2/d3' ], +# QNX is POSIXly special +[ "Unix->catdir('/','d2/d3')", ( $^O =~ m!^(nto|qnx)! ? '//d2/d3' : '/d2/d3' ) ], +[ "Unix->catdir('a', 'b'.chr(0xaf))", 'a/b'.chr(0xaf) ], +($] >= 5.008 ? ( +[ "Unix->catdir('a', do { my \$x = 'b'.chr(0xaf); use utf8 (); utf8::upgrade(\$x); \$x })", 'a/b'.chr(0xaf) ], +) : ()), + +[ "Unix->canonpath('///../../..//./././a//b/.././c/././')", '/a/b/../c' ], +[ "Unix->canonpath('')", '' ], +# rt.perl.org 27052 +[ "Unix->canonpath('a/../../b/c')", 'a/../../b/c' ], +[ "Unix->canonpath('/')", '/' ], +[ "Unix->canonpath('///')", '/' ], +[ "Unix->canonpath('/.')", '/' ], +[ "Unix->canonpath('/./')", '/' ], +[ "Unix->canonpath('///.')", '/' ], +[ "Unix->canonpath('///.///')", '/' ], +[ "Unix->canonpath('///..')", '/' ], +[ "Unix->canonpath('///..///')", '/' ], +[ "Unix->canonpath('///..///.///..///')", '/' ], +[ "Unix->canonpath('.')", '.' ], +[ "Unix->canonpath('.///')", '.' ], +[ "Unix->canonpath('.///.')", '.' ], +[ "Unix->canonpath('.///.///')", '.' ], +[ "Unix->canonpath('..')", '..' ], +[ "Unix->canonpath('..///')", '..' ], +[ "Unix->canonpath('../..')", '../..' ], +[ "Unix->canonpath('../../')", '../..' ], +[ "Unix->canonpath('..///.///..///')", '../..' ], +[ "Unix->canonpath('///../../..//./././a//b/.././c/././')", '/a/b/../c' ], +[ "Unix->canonpath('a/../../b/c')", 'a/../../b/c' ], +[ "Unix->canonpath('a///..///..///b////c')", 'a/../../b/c' ], +[ "Unix->canonpath('.///a///.///..///.///..///.///b///.////c///.')", 'a/../../b/c' ], +[ "Unix->canonpath('/a/./')", '/a' ], +[ "Unix->canonpath('/a/.')", '/a' ], +[ "Unix->canonpath('/../../')", '/' ], +[ "Unix->canonpath('/../..')", '/' ], +[ "Unix->canonpath('/foo', '/bar')", '/foo' ], +[ "Unix->canonpath('///a'.chr(0xaf))", '/a'.chr(0xaf) ], +($] >= 5.008 ? ( +[ "Unix->canonpath(do { my \$x = '///a'.chr(0xaf); use utf8 (); utf8::upgrade(\$x); \$x })", '/a'.chr(0xaf) ], +) : ()), + +[ "Unix->abs2rel('/t1/t2/t3','/t1/t2/t3')", '.' ], +[ "Unix->abs2rel('/t1/t2/t4','/t1/t2/t3')", '../t4' ], +[ "Unix->abs2rel('/t1/t2','/t1/t2/t3')", '..' ], +[ "Unix->abs2rel('/t1/t2/t3/t4','/t1/t2/t3')", 't4' ], +[ "Unix->abs2rel('/t4/t5/t6','/t1/t2/t3')", '../../../t4/t5/t6' ], +#[ "Unix->abs2rel('../t4','/t1/t2/t3')", '../t4' ], +[ "Unix->abs2rel('/','/t1/t2/t3')", '../../..' ], +[ "Unix->abs2rel('///','/t1/t2/t3')", '../../..' ], +[ "Unix->abs2rel('/.','/t1/t2/t3')", '../../..' ], +[ "Unix->abs2rel('/./','/t1/t2/t3')", '../../..' ], +#[ "Unix->abs2rel('../t4','/t1/t2/t3')", '../t4' ], +[ "Unix->abs2rel('/t1/t2/t3', '/')", 't1/t2/t3' ], +[ "Unix->abs2rel('/t1/t2/t3', '/t1')", 't2/t3' ], +[ "Unix->abs2rel('t1/t2/t3', 't1')", 't2/t3' ], +[ "Unix->abs2rel('t1/t2/t3', 't4')", '../t1/t2/t3' ], + [ "Unix->abs2rel('.', '.')", '.' ], + [ "Unix->abs2rel('/', '/')", '.' ], + [ "Unix->abs2rel('../t1', 't2/t3')", '../../../t1' ], + [ "Unix->abs2rel('t1', 't2/../t3')", '../t1' ], + +[ "Unix->rel2abs('t4','/t1/t2/t3')", '/t1/t2/t3/t4' ], +[ "Unix->rel2abs('t4/t5','/t1/t2/t3')", '/t1/t2/t3/t4/t5' ], +[ "Unix->rel2abs('.','/t1/t2/t3')", '/t1/t2/t3' ], +[ "Unix->rel2abs('..','/t1/t2/t3')", '/t1/t2/t3/..' ], +[ "Unix->rel2abs('../t4','/t1/t2/t3')", '/t1/t2/t3/../t4' ], +[ "Unix->rel2abs('/t1','/t1/t2/t3')", '/t1' ], + +[ "Win32->case_tolerant()", '1' ], +[ "Win32->rootdir()", '\\' ], + +[ "Win32->splitpath('file')", ',,file' ], +[ "Win32->splitpath('\\d1/d2\\d3/')", ',\\d1/d2\\d3/,' ], +[ "Win32->splitpath('d1/d2\\d3/')", ',d1/d2\\d3/,' ], +[ "Win32->splitpath('\\d1/d2\\d3/.')", ',\\d1/d2\\d3/.,' ], +[ "Win32->splitpath('\\d1/d2\\d3/..')", ',\\d1/d2\\d3/..,' ], +[ "Win32->splitpath('\\d1/d2\\d3/.file')", ',\\d1/d2\\d3/,.file' ], +[ "Win32->splitpath('\\d1/d2\\d3/file')", ',\\d1/d2\\d3/,file' ], +[ "Win32->splitpath('d1/d2\\d3/file')", ',d1/d2\\d3/,file' ], +[ "Win32->splitpath('C:\\d1/d2\\d3/')", 'C:,\\d1/d2\\d3/,' ], +[ "Win32->splitpath('C:d1/d2\\d3/')", 'C:,d1/d2\\d3/,' ], +[ "Win32->splitpath('C:\\d1/d2\\d3/file')", 'C:,\\d1/d2\\d3/,file' ], +[ "Win32->splitpath('C:d1/d2\\d3/file')", 'C:,d1/d2\\d3/,file' ], +[ "Win32->splitpath('C:\\../d2\\d3/file')", 'C:,\\../d2\\d3/,file' ], +[ "Win32->splitpath('C:../d2\\d3/file')", 'C:,../d2\\d3/,file' ], +[ "Win32->splitpath('\\../..\\d1/')", ',\\../..\\d1/,' ], +[ "Win32->splitpath('\\./.\\d1/')", ',\\./.\\d1/,' ], +[ "Win32->splitpath('\\\\node\\share\\d1/d2\\d3/')", '\\\\node\\share,\\d1/d2\\d3/,' ], +[ "Win32->splitpath('\\\\node\\share\\d1/d2\\d3/file')", '\\\\node\\share,\\d1/d2\\d3/,file' ], +[ "Win32->splitpath('\\\\node\\share\\d1/d2\\file')", '\\\\node\\share,\\d1/d2\\,file' ], +[ "Win32->splitpath('file',1)", ',file,' ], +[ "Win32->splitpath('\\d1/d2\\d3/',1)", ',\\d1/d2\\d3/,' ], +[ "Win32->splitpath('d1/d2\\d3/',1)", ',d1/d2\\d3/,' ], +[ "Win32->splitpath('\\\\node\\share\\d1/d2\\d3/',1)", '\\\\node\\share,\\d1/d2\\d3/,' ], + +[ "Win32->catpath('','','file')", 'file' ], +[ "Win32->catpath('','\\d1/d2\\d3/','')", '\\d1/d2\\d3/' ], +[ "Win32->catpath('','d1/d2\\d3/','')", 'd1/d2\\d3/' ], +[ "Win32->catpath('','\\d1/d2\\d3/.','')", '\\d1/d2\\d3/.' ], +[ "Win32->catpath('','\\d1/d2\\d3/..','')", '\\d1/d2\\d3/..' ], +[ "Win32->catpath('','\\d1/d2\\d3/','.file')", '\\d1/d2\\d3/.file' ], +[ "Win32->catpath('','\\d1/d2\\d3/','file')", '\\d1/d2\\d3/file' ], +[ "Win32->catpath('','d1/d2\\d3/','file')", 'd1/d2\\d3/file' ], +[ "Win32->catpath('C:','\\d1/d2\\d3/','')", 'C:\\d1/d2\\d3/' ], +[ "Win32->catpath('C:','d1/d2\\d3/','')", 'C:d1/d2\\d3/' ], +[ "Win32->catpath('C:','\\d1/d2\\d3/','file')", 'C:\\d1/d2\\d3/file' ], +[ "Win32->catpath('C:','d1/d2\\d3/','file')", 'C:d1/d2\\d3/file' ], +[ "Win32->catpath('C:','\\../d2\\d3/','file')", 'C:\\../d2\\d3/file' ], +[ "Win32->catpath('C:','../d2\\d3/','file')", 'C:../d2\\d3/file' ], +[ "Win32->catpath('','\\../..\\d1/','')", '\\../..\\d1/' ], +[ "Win32->catpath('','\\./.\\d1/','')", '\\./.\\d1/' ], +[ "Win32->catpath('\\\\node\\share','\\d1/d2\\d3/','')", '\\\\node\\share\\d1/d2\\d3/' ], +[ "Win32->catpath('\\\\node\\share','\\d1/d2\\d3/','file')", '\\\\node\\share\\d1/d2\\d3/file' ], +[ "Win32->catpath('\\\\node\\share','\\d1/d2\\','file')", '\\\\node\\share\\d1/d2\\file' ], + +[ "Win32->splitdir('')", '' ], +[ "Win32->splitdir('\\d1/d2\\d3/')", ',d1,d2,d3,' ], +[ "Win32->splitdir('d1/d2\\d3/')", 'd1,d2,d3,' ], +[ "Win32->splitdir('\\d1/d2\\d3')", ',d1,d2,d3' ], +[ "Win32->splitdir('d1/d2\\d3')", 'd1,d2,d3' ], + +[ "Win32->catdir()", '' ], +[ "Win32->catdir('')", '\\' ], +[ "Win32->catdir('/')", '\\' ], +[ "Win32->catdir('/', '../')", '\\' ], +[ "Win32->catdir('/', '..\\')", '\\' ], +[ "Win32->catdir('\\', '../')", '\\' ], +[ "Win32->catdir('\\', '..\\')", '\\' ], +[ "Win32->catdir('//d1','d2')", '\\\\d1\\d2' ], +[ "Win32->catdir('\\d1\\','d2')", '\\d1\\d2' ], +[ "Win32->catdir('\\d1','d2')", '\\d1\\d2' ], +[ "Win32->catdir('\\d1','\\d2')", '\\d1\\d2' ], +[ "Win32->catdir('\\d1','\\d2\\')", '\\d1\\d2' ], +[ "Win32->catdir('','/d1','d2')", '\\d1\\d2' ], +[ "Win32->catdir('','','/d1','d2')", '\\d1\\d2' ], +[ "Win32->catdir('','//d1','d2')", '\\d1\\d2' ], +[ "Win32->catdir('','','//d1','d2')", '\\d1\\d2' ], +[ "Win32->catdir('','d1','','d2','')", '\\d1\\d2' ], +[ "Win32->catdir('','d1','d2','d3','')", '\\d1\\d2\\d3' ], +[ "Win32->catdir('d1','d2','d3','')", 'd1\\d2\\d3' ], +[ "Win32->catdir('','d1','d2','d3')", '\\d1\\d2\\d3' ], +[ "Win32->catdir('d1','d2','d3')", 'd1\\d2\\d3' ], +[ "Win32->catdir('A:/d1','d2','d3')", 'A:\\d1\\d2\\d3' ], +[ "Win32->catdir('A:/d1','d2','d3','')", 'A:\\d1\\d2\\d3' ], +#[ "Win32->catdir('A:/d1','B:/d2','d3','')", 'A:\\d1\\d2\\d3' ], +[ "Win32->catdir('A:/d1','B:/d2','d3','')", 'A:\\d1\\B:\\d2\\d3' ], +[ "Win32->catdir('A:/')", 'A:\\' ], +[ "Win32->catdir('\\', 'foo')", '\\foo' ], +[ "Win32->catdir('','','..')", '\\' ], +[ "Win32->catdir('A:', 'foo')", 'A:\\foo' ], + +[ "Win32->catfile('a','b','c')", 'a\\b\\c' ], +[ "Win32->catfile('a','b','.\\c')", 'a\\b\\c' ], +[ "Win32->catfile('.\\a','b','c')", 'a\\b\\c' ], +[ "Win32->catfile('c')", 'c' ], +[ "Win32->catfile('.\\c')", 'c' ], +[ "Win32->catfile('a/..','../b')", '..\\b' ], +[ "Win32->catfile('A:', 'foo')", 'A:\\foo' ], + + +[ "Win32->canonpath('')", '' ], +[ "Win32->canonpath('a:')", 'A:' ], +[ "Win32->canonpath('A:f')", 'A:f' ], +[ "Win32->canonpath('A:/')", 'A:\\' ], +# rt.perl.org 27052 +[ "Win32->canonpath('a\\..\\..\\b\\c')", '..\\b\\c' ], +[ "Win32->canonpath('//a\\b//c')", '\\\\a\\b\\c' ], +[ "Win32->canonpath('/a/..../c')", '\\a\\....\\c' ], +[ "Win32->canonpath('//a/b\\c')", '\\\\a\\b\\c' ], +[ "Win32->canonpath('////')", '\\' ], +[ "Win32->canonpath('//')", '\\' ], +[ "Win32->canonpath('/.')", '\\' ], +[ "Win32->canonpath('//a/b/../../c')", '\\\\a\\b\\c' ], +[ "Win32->canonpath('//a/b/c/../d')", '\\\\a\\b\\d' ], +[ "Win32->canonpath('//a/b/c/../../d')",'\\\\a\\b\\d' ], +[ "Win32->canonpath('//a/b/c/.../d')", '\\\\a\\b\\d' ], +[ "Win32->canonpath('/a/b/c/../../d')", '\\a\\d' ], +[ "Win32->canonpath('/a/b/c/.../d')", '\\a\\d' ], +[ "Win32->canonpath('\\../temp\\')", '\\temp' ], +[ "Win32->canonpath('\\../')", '\\' ], +[ "Win32->canonpath('\\..\\')", '\\' ], +[ "Win32->canonpath('/../')", '\\' ], +[ "Win32->canonpath('/..\\')", '\\' ], +[ "Win32->canonpath('d1/../foo')", 'foo' ], + +# FakeWin32 subclass (see below) just sets CWD to C:\one\two and getdcwd('D') to D:\alpha\beta + +[ "FakeWin32->abs2rel('/t1/t2/t3','/t1/t2/t3')", '.' ], +[ "FakeWin32->abs2rel('/t1/t2/t4','/t1/t2/t3')", '..\\t4' ], +[ "FakeWin32->abs2rel('/t1/t2','/t1/t2/t3')", '..' ], +[ "FakeWin32->abs2rel('/t1/t2/t3/t4','/t1/t2/t3')", 't4' ], +[ "FakeWin32->abs2rel('/t4/t5/t6','/t1/t2/t3')", '..\\..\\..\\t4\\t5\\t6' ], +[ "FakeWin32->abs2rel('../t4','/t1/t2/t3')", '..\\..\\..\\one\\t4' ], # Uses _cwd() +[ "FakeWin32->abs2rel('/','/t1/t2/t3')", '..\\..\\..' ], +[ "FakeWin32->abs2rel('///','/t1/t2/t3')", '..\\..\\..' ], +[ "FakeWin32->abs2rel('/.','/t1/t2/t3')", '..\\..\\..' ], +[ "FakeWin32->abs2rel('/./','/t1/t2/t3')", '..\\..\\..' ], +[ "FakeWin32->abs2rel('\\\\a/t1/t2/t4','/t2/t3')", '\\\\a\\t1\\t2\\t4' ], +[ "FakeWin32->abs2rel('//a/t1/t2/t4','/t2/t3')", '\\\\a\\t1\\t2\\t4' ], +[ "FakeWin32->abs2rel('A:/t1/t2/t3','A:/t1/t2/t3')", '.' ], +[ "FakeWin32->abs2rel('A:/t1/t2/t3/t4','A:/t1/t2/t3')", 't4' ], +[ "FakeWin32->abs2rel('A:/t1/t2/t3','A:/t1/t2/t3/t4')", '..' ], +[ "FakeWin32->abs2rel('A:/t1/t2/t3','B:/t1/t2/t3')", 'A:\\t1\\t2\\t3' ], +[ "FakeWin32->abs2rel('A:/t1/t2/t3/t4','B:/t1/t2/t3')", 'A:\\t1\\t2\\t3\\t4' ], +[ "FakeWin32->abs2rel('E:/foo/bar/baz')", 'E:\\foo\\bar\\baz' ], +[ "FakeWin32->abs2rel('C:/one/two/three')", 'three' ], +[ "FakeWin32->abs2rel('C:\\Windows\\System32', 'C:\\')", 'Windows\System32' ], +[ "FakeWin32->abs2rel('\\\\computer2\\share3\\foo.txt', '\\\\computer2\\share3')", 'foo.txt' ], +[ "FakeWin32->abs2rel('C:\\one\\two\\t\\asd1\\', 't\\asd\\')", '..\\asd1' ], +[ "FakeWin32->abs2rel('\\one\\two', 'A:\\foo')", 'C:\\one\\two' ], + +[ "FakeWin32->rel2abs('temp','C:/')", 'C:\\temp' ], +[ "FakeWin32->rel2abs('temp','C:/a')", 'C:\\a\\temp' ], +[ "FakeWin32->rel2abs('temp','C:/a/')", 'C:\\a\\temp' ], +[ "FakeWin32->rel2abs('../','C:/')", 'C:\\' ], +[ "FakeWin32->rel2abs('../','C:/a')", 'C:\\' ], +[ "FakeWin32->rel2abs('\\foo','C:/a')", 'C:\\foo' ], +[ "FakeWin32->rel2abs('temp','//prague_main/work/')", '\\\\prague_main\\work\\temp' ], +[ "FakeWin32->rel2abs('../temp','//prague_main/work/')", '\\\\prague_main\\work\\temp' ], +[ "FakeWin32->rel2abs('temp','//prague_main/work')", '\\\\prague_main\\work\\temp' ], +[ "FakeWin32->rel2abs('../','//prague_main/work')", '\\\\prague_main\\work' ], +[ "FakeWin32->rel2abs('D:foo.txt')", 'D:\\alpha\\beta\\foo.txt' ], + +[ "VMS->case_tolerant()", '1' ], + +[ "VMS->catfile('a','b','c')", $vms_unix_rpt ? 'a/b/c' : '[.a.b]c' ], +[ "VMS->catfile('a','b','[]c')", $vms_unix_rpt ? 'a/b/c' : '[.a.b]c' ], +[ "VMS->catfile('[.a]','b','c')", $vms_unix_rpt ? 'a/b/c' : '[.a.b]c' ], +[ "VMS->catfile('a/b/','c')", $vms_unix_rpt ? 'a/b/c' : '[.a.b]c' ], +[ "VMS->catfile('c')", 'c' ], +[ "VMS->catfile('[]c')", 'c' ], + +[ "VMS->catfile('0','b','c')", $vms_unix_rpt ? '0/b/c' : '[.0.b]c' ], +[ "VMS->catfile('a','0','c')", $vms_unix_rpt ? 'a/0/c' : '[.a.0]c' ], +[ "VMS->catfile('a','b','0')", $vms_unix_rpt ? 'a/b/0' : '[.a.b]0' ], +[ "VMS->catfile('0','0','c')", $vms_unix_rpt ? '0/0/c' : '[.0.0]c' ], +[ "VMS->catfile('a','0','0')", $vms_unix_rpt ? 'a/0/0' : '[.a.0]0' ], +[ "VMS->catfile('0','b','0')", $vms_unix_rpt ? '0/b/0' : '[.0.b]0' ], +[ "VMS->catfile('0','0','0')", $vms_unix_rpt ? '0/0/0' : '[.0.0]0' ], + + +[ "VMS->splitpath('file')", ',,file' ], +[ "VMS->splitpath('[d1.d2.d3]')", ',[d1.d2.d3],' ], +[ "VMS->splitpath('[.d1.d2.d3]')", ',[.d1.d2.d3],' ], +[ "VMS->splitpath('[d1.d2.d3]file')", ',[d1.d2.d3],file' ], +[ "VMS->splitpath('d1/d2/d3/file')", + $vms_unix_rpt ? ',d1/d2/d3/,file' : ',[.d1.d2.d3],file' ], +[ "VMS->splitpath('/d1/d2/d3/file')", + $vms_unix_rpt ? ',/d1/d2/d3/,file' : 'd1:,[d2.d3],file' ], +[ "VMS->splitpath('[.d1.d2.d3]file')", ',[.d1.d2.d3],file' ], +[ "VMS->splitpath('node::volume:[d1.d2.d3]')", 'node::volume:,[d1.d2.d3],' ], +[ "VMS->splitpath('node::volume:[d1.d2.d3]file')", 'node::volume:,[d1.d2.d3],file' ], +[ "VMS->splitpath('node\"access_spec\"::volume:[d1.d2.d3]')", 'node"access_spec"::volume:,[d1.d2.d3],' ], +[ "VMS->splitpath('node\"access_spec\"::volume:[d1.d2.d3]file')", 'node"access_spec"::volume:,[d1.d2.d3],file' ], + +[ "VMS->splitpath('[]')", ',[],' ], +[ "VMS->splitpath('[-]')", ',[-],' ], +[ "VMS->splitpath('[]file')", ',[],file' ], +[ "VMS->splitpath('[-]file')", ',[-],file' ], +[ "VMS->splitpath('')", ',,' ], +[ "VMS->splitpath('0')", ',,0' ], +[ "VMS->splitpath('[0]')", ',[0],' ], +[ "VMS->splitpath('[.0]')", ',[.0],' ], +[ "VMS->splitpath('[0.0.0]')", ',[0.0.0],' ], +[ "VMS->splitpath('[.0.0.0]')", ',[.0.0.0],' ], +[ "VMS->splitpath('[0]0')", ',[0],0' ], +[ "VMS->splitpath('[0.0.0]0')", ',[0.0.0],0' ], +[ "VMS->splitpath('[.0.0.0]0')", ',[.0.0.0],0' ], +[ "VMS->splitpath('0/0')", $vms_unix_rpt ? ',0/,0' : ',[.0],0' ], +[ "VMS->splitpath('0/0/0')", $vms_unix_rpt ? ',0/0/,0' : ',[.0.0],0' ], +[ "VMS->splitpath('/0/0')", $vms_unix_rpt ? ',/0/,0' : '0:,[000000],0' ], +[ "VMS->splitpath('/0/0/0')", $vms_unix_rpt ? ',/0/0/,0' : '0:,[0],0' ], +[ "VMS->splitpath('d1',1)", ',d1,' ], +# $no_file tests +[ "VMS->splitpath('[d1.d2.d3]',1)", ',[d1.d2.d3],' ], +[ "VMS->splitpath('[.d1.d2.d3]',1)", ',[.d1.d2.d3],' ], +[ "VMS->splitpath('d1/d2/d3',1)", $vms_unix_rpt ? ',d1/d2/d3,' : ',[.d1.d2.d3],' ], +[ "VMS->splitpath('/d1/d2/d3',1)", $vms_unix_rpt ? ',/d1/d2/d3,' : 'd1:,[d2.d3],' ], +[ "VMS->splitpath('node::volume:[d1.d2.d3]',1)", 'node::volume:,[d1.d2.d3],' ], +[ "VMS->splitpath('node\"access_spec\"::volume:[d1.d2.d3]',1)", 'node"access_spec"::volume:,[d1.d2.d3],' ], +[ "VMS->splitpath('[]',1)", ',[],' ], +[ "VMS->splitpath('[-]',1)", ',[-],' ], +[ "VMS->splitpath('',1)", ',,' ], +[ "VMS->splitpath('0',1)", ',0,' ], +[ "VMS->splitpath('[0]',1)", ',[0],' ], +[ "VMS->splitpath('[.0]',1)", ',[.0],' ], +[ "VMS->splitpath('[0.0.0]',1)", ',[0.0.0],' ], +[ "VMS->splitpath('[.0.0.0]',1)", ',[.0.0.0],' ], +[ "VMS->splitpath('0/0',1)", $vms_unix_rpt ? ',0/0,' : ',[.0.0],' ], +[ "VMS->splitpath('0/0/0',1)", $vms_unix_rpt ? ',0/0/0,' : ',[.0.0.0],' ], +[ "VMS->splitpath('/0/0',1)", $vms_unix_rpt ? ',/0/0,' : '0:,[000000.0],' ], +[ "VMS->splitpath('/0/0/0',1)", $vms_unix_rpt ? ',/0/0/0,' : '0:,[0.0],' ], + +[ "VMS->catpath('','','file')", 'file' ], +[ "VMS->catpath('','[d1.d2.d3]','')", '[d1.d2.d3]' ], +[ "VMS->catpath('','[.d1.d2.d3]','')", '[.d1.d2.d3]' ], +[ "VMS->catpath('','[d1.d2.d3]','file')", '[d1.d2.d3]file' ], +[ "VMS->catpath('','[.d1.d2.d3]','file')", '[.d1.d2.d3]file' ], +[ "VMS->catpath('','d1/d2/d3','file')", + $vms_unix_rpt ? 'd1/d2/d3/file' : '[.d1.d2.d3]file' ], +[ "VMS->catpath('v','d1/d2/d3','file')", 'v:[.d1.d2.d3]file' ], +[ "VMS->catpath('v','','file')", 'v:file' ], +[ "VMS->catpath('v','w:[d1.d2.d3]','file')", 'v:[d1.d2.d3]file' ], +[ "VMS->catpath('node::volume:','[d1.d2.d3]','')", 'node::volume:[d1.d2.d3]' ], +[ "VMS->catpath('node::volume:','[d1.d2.d3]','file')", 'node::volume:[d1.d2.d3]file' ], +[ "VMS->catpath('node\"access_spec\"::volume:','[d1.d2.d3]','')", 'node"access_spec"::volume:[d1.d2.d3]' ], +[ "VMS->catpath('node\"access_spec\"::volume:','[d1.d2.d3]','file')", 'node"access_spec"::volume:[d1.d2.d3]file' ], + +[ "VMS->canonpath('')", '' ], +[ "VMS->canonpath('volume:[d1]file')", $vms_unix_rpt ? '/volume/d1/file' : 'volume:[d1]file' ], +[ "VMS->canonpath('volume:[d1.-.d2.][d3.d4.-]')", $vms_unix_rpt ? '/volume/d2/d3/' : 'volume:[d2.d3]' ], +[ "VMS->canonpath('volume:[000000.d1]d2.dir;1')", $vms_unix_rpt ? '/volume/d1/d2.dir.1' : 'volume:[d1]d2.dir;1' ], +[ "VMS->canonpath('volume:[d1.d2.d3]file.txt')", $vms_unix_rpt ? '/volume/d1/d2/d3/file.txt' : 'volume:[d1.d2.d3]file.txt' ], +[ "VMS->canonpath('[d1.d2.d3]file.txt')", $vms_unix_rpt ? '/sys$disk/d1/d2/d3/file.txt' : '[d1.d2.d3]file.txt' ], +[ "VMS->canonpath('volume:[-.d1.d2.d3]file.txt')", $vms_unix_rpt ? '/volume/../d1/d2/d3/file.txt' : 'volume:[-.d1.d2.d3]file.txt' ], +[ "VMS->canonpath('[-.d1.d2.d3]file.txt')", $vms_unix_rpt ? '../d1/d2/d3/file.txt' : '[-.d1.d2.d3]file.txt' ], +[ "VMS->canonpath('volume:[--.d1.d2.d3]file.txt')", $vms_unix_rpt ? '/volume/../../d1/d2/d3/file.txt' : 'volume:[--.d1.d2.d3]file.txt' ], +[ "VMS->canonpath('[--.d1.d2.d3]file.txt')", $vms_unix_rpt ? '../../d1/d2/d3/file.txt' : '[--.d1.d2.d3]file.txt' ], +[ "VMS->canonpath('volume:[d1.-.d2.d3]file.txt')", $vms_unix_rpt ? '/volume/d2/d3/file.txt' : 'volume:[d2.d3]file.txt' ], +[ "VMS->canonpath('[d1.-.d2.d3]file.txt')", $vms_unix_rpt ? '/sys$disk/d2/d3/file.txt' : '[d2.d3]file.txt' ], +[ "VMS->canonpath('volume:[d1.--.d2.d3]file.txt')", $vms_unix_rpt ? '/volume/../d2/d3/file.txt' : 'volume:[-.d2.d3]file.txt' ], +[ "VMS->canonpath('[d1.--.d2.d3]file.txt')", $vms_unix_rpt ? '../d2/d3/file.txt' : '[-.d2.d3]file.txt' ], +[ "VMS->canonpath('volume:[d1.d2.-.d3]file.txt')", $vms_unix_rpt ? '/volume/d1/d3/file.txt' : 'volume:[d1.d3]file.txt' ], +[ "VMS->canonpath('[d1.d2.-.d3]file.txt')", $vms_unix_rpt ? '/sys$disk/d1/d3/file.txt' : '[d1.d3]file.txt' ], +[ "VMS->canonpath('volume:[d1.d2.--.d3]file.txt')", $vms_unix_rpt ? '/volume/d3/file.txt' : 'volume:[d3]file.txt' ], +[ "VMS->canonpath('[d1.d2.--.d3]file.txt')", $vms_unix_rpt ? '/sys$disk/d3/file.txt' : '[d3]file.txt' ], +[ "VMS->canonpath('volume:[d1.d2.d3.-]file.txt')", $vms_unix_rpt ? '/volume/d1/d2/file.txt' : 'volume:[d1.d2]file.txt' ], +[ "VMS->canonpath('[d1.d2.d3.-]file.txt')", $vms_unix_rpt ? '/sys$disk/d1/d2/file.txt' : '[d1.d2]file.txt' ], +[ "VMS->canonpath('volume:[d1.d2.d3.--]file.txt')", $vms_unix_rpt ? '/volume/d1/file.txt' : 'volume:[d1]file.txt' ], +[ "VMS->canonpath('[d1.d2.d3.--]file.txt')", $vms_unix_rpt ? '/sys$disk/d1/file.txt' : '[d1]file.txt' ], +[ "VMS->canonpath('volume:[d1.000000.][000000.][d3.--]file.txt')", $vms_unix_rpt ? '/volume/d1/file.txt' + : 'volume:[d1]file.txt' ], +[ "VMS->canonpath('[d1.000000.][000000.][d3.--]file.txt')", $vms_unix_rpt ? '/sys$disk/d1/file.txt' + : '[d1]file.txt' ], +[ "VMS->canonpath('volume:[d1.000000.][000000.][d2.000000]file.txt')", $vms_unix_rpt ? '/volume/d1/000000/d2/000000/file.txt' + : 'volume:[d1.000000.d2.000000]file.txt' ], +[ "VMS->canonpath('[d1.000000.][000000.][d2.000000]file.txt')", $vms_unix_rpt ? '/sys$disk/d1/000000/d2/000000/file.txt' + : '[d1.000000.d2.000000]file.txt' ], +[ "VMS->canonpath('volume:[d1.000000.][000000.][d3.--.000000]file.txt')", $vms_unix_rpt ? '/volume/d1/000000/file.txt' + : 'volume:[d1.000000]file.txt' ], +[ "VMS->canonpath('[d1.000000.][000000.][d3.--.000000]file.txt')", $vms_unix_rpt ? '/sys$disk/d1/000000/file.txt' + : '[d1.000000]file.txt' ], +[ "VMS->canonpath('volume:[d1.000000.][000000.][-.-.000000]file.txt')", $vms_unix_rpt ? '/volume/file.txt' + : 'volume:[000000]file.txt' ], +[ "VMS->canonpath('[d1.000000.][000000.][--.-.000000]file.txt')", $vms_unix_rpt ? '../file.txt' : '[-.000000]file.txt' ], +[ "VMS->canonpath('[d1.d2.--]file')", $vms_unix_rpt ? '../file.txt' : '[000000]file' ], +# During the Perl 5.8 era, FS::Unix stopped eliminating redundant path elements, so mimic that here. +[ "VMS->canonpath('a/../../b/c.dat')", $vms_unix_rpt ? 'a/../../b/c.dat' : '[-.b]c.dat' ], +[ "VMS->canonpath('^<test^.new.-.caret^ escapes^>')", '^<test^.new.-.caret^ escapes^>' ], + +[ "VMS->splitdir('')", '' ], +[ "VMS->splitdir('[]')", '' ], +[ "VMS->splitdir('d1.d2.d3')", 'd1,d2,d3' ], +[ "VMS->splitdir('[d1.d2.d3]')", 'd1,d2,d3' ], +[ "VMS->splitdir('.d1.d2.d3')", 'd1,d2,d3' ], +[ "VMS->splitdir('[.d1.d2.d3]')", 'd1,d2,d3' ], +[ "VMS->splitdir('.-.d2.d3')", '-,d2,d3' ], +[ "VMS->splitdir('[.-.d2.d3]')", '-,d2,d3' ], +[ "VMS->splitdir('[d1.d2]')", 'd1,d2' ], +[ "VMS->splitdir('[d1-.--d2]')", 'd1-,--d2' ], +[ "VMS->splitdir('[d1---.-.d2]')", 'd1---,-,d2' ], +[ "VMS->splitdir('[d1.---.d2]')", 'd1,-,-,-,d2' ], +[ "VMS->splitdir('[d1---d2]')", 'd1---d2' ], +[ "VMS->splitdir('[d1.][000000.d2]')", 'd1,d2' ], +[ "VMS->splitdir('[.d1.d2^.d3]')", 'd1,d2^.d3' ], + +[ "VMS->catdir('')", '' ], +[ "VMS->catdir('foo')", $vms_unix_rpt ? 'foo' : '[.foo]' ], +[ "VMS->catdir('d1','d2','d3')", $vms_unix_rpt ? 'd1/d2/d3' : '[.d1.d2.d3]' ], +[ "VMS->catdir('d1','d2/','d3')", $vms_unix_rpt ? 'd1/d2/d3' : '[.d1.d2.d3]' ], +[ "VMS->catdir('','d1','d2','d3')",$vms_unix_rpt ? '/d1/d2/d3' : '[.d1.d2.d3]' ], +[ "VMS->catdir('','-','d2','d3')", $vms_unix_rpt ? '-/d2/d3' : '[-.d2.d3]' ], +[ "VMS->catdir('','-','','d3')", $vms_unix_rpt ? '-/d3' : '[-.d3]' ], +[ "VMS->catdir('dir.dir','d2.dir','d3.dir')", $vms_unix_rpt ? 'dir/d2/d3' + : '[.dir.d2.d3]' ], +[ "VMS->catdir('[.name]')", $vms_unix_rpt ? 'name/' : '[.name]' ], +[ "VMS->catdir('[.name]','[.name]')", $vms_unix_rpt ? 'name/name' :'[.name.name]' ], +[ "VMS->catdir('/a/b/c','[-]')", $vms_unix_rpt ? '/a/b/c/..' : 'a:[b]'], +[ "VMS->catdir('a:[b.c]','..')", $vms_unix_rpt ? '/a/b/c/..' : 'a:[b]'], + +[ "VMS->abs2rel('node::volume:[t1.t2.t3]','node::volume:[t1.t2.t3]')", $vms_unix_rpt ? './' : '[]' ], +[ "VMS->abs2rel('node::volume:[t1.t2.t3]','[t1.t2.t3]')", $vms_unix_rpt ? '/node//volume/t1/t2/t3/' : 'node::volume:[t1.t2.t3]' ], +[ "VMS->abs2rel('node::volume:[t1.t2.t4]','node::volume:[t1.t2.t3]')", $vms_unix_rpt ? '../t4/' : '[-.t4]' ], +[ "VMS->abs2rel('node::volume:[t1.t2.t4]','[t1.t2.t3]')", $vms_unix_rpt ? '/node//volume/t1/t2/t4/' : 'node::volume:[t1.t2.t4]' ], +[ "VMS->abs2rel('[t1.t2.t3]','[t1.t2.t3]')", $vms_unix_rpt ? './' : '[]' ], +[ "VMS->abs2rel('[t1.t2.t3]file','[t1.t2.t3]')", 'file' ], +[ "VMS->abs2rel('[t1.t2.t3]file','[t1.t2]')", $vms_unix_rpt ? 't3/file' : '[.t3]file' ], +[ "VMS->abs2rel('v:[t1.t2.t3]file','v:[t1.t2]')", $vms_unix_rpt ? 't3/file' : '[.t3]file' ], +[ "VMS->abs2rel('[t1.t2.t4]','[t1.t2.t3]')", $vms_unix_rpt ? '../t4/' : '[-.t4]' ], +[ "VMS->abs2rel('[t1.t2]file','[t1.t2.t3]')", $vms_unix_rpt ? '../file' : '[-]file' ], +[ "VMS->abs2rel('[t1.t2.t3.t4]','[t1.t2.t3]')", $vms_unix_rpt ? 't4/' : '[.t4]' ], +[ "VMS->abs2rel('[t4.t5.t6]','[t1.t2.t3]')", $vms_unix_rpt ? '../../../t4/t5/t6/' : '[---.t4.t5.t6]' ], +[ "VMS->abs2rel('[000000]','[t1.t2.t3]')", $vms_unix_rpt ? '../../../' : '[---]' ], +[ "VMS->abs2rel('a:[t1.t2.t4]','a:[t1.t2.t3]')", $vms_unix_rpt ? '../t4/' : '[-.t4]' ], +[ "VMS->abs2rel('a:[t1.t2.t4]','[t1.t2.t3]')", $vms_unix_rpt ? '/a/t1/t2/t4/' : 'a:[t1.t2.t4]' ], +[ "VMS->abs2rel('[a.-.b.c.-]','[t1.t2.t3]')", $vms_unix_rpt ? '../../../b/' : '[---.b]' ], + +[ "VMS->rel2abs('[.t4]','[t1.t2.t3]')", $vms_unix_rpt ? '/sys$disk/t1/t2/t3/t4/' : '[t1.t2.t3.t4]' ], +[ "VMS->rel2abs('[.t4.t5]','[t1.t2.t3]')", $vms_unix_rpt ? '/sys$disk/t1/t2/t3/t4/t5/' : '[t1.t2.t3.t4.t5]' ], +[ "VMS->rel2abs('[]','[t1.t2.t3]')", $vms_unix_rpt ? '/sys$disk/t1/t2/t3/' : '[t1.t2.t3]' ], +[ "VMS->rel2abs('[-]','[t1.t2.t3]')", $vms_unix_rpt ? '/sys$disk/t1/t2/' : '[t1.t2]' ], +[ "VMS->rel2abs('[-.t4]','[t1.t2.t3]')", $vms_unix_rpt ? '/sys$disk/t1/t2/t4/' : '[t1.t2.t4]' ], +[ "VMS->rel2abs('[t1]','[t1.t2.t3]')", $vms_unix_rpt ? '/sys$disk/t1/' : '[t1]' ], + +[ "VMS->file_name_is_absolute('foo:')", '1' ], +[ "VMS->file_name_is_absolute('foo:bar.dat')", '1' ], +[ "VMS->file_name_is_absolute('foo:[000000]bar.dat')", '1' ], + +[ "OS2->case_tolerant()", '1' ], + +[ "OS2->catdir('A:/d1','B:/d2','d3','')", 'A:/d1/B:/d2/d3' ], + +[ "OS2->catfile('a','b','c')", 'a/b/c' ], +[ "OS2->catfile('a','b','./c')", 'a/b/c' ], +[ "OS2->catfile('./a','b','c')", 'a/b/c' ], +[ "OS2->catfile('c')", 'c' ], +[ "OS2->catfile('./c')", 'c' ], + +[ "OS2->catdir('/', '../')", '/' ], +[ "OS2->catdir('/', '..\\')", '/' ], +[ "OS2->catdir('\\', '../')", '/' ], +[ "OS2->catdir('\\', '..\\')", '/' ], + +[ "Mac->case_tolerant()", '1' ], + +[ "Mac->catpath('','','')", '' ], +[ "Mac->catpath('',':','')", ':' ], +[ "Mac->catpath('','::','')", '::' ], + +[ "Mac->catpath('hd','','')", 'hd:' ], +[ "Mac->catpath('hd:','','')", 'hd:' ], +[ "Mac->catpath('hd:',':','')", 'hd:' ], +[ "Mac->catpath('hd:','::','')", 'hd::' ], + +[ "Mac->catpath('hd','','file')", 'hd:file' ], +[ "Mac->catpath('hd',':','file')", 'hd:file' ], +[ "Mac->catpath('hd','::','file')", 'hd::file' ], +[ "Mac->catpath('hd',':::','file')", 'hd:::file' ], + +[ "Mac->catpath('hd:','',':file')", 'hd:file' ], +[ "Mac->catpath('hd:',':',':file')", 'hd:file' ], +[ "Mac->catpath('hd:','::',':file')", 'hd::file' ], +[ "Mac->catpath('hd:',':::',':file')", 'hd:::file' ], + +[ "Mac->catpath('hd:','d1','file')", 'hd:d1:file' ], +[ "Mac->catpath('hd:',':d1:',':file')", 'hd:d1:file' ], +[ "Mac->catpath('hd:','hd:d1','')", 'hd:d1:' ], + +[ "Mac->catpath('','d1','')", ':d1:' ], +[ "Mac->catpath('',':d1','')", ':d1:' ], +[ "Mac->catpath('',':d1:','')", ':d1:' ], + +[ "Mac->catpath('','d1','file')", ':d1:file' ], +[ "Mac->catpath('',':d1:',':file')", ':d1:file' ], + +[ "Mac->catpath('','','file')", 'file' ], +[ "Mac->catpath('','',':file')", 'file' ], # ! +[ "Mac->catpath('',':',':file')", ':file' ], # ! + + +[ "Mac->splitpath(':')", ',:,' ], +[ "Mac->splitpath('::')", ',::,' ], +[ "Mac->splitpath(':::')", ',:::,' ], + +[ "Mac->splitpath('file')", ',,file' ], +[ "Mac->splitpath(':file')", ',:,file' ], + +[ "Mac->splitpath('d1',1)", ',:d1:,' ], # dir, not volume +[ "Mac->splitpath(':d1',1)", ',:d1:,' ], +[ "Mac->splitpath(':d1:',1)", ',:d1:,' ], +[ "Mac->splitpath(':d1:')", ',:d1:,' ], +[ "Mac->splitpath(':d1:d2:d3:')", ',:d1:d2:d3:,' ], +[ "Mac->splitpath(':d1:d2:d3:',1)", ',:d1:d2:d3:,' ], +[ "Mac->splitpath(':d1:file')", ',:d1:,file' ], +[ "Mac->splitpath('::d1:file')", ',::d1:,file' ], + +[ "Mac->splitpath('hd:', 1)", 'hd:,,' ], +[ "Mac->splitpath('hd:')", 'hd:,,' ], +[ "Mac->splitpath('hd:d1:d2:')", 'hd:,:d1:d2:,' ], +[ "Mac->splitpath('hd:d1:d2',1)", 'hd:,:d1:d2:,' ], +[ "Mac->splitpath('hd:d1:d2:file')", 'hd:,:d1:d2:,file' ], +[ "Mac->splitpath('hd:d1:d2::file')", 'hd:,:d1:d2::,file' ], +[ "Mac->splitpath('hd::d1:d2:file')", 'hd:,::d1:d2:,file' ], # invalid path +[ "Mac->splitpath('hd:file')", 'hd:,,file' ], + +[ "Mac->splitdir()", '' ], +[ "Mac->splitdir('')", '' ], +[ "Mac->splitdir(':')", ':' ], +[ "Mac->splitdir('::')", '::' ], +[ "Mac->splitdir(':::')", '::,::' ], +[ "Mac->splitdir(':::d1:d2')", '::,::,d1,d2' ], + +[ "Mac->splitdir(':d1:d2:d3::')", 'd1,d2,d3,::'], +[ "Mac->splitdir(':d1:d2:d3:')", 'd1,d2,d3' ], +[ "Mac->splitdir(':d1:d2:d3')", 'd1,d2,d3' ], + +# absolute paths in splitdir() work, but you'd better use splitpath() +[ "Mac->splitdir('hd:')", 'hd:' ], +[ "Mac->splitdir('hd::')", 'hd:,::' ], # invalid path, but it works +[ "Mac->splitdir('hd::d1:')", 'hd:,::,d1' ], # invalid path, but it works +[ "Mac->splitdir('hd:d1:d2:::')", 'hd:,d1,d2,::,::' ], +[ "Mac->splitdir('hd:d1:d2::')", 'hd:,d1,d2,::' ], +[ "Mac->splitdir('hd:d1:d2:')", 'hd:,d1,d2' ], +[ "Mac->splitdir('hd:d1:d2')", 'hd:,d1,d2' ], +[ "Mac->splitdir('hd:d1::d2::')", 'hd:,d1,::,d2,::' ], + +[ "Mac->catdir()", '' ], +[ "Mac->catdir(':')", ':' ], + +[ "Mac->catdir(':', ':')", ':' ], +[ "Mac->catdir(':', '')", ':' ], + +[ "Mac->catdir(':', '::')", '::' ], + +[ "Mac->catdir('::', '')", '::' ], +[ "Mac->catdir('::', ':')", '::' ], + +[ "Mac->catdir('::', '::')", ':::' ], + +[ "Mac->catdir(':d1')", ':d1:' ], +[ "Mac->catdir(':d1:')", ':d1:' ], +[ "Mac->catdir(':d1','d2')", ':d1:d2:' ], +[ "Mac->catdir(':d1',':d2')", ':d1:d2:' ], +[ "Mac->catdir(':d1',':d2:')", ':d1:d2:' ], +[ "Mac->catdir(':d1',':d2::')", ':d1:d2::' ], +[ "Mac->catdir(':',':d1',':d2')", ':d1:d2:' ], +[ "Mac->catdir('::',':d1',':d2')", '::d1:d2:' ], +[ "Mac->catdir('::','::',':d1',':d2')", ':::d1:d2:' ], +[ "Mac->catdir(':',':',':d1',':d2')", ':d1:d2:' ], +[ "Mac->catdir('::',':',':d1',':d2')", '::d1:d2:' ], + +[ "Mac->catdir('d1')", ':d1:' ], +[ "Mac->catdir('d1','d2','d3')", ':d1:d2:d3:' ], +[ "Mac->catdir('d1','d2/','d3')", ':d1:d2/:d3:' ], +[ "Mac->catdir('d1','',':d2')", ':d1:d2:' ], +[ "Mac->catdir('d1',':',':d2')", ':d1:d2:' ], +[ "Mac->catdir('d1','::',':d2')", ':d1::d2:' ], +[ "Mac->catdir('d1',':::',':d2')", ':d1:::d2:' ], +[ "Mac->catdir('d1','::','::',':d2')", ':d1:::d2:' ], +[ "Mac->catdir('d1','d2')", ':d1:d2:' ], +[ "Mac->catdir('d1','d2', '')", ':d1:d2:' ], +[ "Mac->catdir('d1','d2', ':')", ':d1:d2:' ], +[ "Mac->catdir('d1','d2', '::')", ':d1:d2::' ], +[ "Mac->catdir('d1','d2','','')", ':d1:d2:' ], +[ "Mac->catdir('d1','d2',':','::')", ':d1:d2::' ], +[ "Mac->catdir('d1','d2','::','::')", ':d1:d2:::' ], +[ "Mac->catdir('d1',':d2')", ':d1:d2:' ], +[ "Mac->catdir('d1',':d2:')", ':d1:d2:' ], + +[ "Mac->catdir('hd:',':d1')", 'hd:d1:' ], +[ "Mac->catdir('hd:d1:',':d2')", 'hd:d1:d2:' ], +[ "Mac->catdir('hd:','d1')", 'hd:d1:' ], +[ "Mac->catdir('hd:d1:',':d2')", 'hd:d1:d2:' ], +[ "Mac->catdir('hd:d1:',':d2:')", 'hd:d1:d2:' ], + +[ "Mac->catfile()", '' ], +[ "Mac->catfile('')", '' ], +[ "Mac->catfile(':')", ':' ], +[ "Mac->catfile(':', '')", ':' ], + +[ "Mac->catfile('d1','d2','file')", ':d1:d2:file' ], +[ "Mac->catfile('d1','d2',':file')", ':d1:d2:file' ], +[ "Mac->catfile('file')", 'file' ], +[ "Mac->catfile(':', 'file')", ':file' ], + +[ "Mac->canonpath('')", '' ], +[ "Mac->canonpath(':')", ':' ], +[ "Mac->canonpath('::')", '::' ], +[ "Mac->canonpath('a::')", 'a::' ], +[ "Mac->canonpath(':a::')", ':a::' ], + +[ "Mac->abs2rel('hd:d1:d2:','hd:d1:d2:')", ':' ], +[ "Mac->abs2rel('hd:d1:d2:','hd:d1:d2:file')", ':' ], # ignore base's file portion +[ "Mac->abs2rel('hd:d1:d2:file','hd:d1:d2:')", ':file' ], +[ "Mac->abs2rel('hd:d1:','hd:d1:d2:')", '::' ], +[ "Mac->abs2rel('hd:d3:','hd:d1:d2:')", ':::d3:' ], +[ "Mac->abs2rel('hd:d3:','hd:d1:d2::')", '::d3:' ], +[ "Mac->abs2rel('hd:d1:d4:d5:','hd:d1::d2:d3::')", '::d1:d4:d5:' ], +[ "Mac->abs2rel('hd:d1:d4:d5:','hd:d1::d2:d3:')", ':::d1:d4:d5:' ], # first, resolve updirs in base +[ "Mac->abs2rel('hd:d1:d3:','hd:d1:d2:')", '::d3:' ], +[ "Mac->abs2rel('hd:d1::d3:','hd:d1:d2:')", ':::d3:' ], +[ "Mac->abs2rel('hd:d3:','hd:d1:d2:')", ':::d3:' ], # same as above +[ "Mac->abs2rel('hd:d1:d2:d3:','hd:d1:d2:')", ':d3:' ], +[ "Mac->abs2rel('hd:d1:d2:d3::','hd:d1:d2:')", ':d3::' ], +[ "Mac->abs2rel('hd1:d3:d4:d5:','hd2:d1:d2:')", 'hd1:d3:d4:d5:'], # volume mismatch +[ "Mac->abs2rel('hd:','hd:d1:d2:')", ':::' ], + +[ "Mac->rel2abs(':d3:','hd:d1:d2:')", 'hd:d1:d2:d3:' ], +[ "Mac->rel2abs(':d3:d4:','hd:d1:d2:')", 'hd:d1:d2:d3:d4:' ], +[ "Mac->rel2abs('','hd:d1:d2:')", '' ], +[ "Mac->rel2abs('::','hd:d1:d2:')", 'hd:d1:d2::' ], +[ "Mac->rel2abs('::','hd:d1:d2:file')", 'hd:d1:d2::' ],# ignore base's file portion +[ "Mac->rel2abs(':file','hd:d1:d2:')", 'hd:d1:d2:file' ], +[ "Mac->rel2abs('::file','hd:d1:d2:')", 'hd:d1:d2::file' ], +[ "Mac->rel2abs('::d3:','hd:d1:d2:')", 'hd:d1:d2::d3:' ], +[ "Mac->rel2abs('hd:','hd:d1:d2:')", 'hd:' ], # path already absolute +[ "Mac->rel2abs('hd:d3:file','hd:d1:d2:')", 'hd:d3:file' ], +[ "Mac->rel2abs('hd:d3:','hd:d1:file')", 'hd:d3:' ], + +[ "Epoc->case_tolerant()", '1' ], + +[ "Epoc->canonpath('')", '' ], +[ "Epoc->canonpath('///../../..//./././a//b/.././c/././')", '/a/b/../c' ], +[ "Epoc->canonpath('/./')", '/' ], +[ "Epoc->canonpath('/a/./')", '/a' ], + +# XXX Todo, copied from Unix, but fail. Should they? 2003-07-07 Tels +#[ "Epoc->canonpath('/a/.')", '/a' ], +#[ "Epoc->canonpath('/.')", '/' ], + +[ "Cygwin->case_tolerant()", '1' ], +[ "Cygwin->catfile('a','b','c')", 'a/b/c' ], +[ "Cygwin->catfile('a','b','./c')", 'a/b/c' ], +[ "Cygwin->catfile('./a','b','c')", 'a/b/c' ], +[ "Cygwin->catfile('c')", 'c' ], +[ "Cygwin->catfile('./c')", 'c' ], + +[ "Cygwin->splitpath('file')", ',,file' ], +[ "Cygwin->splitpath('/d1/d2/d3/')", ',/d1/d2/d3/,' ], +[ "Cygwin->splitpath('d1/d2/d3/')", ',d1/d2/d3/,' ], +[ "Cygwin->splitpath('/d1/d2/d3/.')", ',/d1/d2/d3/.,' ], +[ "Cygwin->splitpath('/d1/d2/d3/..')", ',/d1/d2/d3/..,' ], +[ "Cygwin->splitpath('/d1/d2/d3/.file')", ',/d1/d2/d3/,.file' ], +[ "Cygwin->splitpath('d1/d2/d3/file')", ',d1/d2/d3/,file' ], +[ "Cygwin->splitpath('/../../d1/')", ',/../../d1/,' ], +[ "Cygwin->splitpath('/././d1/')", ',/././d1/,' ], + +[ "Cygwin->catpath('','','file')", 'file' ], +[ "Cygwin->catpath('','/d1/d2/d3/','')", '/d1/d2/d3/' ], +[ "Cygwin->catpath('','d1/d2/d3/','')", 'd1/d2/d3/' ], +[ "Cygwin->catpath('','/d1/d2/d3/.','')", '/d1/d2/d3/.' ], +[ "Cygwin->catpath('','/d1/d2/d3/..','')", '/d1/d2/d3/..' ], +[ "Cygwin->catpath('','/d1/d2/d3/','.file')", '/d1/d2/d3/.file' ], +[ "Cygwin->catpath('','d1/d2/d3/','file')", 'd1/d2/d3/file' ], +[ "Cygwin->catpath('','/../../d1/','')", '/../../d1/' ], +[ "Cygwin->catpath('','/././d1/','')", '/././d1/' ], +[ "Cygwin->catpath('d1','d2/d3/','')", 'd2/d3/' ], +[ "Cygwin->catpath('d1','d2','d3/')", 'd2/d3/' ], + +[ "Cygwin->splitdir('')", '' ], +[ "Cygwin->splitdir('/d1/d2/d3/')", ',d1,d2,d3,' ], +[ "Cygwin->splitdir('d1/d2/d3/')", 'd1,d2,d3,' ], +[ "Cygwin->splitdir('/d1/d2/d3')", ',d1,d2,d3' ], +[ "Cygwin->splitdir('d1/d2/d3')", 'd1,d2,d3' ], + +[ "Cygwin->catdir()", '' ], +[ "Cygwin->catdir('/')", '/' ], +[ "Cygwin->catdir('','d1','d2','d3','')", '/d1/d2/d3' ], +[ "Cygwin->catdir('d1','d2','d3','')", 'd1/d2/d3' ], +[ "Cygwin->catdir('','d1','d2','d3')", '/d1/d2/d3' ], +[ "Cygwin->catdir('d1','d2','d3')", 'd1/d2/d3' ], +[ "Cygwin->catdir('/','d2/d3')", '/d2/d3' ], + +[ "Cygwin->canonpath('///../../..//./././a//b/.././c/././')", '/a/b/../c' ], +[ "Cygwin->canonpath('')", '' ], +[ "Cygwin->canonpath('a/../../b/c')", 'a/../../b/c' ], +[ "Cygwin->canonpath('/.')", '/' ], +[ "Cygwin->canonpath('/./')", '/' ], +[ "Cygwin->canonpath('/a/./')", '/a' ], +[ "Cygwin->canonpath('/a/.')", '/a' ], +[ "Cygwin->canonpath('/../../')", '/' ], +[ "Cygwin->canonpath('/../..')", '/' ], + +[ "Cygwin->abs2rel('/t1/t2/t3','/t1/t2/t3')", '.' ], +[ "Cygwin->abs2rel('/t1/t2/t4','/t1/t2/t3')", '../t4' ], +[ "Cygwin->abs2rel('/t1/t2','/t1/t2/t3')", '..' ], +[ "Cygwin->abs2rel('/t1/t2/t3/t4','/t1/t2/t3')", 't4' ], +[ "Cygwin->abs2rel('/t4/t5/t6','/t1/t2/t3')", '../../../t4/t5/t6' ], +#[ "Cygwin->abs2rel('../t4','/t1/t2/t3')", '../t4' ], +[ "Cygwin->abs2rel('/','/t1/t2/t3')", '../../..' ], +[ "Cygwin->abs2rel('///','/t1/t2/t3')", '../../..' ], +[ "Cygwin->abs2rel('/.','/t1/t2/t3')", '../../..' ], +[ "Cygwin->abs2rel('/./','/t1/t2/t3')", '../../..' ], +#[ "Cygwin->abs2rel('../t4','/t1/t2/t3')", '../t4' ], +[ "Cygwin->abs2rel('/t1/t2/t3', '/')", 't1/t2/t3' ], +[ "Cygwin->abs2rel('/t1/t2/t3', '/t1')", 't2/t3' ], +[ "Cygwin->abs2rel('t1/t2/t3', 't1')", 't2/t3' ], +[ "Cygwin->abs2rel('t1/t2/t3', 't4')", '../t1/t2/t3' ], + +[ "Cygwin->rel2abs('t4','/t1/t2/t3')", '/t1/t2/t3/t4' ], +[ "Cygwin->rel2abs('t4/t5','/t1/t2/t3')", '/t1/t2/t3/t4/t5' ], +[ "Cygwin->rel2abs('.','/t1/t2/t3')", '/t1/t2/t3' ], +[ "Cygwin->rel2abs('..','/t1/t2/t3')", '/t1/t2/t3/..' ], +[ "Cygwin->rel2abs('../t4','/t1/t2/t3')", '/t1/t2/t3/../t4' ], +[ "Cygwin->rel2abs('/t1','/t1/t2/t3')", '/t1' ], +[ "Cygwin->rel2abs('//t1/t2/t3','/foo')", '//t1/t2/t3' ], + +) ; + +can_ok('File::Spec::Win32', '_cwd'); + +{ + package File::Spec::FakeWin32; + use vars qw(@ISA); + @ISA = qw(File::Spec::Win32); + + sub _cwd { 'C:\\one\\two' } + + # Some funky stuff to override Cwd::getdcwd() for testing purposes, + # in the limited scope of the rel2abs() method. + if ($Cwd::VERSION && $Cwd::VERSION gt '2.17') { # Avoid a 'used only once' warning + local $^W; + *rel2abs = sub { + my $self = shift; + local $^W; + local *Cwd::getdcwd = sub { + return 'D:\alpha\beta' if $_[0] eq 'D:'; + return 'C:\one\two' if $_[0] eq 'C:'; + return; + }; + *Cwd::getdcwd = *Cwd::getdcwd; # Avoid a 'used only once' warning + return $self->SUPER::rel2abs(@_); + }; + *rel2abs = *rel2abs; # Avoid a 'used only once' warning + } +} + +# Tries a named function with the given args and compares the result against +# an expected result. Works with functions that return scalars or arrays. +for ( @tests ) { + my ($function, $expected) = @$_; + + $function =~ s#\\#\\\\#g ; + $function =~ s/^([^\$].*->)/File::Spec::$1/; + my $got = join ',', eval $function; + + SKIP: { + if ($@) { + skip "skip $function: $skip_exception", 1 + if $@ =~ /^\Q$skip_exception/; + is($@, '', $function); + } else { + is($got, $expected, $function); + } + } +} + +is +File::Spec::Unix->canonpath(), undef; + +done_testing(); diff --git a/cpan/dist/PathTools/t/abs2rel.t b/cpan/dist/PathTools/t/abs2rel.t new file mode 100644 index 00000000..5e33ab6c --- /dev/null +++ b/cpan/dist/PathTools/t/abs2rel.t @@ -0,0 +1,76 @@ +#!/usr/bin/perl -w + +use strict; +use Test::More; + +use Cwd qw(cwd getcwd abs_path); +use File::Spec(); +use File::Temp qw(tempdir); +use File::Path qw(make_path); + +my $startdir = cwd(); +my @files = ( 'anyfile', './anyfile', '../first_sub_dir/anyfile', '../second_sub_dir/second_file' ); + +for my $file (@files) { + test_rel2abs($file); +} + +sub test_rel2abs { + my $first_file = shift; + my $tdir = tempdir( CLEANUP => 1 ); + chdir $tdir or die "Unable to change to $tdir: $!"; + + my @subdirs = ( + 'first_sub_dir', + File::Spec->catdir('first_sub_dir', 'sub_sub_dir'), + 'second_sub_dir' + ); + make_path(@subdirs, { mode => 0711 }) + or die "Unable to make_path: $!"; + + open my $OUT2, '>', + File::Spec->catfile('second_sub_dir', 'second_file') + or die "Unable to open 'second_file' for writing: $!"; + print $OUT2 "Attempting to resolve RT #121360\n"; + close $OUT2 or die "Unable to close 'second_file' after writing: $!"; + + chdir 'first_sub_dir' + or die "Unable to change to 'first_sub_dir': $!"; + open my $OUT1, '>', $first_file + or die "Unable to open $first_file for writing: $!"; + print $OUT1 "Attempting to resolve RT #121360\n"; + close $OUT1 or die "Unable to close $first_file after writing: $!"; + + my $rel_path = $first_file; + my $rel_base = File::Spec->catdir(File::Spec->curdir(), 'sub_sub_dir'); + my $abs_path = File::Spec->rel2abs($rel_path); + my $abs_base = File::Spec->rel2abs($rel_base); + ok(-f $rel_path, "'$rel_path' is readable by effective uid/gid"); + ok(-f $abs_path, "'$abs_path' is readable by effective uid/gid"); + is_deeply( + [ (stat $rel_path)[0..5] ], + [ (stat $abs_path)[0..5] ], + "rel_path and abs_path stat same" + ); + ok(-d $rel_base, "'$rel_base' is a directory"); + ok(-d $abs_base, "'$abs_base' is a directory"); + is_deeply( + [ (stat $rel_base)[0..5] ], + [ (stat $abs_base)[0..5] ], + "rel_base and abs_base stat same" + ); + my $rr_link = File::Spec->abs2rel($rel_path, $rel_base); + my $ra_link = File::Spec->abs2rel($rel_path, $abs_base); + my $ar_link = File::Spec->abs2rel($abs_path, $rel_base); + my $aa_link = File::Spec->abs2rel($abs_path, $abs_base); + is($rr_link, $ra_link, + "rel_path-rel_base '$rr_link' = rel_path-abs_base '$ra_link'"); + is($ar_link, $aa_link, + "abs_path-rel_base '$ar_link' = abs_path-abs_base '$aa_link'"); + is($rr_link, $aa_link, + "rel_path-rel_base '$rr_link' = abs_path-abs_base '$aa_link'"); + + chdir $startdir or die "Unable to change back to $startdir: $!"; +} + +done_testing(); diff --git a/cpan/dist/PathTools/t/crossplatform.t b/cpan/dist/PathTools/t/crossplatform.t new file mode 100644 index 00000000..b7c76fc1 --- /dev/null +++ b/cpan/dist/PathTools/t/crossplatform.t @@ -0,0 +1,173 @@ +#!/usr/bin/perl -w + +use strict; +use File::Spec; +use lib File::Spec->catfile('t', 'lib'); +use Test::More; +local $|=1; + +my @platforms = qw(Cygwin Epoc Mac OS2 Unix VMS Win32); +my $tests_per_platform = 10; + +my $vms_unix_rpt = 0; +my $vms_efs = 0; +my $vms_unix_mode = 0; +my $vms_real_root = 0; + +if ($^O eq 'VMS') { + $vms_unix_mode = 0; + if (eval 'require VMS::Feature') { + $vms_unix_rpt = VMS::Feature::current("filename_unix_report"); + $vms_efs = VMS::Feature::current("efs_charset"); + } else { + my $unix_rpt = $ENV{'DECC$FILENAME_UNIX_REPORT'} || ''; + my $efs_charset = $ENV{'DECC$EFS_CHARSET'} || ''; + $vms_unix_rpt = $unix_rpt =~ /^[ET1]/i; + $vms_efs = $efs_charset =~ /^[ET1]/i; + } + + # Traditional VMS mode only if VMS is not in UNIX compatible mode. + $vms_unix_mode = ($vms_efs && $vms_unix_rpt); + + # If we are in UNIX mode, we may or may not have a real root. + if ($vms_unix_mode) { + my $rootdir = File::Spec->rootdir; + $vms_real_root = 1 if ($rootdir eq '/'); + } + +} + + +plan tests => 1 + @platforms * $tests_per_platform; + +my %volumes = ( + Mac => 'Macintosh HD', + OS2 => 'A:', + Win32 => 'A:', + VMS => 'v', + ); +my %other_vols = ( + Mac => 'Mounted Volume', + OS2 => 'B:', + Win32 => 'B:', + VMS => 'w', + ); + +ok 1, "Loaded"; + +foreach my $platform (@platforms) { + my $module = "File::Spec::$platform"; + + SKIP: + { + eval "require $module; 1"; + + skip "Can't load $module", $tests_per_platform + if $@; + + my $v = $volumes{$platform} || ''; + my $other_v = $other_vols{$platform} || ''; + + # Fake out the environment on MacOS and Win32 + no strict 'refs'; + my $save_w = $^W; + $^W = 0; + local *{"File::Spec::Mac::rootdir"} = sub { "Macintosh HD:" }; + local *{"File::Spec::Win32::_cwd"} = sub { "C:\\foo" }; + $^W = $save_w; + use strict 'refs'; + + + my ($file, $base, $result); + + $base = $module->catpath($v, $module->catdir('', 'foo'), ''); + $base = $module->catdir($module->rootdir, 'foo'); + + is $module->file_name_is_absolute($base), 1, "$base is absolute on $platform"; + + # splitdir('') -> () + my @result = $module->splitdir(''); + is @result, 0, "$platform->splitdir('') -> ()"; + + # canonpath() -> undef + $result = $module->canonpath(); + is $result, undef, "$platform->canonpath() -> undef"; + + # canonpath(undef) -> undef + $result = $module->canonpath(undef); + is $result, undef, "$platform->canonpath(undef) -> undef"; + + # abs2rel('A:/foo/bar', 'A:/foo') -> 'bar' + $file = $module->catpath($v, $module->catdir($module->rootdir, 'foo', 'bar'), 'file'); + $base = $module->catpath($v, $module->catdir($module->rootdir, 'foo'), ''); + $result = $module->catfile('bar', 'file'); + + if ($vms_unix_mode and $platform eq 'VMS') { + # test 56 special + # If VMS is in UNIX mode, so is the result, but having the volume + # parameter present forces the abs2rel into VMS mode. + $result = VMS::Filespec::vmsify($result); + $result =~ s/\.$//; + + # If we have a real root, then we are dealing with absolute directories + $result =~ s/\[\./\[/ if $vms_real_root; + } + + is $module->abs2rel($file, $base), $result, "$platform->abs2rel($file, $base)"; + + + # abs2rel('A:/foo/bar', 'B:/foo') -> 'A:/foo/bar' + $base = $module->catpath($other_v, $module->catdir($module->rootdir, 'foo'), ''); + $result = volumes_differ($module, $file, $base) ? $file : $module->catfile('bar', 'file'); + is $module->abs2rel($file, $base), $result, "$platform->abs2rel($file, $base)"; + + + # abs2rel('A:/foo/bar', '/foo') -> 'A:/foo/bar' + $base = $module->catpath('', $module->catdir($module->rootdir, 'foo'), ''); + $result = volumes_differ($module, $file, $base) ? $file : $module->catfile('bar', 'file'); + is $module->abs2rel($file, $base), $result, "$platform->abs2rel($file, $base)"; + + + # abs2rel('/foo/bar/file', 'A:/foo') -> '/foo/bar' + $file = $module->catpath('', $module->catdir($module->rootdir, 'foo', 'bar'), 'file'); + $base = $module->catpath($v, $module->catdir($module->rootdir, 'foo'), ''); + $result = volumes_differ($module, $file, $base) ? $module->rel2abs($file) : $module->catfile('bar', 'file'); + + if ($vms_unix_mode and $platform eq 'VMS') { + # test 59 special + # If VMS is in UNIX mode, so is the result, but having the volume + # parameter present forces the abs2rel into VMS mode. + $result = VMS::Filespec::vmsify($result); + } + + is $module->abs2rel($file, $base), $result, "$platform->abs2rel($file, $base)"; + + + # abs2rel('/foo/bar', 'B:/foo') -> '/foo/bar' + $base = $module->catpath($other_v, $module->catdir($module->rootdir, 'foo'), ''); + $result = volumes_differ($module, $file, $base) ? $module->rel2abs($file) : $module->catfile('bar', 'file'); + + if ($vms_unix_mode and $platform eq 'VMS') { + # test 60 special + # If VMS is in UNIX mode, so is the result, but having the volume + # parameter present forces the abs2rel into VMS mode. + $result = VMS::Filespec::vmsify($result); + } + + is $module->abs2rel($file, $base), $result, "$platform->abs2rel($file, $base)"; + + + # abs2rel('/foo/bar', '/foo') -> 'bar' + $base = $module->catpath('', $module->catdir($module->rootdir, 'foo'), ''); + $result = $module->catfile('bar', 'file'); + + is $module->abs2rel($file, $base), $result, "$platform->abs2rel($file, $base)"; + } +} + +sub volumes_differ { + my ($module, $one, $two) = @_; + my ($one_v) = $module->splitpath( $module->rel2abs($one) ); + my ($two_v) = $module->splitpath( $module->rel2abs($two) ); + return $one_v ne $two_v; +} diff --git a/cpan/dist/PathTools/t/cwd.t b/cpan/dist/PathTools/t/cwd.t new file mode 100644 index 00000000..57fd866f --- /dev/null +++ b/cpan/dist/PathTools/t/cwd.t @@ -0,0 +1,284 @@ +#!./perl -w + +use strict; + +use Cwd; + +chdir 't'; +@INC = '../../../lib' if $ENV{PERL_CORE}; + +use Config; +use File::Spec; +use File::Path; + +use lib File::Spec->catdir('t', 'lib'); +use Test::More; + +my $IsVMS = $^O eq 'VMS'; + +my $vms_unix_rpt = 0; +my $vms_efs = 0; +my $vms_mode = 0; + +if ($IsVMS) { + require VMS::Filespec; + use Carp; + use Carp::Heavy; + $vms_mode = 1; + if (eval 'require VMS::Feature') { + $vms_unix_rpt = VMS::Feature::current("filename_unix_report"); + $vms_efs = VMS::Feature::current("efs_charset"); + } else { + my $unix_rpt = $ENV{'DECC$FILENAME_UNIX_REPORT'} || ''; + my $efs_charset = $ENV{'DECC$EFS_CHARSET'} || ''; + $vms_unix_rpt = $unix_rpt =~ /^[ET1]/i; + $vms_efs = $efs_charset =~ /^[ET1]/i; + } + $vms_mode = 0 if ($vms_unix_rpt); +} + +my $tests = 31; +# _perl_abs_path() currently only works when the directory separator +# is '/', so don't test it when it won't work. +my $EXTRA_ABSPATH_TESTS = ($Config{prefix} =~ m/\//) && $^O ne 'cygwin'; +$tests += 4 if $EXTRA_ABSPATH_TESTS; +plan tests => $tests; + +SKIP: { + skip "no need to check for blib/ in the core", 1 if $ENV{PERL_CORE}; + like $INC{'Cwd.pm'}, qr{blib}i, "Cwd should be loaded from blib/ during testing"; +} + + +# check imports +can_ok('main', qw(cwd getcwd fastcwd fastgetcwd)); +ok( !defined(&chdir), 'chdir() not exported by default' ); +ok( !defined(&abs_path), ' nor abs_path()' ); +ok( !defined(&fast_abs_path), ' nor fast_abs_path()'); + +{ + my @fields = qw(PATH IFS CDPATH ENV BASH_ENV); + my $before = grep exists $ENV{$_}, @fields; + cwd(); + my $after = grep exists $ENV{$_}, @fields; + is($before, $after, "cwd() shouldn't create spurious entries in %ENV"); +} + +# XXX force Cwd to bootstrap its XSUBs since we have set @INC = "../lib" +# XXX and subsequent chdir()s can make them impossible to find +eval { fastcwd }; + +# Must find an external pwd (or equivalent) command. + +my $pwd = $^O eq 'MSWin32' ? "cmd" : "pwd"; +my $pwd_cmd = + ($^O eq "NetWare") ? + "cd" : + (grep { -x && -f } map { "$_/$pwd$Config{exe_ext}" } + split m/$Config{path_sep}/, $ENV{PATH})[0]; + +$pwd_cmd = 'SHOW DEFAULT' if $IsVMS; +if ($^O eq 'MSWin32') { + $pwd_cmd =~ s,/,\\,g; + $pwd_cmd = "$pwd_cmd /c cd"; +} +$pwd_cmd =~ s=\\=/=g if ($^O eq 'dos'); + +SKIP: { + skip "No native pwd command found to test against", 4 unless $pwd_cmd; + + print "# native pwd = '$pwd_cmd'\n"; + + local @ENV{qw(PATH IFS CDPATH ENV BASH_ENV)}; + my ($pwd_cmd_untainted) = $pwd_cmd =~ /^(.+)$/; # Untaint. + chomp(my $start = `$pwd_cmd_untainted`); + + # Win32's cd returns native C:\ style + $start =~ s,\\,/,g if ($^O eq 'MSWin32' || $^O eq "NetWare"); + if ($IsVMS) { + # DCL SHOW DEFAULT has leading spaces + $start =~ s/^\s+//; + + # When in UNIX report mode, need to convert to compare it. + if ($vms_unix_rpt) { + $start = VMS::Filespec::unixpath($start); + # Remove trailing slash. + $start =~ s#/$##; + } + } + SKIP: { + skip("'$pwd_cmd' failed, nothing to test against", 4) if $?; + skip("/afs seen, paths unlikely to match", 4) if $start =~ m|/afs/|; + + # Darwin's getcwd(3) (which Cwd.xs:bsd_realpath() uses which + # Cwd.pm:getcwd uses) has some magic related to the PWD + # environment variable: if PWD is set to a directory that + # looks about right (guess: has the same (dev,ino) as the '.'?), + # the PWD is returned. However, if that path contains + # symlinks, the path will not be equal to the one returned by + # /bin/pwd (which probably uses the usual walking upwards in + # the path -trick). This situation is easy to reproduce since + # /tmp is a symlink to /private/tmp. Therefore we invalidate + # the PWD to force getcwd(3) to (re)compute the cwd in full. + # Admittedly fixing this in the Cwd module would be better + # long-term solution but deleting $ENV{PWD} should not be + # done light-heartedly. --jhi + delete $ENV{PWD} if $^O eq 'darwin'; + + my $cwd = cwd; + my $getcwd = getcwd; + my $fastcwd = fastcwd; + my $fastgetcwd = fastgetcwd; + + is($cwd, $start, 'cwd()'); + is($getcwd, $start, 'getcwd()'); + is($fastcwd, $start, 'fastcwd()'); + is($fastgetcwd, $start, 'fastgetcwd()'); + } +} + +my @test_dirs = qw{_ptrslt_ _path_ _to_ _a_ _dir_}; +my $Test_Dir = File::Spec->catdir(@test_dirs); + +mkpath([$Test_Dir], 0, 0777); +Cwd::chdir $Test_Dir; + +foreach my $func (qw(cwd getcwd fastcwd fastgetcwd)) { + my $result = eval "$func()"; + is $@, ''; + dir_ends_with( $result, $Test_Dir, "$func()" ); +} + +{ + # Some versions of File::Path (e.g. that shipped with perl 5.8.5) + # call getcwd() with an argument (perhaps by calling it as a + # method?), so make sure that doesn't die. + is getcwd(), getcwd('foo'), "Call getcwd() with an argument"; +} + +# Cwd::chdir should also update $ENV{PWD} +dir_ends_with( $ENV{PWD}, $Test_Dir, 'Cwd::chdir() updates $ENV{PWD}' ); +my $updir = File::Spec->updir; + +for (1..@test_dirs) { + Cwd::chdir $updir; + print "#$ENV{PWD}\n"; +} + +rmtree($test_dirs[0], 0, 0); + +{ + my $check = ($vms_mode ? qr|\b((?i)t)\]$| : + qr|\bt$| ); + + like($ENV{PWD}, $check); +} + +{ + # Make sure abs_path() doesn't trample $ENV{PWD} + my $start_pwd = $ENV{PWD}; + mkpath([$Test_Dir], 0, 0777); + Cwd::abs_path($Test_Dir); + is $ENV{PWD}, $start_pwd; + rmtree($test_dirs[0], 0, 0); +} + +SKIP: { + skip "no symlinks on this platform", 2+$EXTRA_ABSPATH_TESTS unless $Config{d_symlink} && $^O !~ m!^(qnx|nto)!; + + my $file = "linktest"; + mkpath([$Test_Dir], 0, 0777); + symlink $Test_Dir, $file; + + my $abs_path = Cwd::abs_path($file); + my $fast_abs_path = Cwd::fast_abs_path($file); + my $want = quotemeta( + File::Spec->rel2abs( $Test_Dir ) + ); + if ($^O eq 'VMS') { + # Not easy to predict the physical volume name + $want = $ENV{PERL_CORE} ? $Test_Dir : File::Spec->catdir('t', $Test_Dir); + + # So just use the relative volume name + $want =~ s/^\[//; + + $want = quotemeta($want); + } + + like($abs_path, qr|$want$|i); + like($fast_abs_path, qr|$want$|i); + like(Cwd::_perl_abs_path($file), qr|$want$|i) if $EXTRA_ABSPATH_TESTS; + + rmtree($test_dirs[0], 0, 0); + 1 while unlink $file; +} + +# Make sure we can run abs_path() on files, not just directories +my $path = 'cwd.t'; +path_ends_with(Cwd::abs_path($path), 'cwd.t', 'abs_path() can be invoked on a file'); +path_ends_with(Cwd::fast_abs_path($path), 'cwd.t', 'fast_abs_path() can be invoked on a file'); +path_ends_with(Cwd::_perl_abs_path($path), 'cwd.t', '_perl_abs_path() can be invoked on a file') + if $EXTRA_ABSPATH_TESTS; + +$path = File::Spec->catfile(File::Spec->updir, 't', $path); +path_ends_with(Cwd::abs_path($path), 'cwd.t', 'abs_path() can be invoked on a file'); +path_ends_with(Cwd::fast_abs_path($path), 'cwd.t', 'fast_abs_path() can be invoked on a file'); +path_ends_with(Cwd::_perl_abs_path($path), 'cwd.t', '_perl_abs_path() can be invoked on a file') + if $EXTRA_ABSPATH_TESTS; + + + +SKIP: { + my $file; + { + my $root = Cwd::abs_path(File::Spec->rootdir); # Add drive letter? + local *FH; + opendir FH, $root or skip("Can't opendir($root): $!", 2+$EXTRA_ABSPATH_TESTS); + ($file) = grep {-f $_ and not -l $_} map File::Spec->catfile($root, $_), readdir FH; + closedir FH; + } + skip "No plain file in root directory to test with", 2+$EXTRA_ABSPATH_TESTS unless $file; + + $file = VMS::Filespec::rmsexpand($file) if $^O eq 'VMS'; + is Cwd::abs_path($file), $file, 'abs_path() works on files in the root directory'; + is Cwd::fast_abs_path($file), $file, 'fast_abs_path() works on files in the root directory'; + is Cwd::_perl_abs_path($file), $file, '_perl_abs_path() works on files in the root directory' + if $EXTRA_ABSPATH_TESTS; +} + +SKIP: { + my $dir = "${$}a\nx"; + mkdir $dir or skip "OS does not support dir names containing LF"; + chdir $dir or skip "OS cannot chdir into LF"; + eval { Cwd::fast_abs_path() }; + is $@, "", 'fast_abs_path does not die in dir whose name contains LF'; + chdir File::Spec->updir; + rmdir $dir; +} + + +############################################# +# These routines give us sort of a poor-man's cross-platform +# directory or path comparison capability. + +sub bracketed_form_dir { + return join '', map "[$_]", + grep length, File::Spec->splitdir(File::Spec->canonpath( shift() )); +} + +sub dir_ends_with { + my ($dir, $expect) = (shift, shift); + my $bracketed_expect = quotemeta bracketed_form_dir($expect); + like( bracketed_form_dir($dir), qr|$bracketed_expect$|i, (@_ ? shift : ()) ); +} + +sub bracketed_form_path { + return join '', map "[$_]", + grep length, File::Spec->splitpath(File::Spec->canonpath( shift() )); +} + +sub path_ends_with { + my ($dir, $expect) = (shift, shift); + my $bracketed_expect = quotemeta bracketed_form_path($expect); + like( bracketed_form_path($dir), qr|$bracketed_expect$|i, (@_ ? shift : ()) ); +} diff --git a/cpan/dist/PathTools/t/lib/Test/Builder.pm b/cpan/dist/PathTools/t/lib/Test/Builder.pm new file mode 100644 index 00000000..541a8512 --- /dev/null +++ b/cpan/dist/PathTools/t/lib/Test/Builder.pm @@ -0,0 +1,1499 @@ +package Test::Builder; + +use 5.004; + +# $^C was only introduced in 5.005-ish. We do this to prevent +# use of uninitialized value warnings in older perls. +$^C ||= 0; + +use strict; +use vars qw($VERSION); +$VERSION = '0.19'; + +my $IsVMS = $^O eq 'VMS'; + +# Make Test::Builder thread-safe for ithreads. +BEGIN { + use Config; + # Load threads::shared when threads are turned on + if( $] >= 5.008 && $Config{useithreads} && $INC{'threads.pm'}) { + require threads::shared; + threads::shared->import; + } + # 5.8.0's threads::shared is busted when threads are off. + # We emulate it here. + else { + *share = sub { return $_[0] }; + *lock = sub { 0 }; + } +} + + +=head1 NAME + +Test::Builder - Backend for building test libraries + +=head1 SYNOPSIS + + package My::Test::Module; + use Test::Builder; + require Exporter; + @ISA = qw(Exporter); + @EXPORT = qw(ok); + + my $Test = Test::Builder->new; + $Test->output('my_logfile'); + + sub import { + my($self) = shift; + my $pack = caller; + + $Test->exported_to($pack); + $Test->plan(@_); + + $self->export_to_level(1, $self, 'ok'); + } + + sub ok { + my($test, $name) = @_; + + $Test->ok($test, $name); + } + + +=head1 DESCRIPTION + +Test::Simple and Test::More have proven to be popular testing modules, +but they're not always flexible enough. Test::Builder provides the a +building block upon which to write your own test libraries I<which can +work together>. + +=head2 Construction + +=over 4 + +=item B<new> + + my $Test = Test::Builder->new; + +Returns a Test::Builder object representing the current state of the +test. + +Since you only run one test per program, there is B<one and only one> +Test::Builder object. No matter how many times you call new(), you're +getting the same object. (This is called a singleton). + +=cut + +my $Test = Test::Builder->new; +sub new { + my($class) = shift; + $Test ||= bless ['Move along, nothing to see here'], $class; + return $Test; +} + +=item B<reset> + + $Test->reset; + +Reinitializes the Test::Builder singleton to its original state. +Mostly useful for tests run in persistent environments where the same +test might be run multiple times in the same process. + +=cut + +my $Test_Died; +my $Have_Plan; +my $No_Plan; +my $Curr_Test; share($Curr_Test); +use vars qw($Level); +my $Original_Pid; +my @Test_Results; share(@Test_Results); +my @Test_Details; share(@Test_Details); + +my $Exported_To; +my $Expected_Tests; + +my $Skip_All; + +my $Use_Nums; + +my($No_Header, $No_Ending); + +$Test->reset; + +sub reset { + my ($self) = @_; + + $Test_Died = 0; + $Have_Plan = 0; + $No_Plan = 0; + $Curr_Test = 0; + $Level = 1; + $Original_Pid = $$; + @Test_Results = (); + @Test_Details = (); + + $Exported_To = undef; + $Expected_Tests = 0; + + $Skip_All = 0; + + $Use_Nums = 1; + + ($No_Header, $No_Ending) = (0,0); + + $self->_dup_stdhandles unless $^C; + + return undef; +} + +=back + +=head2 Setting up tests + +These methods are for setting up tests and declaring how many there +are. You usually only want to call one of these methods. + +=over 4 + +=item B<exported_to> + + my $pack = $Test->exported_to; + $Test->exported_to($pack); + +Tells Test::Builder what package you exported your functions to. +This is important for getting TODO tests right. + +=cut + +sub exported_to { + my($self, $pack) = @_; + + if( defined $pack ) { + $Exported_To = $pack; + } + return $Exported_To; +} + +=item B<plan> + + $Test->plan('no_plan'); + $Test->plan( skip_all => $reason ); + $Test->plan( tests => $num_tests ); + +A convenient way to set up your tests. Call this and Test::Builder +will print the appropriate headers and take the appropriate actions. + +If you call plan(), don't call any of the other methods below. + +=cut + +sub plan { + my($self, $cmd, $arg) = @_; + + return unless $cmd; + + if( $Have_Plan ) { + die sprintf "You tried to plan twice! Second plan at %s line %d\n", + ($self->caller)[1,2]; + } + + if( $cmd eq 'no_plan' ) { + $self->no_plan; + } + elsif( $cmd eq 'skip_all' ) { + return $self->skip_all($arg); + } + elsif( $cmd eq 'tests' ) { + if( $arg ) { + return $self->expected_tests($arg); + } + elsif( !defined $arg ) { + die "Got an undefined number of tests. Looks like you tried to ". + "say how many tests you plan to run but made a mistake.\n"; + } + elsif( !$arg ) { + die "You said to run 0 tests! You've got to run something.\n"; + } + } + else { + require Carp; + my @args = grep { defined } ($cmd, $arg); + Carp::croak("plan() doesn't understand @args"); + } + + return 1; +} + +=item B<expected_tests> + + my $max = $Test->expected_tests; + $Test->expected_tests($max); + +Gets/sets the # of tests we expect this test to run and prints out +the appropriate headers. + +=cut + +sub expected_tests { + my($self, $max) = @_; + + if( defined $max ) { + $Expected_Tests = $max; + $Have_Plan = 1; + + $self->_print("1..$max\n") unless $self->no_header; + } + return $Expected_Tests; +} + + +=item B<no_plan> + + $Test->no_plan; + +Declares that this test will run an indeterminate # of tests. + +=cut + +sub no_plan { + $No_Plan = 1; + $Have_Plan = 1; +} + +=item B<has_plan> + + $plan = $Test->has_plan + +Find out whether a plan has been defined. $plan is either C<undef> (no plan has been set), C<no_plan> (indeterminate # of tests) or an integer (the number of expected tests). + +=cut + +sub has_plan { + return($Expected_Tests) if $Expected_Tests; + return('no_plan') if $No_Plan; + return(undef); +}; + + +=item B<skip_all> + + $Test->skip_all; + $Test->skip_all($reason); + +Skips all the tests, using the given $reason. Exits immediately with 0. + +=cut + +sub skip_all { + my($self, $reason) = @_; + + my $out = "1..0"; + $out .= " # Skip $reason" if $reason; + $out .= "\n"; + + $Skip_All = 1; + + $self->_print($out) unless $self->no_header; + exit(0); +} + +=back + +=head2 Running tests + +These actually run the tests, analogous to the functions in +Test::More. + +$name is always optional. + +=over 4 + +=item B<ok> + + $Test->ok($test, $name); + +Your basic test. Pass if $test is true, fail if $test is false. Just +like Test::Simple's ok(). + +=cut + +sub ok { + my($self, $test, $name) = @_; + + # $test might contain an object which we don't want to accidentally + # store, so we turn it into a boolean. + $test = $test ? 1 : 0; + + unless( $Have_Plan ) { + require Carp; + Carp::croak("You tried to run a test without a plan! Gotta have a plan."); + } + + lock $Curr_Test; + $Curr_Test++; + + # In case $name is a string overloaded object, force it to stringify. + local($@,$!); + eval { + if( defined $name ) { + require overload; + if( my $string_meth = overload::Method($name, '""') ) { + $name = $name->$string_meth(); + } + } + }; + + $self->diag(<<ERR) if defined $name and $name =~ /^[\d\s]+$/; + You named your test '$name'. You shouldn't use numbers for your test names. + Very confusing. +ERR + + my($pack, $file, $line) = $self->caller; + + my $todo = $self->todo($pack); + + my $out; + my $result = &share({}); + + unless( $test ) { + $out .= "not "; + @$result{ 'ok', 'actual_ok' } = ( ( $todo ? 1 : 0 ), 0 ); + } + else { + @$result{ 'ok', 'actual_ok' } = ( 1, $test ); + } + + $out .= "ok"; + $out .= " $Curr_Test" if $self->use_numbers; + + if( defined $name ) { + $name =~ s|#|\\#|g; # # in a name can confuse Test::Harness. + $out .= " - $name"; + $result->{name} = $name; + } + else { + $result->{name} = ''; + } + + if( $todo ) { + my $what_todo = $todo; + $out .= " # TODO $what_todo"; + $result->{reason} = $what_todo; + $result->{type} = 'todo'; + } + else { + $result->{reason} = ''; + $result->{type} = ''; + } + + $Test_Results[$Curr_Test-1] = $result; + $out .= "\n"; + + $self->_print($out); + + unless( $test ) { + my $msg = $todo ? "Failed (TODO)" : "Failed"; + $self->_print_diag("\n") if $ENV{HARNESS_ACTIVE}; + $self->diag(" $msg test ($file at line $line)\n"); + } + + return $test ? 1 : 0; +} + +=item B<is_eq> + + $Test->is_eq($got, $expected, $name); + +Like Test::More's is(). Checks if $got eq $expected. This is the +string version. + +=item B<is_num> + + $Test->is_num($got, $expected, $name); + +Like Test::More's is(). Checks if $got == $expected. This is the +numeric version. + +=cut + +sub is_eq { + my($self, $got, $expect, $name) = @_; + local $Level = $Level + 1; + + if( !defined $got || !defined $expect ) { + # undef only matches undef and nothing else + my $test = !defined $got && !defined $expect; + + $self->ok($test, $name); + $self->_is_diag($got, 'eq', $expect) unless $test; + return $test; + } + + return $self->cmp_ok($got, 'eq', $expect, $name); +} + +sub is_num { + my($self, $got, $expect, $name) = @_; + local $Level = $Level + 1; + + if( !defined $got || !defined $expect ) { + # undef only matches undef and nothing else + my $test = !defined $got && !defined $expect; + + $self->ok($test, $name); + $self->_is_diag($got, '==', $expect) unless $test; + return $test; + } + + return $self->cmp_ok($got, '==', $expect, $name); +} + +sub _is_diag { + my($self, $got, $type, $expect) = @_; + + foreach my $val (\$got, \$expect) { + if( defined $$val ) { + if( $type eq 'eq' ) { + # quote and force string context + $$val = "'$$val'" + } + else { + # force numeric context + $$val = $$val+0; + } + } + else { + $$val = 'undef'; + } + } + + return $self->diag(sprintf <<DIAGNOSTIC, $got, $expect); + got: %s + expected: %s +DIAGNOSTIC + +} + +=item B<isnt_eq> + + $Test->isnt_eq($got, $dont_expect, $name); + +Like Test::More's isnt(). Checks if $got ne $dont_expect. This is +the string version. + +=item B<isnt_num> + + $Test->is_num($got, $dont_expect, $name); + +Like Test::More's isnt(). Checks if $got ne $dont_expect. This is +the numeric version. + +=cut + +sub isnt_eq { + my($self, $got, $dont_expect, $name) = @_; + local $Level = $Level + 1; + + if( !defined $got || !defined $dont_expect ) { + # undef only matches undef and nothing else + my $test = defined $got || defined $dont_expect; + + $self->ok($test, $name); + $self->_cmp_diag($got, 'ne', $dont_expect) unless $test; + return $test; + } + + return $self->cmp_ok($got, 'ne', $dont_expect, $name); +} + +sub isnt_num { + my($self, $got, $dont_expect, $name) = @_; + local $Level = $Level + 1; + + if( !defined $got || !defined $dont_expect ) { + # undef only matches undef and nothing else + my $test = defined $got || defined $dont_expect; + + $self->ok($test, $name); + $self->_cmp_diag($got, '!=', $dont_expect) unless $test; + return $test; + } + + return $self->cmp_ok($got, '!=', $dont_expect, $name); +} + + +=item B<like> + + $Test->like($this, qr/$regex/, $name); + $Test->like($this, '/$regex/', $name); + +Like Test::More's like(). Checks if $this matches the given $regex. + +You'll want to avoid qr// if you want your tests to work before 5.005. + +=item B<unlike> + + $Test->unlike($this, qr/$regex/, $name); + $Test->unlike($this, '/$regex/', $name); + +Like Test::More's unlike(). Checks if $this B<does not match> the +given $regex. + +=cut + +sub like { + my($self, $this, $regex, $name) = @_; + + local $Level = $Level + 1; + $self->_regex_ok($this, $regex, '=~', $name); +} + +sub unlike { + my($self, $this, $regex, $name) = @_; + + local $Level = $Level + 1; + $self->_regex_ok($this, $regex, '!~', $name); +} + +=item B<maybe_regex> + + $Test->maybe_regex(qr/$regex/); + $Test->maybe_regex('/$regex/'); + +Convenience method for building testing functions that take regular +expressions as arguments, but need to work before perl 5.005. + +Takes a quoted regular expression produced by qr//, or a string +representing a regular expression. + +Returns a Perl value which may be used instead of the corresponding +regular expression, or undef if it's argument is not recognised. + +For example, a version of like(), sans the useful diagnostic messages, +could be written as: + + sub laconic_like { + my ($self, $this, $regex, $name) = @_; + my $usable_regex = $self->maybe_regex($regex); + die "expecting regex, found '$regex'\n" + unless $usable_regex; + $self->ok($this =~ m/$usable_regex/, $name); + } + +=cut + + +sub maybe_regex { + my ($self, $regex) = @_; + my $usable_regex = undef; + if( ref $regex eq 'Regexp' ) { + $usable_regex = $regex; + } + # Check if it looks like '/foo/' + elsif( my($re, $opts) = $regex =~ m{^ /(.*)/ (\w*) $ }sx ) { + $usable_regex = length $opts ? "(?$opts)$re" : $re; + }; + return($usable_regex) +}; + +sub _regex_ok { + my($self, $this, $regex, $cmp, $name) = @_; + + local $Level = $Level + 1; + + my $ok = 0; + my $usable_regex = $self->maybe_regex($regex); + unless (defined $usable_regex) { + $ok = $self->ok( 0, $name ); + $self->diag(" '$regex' doesn't look much like a regex to me."); + return $ok; + } + + { + local $^W = 0; + my $test = $this =~ /$usable_regex/ ? 1 : 0; + $test = !$test if $cmp eq '!~'; + $ok = $self->ok( $test, $name ); + } + + unless( $ok ) { + $this = defined $this ? "'$this'" : 'undef'; + my $match = $cmp eq '=~' ? "doesn't match" : "matches"; + $self->diag(sprintf <<DIAGNOSTIC, $this, $match, $regex); + %s + %13s '%s' +DIAGNOSTIC + + } + + return $ok; +} + +=item B<cmp_ok> + + $Test->cmp_ok($this, $type, $that, $name); + +Works just like Test::More's cmp_ok(). + + $Test->cmp_ok($big_num, '!=', $other_big_num); + +=cut + +sub cmp_ok { + my($self, $got, $type, $expect, $name) = @_; + + my $test; + { + local $^W = 0; + local($@,$!); # don't interfere with $@ + # eval() sometimes resets $! + $test = eval "\$got $type \$expect"; + } + local $Level = $Level + 1; + my $ok = $self->ok($test, $name); + + unless( $ok ) { + if( $type =~ /^(eq|==)$/ ) { + $self->_is_diag($got, $type, $expect); + } + else { + $self->_cmp_diag($got, $type, $expect); + } + } + return $ok; +} + +sub _cmp_diag { + my($self, $got, $type, $expect) = @_; + + $got = defined $got ? "'$got'" : 'undef'; + $expect = defined $expect ? "'$expect'" : 'undef'; + return $self->diag(sprintf <<DIAGNOSTIC, $got, $type, $expect); + %s + %s + %s +DIAGNOSTIC +} + +=item B<BAILOUT> + + $Test->BAILOUT($reason); + +Indicates to the Test::Harness that things are going so badly all +testing should terminate. This includes running any additional test +scripts. + +It will exit with 255. + +=cut + +sub BAILOUT { + my($self, $reason) = @_; + + $self->_print("Bail out! $reason"); + exit 255; +} + +=item B<skip> + + $Test->skip; + $Test->skip($why); + +Skips the current test, reporting $why. + +=cut + +sub skip { + my($self, $why) = @_; + $why ||= ''; + + unless( $Have_Plan ) { + require Carp; + Carp::croak("You tried to run tests without a plan! Gotta have a plan."); + } + + lock($Curr_Test); + $Curr_Test++; + + $Test_Results[$Curr_Test-1] = &share({ + 'ok' => 1, + actual_ok => 1, + name => '', + type => 'skip', + reason => $why, + }); + + my $out = "ok"; + $out .= " $Curr_Test" if $self->use_numbers; + $out .= " # skip $why\n"; + + $Test->_print($out); + + return 1; +} + + +=item B<todo_skip> + + $Test->todo_skip; + $Test->todo_skip($why); + +Like skip(), only it will declare the test as failing and TODO. Similar +to + + print "not ok $tnum # TODO $why\n"; + +=cut + +sub todo_skip { + my($self, $why) = @_; + $why ||= ''; + + unless( $Have_Plan ) { + require Carp; + Carp::croak("You tried to run tests without a plan! Gotta have a plan."); + } + + lock($Curr_Test); + $Curr_Test++; + + $Test_Results[$Curr_Test-1] = &share({ + 'ok' => 1, + actual_ok => 0, + name => '', + type => 'todo_skip', + reason => $why, + }); + + my $out = "not ok"; + $out .= " $Curr_Test" if $self->use_numbers; + $out .= " # TODO & SKIP $why\n"; + + $Test->_print($out); + + return 1; +} + + +=begin _unimplemented + +=item B<skip_rest> + + $Test->skip_rest; + $Test->skip_rest($reason); + +Like skip(), only it skips all the rest of the tests you plan to run +and terminates the test. + +If you're running under no_plan, it skips once and terminates the +test. + +=end _unimplemented + +=back + + +=head2 Test style + +=over 4 + +=item B<level> + + $Test->level($how_high); + +How far up the call stack should $Test look when reporting where the +test failed. + +Defaults to 1. + +Setting $Test::Builder::Level overrides. This is typically useful +localized: + + { + local $Test::Builder::Level = 2; + $Test->ok($test); + } + +=cut + +sub level { + my($self, $level) = @_; + + if( defined $level ) { + $Level = $level; + } + return $Level; +} + + +=item B<use_numbers> + + $Test->use_numbers($on_or_off); + +Whether or not the test should output numbers. That is, this if true: + + ok 1 + ok 2 + ok 3 + +or this if false + + ok + ok + ok + +Most useful when you can't depend on the test output order, such as +when threads or forking is involved. + +Test::Harness will accept either, but avoid mixing the two styles. + +Defaults to on. + +=cut + +sub use_numbers { + my($self, $use_nums) = @_; + + if( defined $use_nums ) { + $Use_Nums = $use_nums; + } + return $Use_Nums; +} + +=item B<no_header> + + $Test->no_header($no_header); + +If set to true, no "1..N" header will be printed. + +=item B<no_ending> + + $Test->no_ending($no_ending); + +Normally, Test::Builder does some extra diagnostics when the test +ends. It also changes the exit code as described below. + +If this is true, none of that will be done. + +=cut + +sub no_header { + my($self, $no_header) = @_; + + if( defined $no_header ) { + $No_Header = $no_header; + } + return $No_Header; +} + +sub no_ending { + my($self, $no_ending) = @_; + + if( defined $no_ending ) { + $No_Ending = $no_ending; + } + return $No_Ending; +} + + +=back + +=head2 Output + +Controlling where the test output goes. + +It's ok for your test to change where STDOUT and STDERR point to, +Test::Builder's default output settings will not be affected. + +=over 4 + +=item B<diag> + + $Test->diag(@msgs); + +Prints out the given $message. Normally, it uses the failure_output() +handle, but if this is for a TODO test, the todo_output() handle is +used. + +Output will be indented and marked with a # so as not to interfere +with test output. A newline will be put on the end if there isn't one +already. + +We encourage using this rather than calling print directly. + +Returns false. Why? Because diag() is often used in conjunction with +a failing test (C<ok() || diag()>) it "passes through" the failure. + + return ok(...) || diag(...); + +=for blame transfer +Mark Fowler <mark@twoshortplanks.com> + +=cut + +sub diag { + my($self, @msgs) = @_; + return unless @msgs; + + # Prevent printing headers when compiling (i.e. -c) + return if $^C; + + # Escape each line with a #. + foreach (@msgs) { + $_ = 'undef' unless defined; + s/^/# /gms; + } + + push @msgs, "\n" unless $msgs[-1] =~ /\n\Z/; + + local $Level = $Level + 1; + $self->_print_diag(@msgs); + + return 0; +} + +=begin _private + +=item B<_print> + + $Test->_print(@msgs); + +Prints to the output() filehandle. + +=end _private + +=cut + +sub _print { + my($self, @msgs) = @_; + + # Prevent printing headers when only compiling. Mostly for when + # tests are deparsed with B::Deparse + return if $^C; + + local($\, $", $,) = (undef, ' ', ''); + my $fh = $self->output; + + # Escape each line after the first with a # so we don't + # confuse Test::Harness. + foreach (@msgs) { + s/\n(.)/\n# $1/sg; + } + + push @msgs, "\n" unless $msgs[-1] =~ /\n\Z/; + + print $fh @msgs; +} + + +=item B<_print_diag> + + $Test->_print_diag(@msg); + +Like _print, but prints to the current diagnostic filehandle. + +=cut + +sub _print_diag { + my $self = shift; + + local($\, $", $,) = (undef, ' ', ''); + my $fh = $self->todo ? $self->todo_output : $self->failure_output; + print $fh @_; +} + +=item B<output> + + $Test->output($fh); + $Test->output($file); + +Where normal "ok/not ok" test output should go. + +Defaults to STDOUT. + +=item B<failure_output> + + $Test->failure_output($fh); + $Test->failure_output($file); + +Where diagnostic output on test failures and diag() should go. + +Defaults to STDERR. + +=item B<todo_output> + + $Test->todo_output($fh); + $Test->todo_output($file); + +Where diagnostics about todo test failures and diag() should go. + +Defaults to STDOUT. + +=cut + +my($Out_FH, $Fail_FH, $Todo_FH); +sub output { + my($self, $fh) = @_; + + if( defined $fh ) { + $Out_FH = _new_fh($fh); + } + return $Out_FH; +} + +sub failure_output { + my($self, $fh) = @_; + + if( defined $fh ) { + $Fail_FH = _new_fh($fh); + } + return $Fail_FH; +} + +sub todo_output { + my($self, $fh) = @_; + + if( defined $fh ) { + $Todo_FH = _new_fh($fh); + } + return $Todo_FH; +} + +sub _new_fh { + my($file_or_fh) = shift; + + my $fh; + unless( UNIVERSAL::isa($file_or_fh, 'GLOB') ) { + $fh = do { local *FH }; + open $fh, ">$file_or_fh" or + die "Can't open test output log $file_or_fh: $!"; + } + else { + $fh = $file_or_fh; + } + + return $fh; +} + +sub _autoflush { + my($fh) = shift; + my $old_fh = select $fh; + $| = 1; + select $old_fh; +} + + +my $Opened_Testhandles = 0; +sub _dup_stdhandles { + my $self = shift; + + $self->_open_testhandles unless $Opened_Testhandles; + + # Set everything to unbuffered else plain prints to STDOUT will + # come out in the wrong order from our own prints. + _autoflush(\*TESTOUT); + _autoflush(\*STDOUT); + _autoflush(\*TESTERR); + _autoflush(\*STDERR); + + $Test->output(\*TESTOUT); + $Test->failure_output(\*TESTERR); + $Test->todo_output(\*TESTOUT); +} + +sub _open_testhandles { + # We dup STDOUT and STDERR so people can change them in their + # test suites while still getting normal test output. + open(TESTOUT, ">&STDOUT") or die "Can't dup STDOUT: $!"; + open(TESTERR, ">&STDERR") or die "Can't dup STDERR: $!"; + $Opened_Testhandles = 1; +} + + +=back + + +=head2 Test Status and Info + +=over 4 + +=item B<current_test> + + my $curr_test = $Test->current_test; + $Test->current_test($num); + +Gets/sets the current test # we're on. + +You usually shouldn't have to set this. + +=cut + +sub current_test { + my($self, $num) = @_; + + lock($Curr_Test); + if( defined $num ) { + unless( $Have_Plan ) { + require Carp; + Carp::croak("Can't change the current test number without a plan!"); + } + + $Curr_Test = $num; + if( $num > @Test_Results ) { + my $start = @Test_Results ? $#Test_Results + 1 : 0; + for ($start..$num-1) { + $Test_Results[$_] = &share({ + 'ok' => 1, + actual_ok => undef, + reason => 'incrementing test number', + type => 'unknown', + name => undef + }); + } + } + } + return $Curr_Test; +} + + +=item B<summary> + + my @tests = $Test->summary; + +A simple summary of the tests so far. True for pass, false for fail. +This is a logical pass/fail, so todos are passes. + +Of course, test #1 is $tests[0], etc... + +=cut + +sub summary { + my($self) = shift; + + return map { $_->{'ok'} } @Test_Results; +} + +=item B<details> + + my @tests = $Test->details; + +Like summary(), but with a lot more detail. + + $tests[$test_num - 1] = + { 'ok' => is the test considered a pass? + actual_ok => did it literally say 'ok'? + name => name of the test (if any) + type => type of test (if any, see below). + reason => reason for the above (if any) + }; + +'ok' is true if Test::Harness will consider the test to be a pass. + +'actual_ok' is a reflection of whether or not the test literally +printed 'ok' or 'not ok'. This is for examining the result of 'todo' +tests. + +'name' is the name of the test. + +'type' indicates if it was a special test. Normal tests have a type +of ''. Type can be one of the following: + + skip see skip() + todo see todo() + todo_skip see todo_skip() + unknown see below + +Sometimes the Test::Builder test counter is incremented without it +printing any test output, for example, when current_test() is changed. +In these cases, Test::Builder doesn't know the result of the test, so +it's type is 'unkown'. These details for these tests are filled in. +They are considered ok, but the name and actual_ok is left undef. + +For example "not ok 23 - hole count # TODO insufficient donuts" would +result in this structure: + + $tests[22] = # 23 - 1, since arrays start from 0. + { ok => 1, # logically, the test passed since it's todo + actual_ok => 0, # in absolute terms, it failed + name => 'hole count', + type => 'todo', + reason => 'insufficient donuts' + }; + +=cut + +sub details { + return @Test_Results; +} + +=item B<todo> + + my $todo_reason = $Test->todo; + my $todo_reason = $Test->todo($pack); + +todo() looks for a $TODO variable in your tests. If set, all tests +will be considered 'todo' (see Test::More and Test::Harness for +details). Returns the reason (ie. the value of $TODO) if running as +todo tests, false otherwise. + +todo() is pretty part about finding the right package to look for +$TODO in. It uses the exported_to() package to find it. If that's +not set, it's pretty good at guessing the right package to look at. + +Sometimes there is some confusion about where todo() should be looking +for the $TODO variable. If you want to be sure, tell it explicitly +what $pack to use. + +=cut + +sub todo { + my($self, $pack) = @_; + + $pack = $pack || $self->exported_to || $self->caller(1); + + no strict 'refs'; + return defined ${$pack.'::TODO'} ? ${$pack.'::TODO'} + : 0; +} + +=item B<caller> + + my $package = $Test->caller; + my($pack, $file, $line) = $Test->caller; + my($pack, $file, $line) = $Test->caller($height); + +Like the normal caller(), except it reports according to your level(). + +=cut + +sub caller { + my($self, $height) = @_; + $height ||= 0; + + my @caller = CORE::caller($self->level + $height + 1); + return wantarray ? @caller : $caller[0]; +} + +=back + +=cut + +=begin _private + +=over 4 + +=item B<_sanity_check> + + _sanity_check(); + +Runs a bunch of end of test sanity checks to make sure reality came +through ok. If anything is wrong it will die with a fairly friendly +error message. + +=cut + +#'# +sub _sanity_check { + _whoa($Curr_Test < 0, 'Says here you ran a negative number of tests!'); + _whoa(!$Have_Plan and $Curr_Test, + 'Somehow your tests ran without a plan!'); + _whoa($Curr_Test != @Test_Results, + 'Somehow you got a different number of results than tests ran!'); +} + +=item B<_whoa> + + _whoa($check, $description); + +A sanity check, similar to assert(). If the $check is true, something +has gone horribly wrong. It will die with the given $description and +a note to contact the author. + +=cut + +sub _whoa { + my($check, $desc) = @_; + if( $check ) { + die <<WHOA; +WHOA! $desc +This should never happen! Please contact the author immediately! +WHOA + } +} + +=item B<_my_exit> + + _my_exit($exit_num); + +Perl seems to have some trouble with exiting inside an END block. 5.005_03 +and 5.6.1 both seem to do odd things. Instead, this function edits $? +directly. It should ONLY be called from inside an END block. It +doesn't actually exit, that's your job. + +=cut + +sub _my_exit { + $? = $_[0]; + + return 1; +} + + +=back + +=end _private + +=cut + +$SIG{__DIE__} = sub { + # We don't want to muck with death in an eval, but $^S isn't + # totally reliable. 5.005_03 and 5.6.1 both do the wrong thing + # with it. Instead, we use caller. This also means it runs under + # 5.004! + my $in_eval = 0; + for( my $stack = 1; my $sub = (CORE::caller($stack))[3]; $stack++ ) { + $in_eval = 1 if $sub =~ /^\(eval\)/; + } + $Test_Died = 1 unless $in_eval; +}; + +sub _ending { + my $self = shift; + + _sanity_check(); + + # Don't bother with an ending if this is a forked copy. Only the parent + # should do the ending. + do{ _my_exit($?) && return } if $Original_Pid != $$; + + # Bailout if plan() was never called. This is so + # "require Test::Simple" doesn't puke. + do{ _my_exit(0) && return } if !$Have_Plan && !$Test_Died; + + # Figure out if we passed or failed and print helpful messages. + if( @Test_Results ) { + # The plan? We have no plan. + if( $No_Plan ) { + $self->_print("1..$Curr_Test\n") unless $self->no_header; + $Expected_Tests = $Curr_Test; + } + + # Auto-extended arrays and elements which aren't explicitly + # filled in with a shared reference will puke under 5.8.0 + # ithreads. So we have to fill them in by hand. :( + my $empty_result = &share({}); + for my $idx ( 0..$Expected_Tests-1 ) { + $Test_Results[$idx] = $empty_result + unless defined $Test_Results[$idx]; + } + + my $num_failed = grep !$_->{'ok'}, @Test_Results[0..$Expected_Tests-1]; + $num_failed += abs($Expected_Tests - @Test_Results); + + if( $Curr_Test < $Expected_Tests ) { + my $s = $Expected_Tests == 1 ? '' : 's'; + $self->diag(<<"FAIL"); +Looks like you planned $Expected_Tests test$s but only ran $Curr_Test. +FAIL + } + elsif( $Curr_Test > $Expected_Tests ) { + my $num_extra = $Curr_Test - $Expected_Tests; + my $s = $Expected_Tests == 1 ? '' : 's'; + $self->diag(<<"FAIL"); +Looks like you planned $Expected_Tests test$s but ran $num_extra extra. +FAIL + } + elsif ( $num_failed ) { + my $s = $num_failed == 1 ? '' : 's'; + $self->diag(<<"FAIL"); +Looks like you failed $num_failed test$s of $Expected_Tests. +FAIL + } + + if( $Test_Died ) { + $self->diag(<<"FAIL"); +Looks like your test died just after $Curr_Test. +FAIL + + _my_exit( 255 ) && return; + } + + _my_exit( $num_failed <= 254 ? $num_failed : 254 ) && return; + } + elsif ( $Skip_All ) { + _my_exit( 0 ) && return; + } + elsif ( $Test_Died ) { + $self->diag(<<'FAIL'); +Looks like your test died before it could output anything. +FAIL + _my_exit( 255 ) && return; + } + else { + $self->diag("No tests run!\n"); + _my_exit( 255 ) && return; + } +} + +END { + $Test->_ending if defined $Test and !$Test->no_ending; +} + +=head1 EXIT CODES + +If all your tests passed, Test::Builder will exit with zero (which is +normal). If anything failed it will exit with how many failed. If +you run less (or more) tests than you planned, the missing (or extras) +will be considered failures. If no tests were ever run Test::Builder +will throw a warning and exit with 255. If the test died, even after +having successfully completed all its tests, it will still be +considered a failure and will exit with 255. + +So the exit codes are... + + 0 all tests successful + 255 test died + any other number how many failed (including missing or extras) + +If you fail more than 254 tests, it will be reported as 254. + + +=head1 THREADS + +In perl 5.8.0 and later, Test::Builder is thread-safe. The test +number is shared amongst all threads. This means if one thread sets +the test number using current_test() they will all be effected. + +Test::Builder is only thread-aware if threads.pm is loaded I<before> +Test::Builder. + +=head1 EXAMPLES + +CPAN can provide the best examples. Test::Simple, Test::More, +Test::Exception and Test::Differences all use Test::Builder. + +=head1 SEE ALSO + +Test::Simple, Test::More, Test::Harness + +=head1 AUTHORS + +Original code by chromatic, maintained by Michael G Schwern +E<lt>schwern@pobox.comE<gt> + +=head1 COPYRIGHT + +Copyright 2002 by chromatic E<lt>chromatic@wgz.orgE<gt>, + Michael G Schwern E<lt>schwern@pobox.comE<gt>. + +This program is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. + +See F<http://www.perl.com/perl/misc/Artistic.html> + +=cut + +1; diff --git a/cpan/dist/PathTools/t/lib/Test/More.pm b/cpan/dist/PathTools/t/lib/Test/More.pm new file mode 100644 index 00000000..db16079e --- /dev/null +++ b/cpan/dist/PathTools/t/lib/Test/More.pm @@ -0,0 +1,1330 @@ +package Test::More; + +use 5.004; + +use strict; +use Test::Builder; + + +# Can't use Carp because it might cause use_ok() to accidentally succeed +# even though the module being used forgot to use Carp. Yes, this +# actually happened. +sub _carp { + my($file, $line) = (caller(1))[1,2]; + warn @_, " at $file line $line\n"; +} + + + +require Exporter; +use vars qw($VERSION @ISA @EXPORT %EXPORT_TAGS $TODO); +$VERSION = '0.49'; +@ISA = qw(Exporter); +@EXPORT = qw(ok use_ok require_ok + is isnt like unlike is_deeply + cmp_ok + skip todo todo_skip + pass fail + eq_array eq_hash eq_set + $TODO + plan + can_ok isa_ok + diag + ); + +my $Test = Test::Builder->new; +my $Show_Diag = 1; + + +# 5.004's Exporter doesn't have export_to_level. +sub _export_to_level +{ + my $pkg = shift; + my $level = shift; + (undef) = shift; # redundant arg + my $callpkg = caller($level); + $pkg->export($callpkg, @_); +} + + +=head1 NAME + +Test::More - yet another framework for writing test scripts + +=head1 SYNOPSIS + + use Test::More tests => $Num_Tests; + # or + use Test::More qw(no_plan); + # or + use Test::More skip_all => $reason; + + BEGIN { use_ok( 'Some::Module' ); } + require_ok( 'Some::Module' ); + + # Various ways to say "ok" + ok($this eq $that, $test_name); + + is ($this, $that, $test_name); + isnt($this, $that, $test_name); + + # Rather than print STDERR "# here's what went wrong\n" + diag("here's what went wrong"); + + like ($this, qr/that/, $test_name); + unlike($this, qr/that/, $test_name); + + cmp_ok($this, '==', $that, $test_name); + + is_deeply($complex_structure1, $complex_structure2, $test_name); + + SKIP: { + skip $why, $how_many unless $have_some_feature; + + ok( foo(), $test_name ); + is( foo(42), 23, $test_name ); + }; + + TODO: { + local $TODO = $why; + + ok( foo(), $test_name ); + is( foo(42), 23, $test_name ); + }; + + can_ok($module, @methods); + isa_ok($object, $class); + + pass($test_name); + fail($test_name); + + # Utility comparison functions. + eq_array(\@this, \@that); + eq_hash(\%this, \%that); + eq_set(\@this, \@that); + + # UNIMPLEMENTED!!! + my @status = Test::More::status; + + # UNIMPLEMENTED!!! + BAIL_OUT($why); + + +=head1 DESCRIPTION + +B<STOP!> If you're just getting started writing tests, have a look at +Test::Simple first. This is a drop in replacement for Test::Simple +which you can switch to once you get the hang of basic testing. + +The purpose of this module is to provide a wide range of testing +utilities. Various ways to say "ok" with better diagnostics, +facilities to skip tests, test future features and compare complicated +data structures. While you can do almost anything with a simple +C<ok()> function, it doesn't provide good diagnostic output. + + +=head2 I love it when a plan comes together + +Before anything else, you need a testing plan. This basically declares +how many tests your script is going to run to protect against premature +failure. + +The preferred way to do this is to declare a plan when you C<use Test::More>. + + use Test::More tests => $Num_Tests; + +There are rare cases when you will not know beforehand how many tests +your script is going to run. In this case, you can declare that you +have no plan. (Try to avoid using this as it weakens your test.) + + use Test::More qw(no_plan); + +B<NOTE>: using no_plan requires a Test::Harness upgrade else it will +think everything has failed. See L<BUGS and CAVEATS>) + +In some cases, you'll want to completely skip an entire testing script. + + use Test::More skip_all => $skip_reason; + +Your script will declare a skip with the reason why you skipped and +exit immediately with a zero (success). See L<Test::Harness> for +details. + +If you want to control what functions Test::More will export, you +have to use the 'import' option. For example, to import everything +but 'fail', you'd do: + + use Test::More tests => 23, import => ['!fail']; + +Alternatively, you can use the plan() function. Useful for when you +have to calculate the number of tests. + + use Test::More; + plan tests => keys %Stuff * 3; + +or for deciding between running the tests at all: + + use Test::More; + if( $^O eq 'MacOS' ) { + plan skip_all => 'Test irrelevant on MacOS'; + } + else { + plan tests => 42; + } + +=cut + +sub plan { + my(@plan) = @_; + + my $caller = caller; + + $Test->exported_to($caller); + + my @cleaned_plan; + my @imports = (); + my $idx = 0; + while( $idx <= $#plan ) { + if( $plan[$idx] eq 'import' ) { + @imports = @{$plan[$idx+1]}; + $idx += 2; + } + elsif( $plan[$idx] eq 'no_diag' ) { + $Show_Diag = 0; + $idx++; + } + else { + push @cleaned_plan, $plan[$idx]; + $idx++; + } + } + + $Test->plan(@cleaned_plan); + + __PACKAGE__->_export_to_level(1, __PACKAGE__, @imports); +} + +sub import { + my($class) = shift; + goto &plan; +} + + +=head2 Test names + +By convention, each test is assigned a number in order. This is +largely done automatically for you. However, it's often very useful to +assign a name to each test. Which would you rather see: + + ok 4 + not ok 5 + ok 6 + +or + + ok 4 - basic multi-variable + not ok 5 - simple exponential + ok 6 - force == mass * acceleration + +The later gives you some idea of what failed. It also makes it easier +to find the test in your script, simply search for "simple +exponential". + +All test functions take a name argument. It's optional, but highly +suggested that you use it. + + +=head2 I'm ok, you're not ok. + +The basic purpose of this module is to print out either "ok #" or "not +ok #" depending on if a given test succeeded or failed. Everything +else is just gravy. + +All of the following print "ok" or "not ok" depending on if the test +succeeded or failed. They all also return true or false, +respectively. + +=over 4 + +=item B<ok> + + ok($this eq $that, $test_name); + +This simply evaluates any expression (C<$this eq $that> is just a +simple example) and uses that to determine if the test succeeded or +failed. A true expression passes, a false one fails. Very simple. + +For example: + + ok( $exp{9} == 81, 'simple exponential' ); + ok( Film->can('db_Main'), 'set_db()' ); + ok( $p->tests == 4, 'saw tests' ); + ok( !grep !defined $_, @items, 'items populated' ); + +(Mnemonic: "This is ok.") + +$test_name is a very short description of the test that will be printed +out. It makes it very easy to find a test in your script when it fails +and gives others an idea of your intentions. $test_name is optional, +but we B<very> strongly encourage its use. + +Should an ok() fail, it will produce some diagnostics: + + not ok 18 - sufficient mucus + # Failed test 18 (foo.t at line 42) + +This is actually Test::Simple's ok() routine. + +=cut + +sub ok ($;$) { + my($test, $name) = @_; + $Test->ok($test, $name); +} + +=item B<is> + +=item B<isnt> + + is ( $this, $that, $test_name ); + isnt( $this, $that, $test_name ); + +Similar to ok(), is() and isnt() compare their two arguments +with C<eq> and C<ne> respectively and use the result of that to +determine if the test succeeded or failed. So these: + + # Is the ultimate answer 42? + is( ultimate_answer(), 42, "Meaning of Life" ); + + # $foo isn't empty + isnt( $foo, '', "Got some foo" ); + +are similar to these: + + ok( ultimate_answer() eq 42, "Meaning of Life" ); + ok( $foo ne '', "Got some foo" ); + +(Mnemonic: "This is that." "This isn't that.") + +So why use these? They produce better diagnostics on failure. ok() +cannot know what you are testing for (beyond the name), but is() and +isnt() know what the test was and why it failed. For example this +test: + + my $foo = 'waffle'; my $bar = 'yarblokos'; + is( $foo, $bar, 'Is foo the same as bar?' ); + +Will produce something like this: + + not ok 17 - Is foo the same as bar? + # Failed test (foo.t at line 139) + # got: 'waffle' + # expected: 'yarblokos' + +So you can figure out what went wrong without rerunning the test. + +You are encouraged to use is() and isnt() over ok() where possible, +however do not be tempted to use them to find out if something is +true or false! + + # XXX BAD! + is( exists $brooklyn{tree}, 1, 'A tree grows in Brooklyn' ); + +This does not check if C<exists $brooklyn{tree}> is true, it checks if +it returns 1. Very different. Similar caveats exist for false and 0. +In these cases, use ok(). + + ok( exists $brooklyn{tree}, 'A tree grows in Brooklyn' ); + +For those grammatical pedants out there, there's an C<isn't()> +function which is an alias of isnt(). + +=cut + +sub is ($$;$) { + $Test->is_eq(@_); +} + +sub isnt ($$;$) { + $Test->isnt_eq(@_); +} + +*isn't = \&isnt; + + +=item B<like> + + like( $this, qr/that/, $test_name ); + +Similar to ok(), like() matches $this against the regex C<qr/that/>. + +So this: + + like($this, qr/that/, 'this is like that'); + +is similar to: + + ok( $this =~ /that/, 'this is like that'); + +(Mnemonic "This is like that".) + +The second argument is a regular expression. It may be given as a +regex reference (i.e. C<qr//>) or (for better compatibility with older +perls) as a string that looks like a regex (alternative delimiters are +currently not supported): + + like( $this, '/that/', 'this is like that' ); + +Regex options may be placed on the end (C<'/that/i'>). + +Its advantages over ok() are similar to that of is() and isnt(). Better +diagnostics on failure. + +=cut + +sub like ($$;$) { + $Test->like(@_); +} + + +=item B<unlike> + + unlike( $this, qr/that/, $test_name ); + +Works exactly as like(), only it checks if $this B<does not> match the +given pattern. + +=cut + +sub unlike ($$;$) { + $Test->unlike(@_); +} + + +=item B<cmp_ok> + + cmp_ok( $this, $op, $that, $test_name ); + +Halfway between ok() and is() lies cmp_ok(). This allows you to +compare two arguments using any binary perl operator. + + # ok( $this eq $that ); + cmp_ok( $this, 'eq', $that, 'this eq that' ); + + # ok( $this == $that ); + cmp_ok( $this, '==', $that, 'this == that' ); + + # ok( $this && $that ); + cmp_ok( $this, '&&', $that, 'this && that' ); + ...etc... + +Its advantage over ok() is when the test fails you'll know what $this +and $that were: + + not ok 1 + # Failed test (foo.t at line 12) + # '23' + # && + # undef + +It's also useful in those cases where you are comparing numbers and +is()'s use of C<eq> will interfere: + + cmp_ok( $big_hairy_number, '==', $another_big_hairy_number ); + +=cut + +sub cmp_ok($$$;$) { + $Test->cmp_ok(@_); +} + + +=item B<can_ok> + + can_ok($module, @methods); + can_ok($object, @methods); + +Checks to make sure the $module or $object can do these @methods +(works with functions, too). + + can_ok('Foo', qw(this that whatever)); + +is almost exactly like saying: + + ok( Foo->can('this') && + Foo->can('that') && + Foo->can('whatever') + ); + +only without all the typing and with a better interface. Handy for +quickly testing an interface. + +No matter how many @methods you check, a single can_ok() call counts +as one test. If you desire otherwise, use: + + foreach my $meth (@methods) { + can_ok('Foo', $meth); + } + +=cut + +sub can_ok ($@) { + my($proto, @methods) = @_; + my $class = ref $proto || $proto; + + unless( @methods ) { + my $ok = $Test->ok( 0, "$class->can(...)" ); + $Test->diag(' can_ok() called with no methods'); + return $ok; + } + + my @nok = (); + foreach my $method (@methods) { + local($!, $@); # don't interfere with caller's $@ + # eval sometimes resets $! + eval { $proto->can($method) } || push @nok, $method; + } + + my $name; + $name = @methods == 1 ? "$class->can('$methods[0]')" + : "$class->can(...)"; + + my $ok = $Test->ok( !@nok, $name ); + + $Test->diag(map " $class->can('$_') failed\n", @nok); + + return $ok; +} + +=item B<isa_ok> + + isa_ok($object, $class, $object_name); + isa_ok($ref, $type, $ref_name); + +Checks to see if the given C<< $object->isa($class) >>. Also checks to make +sure the object was defined in the first place. Handy for this sort +of thing: + + my $obj = Some::Module->new; + isa_ok( $obj, 'Some::Module' ); + +where you'd otherwise have to write + + my $obj = Some::Module->new; + ok( defined $obj && $obj->isa('Some::Module') ); + +to safeguard against your test script blowing up. + +It works on references, too: + + isa_ok( $array_ref, 'ARRAY' ); + +The diagnostics of this test normally just refer to 'the object'. If +you'd like them to be more specific, you can supply an $object_name +(for example 'Test customer'). + +=cut + +sub isa_ok ($$;$) { + my($object, $class, $obj_name) = @_; + + my $diag; + $obj_name = 'The object' unless defined $obj_name; + my $name = "$obj_name isa $class"; + if( !defined $object ) { + $diag = "$obj_name isn't defined"; + } + elsif( !ref $object ) { + $diag = "$obj_name isn't a reference"; + } + else { + # We can't use UNIVERSAL::isa because we want to honor isa() overrides + local($@, $!); # eval sometimes resets $! + my $rslt = eval { $object->isa($class) }; + if( $@ ) { + if( $@ =~ /^Can't call method "isa" on unblessed reference/ ) { + if( !UNIVERSAL::isa($object, $class) ) { + my $ref = ref $object; + $diag = "$obj_name isn't a '$class' it's a '$ref'"; + } + } else { + die <<WHOA; +WHOA! I tried to call ->isa on your object and got some weird error. +This should never happen. Please contact the author immediately. +Here's the error. +$@ +WHOA + } + } + elsif( !$rslt ) { + my $ref = ref $object; + $diag = "$obj_name isn't a '$class' it's a '$ref'"; + } + } + + + + my $ok; + if( $diag ) { + $ok = $Test->ok( 0, $name ); + $Test->diag(" $diag\n"); + } + else { + $ok = $Test->ok( 1, $name ); + } + + return $ok; +} + + +=item B<pass> + +=item B<fail> + + pass($test_name); + fail($test_name); + +Sometimes you just want to say that the tests have passed. Usually +the case is you've got some complicated condition that is difficult to +wedge into an ok(). In this case, you can simply use pass() (to +declare the test ok) or fail (for not ok). They are synonyms for +ok(1) and ok(0). + +Use these very, very, very sparingly. + +=cut + +sub pass (;$) { + $Test->ok(1, @_); +} + +sub fail (;$) { + $Test->ok(0, @_); +} + +=back + +=head2 Diagnostics + +If you pick the right test function, you'll usually get a good idea of +what went wrong when it failed. But sometimes it doesn't work out +that way. So here we have ways for you to write your own diagnostic +messages which are safer than just C<print STDERR>. + +=over 4 + +=item B<diag> + + diag(@diagnostic_message); + +Prints a diagnostic message which is guaranteed not to interfere with +test output. Handy for this sort of thing: + + ok( grep(/foo/, @users), "There's a foo user" ) or + diag("Since there's no foo, check that /etc/bar is set up right"); + +which would produce: + + not ok 42 - There's a foo user + # Failed test (foo.t at line 52) + # Since there's no foo, check that /etc/bar is set up right. + +You might remember C<ok() or diag()> with the mnemonic C<open() or +die()>. + +All diag()s can be made silent by passing the "no_diag" option to +Test::More. C<use Test::More tests => 1, 'no_diag'>. This is useful +if you have diagnostics for personal testing but then wish to make +them silent for release without commenting out each individual +statement. + +B<NOTE> The exact formatting of the diagnostic output is still +changing, but it is guaranteed that whatever you throw at it it won't +interfere with the test. + +=cut + +sub diag { + return unless $Show_Diag; + $Test->diag(@_); +} + + +=back + +=head2 Module tests + +You usually want to test if the module you're testing loads ok, rather +than just vomiting if its load fails. For such purposes we have +C<use_ok> and C<require_ok>. + +=over 4 + +=item B<use_ok> + + BEGIN { use_ok($module); } + BEGIN { use_ok($module, @imports); } + +These simply use the given $module and test to make sure the load +happened ok. It's recommended that you run use_ok() inside a BEGIN +block so its functions are exported at compile-time and prototypes are +properly honored. + +If @imports are given, they are passed through to the use. So this: + + BEGIN { use_ok('Some::Module', qw(foo bar)) } + +is like doing this: + + use Some::Module qw(foo bar); + +Version numbers can be checked like so: + + # Just like "use Some::Module 1.02" + BEGIN { use_ok('Some::Module', 1.02) } + +Don't try to do this: + + BEGIN { + use_ok('Some::Module'); + + ...some code that depends on the use... + ...happening at compile time... + } + +because the notion of "compile-time" is relative. Instead, you want: + + BEGIN { use_ok('Some::Module') } + BEGIN { ...some code that depends on the use... } + + +=cut + +sub use_ok ($;@) { + my($module, @imports) = @_; + @imports = () unless @imports; + + my($pack,$filename,$line) = caller; + + local($@,$!); # eval sometimes interferes with $! + + if( @imports == 1 and $imports[0] =~ /^\d+(?:\.\d+)?$/ ) { + # probably a version check. Perl needs to see the bare number + # for it to work with non-Exporter based modules. + eval <<USE; +package $pack; +use $module $imports[0]; +USE + } + else { + eval <<USE; +package $pack; +use $module \@imports; +USE + } + + my $ok = $Test->ok( !$@, "use $module;" ); + + unless( $ok ) { + chomp $@; + $@ =~ s{^BEGIN failed--compilation aborted at .*$} + {BEGIN failed--compilation aborted at $filename line $line.}m; + $Test->diag(<<DIAGNOSTIC); + Tried to use '$module'. + Error: $@ +DIAGNOSTIC + + } + + return $ok; +} + +=item B<require_ok> + + require_ok($module); + +Like use_ok(), except it requires the $module. + +=cut + +sub require_ok ($) { + my($module) = shift; + + my $pack = caller; + + local($!, $@); # eval sometimes interferes with $! + eval <<REQUIRE; +package $pack; +require $module; +REQUIRE + + my $ok = $Test->ok( !$@, "require $module;" ); + + unless( $ok ) { + chomp $@; + $Test->diag(<<DIAGNOSTIC); + Tried to require '$module'. + Error: $@ +DIAGNOSTIC + + } + + return $ok; +} + +=back + +=head2 Conditional tests + +Sometimes running a test under certain conditions will cause the +test script to die. A certain function or method isn't implemented +(such as fork() on MacOS), some resource isn't available (like a +net connection) or a module isn't available. In these cases it's +necessary to skip tests, or declare that they are supposed to fail +but will work in the future (a todo test). + +For more details on the mechanics of skip and todo tests see +L<Test::Harness>. + +The way Test::More handles this is with a named block. Basically, a +block of tests which can be skipped over or made todo. It's best if I +just show you... + +=over 4 + +=item B<SKIP: BLOCK> + + SKIP: { + skip $why, $how_many if $condition; + + ...normal testing code goes here... + } + +This declares a block of tests that might be skipped, $how_many tests +there are, $why and under what $condition to skip them. An example is +the easiest way to illustrate: + + SKIP: { + eval { require HTML::Lint }; + + skip "HTML::Lint not installed", 2 if $@; + + my $lint = new HTML::Lint; + isa_ok( $lint, "HTML::Lint" ); + + $lint->parse( $html ); + is( $lint->errors, 0, "No errors found in HTML" ); + } + +If the user does not have HTML::Lint installed, the whole block of +code I<won't be run at all>. Test::More will output special ok's +which Test::Harness interprets as skipped, but passing, tests. +It's important that $how_many accurately reflects the number of tests +in the SKIP block so the # of tests run will match up with your plan. + +It's perfectly safe to nest SKIP blocks. Each SKIP block must have +the label C<SKIP>, or Test::More can't work its magic. + +You don't skip tests which are failing because there's a bug in your +program, or for which you don't yet have code written. For that you +use TODO. Read on. + +=cut + +#'# +sub skip { + my($why, $how_many) = @_; + + unless( defined $how_many ) { + # $how_many can only be avoided when no_plan is in use. + _carp "skip() needs to know \$how_many tests are in the block" + unless $Test::Builder::No_Plan; + $how_many = 1; + } + + for( 1..$how_many ) { + $Test->skip($why); + } + + local $^W = 0; + last SKIP; +} + + +=item B<TODO: BLOCK> + + TODO: { + local $TODO = $why if $condition; + + ...normal testing code goes here... + } + +Declares a block of tests you expect to fail and $why. Perhaps it's +because you haven't fixed a bug or haven't finished a new feature: + + TODO: { + local $TODO = "URI::Geller not finished"; + + my $card = "Eight of clubs"; + is( URI::Geller->your_card, $card, 'Is THIS your card?' ); + + my $spoon; + URI::Geller->bend_spoon; + is( $spoon, 'bent', "Spoon bending, that's original" ); + } + +With a todo block, the tests inside are expected to fail. Test::More +will run the tests normally, but print out special flags indicating +they are "todo". Test::Harness will interpret failures as being ok. +Should anything succeed, it will report it as an unexpected success. +You then know the thing you had todo is done and can remove the +TODO flag. + +The nice part about todo tests, as opposed to simply commenting out a +block of tests, is it's like having a programmatic todo list. You know +how much work is left to be done, you're aware of what bugs there are, +and you'll know immediately when they're fixed. + +Once a todo test starts succeeding, simply move it outside the block. +When the block is empty, delete it. + +B<NOTE>: TODO tests require a Test::Harness upgrade else it will +treat it as a normal failure. See L<BUGS and CAVEATS>) + + +=item B<todo_skip> + + TODO: { + todo_skip $why, $how_many if $condition; + + ...normal testing code... + } + +With todo tests, it's best to have the tests actually run. That way +you'll know when they start passing. Sometimes this isn't possible. +Often a failing test will cause the whole program to die or hang, even +inside an C<eval BLOCK> with and using C<alarm>. In these extreme +cases you have no choice but to skip over the broken tests entirely. + +The syntax and behavior is similar to a C<SKIP: BLOCK> except the +tests will be marked as failing but todo. Test::Harness will +interpret them as passing. + +=cut + +sub todo_skip { + my($why, $how_many) = @_; + + unless( defined $how_many ) { + # $how_many can only be avoided when no_plan is in use. + _carp "todo_skip() needs to know \$how_many tests are in the block" + unless $Test::Builder::No_Plan; + $how_many = 1; + } + + for( 1..$how_many ) { + $Test->todo_skip($why); + } + + local $^W = 0; + last TODO; +} + +=item When do I use SKIP vs. TODO? + +B<If it's something the user might not be able to do>, use SKIP. +This includes optional modules that aren't installed, running under +an OS that doesn't have some feature (like fork() or symlinks), or maybe +you need an Internet connection and one isn't available. + +B<If it's something the programmer hasn't done yet>, use TODO. This +is for any code you haven't written yet, or bugs you have yet to fix, +but want to put tests in your testing script (always a good idea). + + +=back + +=head2 Comparison functions + +Not everything is a simple eq check or regex. There are times you +need to see if two arrays are equivalent, for instance. For these +instances, Test::More provides a handful of useful functions. + +B<NOTE> These are NOT well-tested on circular references. Nor am I +quite sure what will happen with filehandles. + +=over 4 + +=item B<is_deeply> + + is_deeply( $this, $that, $test_name ); + +Similar to is(), except that if $this and $that are hash or array +references, it does a deep comparison walking each data structure to +see if they are equivalent. If the two structures are different, it +will display the place where they start differing. + +Test::Differences and Test::Deep provide more in-depth functionality +along these lines. + +=cut + +use vars qw(@Data_Stack); +my $DNE = bless [], 'Does::Not::Exist'; +sub is_deeply { + unless( @_ == 2 or @_ == 3 ) { + my $msg = <<WARNING; +is_deeply() takes two or three args, you gave %d. +This usually means you passed an array or hash instead +of a reference to it +WARNING + chop $msg; # clip off newline so carp() will put in line/file + + _carp sprintf $msg, scalar @_; + } + + my($this, $that, $name) = @_; + + my $ok; + if( !ref $this || !ref $that ) { + $ok = $Test->is_eq($this, $that, $name); + } + else { + local @Data_Stack = (); + if( _deep_check($this, $that) ) { + $ok = $Test->ok(1, $name); + } + else { + $ok = $Test->ok(0, $name); + $ok = $Test->diag(_format_stack(@Data_Stack)); + } + } + + return $ok; +} + +sub _format_stack { + my(@Stack) = @_; + + my $var = '$FOO'; + my $did_arrow = 0; + foreach my $entry (@Stack) { + my $type = $entry->{type} || ''; + my $idx = $entry->{'idx'}; + if( $type eq 'HASH' ) { + $var .= "->" unless $did_arrow++; + $var .= "{$idx}"; + } + elsif( $type eq 'ARRAY' ) { + $var .= "->" unless $did_arrow++; + $var .= "[$idx]"; + } + elsif( $type eq 'REF' ) { + $var = "\${$var}"; + } + } + + my @vals = @{$Stack[-1]{vals}}[0,1]; + my @vars = (); + ($vars[0] = $var) =~ s/\$FOO/ \$got/; + ($vars[1] = $var) =~ s/\$FOO/\$expected/; + + my $out = "Structures begin differing at:\n"; + foreach my $idx (0..$#vals) { + my $val = $vals[$idx]; + $vals[$idx] = !defined $val ? 'undef' : + $val eq $DNE ? "Does not exist" + : "'$val'"; + } + + $out .= "$vars[0] = $vals[0]\n"; + $out .= "$vars[1] = $vals[1]\n"; + + $out =~ s/^/ /msg; + return $out; +} + + +=item B<eq_array> + + eq_array(\@this, \@that); + +Checks if two arrays are equivalent. This is a deep check, so +multi-level structures are handled correctly. + +=cut + +#'# +sub eq_array { + my($a1, $a2) = @_; + return 1 if $a1 eq $a2; + + my $ok = 1; + my $max = $#$a1 > $#$a2 ? $#$a1 : $#$a2; + for (0..$max) { + my $e1 = $_ > $#$a1 ? $DNE : $a1->[$_]; + my $e2 = $_ > $#$a2 ? $DNE : $a2->[$_]; + + push @Data_Stack, { type => 'ARRAY', idx => $_, vals => [$e1, $e2] }; + $ok = _deep_check($e1,$e2); + pop @Data_Stack if $ok; + + last unless $ok; + } + return $ok; +} + +sub _deep_check { + my($e1, $e2) = @_; + my $ok = 0; + + my $eq; + { + # Quiet uninitialized value warnings when comparing undefs. + local $^W = 0; + + if( $e1 eq $e2 ) { + $ok = 1; + } + else { + if( UNIVERSAL::isa($e1, 'ARRAY') and + UNIVERSAL::isa($e2, 'ARRAY') ) + { + $ok = eq_array($e1, $e2); + } + elsif( UNIVERSAL::isa($e1, 'HASH') and + UNIVERSAL::isa($e2, 'HASH') ) + { + $ok = eq_hash($e1, $e2); + } + elsif( UNIVERSAL::isa($e1, 'REF') and + UNIVERSAL::isa($e2, 'REF') ) + { + push @Data_Stack, { type => 'REF', vals => [$e1, $e2] }; + $ok = _deep_check($$e1, $$e2); + pop @Data_Stack if $ok; + } + elsif( UNIVERSAL::isa($e1, 'SCALAR') and + UNIVERSAL::isa($e2, 'SCALAR') ) + { + push @Data_Stack, { type => 'REF', vals => [$e1, $e2] }; + $ok = _deep_check($$e1, $$e2); + } + else { + push @Data_Stack, { vals => [$e1, $e2] }; + $ok = 0; + } + } + } + + return $ok; +} + + +=item B<eq_hash> + + eq_hash(\%this, \%that); + +Determines if the two hashes contain the same keys and values. This +is a deep check. + +=cut + +sub eq_hash { + my($a1, $a2) = @_; + return 1 if $a1 eq $a2; + + my $ok = 1; + my $bigger = keys %$a1 > keys %$a2 ? $a1 : $a2; + foreach my $k (keys %$bigger) { + my $e1 = exists $a1->{$k} ? $a1->{$k} : $DNE; + my $e2 = exists $a2->{$k} ? $a2->{$k} : $DNE; + + push @Data_Stack, { type => 'HASH', idx => $k, vals => [$e1, $e2] }; + $ok = _deep_check($e1, $e2); + pop @Data_Stack if $ok; + + last unless $ok; + } + + return $ok; +} + +=item B<eq_set> + + eq_set(\@this, \@that); + +Similar to eq_array(), except the order of the elements is B<not> +important. This is a deep check, but the irrelevancy of order only +applies to the top level. + +B<NOTE> By historical accident, this is not a true set comparision. +While the order of elements does not matter, duplicate elements do. + +=cut + +# We must make sure that references are treated neutrally. It really +# doesn't matter how we sort them, as long as both arrays are sorted +# with the same algorithm. +sub _bogus_sort { local $^W = 0; ref $a ? -1 : ref $b ? 1 : $a cmp $b } + +sub eq_set { + my($a1, $a2) = @_; + return 0 unless @$a1 == @$a2; + + # There's faster ways to do this, but this is easiest. + return eq_array( [sort _bogus_sort @$a1], [sort _bogus_sort @$a2] ); +} + +=back + + +=head2 Extending and Embedding Test::More + +Sometimes the Test::More interface isn't quite enough. Fortunately, +Test::More is built on top of Test::Builder which provides a single, +unified backend for any test library to use. This means two test +libraries which both use Test::Builder B<can be used together in the +same program>. + +If you simply want to do a little tweaking of how the tests behave, +you can access the underlying Test::Builder object like so: + +=over 4 + +=item B<builder> + + my $test_builder = Test::More->builder; + +Returns the Test::Builder object underlying Test::More for you to play +with. + +=cut + +sub builder { + return Test::Builder->new; +} + +=back + + +=head1 EXIT CODES + +If all your tests passed, Test::Builder will exit with zero (which is +normal). If anything failed it will exit with how many failed. If +you run less (or more) tests than you planned, the missing (or extras) +will be considered failures. If no tests were ever run Test::Builder +will throw a warning and exit with 255. If the test died, even after +having successfully completed all its tests, it will still be +considered a failure and will exit with 255. + +So the exit codes are... + + 0 all tests successful + 255 test died + any other number how many failed (including missing or extras) + +If you fail more than 254 tests, it will be reported as 254. + + +=head1 NOTES + +Test::More is B<explicitly> tested all the way back to perl 5.004. + +=head1 BUGS and CAVEATS + +=over 4 + +=item Threads + +Test::More will only be aware of threads if "use threads" has been done +I<before> Test::More is loaded. This is ok: + + use threads; + use Test::More; + +This may cause problems: + + use Test::More + use threads; + +=item Making your own ok() + +If you are trying to extend Test::More, don't. Use Test::Builder +instead. + +=item The eq_* family has some caveats. + +=item Test::Harness upgrade + +no_plan and todo depend on new Test::Harness features and fixes. If +you're going to distribute tests that use no_plan or todo your +end-users will have to upgrade Test::Harness to the latest one on +CPAN. If you avoid no_plan and TODO tests, the stock Test::Harness +will work fine. + +Installing Test::More should also upgrade Test::Harness. + +=back + + +=head1 HISTORY + +This is a case of convergent evolution with Joshua Pritikin's Test +module. I was largely unaware of its existence when I'd first +written my own ok() routines. This module exists because I can't +figure out how to easily wedge test names into Test's interface (along +with a few other problems). + +The goal here is to have a testing utility that's simple to learn, +quick to use and difficult to trip yourself up with while still +providing more flexibility than the existing Test.pm. As such, the +names of the most common routines are kept tiny, special cases and +magic side-effects are kept to a minimum. WYSIWYG. + + +=head1 SEE ALSO + +L<Test::Simple> if all this confuses you and you just want to write +some tests. You can upgrade to Test::More later (it's forward +compatible). + +L<Test> is the old testing module. Its main benefit is that it has +been distributed with Perl since 5.004_05. + +L<Test::Harness> for details on how your test results are interpreted +by Perl. + +L<Test::Differences> for more ways to test complex data structures. +And it plays well with Test::More. + +L<Test::Class> is like XUnit but more perlish. + +L<Test::Deep> gives you more powerful complex data structure testing. + +L<Test::Unit> is XUnit style testing. + +L<Test::Inline> shows the idea of embedded testing. + +L<Bundle::Test> installs a whole bunch of useful test modules. + + +=head1 AUTHORS + +Michael G Schwern E<lt>schwern@pobox.comE<gt> with much inspiration +from Joshua Pritikin's Test module and lots of help from Barrie +Slaymaker, Tony Bowden, blackstar.co.uk, chromatic and the perl-qa gang. + + +=head1 COPYRIGHT + +Copyright 2001, 2002 by Michael G Schwern E<lt>schwern@pobox.comE<gt>. + +This program is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. + +See F<http://www.perl.com/perl/misc/Artistic.html> + +=cut + +1; diff --git a/cpan/dist/PathTools/t/lib/Test/Simple.pm b/cpan/dist/PathTools/t/lib/Test/Simple.pm new file mode 100644 index 00000000..d7c5cbe9 --- /dev/null +++ b/cpan/dist/PathTools/t/lib/Test/Simple.pm @@ -0,0 +1,235 @@ +package Test::Simple; + +use 5.004; + +use strict 'vars'; +use vars qw($VERSION); +$VERSION = '0.49'; + + +use Test::Builder; +my $Test = Test::Builder->new; + +sub import { + my $self = shift; + my $caller = caller; + *{$caller.'::ok'} = \&ok; + + $Test->exported_to($caller); + $Test->plan(@_); +} + + +=head1 NAME + +Test::Simple - Basic utilities for writing tests. + +=head1 SYNOPSIS + + use Test::Simple tests => 1; + + ok( $foo eq $bar, 'foo is bar' ); + + +=head1 DESCRIPTION + +** If you are unfamiliar with testing B<read Test::Tutorial> first! ** + +This is an extremely simple, extremely basic module for writing tests +suitable for CPAN modules and other pursuits. If you wish to do more +complicated testing, use the Test::More module (a drop-in replacement +for this one). + +The basic unit of Perl testing is the ok. For each thing you want to +test your program will print out an "ok" or "not ok" to indicate pass +or fail. You do this with the ok() function (see below). + +The only other constraint is you must pre-declare how many tests you +plan to run. This is in case something goes horribly wrong during the +test and your test program aborts, or skips a test or whatever. You +do this like so: + + use Test::Simple tests => 23; + +You must have a plan. + + +=over 4 + +=item B<ok> + + ok( $foo eq $bar, $name ); + ok( $foo eq $bar ); + +ok() is given an expression (in this case C<$foo eq $bar>). If it's +true, the test passed. If it's false, it didn't. That's about it. + +ok() prints out either "ok" or "not ok" along with a test number (it +keeps track of that for you). + + # This produces "ok 1 - Hell not yet frozen over" (or not ok) + ok( get_temperature($hell) > 0, 'Hell not yet frozen over' ); + +If you provide a $name, that will be printed along with the "ok/not +ok" to make it easier to find your test when if fails (just search for +the name). It also makes it easier for the next guy to understand +what your test is for. It's highly recommended you use test names. + +All tests are run in scalar context. So this: + + ok( @stuff, 'I have some stuff' ); + +will do what you mean (fail if stuff is empty) + +=cut + +sub ok ($;$) { + $Test->ok(@_); +} + + +=back + +Test::Simple will start by printing number of tests run in the form +"1..M" (so "1..5" means you're going to run 5 tests). This strange +format lets Test::Harness know how many tests you plan on running in +case something goes horribly wrong. + +If all your tests passed, Test::Simple will exit with zero (which is +normal). If anything failed it will exit with how many failed. If +you run less (or more) tests than you planned, the missing (or extras) +will be considered failures. If no tests were ever run Test::Simple +will throw a warning and exit with 255. If the test died, even after +having successfully completed all its tests, it will still be +considered a failure and will exit with 255. + +So the exit codes are... + + 0 all tests successful + 255 test died + any other number how many failed (including missing or extras) + +If you fail more than 254 tests, it will be reported as 254. + +This module is by no means trying to be a complete testing system. +It's just to get you started. Once you're off the ground its +recommended you look at L<Test::More>. + + +=head1 EXAMPLE + +Here's an example of a simple .t file for the fictional Film module. + + use Test::Simple tests => 5; + + use Film; # What you're testing. + + my $btaste = Film->new({ Title => 'Bad Taste', + Director => 'Peter Jackson', + Rating => 'R', + NumExplodingSheep => 1 + }); + ok( defined($btaste) and ref $btaste eq 'Film', 'new() works' ); + + ok( $btaste->Title eq 'Bad Taste', 'Title() get' ); + ok( $btaste->Director eq 'Peter Jackson', 'Director() get' ); + ok( $btaste->Rating eq 'R', 'Rating() get' ); + ok( $btaste->NumExplodingSheep == 1, 'NumExplodingSheep() get' ); + +It will produce output like this: + + 1..5 + ok 1 - new() works + ok 2 - Title() get + ok 3 - Director() get + not ok 4 - Rating() get + # Failed test (t/film.t at line 14) + ok 5 - NumExplodingSheep() get + # Looks like you failed 1 tests of 5 + +Indicating the Film::Rating() method is broken. + + +=head1 CAVEATS + +Test::Simple will only report a maximum of 254 failures in its exit +code. If this is a problem, you probably have a huge test script. +Split it into multiple files. (Otherwise blame the Unix folks for +using an unsigned short integer as the exit status). + +Because VMS's exit codes are much, much different than the rest of the +universe, and perl does horrible mangling to them that gets in my way, +it works like this on VMS. + + 0 SS$_NORMAL all tests successful + 4 SS$_ABORT something went wrong + +Unfortunately, I can't differentiate any further. + + +=head1 NOTES + +Test::Simple is B<explicitly> tested all the way back to perl 5.004. + +Test::Simple is thread-safe in perl 5.8.0 and up. + +=head1 HISTORY + +This module was conceived while talking with Tony Bowden in his +kitchen one night about the problems I was having writing some really +complicated feature into the new Testing module. He observed that the +main problem is not dealing with these edge cases but that people hate +to write tests B<at all>. What was needed was a dead simple module +that took all the hard work out of testing and was really, really easy +to learn. Paul Johnson simultaneously had this idea (unfortunately, +he wasn't in Tony's kitchen). This is it. + + +=head1 SEE ALSO + +=over 4 + +=item L<Test::More> + +More testing functions! Once you outgrow Test::Simple, look at +Test::More. Test::Simple is 100% forward compatible with Test::More +(i.e. you can just use Test::More instead of Test::Simple in your +programs and things will still work). + +=item L<Test> + +The original Perl testing module. + +=item L<Test::Unit> + +Elaborate unit testing. + +=item L<Test::Inline>, L<SelfTest> + +Embed tests in your code! + +=item L<Test::Harness> + +Interprets the output of your test program. + +=back + + +=head1 AUTHORS + +Idea by Tony Bowden and Paul Johnson, code by Michael G Schwern +E<lt>schwern@pobox.comE<gt>, wardrobe by Calvin Klein. + + +=head1 COPYRIGHT + +Copyright 2001 by Michael G Schwern E<lt>schwern@pobox.comE<gt>. + +This program is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. + +See F<http://www.perl.com/perl/misc/Artistic.html> + +=cut + +1; diff --git a/cpan/dist/PathTools/t/lib/Test/Tutorial.pod b/cpan/dist/PathTools/t/lib/Test/Tutorial.pod new file mode 100644 index 00000000..7a6c084d --- /dev/null +++ b/cpan/dist/PathTools/t/lib/Test/Tutorial.pod @@ -0,0 +1,603 @@ +=head1 NAME + +Test::Tutorial - A tutorial about writing really basic tests + +=head1 DESCRIPTION + + +I<AHHHHHHH!!!! NOT TESTING! Anything but testing! +Beat me, whip me, send me to Detroit, but don't make +me write tests!> + +I<*sob*> + +I<Besides, I don't know how to write the damned things.> + + +Is this you? Is writing tests right up there with writing +documentation and having your fingernails pulled out? Did you open up +a test and read + + ######## We start with some black magic + +and decide that's quite enough for you? + +It's ok. That's all gone now. We've done all the black magic for +you. And here are the tricks... + + +=head2 Nuts and bolts of testing. + +Here's the most basic test program. + + #!/usr/bin/perl -w + + print "1..1\n"; + + print 1 + 1 == 2 ? "ok 1\n" : "not ok 1\n"; + +since 1 + 1 is 2, it prints: + + 1..1 + ok 1 + +What this says is: C<1..1> "I'm going to run one test." [1] C<ok 1> +"The first test passed". And that's about all magic there is to +testing. Your basic unit of testing is the I<ok>. For each thing you +test, an C<ok> is printed. Simple. B<Test::Harness> interprets your test +results to determine if you succeeded or failed (more on that later). + +Writing all these print statements rapidly gets tedious. Fortunately, +there's B<Test::Simple>. It has one function, C<ok()>. + + #!/usr/bin/perl -w + + use Test::Simple tests => 1; + + ok( 1 + 1 == 2 ); + +and that does the same thing as the code above. C<ok()> is the backbone +of Perl testing, and we'll be using it instead of roll-your-own from +here on. If C<ok()> gets a true value, the test passes. False, it +fails. + + #!/usr/bin/perl -w + + use Test::Simple tests => 2; + ok( 1 + 1 == 2 ); + ok( 2 + 2 == 5 ); + +from that comes + + 1..2 + ok 1 + not ok 2 + # Failed test (test.pl at line 5) + # Looks like you failed 1 tests of 2. + +C<1..2> "I'm going to run two tests." This number is used to ensure +your test program ran all the way through and didn't die or skip some +tests. C<ok 1> "The first test passed." C<not ok 2> "The second test +failed". Test::Simple helpfully prints out some extra commentary about +your tests. + +It's not scary. Come, hold my hand. We're going to give an example +of testing a module. For our example, we'll be testing a date +library, B<Date::ICal>. It's on CPAN, so download a copy and follow +along. [2] + + +=head2 Where to start? + +This is the hardest part of testing, where do you start? People often +get overwhelmed at the apparent enormity of the task of testing a +whole module. Best place to start is at the beginning. Date::ICal is +an object-oriented module, and that means you start by making an +object. So we test C<new()>. + + #!/usr/bin/perl -w + + use Test::Simple tests => 2; + + use Date::ICal; + + my $ical = Date::ICal->new; # create an object + ok( defined $ical ); # check that we got something + ok( $ical->isa('Date::ICal') ); # and it's the right class + +run that and you should get: + + 1..2 + ok 1 + ok 2 + +congratulations, you've written your first useful test. + + +=head2 Names + +That output isn't terribly descriptive, is it? When you have two +tests you can figure out which one is #2, but what if you have 102? + +Each test can be given a little descriptive name as the second +argument to C<ok()>. + + use Test::Simple tests => 2; + + ok( defined $ical, 'new() returned something' ); + ok( $ical->isa('Date::ICal'), " and it's the right class" ); + +So now you'd see... + + 1..2 + ok 1 - new() returned something + ok 2 - and it's the right class + + +=head2 Test the manual + +Simplest way to build up a decent testing suite is to just test what +the manual says it does. [3] Let's pull something out of the +L<Date::ICal/SYNOPSIS> and test that all its bits work. + + #!/usr/bin/perl -w + + use Test::Simple tests => 8; + + use Date::ICal; + + $ical = Date::ICal->new( year => 1964, month => 10, day => 16, + hour => 16, min => 12, sec => 47, + tz => '0530' ); + + ok( defined $ical, 'new() returned something' ); + ok( $ical->isa('Date::ICal'), " and it's the right class" ); + ok( $ical->sec == 47, ' sec()' ); + ok( $ical->min == 12, ' min()' ); + ok( $ical->hour == 16, ' hour()' ); + ok( $ical->day == 17, ' day()' ); + ok( $ical->month == 10, ' month()' ); + ok( $ical->year == 1964, ' year()' ); + +run that and you get: + + 1..8 + ok 1 - new() returned something + ok 2 - and it's the right class + ok 3 - sec() + ok 4 - min() + ok 5 - hour() + not ok 6 - day() + # Failed test (- at line 16) + ok 7 - month() + ok 8 - year() + # Looks like you failed 1 tests of 8. + +Whoops, a failure! [4] Test::Simple helpfully lets us know on what line +the failure occured, but not much else. We were supposed to get 17, +but we didn't. What did we get?? Dunno. We'll have to re-run the +test in the debugger or throw in some print statements to find out. + +Instead, we'll switch from B<Test::Simple> to B<Test::More>. B<Test::More> +does everything B<Test::Simple> does, and more! In fact, Test::More does +things I<exactly> the way Test::Simple does. You can literally swap +Test::Simple out and put Test::More in its place. That's just what +we're going to do. + +Test::More does more than Test::Simple. The most important difference +at this point is it provides more informative ways to say "ok". +Although you can write almost any test with a generic C<ok()>, it +can't tell you what went wrong. Instead, we'll use the C<is()> +function, which lets us declare that something is supposed to be the +same as something else: + + #!/usr/bin/perl -w + + use Test::More tests => 8; + + use Date::ICal; + + $ical = Date::ICal->new( year => 1964, month => 10, day => 16, + hour => 16, min => 12, sec => 47, + tz => '0530' ); + + ok( defined $ical, 'new() returned something' ); + ok( $ical->isa('Date::ICal'), " and it's the right class" ); + is( $ical->sec, 47, ' sec()' ); + is( $ical->min, 12, ' min()' ); + is( $ical->hour, 16, ' hour()' ); + is( $ical->day, 17, ' day()' ); + is( $ical->month, 10, ' month()' ); + is( $ical->year, 1964, ' year()' ); + +"Is C<$ical-E<gt>sec> 47?" "Is C<$ical-E<gt>min> 12?" With C<is()> in place, +you get some more information + + 1..8 + ok 1 - new() returned something + ok 2 - and it's the right class + ok 3 - sec() + ok 4 - min() + ok 5 - hour() + not ok 6 - day() + # Failed test (- at line 16) + # got: '16' + # expected: '17' + ok 7 - month() + ok 8 - year() + # Looks like you failed 1 tests of 8. + +letting us know that C<$ical-E<gt>day> returned 16, but we expected 17. A +quick check shows that the code is working fine, we made a mistake +when writing up the tests. Just change it to: + + is( $ical->day, 16, ' day()' ); + +and everything works. + +So any time you're doing a "this equals that" sort of test, use C<is()>. +It even works on arrays. The test is always in scalar context, so you +can test how many elements are in a list this way. [5] + + is( @foo, 5, 'foo has 5 elements' ); + + +=head2 Sometimes the tests are wrong + +Which brings us to a very important lesson. Code has bugs. Tests are +code. Ergo, tests have bugs. A failing test could mean a bug in the +code, but don't discount the possibility that the test is wrong. + +On the flip side, don't be tempted to prematurely declare a test +incorrect just because you're having trouble finding the bug. +Invalidating a test isn't something to be taken lightly, and don't use +it as a cop out to avoid work. + + +=head2 Testing lots of values + +We're going to be wanting to test a lot of dates here, trying to trick +the code with lots of different edge cases. Does it work before 1970? +After 2038? Before 1904? Do years after 10,000 give it trouble? +Does it get leap years right? We could keep repeating the code above, +or we could set up a little try/expect loop. + + use Test::More tests => 32; + use Date::ICal; + + my %ICal_Dates = ( + # An ICal string And the year, month, date + # hour, minute and second we expect. + '19971024T120000' => # from the docs. + [ 1997, 10, 24, 12, 0, 0 ], + '20390123T232832' => # after the Unix epoch + [ 2039, 1, 23, 23, 28, 32 ], + '19671225T000000' => # before the Unix epoch + [ 1967, 12, 25, 0, 0, 0 ], + '18990505T232323' => # before the MacOS epoch + [ 1899, 5, 5, 23, 23, 23 ], + ); + + + while( my($ical_str, $expect) = each %ICal_Dates ) { + my $ical = Date::ICal->new( ical => $ical_str ); + + ok( defined $ical, "new(ical => '$ical_str')" ); + ok( $ical->isa('Date::ICal'), " and it's the right class" ); + + is( $ical->year, $expect->[0], ' year()' ); + is( $ical->month, $expect->[1], ' month()' ); + is( $ical->day, $expect->[2], ' day()' ); + is( $ical->hour, $expect->[3], ' hour()' ); + is( $ical->min, $expect->[4], ' min()' ); + is( $ical->sec, $expect->[5], ' sec()' ); + } + +So now we can test bunches of dates by just adding them to +C<%ICal_Dates>. Now that it's less work to test with more dates, you'll +be inclined to just throw more in as you think of them. +Only problem is, every time we add to that we have to keep adjusting +the C<use Test::More tests =E<gt> ##> line. That can rapidly get +annoying. There's two ways to make this work better. + +First, we can calculate the plan dynamically using the C<plan()> +function. + + use Test::More; + use Date::ICal; + + my %ICal_Dates = ( + ...same as before... + ); + + # For each key in the hash we're running 8 tests. + plan tests => keys %ICal_Dates * 8; + +Or to be even more flexible, we use C<no_plan>. This means we're just +running some tests, don't know how many. [6] + + use Test::More 'no_plan'; # instead of tests => 32 + +now we can just add tests and not have to do all sorts of math to +figure out how many we're running. + + +=head2 Informative names + +Take a look at this line here + + ok( defined $ical, "new(ical => '$ical_str')" ); + +we've added more detail about what we're testing and the ICal string +itself we're trying out to the name. So you get results like: + + ok 25 - new(ical => '19971024T120000') + ok 26 - and it's the right class + ok 27 - year() + ok 28 - month() + ok 29 - day() + ok 30 - hour() + ok 31 - min() + ok 32 - sec() + +if something in there fails, you'll know which one it was and that +will make tracking down the problem easier. So try to put a bit of +debugging information into the test names. + +Describe what the tests test, to make debugging a failed test easier +for you or for the next person who runs your test. + + +=head2 Skipping tests + +Poking around in the existing Date::ICal tests, I found this in +F<t/01sanity.t> [7] + + #!/usr/bin/perl -w + + use Test::More tests => 7; + use Date::ICal; + + # Make sure epoch time is being handled sanely. + my $t1 = Date::ICal->new( epoch => 0 ); + is( $t1->epoch, 0, "Epoch time of 0" ); + + # XXX This will only work on unix systems. + is( $t1->ical, '19700101Z', " epoch to ical" ); + + is( $t1->year, 1970, " year()" ); + is( $t1->month, 1, " month()" ); + is( $t1->day, 1, " day()" ); + + # like the tests above, but starting with ical instead of epoch + my $t2 = Date::ICal->new( ical => '19700101Z' ); + is( $t2->ical, '19700101Z', "Start of epoch in ICal notation" ); + + is( $t2->epoch, 0, " and back to ICal" ); + +The beginning of the epoch is different on most non-Unix operating +systems [8]. Even though Perl smooths out the differences for the most +part, certain ports do it differently. MacPerl is one off the top of +my head. [9] We I<know> this will never work on MacOS. So rather than +just putting a comment in the test, we can explicitly say it's never +going to work and skip the test. + + use Test::More tests => 7; + use Date::ICal; + + # Make sure epoch time is being handled sanely. + my $t1 = Date::ICal->new( epoch => 0 ); + is( $t1->epoch, 0, "Epoch time of 0" ); + + SKIP: { + skip('epoch to ICal not working on MacOS', 6) + if $^O eq 'MacOS'; + + is( $t1->ical, '19700101Z', " epoch to ical" ); + + is( $t1->year, 1970, " year()" ); + is( $t1->month, 1, " month()" ); + is( $t1->day, 1, " day()" ); + + # like the tests above, but starting with ical instead of epoch + my $t2 = Date::ICal->new( ical => '19700101Z' ); + is( $t2->ical, '19700101Z', "Start of epoch in ICal notation" ); + + is( $t2->epoch, 0, " and back to ICal" ); + } + +A little bit of magic happens here. When running on anything but +MacOS, all the tests run normally. But when on MacOS, C<skip()> causes +the entire contents of the SKIP block to be jumped over. It's never +run. Instead, it prints special output that tells Test::Harness that +the tests have been skipped. + + 1..7 + ok 1 - Epoch time of 0 + ok 2 # skip epoch to ICal not working on MacOS + ok 3 # skip epoch to ICal not working on MacOS + ok 4 # skip epoch to ICal not working on MacOS + ok 5 # skip epoch to ICal not working on MacOS + ok 6 # skip epoch to ICal not working on MacOS + ok 7 # skip epoch to ICal not working on MacOS + +This means your tests won't fail on MacOS. This means less emails +from MacPerl users telling you about failing tests that you know will +never work. You've got to be careful with skip tests. These are for +tests which don't work and I<never will>. It is not for skipping +genuine bugs (we'll get to that in a moment). + +The tests are wholly and completely skipped. [10] This will work. + + SKIP: { + skip("I don't wanna die!"); + + die, die, die, die, die; + } + + +=head2 Todo tests + +Thumbing through the Date::ICal man page, I came across this: + + ical + + $ical_string = $ical->ical; + + Retrieves, or sets, the date on the object, using any + valid ICal date/time string. + +"Retrieves or sets". Hmmm, didn't see a test for using C<ical()> to set +the date in the Date::ICal test suite. So I'll write one. + + use Test::More tests => 1; + use Date::ICal; + + my $ical = Date::ICal->new; + $ical->ical('20201231Z'); + is( $ical->ical, '20201231Z', 'Setting via ical()' ); + +run that and I get + + 1..1 + not ok 1 - Setting via ical() + # Failed test (- at line 6) + # got: '20010814T233649Z' + # expected: '20201231Z' + # Looks like you failed 1 tests of 1. + +Whoops! Looks like it's unimplemented. Let's assume we don't have +the time to fix this. [11] Normally, you'd just comment out the test +and put a note in a todo list somewhere. Instead, we're going to +explicitly state "this test will fail" by wrapping it in a C<TODO> block. + + use Test::More tests => 1; + + TODO: { + local $TODO = 'ical($ical) not yet implemented'; + + my $ical = Date::ICal->new; + $ical->ical('20201231Z'); + + is( $ical->ical, '20201231Z', 'Setting via ical()' ); + } + +Now when you run, it's a little different: + + 1..1 + not ok 1 - Setting via ical() # TODO ical($ical) not yet implemented + # got: '20010822T201551Z' + # expected: '20201231Z' + +Test::More doesn't say "Looks like you failed 1 tests of 1". That '# +TODO' tells Test::Harness "this is supposed to fail" and it treats a +failure as a successful test. So you can write tests even before +you've fixed the underlying code. + +If a TODO test passes, Test::Harness will report it "UNEXPECTEDLY +SUCCEEDED". When that happens, you simply remove the TODO block with +C<local $TODO> and turn it into a real test. + + +=head2 Testing with taint mode. + +Taint mode is a funny thing. It's the globalest of all global +features. Once you turn it on, it affects I<all> code in your program +and I<all> modules used (and all the modules they use). If a single +piece of code isn't taint clean, the whole thing explodes. With that +in mind, it's very important to ensure your module works under taint +mode. + +It's very simple to have your tests run under taint mode. Just throw +a C<-T> into the C<#!> line. Test::Harness will read the switches +in C<#!> and use them to run your tests. + + #!/usr/bin/perl -Tw + + ...test normally here... + +So when you say C<make test> it will be run with taint mode and +warnings on. + + +=head1 FOOTNOTES + +=over 4 + +=item 1 + +The first number doesn't really mean anything, but it has to be 1. +It's the second number that's important. + +=item 2 + +For those following along at home, I'm using version 1.31. It has +some bugs, which is good -- we'll uncover them with our tests. + +=item 3 + +You can actually take this one step further and test the manual +itself. Have a look at B<Test::Inline> (formerly B<Pod::Tests>). + +=item 4 + +Yes, there's a mistake in the test suite. What! Me, contrived? + +=item 5 + +We'll get to testing the contents of lists later. + +=item 6 + +But what happens if your test program dies halfway through?! Since we +didn't say how many tests we're going to run, how can we know it +failed? No problem, Test::More employs some magic to catch that death +and turn the test into a failure, even if every test passed up to that +point. + +=item 7 + +I cleaned it up a little. + +=item 8 + +Most Operating Systems record time as the number of seconds since a +certain date. This date is the beginning of the epoch. Unix's starts +at midnight January 1st, 1970 GMT. + +=item 9 + +MacOS's epoch is midnight January 1st, 1904. VMS's is midnight, +November 17th, 1858, but vmsperl emulates the Unix epoch so it's not a +problem. + +=item 10 + +As long as the code inside the SKIP block at least compiles. Please +don't ask how. No, it's not a filter. + +=item 11 + +Do NOT be tempted to use TODO tests as a way to avoid fixing simple +bugs! + +=back + +=head1 AUTHORS + +Michael G Schwern E<lt>schwern@pobox.comE<gt> and the perl-qa dancers! + +=head1 COPYRIGHT + +Copyright 2001 by Michael G Schwern E<lt>schwern@pobox.comE<gt>. + +This documentation is free; you can redistribute it and/or modify it +under the same terms as Perl itself. + +Irrespective of its distribution, all code examples in these files +are hereby placed into the public domain. You are permitted and +encouraged to use this code in your own programs for fun +or for profit as you see fit. A simple comment in the code giving +credit would be courteous but is not required. + +=cut diff --git a/cpan/dist/PathTools/t/rel2abs2rel.t b/cpan/dist/PathTools/t/rel2abs2rel.t new file mode 100644 index 00000000..0d684f19 --- /dev/null +++ b/cpan/dist/PathTools/t/rel2abs2rel.t @@ -0,0 +1,73 @@ +#!/usr/bin/perl -w + +# Here we make sure File::Spec can properly deal with executables. +# VMS has some trouble with these. + +use File::Spec; +use lib File::Spec->catdir('t', 'lib'); + +use Test::More (-x $^X + ? (tests => 5) + : (skip_all => "Can't find an executable file") + ); + +BEGIN { # Set up a tiny script file + local *F; + open(F, ">rel2abs2rel$$.pl") + or die "Can't open rel2abs2rel$$.pl file for script -- $!\n"; + print F qq(print "ok\\n"\n); + close(F); +} +END { + 1 while unlink("rel2abs2rel$$.pl"); + 1 while unlink("rel2abs2rel$$.tmp"); +} + +use Config; + + +# Change 'perl' to './perl' so the shell doesn't go looking through PATH. +sub safe_rel { + my($perl) = shift; + $perl = File::Spec->catfile(File::Spec->curdir, $perl) unless + File::Spec->file_name_is_absolute($perl); + + return $perl; +} +# Make a putative perl binary say "ok\n". We have to do it this way +# because the filespec of the binary may contain characters that a +# command interpreter considers special, so we can't use the obvious +# `$perl -le "print 'ok'"`. And, for portability, we can't use fork(). +sub sayok{ + my $perl = shift; + open(STDOUTDUP, '>&STDOUT'); + open(STDOUT, ">rel2abs2rel$$.tmp") + or die "Can't open scratch file rel2abs2rel$$.tmp -- $!\n"; + system($perl, "rel2abs2rel$$.pl"); + open(STDOUT, '>&STDOUTDUP'); + close(STDOUTDUP); + + local *F; + open(F, "rel2abs2rel$$.tmp"); + local $/ = undef; + my $output = <F>; + close(F); + return $output; +} + +print "# Checking manipulations of \$^X=$^X\n"; + +my $perl = safe_rel($^X); +is( sayok($perl), "ok\n", "'$perl rel2abs2rel$$.pl' works" ); + +$perl = File::Spec->rel2abs($^X); +is( sayok($perl), "ok\n", "'$perl rel2abs2rel$$.pl' works" ); + +$perl = File::Spec->canonpath($perl); +is( sayok($perl), "ok\n", "canonpath(rel2abs($^X)) = $perl" ); + +$perl = safe_rel(File::Spec->abs2rel($perl)); +is( sayok($perl), "ok\n", "safe_rel(abs2rel(canonpath(rel2abs($^X)))) = $perl" ); + +$perl = safe_rel(File::Spec->canonpath($^X)); +is( sayok($perl), "ok\n", "safe_rel(canonpath($^X)) = $perl" ); diff --git a/cpan/dist/PathTools/t/rel2abs_vs_symlink.t b/cpan/dist/PathTools/t/rel2abs_vs_symlink.t new file mode 100644 index 00000000..556cff2d --- /dev/null +++ b/cpan/dist/PathTools/t/rel2abs_vs_symlink.t @@ -0,0 +1,37 @@ +#!/usr/bin/perl -w + +# Test that rel2abs() works correctly when the process is under a symlink +# See [rt.cpan.org 47637] + +use strict; + +use File::Path; +use File::Spec; + +# Do this to simulate already being inside a symlinked directory +# and having $ENV{PWD} set. +use Cwd qw(chdir); + +use Test::More; + +plan skip_all => "needs symlink()" if !eval { symlink("", ""); 1 }; + +plan tests => 1; + +my $real_dir = "for_rel2abs_test"; +my $symlink = "link_for_rel2abs_test"; +mkdir $real_dir or die "Can't make $real_dir: $!"; +END { rmtree $real_dir } + +symlink $real_dir, $symlink or die "Can't symlink $real_dir => $symlink: $!"; +END { unlink $symlink } + +chdir $symlink or die "Can't chdir into $symlink: $!"; + +TODO: { + local $TODO = 'Need to find a way to make cwd work reliably under symlinks"'; + like( File::Spec->rel2abs("."), qr/$symlink/ ); +} + +# So the unlinking works +chdir ".."; diff --git a/cpan/dist/PathTools/t/taint.t b/cpan/dist/PathTools/t/taint.t new file mode 100644 index 00000000..48f8c5bc --- /dev/null +++ b/cpan/dist/PathTools/t/taint.t @@ -0,0 +1,53 @@ +#!./perl -Tw +# Testing Cwd under taint mode. + +use strict; + +use Cwd; +chdir 't' unless $ENV{PERL_CORE}; + +use File::Spec; +use lib File::Spec->catdir('t', 'lib'); +use Test::More; +BEGIN { + plan( + ${^TAINT} + ? (tests => 21) + : (skip_all => "A perl without taint support") + ); +} + +use Scalar::Util qw/tainted/; + +my @Functions = qw(getcwd cwd fastcwd fastgetcwd + abs_path fast_abs_path + realpath fast_realpath + ); + +foreach my $func (@Functions) { + no strict 'refs'; + my $cwd; + eval { $cwd = &{'Cwd::'.$func} }; + is( $@, '', "$func() should not explode under taint mode" ); + ok( tainted($cwd), "its return value should be tainted" ); +} + +# Previous versions of Cwd tainted $^O +is !tainted($^O), 1, "\$^O should not be tainted"; + +{ + # [perl #126862] canonpath() loses taint + my $tainted = substr($ENV{PATH}, 0, 0); + # yes, getcwd()'s result should be tainted, and is tested above + # but be sure + ok tainted(File::Spec->canonpath($tainted . Cwd::getcwd)), + "canonpath() keeps taint on non-empty string"; + ok tainted(File::Spec->canonpath($tainted)), + "canonpath() keeps taint on empty string"; + + (Cwd::getcwd() =~ /^(.*)/); + my $untainted = $1; + ok !tainted($untainted), "make sure our untainted value is untainted"; + ok !tainted(File::Spec->canonpath($untainted)), + "canonpath() doesn't add taint to untainted string"; +} diff --git a/cpan/dist/PathTools/t/tmpdir.t b/cpan/dist/PathTools/t/tmpdir.t new file mode 100644 index 00000000..0f03dc55 --- /dev/null +++ b/cpan/dist/PathTools/t/tmpdir.t @@ -0,0 +1,53 @@ +use strict; +use Test::More tests => 8; + +# Grab all of the plain routines from File::Spec +use File::Spec; +use File::Spec::Win32; + +require_ok($_) foreach qw(File::Spec File::Spec::Win32); + + +if ($^O eq 'VMS') { + # hack: + # Need to cause the %ENV to get populated or you only get the builtins at + # first, and then something else can cause the hash to get populated. + my %look_env = %ENV; +} +my $num_keys = keys %ENV; +File::Spec->tmpdir; +is scalar keys %ENV, $num_keys, "tmpdir() shouldn't change the contents of %ENV"; + +SKIP: { + skip("Can't make list assignment to %ENV on this system", 1) + if $^O eq 'VMS'; + + local %ENV; + File::Spec::Win32->tmpdir; + is(scalar keys %ENV, 0, "Win32->tmpdir() shouldn't change the contents of %ENV"); +} + +File::Spec::Win32->tmpdir; +is(scalar keys %ENV, $num_keys, "Win32->tmpdir() shouldn't change the contents of %ENV"); + +# Changing tmpdir dynamically +for ('File::Spec', "File::Spec::Win32") { + SKIP: { + skip('sys$scratch: takes precedence over env on vms', 1) + if $^O eq 'VMS'; + local $ENV{TMPDIR} = $_->catfile($_->curdir, 'lib'); + -d $ENV{TMPDIR} && -w _ + or skip "Can't create usable TMPDIR env var", 1; + my $tmpdir1 = $_->tmpdir; + $ENV{TMPDIR} = $_->catfile($_->curdir, 't'); + -d $ENV{TMPDIR} && -w _ + or skip "Can't create usable TMPDIR env var", 1; + my $tmpdir2 = $_->tmpdir; + isn't $tmpdir2, $tmpdir1, "$_->tmpdir works with changing env"; + } +} + +ok( + File::Spec->file_name_is_absolute(File::Spec->tmpdir()), + "tmpdir() always returns an absolute path" +); diff --git a/cpan/dist/PathTools/t/win32.t b/cpan/dist/PathTools/t/win32.t new file mode 100644 index 00000000..3fa5cb86 --- /dev/null +++ b/cpan/dist/PathTools/t/win32.t @@ -0,0 +1,32 @@ +#!./perl + +use File::Spec; +use lib File::Spec->catdir('t', 'lib'); +use Test::More; + +if( $^O eq 'MSWin32' ) { + plan tests => 4; +} else { + plan skip_all => 'this is not win32'; +} + +use Cwd; +ok 1; + +my $cdir = getdcwd('C:'); +like $cdir, qr{^C:}i; + +my $ddir = getdcwd('D:'); +if (defined $ddir) { + like $ddir, qr{^D:}i; +} else { + # May not have a D: drive mounted + ok 1; +} + +# Ensure compatibility with naughty versions of Template::Toolkit, +# which pass in a bare $1 as an argument +'Foo/strawberry' =~ /(.*)/; +my $result = File::Spec::Win32->catfile('C:/cache', $1); +is( $result, 'C:\cache\Foo\strawberry' ); + diff --git a/cpan/lib/File/Spec/AmigaOS.pm b/cpan/lib/File/Spec/AmigaOS.pm new file mode 100644 index 00000000..e6d6f5f2 --- /dev/null +++ b/cpan/lib/File/Spec/AmigaOS.pm @@ -0,0 +1,61 @@ +package File::Spec::AmigaOS; + +use strict; +use vars qw(@ISA $VERSION); +require File::Spec::Unix; + +$VERSION = '3.62'; +$VERSION =~ tr/_//d; + +@ISA = qw(File::Spec::Unix); + +=head1 NAME + +File::Spec::AmigaOS - File::Spec for AmigaOS + +=head1 SYNOPSIS + + require File::Spec::AmigaOS; # Done automatically by File::Spec if needed + +=head1 DESCRIPTION + +Methods for manipulating file specifications. + +=head1 METHODS + +=over 2 + +=item tmpdir + +Returns $ENV{TMPDIR} or if that is unset, "/t". + +=cut + +my $tmpdir; +sub tmpdir { + return $tmpdir if defined $tmpdir; + $tmpdir = $_[0]->_tmpdir( $ENV{TMPDIR}, "/t" ); +} + +=item file_name_is_absolute + +Returns true if there's a colon in the file name, +or if it begins with a slash. + +=cut + +sub file_name_is_absolute { + my ($self, $file) = @_; + + # Not 100% robust as a "/" must not preceded a ":" + # but this cannot happen in a well formed path. + return $file =~ m{^/|:}s; +} + +=back + +All the other methods are from L<File::Spec::Unix>. + +=cut + +1; diff --git a/cpan/lib/MIME/Type.pod b/cpan/lib/MIME/Type.pod new file mode 100644 index 00000000..dc53058d --- /dev/null +++ b/cpan/lib/MIME/Type.pod @@ -0,0 +1,238 @@ +=encoding utf8 + +=head1 NAME + +MIME::Type - description of one MIME type + +=head1 SYNOPSIS + + use MIME::Types; + my $mimetypes = MIME::Types->new; + my MIME::Type $plaintext = $mimetypes->type('text/plain'); + print $plaintext->mediaType; # text + print $plaintext->subType; # plain + + my @ext = $plaintext->extensions; + print "@ext" # txt asc c cc h hh cpp + + print $plaintext->encoding # 8bit + if($plaintext->isBinary) # false + if($plaintext->isAscii) # true + if($plaintext->equals('text/plain') {...} + if($plaintext eq 'text/plain') # same + + print MIME::Type->simplified('x-appl/x-zip') # 'appl/zip' + +=head1 DESCRIPTION + +MIME types are used in MIME entities, for instance as part of e-mail +and HTTP traffic. Sometimes real knowledge about a mime-type is need. +Objects of C<MIME::Type> store the information on one such type. + +=head1 OVERLOADED + +=over 4 + +=item overload: B<string comparison> + +When a MIME::Type object is compared to either a string or another +MIME::TYpe, the L<equals()|MIME::Type/"Knowledge"> method is called. Comparison is smart, +which means that it extends common string comparison with some +features which are defined in the related RFCs. + +=item overload: B<stringification> + +The stringification (use of the object in a place where a string +is required) will result in the type name, the same as L<type()|MIME::Type/"Attributes"> +returns. + +example: use of stringification + + my $mime = MIME::Type->new('text/html'); + print "$mime\n"; # explicit stringification + print $mime; # implicit stringification + +=back + +=head1 METHODS + +=head2 Initiation + +=over 4 + +=item MIME::Type-E<gt>B<new>(%options) + +Create (I<instantiate>) a new MIME::Type object which manages one +mime type. + + -Option --Default + encoding <depends on type> + extensions [] + simplified <derived from type> + system undef + type <required> + +=over 2 + +=item encoding => '7bit'|'8bit'|'base64'|'quoted-printable' + +How must this data be encoded to be transported safely. The default +depends on the type: mimes with as main type C<text/> will default +to C<quoted-printable> and all other to C<base64>. + +=item extensions => REF-ARRAY + +An array of extensions which are using this mime. + +=item simplified => STRING + +The mime types main- and sub-label can both start with C<x->, to indicate +that is a non-registered name. Of course, after registration this flag +can disappear which adds to the confusion. The simplified string has the +C<x-> thingies removed and are translated to lower-case. + +=item system => REGEX + +Regular expression which defines for which systems this rule is valid. The +REGEX is matched on C<$^O>. + +=item type => STRING + +The type which is defined here. It consists of a I<type> and a I<sub-type>, +both case-insensitive. This module will return lower-case, but accept +upper-case. + +=back + +=back + +=head2 Attributes + +=over 4 + +=item $obj-E<gt>B<encoding>() + +Returns the type of encoding which is required to transport data of this +type safely. + +=item $obj-E<gt>B<extensions>() + +Returns a list of extensions which are known to be used for this +mime type. + +=item $obj-E<gt>B<simplified>( [$string] ) + +=item MIME::Type-E<gt>B<simplified>( [$string] ) + +Returns the simplified mime type for this object or the specified STRING. +Mime type names can get officially registered. Until then, they have to +carry an C<x-> preamble to indicate that. Of course, after recognition, +the C<x-> can disappear. In many cases, we prefer the simplified version +of the type. + +example: results of simplified() + + my $mime = MIME::Type->new(type => 'x-appl/x-zip'); + print $mime->simplified; # 'appl/zip' + + print $mime->simplified('text/PLAIN'); # 'text/plain' + print MIME::Type->simplified('x-xyz/x-abc'); # 'xyz/abc' + +=item $obj-E<gt>B<system>() + +Returns the regular expression which can be used to determine whether this +type is active on the system where you are working on. + +=item $obj-E<gt>B<type>() + +Returns the long type of this object, for instance C<'text/plain'> + +=back + +=head2 Knowledge + +=over 4 + +=item $obj-E<gt>B<equals>($string|$mime) + +Compare this mime-type object with a STRING or other object. In case of +a STRING, simplification will take place. + +=item $obj-E<gt>B<isAscii>() + +Old name for L<isText()|MIME::Type/"Knowledge">. + +=item $obj-E<gt>B<isBinary>() + +Returns true when the type is not known to be text. See L<isText()|MIME::Type/"Knowledge">. + +=item $obj-E<gt>B<isExperimental>() + +[2.00] Return C<true> when the type is defined for experimental +use; the subtype starts with C<x.> + +=item $obj-E<gt>B<isPersonal>() + +[2.00] Return C<true> when the type is defined by a person for +private use; the subtype starts with C<prs.> + +=item $obj-E<gt>B<isRegistered>() + +Mime-types which are not registered by IANA nor defined in RFCs shall +start with an C<x->. This counts for as well the media-type as the +sub-type. In case either one of the types starts with C<x-> this +method will return false. + +=item $obj-E<gt>B<isSignature>() + +Returns true when the type is in the list of known signatures. + +=item $obj-E<gt>B<isText>() + +[2.05] All types which may have the charset attribute, are text. However, +there is currently no record of attributes in this module... so we guess. + +=item $obj-E<gt>B<isVendor>() + +[2.00] Return C<true> when the type is defined by a vendor; the subtype +starts with C<vnd.> + +=item $obj-E<gt>B<mediaType>() + +The media type of the simplified mime. +For C<'text/plain'> it will return C<'text'>. + +For historical reasons, the C<'mainType'> method still can be used +to retrieve the same value. However, that method is deprecated. + +=item $obj-E<gt>B<subType>() + +The sub type of the simplified mime. +For C<'text/plain'> it will return C<'plain'>. + +=back + +=head1 DIAGNOSTICS + +=over 4 + +=item Error: Type parameter is obligatory. + +When a L<MIME::Type|MIME::Type> object is created, the type itself must be +specified with the C<type> option flag. + +=back + +=head1 SEE ALSO + +This module is part of MIME-Types distribution version 2.14, +built on November 08, 2017. Website: F<http://perl.overmeer.net/mimetypes/> + +=head1 LICENSE + +Copyrights 1999,2001-2017 by [Mark Overmeer]. For other contributors see ChangeLog. + +This program is free software; you can redistribute it and/or modify it +under the Artistic license. +See F<http://dev.perl.org/licenses/artistic.html> + diff --git a/cpan/lib/MIME/Types.pod b/cpan/lib/MIME/Types.pod new file mode 100644 index 00000000..bb946ebd --- /dev/null +++ b/cpan/lib/MIME/Types.pod @@ -0,0 +1,267 @@ +=encoding utf8 + +=head1 NAME + +MIME::Types - Definition of MIME types + +=head1 INHERITANCE + + MIME::Types + is a Exporter + +=head1 SYNOPSIS + + use MIME::Types; + my $mt = MIME::Types->new(...); # MIME::Types object + my $type = $mt->type('text/plain'); # MIME::Type object + my $type = $mt->mimeTypeOf('gif'); + my $type = $mt->mimeTypeOf('picture.jpg'); + my @types = $mt->httpAccept('text/html, application/json;q=0.1') + +=head1 DESCRIPTION + +MIME types are used in many applications (for instance as part of e-mail +and HTTP traffic) to indicate the type of content which is transmitted. +or expected. See RFC2045 at F<https://www.ietf.org/rfc/rfc2045.txt> + +Sometimes detailed knowledge about a mime-type is need, however this +module only knows about the file-name extensions which relate to some +filetype. It can also be used to produce the right format: types +which are not registered at IANA need to use 'x-' prefixes. + +This object administers a huge list of known mime-types, combined +from various sources. For instance, it contains B<all IANA> types +and the knowledge of Apache. Probably the most complete table on +the net! + +=head2 MIME::Types and daemons (fork) + +If your program uses fork (usually for a daemon), then you want to have +the type table initialized before you start forking. So, first call + + my $mt = MIME::Types->new; + +Later, each time you create this object (you may, of course, also reuse +the object you create here) you will get access to B<the same global table> +of types. + +=head1 METHODS + +=head2 Constructors + +=over 4 + +=item MIME::Types-E<gt>B<new>(%options) + +Create a new C<MIME::Types> object which manages the data. In the current +implementation, it does not matter whether you create this object often +within your program, but in the future this may change. + + -Option --Default + db_file <installed source> + only_complete <false> + only_iana <false> + skip_extensions <false> + +=over 2 + +=item db_file => FILENAME + +The location of the database which contains the type information. Only the +first instantiation of this object will have this parameter obeyed. + +[2.10] This parameter can be globally overruled via the C<PERL_MIME_TYPE_DB> +environment variable, which may be needed in case of PAR or other tricky +installations. For PAR, you probably set this environment variable to +"inc/lib/MIME/types.db" + +=item only_complete => BOOLEAN + +Only include complete MIME type definitions: requires at least one known +extension. This will reduce the number of entries --and with that the +amount of memory consumed-- considerably. + +In your program you have to decide: the first time that you call +the creator (C<new>) determines whether you get the full or the partial +information. + +=item only_iana => BOOLEAN + +Only load the types which are currently known by IANA. + +=item skip_extensions => BOOLEAN + +Do not load the table to map extensions to types, which is quite large. + +=back + +=back + +=head2 Knowledge + +=over 4 + +=item $obj-E<gt>B<addType>($type, ...) + +Add one or more TYPEs to the set of known types. Each TYPE is a +C<MIME::Type> which must be experimental: either the main-type or +the sub-type must start with C<x->. + +Please inform the maintainer of this module when registered types +are missing. Before version MIME::Types version 1.14, a warning +was produced when an unknown IANA type was added. This has been +removed, because some people need that to get their application +to work locally... broken applications... + +=item $obj-E<gt>B<extensions>() + +Returns a list of all defined extensions. + +=item $obj-E<gt>B<listTypes>() + +Returns a list of all defined mime-types by name only. This will B<not> +instantiate L<MIME::Type|MIME::Type> objects. See L<types()|MIME::Types/"Knowledge"> + +=item $obj-E<gt>B<mimeTypeOf>($filename) + +Returns the C<MIME::Type> object which belongs to the FILENAME (or simply +its filename extension) or C<undef> if the file type is unknown. The extension +is used and considered case-insensitive. + +In some cases, more than one type is known for a certain filename extension. +In that case, the preferred one is taken (for an unclear definition of +preference) + +example: use of mimeTypeOf() + + my $types = MIME::Types->new; + my $mime = $types->mimeTypeOf('gif'); + + my $mime = $types->mimeTypeOf('picture.jpg'); + print $mime->isBinary; + +=item $obj-E<gt>B<type>($string) + +Returns the C<MIME::Type> which describes the type related to STRING. +[2.00] Only one type will be returned. + +[before 2.00] One type may be described more than once. Different +extensions may be in use for this type, and different operating systems +may cause more than one C<MIME::Type> object to be defined. In scalar +context, only the first is returned. + +=item $obj-E<gt>B<types>() + +Returns a list of all defined mime-types. For reasons of backwards +compatibility, this will instantiate L<MIME::Type|MIME::Type> objects, which will +be returned. See L<listTypes()|MIME::Types/"Knowledge">. + +=back + +=head2 HTTP support + +=over 4 + +=item $obj-E<gt>B<httpAccept>($header) + +[2.07] Decompose a typical HTTP-Accept header, and sort it based on the +included priority information. Returned is a sorted list of type names, +where the highest priority type is first. The list may contain '*/*' +(accept any) or a '*' as subtype. + +Ill-formated typenames are ignored. On equal qualities, the order is +kept. See RFC2616 section 14.1 + +example: + + my @types = $types->httpAccept('text/html, application/json;q=0.9'); + +=item $obj-E<gt>B<httpAcceptBest>($accept|\@types, @have) + +[2.07] The C<$accept> string is processed via L<httpAccept()|MIME::Types/"HTTP support"> to order the +types on preference. You may also provide a list of ordered C<@types> +which may have been the result of that method, called earlier. + +As second parameter, you pass a LIST of types you C<@have> to offer. +Those need to be L<MIME::Type|MIME::Type> objects. The preferred type will get +selected. When none of these are accepted by the client, this will +return C<undef>. It should result in a 406 server response. + +example: + + my $accept = $req->header('Accept'); + my @have = map $mt->type($_), qw[text/plain text/html]; + my @ext = $mt->httpAcceptBest($accept, @have); + +=item $obj-E<gt>B<httpAcceptSelect>($accept|\@types, @filenames|\@filenames) + +[2.07] Like L<httpAcceptBest()|MIME::Types/"HTTP support">, but now we do not return a pair with mime-type +and filename, not just the type. If $accept is C<undef>, the first +filename is returned. + +example: + + use HTTP::Status ':constants'; + use File::Glob 'bsd_glob'; # understands blanks in filename + + my @filenames = bsd_glob "$imagedir/$fnbase.*; + my $accept = $req->header('Accept'); + my ($fn, $mime) = $mt->httpAcceptSelect($accept, @filenames); + my $code = defined $mime ? HTTP_NOT_ACCEPTABLE : HTTP_OK; + +=back + +=head1 FUNCTIONS + +The next functions are provided for backward compatibility with MIME::Types +versions [0.06] and below. This code originates from Jeff Okamoto +F<okamoto@corp.hp.com> and others. + +=over 4 + +=item B<by_mediatype>(TYPE) + +This function takes a media type and returns a list or anonymous array of +anonymous three-element arrays whose values are the file name suffix used to +identify it, the media type, and a content encoding. + +TYPE can be a full type name (contains '/', and will be matched in full), +a partial type (which is used as regular expression) or a real regular +expression. + +=item B<by_suffix>(FILENAME|SUFFIX) + +Like C<mimeTypeOf>, but does not return an C<MIME::Type> object. If the file ++type is unknown, both the returned media type and encoding are empty strings. + +example: use of function by_suffix() + + use MIME::Types 'by_suffix'; + my ($mediatype, $encoding) = by_suffix('image.gif'); + + my $refdata = by_suffix('image.gif'); + my ($mediatype, $encoding) = @$refdata; + +=item B<import_mime_types>() + +This method has been removed: mime-types are only useful if understood +by many parties. Therefore, the IANA assigns names which can be used. +In the table kept by this C<MIME::Types> module all these names, plus +the most often used temporary names are kept. When names seem to be +missing, please contact the maintainer for inclusion. + +=back + +=head1 SEE ALSO + +This module is part of MIME-Types distribution version 2.14, +built on November 08, 2017. Website: F<http://perl.overmeer.net/mimetypes/> + +=head1 LICENSE + +Copyrights 1999,2001-2017 by [Mark Overmeer]. For other contributors see ChangeLog. + +This program is free software; you can redistribute it and/or modify it +under the Artistic license. +See F<http://dev.perl.org/licenses/artistic.html> + diff --git a/cpan/lib/MIME/types.db b/cpan/lib/MIME/types.db new file mode 100644 index 00000000..afd51a60 --- /dev/null +++ b/cpan/lib/MIME/types.db @@ -0,0 +1,4513 @@ +1792:EXTENSIONS +#;application/x-mathcad +%;application/x-trash +123;application/vnd.lotus-1-2-3 +323;text/x-h323 +32x;application/x-genesis-rom +3dm;x-world/x-3dmf +3dmf;x-world/x-3dmf +3dml;text/vnd.in3d.3dml +3ds;image/x-3ds +3g2;video/3gpp2 +3ga;video/3gpp +3gp2;video/3gpp2 +3gp;video/3gpp +3gpp2;video/3gpp2 +3gpp;video/3gpp +602;application/x-t602 +669;audio/x-mod +7z;application/x-7z-compressed +BLEND;application/x-blender +C;text/x-c++src +PAR2;application/x-par2 +PL;application/x-perl +Z;application/x-compress +a;application/x-archive +aab;application/x-authorware-bin +aac;audio/x-aac +aam;application/x-authorware-map +aas;application/x-authorware-seg +abc;text/vnd.abc +abw;application/x-abiword +ac3;audio/ac3 +ac;application/pkix-attr-cert +acc;application/vnd.americandynamics.acc +ace;application/x-ace-compressed +acgi;text/html +acu;application/vnd.acucobol +acutc;application/vnd.acucorp +adb;text/x-adasrc +adp;audio/x-adpcm +ads;text/x-adasrc +aep;application/vnd.audiograph +afl;video/x-animaflex +afm;application/x-font-type1 +afp;application/vnd.ibm.modcap +ag;image/x-applix-graphics +agb;application/x-gba-rom +ahead;application/vnd.ahead.space +ai;application/postscript +aif;audio/x-aiff +aifc;audio/x-aiff +aiff;audio/x-aiff +aiffc;audio/x-aifc +aim;application/x-aim +aip;text/x-audiosoft-intra +air;application/vnd.adobe.air-application-installer-package+zip +ait;application/vnd.dvb.ait +al;application/x-perl +alc;x-chemical/x-alchemy +alz;application/x-alz +ami;application/vnd.amiga.amu +amr;audio/amr +amz;audio/x-amzxml +ani;application/x-navi-animation +anx;application/x-annodex +aos;application/x-nokia-9000-communicator-add-on-software +ape;audio/x-ape +apk;application/vnd.android.package-archive +appcache;text/x-cache-manifest +application;application/x-ms-application +apr;application/vnd.lotus-approach +aps;application/x-mime +ar;application/x-archive +arc;application/x-freearc +arj;application/x-arj +art;image/x-jg +arw;image/x-sony-arw +as;application/x-applix-spreadsheet +asc;application/pgp-signature +asf;application/vnd.ms-asf +asm;text/x-asm +asn;x-chemical/x-ncbi-asn1 +aso;x-chemical/x-ncbi-asn1-binary +asp;text/x-asp +ass;text/x-ssa +asx;video/x-ms-asf +atc;application/vnd.acucorp +atom;application/atom+xml +atomcat;application/atomcat+xml +atomsrv;application/x-atomserv+xml +atomsvc;application/atomsvc+xml +atx;application/vnd.antix.game-component +au;audio/basic +avf;video/x-msvideo +avi;video/x-msvideo +avs;video/x-avs-video +aw;application/x-applixware +awb;audio/amr-wb +awk;application/x-awk +axa;audio/x-annodex +axv;video/x-annodex +azf;application/vnd.airzip.filesecure.azf +azs;application/vnd.airzip.filesecure.azs +azw;application/vnd.amazon.ebook +b;x-chemical/x-molconn-z +bak;application/x-trash +bat;application/x-msdos-program +bck;application/x-vmsbackup +bcpio;application/x-bcpio +bdf;application/x-font-bdf +bdm;application/vnd.syncml.dm+wbxml +bdmv;video/mp2t +bed;application/vnd.realvnc.bed +bh2;application/vnd.fujitsu.oasysprs +bib;text/x-bibtex +bin;application/x-mac-binary +bkm;application/vnd.nervana +blb;application/x-blorb +bleep;application/x-bleeper +blend;application/x-blender +blender;application/x-blender +blorb;application/x-blorb +bm;image/x-bmp +bmi;application/vnd.bmi +bmp;image/x-bmp +boo;text/x-boo +book;application/x-maker +box;application/vnd.previewsystems.box +boz;application/x-bzip2 +bpd;application/vnd.hbci +bpk;application/octet-stream +brf;text/plain +bsd;x-chemical/x-crossfire +bsh;application/x-bsh +btif;image/prs.btif +buffer;application/octet-stream +bz2;application/x-bzip2 +bz;application/x-bzip +c++;text/x-c++src +c11amc;application/vnd.cluetrust.cartomobile-config +c11amz;application/vnd.cluetrust.cartomobile-config-pkg +c3d;x-chemical/x-chem3d +c4d;application/vnd.clonk.c4group +c4f;application/vnd.clonk.c4group +c4g;application/vnd.clonk.c4group +c4p;application/vnd.clonk.c4group +c4u;application/vnd.clonk.c4group +c;text/x-csrc +cab;application/x-cab +cac;x-chemical/x-cache +cache;x-chemical/x-cache +caf;audio/x-caf +cap;application/x-cap +car;application/vnd.curl.car +cascii;x-chemical/x-cactvs-binary +cat;application/vnd.ms-pki.seccat +cb7;application/x-cbr +cba;application/x-cbr +cbin;x-chemical/x-cactvs-binary +cbl;text/x-cobol +cbr;application/x-cbr +cbt;application/x-cbr +cbz;application/x-cbz +cc;text/x-c++src +ccad;application/x-clariscad +ccc;text/vnd.net2phone.commcenter.command +ccmx;application/x-ccmx +cco;application/x-cocoa +cct;application/x-director +ccxml;application/ccxml+xml +cda;application/x-cdf +cdbcmsg;application/vnd.contact.cmsg +cdf;application/x-cdf +cdkey;application/vnd.mediastation.cdkey +cdmia;application/cdmi-capability +cdmic;application/cdmi-container +cdmid;application/cdmi-domain +cdmio;application/cdmi-object +cdmiq;application/cdmi-queue +cdr;image/x-coreldraw +cdt;image/x-coreldrawtemplate +cdx;x-chemical/x-cdx +cdxml;application/vnd.chemdraw+xml +cdy;application/vnd.cinderella +cef;x-chemical/x-cxf +cer;application/pkix-cert +cert;application/x-x509-ca-cert +cfs;application/x-cfs-compressed +cgb;application/x-gameboy-rom +cgm;image/cgm +cha;application/x-chat +chat;application/x-chat +chm;x-chemical/x-chemdraw +chrt;application/vnd.kde.kchart +cif;x-chemical/x-cif +cii;application/vnd.anser-web-certificate-issue-initiation +cil;application/vnd.ms-artgalry +cla;application/vnd.claymore +class;application/x-java-vm +clkk;application/vnd.crick.clicker.keyboard +clkp;application/vnd.crick.clicker.palette +clkt;application/vnd.crick.clicker.template +clkw;application/vnd.crick.clicker.wordbank +clkx;application/vnd.crick.clicker +clp;application/x-msclip +clpi;video/mp2t +cls;text/x-tex +cmake;text/x-cmake +cmc;application/vnd.cosmocaller +cmdf;x-chemical/x-cmdf +cml;x-chemical/x-cml +cmp;application/vnd.yellowriver-custom-menu +cmx;image/x-cmx +cob;text/x-cobol +cod;application/vnd.rim.cod +coffee;application/vnd.coffeescript +com;application/x-msdos-program +conf;text/plain +cpa;x-chemical/x-compass +cpi;video/mp2t +cpio;application/x-cpio +cpp;text/x-c++src +cpt;application/x-mac-compactpro +cr2;image/x-canon-cr2 +crd;application/x-mscardfile +crdownload;application/x-partial-download +crl;application/pkix-crl +crt;application/x-x509-ca-cert +crw;image/x-canon-crw +crx;application/x-chrome-extension +cryptonote;application/vnd.rig.cryptonote +cs;text/x-csharp +csf;x-chemical/x-cache-csf +csh;application/x-csh +csm;application/x-cu-seeme +csml;x-chemical/x-csml +csp;application/vnd.commonspace +css;text/css +cst;application/x-director +csv;text/csv +csvs;text/x-csv-schema +ctab;x-chemical/x-cactvs-binary +ctx;x-chemical/x-ctx +cu;application/x-cu-seeme +cub;x-chemical/x-gaussian-cube +cue;application/x-cue +cur;image/x-win-bitmap +curl;application/vnd.curl +cw;application/prs.cww +cww;application/prs.cww +cxf;x-chemical/x-cxf +cxt;application/x-director +cxx;text/x-c++src +d;text/x-dsrc +dae;model/vnd.collada+xml +daf;application/vnd.mobius.daf +dar;application/x-dar +dart;application/vnd.dart +dat;application/x-ns-proxy-autoconfig +dataless;application/vnd.fdsn.seed +davmount;application/x-davmount+xml +dbf;application/x-dbf +dbk;application/x-docbook+xml +dc;application/x-dc-rom +dcl;text/x-dcl +dcm;application/dicom +dcr;application/x-director +dcurl;text/vnd.curl.dcurl +dd2;application/vnd.oma.dd2+xml +ddd;application/vnd.fujixerox.ddd +dds;image/x-dds +deb;application/x-debian-package +deepv;application/x-deepv +def;text/plain +deploy;application/octet-stream +der;application/x-x509-ca-cert +desktop;application/x-desktop +dfac;application/vnd.dreamfactory +dgc;application/x-dgc-compressed +dgn;image/vnd.dgn +di;text/x-dsrc +dia;application/x-dia-diagram +dic;text/x-c +dif;video/dv +diff;text/x-diff +dir;application/x-director +dis;application/vnd.mobius.dis +dist;application/octet-stream +distz;application/octet-stream +divx;video/x-msvideo +djv;image/vnd.djvu +djvu;image/vnd.djvu +dl;video/x-dl +dll;application/x-msdos-program +dmg;application/x-apple-diskimage +dmp;application/vnd.tcpdump.pcap +dms;application/x-dms +dna;application/vnd.dna +dng;image/x-adobe-dng +doc;application/msword +docbook;application/x-docbook+xml +docm;application/vnd.ms-word.document.macroenabled.12 +docx;application/vnd.openxmlformats-officedocument.wordprocessingml.document +dot;application/msword +dotm;application/vnd.ms-word.template.macroenabled.12 +dotx;application/vnd.openxmlformats-officedocument.wordprocessingml.template +dp;application/vnd.osgi.dp +dpg;application/vnd.dpgraph +dra;audio/vnd.dra +drw;application/x-drafting +dsc;text/prs.lines.tag +dsl;text/x-dsl +dssc;application/dssc+der +dtb;application/x-dtbook+xml +dtd;application/xml-dtd +dts;audio/vnd.dts +dtshd;audio/vnd.dts.hd +dtx;text/x-tex +dump;application/octet-stream +dv;video/dv +dvb;video/vnd.dvb.file +dvi;application/x-dvi +dwf;x-drawing/x-dwf +dwg;image/vnd.dwg +dx;x-chemical/x-jcamp-dx +dxf;image/vnd.dxf +dxp;application/vnd.spotfire.dxp +dxr;application/x-director +e;text/x-eiffel +ecelp4800;audio/vnd.nuera.ecelp4800 +ecelp7470;audio/vnd.nuera.ecelp7470 +ecelp9600;audio/vnd.nuera.ecelp9600 +ecma;application/ecmascript +edm;application/vnd.novadigm.edm +edx;application/vnd.novadigm.edx +efif;application/vnd.picsel +egon;application/x-egon +ei6;application/vnd.pg.osasli +eif;text/x-eiffel +el;text/x-script.elisp +elc;application/x-bytecode.elisp +emb;x-chemical/x-embl-dl-nucleotide +embl;x-chemical/x-embl-dl-nucleotide +emf;application/x-msmetafile +eml;message/rfc822 +emm;application/vnd.ibm.electronic-media +emma;application/emma+xml +emp;application/vnd.emusic-emusic_package +emz;application/x-msmetafile +ent;application/vnd.nervana +entity;application/vnd.nervana +env;application/x-envoy +eol;audio/vnd.digital-winds +eot;application/vnd.ms-fontobject +eps2;application/postscript +eps3;application/postscript +eps;application/postscript +epsf;application/postscript +epsi;application/postscript +epub;application/x-epub+zip +erf;image/x-epson-erf +erl;text/x-erlang +es3;application/vnd.eszigno3+xml +es;application/ecmascript +esa;application/vnd.osgi.subsystem +esf;application/vnd.epson.esf +et3;application/vnd.eszigno3+xml +etheme;application/x-e-theme +etx;text/x-setext +eva;application/x-eva +evc;audio/evrc +event-stream;text/x-event-stream +evy;application/x-envoy +exe;application/x-msdos-program +exi;application/exi +exr;image/x-exr +ext;application/vnd.novadigm.ext +ez2;application/vnd.ezpix-album +ez3;application/vnd.ezpix-package +ez;application/andrew-inset +f4a;audio/mp4 +f4b;audio/mp4 +f4p;video/mp4 +f4v;video/mp4 +f77;text/x-fortran +f90;text/x-fortran +f95;text/x-fortran +f;text/x-fortran +fb2;application/x-fictionbook+xml +fb;application/x-maker +fbdoc;application/x-maker +fbs;image/vnd.fastbidsheet +fcdt;application/vnd.adobe.formscentral.fcdt +fch;x-chemical/x-gaussian-checkpoint +fchk;x-chemical/x-gaussian-checkpoint +fcs;application/vnd.isac.fcs +fdf;application/vnd.fdf +fe_launch;application/vnd.denovo.fcselayout-link +fg5;application/vnd.fujitsu.oasysgp +fgd;application/x-director +fh4;image/x-freehand +fh5;image/x-freehand +fh7;image/x-freehand +fh;image/x-freehand +fhc;image/x-freehand +fif;application/x-fractals +fig;application/x-xfig +fits;image/fits +fl;application/x-fluid +flac;audio/x-flac +flc;video/x-flic +fli;video/x-fli +flo;application/vnd.micrografx.flo +flv;video/x-flv +flw;application/vnd.kde.kivio +flx;text/vnd.fmi.flexstor +fly;text/vnd.fly +fm;application/x-maker +fmf;video/x-atomic3d-feature +fnc;application/vnd.frogans.fnc +fo;text/x-xslfo +fodg;application/vnd.oasis.opendocument.graphics-flat-xml +fodp;application/vnd.oasis.opendocument.presentation-flat-xml +fods;application/vnd.oasis.opendocument.spreadsheet-flat-xml +fodt;application/vnd.oasis.opendocument.text-flat-xml +for;text/x-fortran +fpx;image/vnd.fpx +frame;application/x-maker +frl;application/x-freeloader +frm;application/x-maker +fsc;application/vnd.fsc.weblauch +fst;image/vnd.fst +ftc;application/vnd.fluxtime.clip +fti;application/vnd.anser-web-funds-transfer-initiation +funk;audio/x-make +fvt;video/vnd.fvt +fxm;video/x-javafx +fxp;application/vnd.adobe.fxp +fxpl;application/vnd.adobe.fxp +fzs;application/vnd.fuzzysheet +g2w;application/vnd.geoplan +g3;image/g3fax +g3w;application/vnd.geospace +g;text/plain +gac;application/vnd.groove-account +gal;x-chemical/x-gaussian-log +gam;x-chemical/x-gamess-input +gamin;x-chemical/x-gamess-input +gau;x-chemical/x-gaussian-input +gb;application/x-gameboy-rom +gba;application/x-gba-rom +gbc;application/x-gameboy-rom +gbr;application/rpki-ghostbusters +gca;application/x-gca-compressed +gcd;text/x-pcs-gcd +gcf;application/x-graphing-calculator +gcg;x-chemical/x-gcg8-sequence +gcrd;text/vcard +gdl;model/vnd.gdl +ged;application/x-gedcom +gedcom;application/x-gedcom +gem;application/x-tar +gen;x-chemical/x-genbank +geo;application/vnd.dynageo +gex;application/vnd.geometry-explorer +gf;application/x-tex-gf +gg;application/x-sms-rom +ggb;application/vnd.geogebra.file +ggt;application/vnd.geogebra.tool +ghf;application/vnd.groove-help +gif;image/gif +gim;application/vnd.groove-identity-message +gjc;x-chemical/x-gaussian-input +gjf;x-chemical/x-gaussian-input +gl;video/x-gl +glade;application/x-glade +gml;application/x-gml+xml +gmo;application/x-gettext-translation +gmx;application/vnd.gmx +gnc;application/x-gnucash +gnd;application/x-gnunet-directory +gnucash;application/x-gnucash +gnumeric;application/x-gnumeric +gnuplot;application/x-gnuplot +go;text/x-go +gp;application/x-gnuplot +gpg;application/pgp-encrypted +gph;application/vnd.flographit +gplt;application/x-gnuplot +gpt;x-chemical/x-mopac-graph +gpx;application/x-gpx+xml +gqf;application/vnd.grafeq +gqs;application/vnd.grafeq +gra;application/x-graphite +gram;application/srgs +gramps;application/x-gramps-xml +gre;application/vnd.geometry-explorer +grv;application/vnd.groove-injector +grxml;application/srgs+xml +gs;text/x-genie +gsd;audio/x-gsm +gsf;application/x-font +gsm;audio/x-gsm +gsp;application/x-gsp +gss;application/x-gss +gtar;application/x-gtar +gtm;application/vnd.groove-tool-message +gtw;model/vnd.gtw +gv;text/vnd.graphviz +gvp;text/x-google-video-pointer +gxf;application/x-gxf +gxt;application/vnd.geonext +gz;application/x-gzip +gzip;application/x-gzip +h++;text/x-c++hdr +h261;video/h261 +h263;video/h263 +h264;video/h264 +h4;application/x-hdf +h5;application/x-hdf +h;text/x-chdr +hal;application/vnd.hal+xml +hbc;application/vnd.hbci +hbci;application/vnd.hbci +hdf4;application/x-hdf +hdf5;application/x-hdf +hdf;application/x-hdf +help;application/x-helpfile +hep;application/x-hep +hgl;application/vnd.hp-hpgl +hh;text/x-c++hdr +hin;x-chemical/x-hin +hlb;text/x-script +hlp;application/x-winhlp +hp;text/x-c++hdr +hpg;application/vnd.hp-hpgl +hpgl;application/vnd.hp-hpgl +hpid;application/vnd.hp-hpid +hpp;text/x-c++hdr +hps;application/vnd.hp-hps +hqx;application/mac-binhex40 +hs;text/x-haskell +hta;application/x-hta +htc;text/x-component +htke;application/vnd.kenameapp +htm;text/html +html;text/html +htmls;text/html +htmlx;text/html +htt;text/x-webviewhtml +htx;text/html +hvd;application/vnd.yamaha.hv-dic +hvp;application/vnd.yamaha.hv-voice +hvs;application/vnd.yamaha.hv-script +hwp;application/x-hwp +hwt;application/x-hwt +hxx;text/x-c++hdr +i2g;application/vnd.intergeo +ica;application/x-ica +icb;image/x-tga +icc;application/vnd.iccprofile +ice;x-conference/x-cooltalk +icm;application/vnd.iccprofile +icns;image/x-icns +ico;image/vnd.microsoft.icon +ics;text/calendar +icz;text/calendar +idc;text/plain +idl;text/x-idl +ief;image/ief +iefs;image/ief +ifb;text/calendar +iff;image/x-ilbm +ifm;application/vnd.shana.informed.formdata +iges;model/iges +igl;application/vnd.igloader +igm;application/vnd.insors.igm +igs;model/iges +igx;application/vnd.micrografx.igx +iif;application/vnd.shana.informed.interchange +iii;application/x-iphone +ilbm;image/x-ilbm +ima;application/x-ima +imagemap;application/x-imagemap +imap;application/x-imagemap +ime;text/x-imelody +img;application/x-raw-disk-image +imp;application/vnd.accpac.simply.imp +ims;application/vnd.ms-ims +imy;text/x-imelody +in;text/plain +inf;application/x-inf +info;application/x-info +ini;text/plain +ink;application/inkml+xml +inkml;application/inkml+xml +inp;x-chemical/x-gamess-input +ins;application/x-internet-signup +install;application/x-install-instructions +iota;application/vnd.astraea-software.iota +ip;application/x-ip2 +ipfix;application/ipfix +ipk;application/vnd.shana.informed.package +iptables;text/x-iptables +irm;application/vnd.ibm.rights-management +irp;application/vnd.irepository.package+xml +iso9660;application/x-cd-image +iso;application/x-iso9660-image +isp;application/x-internet-signup +ist;x-chemical/x-isostar +istr;x-chemical/x-isostar +isu;video/x-isvideo +it87;application/x-it87 +it;audio/x-it +itp;application/vnd.shana.informed.formtemplate +iv;application/x-inventor +ivp;application/vnd.immervision-ivp +ivr;x-i-world/x-i-vrml +ivu;application/vnd.immervision-ivu +ivy;application/x-livescreen +jad;text/vnd.sun.j2me.app-descriptor +jam;application/x-jam +jar;application/x-java-archive +jav;text/x-java-source +java;text/x-java +jceks;application/x-java-jce-keystore +jcm;application/x-java-commerce +jdx;x-chemical/x-jcamp-dx +jfif-tbnl;image/jpeg +jfif;image/jpeg +jisp;application/vnd.jisp +jks;application/x-java-keystore +jlt;application/vnd.hp-jlyt +jmz;application/x-jmol +jng;image/x-jng +jnlp;application/x-java-jnlp-file +joda;application/vnd.joost.joda-archive +jp2;image/jp2 +jpe;image/jpeg +jpeg;image/jpeg +jpf;image/jpx +jpg2;image/jp2 +jpg;image/jpeg +jpgm;image/jpm +jpgv;video/jpeg +jpm;image/jpm +jpr;application/x-jbuilder-project +jps;image/x-jps +jpx;image/jpx +jrd;application/x-jrd+json +js;application/javascript +jsm;application/javascript +json-patch;application/json-patch+json +json;application/json +jsonld;application/ld+json +jsonml;application/x-jsonml+json +jut;image/x-jutvision +k25;image/x-kodak-k25 +kar;audio/x-midi +karbon;application/vnd.kde.karbon +kcm;application/vnd.nervana +kdc;image/x-kodak-kdc +kdelnk;application/x-desktop +kexi;application/x-kexiproject-sqlite2 +kexic;application/x-kexi-connectiondata +kexis;application/x-kexiproject-shortcut +key;application/pgp-keys +kfo;application/vnd.kde.kformula +kia;application/vnd.kidspiration +kil;application/x-killustrator +kin;x-chemical/x-kinemage +kino;application/smil+xml +kml;application/vnd.google-earth.kml+xml +kmz;application/vnd.google-earth.kmz +kne;application/vnd.kinar +knp;application/vnd.kinar +kom;application/vnd.hbci +kon;application/vnd.kde.kontour +koz;audio/vnd.audiokoz +kpm;application/x-kpovmodeler +kpr;application/vnd.kde.kpresenter +kpt;application/vnd.kde.kpresenter +kpxx;application/vnd.ds-keypoint +kra;application/x-krita +ks;application/x-java-keystore +ksh;application/x-ksh +ksp;application/vnd.kde.kspread +ktr;application/vnd.kahootz +ktx;image/ktx +ktz;application/vnd.kahootz +kud;application/x-kugar +kwd;application/vnd.kde.kword +kwt;application/vnd.kde.kword +l16;audio/l16 +la;audio/x-nspaudio +lam;audio/x-liveaudio +lasxml;application/vnd.las.las+xml +latex;application/x-latex +lbd;application/vnd.llamagraphics.life-balance.desktop +lbe;application/vnd.llamagraphics.life-balance.exchange+xml +lbm;image/x-ilbm +ldif;text/x-ldif +les;application/vnd.hhe.lesson-player +lha;application/x-lha +lhs;text/x-literate-haskell +lhx;application/octet-stream +lhz;application/x-lhz +lin;application/x-bbolin +link66;application/vnd.route66.link66+xml +list3820;application/vnd.ibm.modcap +list;text/plain +listafp;application/vnd.ibm.modcap +lma;audio/x-nspaudio +lnk;application/x-ms-shortcut +log;text/x-log +lostxml;application/lost+xml +lrf;application/octet-stream +lrm;application/vnd.ms-lrm +lrv;video/mp4 +lrz;application/x-lrzip +lsf;video/x-la-asf +lsp;application/x-lisp +lst;text/plain +lsx;video/x-la-asf +ltf;application/vnd.frogans.ltf +ltx;text/x-tex +lua;text/x-lua +luac;application/x-lua-bytecode +lvp;audio/vnd.lucent.voice +lwo;image/x-lwo +lwob;image/x-lwo +lwp;application/vnd.lotus-wordpro +lws;image/x-lws +ly;text/x-lilypond +lyx;application/x-lyx +lz4;application/x-lz4 +lz;application/x-lzip +lzh;application/x-lzh +lzma;application/x-lzma +lzo;application/x-lzop +lzx;application/x-lzx +m13;application/x-msmediaview +m14;application/x-msmediaview +m15;audio/x-mod +m1u;video/vnd.mpegurl +m1v;video/mpeg +m21;application/mp21 +m2a;audio/mpeg +m2t;video/mp2t +m2ts;video/mp2t +m2v;video/mpeg +m3a;audio/mpeg +m3g;application/x-m3g +m3u8;application/vnd.apple.mpegurl +m3u;audio/x-mpegurl +m4;application/x-m4 +m4a;audio/mpeg +m4b;audio/x-m4b +m4p;application/mp4 +m4u;video/vnd.mpegurl +m4v;video/x-m4v +m;text/x-m +ma;application/mathematica +mab;application/x-markaby +mads;application/mads+xml +mag;application/vnd.ecowin.chart +mak;text/x-makefile +maker;application/x-maker +man;application/x-troff-man +manifest;text/x-cache-manifest +map;application/x-navimap +mar;application/octet-stream +markdown;text/x-markdown +mathml;application/mathml+xml +mb;application/mathematica +mbd;application/x-mbedlet +mbk;application/vnd.mobius.mbk +mbox;application/mbox +mc$;application/x-magic-cap-package-1.0 +mc1;application/vnd.medcalcdata +mcd;application/vnd.mcd +mcf;image/x-vasa +mcif;x-chemical/x-mmcif +mcm;x-chemical/x-macmolecule +mcp;application/x-netmc +mcurl;text/vnd.curl.mcurl +md;text/x-markdown +mda;application/x-msaccess +mdb;application/x-msaccess +mde;application/x-msaccess +mdf;application/x-msaccess +mdi;image/vnd.ms-modi +mdp;application/dash+xml +mdx;application/x-genesis-rom +me;application/x-troff-me +med;audio/x-mod +mesh;model/mesh +meta4;application/metalink4+xml +metalink;application/x-metalink+xml +mets;application/mets+xml +mfm;application/vnd.mfmp +mft;application/rpki-manifest +mgp;application/vnd.osgeo.mapguide.package +mgz;application/vnd.proteus.magazine +mht;message/rfc822 +mhtml;message/rfc822 +mid;audio/x-midi +midi;audio/x-midi +mie;application/x-mie +mif;application/vnd.mif +mime;message/rfc822 +minipsf;audio/x-minipsf +mj2;video/mj2 +mjf;audio/x-vnd.audioexplosion.mjuicemediafile +mjp2;video/mj2 +mjpg;video/x-motion-jpeg +mk3d;video/x-matroska +mk;text/x-makefile +mka;audio/x-matroska +mkd;text/x-markdown +mks;video/x-matroska +mkv;video/x-matroska +ml;text/x-ocaml +mli;text/x-ocaml +mlp;application/vnd.dolby.mlp +mm;application/x-freemind +mmd;x-chemical/x-macromodel-input +mme;application/x-base64 +mmf;application/vnd.smaf +mml;text/x-mathml +mmod;x-chemical/x-macromodel-input +mmr;image/vnd.fujixerox.edmics-mmr +mng;video/x-mng +mny;application/x-msmoney +mo3;audio/x-mo3 +mo;application/x-gettext-translation +mobi;application/x-mobipocket-ebook +moc;text/x-moc +mod;audio/x-mod +mods;application/mods+xml +mof;text/x-mof +mol2;x-chemical/x-mol2 +mol;x-chemical/x-mdl-molfile +moo;x-chemical/x-mopac-out +moov;video/quicktime +mop;x-chemical/x-mopac-input +mopcrt;x-chemical/x-mopac-input +mov;video/quicktime +movie;video/x-sgi-movie +mp+;audio/x-musepack +mp21;application/mp21 +mp2;audio/mpeg +mp2a;audio/mpeg +mp3;audio/mpeg +mp4;video/mp4 +mp4a;audio/mp4 +mp4s;application/mp4 +mp4v;video/mp4 +mpa;audio/mpeg +mpc;application/vnd.mophun.certificate +mpe;video/mpeg +mpeg;video/mpeg +mpega;audio/mpeg +mpg4;video/mp4 +mpg;video/mpeg +mpga;audio/mpeg +mpkg;application/vnd.apple.installer+xml +mpl;video/mp2t +mpls;video/mp2t +mpm;application/vnd.blueice.multipass +mpn;application/vnd.mophun.application +mpp;application/vnd.ms-project +mpt;application/vnd.ms-project +mpv;video/x-matroska +mpx;application/x-project +mpy;application/vnd.ibm.minipay +mqy;application/vnd.mobius.mqy +mrc;application/marc +mrcx;application/marcxml+xml +mrl;text/x-mrml +mrml;text/x-mrml +mrw;image/x-minolta-mrw +ms;application/x-troff-ms +mscml;application/mediaservercontrol+xml +mseed;application/vnd.fdsn.mseed +mseq;application/vnd.mseq +msf;application/vnd.epson.msf +msh;model/mesh +msi;application/x-msi +msl;application/vnd.mobius.msl +msod;image/x-msod +msty;application/vnd.muvee.style +msx;application/x-msx-rom +mtm;audio/x-mod +mts;model/vnd.mts +mup;text/x-mup +mus;application/vnd.musician +musicxml;application/vnd.recordare.musicxml+xml +mv;video/x-sgi-movie +mvb;x-chemical/x-mopac-vib +mwf;application/vnd.mfer +mxf;application/mxf +mxl;application/vnd.recordare.musicxml +mxmf;audio/vnd.nokia.mobile-xmf +mxml;application/xv+xml +mxs;application/vnd.triscape.mxs +mxu;video/vnd.mpegurl +my;audio/x-make +mzz;application/x-vnd.audioexplosion.mzz +n-gage;application/vnd.nokia.n-gage.symbian.install +n3;text/n3 +n64;application/x-n64-rom +nap;image/naplps +naplps;image/naplps +nb;application/mathematica +nbp;application/mathematica +nc;application/x-netcdf +ncm;application/vnd.nokia.configuration-message +ncx;application/x-dtbncx+xml +nds;application/x-nintendo-ds-rom +nef;image/x-nikon-nef +nes;application/x-nes-rom +nez;application/x-nes-rom +nfo;text/x-nfo +ngdat;application/vnd.nokia.n-gage.data +nif;image/x-niff +niff;image/x-niff +nim;video/vnd.nokia.interleaved-multimedia +nitf;application/vnd.nitf +nix;application/x-mix-transfer +nlu;application/vnd.neurolanguage.nlu +nml;application/vnd.enliven +nnd;application/vnd.noblenet-directory +nns;application/vnd.noblenet-sealer +nnw;application/vnd.noblenet-web +not;text/x-mup +npx;image/vnd.net-fpx +nsc;application/x-conference +nsf;application/vnd.lotus-notes +nsv;video/x-nsv +ntf;application/vnd.nitf +nvd;application/x-navidoc +nwc;application/x-nwc +nws;message/rfc822 +nzb;application/x-nzb +o;application/x-object +oa2;application/vnd.fujitsu.oasys2 +oa3;application/vnd.fujitsu.oasys3 +oas;application/vnd.fujitsu.oasys +obd;application/x-msbinder +obj;application/x-tgif +ocl;text/x-ocl +oda;application/oda +odb;application/vnd.oasis.opendocument.database +odc;application/vnd.oasis.opendocument.chart +odf;application/vnd.oasis.opendocument.formula +odft;application/vnd.oasis.opendocument.formula-template +odg;application/vnd.oasis.opendocument.graphics +odi;application/vnd.oasis.opendocument.image +odm;application/vnd.oasis.opendocument.text-master +odp;application/vnd.oasis.opendocument.presentation +ods;application/vnd.oasis.opendocument.spreadsheet +odt;application/vnd.oasis.opendocument.text +oga;audio/ogg +ogg;audio/ogg +ogm;video/x-ogm+ogg +ogv;video/ogg +ogx;application/ogg +old;application/x-trash +oleo;application/x-oleo +omc;application/x-omc +omcd;application/x-omcdatamaker +omcr;application/x-omcregerator +omdoc;application/x-omdoc+xml +onepkg;application/x-onenote +onetmp;application/x-onenote +onetoc2;application/x-onenote +onetoc;application/x-onenote +ooc;text/x-ooc +opf;application/x-oebps-package+xml +opml;text/x-opml +oprc;application/vnd.palm +opus;audio/ogg +ora;image/x-openraster +orf;image/x-olympus-orf +org;application/vnd.lotus-organizer +orq;application/ocsp-request +ors;application/ocsp-response +osf;application/vnd.yamaha.openscoreformat +osfpvg;application/vnd.yamaha.openscoreformat.osfpvg+xml +otc;application/vnd.oasis.opendocument.chart-template +otf;x-font/x-otf +otg;application/vnd.oasis.opendocument.graphics-template +oth;application/vnd.oasis.opendocument.text-web +oti;application/vnd.oasis.opendocument.image-template +otm;application/vnd.oasis.opendocument.text-master +otp;application/vnd.oasis.opendocument.presentation-template +ots;application/vnd.oasis.opendocument.spreadsheet-template +ott;application/vnd.oasis.opendocument.text-template +owl;application/rdf+xml +owx;application/x-owl+xml +oxps;application/oxps +oxt;application/vnd.openofficeorg.extension +oza;application/x-oz-application +p10;application/pkcs10 +p12;application/x-pkcs12 +p65;application/x-pagemaker +p7a;application/x-pkcs7-signature +p7b;application/x-pkcs7-certificates +p7c;application/pkcs7-mime +p7m;application/pkcs7-mime +p7r;application/x-pkcs7-certreqresp +p7s;application/pkcs7-signature +p8;application/pkcs8 +p;text/x-pascal +pac;application/x-ns-proxy-autoconfig +pack;application/x-java-pack200 +pak;application/x-pak +par2;application/x-par2 +part;application/x-pro_eng +pas;text/x-pascal +pat;image/x-coreldrawpattern +patch;text/x-diff +paw;application/vnd.pawaafile +pbd;application/vnd.powerbuilder6 +pbm;image/x-portable-bitmap +pcap;application/x-cap +pcd;image/x-photo-cd +pce;application/x-pc-engine-rom +pcf.z;application/x-font +pcf;application/x-font +pcl;application/vnd.hp-pcl +pclxl;application/vnd.hp-pclxl +pct;image/x-pict +pcurl;application/vnd.curl.pcurl +pcx;image/x-pcx +pdb;application/vnd.palm +pdc;application/x-aportisdoc +pdf;application/pdf +pef;image/x-pentax-pef +pem;application/x-x509-ca-cert +perl;application/x-perl +pfa;application/x-font +pfb;application/x-font +pfm;application/x-font-type1 +pfr;application/font-tdpfr +pfunk;audio/x-make +pfx;application/x-pkcs12 +pgb;image/vnd.glocalgraphics.pgb +pgm;image/x-portable-graymap +pgn;application/x-chess-pgn +pgp;application/pgp-signature +php3;application/x-httpd-php3 +php3p;application/x-httpd-php3-preprocessed +php4;application/x-httpd-php4 +php5;application/x-httpd-php5 +php;application/x-httpd-php +phps;application/x-httpd-php-source +pht;application/x-httpd-php +phtml;application/x-httpd-php +pic;image/x-pict +pict1;image/x-pict +pict2;image/x-pict +pict;image/x-pict +pk;application/x-tex-pk +pkd;application/vnd.hbci +pkg;application/x-newton-compatible-pkg +pki;application/pkixcmp +pkipath;application/x-pkix-pkipath +pko;application/vnd.ms-pki.pko +pkr;application/pgp-keys +pl;application/x-perl +pla;audio/x-iriver-pla +plb;application/vnd.3gpp.pic-bw-large +plc;application/vnd.mobius.plc +plf;application/vnd.pocketlearn +plj;audio/vnd.everad.plj +pln;application/x-planperfect +pls;audio/x-scpls +plt;application/vnd.hp-hpgl +plx;application/x-pixclscript +pm4;application/x-pagemaker +pm5;application/x-pagemaker +pm6;application/x-pagemaker +pm;application/x-pagemaker +pmd;application/x-pagemaker +pml;application/vnd.ctc-posml +png;image/png +pnm;image/x-portable-anymap +pntg;image/x-macpaint +po;text/x-gettext-translation +pod;application/x-perl +por;application/x-spss-por +portpkg;application/vnd.macports.portpkg +pot;application/vnd.ms-powerpoint +potm;application/vnd.ms-powerpoint.template.macroenabled.12 +potx;application/vnd.openxmlformats-officedocument.presentationml.template +pov;model/x-pov +ppa;application/vnd.ms-powerpoint +ppam;application/vnd.ms-powerpoint.addin.macroenabled.12 +ppd;application/vnd.cups-ppd +ppm;image/x-portable-pixmap +pps;application/vnd.ms-powerpoint +ppsm;application/vnd.ms-powerpoint.slideshow.macroenabled.12 +ppsx;application/vnd.openxmlformats-officedocument.presentationml.slideshow +ppt;application/vnd.ms-powerpoint +pptm;application/vnd.ms-powerpoint.presentation.macroenabled.12 +pptx;application/vnd.openxmlformats-officedocument.presentationml.presentation +ppz;application/x-mspowerpoint +pqa;application/vnd.palm +prc;application/vnd.palm +pre;application/vnd.lotus-freelance +prf;application/x-pics-rules +prt;x-chemical/x-ncbi-asn1-ascii +ps-z;application/postscript +ps;application/postscript +psb;application/vnd.3gpp.pic-bw-small +psd;image/x-photoshop +psf;application/x-font-linux-psf +psflib;audio/x-psflib +psid;audio/prs.sid +pskcxml;application/pskc+xml +psw;application/x-pocket-word +pt5;application/x-pagemaker +pti;application/vnd.pvi.ptid1 +ptid;application/vnd.pvi.ptid1 +pub;application/x-mspublisher +pvb;application/vnd.3gpp.pic-bw-var +pvu;x-paleovu/x-pv +pw;application/x-pw +pwn;application/vnd.3m.post-it-notes +pwz;application/vnd.ms-powerpoint +py;application/x-python +pya;audio/vnd.ms-playready.media.pya +pyc;application/x-python-code +pyo;application/x-python-code +pyv;video/vnd.ms-playready.media.pyv +pyx;text/x-python +qam;application/vnd.epson.quickanime +qbo;application/vnd.intu.qbo +qcp;audio/qcelp +qd3;x-world/x-3dmf +qd3d;x-world/x-3dmf +qfx;application/vnd.intu.qfx +qgs;application/x-qgis +qif;image/x-quicktime +qml;text/x-qml +qmlproject;text/x-qml +qmltypes;text/x-qml +qp;application/x-qpress +qps;application/vnd.publishare-delta-tree +qt;video/quicktime +qtc;video/x-qtc +qti;image/x-quicktime +qtif;image/x-quicktime +qtl;application/x-quicktimeplayer +qtvr;video/quicktime +qwd;application/vnd.quark.quarkxpress +qwt;application/vnd.quark.quarkxpress +qxb;application/vnd.quark.quarkxpress +qxd;application/vnd.quark.quarkxpress +qxl;application/vnd.quark.quarkxpress +qxt;application/vnd.quark.quarkxpress +ra;audio/x-pn-realaudio +raf;image/x-fuji-raf +ram;audio/x-pn-realaudio +rar;application/x-rar +ras;image/x-cmu-raster +rast;image/x-cmu-raster +raw-disk-image;application/x-raw-disk-image +raw;image/x-panasonic-raw +rax;audio/vnd.rn-realaudio +rb;application/x-ruby +rbw;application/x-ruby +rcprofile;application/vnd.ipunplugged.rcprofile +rct;application/prs.nprend +rd;x-chemical/x-mdl-rdfile +rdf;application/rdf+xml +rdfs;application/rdf+xml +rdz;application/vnd.data-vision.rdz +reg;text/x-ms-regedit +rej;text/x-reject +rep;application/vnd.businessobjects +req;application/vnd.nervana +request;application/vnd.nervana +res;application/x-dtbresource+xml +rexx;text/x-script.rexx +rf;image/vnd.rn-realflash +rgb;image/x-rgb +rhtml;application/x-html+ruby +rif;application/reginfo+xml +rip;audio/vnd.rip +ris;application/x-research-info-systems +rl;application/resource-lists+xml +rlc;image/vnd.fujixerox.edmics-rlc +rld;application/resource-lists-diff+xml +rle;image/x-rle +rm;audio/x-pn-realaudio +rmi;audio/x-midi +rmj;application/vnd.rn-realmedia +rmm;audio/x-pn-realaudio +rmp;audio/x-pn-realaudio-plugin +rms;application/vnd.jcp.javame.midlet-rms +rmvb;application/vnd.rn-realmedia-vbr +rmx;application/vnd.rn-realmedia +rnc;application/relax-ng-compact-syntax +rnd;application/prs.nprend +rng;application/x-ringing-tones +rnx;application/vnd.rn-realplayer +roa;application/rpki-roa +roff;application/x-troff +ros;x-chemical/x-rosdal +rp9;application/vnd.cloanto.rp9 +rp;image/vnd.rn-realpix +rpm;application/x-redhat-package-manager +rpss;application/vnd.nokia.radio-presets +rpst;application/vnd.nokia.radio-preset +rq;application/sparql-query +rs;application/rls-services+xml +rsd;application/x-rsd+xml +rss;application/x-rss+xml +rst;text/prs.fallenstein.rst +rt;text/richtext +rtf;application/rtf +rtx;text/richtext +rv;video/vnd.rn-realvideo +rvx;video/vnd.rn-realvideo +rw2;image/x-panasonic-raw2 +rxn;x-chemical/x-mdl-rxnfile +s11;video/vnd.sealed.mpeg1 +s14;video/vnd.sealed.mpeg4 +s1a;application/vnd.sealedmedia.softseal.pdf +s1e;application/vnd.sealed.xls +s1g;image/vnd.sealedmedia.softseal.gif +s1h;application/vnd.sealedmedia.softseal.html +s1j;image/vnd.sealedmedia.softseal.jpg +s1m;audio/vnd.sealedmedia.softseal.mpeg +s1n;image/vnd.sealed.png +s1p;application/vnd.sealed.ppt +s1q;video/vnd.sealedmedia.softseal.mov +s1w;application/vnd.sealed.doc +s3m;audio/x-s3m +s;text/x-asm +saf;application/vnd.yamaha.smaf-audio +sam;application/x-amipro +sami;application/x-sami +sav;application/x-spss +saveme;application/octet-stream +sbk;application/x-tbook +sbml;application/sbml+xml +sbs;application/x-spss +sc;application/vnd.ibm.secure-container +scala;text/x-scala +scd;application/x-msschedule +scm;application/vnd.lotus-screencam +scq;application/scvp-cv-request +scr;application/x-silverlight +scs;application/scvp-cv-response +sct;text/x-scriptlet +scurl;text/vnd.curl.scurl +sd2;audio/x-sd2 +sd;x-chemical/x-mdl-sdfile +sda;application/vnd.stardivision.draw +sdc;application/vnd.stardivision.calc +sdd;application/vnd.stardivision.impress +sdf;application/vnd.stardivision.math +sdkd;application/vnd.solent.sdkm+xml +sdkm;application/vnd.solent.sdkm+xml +sdml;text/plain +sdo;application/vnd.sealed.doc +sdoc;application/vnd.sealed.doc +sdp;application/sdp +sdr;application/x-sounder +sds;application/vnd.stardivision.chart +sdw;application/vnd.stardivision.writer +sea;application/x-sea +see;application/vnd.seemail +seed;application/vnd.fdsn.seed +sem;application/vnd.sealed.eml +sema;application/vnd.sema +semd;application/vnd.semd +semf;application/vnd.semf +seml;application/vnd.sealed.eml +ser;application/x-java-serialized-object +set;application/x-set +setpay;application/set-payment-initiation +setreg;application/set-registration-initiation +sfc;application/vnd.nintendo.snes.rom +sfd-hdstx;application/vnd.hydrostatix.sof-data +sfs;application/vnd.spotfire.sfs +sfv;text/x-sfv +sg;application/x-sms-rom +sgb;application/x-gameboy-rom +sgf;application/x-go-sgf +sgi;image/vnd.sealedmedia.softseal.gif +sgif;image/vnd.sealedmedia.softseal.gif +sgl;application/vnd.stardivision.writer-global +sgm;text/sgml +sgml;text/sgml +sh;application/x-sh +shape;application/x-dia-shape +shar;application/x-shar +shf;application/shf+xml +shn;application/x-shorten +shp;application/x-qgis +shtml;text/html +shx;application/x-qgis +si;text/vnd.wap.si +siag;application/x-siag +sic;application/vnd.wap.sic +sid;audio/prs.sid +sig;application/pgp-signature +sik;application/x-trash +sil;audio/x-silk +silo;model/mesh +sis;application/vnd.symbian.install +sisx;x-epoc/x-sisx-app +sit;application/x-stuffit +sitx;application/x-stuffit +siv;application/sieve +sjp;image/vnd.sealedmedia.softseal.jpg +sjpg;image/vnd.sealedmedia.softseal.jpg +sk1;image/x-skencil +sk;image/x-skencil +skd;application/x-koan +skm;application/x-koan +skp;application/x-koan +skr;application/pgp-keys +skt;application/x-koan +sl;text/vnd.wap.sl +slc;application/vnd.wap.slc +sldm;application/vnd.ms-powerpoint.slide.macroenabled.12 +sldx;application/vnd.openxmlformats-officedocument.presentationml.slide +slk;text/x-spreadsheet +slt;application/vnd.epson.salt +sm;application/vnd.stepmania.stepchart +smaf;application/x-smaf +smc;application/vnd.nintendo.snes.rom +smd;application/vnd.stardivision.mail +smf;application/vnd.stardivision.math +smh;application/vnd.sealed.mht +smht;application/vnd.sealed.mht +smi;application/smil +smil;application/smil +sml;application/smil+xml +smo;video/vnd.sealedmedia.softseal.mov +smov;video/vnd.sealedmedia.softseal.mov +smp3;audio/vnd.sealedmedia.softseal.mpeg +smp;audio/vnd.sealedmedia.softseal.mpeg +smpg;video/vnd.sealed.mpeg4 +sms;application/vnd.3gpp.sms +smv;audio/smv +smzip;application/vnd.stepmania.package +snd;audio/basic +snf;application/x-font-snf +so;application/x-sharedlib +soc;application/sgml-open-catalog +sol;application/x-solids +spc;x-chemical/x-galactic-spc +spd;application/vnd.sealedmedia.softseal.pdf +spdf;application/vnd.sealedmedia.softseal.pdf +spec;text/x-rpm-spec +spf;application/vnd.yamaha.smaf-phrase +spl;application/x-futuresplash +spm;application/x-source-rpm +spn;image/vnd.sealed.png +spng;image/vnd.sealed.png +spo;application/x-spss +spot;text/vnd.in3d.spot +spp;application/vnd.sealed.ppt +sppt;application/vnd.sealed.ppt +spq;application/scvp-vp-request +spr;application/x-sprite +sprite;application/x-sprite +sps;application/x-spss +spx;audio/ogg +sql;application/x-sql +sr2;image/x-sony-sr2 +src;application/x-wais-source +srf;image/x-sony-srf +srt;application/x-subrip +sru;application/sru+xml +srx;application/sparql-results+xml +ss;text/x-scheme +ssa;text/x-ssa +ssdl;application/x-ssdl+xml +sse;application/vnd.kodak-descriptor +ssf;application/vnd.epson.ssf +ssi;text/x-server-parsed-html +ssm;application/x-streamingmedia +ssml;application/ssml+xml +sst;application/vnd.ms-pki.certstore +ssw;video/vnd.sealed.swf +sswf;video/vnd.sealed.swf +st;application/vnd.sailingtracker.track +stc;application/vnd.sun.xml.calc.template +std;application/vnd.sun.xml.draw.template +step;application/x-step +stf;application/vnd.wt.stf +sti;application/vnd.sun.xml.impress.template +stk;application/hyperstudio +stl;application/vnd.ms-pki.stl +stm;application/vnd.sealedmedia.softseal.html +stml;application/vnd.sealedmedia.softseal.html +stp;application/x-step +str;application/vnd.pg.format +stw;application/vnd.sun.xml.writer.template +sty;text/x-tex +sub;image/vnd.dvb.subtitle +sun;image/x-sun-raster +sus;application/vnd.sus-calendar +susp;application/vnd.sus-calendar +sv4cpio;application/x-sv4cpio +sv4crc;application/x-sv4crc +sv;text/x-svsrc +svc;application/vnd.dvb.service +svd;application/vnd.svd +svf;image/vnd.dwg +svg;image/svg+xml +svgz;image/svg+xml +svh;text/x-svhdr +svr;application/x-world +sw;x-chemical/x-swissprot +swa;application/x-director +swf;application/x-shockwave-flash +swfl;application/x-shockwave-flash +swi;application/vnd.aristanetworks.swi +swm;application/x-ms-wim +sxc;application/vnd.sun.xml.calc +sxd;application/vnd.sun.xml.draw +sxg;application/vnd.sun.xml.writer.global +sxi;application/vnd.sun.xml.impress +sxl;application/vnd.sealed.xls +sxls;application/vnd.sealed.xls +sxm;application/vnd.sun.xml.math +sxw;application/vnd.sun.xml.writer +sylk;text/x-spreadsheet +t2t;text/x-txt2tags +t3;application/x-t3vm-image +t;application/x-troff +taglet;application/vnd.mynfc +talk;text/x-speech +tao;application/vnd.tao.intent-module-archive +tar;application/x-tar +taz;application/x-gtar +tb2;application/x-bzip-compressed-tar +tbk;application/x-toolbook +tbz2;application/x-gtar +tbz;application/x-gtar +tcap;application/vnd.3gpp2.tcap +tcl;application/x-tcl +tcsh;text/x-script.tcsh +teacher;application/vnd.smart.teacher +tei;application/tei+xml +teicorpus;application/tei+xml +tex;application/x-tex +texi;application/x-texinfo +texinfo;application/x-texinfo +text;application/x-plain +tfi;application/thraud+xml +tfm;application/x-tex-tfm +tga;image/x-targa +tgf;x-chemical/x-mdl-tgf +tgz;application/x-gtar +theme;application/x-theme +themepack;application/x-windows-themepack +thmx;application/vnd.ms-officetheme +tif;image/tiff +tiff;image/tiff +tk;text/x-tcl +tlrz;application/x-lrzip-compressed-tar +tlz;application/x-lzma-compressed-tar +tm;text/x-texmacs +tmo;application/vnd.tmobile-livetv +tnef;application/vnd.ms-tnef +tnf;application/vnd.ms-tnef +toc;application/x-cdrdao-toc +torrent;application/x-bittorrent +tpic;image/x-tga +tpl;application/vnd.groove-tool-template +tpt;application/vnd.trid.tpt +tr;application/x-troff +tra;application/vnd.trueapp +trig;application/x-trig +trm;application/x-msterminal +ts;text/x-texmacs +tsd;application/timestamped-data +tsi;audio/x-tsp-audio +tsp;application/x-dsptype +tsv;text/tab-separated-values +tta;audio/x-tta +ttc;x-font/x-collection +ttf;x-font/x-ttf +ttl;text/turtle +ttx;application/x-font-ttx +turbot;image/x-florian +twd;application/vnd.simtech-mindmapper +twds;application/vnd.simtech-mindmapper +txd;application/vnd.genomatix.tuxedo +txf;application/vnd.mobius.txf +txt;text/plain +txz;application/x-xz-compressed-tar +tzo;application/x-tzo +u32;application/x-authorware-bin +udeb;application/x-debian-package +ufd;application/vnd.ufdl +ufdl;application/vnd.ufdl +ufraw;application/x-ufraw +ui;application/x-designer +uil;text/x-uil +uls;text/x-iuls +ult;audio/x-mod +ulx;application/x-glulx +umj;application/vnd.umajin +unf;application/x-nes-rom +uni;text/uri-list +unif;application/x-nes-rom +unis;text/uri-list +unityweb;application/vnd.unity +unv;application/x-i-deas +uoml;application/vnd.uoml+xml +upa;application/vnd.hbci +uri;text/uri-list +uris;text/uri-list +url;application/x-mswinurl +urls;text/uri-list +ustar;application/x-ustar +utz;application/vnd.uiq.theme +uu;text/x-uuencode +uue;text/x-uuencode +uva;audio/vnd.dece.audio +uvd;application/vnd.dece.data +uvf;application/vnd.dece.data +uvg;image/vnd.dece.graphic +uvh;video/vnd.dece.hd +uvi;image/vnd.dece.graphic +uvm;video/vnd.dece.mobile +uvp;video/vnd.dece.pd +uvs;video/vnd.dece.sd +uvt;application/vnd.dece.ttml+xml +uvu;video/vnd.uvvu.mp4 +uvv;video/vnd.dece.video +uvva;audio/vnd.dece.audio +uvvd;application/vnd.dece.data +uvvf;application/vnd.dece.data +uvvg;image/vnd.dece.graphic +uvvh;video/vnd.dece.hd +uvvi;image/vnd.dece.graphic +uvvm;video/vnd.dece.mobile +uvvp;video/vnd.dece.pd +uvvs;video/vnd.dece.sd +uvvt;application/vnd.dece.ttml+xml +uvvu;video/vnd.uvvu.mp4 +uvvv;video/vnd.dece.video +uvvx;application/vnd.dece.unspecified +uvvz;application/vnd.dece.zip +uvx;application/vnd.dece.unspecified +uvz;application/vnd.dece.zip +v64;application/x-n64-rom +v;text/x-verilog +val;x-chemical/x-ncbi-asn1-binary +vala;text/x-vala +vapi;text/x-vala +vbk;audio/vnd.nortel.vbk +vcard;text/vcard +vcd;application/x-cdlink +vcf;text/x-vcard +vcg;application/vnd.groove-vcard +vcs;text/x-vcalendar +vct;text/vcard +vcx;application/vnd.vcx +vda;application/x-vda +vdo;video/x-vdo +vew;application/x-groupwise +vhd;text/x-vhdl +vhdl;text/x-vhdl +vis;application/vnd.visionary +viv;video/vnd.vivo +vivo;video/vnd.vivo +vlc;audio/x-mpegurl +vmd;x-chemical/x-vmd +vmf;application/x-vocaltec-media-file +vms;x-chemical/x-vamas-iso14976 +vob;video/x-ms-vob +voc;audio/x-voc +vor;application/vnd.stardivision.writer +vos;video/x-vosaic +vox;application/x-authorware-bin +vqe;audio/x-twinvq-plugin +vqf;audio/x-twinvq +vql;audio/x-twinvq-plugin +vrm;x-world/x-vrml +vrml;model/vrml +vrt;x-world/x-vrt +vsc;application/vnd.vidsoft.vidconference +vsd;application/vnd.visio +vsf;application/vnd.vsf +vss;application/vnd.visio +vst;application/vnd.visio +vsw;application/vnd.visio +vtt;text/x-vtt +vtu;model/vnd.vtu +vxml;application/voicexml+xml +w3d;application/x-director +w60;application/x-wordperfect6.0 +w61;application/x-wordperfect6.1 +w6w;application/msword +wad;application/x-doom +wav;audio/x-wav +wax;audio/x-ms-wax +wb1;application/x-qpro +wb2;application/x-quattropro +wb3;application/x-quattropro +wbmp;image/vnd.wap.wbmp +wbs;application/vnd.criticaltools.wbs+xml +wbxml;application/vnd.wap.wbxml +wcm;application/vnd.ms-works +wdb;application/vnd.ms-works +wdp;image/vnd.ms-photo +web;application/vnd.xara +weba;audio/x-webm +webapp;application/x-web-app-manifest+json +webm;video/x-webm +webp;image/x-webp +wg;application/vnd.pmi.widget +wgt;application/widget +wif;application/watcherinfo+xml +wim;application/x-ms-wim +wiz;application/msword +wk1;application/x-123 +wk3;application/vnd.lotus-1-2-3 +wk4;application/vnd.lotus-1-2-3 +wk;application/x-123 +wkdownload;application/x-partial-download +wks;application/vnd.lotus-1-2-3 +wm;video/x-ms-wm +wma;audio/x-ms-wma +wmd;application/x-ms-wmd +wmf;application/x-msmetafile +wml;text/vnd.wap.wml +wmlc;application/vnd.wap.wmlc +wmls;text/vnd.wap.wmlscript +wmlsc;application/vnd.wap.wmlscriptc +wmv;video/x-ms-wmv +wmx;video/x-ms-wmx +wmz;application/x-ms-wmz +woff2;x-font/x-woff2 +woff;x-font/x-woff +word;application/msword +wp4;application/vnd.wordperfect +wp5;application/vnd.wordperfect5.1 +wp6;application/x-wordperfect6.1 +wp;application/wordperfect5.1 +wpd;application/vnd.wordperfect +wpg;application/x-wpg +wpl;application/vnd.ms-wpl +wpp;application/vnd.wordperfect +wps;application/vnd.ms-works +wq1;application/x-lotus +wqd;application/vnd.wqd +wrd;application/x-msword +wri;application/x-mswrite +wrl;model/vrml +wrz;model/vrml +wsc;text/x-scriptlet +wsdl;application/wsdl+xml +wsgi;text/x-python +wspolicy;application/wspolicy+xml +wsrc;application/x-wais-source +wtb;application/vnd.webturbo +wtk;application/x-wintalk +wv;application/vnd.wv.csp+wbxml +wvc;audio/x-wavpack-correction +wvp;audio/x-wavpack +wvx;video/x-ms-wvx +wwf;application/x-wwf +wz;application/x-wingz +x-png;image/png +x32;application/x-authorware-bin +x3d;model/x3d+xml +x3db;model/x-x3d+binary +x3dbz;model/x-x3d+binary +x3dv;model/x-x3d+vrml +x3dvz;model/x-x3d+vrml +x3dz;model/x3d+xml +x3f;image/x-sigma-x3f +x_b;model/vnd.parasolid.transmit.binary +x_t;model/vnd.parasolid.transmit.text +xac;application/x-gnucash +xaml;application/x-xaml+xml +xap;application/x-silverlight-app +xar;application/vnd.xara +xbap;application/x-ms-xbap +xbd;application/vnd.fujixerox.docuworks.binder +xbel;application/x-xbel +xbl;application/xml +xbm;image/x-xbitmap +xcf;application/x-xcf +xdf;application/xcap-diff+xml +xdm;application/vnd.syncml.dm+xml +xdp;application/vnd.adobe.xdp+xml +xdr;video/x-amt-demorun +xdssc;application/dssc+xml +xdw;application/vnd.fujixerox.docuworks +xenc;application/xenc+xml +xer;application/patch-ops-error+xml +xfdf;application/vnd.adobe.xfdf +xfdl;application/vnd.xfdl +xgz;x-xgl/x-drawing +xht;application/xhtml+xml +xhtml;application/xhtml+xml +xhvml;application/xv+xml +xi;audio/x-xi +xif;image/vnd.xiff +xl;application/x-excel +xla;application/vnd.ms-excel +xlam;application/vnd.ms-excel.addin.macroenabled.12 +xlb;application/vnd.ms-excel +xlc;application/vnd.ms-excel +xld;application/x-excel +xlf;application/x-xliff+xml +xliff;application/x-xliff +xlk;application/x-excel +xll;application/x-excel +xlm;application/vnd.ms-excel +xlr;application/vnd.ms-works +xls;application/vnd.ms-excel +xlsb;application/vnd.ms-excel.sheet.binary.macroenabled.12 +xlsm;application/vnd.ms-excel.sheet.macroenabled.12 +xlsx;application/vnd.openxmlformats-officedocument.spreadsheetml.sheet +xlt;application/vnd.ms-excel +xltm;application/vnd.ms-excel.template.macroenabled.12 +xltx;application/vnd.openxmlformats-officedocument.spreadsheetml.template +xlv;application/x-excel +xlw;application/vnd.ms-excel +xm;audio/x-xm +xmf;audio/x-xmf +xmi;text/x-xmi +xml;application/xml +xmt_bin;model/vnd.parasolid.transmit.binary +xmt_txt;model/vnd.parasolid.transmit.text +xmz;x-xgl/x-movie +xo;application/vnd.olpc-sugar +xop;application/xop+xml +xpdl;application/xml +xpi;application/x-xpinstall +xpix;application/x-vnd.ls-xpix +xpl;application/x-xproc+xml +xpm;image/x-xpixmap +xpr;application/vnd.is-xpr +xps;application/vnd.ms-xpsdocument +xpw;application/vnd.intercon.formnet +xpx;application/vnd.intercon.formnet +xsd;application/xml +xsl;application/xml +xslfo;text/x-xslfo +xslt;application/xslt+xml +xsm;application/vnd.syncml+xml +xspf;application/x-xspf+xml +xsr;video/x-amt-showrun +xtel;x-chemical/x-xtel +xul;application/vnd.mozilla.xul+xml +xvm;application/xv+xml +xvml;application/xv+xml +xwd;image/x-xwindowdump +xyz;x-chemical/x-xyz +xz;application/x-xz +yaml;application/x-yaml +yang;application/yang +yin;application/yin+xml +yml;application/x-yaml +z1;application/x-zmachine +z2;application/x-zmachine +z3;application/x-zmachine +z4;application/x-zmachine +z5;application/x-zmachine +z64;application/x-n64-rom +z6;application/x-zmachine +z7;application/x-zmachine +z8;application/x-zmachine +z;application/x-compress +zabw;application/x-abiword +zaz;application/vnd.zzazz.deck+xml +zip;application/zip +zir;application/vnd.zul +zirz;application/vnd.zul +zmm;application/vnd.handheld-entertainment+xml +zmt;x-chemical/x-mopac-input +zoo;application/x-zoo +zsav;application/x-spss-sav +zsh;text/x-script.zsh +zz;application/zlib +~;application/x-trash + +134:application:: +x-3gpdash-qoe-report+xml;; +x-a2l;; +x-access;; +x-alto-costmap+json;; +x-alto-costmapfilter+json;; +x-alto-directory+json;; +x-alto-endpointcost+json;; +x-alto-endpointcostparams+json;; +x-alto-endpointprop+json;; +x-alto-endpointpropparams+json;; +x-alto-error+json;; +x-alto-networkmap+json;; +x-alto-networkmapfilter+json;; +x-amf;; +x-aml;; +x-appledouble;;base64 +x-arc;; +x-atf;; +x-atfx;; +x-atxml;; +x-auth-policy+xml;; +x-bacnet-xdd+zip;; +x-bzdvi;; +x-bzpdf;; +x-bzpostscript;; +x-calendar+json;; +x-cdfx+xml;; +x-cdni;; +x-cea;; +x-cellml+xml;; +x-class-file;; +x-cms;; +x-coap-group+json;; +x-core;; +x-cpio-compressed;; +x-csvm+json;; +x-dcd;; +x-dii;; +x-dit;; +x-efi;; +x-emergencycalldata.comment+xml;; +x-emergencycalldata.deviceinfo+xml;; +x-emergencycalldata.providerinfo+xml;; +x-emergencycalldata.serviceinfo+xml;; +x-emergencycalldata.subscriberinfo+xml;; +x-example;; +x-executable;; +x-font-dos;; +x-font-framemaker;; +x-font-libgrx;; +x-font-sunos-news;; +x-font-tex-tfm;; +x-font-tex;; +x-font-vfont;; +x-gdbm;; +x-geo+json;; +x-ghostview;; +x-gtktalog;; +x-gunzip;; +x-gz-font-linux-psf;; +x-gzdvi;; +x-gzpdf;; +x-gzpostscript;; +x-ideas;; +x-iff;; +x-ipod-firmware;; +x-java-applet;; +x-java-bean;; +x-jose+json;; +x-jose;; +x-json-seq;; +x-jwk+json;; +x-jwk-set+json;; +x-jwt;; +x-kdelnk;; +x-kspread-crypt;; +x-ksysv-package;; +x-kword-crypt;; +x-lgr+xml;; +x-load-control+xml;; +x-lotus-123;; +x-lxf;; +x-matroska;; +x-mbms-associated-procedure-description+xml;; +x-mbms-deregister+xml;; +x-mbms-envelope+xml;; +x-mbms-msk+xml;; +x-mbms-msk-response+xml;; +x-mbms-protection-description+xml;; +x-mbms-reception-report+xml;; +x-mbms-register+xml;; +x-mbms-register-response+xml;; +x-mbms-schedule+xml;; +x-mbms-user-service-description+xml;; +x-merge-patch+json;; +x-mf4;; +x-mozilla-bookmarks;; +x-ms-tnef;; +x-nautilus-link;; +x-news-message-id;; +x-odx;; +x-ole-storage;; +x-pdx;; +x-pef-executable;; +x-ppsp-tracker+json;; +x-problem+json;; +x-problem+xml;; +x-profile;; +x-qsig;; +x-raw-disk-image-xz-compressed;; +x-rdap+json;; +x-remote_printing;; +x-rfc+xml;; +x-riff;; +x-rx;; +x-sc;; +x-scaip+xml;; +x-scim+json;; +x-simple-message-summary;; +x-slp;; +x-sqlite2;; +x-sqlite3;; +x-toutdoux;; +x-troff-man-compressed;; +x-ttml+xml;; +x-videolan;; +x-vividence.scriptfile;; +x-word;;base64 +x-www-form-urlencoded;; +x-x400-bp;; +x-xml-patch+xml;; +x-xzpdf;; +x-zerosize;; +x-zip-compressed-fb2;; + +464:application::E +x-123;wk,wk1; +x-7z-compressed;7z; +x-abiword;abw,zabw; +x-acad;dwg; +x-ace-compressed;ace; +x-ace;ace; +x-aim;aim; +x-alz;alz; +x-amipro;sam; +x-annodex;anx; +x-aportisdoc;pdb,pdc; +x-apple-diskimage;dmg; +x-applix-spreadsheet;as; +x-applix-word;aw; +x-applixware;aw; +x-archive;a,ar; +x-arj;arj; +x-asp;asp; +x-atomserv+xml;atomsrv; +x-authorware-bin;aab,x32,u32,vox; +x-authorware-map;aam; +x-authorware-seg;aas; +x-awk;awk; +x-base64;mm,mme; +x-bbolin;lin; +x-bcpio;bcpio; +x-binary;bin; +x-binhex40;hqx; +x-binhex4;hqx; +x-binhex;hqx; +x-bittorrent;torrent; +x-bleeper;bleep;base64 +x-blender;blender,blend,BLEND; +x-blorb;blb,blorb; +x-book;boo,book; +x-bsh;bsh,sh,shar; +x-bytecode.elisp;elc; +x-bytecode.python;pyc; +x-bzip-compressed-tar;tbz2,tbz,tb2; +x-bzip2;bz2,boz; +x-bzip;bz,bz2; +x-cab;cab; +x-cap;cap,pcap; +x-cb7;cb7; +x-cbr;cbr,cba,cbt,cbz,cb7; +x-cbt;cbt; +x-cbz;cbz; +x-ccmx;ccmx; +x-cd-image;iso,iso9660; +x-cdf;cdf,cda; +x-cdlink;vcd; +x-cdrdao-toc;toc; +x-cfs-compressed;cfs; +x-chat;chat,cha; +x-chess-pgn;pgn; +x-chrome-extension;crx; +x-cisco-vpn-settings;pcf; +x-clariscad;ccad; +x-cmu-raster;ras; +x-cocoa;cco; +x-compactpro;cpt; +x-compress;z,Z;base64 +x-compressed-tar;tgz; +x-compressed;gz,tgz,z,zip; +x-conference;nsc; +x-cpio;cpio;base64 +x-cpt;cpt; +x-csh;csh;8bit +x-cu-seeme;cu,csm; +x-cue;cue; +x-dar;dar; +x-davmount+xml;davmount; +x-dbf;dbf; +x-dc-rom;dc; +x-debian-package;deb,udeb; +x-deepv;deepv; +x-designer;ui; +x-desktop;desktop,kdelnk; +x-dgc-compressed;dgc; +x-dia-diagram;dia; +x-dia-shape;shape; +x-director;dcr,dir,dxr,cst,cct,cxt,w3d,fgd,swa; +x-dms;dms; +x-docbook+xml;dbk,docbook; +x-doom;wad; +x-drafting;drw; +x-dsptype;tsp; +x-dtbncx+xml;ncx; +x-dtbook+xml;dtb; +x-dtbresource+xml;res; +x-dvi;dvi;base64 +x-dxf;dxf; +x-e-theme;etheme; +x-egon;egon; +x-elc;elc; +x-envoy;evy,env; +x-epub+zip;epub; +x-esrehber;es; +x-eva;eva; +x-excel;xl,xla,xlb,xlc,xld,xlk,xll,xlm,xls,xlt,xlv,xlw; +x-fictionbook+xml;fb2; +x-fluid;fl; +x-font-afm;afm; +x-font-bdf;bdf; +x-font-ghostscript;gsf; +x-font-linux-psf;psf; +x-font-otf;otf; +x-font-pcf;pcf; +x-font-snf;snf; +x-font-speedo;spd; +x-font-ttf;ttc,ttf; +x-font-ttx;ttx; +x-font-type1;pfa,pfb,pfm,afm,gsf; +x-font;pfa,pfb,gsf,pcf,pcf.z; +x-fractals;fif; +x-frame;mif; +x-freearc;arc; +x-freelance;pre; +x-freeloader;frl; +x-freemind;mm; +x-futuresplash;spl; +x-gameboy-rom;gb,gbc,cgb,sgb; +x-gamecube-rom;iso; +x-gba-rom;gba,agb; +x-gca-compressed;gca; +x-gedcom;ged,gedcom; +x-genesis-rom;gen,smd,32x,mdx; +x-gettext-translation;gmo,mo; +x-glade;glade; +x-glulx;ulx; +x-gml+xml;gml; +x-gnucash;gnucash,gnc,xac; +x-gnumeric;gnumeric; +x-gnunet-directory;gnd; +x-gnuplot;gp,gplt,gnuplot; +x-gnutar;tgz; +x-go-sgf;sgf; +x-gpx+xml;gpx; +x-gramps-xml;gramps; +x-graphing-calculator;gcf; +x-graphite;gra; +x-groupwise;vew; +x-gsp;gsp; +x-gss;gss; +x-gtar;gtar,tgz,tbz2,tbz,taz;base64 +x-gtk-builder;ui; +x-gxf;gxf; +x-gzip;gz,gzip,tgz;base64 +x-hdf;hdf,hdf4,h4,hdf5,h5; +x-helpfile;help,hlp; +x-hep;hep; +x-hlp;hlp; +x-hta;hta; +x-html+ruby;rhtml;8bit +x-httpd-eruby;rhtml; +x-httpd-imap;imap; +x-httpd-php-source;phps; +x-httpd-php3-preprocessed;php3p; +x-httpd-php3;php3; +x-httpd-php4;php4; +x-httpd-php5;php5; +x-httpd-php;phtml,pht,php;8bit +x-hwp;hwp; +x-hwt;hwt; +x-i-deas;unv; +x-ica;ica; +x-illustrator;ai; +x-ima;ima; +x-imagemap;imagemap,imap;8bit +x-inf;inf; +x-info;info; +x-install-instructions;install; +x-internet-signup;ins,isp; +x-internett-signup;ins; +x-inventor;iv; +x-ip2;ip; +x-iphone;iii; +x-iso9660-image;iso; +x-it87;it87; +x-iwork-keynote-sffkey;key; +x-jam;jam; +x-java-archive;jar; +x-java-byte-code;class; +x-java-class;class; +x-java-commerce;jcm; +x-java-jce-keystore;jceks; +x-java-jnlp-file;jnlp; +x-java-keystore;jks,ks; +x-java-pack200;pack; +x-java-serialized-object;ser; +x-java-vm;class; +x-java;class; +x-javascript;js; +x-jbuilder-project;jpr,jpx; +x-jmol;jmz; +x-jrd+json;jrd; +x-jsonml+json;jsonml; +x-karbon;karbon; +x-kchart;chrt; +x-kexi-connectiondata;kexic; +x-kexiproject-shortcut;kexis; +x-kexiproject-sqlite2;kexi; +x-kexiproject-sqlite3;kexi; +x-kformula;kfo; +x-killustrator;kil; +x-kivio;flw; +x-koan;skp,skd,skt,skm; +x-kontour;kon; +x-kpovmodeler;kpm; +x-kpresenter;kpr,kpt; +x-krita;kra; +x-ksh;ksh; +x-kspread;ksp; +x-kugar;kud; +x-kword;kwd,kwt; +x-latex;latex,ltx;8bit +x-lha;lha,lzh; +x-lhz;lhz; +x-lisp;lsp; +x-livescreen;ivy; +x-lotus;wq1; +x-lotusscreencam;scm; +x-lrzip-compressed-tar;tlrz; +x-lrzip;lrz; +x-lua-bytecode;luac; +x-lyx;lyx; +x-lz4;lz4; +x-lzh-compressed;lzh,lha; +x-lzh;lzh; +x-lzip;lz; +x-lzma-compressed-tar;tlz; +x-lzma;lzma; +x-lzop;lzo; +x-lzx;lzx; +x-m3g;m3g; +x-m4;m4; +x-mac-binary;bin; +x-mac-binhex40;hqx; +x-mac-binhex;hqx; +x-mac-compactpro;cpt; +x-macbinary;bin; +x-magic-cap-package-1.0;mc$; +x-magicpoint;mgp; +x-maker;frm,maker,frame,fm,fb,book,fbdoc; +x-markaby;mab; +x-mathcad;#,mcd;mcd, +x-mbedlet;mbd; +x-mcad;mcd; +x-meme;mm; +x-metalink+xml;metalink; +x-midi;mid,midi; +x-mie;mie; +x-mif;mif; +x-mime;aps; +x-mimearchive;mhtml,mht; +x-mix-transfer;nix; +x-mobipocket-ebook;prc,mobi; +x-mplayer2;asx; +x-ms-application;application; +x-ms-dos-executable;exe; +x-ms-shortcut;lnk; +x-ms-wim;wim,swm; +x-ms-wmd;wmd; +x-ms-wmz;wmz; +x-ms-xbap;xbap; +x-msaccess;mdb,mda,mde,mdf;base64 +x-msbinder;obd; +x-mscardfile;crd; +x-msclip;clp; +x-msdos-program;com,exe,bat,dll;base64 +x-msdownload;exe,dll,com,bat,msi;base64 +x-msexcel;xla,xls,xlw; +x-msi;msi; +x-msmediaview;mvb,m13,m14; +x-msmetafile;wmf,wmz,emf,emz; +x-msmoney;mny; +x-mspowerpoint;pot,pps,ppt,ppz; +x-mspublisher;pub; +x-msschedule;scd; +x-msterminal;trm; +x-mswinurl;url; +x-msword-template;dot; +x-msword;doc,dot,wrd;base64 +x-mswrite;wri; +x-msx-rom;msx; +x-n64-rom;n64,z64,v64; +x-navi-animation;ani; +x-navidoc;nvd; +x-navimap;map; +x-navistyle;stl; +x-nes-rom;nes,nez,unf,unif; +x-netcdf;nc,cdf; +x-netmc;mcp; +x-netshow-channel;nsc; +x-newton-compatible-pkg;pkg; +x-nintendo-ds-rom;nds; +x-nokia-9000-communicator-add-on-software;aos; +x-ns-proxy-autoconfig;pac,dat; +x-nwc;nwc; +x-nzb;nzb; +x-object;o; +x-oebps-package+xml;opf; +x-oleo;oleo; +x-omc;omc; +x-omcdatamaker;omcd; +x-omcregerator;omcr; +x-omdoc+xml;omdoc; +x-onenote;onetoc,onetoc2,onetmp,onepkg; +x-owl+xml;owx; +x-oz-application;oza; +x-pagemaker;pm5,pt5,pm,pm4,p65,pm6,pmd; +x-pak;pak; +x-par2;PAR2,par2; +x-partial-download;wkdownload,crdownload,part; +x-pc-engine-rom;pce; +x-pcl;pcl; +x-perl;pl,pm,PL,al,perl,pod,t;8bit +x-pgp;pgp; +x-php;php,php3,php4,php5,phps; +x-pics-rules;prf; +x-pixclscript;plx; +x-pkcs-12;p12; +x-pkcs-crl;crl; +x-pkcs10;p10; +x-pkcs12;p12,pfx; +x-pkcs7-certificates;p7b,spc; +x-pkcs7-certreqresp;p7r; +x-pkcs7-crl;crl; +x-pkcs7-mime;p7c,p7m; +x-pkcs7-signature;p7a; +x-pkix-pkipath;pkipath; +x-plain;text; +x-planperfect;pln; +x-pocket-word;psw; +x-pointplus;css; +x-portable-anymap;pnm; +x-powerpoint;ppt; +x-pro_eng;part,prt; +x-project;mpc,mpt,mpv,mpx; +x-pw;pw; +x-python-bytecode;pyc,pyo; +x-python-code;pyc,pyo; +x-python;py;8bit +x-qgis;qgs,shp,shx; +x-qpress;qp; +x-qpro;wb1; +x-qtiplot;qti; +x-quattropro;wb1,wb2,wb3; +x-quicktime-media-link;qtl; +x-quicktimeplayer;qtl; +x-qw;qif; +x-ram;ram; +x-rar-compressed;rar;base64 +x-rar;rar; +x-raw-disk-image;raw-disk-image,img; +x-redhat-package-manager;rpm; +x-research-info-systems;ris; +x-ringing-tones;rng; +x-rpm;rpm; +x-rsd+xml;rsd; +x-rss+xml;rss; +x-rtf;rtf; +x-ruby;rb,rbw;8bit +x-sami;smi,sami; +x-sdp;sdp; +x-sea;sea; +x-seelogo;sl; +x-set;set; +x-sh;sh;8bit +x-shar;shar,sh;8bit +x-shared-library-la;la; +x-sharedlib;so; +x-shellscript;sh; +x-shockwave-flash;swf,swfl; +x-shorten;shn; +x-siag;siag; +x-silverlight-app;xap; +x-silverlight;scr; +x-sit;sit; +x-sla;stl; +x-smaf;mmf,smaf; +x-sms-rom;sms,gg,sg; +x-solids;sol; +x-sounder;sdr; +x-source-rpm;spm; +x-sprite;spr,sprite; +x-spss-por;por; +x-spss-sav;sav,zsav; +x-spss;sav,sbs,sps,spo,spp; +x-sql;sql; +x-ssdl+xml;ssdl; +x-step;step,stp; +x-streamingmedia;ssm; +x-stuffit;sit,sitx;base64 +x-stuffitx;sitx; +x-subrip;srt; +x-sv4cpio;sv4cpio;base64 +x-sv4crc;sv4crc;base64 +x-t3vm-image;t3; +x-t602;602; +x-tads;gam; +x-tar;tar,gtar,gem;base64 +x-tarz;taz; +x-tbook;sbk,tbk; +x-tcl;tcl;8bit +x-tex-gf;gf; +x-tex-pk;pk; +x-tex-tfm;tfm; +x-tex;tex;8bit +x-texinfo;texinfo,texi;8bit +x-tgif;obj; +x-theme;theme; +x-toolbook;tbk; +x-trash;~,%,bak,old,sik; +x-trig;trig; +x-troff-man;man;8bit +x-troff-me;me; +x-troff-ms;ms; +x-troff-msvideo;avi; +x-troff;t,tr,roff;8bit +x-tzo;tzo; +x-ufraw;ufraw; +x-ustar;ustar;base64 +x-vda;vda; +x-visio;vsd,vst,vsw; +x-vmsbackup;bck;base64 +x-vnd.audioexplosion.mzz;mzz; +x-vnd.ls-xpix;xpix; +x-vocaltec-media-desc;vmd; +x-vocaltec-media-file;vmf; +x-vrml;vrml; +x-wais-source;src,wsrc; +x-web-app-manifest+json;webapp; +x-wii-rom;iso; +x-windows-themepack;themepack; +x-wingz;wz; +x-winhelp;hlp; +x-winhlp;hlp; +x-wintalk;wtk; +x-wordperfect6.0;w60,wp5; +x-wordperfect6.1;wp6,w61; +x-wordperfect;wp,wp5,wp6,wpd; +x-world;svr,wrl; +x-wpg;wpg; +x-wpwin;wpd; +x-wri;wri; +x-wwf;wwf; +x-x509-ca-cert;crt,der,cer,cert,pem;base64 +x-x509-user-cert;crt; +x-xaml+xml;xaml; +x-xbel;xbel; +x-xcf;xcf; +x-xfig;fig; +x-xliff+xml;xlf; +x-xliff;xlf,xliff; +x-xpinstall;xpi; +x-xproc+xml;xpl; +x-xspf+xml;xspf; +x-xz-compressed-tar;txz; +x-xz;xz; +x-yaml;yaml,yml; +x-zip-compressed;zip; +x-zmachine;z1,z2,z3,z4,z5,z6,z7,z8; +x-zoo;zoo; + +639:application:I: +1d-interleaved-parityfec;; +3gpp-ims+xml;; +activemessage;; +applefile;;base64 +atomdeleted+xml;; +atomicmail;; +batch-smtp;; +beep+xml;; +calendar+xml;; +call-completion;; +cals-1840;; +cbor;; +ccmp+xml;; +cea-2018+xml;; +cfw;; +cnrp+xml;; +conference-info+xml;; +cpl+xml;; +csrattrs;; +csta+xml;; +cstadata+xml;; +cybercash;; +dashdelta;; +dca-rft;; +dec-dx;; +dialog-info+xml;; +dns;; +dskpp+xml;; +dvcs;; +edi-consent;; +edi-x12;; +edifact;; +emotionml+xml;; +encaprtp;; +epp+xml;; +eshop;; +fastinfoset;; +fastsoap;; +fdt+xml;; +fits;; +font-sfnt;; +framework-attributes+xml;; +h224;; +held+xml;; +http;; +ibe-key-request+xml;; +ibe-pkg-reply+xml;; +ibe-pp-data;; +im-iscomposing+xml;; +index.cmd;; +index.obj;; +index.response;; +index.vnd;; +index;; +iotp;; +ipp;; +isup;; +its+xml;; +kpml-request+xml;; +kpml-response+xml;; +link-format;; +lostsync+xml;; +macwriteii;; +mathml-content+xml;; +mathml-presentation+xml;; +media-policy-dataset+xml;; +media_control+xml;; +mikey;; +moss-keys;; +moss-signature;; +mosskey-data;; +mosskey-request;; +mpeg4-generic;; +mpeg4-iod-xmt;; +mpeg4-iod;; +mrb-consumer+xml;; +mrb-publish+xml;; +msc-ivr+xml;; +msc-mixer+xml;; +nasdata;; +news-checkgroups;; +news-groupinfo;; +news-transmission;; +nlsml+xml;; +nss;; +p2p-overlay+xml;; +parityfec;; +pidf+xml;; +pidf-diff+xml;; +poc-settings+xml;; +provenance+xml;; +prs.alvestrand.titrax-sheet;; +prs.hpub+zip;; +prs.plucker;; +prs.rdf-xml-crypt;; +prs.xsf+xml;; +raptorfec;; +remote-printing;; +reputon+json;; +riscos;; +rlmi+xml;; +rpki-updown;; +rtploopback;; +rtx;; +samlassertion+xml;; +samlmetadata+xml;; +sep+xml;; +sep-exi;; +session-info;; +set-payment;; +set-registration;; +sgml;; +simple-filter+xml;; +simplesymbolcontainer;; +slate;; +smpte336m;; +soap+fastinfoset;; +soap+xml;; +spirits-event+xml;; +tamp-apex-update-confirm;; +tamp-apex-update;; +tamp-community-update-confirm;; +tamp-community-update;; +tamp-error;; +tamp-sequence-adjust-confirm;; +tamp-sequence-adjust;; +tamp-status-query;; +tamp-status-response;; +tamp-update-confirm;; +tamp-update;; +timestamp-query;; +timestamp-reply;; +tve-trigger;; +ulpfec;; +urc-grpsheet+xml;; +urc-ressheet+xml;; +urc-targetdesc+xml;; +urc-uisocketdesc+xml;; +vcard+json;; +vcard+xml;; +vemmi;; +vnd.3gpp-prose+xml;; +vnd.3gpp-prose-pc3ch+xml;; +vnd.3gpp.access-transfer-events+xml;; +vnd.3gpp.bsf+xml;; +vnd.3gpp.mid-call+xml;; +vnd.3gpp.sms+xml;; +vnd.3gpp.srvcc-ext+xml;; +vnd.3gpp.srvcc-info+xml;; +vnd.3gpp.state-and-event-info+xml;; +vnd.3gpp.ussd+xml;; +vnd.3gpp2.bcmcsinfo+xml;; +vnd.3gpp2.sms;; +vnd.3lightssoftware.imagescal;; +vnd.adobe.partial-upload;; +vnd.aether.imp;; +vnd.ah-barcode;; +vnd.amazon.mobi8-ebook;; +vnd.amundsen.maze+xml;; +vnd.anki;; +vnd.apache.thrift.binary;; +vnd.apache.thrift.compact;; +vnd.apache.thrift.json;; +vnd.api+json;; +vnd.artsquare;; +vnd.autopackage;; +vnd.avistar+xml;; +vnd.balsamiq.bmml+xml;; +vnd.balsamiq.bmpr;; +vnd.bekitzur-stech+json;; +vnd.biopax.rdf+xml;; +vnd.bluetooth.ep.oob;; +vnd.bluetooth.le.oob;; +vnd.cab-jscript;; +vnd.canon-cpdl;; +vnd.canon-lips;; +vnd.cendio.thinlinc.clientconf;; +vnd.century-systems.tcp_stream;; +vnd.chess-pgn;; +vnd.cirpack.isdn-ext;; +vnd.citationstyles.style+xml;; +vnd.collection+json;; +vnd.collection.doc+json;; +vnd.collection.next+json;; +vnd.comicbook+zip;; +vnd.commerce-battelle;; +vnd.comsocaller;; +vnd.coreos.ignition+json;; +vnd.ctct.ws+xml;; +vnd.cups-pdf;; +vnd.cups-postscript;; +vnd.cups-raster;; +vnd.cups-raw;; +vnd.cyan.dean.root+xml;; +vnd.cybank;; +vnd.desmume.movie;; +vnd.dir-bi.plate-dl-nosuffix;; +vnd.dm.delegation+xml;; +vnd.document+json;; +vnd.dolby.mobile.1;; +vnd.dolby.mobile.2;; +vnd.doremir.scorecloud-binary-document;; +vnd.drive+json;; +vnd.dtg.local.flash;; +vnd.dtg.local.html;; +vnd.dtg.local;; +vnd.dvb.dvbj;; +vnd.dvb.esgcontainer;; +vnd.dvb.ipdcdftnotifaccess;; +vnd.dvb.ipdcesgaccess2;; +vnd.dvb.ipdcesgaccess;; +vnd.dvb.ipdcesgpdd;; +vnd.dvb.ipdcroaming;; +vnd.dvb.iptv.alfec-base;; +vnd.dvb.iptv.alfec-enhancement;; +vnd.dvb.notif-aggregate-root+xml;; +vnd.dvb.notif-container+xml;; +vnd.dvb.notif-generic+xml;; +vnd.dvb.notif-ia-msglist+xml;; +vnd.dvb.notif-ia-registration-request+xml;; +vnd.dvb.notif-ia-registration-response+xml;; +vnd.dvb.notif-init+xml;; +vnd.dvb.pfr;; +vnd.dxr;; +vnd.dzr;; +vnd.easykaraoke.cdgdownload;; +vnd.ecdis-update;; +vnd.ecowin.filerequest;; +vnd.ecowin.fileupdate;; +vnd.ecowin.series;; +vnd.ecowin.seriesrequest;; +vnd.ecowin.seriesupdate;; +vnd.emclient.accessrequest+xml;; +vnd.enphase.envoy;; +vnd.eprints.data+xml;; +vnd.ericsson.quickcall;; +vnd.etsi.aoc+xml;; +vnd.etsi.asic-e+zip;; +vnd.etsi.asic-s+zip;; +vnd.etsi.cug+xml;; +vnd.etsi.iptvcommand+xml;; +vnd.etsi.iptvdiscovery+xml;; +vnd.etsi.iptvprofile+xml;; +vnd.etsi.iptvsad-bc+xml;; +vnd.etsi.iptvsad-cod+xml;; +vnd.etsi.iptvsad-npvr+xml;; +vnd.etsi.iptvservice+xml;; +vnd.etsi.iptvsync+xml;; +vnd.etsi.iptvueprofile+xml;; +vnd.etsi.mcid+xml;; +vnd.etsi.mheg5;; +vnd.etsi.overload-control-policy-dataset+xml;; +vnd.etsi.pstn+xml;; +vnd.etsi.sci+xml;; +vnd.etsi.simservs+xml;; +vnd.etsi.timestamp-token;; +vnd.etsi.tsl+xml;; +vnd.etsi.tsl.der;; +vnd.eudora.data;; +vnd.f-secure.mobile;; +vnd.fastcopy-disk-image;; +vnd.ffsns;; +vnd.filmit.zfc;; +vnd.fints;; +vnd.firemonkeys.cloudcell;; +vnd.font-fontforge-sfd;; +vnd.fujixerox.art-ex;; +vnd.fujixerox.art4;; +vnd.fujixerox.docuworks.container;; +vnd.fujixerox.hbpl;; +vnd.fut-misnet;; +vnd.geo+json;; +vnd.geocube+xml;; +vnd.gerber;; +vnd.globalplatform.card-content-mgt-response;; +vnd.globalplatform.card-content-mgt;; +vnd.gov.sk.e-form+xml;; +vnd.gov.sk.e-form+zip;; +vnd.gov.sk.xmldatacontainer+xml;; +vnd.gridmp;; +vnd.hal+json;; +vnd.hcl-bireports;; +vnd.hdt;; +vnd.heroku+json;; +vnd.httphone;; +vnd.hyperdrive+json;; +vnd.ibm.afplinedata;; +vnd.ieee.1905;; +vnd.ims.imsccv1p1;; +vnd.ims.imsccv1p2;; +vnd.ims.imsccv1p3;; +vnd.ims.lis.v2.result+json;; +vnd.ims.lti.v2.toolconsumerprofile+json;; +vnd.ims.lti.v2.toolproxy+json;; +vnd.ims.lti.v2.toolproxy.id+json;; +vnd.ims.lti.v2.toolsettings+json;; +vnd.ims.lti.v2.toolsettings.simple+json;; +vnd.informedcontrol.rms+xml;; +vnd.informix-visionary;; +vnd.infotech.project+xml;; +vnd.infotech.project;; +vnd.innopath.wamp.notification;; +vnd.intertrust.digibox;; +vnd.intertrust.nncp;; +vnd.iptc.g2.catalogitem+xml;; +vnd.iptc.g2.conceptitem+xml;; +vnd.iptc.g2.knowledgeitem+xml;; +vnd.iptc.g2.newsitem+xml;; +vnd.iptc.g2.newsmessage+xml;; +vnd.iptc.g2.packageitem+xml;; +vnd.iptc.g2.planningitem+xml;; +vnd.japannet-directory-service;; +vnd.japannet-jpnstore-wakeup;; +vnd.japannet-payment-wakeup;; +vnd.japannet-registration-wakeup;; +vnd.japannet-registration;; +vnd.japannet-setstore-wakeup;; +vnd.japannet-verification-wakeup;; +vnd.japannet-verification;; +vnd.jsk.isdn-ngn;; +vnd.liberty-request+xml;; +vnd.mapbox-vector-tile;; +vnd.marlin.drm.actiontoken+xml;; +vnd.marlin.drm.conftoken+xml;; +vnd.marlin.drm.license+xml;; +vnd.marlin.drm.mdcf;; +vnd.mason+json;; +vnd.maxmind.maxmind-db;; +vnd.meridian-slingshot;; +vnd.micro+json;; +vnd.microsoft.portable-executable;; +vnd.miele+json;; +vnd.minisoft-hp3000-save;; +vnd.mitsubishi.misty-guard.trustweb;; +vnd.motorola.flexsuite.adsi;; +vnd.motorola.flexsuite.fis;; +vnd.motorola.flexsuite.gotap;; +vnd.motorola.flexsuite.kmr;; +vnd.motorola.flexsuite.ttc;; +vnd.motorola.flexsuite.wem;; +vnd.motorola.flexsuite;; +vnd.motorola.iprm;; +vnd.ms-3mfdocument;; +vnd.ms-color.iccprofile;; +vnd.ms-office.activex+xml;; +vnd.ms-opentype;; +vnd.ms-package.obfuscated-opentype;; +vnd.ms-playready.initiator+xml;; +vnd.ms-printdevicecapabilities+xml;; +vnd.ms-printing.printticket+xml;; +vnd.ms-printschematicket+xml;; +vnd.ms-windows.devicepairing;; +vnd.ms-windows.nwprinting.oob;; +vnd.ms-windows.printerpairing;; +vnd.ms-windows.wsd.oob;; +vnd.ms-wmdrm.lic-chlg-req;; +vnd.ms-wmdrm.lic-resp;; +vnd.ms-wmdrm.meter-chlg-req;; +vnd.ms-wmdrm.meter-resp;; +vnd.msa-disk-image;; +vnd.msign;; +vnd.multiad.creator.cif;; +vnd.multiad.creator;; +vnd.music-niff;; +vnd.ncd.control;; +vnd.ncd.reference;; +vnd.netfpx;; +vnd.nintendo.nitro.rom;; +vnd.nokia.catalogs;; +vnd.nokia.conml+wbxml;; +vnd.nokia.conml+xml;; +vnd.nokia.iptv.config+xml;; +vnd.nokia.isds-radio-presets;; +vnd.nokia.landmark+wbxml;; +vnd.nokia.landmark+xml;; +vnd.nokia.landmarkcollection+xml;; +vnd.nokia.n-gage.ac+xml;; +vnd.nokia.ncd;; +vnd.nokia.pcd+wbxml;; +vnd.nokia.pcd+xml;; +vnd.ntt-local.content-share;; +vnd.ntt-local.file-transfer;; +vnd.ntt-local.ogw_remote-access;; +vnd.ntt-local.sip-ta_remote;; +vnd.ntt-local.sip-ta_tcp_stream;; +vnd.obn;; +vnd.oftn.l10n+json;; +vnd.oipf.contentaccessdownload+xml;; +vnd.oipf.contentaccessstreaming+xml;; +vnd.oipf.cspg-hexbinary;; +vnd.oipf.dae.svg+xml;; +vnd.oipf.dae.xhtml+xml;; +vnd.oipf.mippvcontrolmessage+xml;; +vnd.oipf.pae.gem;; +vnd.oipf.spdiscovery+xml;; +vnd.oipf.spdlist+xml;; +vnd.oipf.ueprofile+xml;; +vnd.oipf.userprofile+xml;; +vnd.oma-scws-config;; +vnd.oma-scws-http-request;; +vnd.oma-scws-http-response;; +vnd.oma.bcast.associated-procedure-parameter+xml;; +vnd.oma.bcast.drm-trigger+xml;; +vnd.oma.bcast.imd+xml;; +vnd.oma.bcast.ltkm;; +vnd.oma.bcast.notification+xml;; +vnd.oma.bcast.provisioningtrigger;; +vnd.oma.bcast.sgboot;; +vnd.oma.bcast.sgdd+xml;; +vnd.oma.bcast.sgdu;; +vnd.oma.bcast.simple-symbol-container;; +vnd.oma.bcast.smartcard-trigger+xml;; +vnd.oma.bcast.sprov+xml;; +vnd.oma.bcast.stkm;; +vnd.oma.cab-address-book+xml;; +vnd.oma.cab-feature-handler+xml;; +vnd.oma.cab-pcc+xml;; +vnd.oma.cab-subs-invite+xml;; +vnd.oma.cab-user-prefs+xml;; +vnd.oma.dcd;; +vnd.oma.dcdc;; +vnd.oma.drm.risd+xml;; +vnd.oma.group-usage-list+xml;; +vnd.oma.lwm2m+json;; +vnd.oma.lwm2m+tlv;; +vnd.oma.pal+xml;; +vnd.oma.poc.detailed-progress-report+xml;; +vnd.oma.poc.final-report+xml;; +vnd.oma.poc.groups+xml;; +vnd.oma.poc.invocation-descriptor+xml;; +vnd.oma.poc.optimized-progress-report+xml;; +vnd.oma.push;; +vnd.oma.scidm.messages+xml;; +vnd.oma.xcap-directory+xml;; +vnd.omads-email+xml;; +vnd.omads-file+xml;; +vnd.omads-folder+xml;; +vnd.omaloc-supl-init;; +vnd.onepager;; +vnd.openblox.game+xml;; +vnd.openblox.game-binary;; +vnd.openeye.oeb;; +vnd.openxmlformats-officedocument.custom-properties+xml;; +vnd.openxmlformats-officedocument.customxmlproperties+xml;; +vnd.openxmlformats-officedocument.drawing+xml;; +vnd.openxmlformats-officedocument.drawingml.chart+xml;; +vnd.openxmlformats-officedocument.drawingml.chartshapes+xml;; +vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml;; +vnd.openxmlformats-officedocument.drawingml.diagramdata+xml;; +vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml;; +vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml;; +vnd.openxmlformats-officedocument.extended-properties+xml;; +vnd.openxmlformats-officedocument.presentationml.commentauthors+xml;; +vnd.openxmlformats-officedocument.presentationml.comments+xml;; +vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml;; +vnd.openxmlformats-officedocument.presentationml.notesmaster+xml;; +vnd.openxmlformats-officedocument.presentationml.notesslide+xml;; +vnd.openxmlformats-officedocument.presentationml.presentation.main+xml;; +vnd.openxmlformats-officedocument.presentationml.presprops+xml;; +vnd.openxmlformats-officedocument.presentationml.slide+xml;; +vnd.openxmlformats-officedocument.presentationml.slidelayout+xml;; +vnd.openxmlformats-officedocument.presentationml.slidemaster+xml;; +vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml;; +vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml;; +vnd.openxmlformats-officedocument.presentationml.tablestyles+xml;; +vnd.openxmlformats-officedocument.presentationml.tags+xml;; +vnd.openxmlformats-officedocument.presentationml.template.main+xml;; +vnd.openxmlformats-officedocument.presentationml.viewprops+xml;; +vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml;; +vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml;; +vnd.openxmlformats-officedocument.spreadsheetml.comments+xml;; +vnd.openxmlformats-officedocument.spreadsheetml.connections+xml;; +vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml;; +vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml;; +vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml;; +vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml;; +vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml;; +vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml;; +vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml;; +vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml;; +vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml;; +vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml;; +vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml;; +vnd.openxmlformats-officedocument.spreadsheetml.styles+xml;; +vnd.openxmlformats-officedocument.spreadsheetml.table+xml;; +vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml;; +vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml;; +vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml;; +vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml;; +vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml;; +vnd.openxmlformats-officedocument.theme+xml;; +vnd.openxmlformats-officedocument.themeoverride+xml;; +vnd.openxmlformats-officedocument.vmldrawing;; +vnd.openxmlformats-officedocument.wordprocessingml.comments+xml;; +vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml;; +vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml;; +vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml;; +vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml;; +vnd.openxmlformats-officedocument.wordprocessingml.footer+xml;; +vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml;; +vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml;; +vnd.openxmlformats-officedocument.wordprocessingml.settings+xml;; +vnd.openxmlformats-officedocument.wordprocessingml.styles+xml;; +vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml;; +vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml;; +vnd.openxmlformats-package.core-properties+xml;; +vnd.openxmlformats-package.digital-signature-xmlsignature+xml;; +vnd.openxmlformats-package.relationships+xml;; +vnd.oracle.resource+json;; +vnd.orange.indata;; +vnd.osa.netdeploy;; +vnd.osgi.bundle;; +vnd.otps.ct-kip+xml;; +vnd.oxli.countgraph;; +vnd.pagerduty+json;; +vnd.panoply;; +vnd.paos.xml;; +vnd.pcos;; +vnd.piaccess.application-licence;; +vnd.poc.group-advertisement+xml;; +vnd.powerbuilder6-s;; +vnd.powerbuilder7-s;; +vnd.powerbuilder75-s;; +vnd.powerbuilder75;; +vnd.powerbuilder7;; +vnd.preminet;; +vnd.pwg-multiplexed;; +vnd.pwg-xhtml-print+xml;; +vnd.pwg-xmhtml-print+xml;; +vnd.qualcomm.brew-app-res;; +vnd.quarantainenet;; +vnd.quobject-quoxdocument;; +vnd.radisys.moml+xml;; +vnd.radisys.msml+xml;; +vnd.radisys.msml-audit+xml;; +vnd.radisys.msml-audit-conf+xml;; +vnd.radisys.msml-audit-conn+xml;; +vnd.radisys.msml-audit-dialog+xml;; +vnd.radisys.msml-audit-stream+xml;; +vnd.radisys.msml-conf+xml;; +vnd.radisys.msml-dialog+xml;; +vnd.radisys.msml-dialog-base+xml;; +vnd.radisys.msml-dialog-fax-detect+xml;; +vnd.radisys.msml-dialog-fax-sendrecv+xml;; +vnd.radisys.msml-dialog-group+xml;; +vnd.radisys.msml-dialog-speech+xml;; +vnd.radisys.msml-dialog-transform+xml;; +vnd.rainstor.data;; +vnd.rapid;; +vnd.rar;; +vnd.renlearn.rlprint;; +vnd.rs-274x;; +vnd.ruckus.download;; +vnd.s3sms;; +vnd.sbm.cid;; +vnd.sbm.mid2;; +vnd.scribus;; +vnd.sealed.3df;; +vnd.sealed.csf;; +vnd.sealed.net;; +vnd.sealed.tiff;; +vnd.siren+json;; +vnd.smart.notebook;; +vnd.software602.filler.form+xml;; +vnd.software602.filler.form-xml-zip;; +vnd.sss-cod;; +vnd.sss-dtf;; +vnd.sss-ntf;; +vnd.street-stream;; +vnd.sun.wadl+xml;; +vnd.swiftview-ics;; +vnd.syncml.dm.notification;; +vnd.syncml.dmddf+wbxml;; +vnd.syncml.dmddf+xml;; +vnd.syncml.dmtnds+wbxml;; +vnd.syncml.dmtnds+xml;; +vnd.syncml.ds.notification;; +vnd.tmd.mediaflex.api+xml;; +vnd.tml;; +vnd.truedoc;; +vnd.tve-trigger;; +vnd.ubisoft.webplayer;; +vnd.uplanet.alert-wbxml;; +vnd.uplanet.alert;; +vnd.uplanet.bearer-choice-wbxml;; +vnd.uplanet.bearer-choice;; +vnd.uplanet.cacheop-wbxml;; +vnd.uplanet.cacheop;; +vnd.uplanet.channel-wbxml;; +vnd.uplanet.channel;; +vnd.uplanet.list-wbxml;; +vnd.uplanet.list;; +vnd.uplanet.listcmd-wbxml;; +vnd.uplanet.listcmd;; +vnd.uplanet.signal;; +vnd.uri-map;; +vnd.valve.source.material;; +vnd.vd-study;; +vnd.vectorworks;; +vnd.vel+json;; +vnd.verimatrix.vcas;; +vnd.vividence.scriptfile;; +vnd.wfa.p2p;; +vnd.wfa.wsc;; +vnd.windows.devicepairing;; +vnd.wmc;; +vnd.wmf.bootstrap;; +vnd.wolfram.mathematica.package;; +vnd.wolfram.mathematica;; +vnd.wrq-hp3000-labelled;; +vnd.wv.csp+xml;;8bit +vnd.wv.ssp+xml;;8bit +vnd.xacml+json;; +vnd.xfdl.webform;; +vnd.xmi+xml;; +vnd.xmpie.cpkg;; +vnd.xmpie.dpkg;; +vnd.xmpie.plan;; +vnd.xmpie.ppkg;; +vnd.xmpie.xlim;; +vnd.yamaha.remote-setup;; +vnd.yamaha.through-ngn;; +vnd.yamaha.tunnel-udpencap;; +vnd.yaoweme;; +vq-rtcpxr;; +whoispp-query;; +whoispp-response;; +wita;; +x400-bp;; +xacml+xml;; +xcap-att+xml;; +xcap-caps+xml;; +xcap-el+xml;; +xcap-error+xml;; +xcap-ns+xml;; +xcon-conference-info+xml;; +xcon-conference-info-diff+xml;; +xhtml-voice+xml;; +xmpp+xml;; + +520:application:I:E +andrew-inset;ez; +atom+xml;atom;8bit +atomcat+xml;atomcat; +atomsvc+xml;atomsvc; +ccxml+xml;ccxml; +cdmi-capability;cdmia; +cdmi-container;cdmic; +cdmi-domain;cdmid; +cdmi-object;cdmio; +cdmi-queue;cdmiq; +commonground;dp; +dash+xml;mdp; +dicom;dcm; +dssc+der;dssc; +dssc+xml;xdssc; +ecmascript;es,ecma,js; +emma+xml;emma; +exi;exi; +font-tdpfr;pfr; +font-woff;woff; +gzip;gz; +hyperstudio;stk; +iges;iges,igs; +inkml+xml;ink,inkml; +ipfix;ipfix; +javascript;js,jsm;8bit +json-patch+json;json-patch; +json;json,map;8bit +ld+json;jsonld; +lost+xml;lostxml; +mac-binhex40;hqx;8bit +mads+xml;mads; +marc;mrc; +marcxml+xml;mrcx; +mathematica;nb,nbp,ma,mb; +mathml+xml;mathml,mml; +mbox;mbox; +mediaservercontrol+xml;mscml; +metalink4+xml;meta4; +mets+xml;mets; +mods+xml;mods; +mp21;m21,mp21; +mp4;mp4s,m4p; +msword;doc,dot,w6w,wiz,word; +mxf;mxf; +ocsp-request;orq; +ocsp-response;ors; +octet-stream;lrf,mar,dist,distz,bpk,dump,deploy,lhx,saveme,buffer;base64 +oda;oda; +ogg;ogx; +oxps;oxps,xps; +patch-ops-error+xml;xer; +pdf;pdf;base64 +pgp-encrypted;pgp,gpg,asc;7bit +pgp-keys;key,skr,pkr,asc,pgp,gpg;7bit +pgp-signature;sig,pgp,asc,gpg;base64 +pkcs10;p10; +pkcs7-mime;p7m,p7c; +pkcs7-signature;p7s; +pkcs8;p8; +pkix-attr-cert;ac; +pkix-cert;cer,crt; +pkix-crl;crl; +pkixcmp;pki; +pls+xml;pls; +postscript;ps-z,ps,ai,eps,epsi,epsf,eps2,eps3;base64 +prs.cww;cw,cww; +prs.nprend;rnd,rct; +pskc+xml;pskcxml; +rdf+xml;rdf,rdfs,owl;8bit +reginfo+xml;rif; +relax-ng-compact-syntax;rnc; +resource-lists+xml;rl; +resource-lists-diff+xml;rld; +rls-services+xml;rs; +rpki-ghostbusters;gbr; +rpki-manifest;mft; +rpki-roa;roa; +rtf;rtf,rtx;8bit +sbml+xml;sbml; +scvp-cv-request;scq; +scvp-cv-response;scs; +scvp-vp-request;spq; +scvp-vp-response;spp; +sdp;sdp; +set-payment-initiation;setpay; +set-registration-initiation;setreg; +sgml-open-catalog;soc; +shf+xml;shf; +sieve;siv; +smil+xml;smi,smil,sml,kino; +smil;smi,smil;8bit +sparql-query;rq; +sparql-results+xml;srx; +sql;sql; +srgs+xml;grxml; +srgs;gram; +sru+xml;sru; +ssml+xml;ssml; +tei+xml;tei,teicorpus; +thraud+xml;tfi; +timestamped-data;tsd; +vnd.3gpp.pic-bw-large;plb; +vnd.3gpp.pic-bw-small;psb; +vnd.3gpp.pic-bw-var;pvb; +vnd.3gpp.sms;sms; +vnd.3gpp2.tcap;tcap; +vnd.3m.post-it-notes;pwn; +vnd.accpac.simply.aso;aso; +vnd.accpac.simply.imp;imp; +vnd.acucobol;acu; +vnd.acucorp;atc,acutc;7bit +vnd.adobe.air-application-installer-package+zip;air; +vnd.adobe.flash.movie;swf,spl; +vnd.adobe.formscentral.fcdt;fcdt; +vnd.adobe.fxp;fxp,fxpl; +vnd.adobe.xdp+xml;xdp; +vnd.adobe.xfdf;xfdf; +vnd.ahead.space;ahead; +vnd.airzip.filesecure.azf;azf; +vnd.airzip.filesecure.azs;azs; +vnd.amazon.ebook;azw; +vnd.americandynamics.acc;acc; +vnd.amiga.ami;ami; +vnd.amiga.amu;ami; +vnd.android.package-archive;apk; +vnd.anser-web-certificate-issue-initiation;cii; +vnd.anser-web-funds-transfer-initiation;fti; +vnd.antix.game-component;atx; +vnd.apple.installer+xml;mpkg; +vnd.apple.mpegurl;m3u8,m3u; +vnd.arastra.swi;swi; +vnd.aristanetworks.swi;swi; +vnd.astraea-software.iota;iota; +vnd.audiograph;aep; +vnd.blueice.multipass;mpm; +vnd.bmi;bmi; +vnd.businessobjects;rep; +vnd.chemdraw+xml;cdxml; +vnd.chipnuts.karaoke-mmd;mmd; +vnd.cinderella;cdy; +vnd.claymore;cla; +vnd.cloanto.rp9;rp9; +vnd.clonk.c4group;c4g,c4d,c4f,c4p,c4u; +vnd.cluetrust.cartomobile-config-pkg;c11amz; +vnd.cluetrust.cartomobile-config;c11amc; +vnd.coffeescript;coffee; +vnd.commonspace;csp; +vnd.contact.cmsg;cdbcmsg; +vnd.corel-draw;cdr; +vnd.cosmocaller;cmc; +vnd.crick.clicker.keyboard;clkk; +vnd.crick.clicker.palette;clkp; +vnd.crick.clicker.template;clkt; +vnd.crick.clicker.wordbank;clkw; +vnd.crick.clicker;clkx; +vnd.criticaltools.wbs+xml;wbs; +vnd.ctc-posml;pml; +vnd.cups-ppd;ppd; +vnd.curl.car;car; +vnd.curl.pcurl;pcurl; +vnd.curl;curl; +vnd.dart;dart; +vnd.data-vision.rdz;rdz; +vnd.debian.binary-package;deb,udeb; +vnd.dece.data;uvf,uvvf,uvd,uvvd; +vnd.dece.ttml+xml;uvt,uvvt; +vnd.dece.unspecified;uvx,uvvx; +vnd.dece.zip;uvz,uvvz; +vnd.denovo.fcselayout-link;fe_launch; +vnd.dna;dna; +vnd.dolby.mlp;mlp; +vnd.dpgraph;dpg; +vnd.dreamfactory;dfac; +vnd.ds-keypoint;kpxx; +vnd.dvb.ait;ait; +vnd.dvb.service;svc; +vnd.dynageo;geo; +vnd.ecowin.chart;mag; +vnd.emusic-emusic_package;emp; +vnd.enliven;nml; +vnd.epson.esf;esf; +vnd.epson.msf;msf; +vnd.epson.quickanime;qam; +vnd.epson.salt;slt; +vnd.epson.ssf;ssf; +vnd.eszigno3+xml;es3,et3; +vnd.ezpix-album;ez2; +vnd.ezpix-package;ez3; +vnd.fdf;fdf; +vnd.fdsn.mseed;mseed; +vnd.fdsn.seed;seed,dataless; +vnd.flographit;gph; +vnd.fluxtime.clip;ftc; +vnd.framemaker;fm,frame,maker,book; +vnd.frogans.fnc;fnc; +vnd.frogans.ltf;ltf; +vnd.fsc.weblauch;fsc;7bit +vnd.fsc.weblaunch;fsc; +vnd.fujitsu.oasys2;oa2; +vnd.fujitsu.oasys3;oa3; +vnd.fujitsu.oasys;oas; +vnd.fujitsu.oasysgp;fg5; +vnd.fujitsu.oasysprs;bh2; +vnd.fujixerox.ddd;ddd; +vnd.fujixerox.docuworks.binder;xbd; +vnd.fujixerox.docuworks;xdw; +vnd.fuzzysheet;fzs; +vnd.genomatix.tuxedo;txd; +vnd.geogebra.file;ggb; +vnd.geogebra.tool;ggt; +vnd.geometry-explorer;gex,gre; +vnd.geonext;gxt; +vnd.geoplan;g2w; +vnd.geospace;g3w; +vnd.gmx;gmx; +vnd.google-earth.kml+xml;kml;8bit +vnd.google-earth.kmz;kmz;8bit +vnd.grafeq;gqf,gqs; +vnd.groove-account;gac; +vnd.groove-help;ghf; +vnd.groove-identity-message;gim; +vnd.groove-injector;grv; +vnd.groove-tool-message;gtm; +vnd.groove-tool-template;tpl; +vnd.groove-vcard;vcg; +vnd.hal+xml;hal; +vnd.handheld-entertainment+xml;zmm; +vnd.hbci;hbci,hbc,kom,upa,pkd,bpd; +vnd.hhe.lesson-player;les; +vnd.hp-hpgl;plt,hpgl,hgl,hpg; +vnd.hp-hpid;hpid; +vnd.hp-hps;hps; +vnd.hp-jlyt;jlt; +vnd.hp-pcl;pcl; +vnd.hp-pclxl;pclxl; +vnd.hydrostatix.sof-data;sfd-hdstx; +vnd.hzn-3d-crossword;x3d; +vnd.ibm.electronic-media;emm; +vnd.ibm.minipay;mpy; +vnd.ibm.modcap;afp,listafp,list3820; +vnd.ibm.rights-management;irm; +vnd.ibm.secure-container;sc; +vnd.iccprofile;icc,icm; +vnd.igloader;igl; +vnd.immervision-ivp;ivp; +vnd.immervision-ivu;ivu; +vnd.insors.igm;igm; +vnd.intercon.formnet;xpw,xpx; +vnd.intergeo;i2g; +vnd.intu.qbo;qbo; +vnd.intu.qfx;qfx; +vnd.ipunplugged.rcprofile;rcprofile; +vnd.irepository.package+xml;irp; +vnd.is-xpr;xpr; +vnd.isac.fcs;fcs; +vnd.jam;jam; +vnd.jcp.javame.midlet-rms;rms; +vnd.jisp;jisp; +vnd.joost.joda-archive;joda; +vnd.kahootz;ktz,ktr; +vnd.kde.karbon;karbon; +vnd.kde.kchart;chrt; +vnd.kde.kformula;kfo; +vnd.kde.kivio;flw; +vnd.kde.kontour;kon; +vnd.kde.kpresenter;kpr,kpt; +vnd.kde.kspread;ksp; +vnd.kde.kword;kwd,kwt; +vnd.kenameaapp;htke; +vnd.kenameapp;htke; +vnd.kidspiration;kia; +vnd.kinar;kne,knp; +vnd.koan;skp,skd,skt,skm; +vnd.kodak-descriptor;sse; +vnd.las.las+xml;lasxml; +vnd.llamagraphics.life-balance.desktop;lbd; +vnd.llamagraphics.life-balance.exchange+xml;lbe; +vnd.lotus-1-2-3;wks,123,wk1,wk3,wk4; +vnd.lotus-approach;apr; +vnd.lotus-freelance;pre; +vnd.lotus-notes;nsf; +vnd.lotus-organizer;org; +vnd.lotus-screencam;scm; +vnd.lotus-wordpro;lwp; +vnd.macports.portpkg;portpkg; +vnd.mcd;mcd; +vnd.medcalcdata;mc1; +vnd.mediastation.cdkey;cdkey; +vnd.mfer;mwf; +vnd.mfmp;mfm; +vnd.micrografx.flo;flo; +vnd.micrografx.igx;igx; +vnd.mif;mif; +vnd.mobius.daf;daf; +vnd.mobius.dis;dis; +vnd.mobius.mbk;mbk; +vnd.mobius.mqy;mqy; +vnd.mobius.msl;msl; +vnd.mobius.plc;plc; +vnd.mobius.txf;txf; +vnd.mophun.application;mpn; +vnd.mophun.certificate;mpc; +vnd.mozilla.xul+xml;xul; +vnd.ms-access;mdb; +vnd.ms-artgalry;cil; +vnd.ms-asf;asf; +vnd.ms-cab-compressed;cab; +vnd.ms-excel.addin.macroenabled.12;xlam; +vnd.ms-excel.sheet.binary.macroenabled.12;xlsb; +vnd.ms-excel.sheet.macroenabled.12;xlsm; +vnd.ms-excel.template.macroenabled.12;xltm; +vnd.ms-excel;xls,xlt,xlb,xla,xlm,xlc,xlw,xll,xld;base64 +vnd.ms-fontobject;eot; +vnd.ms-htmlhelp;chm; +vnd.ms-ims;ims; +vnd.ms-lrm;lrm; +vnd.ms-officetheme;thmx; +vnd.ms-pki.certstore;sst; +vnd.ms-pki.pko;pko; +vnd.ms-pki.seccat;cat; +vnd.ms-pki.stl;stl; +vnd.ms-powerpoint.addin.macroenabled.12;ppam; +vnd.ms-powerpoint.presentation.macroenabled.12;pptm; +vnd.ms-powerpoint.slide.macroenabled.12;sldm; +vnd.ms-powerpoint.slideshow.macroenabled.12;ppsm; +vnd.ms-powerpoint.template.macroenabled.12;potm; +vnd.ms-powerpoint;ppt,pps,pot,ppa,pwz,ppz;base64 +vnd.ms-project;mpp,mpt;base64 +vnd.ms-publisher;pub; +vnd.ms-tnef;tnef,tnf;base64 +vnd.ms-word.document.macroenabled.12;docm; +vnd.ms-word.template.macroenabled.12;dotm; +vnd.ms-works;wps,wks,wcm,wdb,xlr;base64 +vnd.ms-wpl;wpl;base64 +vnd.ms-xpsdocument;xps;8bit +vnd.mseq;mseq; +vnd.musician;mus; +vnd.muvee.style;msty; +vnd.mynfc;taglet; +vnd.nervana;ent,entity,req,request,bkm,kcm; +vnd.neurolanguage.nlu;nlu; +vnd.nintendo.snes.rom;sfc,smc; +vnd.nitf;ntf,nitf; +vnd.noblenet-directory;nnd; +vnd.noblenet-sealer;nns; +vnd.noblenet-web;nnw; +vnd.nokia.configuration-message;ncm; +vnd.nokia.n-gage.data;ngdat; +vnd.nokia.n-gage.symbian.install;n-gage; +vnd.nokia.radio-preset;rpst; +vnd.nokia.radio-presets;rpss; +vnd.nokia.ringing-tone;rng; +vnd.novadigm.edm;edm; +vnd.novadigm.edx;edx; +vnd.novadigm.ext;ext; +vnd.oasis.opendocument.chart-template;otc; +vnd.oasis.opendocument.chart;odc; +vnd.oasis.opendocument.database;odb; +vnd.oasis.opendocument.formula-template;odft,otf; +vnd.oasis.opendocument.formula;odf; +vnd.oasis.opendocument.graphics-flat-xml;fodg; +vnd.oasis.opendocument.graphics-template;otg; +vnd.oasis.opendocument.graphics;odg; +vnd.oasis.opendocument.image-template;oti; +vnd.oasis.opendocument.image;odi; +vnd.oasis.opendocument.presentation-flat-xml;fodp; +vnd.oasis.opendocument.presentation-template;otp; +vnd.oasis.opendocument.presentation;odp; +vnd.oasis.opendocument.spreadsheet-flat-xml;fods; +vnd.oasis.opendocument.spreadsheet-template;ots; +vnd.oasis.opendocument.spreadsheet;ods; +vnd.oasis.opendocument.text-flat-xml;fodt; +vnd.oasis.opendocument.text-master;odm,otm; +vnd.oasis.opendocument.text-template;ott; +vnd.oasis.opendocument.text-web;oth; +vnd.oasis.opendocument.text;odt; +vnd.olpc-sugar;xo; +vnd.oma.dd2+xml;dd2; +vnd.openofficeorg.extension;oxt; +vnd.openxmlformats-officedocument.presentationml.presentation;pptx;base64 +vnd.openxmlformats-officedocument.presentationml.slide;sldx; +vnd.openxmlformats-officedocument.presentationml.slideshow;ppsx;base64 +vnd.openxmlformats-officedocument.presentationml.template;potx;base64 +vnd.openxmlformats-officedocument.spreadsheetml.sheet;xlsx;base64 +vnd.openxmlformats-officedocument.spreadsheetml.template;xltx;base64 +vnd.openxmlformats-officedocument.wordprocessingml.document;docx;base64 +vnd.openxmlformats-officedocument.wordprocessingml.template;dotx;base64 +vnd.osgeo.mapguide.package;mgp; +vnd.osgi.dp;dp; +vnd.osgi.subsystem;esa; +vnd.palm;prc,pdb,pqa,oprc; +vnd.pawaafile;paw; +vnd.pg.format;str; +vnd.pg.osasli;ei6; +vnd.picsel;efif; +vnd.pmi.widget;wg; +vnd.pocketlearn;plf; +vnd.powerbuilder6;pbd; +vnd.previewsystems.box;box; +vnd.proteus.magazine;mgz; +vnd.publishare-delta-tree;qps; +vnd.pvi.ptid1;pti,ptid; +vnd.quark.quarkxpress;qxd,qxt,qwd,qwt,qxl,qxb;8bit +vnd.realvnc.bed;bed; +vnd.recordare.musicxml+xml;musicxml; +vnd.recordare.musicxml;mxl; +vnd.rig.cryptonote;cryptonote; +vnd.rim.cod;cod; +vnd.rn-realmedia-vbr;rmvb; +vnd.rn-realmedia;rm,rmj,rmm,rms,rmx,rmvb; +vnd.rn-realplayer;rnx; +vnd.route66.link66+xml;link66; +vnd.sailingtracker.track;st; +vnd.sealed.doc;sdoc,sdo,s1w; +vnd.sealed.eml;seml,sem; +vnd.sealed.mht;smht,smh; +vnd.sealed.ppt;sppt,spp,s1p; +vnd.sealed.xls;sxls,sxl,s1e; +vnd.sealedmedia.softseal.html;stml,stm,s1h; +vnd.sealedmedia.softseal.pdf;spdf,spd,s1a; +vnd.seemail;see; +vnd.sema;sema; +vnd.semd;semd; +vnd.semf;semf; +vnd.shana.informed.formdata;ifm; +vnd.shana.informed.formtemplate;itp; +vnd.shana.informed.interchange;iif; +vnd.shana.informed.package;ipk; +vnd.simtech-mindmapper;twd,twds; +vnd.smaf;mmf; +vnd.smart.teacher;teacher; +vnd.solent.sdkm+xml;sdkm,sdkd; +vnd.spotfire.dxp;dxp; +vnd.spotfire.sfs;sfs; +vnd.stardivision.calc;sdc; +vnd.stardivision.chart;sds; +vnd.stardivision.draw;sda; +vnd.stardivision.impress;sdd,sdp; +vnd.stardivision.mail;smd; +vnd.stardivision.math;sdf,smf; +vnd.stardivision.writer-global;sgl; +vnd.stardivision.writer;sdw,vor,sgl; +vnd.stepmania.package;smzip; +vnd.stepmania.stepchart;sm; +vnd.sun.xml.calc.template;stc; +vnd.sun.xml.calc;sxc; +vnd.sun.xml.draw.template;std; +vnd.sun.xml.draw;sxd; +vnd.sun.xml.impress.template;sti; +vnd.sun.xml.impress;sxi; +vnd.sun.xml.math;sxm; +vnd.sun.xml.writer.global;sxg; +vnd.sun.xml.writer.template;stw; +vnd.sun.xml.writer;sxw; +vnd.sus-calendar;sus,susp; +vnd.svd;svd; +vnd.symbian.install;sis,sisx; +vnd.syncml+xml;xsm; +vnd.syncml.dm+wbxml;bdm; +vnd.syncml.dm+xml;xdm; +vnd.tao.intent-module-archive;tao; +vnd.tcpdump.pcap;pcap,cap,dmp; +vnd.tmobile-livetv;tmo; +vnd.trid.tpt;tpt; +vnd.triscape.mxs;mxs; +vnd.trueapp;tra; +vnd.ufdl;ufd,ufdl; +vnd.uiq.theme;utz; +vnd.umajin;umj; +vnd.unity;unityweb; +vnd.uoml+xml;uoml; +vnd.vcx;vcx; +vnd.vidsoft.vidconference;vsc;8bit +vnd.visio;vsd,vst,vsw,vss; +vnd.visionary;vis; +vnd.vsf;vsf; +vnd.wap.sic;sic; +vnd.wap.slc;slc; +vnd.wap.wbxml;wbxml; +vnd.wap.wmlc;wmlc; +vnd.wap.wmlscriptc;wmlsc; +vnd.webturbo;wtb; +vnd.wolfram.player;nbp; +vnd.wordperfect5.1;wp5; +vnd.wordperfect;wpd,wp,wp4,wp5,wp6,wpp; +vnd.wqd;wqd; +vnd.wt.stf;stf; +vnd.wv.csp+wbxml;wv; +vnd.xara;xar,web; +vnd.xfdl;xfdl; +vnd.yamaha.hv-dic;hvd; +vnd.yamaha.hv-script;hvs; +vnd.yamaha.hv-voice;hvp; +vnd.yamaha.openscoreformat.osfpvg+xml;osfpvg; +vnd.yamaha.openscoreformat;osf; +vnd.yamaha.smaf-audio;saf; +vnd.yamaha.smaf-phrase;spf; +vnd.yellowriver-custom-menu;cmp; +vnd.zul;zir,zirz; +vnd.zzazz.deck+xml;zaz; +voicexml+xml;vxml; +watcherinfo+xml;wif; +widget;wgt; +wordperfect5.1;wp5,wp; +wsdl+xml;wsdl; +wspolicy+xml;wspolicy; +xcap-diff+xml;xdf; +xenc+xml;xenc; +xhtml+xml;xhtml,xht;8bit +xml-dtd;dtd;8bit +xml-external-parsed-entity;ent; +xml;xml,xsl,xsd,xpdl,xbl,rng;8bit +xop+xml;xop; +xslt+xml;xslt,xsl;8bit +xv+xml;mxml,xhvml,xvml,xvm; +yang;yang; +yin+xml;yin; +zip;zip;base64 +zlib;zz; + +18:audio:: +x-aptx;; +x-eac3;; +x-evrc1;; +x-evrcb0;; +x-evrcb1;; +x-evrcb;; +x-evrcwb0;; +x-evrcwb1;; +x-evrcwb;; +x-evs;; +x-example;; +x-g.722.1;; +x-g711-0;; +x-g7291;; +x-isac;; +x-opus;; +x-red;; +x-riff;; + +66:audio::E +x-aac;aac; +x-adpcm;adp,snd; +x-aifc;aifc,aiffc; +x-aiff;aif,aifc,aiff;base64 +x-amzxml;amz; +x-annodex;axa; +x-ape;ape; +x-au;au; +x-caf;caf; +x-flac+ogg;oga,ogg; +x-flac;flac; +x-gsm;gsm,gsd; +x-iriver-pla;pla; +x-it;it; +x-jam;jam; +x-liveaudio;lam; +x-m4b;m4b,f4b; +x-make.my.funk;pfunk; +x-make;funk,my,pfunk; +x-matroska;mka; +x-mid;mid,midi,rmi; +x-midi;mid,midi,kar,rmi;base64 +x-minipsf;minipsf; +x-mo3;mo3; +x-mod;mod,ult,uni,m15,mtm,669,med; +x-mp2;mp2; +x-mpeg-3;mp3; +x-mpeg3;mp3; +x-mpeg;mp2; +x-mpegurl;m3u,m3u8,vlc; +x-mpequrl;m3u; +x-ms-asx;asx,wax,wvx,wmx; +x-ms-wax;wax; +x-ms-wma;wma; +x-musepack;mpc,mpp,mp+; +x-nspaudio;la,lma; +x-opus+ogg;opus; +x-pn-realaudio-plugin;rpm,rmp,ra; +x-pn-realaudio;rm,ram,ra,rmm,rmp;base64 +x-psf;psf; +x-psflib;psflib; +x-psid;sid; +x-realaudio;ra;base64 +x-s3m;s3m; +x-scpls;pls; +x-sd2;sd2; +x-silk;sil; +x-speex+ogg;oga,ogg; +x-speex;spx; +x-stm;stm; +x-tsp-audio;tsi; +x-tsplayer;tsp; +x-tta;tta; +x-twinvq-plugin;vqe,vql; +x-twinvq;vqf; +x-vnd.audioexplosion.mjuicemediafile;mjf; +x-voc;voc; +x-vorbis+ogg;oga,ogg; +x-voxware;vox; +x-wav;wav;base64 +x-wavpack-correction;wvc; +x-wavpack;wv,wvp; +x-webm;weba;base64 +x-xi;xi; +x-xm;xm; +x-xmf;xmf; + +99:audio:I: +1d-interleaved-parityfec;; +32kadpcm;; +3gpp2;; +3gpp;; +amr-wb+;; +asc;; +atrac-advanced-lossless;; +atrac-x;; +atrac3;; +bv16;; +bv32;; +clearmode;; +cn;; +dat12;; +dls;; +dsr-es201108;; +dsr-es202050;; +dsr-es202211;; +dsr-es202212;; +dv;; +dvi4;; +encaprtp;; +evrc-qcp;; +evrc0;; +evrcnw0;; +evrcnw1;; +evrcnw;; +fwdred;; +g719;; +g7221;; +g722;; +g723;; +g726-16;; +g726-24;; +g726-32;; +g726-40;; +g728;; +g729;; +g729d;; +g729e;; +gsm-efr;; +gsm-hr-08;; +gsm;; +ilbc;; +ip-mr_v2.5;; +l20;; +l24;; +l8;; +lpc;; +mobile-xmf;; +mp4a-latm;; +mpa-robust;; +mpa;; +mpeg4-generic;; +parityfec;; +pcma-wb;; +pcma;; +pcmu-wb;; +pcmu;; +raptorfec;; +rtp-enc-aescm128;; +rtp-midi;; +rtploopback;; +rtx;; +smv-qcp;; +smv0;; +sp-midi;; +speex;; +t140c;; +t38;; +telephone-event;; +tone;; +uemclip;; +ulpfec;; +vdvi;; +vmr-wb;; +vnd.3gpp.iufp;; +vnd.4sb;; +vnd.celp;; +vnd.cisco.nse;; +vnd.cmles.radio-events;; +vnd.cns.anp1;; +vnd.cns.inf1;; +vnd.dlna.adts;; +vnd.dolby.heaac.1;; +vnd.dolby.heaac.2;; +vnd.dolby.mlp;; +vnd.dolby.mps;; +vnd.dolby.pl2;; +vnd.dolby.pl2x;; +vnd.dolby.pl2z;; +vnd.dolby.pulse.1;; +vnd.dvb.file;; +vnd.hns.audio;; +vnd.octel.sbc;; +vnd.rhetorex.32kadpcm;; +vnd.vmx.cvsd;; +vorbis-config;; +vorbis;; + +30:audio:I:E +ac3;ac3; +amr-wb;awb;base64 +amr;amr;base64 +basic;au,snd;base64 +evrc;evc; +l16;l16; +mp4;f4a,f4b,m4a,mp4a; +mpeg;mpga,mp2,mp3,mpega,m4a,mp2a,m2a,m3a,mpa,mpg;base64 +ogg;ogg,oga,spx,opus; +prs.sid;sid,psid; +qcelp;qcp; +smv;smv; +vnd.audiokoz;koz; +vnd.dece.audio;uva,uvva; +vnd.digital-winds;eol;7bit +vnd.dra;dra; +vnd.dts.hd;dtshd; +vnd.dts;dts; +vnd.everad.plj;plj; +vnd.lucent.voice;lvp; +vnd.ms-playready.media.pya;pya; +vnd.nokia.mobile-xmf;mxmf; +vnd.nortel.vbk;vbk; +vnd.nuera.ecelp4800;ecelp4800; +vnd.nuera.ecelp7470;ecelp7470; +vnd.nuera.ecelp9600;ecelp9600; +vnd.qcelp;qcp; +vnd.rip;rip; +vnd.rn-realaudio;ra,rax; +vnd.sealedmedia.softseal.mpeg;smp3,smp,s1m; + +12:image:: +x-bzeps;; +x-compressed-xcf;; +x-dcraw;; +x-dib;; +x-dicom-rle;; +x-dpx;; +x-example;; +x-fpx;; +x-gzeps;; +x-jls;; +x-tiff-multipage;; +x-xcursor;; + +84:image::E +x-3ds;3ds; +x-adobe-dng;dng; +x-applix-graphics;ag; +x-bmp;bmp,bm; +x-canon-cr2;cr2; +x-canon-crw;crw; +x-cmu-raster;ras,rast; +x-cmx;cmx; +x-coreldraw;cdr; +x-coreldrawpattern;pat; +x-coreldrawtemplate;cdt; +x-corelphotopaint;cpt; +x-dds;dds; +x-dwg;dwg,dxf,svf; +x-emf;emf; +x-eps;eps,epsi,epsf; +x-epson-erf;erf; +x-exr;exr; +x-fax-g3;g3; +x-fif;fif; +x-florian;flo,turbot; +x-freehand;fh,fhc,fh4,fh5,fh7; +x-fuji-raf;raf; +x-icns;icns; +x-icon;ico; +x-ilbm;iff,ilbm,lbm; +x-jg;art; +x-jng;jng; +x-jps;jps; +x-jutvision;jut; +x-kodak-dcr;dcr; +x-kodak-k25;k25; +x-kodak-kdc;kdc; +x-lwo;lwo,lwob; +x-lws;lws; +x-macpaint;pntg; +x-minolta-mrw;mrw; +x-mrsid-image;sid; +x-ms-bmp;bmp; +x-msod;msod; +x-niff;nif,niff; +x-nikon-nef;nef; +x-olympus-orf;orf; +x-openraster;ora; +x-panasonic-raw2;rw2; +x-panasonic-raw;raw; +x-pcx;pcx; +x-pentax-pef;pef; +x-photo-cd;pcd; +x-photoshop;psd; +x-pict;pic,pct,pict,pict1,pict2; +x-pjpeg;jfif,jpe,jpeg,jpg; +x-portable-anymap;pnm;base64 +x-portable-bitmap;pbm;base64 +x-portable-graymap;pgm;base64 +x-portable-greymap;pgm; +x-portable-pixmap;ppm;base64 +x-quicktime;qif,qti,qtif; +x-rgb;rgb;base64 +x-rle;rle; +x-sgi;sgi; +x-sigma-x3f;x3f; +x-skencil;sk,sk1; +x-sony-arw;arw; +x-sony-sr2;sr2; +x-sony-srf;srf; +x-sun-raster;sun; +x-svg+xml-compressed;svgz; +x-targa;tga; +x-tga;tga,icb,tpic,vda,vst; +x-tiff;tif,tiff; +x-vasa;mcf; +x-webp;webp; +x-win-bitmap;cur; +x-windows-bmp;bmp; +x-wmf;wmf; +x-xbitmap;xbm;7bit +x-xbm;xbm; +x-xcf;xcf; +x-xfig;fig; +x-xpixmap;xpm,pm;8bit +x-xpm;xpm; +x-xwd;xwd; +x-xwindowdump;xwd;base64 + +13:image:I: +prs.pti;; +pwg-raster;; +t38;; +tiff-fx;; +vnd.airzip.accelerator.azv;; +vnd.cns.inf2;; +vnd.globalgraphics.pgb;; +vnd.mix;; +vnd.mozilla.apng;; +vnd.radiance;; +vnd.svf;; +vnd.tencent.tap;; +vnd.valve.source.texture;; + +40:image:I:E +cgm;cgm; +fits;fits; +g3fax;g3; +gif;gif;base64 +ief;ief,iefs;base64 +jp2;jp2,jpg2,jpx,jpf;base64 +jpeg;jpeg,jpg,jpe,jfif,jfif-tbnl;base64 +jpm;jpm,jpgm; +jpx;jpf,jpx; +ktx;ktx; +naplps;nap,naplps; +png;png,x-png;base64 +prs.btif;btif; +svg+xml;svg,svgz;8bit +tiff;tiff,tif;base64 +vnd.adobe.photoshop;psd; +vnd.dece.graphic;uvi,uvvi,uvg,uvvg; +vnd.dgn;dgn; +vnd.djvu;djvu,djv; +vnd.dvb.subtitle;sub; +vnd.dwg;dwg,dxf,svf; +vnd.dxf;dxf; +vnd.fastbidsheet;fbs; +vnd.fpx;fpx; +vnd.fst;fst; +vnd.fujixerox.edmics-mmr;mmr; +vnd.fujixerox.edmics-rlc;rlc; +vnd.glocalgraphics.pgb;pgb; +vnd.microsoft.icon;ico; +vnd.ms-modi;mdi; +vnd.ms-photo;wdp; +vnd.net-fpx;npx,fpx; +vnd.rn-realflash;rf; +vnd.rn-realpix;rp; +vnd.sealed.png;spng,spn,s1n; +vnd.sealedmedia.softseal.gif;sgif,sgi,s1g; +vnd.sealedmedia.softseal.jpg;sjpg,sjp,s1j; +vnd.wap.wbmp;wbmp; +vnd.xiff;xif; +vnd.zbrush.pcx;pcx; + +2:message:: +x-example;; +x-gnu-rmail;; + +19:message:I: +cpim;; +delivery-status;; +disposition-notification;; +external-body;;8bit +feedback-report;; +global-delivery-status;; +global-disposition-notification;; +global-headers;; +global;; +http;; +imdn+xml;; +news;;8bit +partial;;8bit +s-http;; +sip;; +sipfrag;; +tracking-status;; +vnd.si.simp;; +vnd.wfa.wsc;; + +1:message:I:E +rfc822;eml,mime,mht,mhtml,nws;8bit + +4:model:: +x-example;; +x-gltf+json;; +x-x3d+fastinfoset;; +x-x3d-vrml;; + +3:model::E +x-pov;pov; +x-x3d+binary;x3db,x3dbz; +x-x3d+vrml;x3dv,x3dvz; + +7:model:I: +vnd.flatland.3dml;; +vnd.gs-gdl;; +vnd.gs.gdl;; +vnd.moml+xml;; +vnd.opengex;; +vnd.rosette.annotated-data-model;; +vnd.valve.source.compiled-map;; + +12:model:I:E +iges;igs,iges; +mesh;msh,mesh,silo; +vnd.collada+xml;dae; +vnd.dwf;dwf; +vnd.gdl;gdl; +vnd.gtw;gtw; +vnd.mts;mts; +vnd.parasolid.transmit.binary;x_b,xmt_bin; +vnd.parasolid.transmit.text;x_t,xmt_txt;quoted-printable +vnd.vtu;vtu; +vrml;wrl,vrml,wrz,vrm; +x3d+xml;x3d,x3dz; + +4:multipart:: +x-example;; +x-mixed-replace;; +x-tar;; +x-www-form-urlencoded;; + +3:multipart::E +x-gzip;gzip; +x-ustar;ustar; +x-zip;zip; + +13:multipart:I: +alternative;;8bit +appledouble;;8bit +byteranges;; +digest;;8bit +encrypted;; +form-data;; +header-set;; +mixed;;8bit +parallel;;8bit +related;; +report;; +signed;; +voice-message;; + +17:text:: +x-authors;; +x-changelog;; +x-comma-separated-values;;8bit +x-copying;; +x-credits;; +x-crontab;; +x-english;; +x-example;; +x-htmlh;; +x-install;; +x-jcr-cnd;; +x-meson;; +x-parameters;; +x-readme;; +x-scons;; +x-uri;; +x-xmcd;; + +125:text::E +x-adasrc;adb,ads; +x-asm;s,asm; +x-asp;asp; +x-audiosoft-intra;aip; +x-bibtex;bib; +x-boo;boo; +x-c++hdr;h++,hpp,hxx,hh,hp; +x-c++src;c++,cpp,cxx,cc,C; +x-c;c,cc,cxx,cpp,h,hh,dic; +x-cache-manifest;manifest,appcache; +x-chdr;h; +x-cmake;cmake; +x-cobol;cbl,cob; +x-component;htc;8bit +x-csh;csh; +x-csharp;cs; +x-csrc;c; +x-csv-schema;csvs; +x-dcl;dcl; +x-diff;diff,patch; +x-dsl;dsl; +x-dsrc;d,di; +x-eiffel;e,eif; +x-emacs-lisp;el; +x-erlang;erl; +x-event-stream;event-stream; +x-fortran;f,for,f77,f90,f95; +x-genie;gs; +x-gettext-translation-template;pot; +x-gettext-translation;po; +x-go;go; +x-google-video-pointer;gvp; +x-h323;323; +x-h;h,hh; +x-haskell;hs; +x-idl;idl; +x-imelody;imy,ime; +x-iptables;iptables; +x-iuls;uls; +x-java-source;java,jav; +x-java;java; +x-la-asf;lsx; +x-ldif;ldif; +x-lilypond;ly; +x-literate-haskell;lhs; +x-log;log; +x-lua;lua; +x-m;m; +x-makefile;mk,mak; +x-markdown;markdown,md,mkd; +x-mathml;mml; +x-matlab;m; +x-mcf;mcf; +x-microdvd;sub; +x-moc;moc; +x-modelica;mo; +x-mof;mof; +x-mpsub;sub; +x-mrml;mrml,mrl; +x-ms-regedit;reg; +x-mup;mup,not; +x-nfo;nfo; +x-objcsrc;m; +x-ocaml;ml,mli; +x-ocl;ocl; +x-ooc;ooc; +x-opml+xml;opml; +x-opml;opml; +x-pascal;p,pas; +x-patch;diff,patch; +x-pcs-gcd;gcd; +x-python;py,pyx,wsgi; +x-qml;qml,qmltypes,qmlproject; +x-reject;rej; +x-rpm-spec;spec; +x-rust;rs; +x-scala;scala; +x-scheme;scm,ss; +x-scriplet;wsc; +x-script.csh;csh; +x-script.elisp;el; +x-script.guile;scm; +x-script.ksh;ksh; +x-script.lisp;lsp; +x-script.perl-module;pm; +x-script.perl;pl; +x-script.phyton;py; +x-script.rexx;rexx; +x-script.scheme;scm; +x-script.sh;sh; +x-script.tcl;tcl; +x-script.tcsh;tcsh; +x-script.zsh;zsh; +x-script;hlb; +x-scriptlet;sct,wsc; +x-server-parsed-html;shtml,ssi; +x-setext;etx; +x-sfv;sfv; +x-sgml;sgml,sgm;8bit +x-sh;sh; +x-speech;spc,talk; +x-spreadsheet;sylk,slk; +x-ssa;ssa,ass; +x-subviewer;sub; +x-svhdr;svh; +x-svsrc;sv; +x-tcl;tcl,tk; +x-tex;tex,ltx,sty,cls,dtx,ins,latex; +x-texinfo;texi,texinfo; +x-texmacs;tm,ts; +x-troff-me;me; +x-troff-mm;mm; +x-troff-ms;ms; +x-txt2tags;t2t; +x-uil;uil; +x-uuencode;uu,uue; +x-vala;vala,vapi; +x-vcalendar;vcs;8bit +x-vcard;vcf;8bit +x-verilog;v; +x-vhdl;vhd,vhdl; +x-vtt;vtt; +x-webviewhtml;htt; +x-xmi;xmi; +x-xslfo;fo,xslfo; + +32:text:I: +1d-interleaved-parityfec;; +directory;; +dns;; +encaprtp;; +enriched;; +fwdred;; +grammar-ref-list;; +mizar;; +parityfec;; +provenance-notation;; +prs.prop.logic;; +raptorfec;; +red;; +rfc822-headers;; +rtp-enc-aescm128;; +rtploopback;; +rtx;; +t140;; +ulpfec;; +vnd.a;; +vnd.debian.copyright;; +vnd.dmclientscript;; +vnd.esmertec.theme-descriptor;; +vnd.flatland.3dml;; +vnd.iptc.newsml;; +vnd.iptc.nitf;; +vnd.latex-z;; +vnd.motorola.reflex;; +vnd.ms-mediapackage;; +vnd.radisys.msml-basic-layout;; +vnd.si.uricatalogue;; +xml-external-parsed-entity;; + +38:text:I:E +calendar;ics,icz,ifb,vcs; +css;css;8bit +csv;csv;8bit +ecmascript;js; +html;html,htm,htmlx,shtml,htx,acgi,htmls;8bit +javascript;js; +n3;n3; +plain;txt,brf,conf,def,list,in,g,idc,lst,sdml,ini;8bit +prs.fallenstein.rst;rst; +prs.lines.tag;dsc; +richtext;rtx,rt,rtf;8bit +rtf;rtf;8bit +sgml;sgml,sgm; +tab-separated-values;tsv; +troff;t,tr,roff,man,me,ms; +turtle;ttl; +uri-list;uri,uris,urls,uni,unis; +vcard;vcard,vcf,vct,gcrd; +vnd.abc;abc; +vnd.curl.dcurl;dcurl; +vnd.curl.mcurl;mcurl; +vnd.curl.scurl;scurl; +vnd.curl;curl; +vnd.dvb.subtitle;sub; +vnd.fly;fly; +vnd.fmi.flexstor;flx; +vnd.graphviz;gv,dot; +vnd.in3d.3dml;3dml; +vnd.in3d.spot;spot; +vnd.net2phone.commcenter.command;ccc; +vnd.rn-realtext;rt; +vnd.sun.j2me.app-descriptor;jad;8bit +vnd.trolltech.linguist;ts; +vnd.wap.si;si; +vnd.wap.sl;sl; +vnd.wap.wml;wml; +vnd.wap.wmlscript;wmls; +xml;xml; + +7:video:: +x-anim;; +x-example;; +x-h265;; +x-isivideo;; +x-iso.segment;; +x-vp8;; +x-wavelet;; + +44:video::E +x-amt-demorun;xdr; +x-amt-showrun;xsr; +x-animaflex;afl; +x-annodex;axv; +x-atomic3d-feature;fmf; +x-avi;avi; +x-avs-video;avs; +x-dl;dl;base64 +x-dv;dif,dv; +x-f4v;f4v; +x-fli;fli;base64 +x-flic;fli,flc; +x-flv;flv;base64 +x-gl;gl;base64 +x-isvideo;isu; +x-javafx;fxm; +x-jpm;jpm,jpgm; +x-la-asf;lsf,lsx; +x-m4v;m4v; +x-matroska-3d;mk3d; +x-matroska;mpv,mkv,mk3d,mks; +x-mng;mng; +x-motion-jpeg;mjpg; +x-mpeg;mp2,mp3; +x-mpeq2a;mp2; +x-ms-asf-plugin;asx; +x-ms-asf;asf,asx; +x-ms-vob;vob; +x-ms-wm;wm; +x-ms-wmv;wmv; +x-ms-wmx;wmx; +x-ms-wvx;wvx; +x-msvideo;avi,avf,divx;base64 +x-nsv;nsv; +x-ogm+ogg;ogm; +x-qtc;qtc; +x-scm;scm; +x-sgi-movie;movie,mv;base64 +x-smv;smv; +x-theora+ogg;ogg; +x-vdo;vdo; +x-vivo;viv,vivo; +x-vosaic;vos; +x-webm;webm;base64 + +45:video:I: +1d-interleaved-parityfec;; +3gpp-tt;; +bmpeg;; +bt656;; +celb;; +encaprtp;; +h263-1998;; +h263-2000;; +h264-rcdo;; +h264-svc;; +jpeg2000;; +mp1s;; +mp2p;; +mp4v-es;; +mpeg4-generic;; +mpv;; +nv;; +parityfec;; +pointer;; +raptorfec;; +raw;; +rtp-enc-aescm128;; +rtploopback;; +rtx;; +smpte292m;; +ulpfec;; +vc1;; +vnd.cctv;; +vnd.dece.mp4;; +vnd.directv.mpeg-tts;; +vnd.directv.mpeg;; +vnd.dlna.mpeg-tts;; +vnd.hns.video;; +vnd.iptvforum.1dparityfec-1010;; +vnd.iptvforum.1dparityfec-2005;; +vnd.iptvforum.2dparityfec-1010;; +vnd.iptvforum.2dparityfec-2005;; +vnd.iptvforum.ttsavc;; +vnd.iptvforum.ttsmpeg2;; +vnd.motorola.video;; +vnd.motorola.videop;; +vnd.mts;; +vnd.nokia.videovoip;; +vnd.radgamettools.bink;; +vnd.radgamettools.smacker;; + +31:video:I:E +3gpp2;3g2,3gpp2,3gp2;base64 +3gpp;3gp,3gpp,3ga;base64 +dv;dif,dv; +h261;h261; +h263;h263; +h264;h264; +jpeg;jpgv; +mj2;mj2,mjp2; +mp2t;ts,m2t,m2ts,mts,cpi,clpi,mpl,mpls,bdm,bdmv; +mp4;mp4,f4v,f4p,mp4v,mpg4,m4v,lrv; +mpeg;mp2,mpe,mpeg,mpg,m1v,m2v,mp3,mpa,vob;base64 +ogg;ogv,ogg; +quicktime;qt,mov,moov,qtvr;base64 +vnd.dece.hd;uvh,uvvh; +vnd.dece.mobile;uvm,uvvm; +vnd.dece.pd;uvp,uvvp; +vnd.dece.sd;uvs,uvvs; +vnd.dece.video;uvv,uvvv; +vnd.dvb.file;dvb; +vnd.fvt;fvt; +vnd.mpegurl;mxu,m4u,m1u;8bit +vnd.ms-playready.media.pyv;pyv; +vnd.nokia.interleaved-multimedia;nim; +vnd.objectvideo;mp4; +vnd.rn-realvideo;rv,rvx; +vnd.sealed.mpeg1;s11; +vnd.sealed.mpeg4;smpg,s14; +vnd.sealed.swf;sswf,ssw; +vnd.sealedmedia.softseal.mov;smov,smo,s1q; +vnd.uvvu.mp4;uvu,uvvu; +vnd.vivo;viv,vivo; + +54:x-chemical::E +x-alchemy;alc; +x-cache-csf;csf; +x-cache;cac,cache; +x-cactvs-binary;cbin,cascii,ctab; +x-cdx;cdx; +x-cerius;cer; +x-chem3d;c3d; +x-chemdraw;chm; +x-cif;cif; +x-cmdf;cmdf; +x-cml;cml; +x-compass;cpa; +x-crossfire;bsd; +x-csml;csml,csm; +x-ctx;ctx; +x-cxf;cxf,cef; +x-embl-dl-nucleotide;emb,embl; +x-galactic-spc;spc; +x-gamess-input;inp,gam,gamin; +x-gaussian-checkpoint;fch,fchk; +x-gaussian-cube;cub; +x-gaussian-input;gau,gjc,gjf; +x-gaussian-log;gal; +x-gcg8-sequence;gcg; +x-genbank;gen; +x-hin;hin; +x-isostar;istr,ist; +x-jcamp-dx;jdx,dx; +x-kinemage;kin; +x-macmolecule;mcm; +x-macromodel-input;mmd,mmod; +x-mdl-molfile;mol; +x-mdl-rdfile;rd; +x-mdl-rxnfile;rxn; +x-mdl-sdfile;sd,sdf; +x-mdl-tgf;tgf; +x-mmcif;mcif; +x-mol2;mol2; +x-molconn-z;b; +x-mopac-graph;gpt; +x-mopac-input;mop,mopcrt,mpc,zmt; +x-mopac-out;moo; +x-mopac-vib;mvb; +x-ncbi-asn1-ascii;prt,ent; +x-ncbi-asn1-binary;val,aso; +x-ncbi-asn1-spec;asn; +x-ncbi-asn1;asn; +x-pdb;pdb,ent,xyz; +x-rosdal;ros; +x-swissprot;sw; +x-vamas-iso14976;vms; +x-vmd;vmd; +x-xtel;xtel; +x-xyz;xyz; + +1:x-conference::E +x-cooltalk;ice; + +18:x-content:: +x-audio-cdda;; +x-audio-dvd;; +x-audio-player;; +x-blank-bd;; +x-blank-cd;; +x-blank-dvd;; +x-blank-hddvd;; +x-ebook-reader;; +x-image-dcf;; +x-image-picturecd;; +x-software;; +x-unix-software;; +x-video-bluray;; +x-video-dvd;; +x-video-hddvd;; +x-video-svcd;; +x-video-vcd;; +x-win32-software;; + +1:x-drawing::E +x-dwf;dwf; + +1:x-epoc::E +x-sisx-app;sisx; + +1:x-font:: +x-sfnt;; + +6:x-font::E +x-collection;ttc; +x-opentype;otf; +x-otf;otf; +x-ttf;ttf; +x-woff2;woff2; +x-woff;woff; + +1:x-i-world::E +x-i-vrml;ivr; + +8:x-inode:: +x-blockdevice;; +x-chardevice;; +x-directory-locked;; +x-directory;; +x-fifo;; +x-mount-point;; +x-socket;; +x-symlink;; + +3:x-music::E +x-crescendo;mid,midi; +x-karaoke;kar; +x-midi;mid,midi; + +1:x-paleovu::E +x-pv;pvu; + +1:x-windows::E +x-metafile;wmf; + +4:x-world::E +x-3dmf;3dm,3dmf,qd3,qd3d; +x-svr;svr; +x-vrml;wrl,vrml,vrm,wrz; +x-vrt;vrt; + +1:x-www::E +x-mime;mime; + +2:x-xgl::E +x-drawing;xgz; +x-movie;xmz; + diff --git a/cpan/lib/MojoX/MIME/Types.pm b/cpan/lib/MojoX/MIME/Types.pm new file mode 100644 index 00000000..9542036f --- /dev/null +++ b/cpan/lib/MojoX/MIME/Types.pm @@ -0,0 +1,60 @@ +# Copyrights 1999,2001-2017 by [Mark Overmeer]. +# For other contributors see ChangeLog. +# See the manual pages for details on the licensing terms. +# Pod stripped from pm file by OODoc 2.02. +package MojoX::MIME::Types; +use vars '$VERSION'; +$VERSION = '2.14'; + +use Mojo::Base -base; + +use MIME::Types (); + + +sub new(%) +{ # base new() constructor incorrect: should call init() + my $self = shift->SUPER::new(@_); + $self->{MMT_mt} = delete $self->{mime_types} || MIME::Types->new; + $self; +} + +#---------- + +sub mimeTypes() { shift->{MMT_mt} } + + +sub types(;$) +{ my $self = shift; + return $self->{MMT_ext} if $self->{MMT_ext}; + + my %exttable; + my $t = MIME::Types->_MojoExtTable; + while(my ($ext, $type) = each %$t) { $exttable{$ext} = [$type] } + $self->{MMT_ext} = \%exttable; +} + +#---------- + +sub detect($$;$) +{ my ($self, $accept, $prio) = @_; + my $mt = $self->mimeTypes; + my @ext = map $_->extensions, grep defined, map $mt->type($_), + grep !/\*/, $mt->httpAccept($accept); + \@ext; +} + + +sub type($;$) +{ my ($self, $ext, $types) = @_; + + my $mt = $self->mimeTypes; + defined $types + or return $mt->mimeTypeOf($ext); + + # stupid interface compatibility! + $self; +} + +#--------------- + +1; diff --git a/cpan/lib/MojoX/MIME/Types.pod b/cpan/lib/MojoX/MIME/Types.pod new file mode 100644 index 00000000..bd266fcd --- /dev/null +++ b/cpan/lib/MojoX/MIME/Types.pod @@ -0,0 +1,215 @@ +=encoding utf8 + +=head1 NAME + +MojoX::MIME::Types - MIME Types for Mojolicious + +=head1 INHERITANCE + + MojoX::MIME::Types + is a Mojo::Base + +=head1 SYNOPSIS + + use MojoX::MIME::Types; + + # set in Mojolicious as default + $app->types(MojoX::MIME::Types->new); + app->types(MojoX::MIME::Types->new); # ::Lite + + # basic interface translated into pure MIME::Types + $types->type(foo => 'text/foo'); + say $types->type('foo'); + +=head1 DESCRIPTION + +[Added to MIME::Types 2.07] +This module is a drop-in replacement for Mojolicious::Types, but +with a more correct handling plus a complete list of types... a huge +list of types. + +Some methods ignore information they receive: those parameters are +accepted for compatibility with the Mojolicious::Types interface, +but should not contain useful information. + +Read the L</DETAILS> below, about how to connect this module into +Mojolicious and the differences you get. + +=head1 METHODS + +=head2 Constructors + +=over 4 + +=item MojoX::MIME::Types-E<gt>B<new>(%options) + +Create the 'type' handler for Mojolicious. When you do not specify your +own MIME::Type object ($mime_type), it will be instantanted for you. +You create one yourself when you would like to pass some parameter to +the object constructor. + + -Option --Default + mime_types <created internally> + types undef + +=over 2 + +=item mime_types => MIME::Types-object + +Pass your own prepared L<MIME::Types|MIME::Types> object, when you need some +instantiation parameters different from the defaults. + +=item types => HASH + +Ignored. + +=back + +example: + + $app->types(MojoX::MIME::Types->new); + + # when you need to pass options to MIME::Types->new + my $mt = MIME::Types->new(%opts); + my $types = MojoX::MIME::Types->new(mime_types => $mt); + $app->types($types); + +=back + +=head2 Attributes + +=over 4 + +=item $obj-E<gt>B<mimeTypes>() + +Returns the internal mime types object. + +=item $obj-E<gt>B<types>( [\%table] ) + +In Mojolicious::Types, this attribute exposes the internal +administration of types, offering to change it with using a clean +abstract interface. That interface mistake bites now we have more +complex internals. + +B<Avoid this method!> The returned HASH is expensive to construct, +changes passed via C<%table> are ignored: L<MIME::Types|MIME::Types> is very complete! + +=back + +=head2 Actions + +=over 4 + +=item $obj-E<gt>B<detect>( $accept, [$prio] ) + +Returns a list of filename extensions. The $accept header in HTTP can +contain multiple types, with a priority indication ('q' attributes). +The returned list contains a list with extensions, the extensions related +to the highest priority type first. The C<$prio>-flag is ignored. +See L<MIME::Types::httpAccept()|MIME::Types/"HTTP support">. + +This detect() function is not the correct approach for the Accept header: +the "Accept" may contain wildcards ('*') in types for globbing, which +does not produce extensions. Better use L<MIME::Types::httpAcceptBest()|MIME::Types/"HTTP support"> +or L<MIME::Types::httpAcceptSelect()|MIME::Types/"HTTP support">. + +example: + + my $exts = $types->detect('application/json;q=9'); + my $exts = $types->detect('text/html, application/json;q=9'); + +=item $obj-E<gt>B<type>( $ext, [$type|\@types] ) + +Returns the first type name for an extension $ext, unless you specify +type names. + +When a single $type or an ARRAY of @types are specified, the C<$self> +object is returned. Nothing is done with the provided info. + +=back + +=head1 DETAILS + +=head2 Why? + +The Mojolicious::Types module has only very little knowledge about +what is really needed to treat types correctly, and only contains a tiny +list of extensions. L<MIME::Types|MIME::Types> tries to follow the standards +very closely and contains all types found in various lists on internet. + +=head2 How to use with Mojolicious + +Start your Mojo application like this: + + package MyApp; + use Mojo::Base 'Mojolicious'; + + sub startup { + my $self = shift; + ... + $self->types(MojoX::MIME::Types->new); + } + +If you have special options for L<MIME::Types::new()|MIME::Types/"Constructors">, then create +your own MIME::Types object first: + + my $mt = MIME::Types->new(%opts); + my $types = MojoX::MIME::Types->new(mime_types => $mt); + $self->types($types); + +In any case, you can reach the smart L<MIME::Types|MIME::Types> object later as + + my $mt = $app->types->mimeTypes; + my $mime = $mt->mimeTypeOf($filename); + +=head2 How to use with Mojolicious::Lite + +The use in Mojolicious::Lite applications is only slightly different +from above: + + app->types(MojoX::MIME::Types->new); + my $types = app->types; + +=head2 Differences with Mojolicious::Types + +There are a few major difference with Mojolicious::Types: + +=over 4 + +=item * + +the tables maintained by L<MIME::Types|MIME::Types> are complete. So: there shouldn't +be a need to add your own types, not via L<types()|MojoX::MIME::Types/"Attributes">, not via L<type()|MojoX::MIME::Types/"Actions">. +All attempts to add types are ignored; better remove them from your code. + +=item * + +This plugin understands the experimental flag 'x-' in types and handles +casing issues. + +=item * + +Updates to the internal hash via types() are simply ignored, because it +is expensive to implement (and won't add something new). + +=item * + +The L<detect()|MojoX::MIME::Types/"Actions"> is implemented in a compatible way, but does not understand +wildcards ('*'). You should use L<MIME::Types::httpAcceptBest()|MIME::Types/"HTTP support"> or +L<MIME::Types::httpAcceptSelect()|MIME::Types/"HTTP support"> to replace this broken function. + +=back + +=head1 SEE ALSO + +This module is part of MIME-Types distribution version 2.14, +built on November 08, 2017. Website: F<http://perl.overmeer.net/mimetypes/> + +=head1 LICENSE + +Copyrights 1999,2001-2017 by [Mark Overmeer]. For other contributors see ChangeLog. + +This program is free software; you can redistribute it and/or modify it +under the Artistic license. +See F<http://dev.perl.org/licenses/artistic.html> + |
