]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - tools/tools/locale/tools/charmaps.pm
MFV: r360512
[FreeBSD/FreeBSD.git] / tools / tools / locale / tools / charmaps.pm
1 #!/usr/local/bin/perl -w
2
3 # SPDX-License-Identifier: BSD-2-Clause-FreeBSD
4 #
5 # Copyright 2009 Edwin Groothuis <edwin@FreeBSD.org>
6 #
7 # Redistribution and use in source and binary forms, with or without
8 # modification, are permitted provided that the following conditions
9 # are met:
10 # 1. Redistributions of source code must retain the above copyright
11 #    notice, this list of conditions and the following disclaimer.
12 # 2. Redistributions in binary form must reproduce the above copyright
13 #    notice, this list of conditions and the following disclaimer in the
14 #    documentation and/or other materials provided with the distribution.
15 #
16 # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17 # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 # ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20 # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 # SUCH DAMAGE.
27 #
28 # $FreeBSD$
29 #
30
31 use strict;
32 use XML::Parser;
33 use Data::Dumper;
34
35 my %data = ();
36 my %d = ();
37 my $index = -1;
38
39 sub get_xmldata {
40         my $etcdir = shift;
41
42         open(FIN, "$etcdir/charmaps.xml");
43         my @xml = <FIN>;
44         chomp(@xml);
45         close(FIN);
46
47         my $xml = new XML::Parser(Handlers => {
48                                         Start   => \&h_start,
49                                         End     => \&h_end,
50                                         Char    => \&h_char
51                                         });
52         $xml->parse(join("", @xml));
53         return %d;
54 }
55
56 sub h_start {
57         my $expat = shift;
58         my $element = shift;
59         my @attrs = @_;
60         my %attrs = ();
61
62
63         while ($#attrs >= 0) {
64                 $attrs{$attrs[0]} = $attrs[1];
65                 shift(@attrs);
66                 shift(@attrs);
67         }
68
69         $data{element}{++$index} = $element;
70
71         if ($index == 2
72          && $data{element}{1} eq "languages"
73          && $element eq "language") {
74                 my $name = $attrs{name};
75                 my $countries = $attrs{countries};
76                 my $encoding = $attrs{encoding};
77                 my $family = $attrs{family};
78                 my $f = defined $attrs{family} ? $attrs{family} : "x";
79                 my $nc_link = $attrs{namecountry_link};
80                 my $e_link = $attrs{encoding_link};
81                 my $fallback = $attrs{fallback};
82                 my $definitions = $attrs{definitions};
83
84                 $d{L}{$name}{$f}{fallback} = $fallback;
85                 $d{L}{$name}{$f}{e_link} = $e_link;
86                 $d{L}{$name}{$f}{nc_link} = $nc_link;
87                 $d{L}{$name}{$f}{family} = $family;
88                 $d{L}{$name}{$f}{encoding} = $encoding;
89                 $d{L}{$name}{$f}{definitions} = $definitions;
90                 $d{L}{$name}{$f}{countries} = $countries;
91                 foreach my $c (split(" ", $countries)) {
92                         if (defined $encoding) {
93                                 foreach my $e (split(" ", $encoding)) {
94                                         $d{L}{$name}{$f}{data}{$c}{$e} = undef;
95                                         $d{E}{$e} = 0;  # not read
96                                 }
97                         }
98                         $d{L}{$name}{$f}{data}{$c}{"UTF-8"} = undef;
99                 }
100                 return;
101         }
102
103         if ($index == 2
104          && $data{element}{1} eq "translations"
105          && $element eq "translation") {
106                 foreach my $e (split(" ", $attrs{encoding})) {
107                         if (defined $attrs{hex}) {
108                                 my $k = $attrs{cldr};
109                                 my $hs = $attrs{hex};
110                                 $d{T}{$e}{$k}{hex} = $hs;
111                         }
112                         if (defined $attrs{string}) {
113                                 my $s = "";
114                                 for (my $i = 0; $i < length($attrs{string}); $i++) {
115                                         $s .= sprintf("%02x",
116                                             ord(substr($attrs{string}, $i, 1)));
117                                 }
118                                 $d{T}{$e}{$attrs{cldr}}{hex} = $s;
119                         }
120                         if (defined $attrs{unicode}) {
121                                 my $k = $attrs{cldr};
122                                 my $uc = $attrs{unicode};
123                                 $d{T}{$e}{$k}{unicode} = $uc;
124                         }
125                         if (defined $attrs{ucc}) {
126                                 my $k = $attrs{cldr};
127                                 my $uc = $attrs{ucc};
128                                 $d{T}{$e}{$k}{ucc} = $uc;
129                         }
130                 }
131                 return;
132         }
133
134         if ($index == 2
135          && $data{element}{1} eq "alternativemonths"
136          && $element eq "language") {
137                 my $name = $attrs{name};
138                 my $countries = $attrs{countries};
139
140                 $data{fields}{name} = $name;
141                 $data{fields}{countries} = $countries;
142                 $data{fields}{text} = "";
143
144                 return;
145         }
146 }
147
148 sub h_end {
149         my $expat = shift;
150         my $element = shift;
151
152         if ($index == "2") {
153                 if ($data{element}{1} eq "alternativemonths"
154                  && $data{element}{2} eq "language") {
155                         foreach my $c (split(/,/, $data{fields}{countries})) {
156                                 my $m = $data{fields}{text};
157
158                                 $m =~ s/^[\t ]//g;
159                                 $m =~ s/[\t ]$//g;
160                                 $d{AM}{$data{fields}{name}}{$c} = $m;
161                         }
162                         $data{fields} = ();
163                 }
164         }
165
166         $index--;
167 }
168
169 sub h_char {
170         my $expat = shift;
171         my $string = shift;
172
173         if ($index == "2") {
174                 if ($data{element}{1} eq "alternativemonths"
175                  && $data{element}{2} eq "language") {
176                         $data{fields}{text} .= $string;
177                 }
178         }
179 }
180
181 #use Data::Dumper;
182 #my %D = get_xmldata();
183 #print Dumper(%D);
184 1;