Change the semantics of S_isa_lookup
[p5sagit/p5-mst-13.2.git] / ext / Encode / bin / piconv
CommitLineData
3ef515df 1#!./perl
8f1ed24a 2# $Id: piconv,v 2.1 2004/10/06 05:07:20 dankogai Exp $
67d7b5ef 3#
9160fdbd 4use 5.8.0;
67d7b5ef 5use strict;
6use Encode ;
7use Encode::Alias;
8my %Scheme = map {$_ => 1} qw(from_to decode_encode perlio);
9
bedba681 10use File::Basename;
11my $name = basename($0);
12
c14d784c 13use Getopt::Long qw(:config no_ignore_case);
bedba681 14
15my %Opt;
16
17help()
18 unless
19 GetOptions(\%Opt,
20 'from|f=s',
21 'to|t=s',
22 'list|l',
23 'string|s=s',
24 'check|C=i',
25 'c',
26 'perlqq|p',
27 'debug|D',
28 'scheme|S=s',
29 'resolve|r=s',
30 'help',
31 );
32
33$Opt{help} and help();
34$Opt{list} and list_encodings();
67d7b5ef 35my $locale = $ENV{LC_CTYPE} || $ENV{LC_ALL} || $ENV{LANG};
bedba681 36defined $Opt{resolve} and resolve_encoding($Opt{resolve});
37$Opt{from} || $Opt{to} || help();
38my $from = $Opt{from} || $locale or help("from_encoding unspecified");
39my $to = $Opt{to} || $locale or help("to_encoding unspecified");
40$Opt{string} and Encode::from_to($Opt{string}, $from, $to) and print $Opt{string} and exit;
41my $scheme = exists $Scheme{$Opt{Scheme}} ? $Opt{Scheme} : 'from_to';
42$Opt{check} ||= $Opt{c};
a3be20bf 43$Opt{perlqq} and $Opt{check} = Encode::FB_PERLQQ;
bedba681 44
45if ($Opt{debug}){
67d7b5ef 46 my $cfrom = Encode->getEncoding($from)->name;
47 my $cto = Encode->getEncoding($to)->name;
ce912cd4 48 print <<"EOT";
67d7b5ef 49Scheme: $scheme
50From: $from => $cfrom
51To: $to => $cto
52EOT
53}
54
8f1ed24a 55# we do not use <> (or ARGV) for the sake of binmode()
56@ARGV or push @ARGV, \*STDIN;
57
58unless ($scheme eq 'perlio'){
59 binmode STDOUT;
60 for my $argv (@ARGV){
61 my $ifh = ref $argv ? $argv : undef;
62 $ifh or open $ifh, "<", $argv or next;
63 binmode $ifh;
64 if ($scheme eq 'from_to'){ # default
65 while(<$ifh>){
66 Encode::from_to($_, $from, $to, $Opt{check});
67 print;
68 }
69 }elsif ($scheme eq 'decode_encode'){ # step-by-step
70 while(<$ifh>){
71 my $decoded = decode($from, $_, $Opt{check});
72 my $encoded = encode($to, $decoded);
73 print $encoded;
74 }
75 } else { # won't reach
76 die "$name: unknown scheme: $scheme";
77 }
78 }
79}else{
80 # NI-S favorite
81 binmode STDOUT => "raw:encoding($to)";
82 for my $argv (@ARGV){
83 my $ifh = ref $argv ? $argv : undef;
84 $ifh or open $ifh, "<", $argv or next;
85 binmode $ifh => "raw:encoding($from)";
86 print while(<$ifh>);
87 }
67d7b5ef 88}
89
90sub list_encodings{
ce912cd4 91 print join("\n", Encode->encodings(":all")), "\n";
bedba681 92 exit 0;
93}
94
95sub resolve_encoding {
96 if (my $alias = Encode::resolve_alias($_[0])) {
97 print $alias, "\n";
98 exit 0;
99 } else {
100 warn "$name: $_[0] is not known to Encode\n";
101 exit 1;
102 }
67d7b5ef 103}
104
105sub help{
106 my $message = shift;
67d7b5ef 107 $message and print STDERR "$name error: $message\n";
108 print STDERR <<"EOT";
109$name [-f from_encoding] [-t to_encoding] [-s string] [files...]
110$name -l
bedba681 111$name -r encoding_alias
112 -l,--list
113 lists all available encodings
114 -r,--resolve encoding_alias
115 resolve encoding to its (Encode) canonical name
116 -f,--from from_encoding
117 when omitted, the current locale will be used
118 -t,--to to_encoding
119 when omitted, the current locale will be used
120 -s,--string string
121 "string" will be the input instead of STDIN or files
122The following are mainly of interest to Encode hackers:
123 -D,--debug show debug information
124 -C N | -c | -p check the validity of the input
125 -S,--scheme scheme use the scheme for conversion
67d7b5ef 126EOT
127 exit;
128}
129
130__END__
131
132=head1 NAME
133
134piconv -- iconv(1), reinvented in perl
135
136=head1 SYNOPSIS
137
138 piconv [-f from_encoding] [-t to_encoding] [-s string] [files...]
139 piconv -l
bedba681 140 piconv [-C N|-c|-p]
141 piconv -S scheme ...
142 piconv -r encoding
143 piconv -D ...
144 piconv -h
67d7b5ef 145
146=head1 DESCRIPTION
147
0ab8f81e 148B<piconv> is perl version of B<iconv>, a character encoding converter
149widely available for various Unixen today. This script was primarily
150a technology demonstrator for Perl 5.8.0, but you can use piconv in the
151place of iconv for virtually any case.
67d7b5ef 152
0ab8f81e 153piconv converts the character encoding of either STDIN or files
154specified in the argument and prints out to STDOUT.
67d7b5ef 155
bedba681 156Here is the list of options. Each option can be in short format (-f)
157or long (--from).
67d7b5ef 158
159=over 4
160
bedba681 161=item -f,--from from_encoding
67d7b5ef 162
0ab8f81e 163Specifies the encoding you are converting from. Unlike B<iconv>,
164this option can be omitted. In such cases, the current locale is used.
67d7b5ef 165
bedba681 166=item -t,--to to_encoding
67d7b5ef 167
0ab8f81e 168Specifies the encoding you are converting to. Unlike B<iconv>,
169this option can be omitted. In such cases, the current locale is used.
67d7b5ef 170
0ab8f81e 171Therefore, when both -f and -t are omitted, B<piconv> just acts
172like B<cat>.
67d7b5ef 173
bedba681 174=item -s,--string I<string>
67d7b5ef 175
bedba681 176uses I<string> instead of file for the source of text.
67d7b5ef 177
bedba681 178=item -l,--list
67d7b5ef 179
ce912cd4 180Lists all available encodings, one per line, in case-insensitive
0ab8f81e 181order. Note that only the canonical names are listed; many aliases
ce912cd4 182exist. For example, the names are case-insensitive, and many standard
0ab8f81e 183and common aliases work, such as "latin1" for "ISO-8859-1", or "ibm850"
ce912cd4 184instead of "cp850", or "winlatin1" for "cp1252". See L<Encode::Supported>
0ab8f81e 185for a full discussion.
67d7b5ef 186
bedba681 187=item -C,--check I<N>
b2704119 188
189Check the validity of the stream if I<N> = 1. When I<N> = -1, something
190interesting happens when it encounters an invalid character.
191
192=item -c
193
194Same as C<-C 1>.
195
bedba681 196=item -p,--perlqq
b2704119 197
198Same as C<-C -1>.
199
bedba681 200=item -h,--help
d31fa6c4 201
202Show usage.
203
bedba681 204=item -D,--debug
67d7b5ef 205
7748829a 206Invokes debugging mode. Primarily for Encode hackers.
67d7b5ef 207
bedba681 208=item -S,--scheme scheme
67d7b5ef 209
210Selects which scheme is to be used for conversion. Available schemes
0ab8f81e 211are as follows:
67d7b5ef 212
213=over 4
214
215=item from_to
216
217Uses Encode::from_to for conversion. This is the default.
218
219=item decode_encode
220
7748829a 221Input strings are decode()d then encode()d. A straight two-step
67d7b5ef 222implementation.
223
224=item perlio
225
7748829a 226The new perlIO layer is used. NI-S' favorite.
67d7b5ef 227
228=back
229
0ab8f81e 230Like the I<-D> option, this is also for Encode hackers.
67d7b5ef 231
232=back
233
234=head1 SEE ALSO
235
bedba681 236L<iconv/1>
237L<locale/3>
67d7b5ef 238L<Encode>
ce912cd4 239L<Encode::Supported>
240L<Encode::Alias>
67d7b5ef 241L<PerlIO>
242
243=cut