xref: /onnv-gate/usr/src/cmd/perl/5.8.4/distrib/lib/Locale/Country.pm (revision 0:68f95e015346)
1#
2# Locale::Country - ISO codes for country identification (ISO 3166)
3#
4# $Id: Country.pm,v 2.6 2002/07/10 16:33:27 neilb Exp $
5#
6
7package Locale::Country;
8use strict;
9require 5.002;
10
11require Exporter;
12use Carp;
13use Locale::Constants;
14
15
16#-----------------------------------------------------------------------
17#	Public Global Variables
18#-----------------------------------------------------------------------
19use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);
20$VERSION   = sprintf("%d.%02d", q$Revision: 2.61 $ =~ /(\d+)\.(\d+)/);
21@ISA       = qw(Exporter);
22@EXPORT    = qw(code2country country2code
23                all_country_codes all_country_names
24		country_code2code
25		LOCALE_CODE_ALPHA_2 LOCALE_CODE_ALPHA_3 LOCALE_CODE_NUMERIC);
26
27#-----------------------------------------------------------------------
28#	Private Global Variables
29#-----------------------------------------------------------------------
30my $CODES     = [];
31my $COUNTRIES = [];
32
33
34#=======================================================================
35#
36# code2country ( CODE [, CODESET ] )
37#
38#=======================================================================
39sub code2country
40{
41    my $code = shift;
42    my $codeset = @_ > 0 ? shift : LOCALE_CODE_DEFAULT;
43
44
45    return undef unless defined $code;
46
47    #-------------------------------------------------------------------
48    # Make sure the code is in the right form before we use it
49    # to look up the corresponding country.
50    # We have to sprintf because the codes are given as 3-digits,
51    # with leading 0's. Eg 052 for Barbados.
52    #-------------------------------------------------------------------
53    if ($codeset == LOCALE_CODE_NUMERIC)
54    {
55	return undef if ($code =~ /\D/);
56	$code = sprintf("%.3d", $code);
57    }
58    else
59    {
60	$code = lc($code);
61    }
62
63    if (exists $CODES->[$codeset]->{$code})
64    {
65        return $CODES->[$codeset]->{$code};
66    }
67    else
68    {
69        #---------------------------------------------------------------
70        # no such country code!
71        #---------------------------------------------------------------
72        return undef;
73    }
74}
75
76
77#=======================================================================
78#
79# country2code ( NAME [, CODESET ] )
80#
81#=======================================================================
82sub country2code
83{
84    my $country = shift;
85    my $codeset = @_ > 0 ? shift : LOCALE_CODE_DEFAULT;
86
87
88    return undef unless defined $country;
89    $country = lc($country);
90    if (exists $COUNTRIES->[$codeset]->{$country})
91    {
92        return $COUNTRIES->[$codeset]->{$country};
93    }
94    else
95    {
96        #---------------------------------------------------------------
97        # no such country!
98        #---------------------------------------------------------------
99        return undef;
100    }
101}
102
103
104#=======================================================================
105#
106# country_code2code ( NAME [, CODESET ] )
107#
108#=======================================================================
109sub country_code2code
110{
111    (@_ == 3) or croak "country_code2code() takes 3 arguments!";
112
113    my $code = shift;
114    my $inset = shift;
115    my $outset = shift;
116    my $outcode;
117    my $country;
118
119
120    return undef if $inset == $outset;
121    $country = code2country($code, $inset);
122    return undef if not defined $country;
123    $outcode = country2code($country, $outset);
124    return $outcode;
125}
126
127
128#=======================================================================
129#
130# all_country_codes ( [ CODESET ] )
131#
132#=======================================================================
133sub all_country_codes
134{
135    my $codeset = @_ > 0 ? shift : LOCALE_CODE_DEFAULT;
136
137    return keys %{ $CODES->[$codeset] };
138}
139
140
141#=======================================================================
142#
143# all_country_names ( [ CODESET ] )
144#
145#=======================================================================
146sub all_country_names
147{
148    my $codeset = @_ > 0 ? shift : LOCALE_CODE_DEFAULT;
149
150    return values %{ $CODES->[$codeset] };
151}
152
153
154#=======================================================================
155#
156# alias_code ( ALIAS => CODE [ , CODESET ] )
157#
158# Add an alias for an existing code. If the CODESET isn't specified,
159# then we use the default (currently the alpha-2 codeset).
160#
161#   Locale::Country::alias_code('uk' => 'gb');
162#
163#=======================================================================
164sub alias_code
165{
166    my $alias = shift;
167    my $real  = shift;
168    my $codeset = @_ > 0 ? shift : LOCALE_CODE_DEFAULT;
169
170    my $country;
171
172
173    if (not exists $CODES->[$codeset]->{$real})
174    {
175        carp "attempt to alias \"$alias\" to unknown country code \"$real\"\n";
176        return undef;
177    }
178    $country = $CODES->[$codeset]->{$real};
179    $CODES->[$codeset]->{$alias} = $country;
180    $COUNTRIES->[$codeset]->{"\L$country"} = $alias;
181
182    return $alias;
183}
184
185# old name of function for backwards compatibility
186*_alias_code = *alias_code;
187
188
189#=======================================================================
190#
191# rename_country
192#
193# change the official name for a country, eg:
194#	gb => 'Great Britain'
195# rather than the standard 'United Kingdom'. The original is retained
196# as an alias, but the new name will be returned if you lookup the
197# name from code.
198#
199#=======================================================================
200sub rename_country
201{
202    my $code     = shift;
203    my $new_name = shift;
204    my $codeset = @_ > 0 ? shift : _code2codeset($code);
205    my $country;
206    my $c;
207
208
209    if (not defined $codeset)
210    {
211        carp "rename_country(): unknown country code \"$code\"\n";
212        return 0;
213    }
214
215    $country = $CODES->[$codeset]->{$code};
216
217    foreach my $cset (LOCALE_CODE_ALPHA_2,
218			LOCALE_CODE_ALPHA_3,
219			LOCALE_CODE_NUMERIC)
220    {
221	if ($cset == $codeset)
222	{
223	    $c = $code;
224	}
225	else
226	{
227	    $c = country_code2code($code, $codeset, $cset);
228	}
229
230	$CODES->[$cset]->{$c} = $new_name;
231	$COUNTRIES->[$cset]->{"\L$new_name"} = $c;
232    }
233
234    return 1;
235}
236
237
238#=======================================================================
239#
240# _code2codeset
241#
242# given a country code in an unknown codeset, return the codeset
243# it is from, or undef.
244#
245#=======================================================================
246sub _code2codeset
247{
248    my $code = shift;
249
250
251    foreach my $codeset (LOCALE_CODE_ALPHA_2, LOCALE_CODE_ALPHA_3,
252			LOCALE_CODE_NUMERIC)
253    {
254	return $codeset if (exists $CODES->[$codeset]->{$code})
255    }
256
257    return undef;
258}
259
260
261#=======================================================================
262#
263# initialisation code - stuff the DATA into the ALPHA2 hash
264#
265#=======================================================================
266{
267    my ($alpha2, $alpha3, $numeric);
268    my ($country, @countries);
269
270    local $_;
271
272    while (<DATA>)
273    {
274        next unless /\S/;
275        chop;
276        ($alpha2, $alpha3, $numeric, @countries) = split(/:/, $_);
277
278        $CODES->[LOCALE_CODE_ALPHA_2]->{$alpha2} = $countries[0];
279	foreach $country (@countries)
280	{
281	    $COUNTRIES->[LOCALE_CODE_ALPHA_2]->{"\L$country"} = $alpha2;
282	}
283
284	if ($alpha3)
285	{
286            $CODES->[LOCALE_CODE_ALPHA_3]->{$alpha3} = $countries[0];
287	    foreach $country (@countries)
288	    {
289		$COUNTRIES->[LOCALE_CODE_ALPHA_3]->{"\L$country"} = $alpha3;
290	    }
291	}
292
293	if ($numeric)
294	{
295            $CODES->[LOCALE_CODE_NUMERIC]->{$numeric} = $countries[0];
296	    foreach $country (@countries)
297	    {
298		$COUNTRIES->[LOCALE_CODE_NUMERIC]->{"\L$country"} = $numeric;
299	    }
300	}
301
302    }
303
304    close(DATA);
305}
306
3071;
308
309__DATA__
310ad:and:020:Andorra
311ae:are:784:United Arab Emirates
312af:afg:004:Afghanistan
313ag:atg:028:Antigua and Barbuda
314ai:aia:660:Anguilla
315al:alb:008:Albania
316am:arm:051:Armenia
317an:ant:530:Netherlands Antilles
318ao:ago:024:Angola
319aq:ata:010:Antarctica
320ar:arg:032:Argentina
321as:asm:016:American Samoa
322at:aut:040:Austria
323au:aus:036:Australia
324aw:abw:533:Aruba
325az:aze:031:Azerbaijan
326ba:bih:070:Bosnia and Herzegovina
327bb:brb:052:Barbados
328bd:bgd:050:Bangladesh
329be:bel:056:Belgium
330bf:bfa:854:Burkina Faso
331bg:bgr:100:Bulgaria
332bh:bhr:048:Bahrain
333bi:bdi:108:Burundi
334bj:ben:204:Benin
335bm:bmu:060:Bermuda
336bn:brn:096:Brunei Darussalam
337bo:bol:068:Bolivia
338br:bra:076:Brazil
339bs:bhs:044:Bahamas
340bt:btn:064:Bhutan
341bv:bvt:074:Bouvet Island
342bw:bwa:072:Botswana
343by:blr:112:Belarus
344bz:blz:084:Belize
345ca:can:124:Canada
346cc:cck:166:Cocos (Keeling) Islands
347cf:caf:140:Central African Republic
348cg:cog:178:Congo:Congo, Republic of the
349ch:che:756:Switzerland
350ci:civ:384:Cote D'Ivoire
351ck:cok:184:Cook Islands
352cl:chl:152:Chile
353cm:cmr:120:Cameroon
354cn:chn:156:China
355co:col:170:Colombia
356cr:cri:188:Costa Rica
357cu:cub:192:Cuba
358cv:cpv:132:Cape Verde
359cx:cxr:162:Christmas Island
360cy:cyp:196:Cyprus
361cz:cze:203:Czech Republic
362de:deu:276:Germany
363dj:dji:262:Djibouti
364dk:dnk:208:Denmark
365dm:dma:212:Dominica
366do:dom:214:Dominican Republic
367dz:dza:012:Algeria
368ec:ecu:218:Ecuador
369ee:est:233:Estonia
370eg:egy:818:Egypt
371eh:esh:732:Western Sahara
372er:eri:232:Eritrea
373es:esp:724:Spain
374et:eth:231:Ethiopia
375fi:fin:246:Finland
376fj:fji:242:Fiji
377fk:flk:238:Falkland Islands (Malvinas):Falkland Islands (Islas Malvinas)
378fm:fsm:583:Micronesia, Federated States of
379fo:fro:234:Faroe Islands
380fr:fra:250:France
381fx:fxx:249:France, Metropolitan
382ga:gab:266:Gabon
383gb:gbr:826:United Kingdom:Great Britain
384gd:grd:308:Grenada
385ge:geo:268:Georgia
386gf:guf:254:French Guiana
387gh:gha:288:Ghana
388gi:gib:292:Gibraltar
389gl:grl:304:Greenland
390gm:gmb:270:Gambia
391gn:gin:324:Guinea
392gp:glp:312:Guadeloupe
393gq:gnq:226:Equatorial Guinea
394gr:grc:300:Greece
395gs:sgs:239:South Georgia and the South Sandwich Islands
396gt:gtm:320:Guatemala
397gu:gum:316:Guam
398gw:gnb:624:Guinea-Bissau
399gy:guy:328:Guyana
400hk:hkg:344:Hong Kong
401hm:hmd:334:Heard Island and McDonald Islands
402hn:hnd:340:Honduras
403hr:hrv:191:Croatia
404ht:hti:332:Haiti
405hu:hun:348:Hungary
406id:idn:360:Indonesia
407ie:irl:372:Ireland
408il:isr:376:Israel
409in:ind:356:India
410io:iot:086:British Indian Ocean Territory
411iq:irq:368:Iraq
412ir:irn:364:Iran, Islamic Republic of:Iran
413is:isl:352:Iceland
414it:ita:380:Italy
415jm:jam:388:Jamaica
416jo:jor:400:Jordan
417jp:jpn:392:Japan
418ke:ken:404:Kenya
419kg:kgz:417:Kyrgyzstan
420kh:khm:116:Cambodia
421ki:kir:296:Kiribati
422km:com:174:Comoros
423kn:kna:659:Saint Kitts and Nevis
424kp:prk:408:Korea, Democratic People's Republic of:Korea, North:North Korea
425kr:kor:410:Korea, Republic of:Korea, South:South Korea
426kw:kwt:414:Kuwait
427ky:cym:136:Cayman Islands
428kz:kaz:398:Kazakhstan:Kazakstan
429la:lao:418:Lao People's Democratic Republic
430lb:lbn:422:Lebanon
431lc:lca:662:Saint Lucia
432li:lie:438:Liechtenstein
433lk:lka:144:Sri Lanka
434lr:lbr:430:Liberia
435ls:lso:426:Lesotho
436lt:ltu:440:Lithuania
437lu:lux:442:Luxembourg
438lv:lva:428:Latvia
439ly:lby:434:Libyan Arab Jamahiriya:Libya
440ma:mar:504:Morocco
441mc:mco:492:Monaco
442md:mda:498:Moldova, Republic of:Moldova
443mg:mdg:450:Madagascar
444mh:mhl:584:Marshall Islands
445mk:mkd:807:Macedonia, the Former Yugoslav Republic of:Macedonia, Former Yugoslav Republic of:Macedonia
446ml:mli:466:Mali
447mm:mmr:104:Myanmar
448mn:mng:496:Mongolia
449mo:mac:446:Macao:Macau
450mp:mnp:580:Northern Mariana Islands
451mq:mtq:474:Martinique
452mr:mrt:478:Mauritania
453ms:msr:500:Montserrat
454mt:mlt:470:Malta
455mu:mus:480:Mauritius
456mv:mdv:462:Maldives
457mw:mwi:454:Malawi
458mx:mex:484:Mexico
459my:mys:458:Malaysia
460mz:moz:508:Mozambique
461na:nam:516:Namibia
462nc:ncl:540:New Caledonia
463ne:ner:562:Niger
464nf:nfk:574:Norfolk Island
465ng:nga:566:Nigeria
466ni:nic:558:Nicaragua
467nl:nld:528:Netherlands
468no:nor:578:Norway
469np:npl:524:Nepal
470nr:nru:520:Nauru
471nu:niu:570:Niue
472nz:nzl:554:New Zealand
473om:omn:512:Oman
474pa:pan:591:Panama
475pe:per:604:Peru
476pf:pyf:258:French Polynesia
477pg:png:598:Papua New Guinea
478ph:phl:608:Philippines
479pk:pak:586:Pakistan
480pl:pol:616:Poland
481pm:spm:666:Saint Pierre and Miquelon
482pn:pcn:612:Pitcairn:Pitcairn Island
483pr:pri:630:Puerto Rico
484ps:pse:275:Palestinian Territory, Occupied
485pt:prt:620:Portugal
486pw:plw:585:Palau
487py:pry:600:Paraguay
488qa:qat:634:Qatar
489re:reu:638:Reunion
490ro:rom:642:Romania
491ru:rus:643:Russian Federation:Russia
492rw:rwa:646:Rwanda
493sa:sau:682:Saudi Arabia
494sb:slb:090:Solomon Islands
495sc:syc:690:Seychelles
496sd:sdn:736:Sudan
497se:swe:752:Sweden
498sg:sgp:702:Singapore
499sh:shn:654:Saint Helena
500si:svn:705:Slovenia
501sj:sjm:744:Svalbard and Jan Mayen:Jan Mayen:Svalbard
502sk:svk:703:Slovakia
503sl:sle:694:Sierra Leone
504sm:smr:674:San Marino
505sn:sen:686:Senegal
506so:som:706:Somalia
507sr:sur:740:Suriname
508st:stp:678:Sao Tome and Principe
509sv:slv:222:El Salvador
510sy:syr:760:Syrian Arab Republic:Syria
511sz:swz:748:Swaziland
512tc:tca:796:Turks and Caicos Islands
513td:tcd:148:Chad
514tf:atf:260:French Southern Territories
515tg:tgo:768:Togo
516th:tha:764:Thailand
517tj:tjk:762:Tajikistan
518tk:tkl:772:Tokelau
519tm:tkm:795:Turkmenistan
520tn:tun:788:Tunisia
521to:ton:776:Tonga
522tl:tls:626:East Timor
523tr:tur:792:Turkey
524tt:tto:780:Trinidad and Tobago
525tv:tuv:798:Tuvalu
526tw:twn:158:Taiwan, Province of China:Taiwan
527tz:tza:834:Tanzania, United Republic of:Tanzania
528ua:ukr:804:Ukraine
529ug:uga:800:Uganda
530um:umi:581:United States Minor Outlying Islands
531us:usa:840:United States:USA:United States of America
532uy:ury:858:Uruguay
533uz:uzb:860:Uzbekistan
534va:vat:336:Holy See (Vatican City State):Holy See (Vatican City)
535vc:vct:670:Saint Vincent and the Grenadines
536ve:ven:862:Venezuela
537vg:vgb:092:Virgin Islands, British:British Virgin Islands
538vi:vir:850:Virgin Islands, U.S.
539vn:vnm:704:Vietnam
540vu:vut:548:Vanuatu
541wf:wlf:876:Wallis and Futuna
542ws:wsm:882:Samoa
543ye:yem:887:Yemen
544yt:myt:175:Mayotte
545yu:yug:891:Yugoslavia
546za:zaf:710:South Africa
547zm:zmb:894:Zambia
548zr:zar:180:Zaire:Congo, The Democratic Republic of the:Congo, Democratic Republic of the
549zw:zwe:716:Zimbabwe
550