This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Update documentation and warning in I18N::Collate.
[perl5.git] / lib / I18N / Collate.pm
CommitLineData
6158a1ac
CS
1#-----------------------------------------------------------------------#
2# NOTE! This module is deprecated (obsolete) after the Perl release #
3# 5.003_06 as the functionality has been integrated into the Perl core. #
4#-----------------------------------------------------------------------#
6b48aaa4 5
a0d0e21e
LW
6package I18N::Collate;
7
f06db76b
AD
8=head1 NAME
9
69b19ea2 10I18N::Collate - compare 8-bit scalar data according to the current locale
f06db76b
AD
11
12=head1 SYNOPSIS
13
69b19ea2 14 use I18N::Collate;
f06db76b 15 setlocale(LC_COLLATE, 'locale-of-your-choice');
69b19ea2 16 $s1 = new I18N::Collate "scalar_data_1";
17 $s2 = new I18N::Collate "scalar_data_2";
f06db76b
AD
18
19=head1 DESCRIPTION
20
21This module provides you with objects that will collate
69b19ea2 22according to your national character set, provided that the
23POSIX setlocale() function is supported on your system.
f06db76b
AD
24
25You can compare $s1 and $s2 above with
26
27 $s1 le $s2
28
29to extract the data itself, you'll need a dereference: $$s1
30
6158a1ac
CS
31This module uses POSIX::setlocale(). The basic collation conversion is
32done by strxfrm() which terminates at NUL characters being a decent C
33routine. collate_xfrm() handles embedded NUL characters gracefully.
c2960299 34
6158a1ac
CS
35The available locales depend on your operating system; try whether
36C<locale -a> shows them or man pages for "locale" or "nlsinfo" or the
37direct approach C<ls /usr/lib/nls/loc> or C<ls /usr/lib/nls> or
38C<ls /usr/lib/locale>. Not all the locales that your vendor supports
39are necessarily installed: please consult your operating system's
40documentation and possibly your local system administration. The
41locale names are probably something like C<xx_XX.(ISO)?8859-N> or
42C<xx_XX.(ISO)?8859N>, for example C<fr_CH.ISO8859-1> is the Swiss (CH)
43variant of French (fr), ISO Latin (8859) 1 (-1) which is the Western
44European character set.
f06db76b
AD
45
46=cut
47
69b19ea2 48# I18N::Collate.pm
a0d0e21e
LW
49#
50# Author: Jarkko Hietaniemi <Jarkko.Hietaniemi@hut.fi>
51# Helsinki University of Technology, Finland
52#
53# Acks: Guy Decoux <decoux@moulon.inra.fr> understood
54# overloading magic much deeper than I and told
55# how to cut the size of this code by more than half.
56# (my first version did overload all of lt gt eq le ge cmp)
57#
58# Purpose: compare 8-bit scalar data according to the current locale
59#
60# Requirements: Perl5 POSIX::setlocale() and POSIX::strxfrm()
61#
62# Exports: setlocale 1)
63# collate_xfrm 2)
64#
65# Overloads: cmp # 3)
66#
69b19ea2 67# Usage: use I18N::Collate;
c2960299 68# setlocale(LC_COLLATE, 'locale-of-your-choice'); # 4)
69b19ea2 69# $s1 = new I18N::Collate "scalar_data_1";
70# $s2 = new I18N::Collate "scalar_data_2";
a0d0e21e
LW
71#
72# now you can compare $s1 and $s2: $s1 le $s2
73# to extract the data itself, you need to deref: $$s1
74#
75# Notes:
76# 1) this uses POSIX::setlocale
77# 2) the basic collation conversion is done by strxfrm() which
78# terminates at NUL characters being a decent C routine.
79# collate_xfrm handles embedded NUL characters gracefully.
80# 3) due to cmp and overload magic, lt le eq ge gt work also
81# 4) the available locales depend on your operating system;
c2960299
AD
82# try whether "locale -a" shows them or man pages for
83# "locale" or "nlsinfo" work or the more direct
a0d0e21e 84# approach "ls /usr/lib/nls/loc" or "ls /usr/lib/nls".
c2960299
AD
85# Not all the locales that your vendor supports
86# are necessarily installed: please consult your
87# operating system's documentation.
a0d0e21e 88# The locale names are probably something like
c2960299
AD
89# 'xx_XX.(ISO)?8859-N' or 'xx_XX.(ISO)?8859N',
90# for example 'fr_CH.ISO8859-1' is the Swiss (CH)
91# variant of French (fr), ISO Latin (8859) 1 (-1)
92# which is the Western European character set.
a0d0e21e 93#
6b48aaa4 94# Updated: 19961005
a0d0e21e
LW
95#
96# ---
97
98use POSIX qw(strxfrm LC_COLLATE);
99
100require Exporter;
101
102@ISA = qw(Exporter);
103@EXPORT = qw(collate_xfrm setlocale LC_COLLATE);
104@EXPORT_OK = qw();
105
a5f75d66 106use overload qw(
a0d0e21e
LW
107fallback 1
108cmp collate_cmp
109);
110
6b48aaa4
JH
111sub new {
112 my $new = $_[1];
113
114 if ($^W && $] >= 5.003_06) {
115 unless ($please_use_I18N_Collate_even_if_deprecated) {
116 warn <<___EOD___;
117***
118
119 WARNING: starting from the Perl version 5.003_06 the I18N::Collate
120 interface for comparing 8-bit scalar data according to the current locale
121
122 HAS BEEN DEPRECATED
123
124 (that is, please do not use it anymore for any new applications and please
6158a1ac
CS
125 migrate the old applications away from it) because its functionality was
126 integrated into the Perl core language in the release 5.003_06.
6b48aaa4 127
6158a1ac 128 See pod/perli18n.pod for further information.
6b48aaa4
JH
129
130***
131___EOD___
132 $please_use_I18N_Collate_even_if_deprecated++;
133 }
134 }
135
136 bless \$new;
137}
a0d0e21e
LW
138
139sub setlocale {
140 my ($category, $locale) = @_[0,1];
141
142 POSIX::setlocale($category, $locale) if (defined $category);
143 # the current $LOCALE
144 $LOCALE = $locale || $ENV{'LC_COLLATE'} || $ENV{'LC_ALL'} || '';
145}
146
147sub C {
148 my $s = ${$_[0]};
149
150 $C->{$LOCALE}->{$s} = collate_xfrm($s)
151 unless (defined $C->{$LOCALE}->{$s}); # cache when met
152
153 $C->{$LOCALE}->{$s};
154}
155
156sub collate_xfrm {
157 my $s = $_[0];
158 my $x = '';
159
160 for (split(/(\000+)/, $s)) {
161 $x .= (/^\000/) ? $_ : strxfrm("$_\000");
162 }
163
164 $x;
165}
166
167sub collate_cmp {
168 &C($_[0]) cmp &C($_[1]);
169}
170
171# init $LOCALE
172
173&I18N::Collate::setlocale();
174
1751; # keep require happy