Slight usage tweaks to piconv: show usage with
[p5sagit/p5-mst-13.2.git] / ext / Encode / bin / piconv
1 #!./perl
2 # $Id: piconv,v 1.10 2002/03/31 21:00:50 dankogai Exp $
3 #
4 use 5.7.3;
5 use strict;
6 use Encode ;
7 use Encode::Alias;
8 my %Scheme =  map {$_ => 1} qw(from_to decode_encode perlio);
9
10 use Getopt::Std;
11
12 my %Opt; getopts("hDS:lf:t:s:", \%Opt);
13 $Opt{h} and help();
14 $Opt{l} and list_encodings();
15 my $locale = $ENV{LC_CTYPE} || $ENV{LC_ALL} || $ENV{LANG};
16 $Opt{f} || $Opt{t} || help();
17 my $from = $Opt{f} || $locale or help("from_encoding unspecified");
18 my $to   = $Opt{t} || $locale or help("to_encoding unspecified");
19 $Opt{s} and Encode::from_to($Opt{s}, $from, $to) and print $Opt{s} and exit;
20 my $scheme = exists $Scheme{$Opt{S}} ? $Opt{S} :  'from_to';
21
22 if ($Opt{D}){
23     my $cfrom = Encode->getEncoding($from)->name;
24     my $cto   = Encode->getEncoding($to)->name;
25     print STDERR <<"EOT";
26 Scheme: $scheme
27 From:   $from => $cfrom
28 To:     $to => $cto
29 EOT
30 }
31
32 # default
33 if     ($scheme eq 'from_to'){ 
34     while(<>){
35         Encode::from_to($_, $from, $to); print;
36     };
37 # step-by-step
38 }elsif ($scheme eq 'decode_encode'){
39    while(<>){
40        my $decoded = decode($from, $_);
41        my $encoded = encode($to, $decoded);
42        print $encoded;
43     };
44 # NI-S favorite
45 }elsif ($scheme eq 'perlio'){ 
46     binmode(STDIN,  ":encoding($from)");
47     binmode(STDOUT, ":encoding($to)");
48     while(<>){ print; }
49 }else{ # won't reach
50     die "unknown scheme: $scheme";
51 }
52
53 sub list_encodings{
54     print STDERR join("\n", Encode->encodings(":all")), "\n";
55     exit;
56 }
57
58 sub help{
59     my $message = shift;
60     use File::Basename;
61     my $name = basename($0);
62     $message and print STDERR "$name error: $message\n";
63     print STDERR <<"EOT";
64 $name [-f from_encoding] [-t to_encoding] [-s string] [files...]
65 $name -l
66   -l lists all available encodings.
67   -f from_encoding  When omitted, the current locale will be used.
68   -t to_encoding    When omitted, the current locale will be used.
69   -s string         "string" will be converted instead of STDIN.
70 EOT
71   exit;
72 }
73
74 __END__
75
76 =head1 NAME
77
78 piconv -- iconv(1), reinvented in perl
79
80 =head1 SYNOPSIS
81
82   piconv [-f from_encoding] [-t to_encoding] [-s string] [files...]
83   piconv -l
84
85 =head1 DESCRIPTION
86
87 B<piconv> is perl version of F<iconv>, a character encoding converter
88 widely available for various Unixen today.   This script was primarily
89 a technology demonstrator for Perl 5.8.0, you can use piconv in the
90 place of iconv for virtually any cases.
91
92 piconv converts character encoding of either STDIN or files specified
93 in the argument and prints out to STDOUT.
94
95 Here are list of options.
96
97 =over 4
98
99 =item -f from_encoding
100
101 Specifies the encoding you are converting from.  Unlike F<iconv>,
102 this option can be omitted.  In such cases the current locale is used.
103
104 =item -t to_encoding
105
106 Specifies the encoding you are converting to.  Unlike F<iconv>,
107 this option can be omitted.  In such cases the current locale is used.
108
109 Therefore when both -f and -t are omitted, F<piconv> just acts like F<cat>.
110
111 =item -s I<string>
112
113 uses I<string> instead of file for the source of text.  Same as F<iconv>.
114
115 =item -l
116
117 Lists all available encodings to STDERR.  This feature is missing from
118 F<iconv>.
119
120 =item -h
121
122 Show usage.
123
124 =item -D
125
126 Invokes debugging mode.  Primarily for Encode hackers.
127
128 =item -S scheme
129
130 Selects which scheme is to be used for conversion.  Available schemes
131 are as follows;
132
133 =over 4
134
135 =item from_to
136
137 Uses Encode::from_to for conversion.  This is the default.
138
139 =item decode_encode
140
141 Input strings are decode()d then encode()d.  A straight two-step
142 implementation.
143
144 =item perlio
145
146 The new perlIO layer is used.  NI-S' favorite.
147
148 =back
149
150 Like I<-D> option, this is also for Encode hackers.
151
152 =back
153
154 =head1 SEE ALSO
155
156 L<iconv(1)>
157 L<locale(3)>
158 L<Encode>
159 L<PerlIO>
160
161 =cut