root/branches/sockfish/extlib/JSON/PP56.pm @ 3232

Revision 3232, 4.3 kB (checked in by bchoate, 12 months ago)

Updating JSON package to 2.12.

  • Property svn:keywords set to Id Revision
Line 
1package JSON::PP56;
2
3use 5.006;
4use strict;
5
6my @properties;
7
8$JSON::PP56::VERSION = '1.06';
9
10BEGIN {
11    sub utf8::is_utf8 {
12        my $len =  length $_[0]; # char length
13        {
14            use bytes; #  byte length;
15            return $len != length $_[0]; # if !=, UTF8-flagged on.
16        }
17    }
18
19
20    sub utf8::upgrade {
21        ; # noop;
22    }
23
24
25    sub utf8::downgrade (\$;$) {
26        return 1 unless ( utf8::is_utf8( ${$_[0]} ) );
27
28        if ( _is_valid_utf8(${$_[0]}) ) {
29            my $downgrade;
30            for my $c ( unpack("U*", ${$_[0]}) ) {
31                if ( $c < 256 ) {
32                    $downgrade .= pack("C", $c);
33                }
34                else {
35                    $downgrade .= pack("U", $c);
36                }
37            }
38            ${$_[0]} = $downgrade;
39            return 1;
40        }
41        else {
42            Carp::croak("Wide character in subroutine entry") unless ( $_[1] );
43            0;
44        }
45    }
46
47
48    sub utf8::encode (\$) { # UTF8 flag off
49        if ( utf8::is_utf8( ${$_[0]} ) ) {
50            ${$_[0]} = pack( "C*", unpack( "C*", ${$_[0]} ) );
51        }
52        else {
53            ${$_[0]} = pack( "U*", map {
54                if ( $_ > 127 ) {
55                    unpack ( "C*", pack("U*", $_) );
56                }
57                else {
58                    $_;
59                }
60            } unpack( "C*", ${$_[0]} ) );
61        }
62    }
63
64
65    sub utf8::decode (\$) { # UTF8 flag on
66        if ( _is_valid_utf8(${$_[0]}) ) {
67            ${$_[0]} = pack("U*", unpack("U*", ${$_[0]}));
68        }
69    }
70
71
72    *JSON::PP::JSON_PP_encode_ascii      = \&_encode_ascii;
73    *JSON::PP::JSON_PP_encode_latin1     = \&_encode_latin1;
74    *JSON::PP::JSON_PP_decode_surrogates = \&JSON::PP::_decode_surrogates;
75    *JSON::PP::JSON_PP_decode_unicode    = \&JSON::PP::_decode_unicode;
76}
77
78
79
80sub _encode_ascii {
81    join('',
82        map {
83            $_ <= 127 ?
84                chr($_) :
85            $_ <= 65535 ?
86                sprintf('\u%04x', $_) : sprintf('\u%x\u%x', JSON::PP::_encode_surrogates($_));
87        } _unpack_emu($_[0])
88    );
89}
90
91
92sub _encode_latin1 {
93    join('',
94        map {
95            $_ <= 255 ?
96                chr($_) :
97            $_ <= 65535 ?
98                sprintf('\u%04x', $_) : sprintf('\u%x\u%x', JSON::PP::_encode_surrogates($_));
99        } _unpack_emu($_[0])
100    );
101}
102
103
104sub _unpack_emu { # for Perl 5.6 unpack warnings
105    return   !utf8::is_utf8($_[0]) ? unpack('C*', $_[0]) 
106           : _is_valid_utf8($_[0]) ? unpack('U*', $_[0])
107           : unpack('C*', $_[0]);
108}
109
110
111sub _is_valid_utf8 {
112    my $str = $_[0];
113    my $is_utf8;
114
115    while ($str =~ /(?:
116          (
117             [\x00-\x7F]
118            |[\xC2-\xDF][\x80-\xBF]
119            |[\xE0][\xA0-\xBF][\x80-\xBF]
120            |[\xE1-\xEC][\x80-\xBF][\x80-\xBF]
121            |[\xED][\x80-\x9F][\x80-\xBF]
122            |[\xEE-\xEF][\x80-\xBF][\x80-\xBF]
123            |[\xF0][\x90-\xBF][\x80-\xBF][\x80-\xBF]
124            |[\xF1-\xF3][\x80-\xBF][\x80-\xBF][\x80-\xBF]
125            |[\xF4][\x80-\x8F][\x80-\xBF][\x80-\xBF]
126          )
127        | (.)
128    )/xg)
129    {
130        if (defined $1) {
131            $is_utf8 = 1 if (!defined $is_utf8);
132        }
133        else {
134            $is_utf8 = 0 if (!defined $is_utf8);
135            if ($is_utf8) { # eventually, not utf8
136                return;
137            }
138        }
139    }
140
141    return $is_utf8;
142}
143
144
145sub JSON::PP::incr_parse {
146    local $Carp::CarpLevel = 1;
147    ( $_[0]->{_incr_parser} ||= JSON::PP::IncrParser->new )->incr_parse( @_ );
148}
149
150
151sub JSON::PP::incr_text : lvalue {
152    $_[0]->{_incr_parser} ||= JSON::PP::IncrParser->new;
153
154    if ( $_[0]->{_incr_parser}->{incr_parsing} ) {
155        Carp::croak("incr_text can not be called when the incremental parser already started parsing");
156    }
157    $_[0]->{_incr_parser}->{incr_text};
158}
159
160
161sub JSON::PP::incr_skip {
162    ( $_[0]->{_incr_parser} ||= JSON::PP::IncrParser->new )->incr_skip;
163}
164
165
166sub JSON::PP::incr_reset {
167    ( $_[0]->{_incr_parser} ||= JSON::PP::IncrParser->new )->incr_reset;
168}
169
170
1711;
172__END__
173
174=pod
175
176=head1 NAME
177
178JSON::PP56 - Helper module in using JSON::PP in Perl 5.6
179
180=head1 DESCRIPTION
181
182JSON::PP calls internally.
183
184=head1 AUTHOR
185
186Makamaka Hannyaharamitu, E<lt>makamaka[at]cpan.orgE<gt>
187
188
189=head1 COPYRIGHT AND LICENSE
190
191Copyright 2007-2008 by Makamaka Hannyaharamitu
192
193This library is free software; you can redistribute it and/or modify
194it under the same terms as Perl itself.
195
196=cut
197
Note: See TracBrowser for help on using the browser.