root/websites/AjaxCom/com/cgi-lib/JSON/PP56.pm @ 4129

Revision 4129, 3.9 kB (checked in by kawa0117, 5 years ago)

depened module updated for AjaxCom? and AjaxTB (JSON-1.15)

Line 
1package JSON::PP56;
2
3use 5.006;
4use strict;
5
6my @properties;
7
8$JSON::PP56::VERSION = '0.13';
9
10BEGIN {
11    sub utf8::is_utf8 {
12        1; # It is considered that UTF8 flag on for Perl 5.6.
13    }
14
15    sub utf8::encode (\$) { # UTF8 flag off
16        ${$_[0]} = pack("C*", unpack("C*", ${$_[0]}));
17    }
18
19    sub utf8::decode (\$) { # UTF8 flag on
20        ${$_[0]} = pack("U*", unpack_emu(${$_[0]}));
21    }
22}
23
24eval q| require Unicode::String |;
25
26unless ($@) {
27    #print Unicode::String->VERSION;
28    if (Unicode::String->VERSION < 2.08) { # utf16be() exists more than v2.08
29        eval q| *Unicode::String::utf16be = *Unicode::String::utf16 |;
30    }
31
32    *JSON::PP::JSON_encode_ascii   = *_encode_ascii;
33    *JSON::PP::JSON_encode_latin1  = *_encode_latin1;
34    *JSON::PP::JSON_decode_unicode = *JSON::PP::_decode_unicode;
35
36    eval q|
37        sub Encode::encode {
38            my (undef, $str) = @_;
39            my $u = new Unicode::String;
40            $u->utf8($str);
41            $u->utf16be;
42        }
43
44        sub Encode::decode {
45            my (undef, $str) = @_;
46            my $u = new Unicode::String;
47            $u->utf16be($str);
48            my $utf8 = $u->utf8;
49            pack("U", unpack("U", $utf8)); # UTF8 flag on
50        }
51
52    |;
53    die $@ if ($@);
54
55    $JSON::PP::_ENABLE_UTF16 = 1;
56
57    push @JSON::PP::_properties, 'ascii', 'latin1';
58}
59else {
60    *JSON::PP::JSON_encode_ascii   = *_noop_encode_ascii;
61    *JSON::PP::JSON_decode_unicode = *_disable_decode_unicode;
62
63    eval q|
64        sub JSON::PP::ascii {
65            warn "ascii() is disable in Perl5.6x.";
66            $_[0]->{ascii} = 0; $_[0];
67        }
68
69        sub JSON::PP::latin1 {
70            warn "latin1() is disable in Perl5.6x.";
71            $_[0]->{latin1} = 0; $_[0];
72        }
73    |;
74}
75
76
77sub _encode_ascii {
78    join('',
79        map {
80            $_ <= 127 ?
81                chr($_) :
82            $_ <= 65535 ?
83                sprintf('\u%04x', $_) :
84                join("", map { '\u' . $_ }
85                        unpack("H4H4", Encode::encode('UTF-16BE', pack("U", $_))));
86        } unpack_emu($_[0])
87    );
88}
89
90
91sub _encode_latin1 {
92    join('',
93        map {
94            $_ <= 255 ?
95                chr($_) :
96            $_ <= 65535 ?
97                sprintf('\u%04x', $_) :
98                join("", map { '\u' . $_ }
99                        unpack("H4H4", Encode::encode('UTF-16BE', pack("U", $_))));
100        } unpack_emu($_[0])
101    );
102}
103
104
105sub unpack_emu { # for Perl 5.6 unpack warnings
106    my $str = $_[0];
107    my @ret;
108    my $is_utf8;
109
110    while ($str =~ /(?:
111          (
112             [\x00-\x7F]
113            |[\xC2-\xDF][\x80-\xBF]
114            |[\xE0][\xA0-\xBF][\x80-\xBF]
115            |[\xE1-\xEC][\x80-\xBF][\x80-\xBF]
116            |[\xED][\x80-\x9F][\x80-\xBF]
117            |[\xEE-\xEF][\x80-\xBF][\x80-\xBF]
118            |[\xF0][\x90-\xBF][\x80-\xBF][\x80-\xBF]
119            |[\xF1-\xF3][\x80-\xBF][\x80-\xBF][\x80-\xBF]
120            |[\xF4][\x80-\x8F][\x80-\xBF][\x80-\xBF]
121          )
122        | (.)
123    )/xg)
124    {
125        if (defined $1) {
126            $is_utf8 = 1 if (!defined $is_utf8);
127            if ($is_utf8) {
128                push @ret, unpack('U', $1);
129            }
130            else {
131                push @ret, unpack('C*', $1);
132            }
133        }
134        else {
135            $is_utf8 = 0 if (!defined $is_utf8);
136
137            if ($is_utf8) { # eventually, not utf8
138                return unpack('C*', $str);
139            }
140
141            push @ret, unpack('C', $2);
142        }
143    }
144
145    return @ret;
146}
147
148
149
150sub _noop_encode_ascii {
151    # noop
152}
153
154
155sub _disable_decode_unicode { chr(hex($_[0])); }
156
157
1581;
159__END__
160
161=pod
162
163=head1 NAME
164
165JSON::PP56 - Helper module in using JSON::PP in Perl 5.6
166
167=head1 DESCRIPTION
168
169JSON::PP calls internally.
170
171=head1 AUTHOR
172
173Makamaka Hannyaharamitu, E<lt>makamaka[at]cpan.orgE<gt>
174
175
176=head1 COPYRIGHT AND LICENSE
177
178Copyright 2007 by Makamaka Hannyaharamitu
179
180This library is free software; you can redistribute it and/or modify
181it under the same terms as Perl itself.
182
183=cut
184
Note: See TracBrowser for help on using the browser.