fix for failing fork.t#12 on windows (win32_execvp() tweak in
[p5sagit/p5-mst-13.2.git] / lib / open.pm
CommitLineData
d1edabcf 1package open;
ac27b0f5 2use Carp;
16fe6d59 3$open::hint_bits = 0x20000;
4
0c4f7ff0 5our $VERSION = '1.01';
b75c8c73 6
58d53262 7my $locale_encoding;
8
9sub in_locale { $^H & $locale::hint_bits }
10
11sub _get_locale_encoding {
12 unless (defined $locale_encoding) {
ba6ce41c 13 eval {
14 # I18N::Langinfo isn't available everywhere
15 require I18N::Langinfo;
16 I18N::Langinfo->import('langinfo', 'CODESET');
17 };
58d53262 18 unless ($@) {
ba6ce41c 19 $locale_encoding = langinfo(CODESET());
58d53262 20 }
11fc5dc3 21 my $country_language;
58d53262 22 if (not $locale_encoding && in_locale()) {
11fc5dc3 23 if ($ENV{LC_ALL} =~ /^([^.]+)\.([^.]+)$/) {
24 ($country_language, $locale_encoding) = ($1, $2);
25 } elsif ($ENV{LANG} =~ /^([^.]+)\.([^.]+)$/) {
26 ($country_language, $locale_encoding) = ($1, $2);
58d53262 27 }
28 } else {
29 # Could do heuristics based on the country and language
30 # parts of LC_ALL and LANG (the parts before the dot (if any)),
31 # since we have Locale::Country and Locale::Language available.
32 # TODO: get a database of Language -> Encoding mappings
33 # (the Estonian database would be excellent!)
34 # --jhi
35 }
11fc5dc3 36 if (defined $locale_encoding &&
37 $locale_encoding eq 'euc' &&
38 defined $country_language) {
56fb2e42 39 if ($country_language =~ /^ja_JP|japan(?:ese)?$/i) {
11fc5dc3 40 $locale_encoding = 'eucjp';
5a192dee 41 } elsif ($country_language =~ /^ko_KR|korean?$/i) {
11fc5dc3 42 $locale_encoding = 'euckr';
56fb2e42 43 } elsif ($country_language =~ /^zh_TW|taiwan(?:ese)?$/i) {
11fc5dc3 44 $locale_encoding = 'euctw';
45 }
46 croak "Locale encoding 'euc' too ambiguous"
47 if $locale_encoding eq 'euc';
48 }
58d53262 49 }
50}
51
16fe6d59 52sub import {
dfebf958 53 my ($class,@args) = @_;
54 croak("`use open' needs explicit list of disciplines") unless @args;
16fe6d59 55 $^H |= $open::hint_bits;
ba6ce41c 56 my ($in,$out) = split(/\0/,(${^OPEN} || "\0"), -1);
dfebf958 57 while (@args) {
58 my $type = shift(@args);
59 my $discp = shift(@args);
ac27b0f5 60 my @val;
dfebf958 61 foreach my $layer (split(/\s+/,$discp)) {
62 $layer =~ s/^://;
58d53262 63 if ($layer eq 'locale') {
64 use Encode;
65 _get_locale_encoding()
66 unless defined $locale_encoding;
67 croak "Cannot figure out an encoding to use"
68 unless defined $locale_encoding;
11fc5dc3 69 if ($locale_encoding =~ /^utf-?8$/i) {
70 $layer = "utf8";
71 } else {
f38d7863 72 $layer = "encoding";
11fc5dc3 73 }
58d53262 74 }
0c4f7ff0 75 unless(PerlIO::Layer::->find($layer)) {
dfebf958 76 carp("Unknown discipline layer '$layer'");
ac27b0f5 77 }
f38d7863 78 if (defined $locale_encoding) {
79 $layer = "$layer($locale_encoding)";
80 }
ac27b0f5 81 push(@val,":$layer");
82 if ($layer =~ /^(crlf|raw)$/) {
83 $^H{"open_$type"} = $layer;
16fe6d59 84 }
ac27b0f5 85 }
86 if ($type eq 'IN') {
87 $in = join(' ',@val);
88 }
89 elsif ($type eq 'OUT') {
90 $out = join(' ',@val);
16fe6d59 91 }
f3b00462 92 elsif ($type eq 'INOUT') {
93 $in = $out = join(' ',@val);
94 }
16fe6d59 95 else {
ac27b0f5 96 croak "Unknown discipline class '$type'";
16fe6d59 97 }
98 }
ac27b0f5 99 ${^OPEN} = join('\0',$in,$out);
16fe6d59 100}
101
1021;
103__END__
d1edabcf 104
105=head1 NAME
106
107open - perl pragma to set default disciplines for input and output
108
109=head1 SYNOPSIS
110
16fe6d59 111 use open IN => ":crlf", OUT => ":raw";
f3b00462 112 use open INOUT => ":utf8";
d1edabcf 113
114=head1 DESCRIPTION
115
d151aa0e 116Full-fledged support for I/O disciplines is now implemented provided
117Perl is configured to use PerlIO as its IO system (which is now the
118default).
16fe6d59 119
7d3b96bb 120The C<open> pragma serves as one of the interfaces to declare default
121"layers" (aka disciplines) for all I/O.
122
123The C<open> pragma is used to declare one or more default layers for
d151aa0e 124I/O operations. Any open(), readpipe() (aka qx//) and similar
125operators found within the lexical scope of this pragma will use the
126declared defaults.
7d3b96bb 127
d151aa0e 128When open() is given an explicit list of layers they are appended to
129the list declared using this pragma.
7d3b96bb 130
131Directory handles may also support disciplines in future.
132
133=head1 NONPERLIO FUNCTIONALITY
134
d151aa0e 135If Perl is not built to use PerlIO as its IO system then only the two
136pseudo-disciplines ":raw" and ":crlf" are available.
16fe6d59 137
138The ":raw" discipline corresponds to "binary mode" and the ":crlf"
139discipline corresponds to "text mode" on platforms that distinguish
140between the two modes when opening files (which is many DOS-like
d151aa0e 141platforms, including Windows). These two disciplines are no-ops on
142platforms where binmode() is a no-op, but perform their functions
143everywhere if PerlIO is enabled.
7d3b96bb 144
145=head1 IMPLEMENTATION DETAILS
d1edabcf 146
f3b00462 147There is a class method in C<PerlIO::Layer> C<find> which is
148implemented as XS code. It is called by C<import> to validate the
149layers:
0c4f7ff0 150
151 PerlIO::Layer::->find("perlio")
152
f3b00462 153The return value (if defined) is a Perl object, of class
154C<PerlIO::Layer> which is created by the C code in F<perlio.c>. As
155yet there is nothing useful you can do with the object at the perl
156level.
16fe6d59 157
d1edabcf 158=head1 SEE ALSO
159
7d3b96bb 160L<perlfunc/"binmode">, L<perlfunc/"open">, L<perlunicode>, L<PerlIO>
d1edabcf 161
162=cut