| line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
|
1
|
|
|
|
|
|
|
# |
|
2
|
|
|
|
|
|
|
# $Id: GSM0338.pm,v 2.7 2017/06/10 17:23:50 dankogai Exp $ |
|
3
|
|
|
|
|
|
|
# |
|
4
|
|
|
|
|
|
|
package Encode::GSM0338; |
|
5
|
|
|
|
|
|
|
|
|
6
|
4
|
|
|
4
|
|
620
|
use strict; |
|
|
4
|
|
|
|
|
12
|
|
|
|
4
|
|
|
|
|
218
|
|
|
7
|
4
|
|
|
4
|
|
41
|
use warnings; |
|
|
4
|
|
|
|
|
12
|
|
|
|
4
|
|
|
|
|
141
|
|
|
8
|
4
|
|
|
4
|
|
26
|
use Carp; |
|
|
4
|
|
|
|
|
10
|
|
|
|
4
|
|
|
|
|
411
|
|
|
9
|
|
|
|
|
|
|
|
|
10
|
4
|
|
|
4
|
|
36
|
use vars qw($VERSION); |
|
|
4
|
|
|
|
|
15
|
|
|
|
4
|
|
|
|
|
487
|
|
|
11
|
|
|
|
|
|
|
$VERSION = do { my @r = ( q$Revision: 2.7 $ =~ /\d+/g ); sprintf "%d." . "%02d" x $#r, @r }; |
|
12
|
|
|
|
|
|
|
|
|
13
|
4
|
|
|
4
|
|
34
|
use Encode qw(:fallbacks); |
|
|
4
|
|
|
|
|
13
|
|
|
|
4
|
|
|
|
|
774
|
|
|
14
|
|
|
|
|
|
|
|
|
15
|
4
|
|
|
4
|
|
36
|
use parent qw(Encode::Encoding); |
|
|
4
|
|
|
|
|
12
|
|
|
|
4
|
|
|
|
|
42
|
|
|
16
|
|
|
|
|
|
|
__PACKAGE__->Define('gsm0338'); |
|
17
|
|
|
|
|
|
|
|
|
18
|
0
|
|
|
0
|
1
|
0
|
sub needs_lines { 1 } |
|
19
|
0
|
|
|
0
|
1
|
0
|
sub perlio_ok { 0 } |
|
20
|
|
|
|
|
|
|
|
|
21
|
4
|
|
|
4
|
|
535
|
use utf8; |
|
|
4
|
|
|
|
|
11
|
|
|
|
4
|
|
|
|
|
37
|
|
|
22
|
|
|
|
|
|
|
our %UNI2GSM = ( |
|
23
|
|
|
|
|
|
|
"\x{0040}" => "\x00", # COMMERCIAL AT |
|
24
|
|
|
|
|
|
|
"\x{000A}" => "\x0A", # LINE FEED |
|
25
|
|
|
|
|
|
|
"\x{000C}" => "\x1B\x0A", # FORM FEED |
|
26
|
|
|
|
|
|
|
"\x{000D}" => "\x0D", # CARRIAGE RETURN |
|
27
|
|
|
|
|
|
|
"\x{0020}" => "\x20", # SPACE |
|
28
|
|
|
|
|
|
|
"\x{0021}" => "\x21", # EXCLAMATION MARK |
|
29
|
|
|
|
|
|
|
"\x{0022}" => "\x22", # QUOTATION MARK |
|
30
|
|
|
|
|
|
|
"\x{0023}" => "\x23", # NUMBER SIGN |
|
31
|
|
|
|
|
|
|
"\x{0024}" => "\x02", # DOLLAR SIGN |
|
32
|
|
|
|
|
|
|
"\x{0025}" => "\x25", # PERCENT SIGN |
|
33
|
|
|
|
|
|
|
"\x{0026}" => "\x26", # AMPERSAND |
|
34
|
|
|
|
|
|
|
"\x{0027}" => "\x27", # APOSTROPHE |
|
35
|
|
|
|
|
|
|
"\x{0028}" => "\x28", # LEFT PARENTHESIS |
|
36
|
|
|
|
|
|
|
"\x{0029}" => "\x29", # RIGHT PARENTHESIS |
|
37
|
|
|
|
|
|
|
"\x{002A}" => "\x2A", # ASTERISK |
|
38
|
|
|
|
|
|
|
"\x{002B}" => "\x2B", # PLUS SIGN |
|
39
|
|
|
|
|
|
|
"\x{002C}" => "\x2C", # COMMA |
|
40
|
|
|
|
|
|
|
"\x{002D}" => "\x2D", # HYPHEN-MINUS |
|
41
|
|
|
|
|
|
|
"\x{002E}" => "\x2E", # FULL STOP |
|
42
|
|
|
|
|
|
|
"\x{002F}" => "\x2F", # SOLIDUS |
|
43
|
|
|
|
|
|
|
"\x{0030}" => "\x30", # DIGIT ZERO |
|
44
|
|
|
|
|
|
|
"\x{0031}" => "\x31", # DIGIT ONE |
|
45
|
|
|
|
|
|
|
"\x{0032}" => "\x32", # DIGIT TWO |
|
46
|
|
|
|
|
|
|
"\x{0033}" => "\x33", # DIGIT THREE |
|
47
|
|
|
|
|
|
|
"\x{0034}" => "\x34", # DIGIT FOUR |
|
48
|
|
|
|
|
|
|
"\x{0035}" => "\x35", # DIGIT FIVE |
|
49
|
|
|
|
|
|
|
"\x{0036}" => "\x36", # DIGIT SIX |
|
50
|
|
|
|
|
|
|
"\x{0037}" => "\x37", # DIGIT SEVEN |
|
51
|
|
|
|
|
|
|
"\x{0038}" => "\x38", # DIGIT EIGHT |
|
52
|
|
|
|
|
|
|
"\x{0039}" => "\x39", # DIGIT NINE |
|
53
|
|
|
|
|
|
|
"\x{003A}" => "\x3A", # COLON |
|
54
|
|
|
|
|
|
|
"\x{003B}" => "\x3B", # SEMICOLON |
|
55
|
|
|
|
|
|
|
"\x{003C}" => "\x3C", # LESS-THAN SIGN |
|
56
|
|
|
|
|
|
|
"\x{003D}" => "\x3D", # EQUALS SIGN |
|
57
|
|
|
|
|
|
|
"\x{003E}" => "\x3E", # GREATER-THAN SIGN |
|
58
|
|
|
|
|
|
|
"\x{003F}" => "\x3F", # QUESTION MARK |
|
59
|
|
|
|
|
|
|
"\x{0041}" => "\x41", # LATIN CAPITAL LETTER A |
|
60
|
|
|
|
|
|
|
"\x{0042}" => "\x42", # LATIN CAPITAL LETTER B |
|
61
|
|
|
|
|
|
|
"\x{0043}" => "\x43", # LATIN CAPITAL LETTER C |
|
62
|
|
|
|
|
|
|
"\x{0044}" => "\x44", # LATIN CAPITAL LETTER D |
|
63
|
|
|
|
|
|
|
"\x{0045}" => "\x45", # LATIN CAPITAL LETTER E |
|
64
|
|
|
|
|
|
|
"\x{0046}" => "\x46", # LATIN CAPITAL LETTER F |
|
65
|
|
|
|
|
|
|
"\x{0047}" => "\x47", # LATIN CAPITAL LETTER G |
|
66
|
|
|
|
|
|
|
"\x{0048}" => "\x48", # LATIN CAPITAL LETTER H |
|
67
|
|
|
|
|
|
|
"\x{0049}" => "\x49", # LATIN CAPITAL LETTER I |
|
68
|
|
|
|
|
|
|
"\x{004A}" => "\x4A", # LATIN CAPITAL LETTER J |
|
69
|
|
|
|
|
|
|
"\x{004B}" => "\x4B", # LATIN CAPITAL LETTER K |
|
70
|
|
|
|
|
|
|
"\x{004C}" => "\x4C", # LATIN CAPITAL LETTER L |
|
71
|
|
|
|
|
|
|
"\x{004D}" => "\x4D", # LATIN CAPITAL LETTER M |
|
72
|
|
|
|
|
|
|
"\x{004E}" => "\x4E", # LATIN CAPITAL LETTER N |
|
73
|
|
|
|
|
|
|
"\x{004F}" => "\x4F", # LATIN CAPITAL LETTER O |
|
74
|
|
|
|
|
|
|
"\x{0050}" => "\x50", # LATIN CAPITAL LETTER P |
|
75
|
|
|
|
|
|
|
"\x{0051}" => "\x51", # LATIN CAPITAL LETTER Q |
|
76
|
|
|
|
|
|
|
"\x{0052}" => "\x52", # LATIN CAPITAL LETTER R |
|
77
|
|
|
|
|
|
|
"\x{0053}" => "\x53", # LATIN CAPITAL LETTER S |
|
78
|
|
|
|
|
|
|
"\x{0054}" => "\x54", # LATIN CAPITAL LETTER T |
|
79
|
|
|
|
|
|
|
"\x{0055}" => "\x55", # LATIN CAPITAL LETTER U |
|
80
|
|
|
|
|
|
|
"\x{0056}" => "\x56", # LATIN CAPITAL LETTER V |
|
81
|
|
|
|
|
|
|
"\x{0057}" => "\x57", # LATIN CAPITAL LETTER W |
|
82
|
|
|
|
|
|
|
"\x{0058}" => "\x58", # LATIN CAPITAL LETTER X |
|
83
|
|
|
|
|
|
|
"\x{0059}" => "\x59", # LATIN CAPITAL LETTER Y |
|
84
|
|
|
|
|
|
|
"\x{005A}" => "\x5A", # LATIN CAPITAL LETTER Z |
|
85
|
|
|
|
|
|
|
"\x{005F}" => "\x11", # LOW LINE |
|
86
|
|
|
|
|
|
|
"\x{0061}" => "\x61", # LATIN SMALL LETTER A |
|
87
|
|
|
|
|
|
|
"\x{0062}" => "\x62", # LATIN SMALL LETTER B |
|
88
|
|
|
|
|
|
|
"\x{0063}" => "\x63", # LATIN SMALL LETTER C |
|
89
|
|
|
|
|
|
|
"\x{0064}" => "\x64", # LATIN SMALL LETTER D |
|
90
|
|
|
|
|
|
|
"\x{0065}" => "\x65", # LATIN SMALL LETTER E |
|
91
|
|
|
|
|
|
|
"\x{0066}" => "\x66", # LATIN SMALL LETTER F |
|
92
|
|
|
|
|
|
|
"\x{0067}" => "\x67", # LATIN SMALL LETTER G |
|
93
|
|
|
|
|
|
|
"\x{0068}" => "\x68", # LATIN SMALL LETTER H |
|
94
|
|
|
|
|
|
|
"\x{0069}" => "\x69", # LATIN SMALL LETTER I |
|
95
|
|
|
|
|
|
|
"\x{006A}" => "\x6A", # LATIN SMALL LETTER J |
|
96
|
|
|
|
|
|
|
"\x{006B}" => "\x6B", # LATIN SMALL LETTER K |
|
97
|
|
|
|
|
|
|
"\x{006C}" => "\x6C", # LATIN SMALL LETTER L |
|
98
|
|
|
|
|
|
|
"\x{006D}" => "\x6D", # LATIN SMALL LETTER M |
|
99
|
|
|
|
|
|
|
"\x{006E}" => "\x6E", # LATIN SMALL LETTER N |
|
100
|
|
|
|
|
|
|
"\x{006F}" => "\x6F", # LATIN SMALL LETTER O |
|
101
|
|
|
|
|
|
|
"\x{0070}" => "\x70", # LATIN SMALL LETTER P |
|
102
|
|
|
|
|
|
|
"\x{0071}" => "\x71", # LATIN SMALL LETTER Q |
|
103
|
|
|
|
|
|
|
"\x{0072}" => "\x72", # LATIN SMALL LETTER R |
|
104
|
|
|
|
|
|
|
"\x{0073}" => "\x73", # LATIN SMALL LETTER S |
|
105
|
|
|
|
|
|
|
"\x{0074}" => "\x74", # LATIN SMALL LETTER T |
|
106
|
|
|
|
|
|
|
"\x{0075}" => "\x75", # LATIN SMALL LETTER U |
|
107
|
|
|
|
|
|
|
"\x{0076}" => "\x76", # LATIN SMALL LETTER V |
|
108
|
|
|
|
|
|
|
"\x{0077}" => "\x77", # LATIN SMALL LETTER W |
|
109
|
|
|
|
|
|
|
"\x{0078}" => "\x78", # LATIN SMALL LETTER X |
|
110
|
|
|
|
|
|
|
"\x{0079}" => "\x79", # LATIN SMALL LETTER Y |
|
111
|
|
|
|
|
|
|
"\x{007A}" => "\x7A", # LATIN SMALL LETTER Z |
|
112
|
|
|
|
|
|
|
"\x{000C}" => "\x1B\x0A", # FORM FEED |
|
113
|
|
|
|
|
|
|
"\x{005B}" => "\x1B\x3C", # LEFT SQUARE BRACKET |
|
114
|
|
|
|
|
|
|
"\x{005C}" => "\x1B\x2F", # REVERSE SOLIDUS |
|
115
|
|
|
|
|
|
|
"\x{005D}" => "\x1B\x3E", # RIGHT SQUARE BRACKET |
|
116
|
|
|
|
|
|
|
"\x{005E}" => "\x1B\x14", # CIRCUMFLEX ACCENT |
|
117
|
|
|
|
|
|
|
"\x{007B}" => "\x1B\x28", # LEFT CURLY BRACKET |
|
118
|
|
|
|
|
|
|
"\x{007C}" => "\x1B\x40", # VERTICAL LINE |
|
119
|
|
|
|
|
|
|
"\x{007D}" => "\x1B\x29", # RIGHT CURLY BRACKET |
|
120
|
|
|
|
|
|
|
"\x{007E}" => "\x1B\x3D", # TILDE |
|
121
|
|
|
|
|
|
|
"\x{00A0}" => "\x1B", # NO-BREAK SPACE |
|
122
|
|
|
|
|
|
|
"\x{00A1}" => "\x40", # INVERTED EXCLAMATION MARK |
|
123
|
|
|
|
|
|
|
"\x{00A3}" => "\x01", # POUND SIGN |
|
124
|
|
|
|
|
|
|
"\x{00A4}" => "\x24", # CURRENCY SIGN |
|
125
|
|
|
|
|
|
|
"\x{00A5}" => "\x03", # YEN SIGN |
|
126
|
|
|
|
|
|
|
"\x{00A7}" => "\x5F", # SECTION SIGN |
|
127
|
|
|
|
|
|
|
"\x{00BF}" => "\x60", # INVERTED QUESTION MARK |
|
128
|
|
|
|
|
|
|
"\x{00C4}" => "\x5B", # LATIN CAPITAL LETTER A WITH DIAERESIS |
|
129
|
|
|
|
|
|
|
"\x{00C5}" => "\x0E", # LATIN CAPITAL LETTER A WITH RING ABOVE |
|
130
|
|
|
|
|
|
|
"\x{00C6}" => "\x1C", # LATIN CAPITAL LETTER AE |
|
131
|
|
|
|
|
|
|
"\x{00C9}" => "\x1F", # LATIN CAPITAL LETTER E WITH ACUTE |
|
132
|
|
|
|
|
|
|
"\x{00D1}" => "\x5D", # LATIN CAPITAL LETTER N WITH TILDE |
|
133
|
|
|
|
|
|
|
"\x{00D6}" => "\x5C", # LATIN CAPITAL LETTER O WITH DIAERESIS |
|
134
|
|
|
|
|
|
|
"\x{00D8}" => "\x0B", # LATIN CAPITAL LETTER O WITH STROKE |
|
135
|
|
|
|
|
|
|
"\x{00DC}" => "\x5E", # LATIN CAPITAL LETTER U WITH DIAERESIS |
|
136
|
|
|
|
|
|
|
"\x{00DF}" => "\x1E", # LATIN SMALL LETTER SHARP S |
|
137
|
|
|
|
|
|
|
"\x{00E0}" => "\x7F", # LATIN SMALL LETTER A WITH GRAVE |
|
138
|
|
|
|
|
|
|
"\x{00E4}" => "\x7B", # LATIN SMALL LETTER A WITH DIAERESIS |
|
139
|
|
|
|
|
|
|
"\x{00E5}" => "\x0F", # LATIN SMALL LETTER A WITH RING ABOVE |
|
140
|
|
|
|
|
|
|
"\x{00E6}" => "\x1D", # LATIN SMALL LETTER AE |
|
141
|
|
|
|
|
|
|
#"\x{00E7}" => "\x09", # LATIN SMALL LETTER C WITH CEDILLA |
|
142
|
|
|
|
|
|
|
"\x{00C7}" => "\x09", # LATIN CAPITAL LETTER C WITH CEDILLA |
|
143
|
|
|
|
|
|
|
"\x{00E8}" => "\x04", # LATIN SMALL LETTER E WITH GRAVE |
|
144
|
|
|
|
|
|
|
"\x{00E9}" => "\x05", # LATIN SMALL LETTER E WITH ACUTE |
|
145
|
|
|
|
|
|
|
"\x{00EC}" => "\x07", # LATIN SMALL LETTER I WITH GRAVE |
|
146
|
|
|
|
|
|
|
"\x{00F1}" => "\x7D", # LATIN SMALL LETTER N WITH TILDE |
|
147
|
|
|
|
|
|
|
"\x{00F2}" => "\x08", # LATIN SMALL LETTER O WITH GRAVE |
|
148
|
|
|
|
|
|
|
"\x{00F6}" => "\x7C", # LATIN SMALL LETTER O WITH DIAERESIS |
|
149
|
|
|
|
|
|
|
"\x{00F8}" => "\x0C", # LATIN SMALL LETTER O WITH STROKE |
|
150
|
|
|
|
|
|
|
"\x{00F9}" => "\x06", # LATIN SMALL LETTER U WITH GRAVE |
|
151
|
|
|
|
|
|
|
"\x{00FC}" => "\x7E", # LATIN SMALL LETTER U WITH DIAERESIS |
|
152
|
|
|
|
|
|
|
"\x{0393}" => "\x13", # GREEK CAPITAL LETTER GAMMA |
|
153
|
|
|
|
|
|
|
"\x{0394}" => "\x10", # GREEK CAPITAL LETTER DELTA |
|
154
|
|
|
|
|
|
|
"\x{0398}" => "\x19", # GREEK CAPITAL LETTER THETA |
|
155
|
|
|
|
|
|
|
"\x{039B}" => "\x14", # GREEK CAPITAL LETTER LAMDA |
|
156
|
|
|
|
|
|
|
"\x{039E}" => "\x1A", # GREEK CAPITAL LETTER XI |
|
157
|
|
|
|
|
|
|
"\x{03A0}" => "\x16", # GREEK CAPITAL LETTER PI |
|
158
|
|
|
|
|
|
|
"\x{03A3}" => "\x18", # GREEK CAPITAL LETTER SIGMA |
|
159
|
|
|
|
|
|
|
"\x{03A6}" => "\x12", # GREEK CAPITAL LETTER PHI |
|
160
|
|
|
|
|
|
|
"\x{03A8}" => "\x17", # GREEK CAPITAL LETTER PSI |
|
161
|
|
|
|
|
|
|
"\x{03A9}" => "\x15", # GREEK CAPITAL LETTER OMEGA |
|
162
|
|
|
|
|
|
|
"\x{20AC}" => "\x1B\x65", # EURO SIGN |
|
163
|
|
|
|
|
|
|
); |
|
164
|
|
|
|
|
|
|
our %GSM2UNI = reverse %UNI2GSM; |
|
165
|
|
|
|
|
|
|
our $ESC = "\x1b"; |
|
166
|
|
|
|
|
|
|
our $ATMARK = "\x40"; |
|
167
|
|
|
|
|
|
|
our $FBCHAR = "\x3F"; |
|
168
|
|
|
|
|
|
|
our $NBSP = "\x{00A0}"; |
|
169
|
|
|
|
|
|
|
|
|
170
|
|
|
|
|
|
|
#define ERR_DECODE_NOMAP "%s \"\\x%02" UVXf "\" does not map to Unicode" |
|
171
|
|
|
|
|
|
|
|
|
172
|
|
|
|
|
|
|
sub decode ($$;$) { |
|
173
|
761
|
|
|
761
|
1
|
1744
|
my ( $obj, $bytes, $chk ) = @_; |
|
174
|
761
|
100
|
|
|
|
1913
|
return undef unless defined $bytes; |
|
175
|
760
|
|
|
|
|
1723
|
my $str = substr($bytes, 0, 0); # to propagate taintedness; |
|
176
|
760
|
|
|
|
|
1990
|
while ( length $bytes ) { |
|
177
|
892
|
|
|
|
|
2028
|
my $c = substr( $bytes, 0, 1, '' ); |
|
178
|
892
|
|
|
|
|
1418
|
my $u; |
|
179
|
892
|
100
|
|
|
|
2508
|
if ( $c eq "\x00" ) { |
|
|
|
100
|
|
|
|
|
|
|
180
|
131
|
|
|
|
|
318
|
my $c2 = substr( $bytes, 0, 1, '' ); |
|
181
|
|
|
|
|
|
|
$u = |
|
182
|
|
|
|
|
|
|
!length $c2 ? $ATMARK |
|
183
|
|
|
|
|
|
|
: $c2 eq "\x00" ? "\x{0000}" |
|
184
|
131
|
50
|
|
|
|
1047
|
: exists $GSM2UNI{$c2} ? $ATMARK . $GSM2UNI{$c2} |
|
|
|
100
|
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
185
|
|
|
|
|
|
|
: $chk |
|
186
|
|
|
|
|
|
|
? croak sprintf( "\\x%02X\\x%02X does not map to Unicode", |
|
187
|
|
|
|
|
|
|
ord($c), ord($c2) ) |
|
188
|
|
|
|
|
|
|
: $ATMARK . $FBCHAR; |
|
189
|
|
|
|
|
|
|
|
|
190
|
|
|
|
|
|
|
} |
|
191
|
|
|
|
|
|
|
elsif ( $c eq $ESC ) { |
|
192
|
132
|
|
|
|
|
344
|
my $c2 = substr( $bytes, 0, 1, '' ); |
|
193
|
|
|
|
|
|
|
$u = |
|
194
|
|
|
|
|
|
|
exists $GSM2UNI{ $c . $c2 } ? $GSM2UNI{ $c . $c2 } |
|
195
|
132
|
50
|
|
|
|
1058
|
: exists $GSM2UNI{$c2} ? $NBSP . $GSM2UNI{$c2} |
|
|
|
100
|
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
196
|
|
|
|
|
|
|
: $chk |
|
197
|
|
|
|
|
|
|
? croak sprintf( "\\x%02X\\x%02X does not map to Unicode", |
|
198
|
|
|
|
|
|
|
ord($c), ord($c2) ) |
|
199
|
|
|
|
|
|
|
: $NBSP . $FBCHAR; |
|
200
|
|
|
|
|
|
|
} |
|
201
|
|
|
|
|
|
|
else { |
|
202
|
|
|
|
|
|
|
$u = |
|
203
|
|
|
|
|
|
|
exists $GSM2UNI{$c} |
|
204
|
629
|
50
|
|
|
|
28439
|
? $GSM2UNI{$c} |
|
|
|
50
|
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
205
|
|
|
|
|
|
|
: $chk ? ref $chk eq 'CODE' |
|
206
|
|
|
|
|
|
|
? $chk->( ord $c ) |
|
207
|
|
|
|
|
|
|
: croak sprintf( "\\x%02X does not map to Unicode", ord($c) ) |
|
208
|
|
|
|
|
|
|
: $FBCHAR; |
|
209
|
|
|
|
|
|
|
} |
|
210
|
764
|
|
|
|
|
2352
|
$str .= $u; |
|
211
|
|
|
|
|
|
|
} |
|
212
|
632
|
100
|
|
|
|
1585
|
$_[1] = $bytes if $chk; |
|
213
|
632
|
|
|
|
|
2022
|
return $str; |
|
214
|
|
|
|
|
|
|
} |
|
215
|
|
|
|
|
|
|
|
|
216
|
|
|
|
|
|
|
#define ERR_ENCODE_NOMAP "\"\\x{%04" UVxf "}\" does not map to %s" |
|
217
|
|
|
|
|
|
|
|
|
218
|
|
|
|
|
|
|
sub encode($$;$) { |
|
219
|
270
|
|
|
270
|
1
|
675
|
my ( $obj, $str, $chk ) = @_; |
|
220
|
270
|
100
|
|
|
|
702
|
return undef unless defined $str; |
|
221
|
269
|
|
|
|
|
836
|
my $bytes = substr($str, 0, 0); # to propagate taintedness |
|
222
|
269
|
|
|
|
|
728
|
while ( length $str ) { |
|
223
|
403
|
|
|
|
|
1309
|
my $u = substr( $str, 0, 1, '' ); |
|
224
|
403
|
|
|
|
|
677
|
my $c; |
|
225
|
|
|
|
|
|
|
$bytes .= |
|
226
|
|
|
|
|
|
|
exists $UNI2GSM{$u} |
|
227
|
403
|
50
|
|
|
|
2241
|
? $UNI2GSM{$u} |
|
|
|
100
|
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
228
|
|
|
|
|
|
|
: $chk ? ref $chk eq 'CODE' |
|
229
|
|
|
|
|
|
|
? $chk->( ord($u) ) |
|
230
|
|
|
|
|
|
|
: croak sprintf( "\\x{%04x} does not map to %s", |
|
231
|
|
|
|
|
|
|
ord($u), $obj->name ) |
|
232
|
|
|
|
|
|
|
: $FBCHAR; |
|
233
|
|
|
|
|
|
|
} |
|
234
|
141
|
100
|
|
|
|
388
|
$_[1] = $str if $chk; |
|
235
|
141
|
|
|
|
|
482
|
return $bytes; |
|
236
|
|
|
|
|
|
|
} |
|
237
|
|
|
|
|
|
|
|
|
238
|
|
|
|
|
|
|
1; |
|
239
|
|
|
|
|
|
|
__END__ |