diff --git a/haskell/msgpack.cabal b/haskell/msgpack.cabal index 02f1ec16..8400413a 100644 --- a/haskell/msgpack.cabal +++ b/haskell/msgpack.cabal @@ -1,5 +1,5 @@ Name: msgpack -Version: 0.6.1.1 +Version: 0.6.1.2 Synopsis: A Haskell implementation of MessagePack Description: A Haskell implementation of MessagePack @@ -21,11 +21,11 @@ Extra-source-files: Library Build-depends: base >=4 && <5, - transformers >= 0.2 && < 0.3, + mtl >= 2.0 && < 2.1, bytestring >= 0.9 && < 0.10, text >= 0.11 && < 0.12, - vector >= 0.7 && < 0.8, - attoparsec >= 0.8 && < 0.9, + vector >= 0.7 && < 0.10, + attoparsec >= 0.8 && < 0.10, binary >= 0.5.0 && < 0.5.1, data-binary-ieee754 >= 0.4 && < 0.5, deepseq >= 1.1 && <1.2, diff --git a/haskell/src/Data/MessagePack/Object.hs b/haskell/src/Data/MessagePack/Object.hs index aaad669c..bbd27e1f 100644 --- a/haskell/src/Data/MessagePack/Object.hs +++ b/haskell/src/Data/MessagePack/Object.hs @@ -29,7 +29,6 @@ module Data.MessagePack.Object( import Control.DeepSeq import Control.Exception import Control.Monad -import Control.Monad.Trans.Error () import qualified Data.Attoparsec as A import qualified Data.ByteString as B import qualified Data.ByteString.Lazy as BL diff --git a/perl/.gitignore b/perl/.gitignore deleted file mode 100644 index bf67c8ff..00000000 --- a/perl/.gitignore +++ /dev/null @@ -1,20 +0,0 @@ -META.yml -MYMETA.* -Makefile -Makefile.old -MessagePack.bs -MessagePack.o -blib/ -inc/ -msgpack/ -t/std/ -pack.o -pm_to_blib -unpack.o -MANIFEST -ppport.h -.testenv/ -xshelper.h -*.swp -*~ - diff --git a/perl/.shipit b/perl/.shipit deleted file mode 100644 index 3a66936b..00000000 --- a/perl/.shipit +++ /dev/null @@ -1,4 +0,0 @@ -steps = FindVersion, ChangeVersion, CheckChangeLog, DistTest, Commit, Tag, MakeDist, UploadCPAN -MakeDist.destination=~/.shipit-dist/ -git.tagpattern = perl-%v -git.push_to = origin diff --git a/perl/Changes b/perl/Changes deleted file mode 100644 index d219b4a1..00000000 --- a/perl/Changes +++ /dev/null @@ -1,169 +0,0 @@ -0.35 - - - address issue/20 (cho45): Data::MessagePack did not finish correctly - when was given devided packed data - -0.34 - - - do not use the corrupt my_snprintf(%ll[du]) on win32(kazuho) - -0.33 - - - fix tests (gfx) - - optimize unpacking routines in Data::MessagePack::PP (gfx) - -0.32 - - - add tests to detect Alpha problems reported via CPAN testers (gfx) - -0.31 - - - update Module::Install::XSUtil for ccache support (gfx) - - add version check at bootstrap in order to avoid load old .so (gfx) - -0.30 - - - fix utf8 mode not to be reseted by $unpacker->reset method (gfx) - -0.29 - - - add $unpacker->utf8 mode, decoding strings as UTF-8 (gfx) - -0.28 - - - added more tests(gfx) - - refactor the PP code(gfx) - -0.27 - - - * 6d9a629 perl: modified trivial codes in PP::Unpacker(makamaka) - - * ead8edc modified be unpack_(u)int64 in PP(makamaka) - -0.26 - - - fixed a serious code typo in PP(makamaka) - -0.25 - - (NO FEATURE CHANGES) - - oops. I failed releng. - -0.24 - - Fixed a lot of streaming unpacking issues (tokuhirom, gfx) - - Fixed unpacking issues for 64 bit integers on 32 bit perls (gfx) - - Improved performance, esp. in unpacking (gfx) - -0.23 - - (NO FEATURE CHANGES) - - fixed english docs(hanekomu++) - -0.22 - - - fixed issue on ithreads(broken from 0.21) - -0.21 - - - doc enhancments - - micro performance tuning. - -0.20 - - - first production ready release with PP driver. - -0.16_04 - - - no feature changes - -0.16_02 - - - document enhancement(tokuhirom) - - M::I::XSUtil 0.26 is broken. use 0.27. - -0.16_01 - - - added PP version (used in cases PERL_DATA_MESSAGEPACK=pp or fail to load XS). - - made Makefile.PL PP configurable. - - test_pp in author's test - - modified t/05_preferred_int.t for Win32 - (makamaka) - -0.16 - - - tests on 64bit machines with -Duselongdouble - (reported by andk) - -0.15 - - - better argument validation. - (Dan Kogai) - -0.14 - - - fixed segv on serializing cyclic reference - (Dan Kogai) - -0.13 - - - clearly specify requires_c99(), because msgpack C header requires C99. - -0.12 - - - PERL_NO_GET_CONTEXT makes horrible dTHXs. remove it. - -0.11 - - - oops(no feature changes) - -0.10 - - - added more test cases. - - fixed portability issue - - (reviewed by gfx++) - -0.09_01 - - - fixed memory leak issue(reported by Maxime Soulé) - -0.09 - - - support NVTYPE=="long double" or IVTYPE=="long long" environment - (thanks to Jun Kuriyama++) - -0.08 - - - fixed PVNV issue... - -0.07 - - - do not use switch (SvTYPE(val)). - -0.06 - - - use SvNOK. - -0.05 - - - change type detection for old perl - -0.04 - - - check SvROK first(reported by yappo++) - - PreferInteger: faster string to integer conversion; support negative value - (frsyuki++) - - make PreferInteger variable magical and remove get_sv from _msgpack_pack_sv - (frsyuki++) - -0.03 - - - performance tuning for too long string - - fixed memory leaks in stream unpacker - -0.02 - - - added $Data::MessagePack::PreferInteger - (requested by yappo++) - -0.01 - - - initial release to CPAN diff --git a/perl/MANIFEST.SKIP b/perl/MANIFEST.SKIP deleted file mode 100644 index 2a184b51..00000000 --- a/perl/MANIFEST.SKIP +++ /dev/null @@ -1,30 +0,0 @@ -\bRCS\b -\bCVS\b -^MANIFEST\. -^Makefile$ -^MYMETA\.(?:yml|json)$ -~$ -^# -\.old$ -\.swp$ -~$ -^blib/ -^pm_to_blib -^MakeMaker-\d -\.gz$ -\.cvsignore -^t/9\d_.*\.t -^t/perlcritic -^tools/ -\.svn/ -^[^/]+\.yaml$ -^[^/]+\.pl$ -^\.shipit$ -^\.git/ -\.sw[pon]$ -^\.gitignore$ -\.o$ -\.bs$ -^Data-MessagePack-[0-9.]+/ -^\.testenv/test_pp.pl -^ppport.h$ diff --git a/perl/Makefile.PL b/perl/Makefile.PL deleted file mode 100644 index 111b705c..00000000 --- a/perl/Makefile.PL +++ /dev/null @@ -1,112 +0,0 @@ -# Usage: Makefile.PL --pp # disable XS -# Makefile.PL -g # add -g to the compiler and disable optimization flags -use inc::Module::Install; -use Module::Install::XSUtil 0.36; - -name 'Data-MessagePack'; -all_from 'lib/Data/MessagePack.pm'; -readme_from('lib/Data/MessagePack.pm'); - -perl_version '5.008000'; -license 'perl'; - -tests 't/*.t'; -recursive_author_tests('xt'); - - -if ( $] >= 5.008005 and want_xs() ) { - my $has_c99 = c99_available(); # msgpack C library requires C99. - - if ( $has_c99 ) { - requires_c99(); - use_xshelper(); - cc_warnings; - cc_src_paths('xs-src'); - - if($Module::Install::AUTHOR) { - postamble qq{test :: test_pp\n\n}; - } - } - else { - print < 1.89; # old versions of BigInt were broken -} - -clean_files qw{ - *.stackdump - *.gcov *.gcda *.gcno - *.out - nytprof - cover_db -}; - -# copy modules -if ($Module::Install::AUTHOR && -d File::Spec->catfile('..', 'msgpack')) { - mkdir 'msgpack' unless -d 'msgpack'; - require File::Copy; - for my $src (<../msgpack/*.h>) { - File::Copy::copy($src, 'msgpack/') or die "copy failed: $!"; - } - - mkdir 't/std'; - for my $data(<../test/*.{json,mpac}>) { - File::Copy::copy($data, 't/std') or die "copy failed: $!"; - } -} - -requires 'Test::More' => 0.94; # done_testing -test_requires('Test::Requires'); - -test_with_env( test_pp => PERL_DATA_MESSAGEPACK => 'pp' ); - -repository('http://github.com/msgpack/msgpack'); -auto_include; -WriteAll; - -# copied from Makefile.PL in Text::Xslate. -sub test_with_env { - my($name, %env) = @_; - - my $dir = '.testenv'; - if(not -e $dir) { - mkdir $dir or die "Cannot mkdir '.testenv': $!"; - } - clean_files($dir); - - { - open my $out, '>', "$dir/$name.pl" - or die "Cannot open '$dir/$name.pl' for writing: $!"; - print $out "# This file sets the env for 'make $name', \n"; - print $out "# generated by $0 at ", scalar(localtime), ".\n"; - print $out "# DO NOT EDIT THIS FILE DIRECTLY.\n"; - print $out "\n"; - - while(my($name, $value) = each %env) { - printf $out '$ENV{q{%s}} = q{%s};'."\n", $name, $value; - } - } - - # repeat testing for pure Perl mode - # see also ExtUtils::MM_Any::test_via_harness() - - my $t = q{$(FULLPERLRUN) -MExtUtils::Command::MM -e} - .q{ "do q[%s]; test_harness($(TEST_VERBOSE), '$(INST_LIB)', '$(INST_ARCHLIB)')"} - .q{ $(TEST_FILES)}; - - postamble qq{$name :: pure_all\n} - . qq{\t} . q{$(NOECHO) $(ECHO) TESTING: } . $name . qq{\n} - . qq{\t} . sprintf($t, "$dir/$name.pl") . qq{\n\n} - - . qq{testall :: $name\n\n}; - return; -} diff --git a/perl/README b/perl/README deleted file mode 100644 index 3f25f70c..00000000 --- a/perl/README +++ /dev/null @@ -1,139 +0,0 @@ -NAME - Data::MessagePack - MessagePack serialising/deserialising - -SYNOPSIS - use Data::MessagePack; - - my $packed = Data::MessagePack->pack($dat); - my $unpacked = Data::MessagePack->unpack($dat); - -DESCRIPTION - This module converts Perl data structures to MessagePack and vice versa. - -ABOUT MESSAGEPACK FORMAT - MessagePack is a binary-based efficient object serialization format. It - enables to exchange structured objects between many languages like JSON. - But unlike JSON, it is very fast and small. - - ADVANTAGES - PORTABLE - The MessagePack format does not depend on language nor byte order. - - SMALL IN SIZE - say length(JSON::XS::encode_json({a=>1, b=>2})); # => 13 - say length(Storable::nfreeze({a=>1, b=>2})); # => 21 - say length(Data::MessagePack->pack({a=>1, b=>2})); # => 7 - - The MessagePack format saves memory than JSON and Storable format. - - STREAMING DESERIALIZER - MessagePack supports streaming deserializer. It is useful for - networking such as RPC. See Data::MessagePack::Unpacker for details. - - If you want to get more information about the MessagePack format, please - visit to . - -METHODS - my $packed = Data::MessagePack->pack($data[, $max_depth]); - Pack the $data to messagepack format string. - - This method throws an exception when the perl structure is nested - more than $max_depth levels(default: 512) in order to detect - circular references. - - Data::MessagePack->pack() throws an exception when encountering - blessed object, because MessagePack is language-independent format. - - my $unpacked = Data::MessagePack->unpack($msgpackstr); - unpack the $msgpackstr to a MessagePack format string. - -Configuration Variables - $Data::MessagePack::PreferInteger - Packs a string as an integer, when it looks like an integer. - -SPEED - This is a result of benchmark/serialize.pl and benchmark/deserialize.pl - on my SC440(Linux 2.6.32-23-server #37-Ubuntu SMP). (You should - benchmark them with your data if the speed matters, of course.) - - -- serialize - JSON::XS: 2.3 - Data::MessagePack: 0.24 - Storable: 2.21 - Benchmark: running json, mp, storable for at least 1 CPU seconds... - json: 1 wallclock secs ( 1.00 usr + 0.01 sys = 1.01 CPU) @ 141939.60/s (n=143359) - mp: 1 wallclock secs ( 1.06 usr + 0.00 sys = 1.06 CPU) @ 355500.94/s (n=376831) - storable: 1 wallclock secs ( 1.12 usr + 0.00 sys = 1.12 CPU) @ 38399.11/s (n=43007) - Rate storable json mp - storable 38399/s -- -73% -89% - json 141940/s 270% -- -60% - mp 355501/s 826% 150% -- - - -- deserialize - JSON::XS: 2.3 - Data::MessagePack: 0.24 - Storable: 2.21 - Benchmark: running json, mp, storable for at least 1 CPU seconds... - json: 0 wallclock secs ( 1.05 usr + 0.00 sys = 1.05 CPU) @ 179442.86/s (n=188415) - mp: 0 wallclock secs ( 1.01 usr + 0.00 sys = 1.01 CPU) @ 212909.90/s (n=215039) - storable: 2 wallclock secs ( 1.14 usr + 0.00 sys = 1.14 CPU) @ 114974.56/s (n=131071) - Rate storable json mp - storable 114975/s -- -36% -46% - json 179443/s 56% -- -16% - mp 212910/s 85% 19% -- - -CAVEAT - Unpacking 64 bit integers - This module can unpack 64 bit integers even if your perl does not - support them (i.e. where "perl -V:ivsize" is 4), but you cannot - calculate these values unless you use "Math::BigInt". - -TODO - Error handling - MessagePack cannot deal with complex scalars such as object - references, filehandles, and code references. We should report the - errors more kindly. - - Streaming deserializer - The current implementation of the streaming deserializer does not - have internal buffers while some other bindings (such as Ruby - binding) does. This limitation will astonish those who try to unpack - byte streams with an arbitrary buffer size (e.g. - "while(read($socket, $buffer, $arbitrary_buffer_size)) { ... }"). We - should implement the internal buffer for the unpacker. - - UTF8 mode - Data::MessagePack::Unpacker supports utf8 mode, which decodes - strings as UTF8-8. << Data::MessagePack->unpack >> should support - utf8 mode in a future. - -AUTHORS - Tokuhiro Matsuno - - Makamaka Hannyaharamitu - - gfx - -THANKS TO - Jun Kuriyama - - Dan Kogai - - FURUHASHI Sadayuki - - hanekomu - - Kazuho Oku - -LICENSE - This library is free software; you can redistribute it and/or modify it - under the same terms as Perl itself. - -SEE ALSO - is the official web site for the MessagePack - format. - - Data::MessagePack::Unpacker - - AnyEvent::MPRPC - diff --git a/perl/benchmark/data.pl b/perl/benchmark/data.pl deleted file mode 100755 index 6908d1cc..00000000 --- a/perl/benchmark/data.pl +++ /dev/null @@ -1,6 +0,0 @@ -+{ - "method" => "handleMessage", - "params" => [ "user1", "we were just talking", "foo\nbar\nbaz\nqux" ], - "id" => undef, - "array" => [ 1, 1024, 70000, -5, 1e5, 1e7, 1, 0, 3.14, sqrt(2), 1 .. 100 ], -}; diff --git a/perl/benchmark/deserialize.pl b/perl/benchmark/deserialize.pl deleted file mode 100644 index faa2582f..00000000 --- a/perl/benchmark/deserialize.pl +++ /dev/null @@ -1,27 +0,0 @@ -use strict; -use warnings; -use Data::MessagePack; -use JSON; -use Storable; -use Benchmark ':all'; - -#$Data::MessagePack::PreferInteger = 1; - -my $a = do 'benchmark/data.pl'; - -my $j = JSON::encode_json($a); -my $m = Data::MessagePack->pack($a); -my $s = Storable::freeze($a); - -print "-- deserialize\n"; -print "$JSON::Backend: ", $JSON::Backend->VERSION, "\n"; -print "Data::MessagePack: $Data::MessagePack::VERSION\n"; -print "Storable: $Storable::VERSION\n"; -cmpthese timethese( - -1 => { - json => sub { JSON::decode_json($j) }, - mp => sub { Data::MessagePack->unpack($m) }, - storable => sub { Storable::thaw($s) }, - } -); - diff --git a/perl/benchmark/serialize.pl b/perl/benchmark/serialize.pl deleted file mode 100644 index 4982ff61..00000000 --- a/perl/benchmark/serialize.pl +++ /dev/null @@ -1,21 +0,0 @@ -use strict; -use warnings; -use Data::MessagePack; -use JSON; -use Storable; -use Benchmark ':all'; - -my $a = do 'benchmark/data.pl'; - -print "-- serialize\n"; -print "$JSON::Backend: ", $JSON::Backend->VERSION, "\n"; -print "Data::MessagePack: $Data::MessagePack::VERSION\n"; -print "Storable: $Storable::VERSION\n"; -cmpthese timethese( - -1 => { - json => sub { JSON::encode_json($a) }, - storable => sub { Storable::freeze($a) }, - mp => sub { Data::MessagePack->pack($a) }, - } -); - diff --git a/perl/benchmark/size.pl b/perl/benchmark/size.pl deleted file mode 100644 index cf5c1ce6..00000000 --- a/perl/benchmark/size.pl +++ /dev/null @@ -1,37 +0,0 @@ -#!/usr/bin/perl -use strict; -use warnings; -use Data::MessagePack; -use Storable; -use Text::SimpleTable; - -my @entries = ( - '1', - '3.14', - '{}', - '[]', - "[('a')x10]", - "{('a')x10}", - "+{1,+{1,+{}}}", - "+[+[+[]]]", -); - -my $table = Text::SimpleTable->new([15, 'src'], [9, 'storable'], [7, 'msgpack']); - -for my $src (@entries) { - my $e = eval $src; - die $@ if $@; - - $table->row( - $src, - length(Storable::nfreeze(ref $e ? $e : \$e)), - length(Data::MessagePack->pack($e)), - ); -} - -print "perl: $]\n"; -print "Storable: $Storable::VERSION\n"; -print "Data::MessagePack: $Data::MessagePack::VERSION\n"; -print "\n"; -print $table->draw; - diff --git a/perl/lib/Data/MessagePack.pm b/perl/lib/Data/MessagePack.pm deleted file mode 100644 index 4a1da179..00000000 --- a/perl/lib/Data/MessagePack.pm +++ /dev/null @@ -1,210 +0,0 @@ -package Data::MessagePack; -use strict; -use warnings; -use 5.008001; - -our $VERSION = '0.34'; -our $PreferInteger = 0; -our $Canonical = 0; - -sub true () { - require Data::MessagePack::Boolean; - no warnings 'once'; - return $Data::MessagePack::Boolean::true; -} - -sub false () { - require Data::MessagePack::Boolean; - no warnings 'once'; - return $Data::MessagePack::Boolean::false; -} - -if ( !__PACKAGE__->can('pack') ) { # this idea comes from Text::Xslate - my $backend = $ENV{PERL_DATA_MESSAGEPACK} || ($ENV{PERL_ONLY} ? 'pp' : ''); - if ( $backend !~ /\b pp \b/xms ) { - eval { - require XSLoader; - XSLoader::load(__PACKAGE__, $VERSION); - }; - die $@ if $@ && $backend =~ /\b xs \b/xms; # force XS - } - if ( !__PACKAGE__->can('pack') ) { - require 'Data/MessagePack/PP.pm'; - } -} - -1; -__END__ - -=head1 NAME - -Data::MessagePack - MessagePack serialising/deserialising - -=head1 SYNOPSIS - - use Data::MessagePack; - - my $packed = Data::MessagePack->pack($dat); - my $unpacked = Data::MessagePack->unpack($dat); - -=head1 DESCRIPTION - -This module converts Perl data structures to MessagePack and vice versa. - -=head1 ABOUT MESSAGEPACK FORMAT - -MessagePack is a binary-based efficient object serialization format. -It enables to exchange structured objects between many languages like JSON. -But unlike JSON, it is very fast and small. - -=head2 ADVANTAGES - -=over 4 - -=item PORTABLE - -The MessagePack format does not depend on language nor byte order. - -=item SMALL IN SIZE - - say length(JSON::XS::encode_json({a=>1, b=>2})); # => 13 - say length(Storable::nfreeze({a=>1, b=>2})); # => 21 - say length(Data::MessagePack->pack({a=>1, b=>2})); # => 7 - -The MessagePack format saves memory than JSON and Storable format. - -=item STREAMING DESERIALIZER - -MessagePack supports streaming deserializer. It is useful for networking such as RPC. -See L for details. - -=back - -If you want to get more information about the MessagePack format, please visit to L. - -=head1 METHODS - -=over 4 - -=item my $packed = Data::MessagePack->pack($data[, $max_depth]); - -Pack the $data to messagepack format string. - -This method throws an exception when the perl structure is nested more than $max_depth levels(default: 512) in order to detect circular references. - -Data::MessagePack->pack() throws an exception when encountering blessed object, because MessagePack is language-independent format. - -=item my $unpacked = Data::MessagePack->unpack($msgpackstr); - -unpack the $msgpackstr to a MessagePack format string. - -=back - -=head1 Configuration Variables - -=over 4 - -=item $Data::MessagePack::PreferInteger - -Packs a string as an integer, when it looks like an integer. - -=back - -=head1 SPEED - -This is a result of benchmark/serialize.pl and benchmark/deserialize.pl on my SC440(Linux 2.6.32-23-server #37-Ubuntu SMP). -(You should benchmark them with B data if the speed matters, of course.) - - -- serialize - JSON::XS: 2.3 - Data::MessagePack: 0.24 - Storable: 2.21 - Benchmark: running json, mp, storable for at least 1 CPU seconds... - json: 1 wallclock secs ( 1.00 usr + 0.01 sys = 1.01 CPU) @ 141939.60/s (n=143359) - mp: 1 wallclock secs ( 1.06 usr + 0.00 sys = 1.06 CPU) @ 355500.94/s (n=376831) - storable: 1 wallclock secs ( 1.12 usr + 0.00 sys = 1.12 CPU) @ 38399.11/s (n=43007) - Rate storable json mp - storable 38399/s -- -73% -89% - json 141940/s 270% -- -60% - mp 355501/s 826% 150% -- - - -- deserialize - JSON::XS: 2.3 - Data::MessagePack: 0.24 - Storable: 2.21 - Benchmark: running json, mp, storable for at least 1 CPU seconds... - json: 0 wallclock secs ( 1.05 usr + 0.00 sys = 1.05 CPU) @ 179442.86/s (n=188415) - mp: 0 wallclock secs ( 1.01 usr + 0.00 sys = 1.01 CPU) @ 212909.90/s (n=215039) - storable: 2 wallclock secs ( 1.14 usr + 0.00 sys = 1.14 CPU) @ 114974.56/s (n=131071) - Rate storable json mp - storable 114975/s -- -36% -46% - json 179443/s 56% -- -16% - mp 212910/s 85% 19% -- - -=head1 CAVEAT - -=head2 Unpacking 64 bit integers - -This module can unpack 64 bit integers even if your perl does not support them -(i.e. where C<< perl -V:ivsize >> is 4), but you cannot calculate these values -unless you use C. - -=head1 TODO - -=over - -=item Error handling - -MessagePack cannot deal with complex scalars such as object references, -filehandles, and code references. We should report the errors more kindly. - -=item Streaming deserializer - -The current implementation of the streaming deserializer does not have internal -buffers while some other bindings (such as Ruby binding) does. This limitation -will astonish those who try to unpack byte streams with an arbitrary buffer size -(e.g. C<< while(read($socket, $buffer, $arbitrary_buffer_size)) { ... } >>). -We should implement the internal buffer for the unpacker. - -=item UTF8 mode - -Data::MessagePack::Unpacker supports utf8 mode, which decodes strings -as UTF8-8. << Data::MessagePack->unpack >> should support utf8 mode in a -future. - -=back - -=head1 AUTHORS - -Tokuhiro Matsuno - -Makamaka Hannyaharamitu - -gfx - -=head1 THANKS TO - -Jun Kuriyama - -Dan Kogai - -FURUHASHI Sadayuki - -hanekomu - -Kazuho Oku - -=head1 LICENSE - -This library is free software; you can redistribute it and/or modify -it under the same terms as Perl itself. - -=head1 SEE ALSO - -L is the official web site for the MessagePack format. - -L - -L - -=cut diff --git a/perl/lib/Data/MessagePack/Boolean.pm b/perl/lib/Data/MessagePack/Boolean.pm deleted file mode 100644 index 2bb3ecad..00000000 --- a/perl/lib/Data/MessagePack/Boolean.pm +++ /dev/null @@ -1,14 +0,0 @@ -package Data::MessagePack::Boolean; -use strict; -use overload - 'bool' => sub { ${ $_[0] } }, - '0+' => sub { ${ $_[0] } }, - '""' => sub { ${ $_[0] } ? 'true' : 'false' }, - - fallback => 1, -; - -our $true = do { bless \(my $dummy = 1) }; -our $false = do { bless \(my $dummy = 0) }; - -1; diff --git a/perl/lib/Data/MessagePack/PP.pm b/perl/lib/Data/MessagePack/PP.pm deleted file mode 100644 index 65ce24b4..00000000 --- a/perl/lib/Data/MessagePack/PP.pm +++ /dev/null @@ -1,628 +0,0 @@ -package Data::MessagePack::PP; -use 5.008001; -use strict; -use warnings; -no warnings 'recursion'; - -use Carp (); -use B (); - -# See also -# http://redmine.msgpack.org/projects/msgpack/wiki/FormatSpec -# http://cpansearch.perl.org/src/YAPPO/Data-Model-0.00006/lib/Data/Model/Driver/Memcached.pm -# http://frox25.no-ip.org/~mtve/wiki/MessagePack.html : reference to using CORE::pack, CORE::unpack - -BEGIN { - my $unpack_int64_slow; - my $unpack_uint64_slow; - - if(!eval { pack 'Q', 1 }) { # don't have quad types - # emulates quad types with Math::BigInt. - # very slow but works well. - $unpack_int64_slow = sub { - require Math::BigInt; - my $high = unpack_uint32( $_[0], $_[1] ); - my $low = unpack_uint32( $_[0], $_[1] + 4); - - if($high < 0xF0000000) { # positive - $high = Math::BigInt->new( $high ); - $low = Math::BigInt->new( $low ); - return +($high << 32 | $low)->bstr; - } - else { # negative - $high = Math::BigInt->new( ~$high ); - $low = Math::BigInt->new( ~$low ); - return +( -($high << 32 | $low + 1) )->bstr; - } - }; - $unpack_uint64_slow = sub { - require Math::BigInt; - my $high = Math::BigInt->new( unpack_uint32( $_[0], $_[1]) ); - my $low = Math::BigInt->new( unpack_uint32( $_[0], $_[1] + 4) ); - return +($high << 32 | $low)->bstr; - }; - } - - *unpack_uint16 = sub { return unpack 'n', substr( $_[0], $_[1], 2 ) }; - *unpack_uint32 = sub { return unpack 'N', substr( $_[0], $_[1], 4 ) }; - - # for pack and unpack compatibility - if ( $] < 5.010 ) { - # require $Config{byteorder}; my $bo_is_le = ( $Config{byteorder} =~ /^1234/ ); - # which better? - my $bo_is_le = unpack ( 'd', "\x00\x00\x00\x00\x00\x00\xf0\x3f") == 1; # 1.0LE - - *unpack_int16 = sub { - my $v = unpack 'n', substr( $_[0], $_[1], 2 ); - return $v ? $v - 0x10000 : 0; - }; - *unpack_int32 = sub { - no warnings; # avoid for warning about Hexadecimal number - my $v = unpack 'N', substr( $_[0], $_[1], 4 ); - return $v ? $v - 0x100000000 : 0; - }; - - # In reality, since 5.9.2 '>' is introduced. but 'n!' and 'N!'? - if($bo_is_le) { - *pack_uint64 = sub { - my @v = unpack( 'V2', pack( 'Q', $_[0] ) ); - return pack 'CN2', 0xcf, @v[1,0]; - }; - *pack_int64 = sub { - my @v = unpack( 'V2', pack( 'q', $_[0] ) ); - return pack 'CN2', 0xd3, @v[1,0]; - }; - *pack_double = sub { - my @v = unpack( 'V2', pack( 'd', $_[0] ) ); - return pack 'CN2', 0xcb, @v[1,0]; - }; - - *unpack_float = sub { - my @v = unpack( 'v2', substr( $_[0], $_[1], 4 ) ); - return unpack( 'f', pack( 'n2', @v[1,0] ) ); - }; - *unpack_double = sub { - my @v = unpack( 'V2', substr( $_[0], $_[1], 8 ) ); - return unpack( 'd', pack( 'N2', @v[1,0] ) ); - }; - - *unpack_int64 = $unpack_int64_slow || sub { - my @v = unpack( 'V*', substr( $_[0], $_[1], 8 ) ); - return unpack( 'q', pack( 'N2', @v[1,0] ) ); - }; - *unpack_uint64 = $unpack_uint64_slow || sub { - my @v = unpack( 'V*', substr( $_[0], $_[1], 8 ) ); - return unpack( 'Q', pack( 'N2', @v[1,0] ) ); - }; - } - else { # big endian - *pack_uint64 = sub { return pack 'CQ', 0xcf, $_[0]; }; - *pack_int64 = sub { return pack 'Cq', 0xd3, $_[0]; }; - *pack_double = sub { return pack 'Cd', 0xcb, $_[0]; }; - - *unpack_float = sub { return unpack( 'f', substr( $_[0], $_[1], 4 ) ); }; - *unpack_double = sub { return unpack( 'd', substr( $_[0], $_[1], 8 ) ); }; - *unpack_int64 = $unpack_int64_slow || sub { unpack 'q', substr( $_[0], $_[1], 8 ); }; - *unpack_uint64 = $unpack_uint64_slow || sub { unpack 'Q', substr( $_[0], $_[1], 8 ); }; - } - } - else { # 5.10.0 or later - # pack_int64/uint64 are used only when the perl support quad types - *pack_uint64 = sub { return pack 'CQ>', 0xcf, $_[0]; }; - *pack_int64 = sub { return pack 'Cq>', 0xd3, $_[0]; }; - *pack_double = sub { return pack 'Cd>', 0xcb, $_[0]; }; - - *unpack_float = sub { return unpack( 'f>', substr( $_[0], $_[1], 4 ) ); }; - *unpack_double = sub { return unpack( 'd>', substr( $_[0], $_[1], 8 ) ); }; - *unpack_int16 = sub { return unpack( 'n!', substr( $_[0], $_[1], 2 ) ); }; - *unpack_int32 = sub { return unpack( 'N!', substr( $_[0], $_[1], 4 ) ); }; - - *unpack_int64 = $unpack_int64_slow || sub { return unpack( 'q>', substr( $_[0], $_[1], 8 ) ); }; - *unpack_uint64 = $unpack_uint64_slow || sub { return unpack( 'Q>', substr( $_[0], $_[1], 8 ) ); }; - } - - # fixin package symbols - no warnings 'once'; - sub pack :method; - sub unpack :method; - *Data::MessagePack::pack = \&pack; - *Data::MessagePack::unpack = \&unpack; - - @Data::MessagePack::Unpacker::ISA = qw(Data::MessagePack::PP::Unpacker); - - *true = \&Data::MessagePack::true; - *false = \&Data::MessagePack::false; -} - -sub _unexpected { - Carp::confess("Unexpected " . sprintf(shift, @_) . " found"); -} - - -# -# PACK -# - -our $_max_depth; - -sub pack :method { - Carp::croak('Usage: Data::MessagePack->pack($dat [,$max_depth])') if @_ < 2; - $_max_depth = defined $_[2] ? $_[2] : 512; # init - return _pack( $_[1] ); -} - - -sub _pack { - my ( $value ) = @_; - - local $_max_depth = $_max_depth - 1; - - if ( $_max_depth < 0 ) { - Carp::croak("perl structure exceeds maximum nesting level (max_depth set too low?)"); - } - - return CORE::pack( 'C', 0xc0 ) if ( not defined $value ); - - if ( ref($value) eq 'ARRAY' ) { - my $num = @$value; - my $header = - $num < 16 ? CORE::pack( 'C', 0x90 + $num ) - : $num < 2 ** 16 - 1 ? CORE::pack( 'Cn', 0xdc, $num ) - : $num < 2 ** 32 - 1 ? CORE::pack( 'CN', 0xdd, $num ) - : _unexpected("number %d", $num) - ; - return join( '', $header, map { _pack( $_ ) } @$value ); - } - - elsif ( ref($value) eq 'HASH' ) { - my $num = keys %$value; - my $header = - $num < 16 ? CORE::pack( 'C', 0x80 + $num ) - : $num < 2 ** 16 - 1 ? CORE::pack( 'Cn', 0xde, $num ) - : $num < 2 ** 32 - 1 ? CORE::pack( 'CN', 0xdf, $num ) - : _unexpected("number %d", $num) - ; - - if ($Data::MessagePack::Canonical) { - return join( '', $header, map { _pack( $_ ), _pack($value->{$_}) } sort { $a cmp $b } keys %$value ); - } else { - return join( '', $header, map { _pack( $_ ) } %$value ); - } - } - - elsif ( ref( $value ) eq 'Data::MessagePack::Boolean' ) { - return CORE::pack( 'C', ${$value} ? 0xc3 : 0xc2 ); - } - - - my $b_obj = B::svref_2object( \$value ); - my $flags = $b_obj->FLAGS; - - if ( $flags & ( B::SVf_IOK | B::SVp_IOK ) ) { - - if ($value >= 0) { - return $value <= 127 ? CORE::pack 'C', $value - : $value < 2 ** 8 ? CORE::pack 'CC', 0xcc, $value - : $value < 2 ** 16 ? CORE::pack 'Cn', 0xcd, $value - : $value < 2 ** 32 ? CORE::pack 'CN', 0xce, $value - : pack_uint64( $value ); - } - else { - return -$value <= 32 ? CORE::pack 'C', ($value & 255) - : -$value <= 2 ** 7 ? CORE::pack 'Cc', 0xd0, $value - : -$value <= 2 ** 15 ? CORE::pack 'Cn', 0xd1, $value - : -$value <= 2 ** 31 ? CORE::pack 'CN', 0xd2, $value - : pack_int64( $value ); - } - - } - elsif ( $flags & B::SVf_POK ) { # raw / check needs before dboule - - if ( $Data::MessagePack::PreferInteger ) { - if ( $value =~ /^-?[0-9]+$/ ) { # ok? - # checks whether $value is in (u)int32 - my $ivalue = 0 + $value; - if (!( - $ivalue > 0xFFFFFFFF - or $ivalue < '-'.0x80000000 # for XS compat - or $ivalue != B::svref_2object(\$ivalue)->int_value - )) { - return _pack( $ivalue ); - } - # fallthrough - } - # fallthrough - } - - utf8::encode( $value ) if utf8::is_utf8( $value ); - - my $num = length $value; - my $header = - $num < 32 ? CORE::pack( 'C', 0xa0 + $num ) - : $num < 2 ** 16 - 1 ? CORE::pack( 'Cn', 0xda, $num ) - : $num < 2 ** 32 - 1 ? CORE::pack( 'CN', 0xdb, $num ) - : _unexpected('number %d', $num) - ; - - return $header . $value; - - } - elsif ( $flags & ( B::SVf_NOK | B::SVp_NOK ) ) { # double only - return pack_double( $value ); - } - else { - _unexpected("data type %s", $b_obj); - } - -} - -# -# UNPACK -# - -our $_utf8 = 0; -my $p; # position variables for speed. - -sub _insufficient { - Carp::confess("Insufficient bytes (pos=$p, type=@_)"); -} - -sub unpack :method { - $p = 0; # init - my $data = _unpack( $_[1] ); - if($p < length($_[1])) { - Carp::croak("Data::MessagePack->unpack: extra bytes"); - } - return $data; -} - -my $T_RAW = 0x01; -my $T_ARRAY = 0x02; -my $T_MAP = 0x04; -my $T_DIRECT = 0x08; # direct mapping (e.g. 0xc0 <-> nil) - -my @typemap = ( (0x00) x 256 ); - -$typemap[$_] |= $T_ARRAY for - 0x90 .. 0x9f, # fix array - 0xdc, # array16 - 0xdd, # array32 -; -$typemap[$_] |= $T_MAP for - 0x80 .. 0x8f, # fix map - 0xde, # map16 - 0xdf, # map32 -; -$typemap[$_] |= $T_RAW for - 0xa0 .. 0xbf, # fix raw - 0xda, # raw16 - 0xdb, # raw32 -; - -my @byte2value; -foreach my $pair( - [0xc3, true], - [0xc2, false], - [0xc0, undef], - - (map { [ $_, $_ ] } 0x00 .. 0x7f), # positive fixnum - (map { [ $_, $_ - 0x100 ] } 0xe0 .. 0xff), # negative fixnum -) { - $typemap[ $pair->[0] ] |= $T_DIRECT; - $byte2value[ $pair->[0] ] = $pair->[1]; -} - -sub _fetch_size { - my($value_ref, $byte, $x16, $x32, $x_fixbits) = @_; - if ( $byte == $x16 ) { - $p += 2; - $p <= length(${$value_ref}) or _insufficient('x/16'); - return unpack 'n', substr( ${$value_ref}, $p - 2, 2 ); - } - elsif ( $byte == $x32 ) { - $p += 4; - $p <= length(${$value_ref}) or _insufficient('x/32'); - return unpack 'N', substr( ${$value_ref}, $p - 4, 4 ); - } - else { # fix raw - return $byte & ~$x_fixbits; - } -} - -sub _unpack { - my ( $value ) = @_; - $p < length($value) or _insufficient('header byte'); - # get a header byte - my $byte = ord( substr $value, $p, 1 ); - $p++; - - # +/- fixnum, nil, true, false - return $byte2value[$byte] if $typemap[$byte] & $T_DIRECT; - - if ( $typemap[$byte] & $T_RAW ) { - my $size = _fetch_size(\$value, $byte, 0xda, 0xdb, 0xa0); - my $s = substr( $value, $p, $size ); - length($s) == $size or _insufficient('raw'); - $p += $size; - utf8::decode($s) if $_utf8; - return $s; - } - elsif ( $typemap[$byte] & $T_ARRAY ) { - my $size = _fetch_size(\$value, $byte, 0xdc, 0xdd, 0x90); - my @array; - push @array, _unpack( $value ) while --$size >= 0; - return \@array; - } - elsif ( $typemap[$byte] & $T_MAP ) { - my $size = _fetch_size(\$value, $byte, 0xde, 0xdf, 0x80); - my %map; - while(--$size >= 0) { - no warnings; # for undef key case - my $key = _unpack( $value ); - my $val = _unpack( $value ); - $map{ $key } = $val; - } - return \%map; - } - - elsif ( $byte == 0xcc ) { # uint8 - $p++; - $p <= length($value) or _insufficient('uint8'); - return CORE::unpack( 'C', substr( $value, $p - 1, 1 ) ); - } - elsif ( $byte == 0xcd ) { # uint16 - $p += 2; - $p <= length($value) or _insufficient('uint16'); - return unpack_uint16( $value, $p - 2 ); - } - elsif ( $byte == 0xce ) { # unit32 - $p += 4; - $p <= length($value) or _insufficient('uint32'); - return unpack_uint32( $value, $p - 4 ); - } - elsif ( $byte == 0xcf ) { # unit64 - $p += 8; - $p <= length($value) or _insufficient('uint64'); - return unpack_uint64( $value, $p - 8 ); - } - elsif ( $byte == 0xd3 ) { # int64 - $p += 8; - $p <= length($value) or _insufficient('int64'); - return unpack_int64( $value, $p - 8 ); - } - elsif ( $byte == 0xd2 ) { # int32 - $p += 4; - $p <= length($value) or _insufficient('int32'); - return unpack_int32( $value, $p - 4 ); - } - elsif ( $byte == 0xd1 ) { # int16 - $p += 2; - $p <= length($value) or _insufficient('int16'); - return unpack_int16( $value, $p - 2 ); - } - elsif ( $byte == 0xd0 ) { # int8 - $p++; - $p <= length($value) or _insufficient('int8'); - return CORE::unpack 'c', substr( $value, $p - 1, 1 ); - } - elsif ( $byte == 0xcb ) { # double - $p += 8; - $p <= length($value) or _insufficient('double'); - return unpack_double( $value, $p - 8 ); - } - elsif ( $byte == 0xca ) { # float - $p += 4; - $p <= length($value) or _insufficient('float'); - return unpack_float( $value, $p - 4 ); - } - else { - _unexpected("byte 0x%02x", $byte); - } -} - - -# -# Data::MessagePack::Unpacker -# - -package - Data::MessagePack::PP::Unpacker; - -sub new { - bless { - pos => 0, - utf8 => 0, - buff => '', - }, shift; -} - -sub utf8 { - my $self = shift; - $self->{utf8} = (@_ ? shift : 1); - return $self; -} - -sub get_utf8 { - my($self) = @_; - return $self->{utf8}; -} - -sub execute_limit { - execute( @_ ); -} - -sub execute { - my ( $self, $data, $offset, $limit ) = @_; - $offset ||= 0; - my $value = substr( $data, $offset, $limit ? $limit : length $data ); - my $len = length $value; - - $self->{buff} .= $value; - local $self->{stack} = []; - - #$p = 0; - #eval { Data::MessagePack::PP::_unpack($self->{buff}) }; - #warn "[$p][$@]"; - $p = 0; - - while ( length($self->{buff}) > $p ) { - _count( $self, $self->{buff} ) or last; - - while ( @{ $self->{stack} } > 0 && --$self->{stack}->[-1] == 0) { - pop @{ $self->{stack} }; - } - - if (@{$self->{stack}} == 0) { - $self->{is_finished}++; - last; - } - } - $self->{pos} = $p; - - return $p + $offset; -} - - -sub _count { - my ( $self, $value ) = @_; - no warnings; # FIXME - my $byte = unpack( 'C', substr( $value, $p++, 1 ) ); # get header - - Carp::croak('invalid data') unless defined $byte; - - # +/- fixnum, nil, true, false - return 1 if $typemap[$byte] & $T_DIRECT; - - if ( $typemap[$byte] & $T_RAW ) { - my $num; - if ( $byte == 0xda ) { - $num = unpack 'n', substr( $value, $p, 2 ); - $p += 2; - } - elsif ( $byte == 0xdb ) { - $num = unpack 'N', substr( $value, $p, 4 ); - $p += 4; - } - else { # fix raw - $num = $byte & ~0xa0; - } - $p += $num; - return 1; - } - elsif ( $typemap[$byte] & $T_ARRAY ) { - my $num; - if ( $byte == 0xdc ) { # array 16 - $num = unpack 'n', substr( $value, $p, 2 ); - $p += 2; - } - elsif ( $byte == 0xdd ) { # array 32 - $num = unpack 'N', substr( $value, $p, 4 ); - $p += 4; - } - else { # fix array - $num = $byte & ~0x90; - } - - if ( $num ) { - push @{ $self->{stack} }, $num + 1; - } - - return 1; - } - elsif ( $typemap[$byte] & $T_MAP ) { - my $num; - if ( $byte == 0xde ) { # map 16 - $num = unpack 'n', substr( $value, $p, 2 ); - $p += 2; - } - elsif ( $byte == 0xdf ) { # map 32 - $num = unpack 'N', substr( $value, $p, 4 ); - $p += 4; - } - else { # fix map - $num = $byte & ~0x80; - } - - if ( $num ) { - push @{ $self->{stack} }, $num * 2 + 1; # a pair - } - - return 1; - } - - elsif ( $byte >= 0xcc and $byte <= 0xcf ) { # uint - $p += $byte == 0xcc ? 1 - : $byte == 0xcd ? 2 - : $byte == 0xce ? 4 - : $byte == 0xcf ? 8 - : Data::MessagePack::PP::_unexpected("byte 0x%02x", $byte); - return 1; - } - - elsif ( $byte >= 0xd0 and $byte <= 0xd3 ) { # int - $p += $byte == 0xd0 ? 1 - : $byte == 0xd1 ? 2 - : $byte == 0xd2 ? 4 - : $byte == 0xd3 ? 8 - : Data::MessagePack::PP::_unexpected("byte 0x%02x", $byte); - return 1; - } - elsif ( $byte == 0xca or $byte == 0xcb ) { # float, double - $p += $byte == 0xca ? 4 : 8; - return 1; - } - else { - Data::MessagePack::PP::_unexpected("byte 0x%02x", $byte); - } - - return 0; -} - - -sub data { - my($self) = @_; - local $Data::MessagePack::PP::_utf8 = $self->{utf8}; - return Data::MessagePack->unpack( substr($self->{buff}, 0, $self->{pos}) ); -} - - -sub is_finished { - my ( $self ) = @_; - return $self->{is_finished}; -} - -sub reset :method { - $_[0]->{buff} = ''; - $_[0]->{pos} = 0; - $_[0]->{is_finished} = 0; -} - -1; -__END__ - -=pod - -=head1 NAME - -Data::MessagePack::PP - Pure Perl implementation of Data::MessagePack - -=head1 DESCRIPTION - -This module is used by L internally. - -=head1 SEE ALSO - -L, -L, -L, - -=head1 AUTHOR - -makamaka - -=head1 COPYRIGHT AND LICENSE - -This library is free software; you can redistribute it and/or modify -it under the same terms as Perl itself. - -=cut diff --git a/perl/lib/Data/MessagePack/Unpacker.pod b/perl/lib/Data/MessagePack/Unpacker.pod deleted file mode 100644 index 04cb0a47..00000000 --- a/perl/lib/Data/MessagePack/Unpacker.pod +++ /dev/null @@ -1,76 +0,0 @@ -=head1 NAME - -Data::MessagePack::Unpacker - messagepack streaming deserializer - -=head1 SYNOPSIS - - use Data::Dumper; - my $up = Data::MessagePack::Unpacker->new; - - open my $fh, $data or die $!; - - my $offset = 0; - while( read($fh, my $buf, 1024) ) { - $offset = $up->execute($buf, $offset); - if($up->is_finished) { - print Dumper($up->data); - } - } - -=head1 DESCRIPTION - -This is a streaming deserializer for messagepack. - -=head1 METHODS - -=over 4 - -=item my $up = Data::MessagePack::Unpacker->new() - -creates a new instance of the stream deserializer. - -=item $up->utf8([$bool]) - -sets utf8 mode. true if I<$bool> is omitted. -returns I<$up> itself. - -If utf8 mode is enabled, strings will be decoded as UTF-8. - -The utf8 mode is disabled by default. - -=item my $ret = $up->get_utf8() - -returns the utf8 mode flag of I<$up>. - -=item $offset = $up->execute($data, $offset); - -=item $offset = $up->execute_limit($data, $offset, $limit) - -parses unpacked I<$data> from I<$offset> to I<$limit>. -returns a new offset of I<$data>, which is for the next . - -If I<$data> is insufficient, I<$offset> does not change, saving -I<$data> in internal buffers. - -=item my $bool = $up->is_finished(); - -is this deserializer finished? - -=item my $data = $up->data(); - -returns the deserialized object. - -=item $up->reset(); - -resets the stream deserializer, without memory zone. - -=back - -=head1 AUTHORS - -Tokuhiro Matsuno - -=head1 SEE ALSO - -L - diff --git a/perl/t/00_compile.t b/perl/t/00_compile.t deleted file mode 100644 index 29c6ca05..00000000 --- a/perl/t/00_compile.t +++ /dev/null @@ -1,9 +0,0 @@ -use strict; -use warnings; -use Test::More tests => 1; -use Config; -use_ok 'Data::MessagePack'; -diag ( "Testing Data::MessagePack/$Data::MessagePack::VERSION (", - $INC{'Data/MessagePack/PP.pm'} ? 'PP' : 'XS', ")" ); - -diag "byteoder: $Config{byteorder}, ivsize=$Config{ivsize}"; diff --git a/perl/t/01_pack.t b/perl/t/01_pack.t deleted file mode 100644 index 8c619809..00000000 --- a/perl/t/01_pack.t +++ /dev/null @@ -1,66 +0,0 @@ -use t::Util; -use Test::More; -use Data::MessagePack; - -sub packit { - local $_ = unpack("H*", Data::MessagePack->pack($_[0])); - s/(..)/$1 /g; - s/ $//; - $_; -} - -sub pis ($$) { - is packit($_[0]), $_[1], 'dump ' . $_[1]; -} - -my @dat = ( - 0, '00', - (my $foo="0")+0, '00', - {2 => undef}, '81 a1 32 c0', - do {no warnings; my $foo = 10; "$foo"; $foo = undef; $foo} => 'c0', # PVIV but !POK && !IOK - 1, '01', - 127, '7f', - 128, 'cc 80', - 255, 'cc ff', - 256, 'cd 01 00', - 65535, 'cd ff ff', - 65536, 'ce 00 01 00 00', - -1, 'ff', - -32, 'e0', - -33, 'd0 df', - -128, 'd0 80', - -129, 'd1 ff 7f', - -32768, 'd1 80 00', - -32769, 'd2 ff ff 7f ff', - 1.0, 'cb 3f f0 00 00 00 00 00 00', - do { my $x=3.0;my $y = "$x";$x }, 'a1 33', # PVNV - "", 'a0', - "a", 'a1 61', - "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", 'bf 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61', - "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", 'da 00 20 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61', - undef, 'c0', - Data::MessagePack::true(), 'c3', - Data::MessagePack::false(), 'c2', - [], '90', - [+[]], '91 90', - [[], undef], '92 90 c0', - {'a', 0}, '81 a1 61 00', - 8388608, 'ce 00 80 00 00', - - [undef, false, true], '93 c0 c2 c3', - ["", "a", "bc", "def"], '94 a0 a1 61 a2 62 63 a3 64 65 66', - [[], [[undef]]], '92 90 91 91 c0', - [undef, false, true], '93 c0 c2 c3', - [[0, 64, 127], [-32, -16, -1]], '92 93 00 40 7f 93 e0 f0 ff', - [0, -128, -1, 0, -32768, -1, 0, -2147483648, -1], '99 00 d0 80 ff 00 d1 80 00 ff 00 d2 80 00 00 00 ff', - 2147483648, 'ce 80 00 00 00', - -2147483648, 'd2 80 00 00 00', - 'a' x 0x0100, 'da 01 00' . (' 61' x 0x0100), - [(undef) x 0x0100], 'dc 01 00' . (' c0' x 0x0100), -); -plan tests => 1*(scalar(@dat)/2); - -for (my $i=0; $iunpack($v); -} - -sub pis ($$) { - is_deeply unpackit($_[0]), $_[1], 'dump ' . $_[0] - or do { - diag( 'got:', explain(unpackit($_[0])) ); - diag( 'expected:', explain($_[1]) ); - }; -} - -my @dat = do 't/data.pl' or die $@; - -plan tests => 1*(scalar(@dat)/2); - -for (my $i=0; $inew; -sub unpackit { - my $v = $_[0]; - $v =~ s/ //g; - $v = pack 'H*', $v; - $up->reset; - my $ret = $up->execute($v, 0); - if ($ret != length($v)) { - fail "extra bytes"; - } - return $up->data; -} - -sub pis ($$) { - is_deeply unpackit($_[0]), $_[1], 'dump ' . $_[0]; -} - -my @dat = do 't/data.pl'; - -plan tests => 1*(scalar(@dat)/2) + 3; - -isa_ok $up, 'Data::MessagePack::Unpacker'; -for (my $i=0; $inew(); - $up->execute("\x95", 0); # array marker - for (1..5) { - $up->execute("\xc0", 0); # nil - } - ok $up->is_finished, 'finished'; - is_deeply $up->data, [undef, undef, undef, undef, undef], 'array, is_deeply'; -} - diff --git a/perl/t/04_invert.t b/perl/t/04_invert.t deleted file mode 100644 index e1d565bf..00000000 --- a/perl/t/04_invert.t +++ /dev/null @@ -1,24 +0,0 @@ -use Test::More; -use Data::MessagePack; -use t::Util; -no warnings 'uninitialized'; # i need this. i need this. - -sub invert { - return Data::MessagePack->unpack( - Data::MessagePack->pack($_[0]), - ); -} - -sub pis ($) { - is_deeply invert($_[0]), $_[0], 'dump ' . $_[0]; -} - -my @dat = do 't/data.pl'; - -plan tests => 1*(scalar(@dat)/2); - -for (my $i=0; $ipack($_[0])); - s/(..)/$1 /g; - s/ $//; - $_; -} - -sub pis ($$) { - if (ref $_[1]) { - like packit($_[0]), $_[1], 'dump ' . $_[1]; - } else { - is packit($_[0]), $_[1], 'dump ' . $_[1]; - } - # is(Dumper(Data::MessagePack->unpack(Data::MessagePack->pack($_[0]))), Dumper($_[0])); -} - -my $is_win = $^O eq 'MSWin32'; -my @dat = ( - '', 'a0', - '0', '00', - '1', '01', - '10', '0a', - '-1', 'ff', - '-10', 'f6', - '-', 'a1 2d', - ''.0xEFFF => 'cd ef ff', - ''.0xFFFF => 'cd ff ff', - ''.0xFFFFFF => 'ce 00 ff ff ff', - ''.0xFFFFFFFF => 'ce ff ff ff ff', - ''.0xFFFFFFFFF => 'ab 36 38 37 31 39 34 37 36 37 33 35', - ''.0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFF => $is_win ? - qr{^(b5 38 2e 33 30 37 36 37 34 39 37 33 36 35 35 37 32 65 2b 30 33 34|b8 38 2e 33 30 37 36 37 34 39 37 33 36 35 35 37 32 34 32 31 65 2b 30 33 34)$} - : qr{^(b4 38 2e 33 30 37 36 37 34 39 37 33 36 35 35 37 32 65 2b 33 34|b7 38 2e 33 30 37 36 37 34 39 37 33 36 35 35 37 32 34 32 31 65 2b 33 34)$}, - '-'.0x8000000 => 'd2 f8 00 00 00', - '-'.0x80000000 => 'd2 80 00 00 00', - '-'.0x800000000 => 'ac 2d 33 34 33 35 39 37 33 38 33 36 38', - '-'.0x8000000000 => 'ad 2d 35 34 39 37 35 35 38 31 33 38 38 38', - '-'.0x800000000000000000000000000000 => $is_win ? - qr{^(b6 2d 36 2e 36 34 36 31 33 39 39 37 38 39 32 34 35 38 65 2b 30 33 35|b9 2d 36 2e 36 34 36 31 33 39 39 37 38 39 32 34 35 37 39 33 36 65 2b 30 33 35)} - : qr{^(b5 2d 36 2e 36 34 36 31 33 39 39 37 38 39 32 34 35 38 65 2b 33 35|b8 2d 36 2e 36 34 36 31 33 39 39 37 38 39 32 34 35 37 39 33 36 65 2b 33 35)}, - {'0' => '1'}, '81 00 01', - {'abc' => '1'}, '81 a3 61 62 63 01', -); -plan tests => 1*(scalar(@dat)/2) + 2; - -for (my $i=0; $i 64; -use t::Util; - -my $input = [ - false,true,null,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1, - 127,127,255,65535,4294967295,-32,-32,-128,-32768, - -2147483648,0.0,-0.0, 3.0,-3.0,"a","a",("a" x 70000),"","","", - [0],[0],[0],[],[],[],{},{},{}, - {"a" => 97},{"abc" => 97},{"xyz" => 97},[[]], [["foo"], ["bar"]], - [["foo", true, false, null, 42]], -]; - -my $packed = Data::MessagePack->pack($input); -is_deeply(Data::MessagePack->unpack($packed), $input); - -{ - my $up = Data::MessagePack::Unpacker->new(); - $up->execute($packed, 0); - ok $up->is_finished; - is_deeply $up->data, $input; -} - -{ - my $up = Data::MessagePack::Unpacker->new(); - $packed x= 3; - - my $offset = 0; - for my $i(1 .. 3) { - note "block $i (offset: $offset/".length($packed).")"; - note "starting 3 bytes: ", join " ", map { unpack 'H2', $_ } - split //, substr($packed, $offset, 3); - - $offset = $up->execute($packed, $offset); - ok $up->is_finished, 'finished'; - my $data = $up->data; - is scalar(@{$data}), scalar(@{$input}), 'size of @{$data}'; - is_deeply $data, $input, "block $i, offset $offset"; - $up->reset(); - } -} - -{ - my $s = ''; - foreach my $datum(reverse @{$input}) { - $s .= Data::MessagePack->pack($datum); - } - - my $up = Data::MessagePack::Unpacker->new(); - - my $offset = 0; - for my $datum(reverse @{$input}) { - $offset = $up->execute($s, $offset); - is_deeply $up->data, $datum, "offset $offset/" . length($s); - $up->reset(); - } -} - diff --git a/perl/t/07_break.t b/perl/t/07_break.t deleted file mode 100644 index cf3f1079..00000000 --- a/perl/t/07_break.t +++ /dev/null @@ -1,23 +0,0 @@ -use Test::More; -use Data::MessagePack; -use t::Util; - -plan tests => 4; - -my $d = Data::MessagePack->unpack(Data::MessagePack->pack({ - nil => undef, - true => true, - false => false, - foo => [undef, true, false], -})); - -$d->{nil} = 42; -is $d->{nil}, 42; - -$d->{true} = 43; -is $d->{true}, 43; - -$d->{false} = 44; -is $d->{false}, 44; - -is_deeply $d->{foo}, [undef, true, false]; diff --git a/perl/t/08_cycle.t b/perl/t/08_cycle.t deleted file mode 100644 index 2bd66c10..00000000 --- a/perl/t/08_cycle.t +++ /dev/null @@ -1,28 +0,0 @@ -use t::Util; -use Test::More; -use Data::MessagePack; - -plan tests => 6; - -my $aref = [0]; -$aref->[1] = $aref; -eval { Data::MessagePack->pack($aref) }; -ok $@, $@; - -my $href = {}; -$href->{cycle} = $href; -eval { Data::MessagePack->pack($aref) }; -ok $@, $@; - -$aref = [0,[1,2]]; -eval { Data::MessagePack->pack($aref) }; -ok !$@; - -eval { Data::MessagePack->pack($aref, 3) }; -ok !$@; - -eval { Data::MessagePack->pack($aref, 2) }; -ok $@, $@; - -eval { Data::MessagePack->pack($aref, -1) }; -ok $@, $@; diff --git a/perl/t/09_stddata.t b/perl/t/09_stddata.t deleted file mode 100644 index f98d696b..00000000 --- a/perl/t/09_stddata.t +++ /dev/null @@ -1,42 +0,0 @@ -#!perl -w -# Testing standard dataset in msgpack/test/*.{json,mpac}. -# Don't edit msgpack/perl/t/std/*, which are just copies. -use strict; -use Test::More; -use t::Util; - -use Data::MessagePack; - -sub slurp { - open my $fh, '<:raw', $_[0] or die "failed to open '$_[0]': $!"; - local $/; - return scalar <$fh>; -} - -my @data = do { - my $json = slurp("t/std/cases.json"); - $json =~ s/:/=>/g; - @{ eval $json }; -}; - -my $mpac1 = slurp("t/std/cases.mpac"); -my $mpac2 = slurp("t/std/cases_compact.mpac"); - -my $mps = Data::MessagePack::Unpacker->new(); - -my $t = 1; -for my $mpac($mpac1, $mpac2) { - note "mpac", $t++; - - my $offset = 0; - my $i = 0; - while($offset < length($mpac)) { - $offset = $mps->execute($mpac, $offset); - ok $mps->is_finished, "data[$i] : is_finished"; - is_deeply $mps->data, $data[$i], "data[$i]"; - $mps->reset; - $i++; - } -} - -done_testing; diff --git a/perl/t/10_splitted_bytes.t b/perl/t/10_splitted_bytes.t deleted file mode 100644 index d94472d2..00000000 --- a/perl/t/10_splitted_bytes.t +++ /dev/null @@ -1,40 +0,0 @@ -#!perl - -# This feature is not yet supported, but 0.23 (or former) caused SEGV in this code, -# so we put it here. - -use strict; -use warnings; -use Data::MessagePack; -use Test::More; -use t::Util; - -my $input = [ - false,true,null,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1, - 127,127,255,65535,4294967295,-32,-32,-128,-32768, - -2147483648,0.0,-0.0,1.0,-1.0,"a","a","a","","","", - [0],[0],[0],[],[],[],{},{},{}, - {"a" => 97},{"a" => 97},{"a" => 97},[[]],[["a"]] -]; - -my $packed = Data::MessagePack->pack($input); - -foreach my $size(1 .. 16) { - my $up = Data::MessagePack::Unpacker->new(); - - open my $stream, '<:bytes :scalar', \$packed; - binmode $stream; - my $buff; - my $done = 0; - while( read($stream, $buff, $size) ) { - note "buff: ", join " ", map { unpack 'H2', $_ } split //, $buff; - - $done = $up->execute($buff); - } - is $done, length($packed); - ok $up->is_finished, "is_finished: $size"; - my $data = $up->data; - is_deeply $data, $input; -} - -done_testing; diff --git a/perl/t/11_stream_unpack3.t b/perl/t/11_stream_unpack3.t deleted file mode 100644 index 0eb8bff7..00000000 --- a/perl/t/11_stream_unpack3.t +++ /dev/null @@ -1,39 +0,0 @@ -use strict; -use warnings; -use Test::More; -use Data::MessagePack; - -my @data = ( [ 1, 2, 3 ], [ 4, 5, 6 ] ); - -# serialize -my $buffer = ''; -for my $d (@data) { - $buffer .= Data::MessagePack->pack($d); -} - -# deserialize -my $cb = sub { - my ($data) = @_; - - my $d = shift @data; - is_deeply $data, $d; -}; -my $unpacker = Data::MessagePack::Unpacker->new(); -my $nread = 0; -while (1) { - $nread = $unpacker->execute( $buffer, $nread ); - if ( $unpacker->is_finished ) { - my $ret = $unpacker->data; - $cb->( $ret ); - $unpacker->reset; - - $buffer = substr( $buffer, $nread ); - $nread = 0; - next if length($buffer) != 0; - } - last; -} -is scalar(@data), 0; - -done_testing; - diff --git a/perl/t/12_stream_unpack4.t b/perl/t/12_stream_unpack4.t deleted file mode 100644 index ef6fa395..00000000 --- a/perl/t/12_stream_unpack4.t +++ /dev/null @@ -1,27 +0,0 @@ -use strict; -use warnings; -use Data::MessagePack; -use Test::More; -use t::Util; - -my @input = ( - [[]], - [[],[]], - [{"a" => 97},{"a" => 97}], - [{"a" => 97},{"a" => 97},{"a" => 97}], - [ map { +{ "foo $_" => "bar $_" } } 'aa' .. 'zz' ], - [42, null], - [42, true], - [42, false], -); - -plan tests => @input * 2; - -for my $input (@input) { - my $packed = Data::MessagePack->pack($input); - my $up = Data::MessagePack::Unpacker->new(); - $up->execute($packed, 0); - ok $up->is_finished, 'finished'; - is_deeply($up->data, $input); -} - diff --git a/perl/t/13_booleans.t b/perl/t/13_booleans.t deleted file mode 100755 index 1ecbe646..00000000 --- a/perl/t/13_booleans.t +++ /dev/null @@ -1,12 +0,0 @@ -#!perl -w -use strict; -use Test::More tests => 6; -use Data::MessagePack; - -ok defined(Data::MessagePack::true()), 'true (1)'; -ok defined(Data::MessagePack::true()), 'true (2)'; -ok Data::MessagePack::true(), 'true is true'; - -ok defined(Data::MessagePack::false()), 'false (1)'; -ok defined(Data::MessagePack::false()), 'false (2)'; -ok !Data::MessagePack::false(), 'false is false'; diff --git a/perl/t/14_invalid_data.t b/perl/t/14_invalid_data.t deleted file mode 100755 index f5344857..00000000 --- a/perl/t/14_invalid_data.t +++ /dev/null @@ -1,18 +0,0 @@ -use strict; -use warnings; -use Data::MessagePack; -use Test::More; -use t::Util; - -my $nil = Data::MessagePack->pack(undef); - -my @data = do 't/data.pl'; -while(my($dump, $data) = splice @data, 0, 2) { - my $s = Data::MessagePack->pack($data); - eval { - Data::MessagePack->unpack($s . $nil); - }; - like $@, qr/extra bytes/, "dump $dump"; -} - -done_testing; diff --git a/perl/t/15_utf8.t b/perl/t/15_utf8.t deleted file mode 100644 index f3163dfa..00000000 --- a/perl/t/15_utf8.t +++ /dev/null @@ -1,33 +0,0 @@ -#!perl -w -use strict; -use Test::More; -use Data::MessagePack; -use utf8; - -my $data = [42, undef, 'foo', "\x{99f1}\x{99dd}"]; -my $packed = Data::MessagePack->pack($data) x 2; - -my $u = Data::MessagePack::Unpacker->new()->utf8(); -my $p = 0; -for(1 .. 2) { - ok $u->get_utf8(); - $p = $u->execute($packed, $p); - my $d = $u->data(); - $u->reset(); - is_deeply $d, $data, 'decoded'; -} - -is $u->utf8(0), $u, 'utf8(0)'; -$p = 0; -for(1 .. 2) { - ok !$u->get_utf8(); - $p = $u->execute($packed, $p); - my $d = $u->data(); - $u->reset(); - my $s = $data->[3]; - utf8::encode($s); - is_deeply $d->[3], $s, 'not decoded'; -} - -done_testing; - diff --git a/perl/t/16_unpacker_for_larges.t b/perl/t/16_unpacker_for_larges.t deleted file mode 100644 index 26894a20..00000000 --- a/perl/t/16_unpacker_for_larges.t +++ /dev/null @@ -1,20 +0,0 @@ -use strict; -use Test::More; -use Data::MessagePack; - -foreach my $data("abc", [ 'x' x 1024 ], [0xFFFF42]) { - my $packed = Data::MessagePack->pack($data); - - my $unpacker = Data::MessagePack::Unpacker->new; - note "buff: ", join " ", map { unpack 'H2', $_ } split //, $packed; - - foreach my $byte(split //, $packed) { - $unpacker->execute($byte); - } - - ok $unpacker->is_finished, 'finished'; - is_deeply $unpacker->data, $data, 'data'; -} - -done_testing; - diff --git a/perl/t/17_canonical.t b/perl/t/17_canonical.t deleted file mode 100644 index 5389e2f9..00000000 --- a/perl/t/17_canonical.t +++ /dev/null @@ -1,32 +0,0 @@ - -use strict; -use warnings; -use Test::More; -use Data::MessagePack; - -$Data::MessagePack::Canonical = 1; - -my $data = { - 'foo' => { - 'a' => '', - 'b' => '', - 'c' => '', - 'd' => '', - 'e' => '', - 'f' => '', - 'g' => '', - } -}; - -my $packed1 = +Data::MessagePack->pack($data); -my $packed2 = +Data::MessagePack->pack(Data::MessagePack->unpack($packed1)); -my $packed3 = +Data::MessagePack->pack(Data::MessagePack->unpack($packed2)); -my $packed4 = +Data::MessagePack->pack(Data::MessagePack->unpack($packed3)); -my $packed5 = +Data::MessagePack->pack(Data::MessagePack->unpack($packed4)); - -is $packed1, $packed2; -is $packed1, $packed3; -is $packed1, $packed4; -is $packed1, $packed5; - -done_testing; diff --git a/perl/t/50_leaktrace.t b/perl/t/50_leaktrace.t deleted file mode 100644 index 440ac901..00000000 --- a/perl/t/50_leaktrace.t +++ /dev/null @@ -1,62 +0,0 @@ -#!perl -w -use strict; -use Test::Requires { 'Test::LeakTrace' => 0.13 }; -use Test::More; -use Data::MessagePack; -BEGIN { - if($INC{'Data/MessagePack/PP.pm'}) { - plan skip_all => 'disabled in PP'; - } -} - -my $simple_data = "xyz"; -my $complex_data = { - a => 'foo', - b => 42, - c => undef, - d => [qw(bar baz)], - e => 3.14, -}; - -note 'pack'; - -no_leaks_ok { - my $s = Data::MessagePack->pack($complex_data); -}; - -no_leaks_ok { - eval { Data::MessagePack->pack([\*STDIN]) }; - note $@; - $@ or warn "# it must die"; -}; - -note 'unpack'; - -my $s = Data::MessagePack->pack($simple_data); -my $c = Data::MessagePack->pack($complex_data); - -no_leaks_ok { - my $data = Data::MessagePack->unpack($s); -}; - -no_leaks_ok { - my $data = Data::MessagePack->unpack($c); -}; - -no_leaks_ok { - my $broken = $s; - chop $broken; - eval { Data::MessagePack->unpack($broken) }; - note $@; - $@ or warn "# it must die"; -}; - -note 'stream'; - -no_leaks_ok { - my $up = Data::MessagePack::Unpacker->new(); - $up->execute($c); - my $data = $up->data(); -}; - -done_testing; diff --git a/perl/t/Util.pm b/perl/t/Util.pm deleted file mode 100644 index 0aa88bb6..00000000 --- a/perl/t/Util.pm +++ /dev/null @@ -1,18 +0,0 @@ -package t::Util; -use strict; -use warnings; -use Data::MessagePack; - -sub import { - my $pkg = caller(0); - - strict->import; - warnings->import; - - no strict 'refs'; - *{"$pkg\::true"} = \&Data::MessagePack::true; - *{"$pkg\::false"} = \&Data::MessagePack::false; - *{"$pkg\::null"} = sub() { undef }; -} - -1; diff --git a/perl/t/data.pl b/perl/t/data.pl deleted file mode 100644 index b7bbaf1a..00000000 --- a/perl/t/data.pl +++ /dev/null @@ -1,55 +0,0 @@ -no warnings; # i need this, i need this. -( - '93 c0 c2 c3' => [undef, false, true], - '94 a0 a1 61 a2 62 63 a3 64 65 66', ["", "a", "bc", "def"], - '92 90 91 91 c0', [[], [[undef]]], - '93 c0 c2 c3', [undef, false, true], - - '82 d0 2a c2 d0 2b c3', { 42 => false, 43 => true }, # fix map - 'de 00 02 d0 2a c2 d0 2b c3', { 42 => false, 43 => true }, # map 16 - 'df 00 00 00 02 d0 2a c2 d0 2b c3', { 42 => false, 43 => true }, # map 32 - - 'ce 80 00 00 00', 2147483648, - '99 cc 00 cc 80 cc ff cd 00 00 cd 80 00 cd ff ff ce 00 00 00 00 ce 80 00 00 00 ce ff ff ff ff', - [0, 128, 255, 0, 32768, 65535, 0, 2147483648, 4294967295], - '92 93 00 40 7f 93 e0 f0 ff', [[0, 64, 127], [-32, -16, -1]], - '96 dc 00 00 dc 00 01 c0 dc 00 02 c2 c3 dd 00 00 00 00 dd 00 00 00 01 c0 dd 00 00 00 02 c2 c3', - [[], [undef], [false, true], [], [undef], [false, true]], - '96 da 00 00 da 00 01 61 da 00 02 61 62 db 00 00 00 00 db 00 00 00 01 61 db 00 00 00 02 61 62', - ["", "a", "ab", "", "a", "ab"], - '99 d0 00 d0 80 d0 ff d1 00 00 d1 80 00 d1 ff ff d2 00 00 00 00 d2 80 00 00 00 d2 ff ff ff ff', - [0, -128, -1, 0, -32768, -1, 0, -2147483648, -1], - '82 c2 81 c0 c0 c3 81 c0 80', {false,{undef,undef}, true,{undef,{}}}, - '96 de 00 00 de 00 01 c0 c2 de 00 02 c0 c2 c3 c2 df 00 00 00 00 df 00 00 00 01 c0 c2 df 00 00 00 02 c0 c2 c3 c2', - [{}, {undef,false}, {true,false, undef,false}, {}, {undef,false}, {true,false, undef,false}], - 'dc 01 00' . (' c0' x 0x0100), [(undef) x 0x0100], - 'ce 00 ff ff ff' => ''.0xFFFFFF, - 'aa 34 32 39 34 39 36 37 32 39 35' => ''.0xFFFFFFFF, - 'ab 36 38 37 31 39 34 37 36 37 33 35' => ''.0xFFFFFFFFF, - - 'ca 00 00 00 00' => 0.0, # float - 'ca 40 2c cc cd' => unpack('f', pack 'f', 2.7), - - 'd2 80 00 00 01' => '-2147483647', # int32_t - 'ce 80 00 00 01' => '2147483649', # uint32_t - - 'd2 ff ff ff ff' => '-1', # int32_t - 'ce ff ff ff ff' => '4294967295', # uint32_t - - 'd3 00 00 00 00 80 00 00 01' => '2147483649', # int64_t - 'cf 00 00 00 00 80 00 00 01' => '2147483649', # uint64_t - - 'd3 ff 00 ff ff ff ff ff ff' => '-71776119061217281', # int64_t - 'cf ff 00 ff ff ff ff ff ff' => '18374967954648334335', # uint64_t - - 'd3 ff ff ff ff ff ff ff ff' => '-1', # int64_t - 'cf ff ff ff ff ff ff ff ff' => '18446744073709551615', # uint64_t - - # int64_t - 'd3 00 00 00 10 00 00 00 00' => '68719476736', - 'd3 00 00 00 10 00 00 00 01' => '68719476737', - 'd3 00 00 10 00 00 00 00 00' => '17592186044416', - 'd3 00 10 00 00 00 00 00 00' => '4503599627370496', - 'd3 10 00 00 00 00 00 00 00' => '1152921504606846976', - 'd3 11 00 00 00 00 00 00 00' => '1224979098644774912', -) diff --git a/perl/xs-src/MessagePack.c b/perl/xs-src/MessagePack.c deleted file mode 100644 index 82ad1084..00000000 --- a/perl/xs-src/MessagePack.c +++ /dev/null @@ -1,42 +0,0 @@ -#include "xshelper.h" - -#ifndef __cplusplus -#include -#endif - -XS(xs_pack); -XS(xs_unpack); -XS(xs_unpacker_new); -XS(xs_unpacker_utf8); -XS(xs_unpacker_get_utf8); -XS(xs_unpacker_execute); -XS(xs_unpacker_execute_limit); -XS(xs_unpacker_is_finished); -XS(xs_unpacker_data); -XS(xs_unpacker_reset); -XS(xs_unpacker_destroy); - -void init_Data__MessagePack_pack(pTHX_ bool const cloning); -void init_Data__MessagePack_unpack(pTHX_ bool const cloning); - -XS(boot_Data__MessagePack) { - dXSARGS; - XS_VERSION_BOOTCHECK; - - init_Data__MessagePack_pack(aTHX_ false); - init_Data__MessagePack_unpack(aTHX_ false); - - newXS("Data::MessagePack::pack", xs_pack, __FILE__); - newXS("Data::MessagePack::unpack", xs_unpack, __FILE__); - - newXS("Data::MessagePack::Unpacker::new", xs_unpacker_new, __FILE__); - newXS("Data::MessagePack::Unpacker::utf8", xs_unpacker_utf8, __FILE__); - newXS("Data::MessagePack::Unpacker::get_utf8", xs_unpacker_get_utf8, __FILE__); - newXS("Data::MessagePack::Unpacker::execute", xs_unpacker_execute, __FILE__); - newXS("Data::MessagePack::Unpacker::execute_limit", xs_unpacker_execute_limit, __FILE__); - newXS("Data::MessagePack::Unpacker::is_finished", xs_unpacker_is_finished, __FILE__); - newXS("Data::MessagePack::Unpacker::data", xs_unpacker_data, __FILE__); - newXS("Data::MessagePack::Unpacker::reset", xs_unpacker_reset, __FILE__); - newXS("Data::MessagePack::Unpacker::DESTROY", xs_unpacker_destroy, __FILE__); -} - diff --git a/perl/xs-src/pack.c b/perl/xs-src/pack.c deleted file mode 100644 index 582b1202..00000000 --- a/perl/xs-src/pack.c +++ /dev/null @@ -1,296 +0,0 @@ -/* - * code is written by tokuhirom. - * buffer alocation technique is taken from JSON::XS. thanks to mlehmann. - */ -#include "xshelper.h" - -#include "msgpack/pack_define.h" - -#define msgpack_pack_inline_func(name) \ - static inline void msgpack_pack ## name - -#define msgpack_pack_inline_func_cint(name) \ - static inline void msgpack_pack ## name - -typedef struct { - char *cur; /* SvPVX (sv) + current output position */ - const char *end; /* SvEND (sv) */ - SV *sv; /* result scalar */ -} enc_t; - -STATIC_INLINE void need(enc_t* const enc, STRLEN const len); - -#define msgpack_pack_user enc_t* - -#define msgpack_pack_append_buffer(enc, buf, len) \ - need(enc, len); \ - memcpy(enc->cur, buf, len); \ - enc->cur += len; - -#include "msgpack/pack_template.h" - -#define INIT_SIZE 32 /* initial scalar size to be allocated */ - -#if IVSIZE == 8 -# define PACK_IV msgpack_pack_int64 -# define PACK_UV msgpack_pack_uint64 -#elif IVSIZE == 4 -# define PACK_IV msgpack_pack_int32 -# define PACK_UV msgpack_pack_uint32 -#elif IVSIZE == 2 -# define PACK_IV msgpack_pack_int16 -# define PACK_UV msgpack_pack_uint16 -#else -# error "msgpack only supports IVSIZE = 8,4,2 environment." -#endif - -#define ERR_NESTING_EXCEEDED "perl structure exceeds maximum nesting level (max_depth set too low?)" - - -STATIC_INLINE void need(enc_t* const enc, STRLEN const len) -{ - if (enc->cur + len >= enc->end) { - dTHX; - STRLEN const cur = enc->cur - SvPVX_const(enc->sv); - sv_grow (enc->sv, cur + (len < (cur >> 2) ? cur >> 2 : len) + 1); - enc->cur = SvPVX_mutable(enc->sv) + cur; - enc->end = SvPVX_const(enc->sv) + SvLEN (enc->sv) - 1; - } -} - - -static int s_pref_int = 0; - -STATIC_INLINE int pref_int_set(pTHX_ SV* sv, MAGIC* mg PERL_UNUSED_DECL) { - if (SvTRUE(sv)) { - s_pref_int = 1; - } else { - s_pref_int = 0; - } - return 0; -} - -MGVTBL pref_int_vtbl = { - NULL, - pref_int_set, - NULL, - NULL, - NULL, - NULL, - NULL, -#ifdef MGf_LOCAL - NULL, -#endif -}; - -void init_Data__MessagePack_pack(pTHX_ bool const cloning) { - SV* var = get_sv("Data::MessagePack::PreferInteger", 0); - sv_magicext(var, NULL, PERL_MAGIC_ext, &pref_int_vtbl, NULL, 0); - SvSETMAGIC(var); -} - - -STATIC_INLINE int try_int(enc_t* enc, const char *p, size_t len) { - int negative = 0; - const char* pe = p + len; - uint64_t num = 0; - - if (len == 0) { return 0; } - - if (*p == '-') { - /* length(-0x80000000) == 11 */ - if (len <= 1 || len > 11) { return 0; } - negative = 1; - ++p; - } else { - /* length(0xFFFFFFFF) == 10 */ - if (len > 10) { return 0; } - } - -#if '9'=='8'+1 && '8'=='7'+1 && '7'=='6'+1 && '6'=='5'+1 && '5'=='4'+1 \ - && '4'=='3'+1 && '3'=='2'+1 && '2'=='1'+1 && '1'=='0'+1 - do { - unsigned int c = ((int)*(p++)) - '0'; - if (c > 9) { return 0; } - num = num * 10 + c; - } while(p < pe); -#else - do { - switch (*(p++)) { - case '0': num = num * 10 + 0; break; - case '1': num = num * 10 + 1; break; - case '2': num = num * 10 + 2; break; - case '3': num = num * 10 + 3; break; - case '4': num = num * 10 + 4; break; - case '5': num = num * 10 + 5; break; - case '6': num = num * 10 + 6; break; - case '7': num = num * 10 + 7; break; - case '8': num = num * 10 + 8; break; - case '9': num = num * 10 + 9; break; - default: return 0; - } - } while(p < pe); -#endif - - if (negative) { - if (num > 0x80000000) { return 0; } - msgpack_pack_int32(enc, ((int32_t)num) * -1); - } else { - if (num > 0xFFFFFFFF) { return 0; } - msgpack_pack_uint32(enc, (uint32_t)num); - } - - return 1; -} - - -STATIC_INLINE void _msgpack_pack_rv(enc_t *enc, SV* sv, int depth); - -STATIC_INLINE void _msgpack_pack_sv(enc_t* const enc, SV* const sv, int const depth) { - dTHX; - assert(sv); - if (UNLIKELY(depth <= 0)) Perl_croak(aTHX_ ERR_NESTING_EXCEEDED); - SvGETMAGIC(sv); - - if (SvPOKp(sv)) { - STRLEN const len = SvCUR(sv); - const char* const pv = SvPVX_const(sv); - - if (s_pref_int && try_int(enc, pv, len)) { - return; - } else { - msgpack_pack_raw(enc, len); - msgpack_pack_raw_body(enc, pv, len); - } - } else if (SvNIOKp(sv)) { - if(SvUOK(sv)) { - PACK_UV(enc, SvUVX(sv)); - } - else if(SvIOKp(sv)) { - PACK_IV(enc, SvIVX(sv)); - } - else { - /* XXX long double is not supported yet. */ - msgpack_pack_double(enc, (double)SvNVX(sv)); - } - } else if (SvROK(sv)) { - _msgpack_pack_rv(enc, SvRV(sv), depth-1); - } else if (!SvOK(sv)) { - msgpack_pack_nil(enc); - } else if (isGV(sv)) { - Perl_croak(aTHX_ "msgpack cannot pack the GV\n"); - } else { - sv_dump(sv); - Perl_croak(aTHX_ "msgpack for perl doesn't supported this type: %d\n", SvTYPE(sv)); - } -} - -STATIC_INLINE void _msgpack_pack_rv(enc_t *enc, SV* sv, int depth) { - svtype svt; - dTHX; - assert(sv); - SvGETMAGIC(sv); - svt = SvTYPE(sv); - - if (SvOBJECT (sv)) { - HV *stash = gv_stashpv ("Data::MessagePack::Boolean", 1); // TODO: cache? - if (SvSTASH (sv) == stash) { - if (SvIV(sv)) { - msgpack_pack_true(enc); - } else { - msgpack_pack_false(enc); - } - } else { - croak ("encountered object '%s', Data::MessagePack doesn't allow the object", - SvPV_nolen(sv_2mortal(newRV_inc(sv)))); - } - } else if (svt == SVt_PVHV) { - HV* hval = (HV*)sv; - int count = hv_iterinit(hval); - HE* he; - - msgpack_pack_map(enc, count); - - if (SvTRUE(get_sv("Data::MessagePack::Canonical", 0))) { - AV* keys = newAV(); - av_extend(keys, count); - - while ((he = hv_iternext(hval))) { - av_push(keys, SvREFCNT_inc(hv_iterkeysv(he))); - } - - int len = av_len(keys) + 1; - sortsv(AvARRAY(keys), len, Perl_sv_cmp); - - int i; - for (i=0; ipack($dat [,$max_depth])"); - } - - SV* val = ST(1); - int depth = 512; - if (items >= 3) depth = SvIV(ST(2)); - - enc_t enc; - enc.sv = sv_2mortal(newSV(INIT_SIZE)); - enc.cur = SvPVX(enc.sv); - enc.end = SvEND(enc.sv); - SvPOK_only(enc.sv); - - _msgpack_pack_sv(&enc, val, depth); - - SvCUR_set(enc.sv, enc.cur - SvPVX (enc.sv)); - *SvEND (enc.sv) = 0; /* many xs functions expect a trailing 0 for text strings */ - - ST(0) = enc.sv; - XSRETURN(1); -} diff --git a/perl/xs-src/unpack.c b/perl/xs-src/unpack.c deleted file mode 100644 index e3f62c63..00000000 --- a/perl/xs-src/unpack.c +++ /dev/null @@ -1,513 +0,0 @@ -#define NEED_newRV_noinc -#define NEED_sv_2pv_flags -#include "xshelper.h" - -#define MY_CXT_KEY "Data::MessagePack::_unpack_guts" XS_VERSION -typedef struct { - SV* msgpack_true; - SV* msgpack_false; -} my_cxt_t; -START_MY_CXT - -// context data for execute_template() -typedef struct { - bool finished; - bool utf8; - SV* buffer; -} unpack_user; -#define UNPACK_USER_INIT { false, false, NULL } - -#include "msgpack/unpack_define.h" - -#define msgpack_unpack_struct(name) \ - struct template ## name - -#define msgpack_unpack_func(ret, name) \ - STATIC_INLINE ret template ## name - -#define msgpack_unpack_callback(name) \ - template_callback ## name - -#define msgpack_unpack_object SV* - -#define msgpack_unpack_user unpack_user - -void init_Data__MessagePack_unpack(pTHX_ bool const cloning) { - // booleans are load on demand (lazy load). - if(!cloning) { - MY_CXT_INIT; - MY_CXT.msgpack_true = NULL; - MY_CXT.msgpack_false = NULL; - } - else { - MY_CXT_CLONE; - MY_CXT.msgpack_true = NULL; - MY_CXT.msgpack_false = NULL; - } -} - - - -/* ---------------------------------------------------------------------- */ -/* utility functions */ - -static SV* -load_bool(pTHX_ const char* const name) { - CV* const cv = get_cv(name, GV_ADD); - dSP; - ENTER; - SAVETMPS; - PUSHMARK(SP); - call_sv((SV*)cv, G_SCALAR); - SPAGAIN; - SV* const sv = newSVsv(POPs); - PUTBACK; - FREETMPS; - LEAVE; - assert(sv); - assert(sv_isobject(sv)); - if(!SvOK(sv)) { - croak("Oops: Failed to load %"SVf, name); - } - return sv; -} - -static SV* -get_bool(bool const value) { - dTHX; - dMY_CXT; - if(value) { - if(!MY_CXT.msgpack_true) { - MY_CXT.msgpack_true = load_bool(aTHX_ "Data::MessagePack::true"); - } - return newSVsv(MY_CXT.msgpack_true); - } - else { - if(!MY_CXT.msgpack_false) { - MY_CXT.msgpack_false = load_bool(aTHX_ "Data::MessagePack::false"); - } - return newSVsv(MY_CXT.msgpack_false); - } -} - -/* ---------------------------------------------------------------------- */ -struct template_context; -typedef struct template_context msgpack_unpack_t; - -static void template_init(msgpack_unpack_t* u); - -static SV* template_data(msgpack_unpack_t* u); - -static int template_execute(msgpack_unpack_t* u PERL_UNUSED_DECL, - const char* data, size_t len, size_t* off); - -STATIC_INLINE SV* template_callback_root(unpack_user* u PERL_UNUSED_DECL) -{ - return NULL; -} - -#if IVSIZE == 4 - -STATIC_INLINE int template_callback_UV(unpack_user* u PERL_UNUSED_DECL, UV const d, SV** o) -{ - dTHX; - *o = newSVuv(d); - return 0; -} - -STATIC_INLINE int template_callback_IV(unpack_user* u PERL_UNUSED_DECL, IV const d, SV** o) -{ - dTHX; - *o = newSViv(d); - return 0; -} - -/* workaround win32 problems (my_snprintf(%llu) returns incorrect values ) */ -static char* str_from_uint64(char* buf_end, uint64_t v) -{ - char *p = buf_end; - *--p = '\0'; - do { - *--p = '0' + v % 10; - } while ((v /= 10) != 0); - return p; -} - -static const char* str_from_int64(char* buf_end, int64_t const v) { - bool const minus = v < 0; - char* p = str_from_uint64(buf_end, minus ? -v : v); - if (minus) - *--p = '-'; - return p; -} - -static int template_callback_uint64(unpack_user* u PERL_UNUSED_DECL, uint64_t const d, SV** o) -{ - dTHX; - char tbuf[64]; - const char* const s = str_from_uint64(tbuf + sizeof(tbuf), d); - *o = newSVpvn(s, tbuf + sizeof(tbuf) - 1 - s); - return 0; -} - -static int template_callback_int64(unpack_user* u PERL_UNUSED_DECL, int64_t const d, SV** o) -{ - dTHX; - char tbuf[64]; - const char* const s = str_from_int64(tbuf + sizeof(tbuf), d); - *o = newSVpvn(s, tbuf + sizeof(tbuf) - 1 - s); - return 0; -} - -#else /* IVSIZE == 8 */ - - -STATIC_INLINE int template_callback_UV(unpack_user* u PERL_UNUSED_DECL, UV const d, SV** o) -{ - dTHX; - *o = newSVuv(d); - return 0; -} - -#define template_callback_uint64 template_callback_UV - -STATIC_INLINE int template_callback_IV(unpack_user* u PERL_UNUSED_DECL, IV const d, SV** o) -{ - dTHX; - *o = newSViv(d); - return 0; -} - -#define template_callback_int64 template_callback_IV - -#endif /* IVSIZE */ - -#define template_callback_uint8 template_callback_UV -#define template_callback_uint16 template_callback_UV -#define template_callback_uint32 template_callback_UV - -#define template_callback_int8 template_callback_IV -#define template_callback_int16 template_callback_IV -#define template_callback_int32 template_callback_IV - -#define template_callback_float template_callback_double - -STATIC_INLINE int template_callback_double(unpack_user* u PERL_UNUSED_DECL, double d, SV** o) -{ - dTHX; - *o = newSVnv(d); - return 0; -} - -/* &PL_sv_undef is not so good. see http://gist.github.com/387743 */ -STATIC_INLINE int template_callback_nil(unpack_user* u PERL_UNUSED_DECL, SV** o) -{ - dTHX; - *o = newSV(0); - return 0; -} - -STATIC_INLINE int template_callback_true(unpack_user* u PERL_UNUSED_DECL, SV** o) -{ - *o = get_bool(true); - return 0; -} - -STATIC_INLINE int template_callback_false(unpack_user* u PERL_UNUSED_DECL, SV** o) -{ - *o = get_bool(false); - return 0; -} - -STATIC_INLINE int template_callback_array(unpack_user* u PERL_UNUSED_DECL, unsigned int n, SV** o) -{ - dTHX; - AV* const a = newAV(); - *o = newRV_noinc((SV*)a); - av_extend(a, n + 1); - return 0; -} - -STATIC_INLINE int template_callback_array_item(unpack_user* u PERL_UNUSED_DECL, SV** c, SV* o) -{ - dTHX; - AV* const a = (AV*)SvRV(*c); - assert(SvTYPE(a) == SVt_PVAV); - (void)av_store(a, AvFILLp(a) + 1, o); // the same as av_push(a, o) - return 0; -} - -STATIC_INLINE int template_callback_map(unpack_user* u PERL_UNUSED_DECL, unsigned int n, SV** o) -{ - dTHX; - HV* const h = newHV(); - hv_ksplit(h, n); - *o = newRV_noinc((SV*)h); - return 0; -} - -STATIC_INLINE int template_callback_map_item(unpack_user* u PERL_UNUSED_DECL, SV** c, SV* k, SV* v) -{ - dTHX; - HV* const h = (HV*)SvRV(*c); - assert(SvTYPE(h) == SVt_PVHV); - (void)hv_store_ent(h, k, v, 0); - SvREFCNT_dec(k); - return 0; -} - -STATIC_INLINE int template_callback_raw(unpack_user* u PERL_UNUSED_DECL, const char* b PERL_UNUSED_DECL, const char* p, unsigned int l, SV** o) -{ - dTHX; - /* newSVpvn(p, l) returns an undef if p == NULL */ - *o = ((l==0) ? newSVpvs("") : newSVpvn(p, l)); - if(u->utf8) { - sv_utf8_decode(*o); - } - return 0; -} - -#include "msgpack/unpack_template.h" - -#define UNPACKER(from, name) \ - msgpack_unpack_t *name; \ - { \ - SV* const obj = from; \ - if(!(SvROK(obj) && SvIOK(SvRV(obj)))) { \ - Perl_croak(aTHX_ "Invalid unpacker instance for " #name); \ - } \ - name = INT2PTR(msgpack_unpack_t*, SvIVX(SvRV((obj)))); \ - if(name == NULL) { \ - Perl_croak(aTHX_ "NULL found for " # name " when shouldn't be"); \ - } \ - } - -XS(xs_unpack) { - dXSARGS; - SV* const data = ST(1); - size_t limit; - - if (items == 2) { - limit = sv_len(data); - } - else if(items == 3) { - limit = SvUVx(ST(2)); - } - else { - Perl_croak(aTHX_ "Usage: Data::MessagePack->unpack('data' [, $limit])"); - } - - STRLEN dlen; - const char* const dptr = SvPV_const(data, dlen); - - msgpack_unpack_t mp; - template_init(&mp); - - unpack_user const u = UNPACK_USER_INIT; - mp.user = u; - - size_t from = 0; - int const ret = template_execute(&mp, dptr, (size_t)dlen, &from); - SV* const obj = template_data(&mp); - sv_2mortal(obj); - - if(ret < 0) { - Perl_croak(aTHX_ "Data::MessagePack->unpack: parse error"); - } else if(ret == 0) { - Perl_croak(aTHX_ "Data::MessagePack->unpack: insufficient bytes"); - } else { - if(from < dlen) { - Perl_croak(aTHX_ "Data::MessagePack->unpack: extra bytes"); - } - } - - ST(0) = obj; - XSRETURN(1); -} - -/* ------------------------------ stream -- */ -/* http://twitter.com/frsyuki/status/13249304748 */ - - -XS(xs_unpacker_new) { - dXSARGS; - if (items != 1) { - Perl_croak(aTHX_ "Usage: Data::MessagePack::Unpacker->new()"); - } - - SV* const self = sv_newmortal(); - msgpack_unpack_t *mp; - - Newxz(mp, 1, msgpack_unpack_t); - template_init(mp); - unpack_user const u = UNPACK_USER_INIT; - mp->user = u; - - mp->user.buffer = newSV(80); - sv_setpvs(mp->user.buffer, ""); - - sv_setref_pv(self, "Data::MessagePack::Unpacker", mp); - - ST(0) = self; - XSRETURN(1); -} - -XS(xs_unpacker_utf8) { - dXSARGS; - if (!(items == 1 || items == 2)) { - Perl_croak(aTHX_ "Usage: $unpacker->utf8([$bool)"); - } - UNPACKER(ST(0), mp); - mp->user.utf8 = (items == 1 || sv_true(ST(1))) ? true : false; - XSRETURN(1); // returns $self -} - -XS(xs_unpacker_get_utf8) { - dXSARGS; - if (items != 1) { - Perl_croak(aTHX_ "Usage: $unpacker->get_utf8()"); - } - UNPACKER(ST(0), mp); - ST(0) = boolSV(mp->user.utf8); - XSRETURN(1); -} - -STATIC_INLINE size_t -_execute_impl(SV* const self, SV* const data, UV const offset, UV const limit) { - dTHX; - - if(offset >= limit) { - Perl_croak(aTHX_ - "offset (%"UVuf") is bigger than data buffer size (%"UVuf")", - offset, limit); - } - - UNPACKER(self, mp); - - size_t from = offset; - const char* dptr = SvPV_nolen_const(data); - STRLEN dlen = limit; - - if(SvCUR(mp->user.buffer) != 0) { - sv_catpvn(mp->user.buffer, dptr, dlen); - dptr = SvPV_const(mp->user.buffer, dlen); - from = 0; - } - - int const ret = template_execute(mp, dptr, dlen, &from); - // ret < 0 : error - // ret == 0 : insufficient - // ret > 0 : success - - if(ret < 0) { - Perl_croak(aTHX_ - "Data::MessagePack::Unpacker: parse error while executing"); - } - - mp->user.finished = (ret > 0) ? true : false; - if(!mp->user.finished) { - template_init(mp); // reset the state - sv_setpvn(mp->user.buffer, dptr, dlen); - from = 0; - } - else { - sv_setpvs(mp->user.buffer, ""); - } - //warn(">> (%d) dlen=%d, from=%d, rest=%d", - // (int)ret, (int)dlen, (int)from, dlen - from); - return from; -} - -XS(xs_unpacker_execute) { - dXSARGS; - SV* const self = ST(0); - SV* const data = ST(1); - UV offset; - - if (items == 2) { - offset = 0; - } - else if (items == 3) { - offset = SvUVx(ST(2)); - } - else { - Perl_croak(aTHX_ "Usage: $unpacker->execute(data, offset = 0)"); - } - - dXSTARG; - sv_setuv(TARG, _execute_impl(self, data, offset, sv_len(data))); - ST(0) = TARG; - XSRETURN(1); -} - -XS(xs_unpacker_execute_limit) { - dXSARGS; - if (items != 4) { - Perl_croak(aTHX_ "Usage: $unpacker->execute_limit(data, offset, limit)"); - } - - SV* const self = ST(0); - SV* const data = ST(1); - UV const offset = SvUVx(ST(2)); - UV const limit = SvUVx(ST(3)); - - dXSTARG; - sv_setuv(TARG, _execute_impl(self, data, offset, limit)); - ST(0) = TARG; - XSRETURN(1); -} - -XS(xs_unpacker_is_finished) { - dXSARGS; - if (items != 1) { - Perl_croak(aTHX_ "Usage: $unpacker->is_finished()"); - } - - UNPACKER(ST(0), mp); - ST(0) = boolSV(mp->user.finished); - XSRETURN(1); -} - -XS(xs_unpacker_data) { - dXSARGS; - if (items != 1) { - Perl_croak(aTHX_ "Usage: $unpacker->data()"); - } - - UNPACKER(ST(0), mp); - ST(0) = template_data(mp); - XSRETURN(1); -} - -XS(xs_unpacker_reset) { - dXSARGS; - if (items != 1) { - Perl_croak(aTHX_ "Usage: $unpacker->reset()"); - } - - UNPACKER(ST(0), mp); - - SV* const data = template_data(mp); - SvREFCNT_dec(data); - - template_init(mp); - sv_setpvs(mp->user.buffer, ""); - - XSRETURN(0); -} - -XS(xs_unpacker_destroy) { - dXSARGS; - if (items != 1) { - Perl_croak(aTHX_ "Usage: $unpacker->DESTROY()"); - } - - UNPACKER(ST(0), mp); - - SV* const data = template_data(mp); - SvREFCNT_dec(data); - SvREFCNT_dec(mp->user.buffer); - Safefree(mp); - - XSRETURN(0); -} diff --git a/perl/xt/99_pod.t b/perl/xt/99_pod.t deleted file mode 100644 index 437887a0..00000000 --- a/perl/xt/99_pod.t +++ /dev/null @@ -1,4 +0,0 @@ -use Test::More; -eval "use Test::Pod 1.00"; -plan skip_all => "Test::Pod 1.00 required for testing POD" if $@; -all_pod_files_ok(); diff --git a/perl/xt/leaks/normal.t b/perl/xt/leaks/normal.t deleted file mode 100644 index 370b23e6..00000000 --- a/perl/xt/leaks/normal.t +++ /dev/null @@ -1,93 +0,0 @@ -use strict; -use warnings; -use Test::More; -use Data::MessagePack; -use Devel::Peek; - -plan skip_all => '$ENV{LEAK_TEST} is required' unless $ENV{LEAK_TEST}; - -my $input = [ - { - "ZCPGBENCH-1276933268" => - { "1271859210" => [ "\x14\x02\x07\x00\x00", 1 ] }, - "VDORBENCH-5637665303" => - { "1271859210" => [ "\x00\x01\x00\x01\x00", 1 ] }, - "ZVTHBENCH-7648578738" => { - "1271859210" => [ - "\x0a\x02\x04\x00\x00", "2600", - "\x0a\x05\x04\x00\x00", "4600" - ] - }, - "VMVTBENCH-5237337637" => - { "1271859210" => [ "\x00\x01\x00\x01\x00", 1 ] }, - "ZPLSBENCH-1823993880" => - { "1271859210" => [ "\x01\x07\x07\x03\x06", "10001" ] }, - "ZCPGBENCH-1995524375" => - { "1271859210" => [ "\x14\x02\x07\x00\x00", 1 ] }, - "ZCPGBENCH-2330423245" => - { "1271859210" => [ "\x14\x02\x07\x00\x00", 1 ] }, - "ZCPGBENCH-2963065090" => - { "1271859210" => [ "\x14\x02\x07\x00\x00", 1 ] }, - "MINT0" => { "1271859210" => [ "\x00\x01\x00\x01\x00", "D" ] } - } -]; -my $r = Data::MessagePack->pack($input); -my $n1 = trace(10); -my $n2 = trace(10000); -diag("$n1, $n2"); - -cmp_ok abs($n2-$n1), '<', 100; - -done_testing; - -sub trace { - my $n = shift; - my $before = memoryusage(); - for ( 1 .. $n ) { - my $x = Data::MessagePack->unpack($r); - # is_deeply($x, $input); - } - my $after = memoryusage(); - diag("$n\t: $after - $before"); - return $after - $before; -} - -sub memoryusage { - my $status = `cat /proc/$$/status`; - my @lines = split( "\n", $status ); - foreach my $line (@lines) { - if ( $line =~ /^VmRSS:/ ) { - $line =~ s/.*:\s*(\d+).*/$1/; - return int($line); - } - } - return -1; -} - -__END__ - [ - { - "ZCPGBENCH-1276933268" => - { "1271859210" => [ "\x14\x02\x07\x00\x00", 1 ] }, - "VDORBENCH-5637665303" => - { "1271859210" => [ "\x00\x01\x00\x01\x00", 1 ] }, - "ZVTHBENCH-7648578738" => { - "1271859210" => [ - "\x0a\x02\x04\x00\x00", "2600", - "\x0a\x05\x04\x00\x00", "4600" - ] - }, - "VMVTBENCH-5237337637" => - { "1271859210" => [ "\x00\x01\x00\x01\x00", 1 ] }, - "ZPLSBENCH-1823993880" => - { "1271859210" => [ "\x01\x07\x07\x03\x06", "10001" ] }, - "ZCPGBENCH-1995524375" => - { "1271859210" => [ "\x14\x02\x07\x00\x00", 1 ] }, - "ZCPGBENCH-2330423245" => - { "1271859210" => [ "\x14\x02\x07\x00\x00", 1 ] }, - "ZCPGBENCH-2963065090" => - { "1271859210" => [ "\x14\x02\x07\x00\x00", 1 ] }, - "MINT0" => { "1271859210" => [ "\x00\x01\x00\x01\x00", "D" ] } - } - ] - diff --git a/perl/xt/leaks/stream.t b/perl/xt/leaks/stream.t deleted file mode 100644 index 7765d733..00000000 --- a/perl/xt/leaks/stream.t +++ /dev/null @@ -1,108 +0,0 @@ -use strict; -use warnings; -use Test::More; -use Data::MessagePack; -use Devel::Peek; - -plan skip_all => '$ENV{LEAK_TEST} is required' unless $ENV{LEAK_TEST}; - -my $input = [ - { - "ZCPGBENCH-1276933268" => - { "1271859210" => [ "\x14\x02\x07\x00\x00", 1 ] }, - "VDORBENCH-5637665303" => - { "1271859210" => [ "\x00\x01\x00\x01\x00", 1 ] }, - "ZVTHBENCH-7648578738" => { - "1271859210" => [ - "\x0a\x02\x04\x00\x00", "2600", - "\x0a\x05\x04\x00\x00", "4600" - ] - }, - "VMVTBENCH-5237337637" => - { "1271859210" => [ "\x00\x01\x00\x01\x00", 1 ] }, - "ZPLSBENCH-1823993880" => - { "1271859210" => [ "\x01\x07\x07\x03\x06", "10001" ] }, - "ZCPGBENCH-1995524375" => - { "1271859210" => [ "\x14\x02\x07\x00\x00", 1 ] }, - "ZCPGBENCH-2330423245" => - { "1271859210" => [ "\x14\x02\x07\x00\x00", 1 ] }, - "ZCPGBENCH-2963065090" => - { "1271859210" => [ "\x14\x02\x07\x00\x00", 1 ] }, - "MINT0" => { "1271859210" => [ "\x00\x01\x00\x01\x00", "D" ] } - } -]; -$input = [(undef)x10]; -my $r = Data::MessagePack->pack($input); - -my $n1 = trace(10); -my $n2 = trace(10000); -diag("$n1, $n2"); - -cmp_ok abs($n2-$n1), '<', 100; - -done_testing; - -sub trace { - my $n = shift; - my $before = memoryusage(); - for ( 1 .. $n ) { - my $unpacker = Data::MessagePack::Unpacker->new(); - $unpacker->execute($r, 0); - # ok $unpacker->is_finished if $i % 100 == 0; - if ($unpacker->is_finished) { - my $x = $unpacker->data; - # is_deeply($x, $input) if $i % 100 == 0; - } - $unpacker->reset(); - $unpacker->execute($r, 0); - $unpacker->reset(); - $unpacker->execute(substr($r, 0, 1), 0); - $unpacker->execute(substr($r, 0, 2), 1); - $unpacker->execute($r, 2); - $unpacker->reset(); - $r or die; - } - my $after = memoryusage(); - diag("$n\t: $after - $before"); - return $after - $before; -} - -sub memoryusage { - my $status = `cat /proc/$$/status`; - my @lines = split( "\n", $status ); - foreach my $line (@lines) { - if ( $line =~ /^VmRSS:/ ) { - $line =~ s/.*:\s*(\d+).*/$1/; - return int($line); - } - } - return -1; -} - -__END__ - [ - { - "ZCPGBENCH-1276933268" => - { "1271859210" => [ "\x14\x02\x07\x00\x00", 1 ] }, - "VDORBENCH-5637665303" => - { "1271859210" => [ "\x00\x01\x00\x01\x00", 1 ] }, - "ZVTHBENCH-7648578738" => { - "1271859210" => [ - "\x0a\x02\x04\x00\x00", "2600", - "\x0a\x05\x04\x00\x00", "4600" - ] - }, - "VMVTBENCH-5237337637" => - { "1271859210" => [ "\x00\x01\x00\x01\x00", 1 ] }, - "ZPLSBENCH-1823993880" => - { "1271859210" => [ "\x01\x07\x07\x03\x06", "10001" ] }, - "ZCPGBENCH-1995524375" => - { "1271859210" => [ "\x14\x02\x07\x00\x00", 1 ] }, - "ZCPGBENCH-2330423245" => - { "1271859210" => [ "\x14\x02\x07\x00\x00", 1 ] }, - "ZCPGBENCH-2963065090" => - { "1271859210" => [ "\x14\x02\x07\x00\x00", 1 ] }, - "MINT0" => { "1271859210" => [ "\x00\x01\x00\x01\x00", "D" ] } - } - ] - diff --git a/php/ChangeLog b/php/ChangeLog index e409478b..b3b1cd76 100644 --- a/php/ChangeLog +++ b/php/ChangeLog @@ -1,5 +1,10 @@ msgpack extension changelog +Version 0.5.1 +------------- + * Fixed include path for version check. + (Contributed by duedal) + Version 0.5.0 ------------- * Fix ZEND_DECLARE_MODULE_GLOBALS: diff --git a/php/config.m4 b/php/config.m4 index 5bde72d6..a20de3e4 100644 --- a/php/config.m4 +++ b/php/config.m4 @@ -7,7 +7,7 @@ dnl without editing. dnl Check PHP version: AC_MSG_CHECKING(PHP version) -AC_TRY_COMPILE([#include "php/main/php_version.h"], [ +AC_TRY_COMPILE([#include "$phpincludedir/main/php_version.h"], [ #if PHP_MAJOR_VERSION < 5 #error this extension requires at least PHP version 5 or newer #endif diff --git a/php/php_msgpack.h b/php/php_msgpack.h index d677a1c7..bcd64996 100644 --- a/php/php_msgpack.h +++ b/php/php_msgpack.h @@ -2,7 +2,7 @@ #ifndef PHP_MSGPACK_H #define PHP_MSGPACK_H -#define MSGPACK_EXTENSION_VERSION "0.5.0" +#define MSGPACK_EXTENSION_VERSION "0.5.1" #include "ext/standard/php_smart_str.h" diff --git a/python/.gitignore b/python/.gitignore deleted file mode 100644 index 35b00cc7..00000000 --- a/python/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -MANIFEST -build/* -dist/* -*.pyc -*.pyo -msgpack/__version__.py -msgpack/_msgpack.c diff --git a/python/COPYING b/python/COPYING deleted file mode 100644 index 3cb1f1e1..00000000 --- a/python/COPYING +++ /dev/null @@ -1,14 +0,0 @@ -Copyright (C) 2008-2010 KLab Inc. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - diff --git a/python/ChangeLog.rst b/python/ChangeLog.rst deleted file mode 100644 index 10ddf4f0..00000000 --- a/python/ChangeLog.rst +++ /dev/null @@ -1,61 +0,0 @@ -0.1.10 -====== -:release date: NOT RELEASED YET - -New feature ------------ -* Add ``encoding`` and ``unicode_errors`` option to packer and unpacker. - When this option is specified, (un)packs unicode object instead of bytes. - This enables using msgpack as a replacement of json. - -0.1.9 -====== -:release date: 2011-01-29 - -New feature ------------ -* ``use_list`` option is added to unpack(b) like Unpacker. - (Use keyword argument because order of parameters are different) - -Bugs fixed ----------- -* Fix typo. -* Add MemoryError check. - -0.1.8 -====== -:release date: 2011-01-10 - -New feature ------------- -* Support ``loads`` and ``dumps`` aliases for API compatibility with - simplejson and pickle. - -* Add *object_hook* and *list_hook* option to unpacker. It allows you to - hook unpacing mapping type and array type. - -* Add *default* option to packer. It allows you to pack unsupported types. - -* unpacker accepts (old) buffer types. - -Bugs fixed ----------- -* Fix segv around ``Unpacker.feed`` or ``Unpacker(file)``. - - -0.1.7 -====== -:release date: 2010-11-02 - -New feature ------------- -* Add *object_hook* and *list_hook* option to unpacker. It allows you to - hook unpacing mapping type and array type. - -* Add *default* option to packer. It allows you to pack unsupported types. - -* unpacker accepts (old) buffer types. - -Bugs fixed ----------- -* Compilation error on win32. diff --git a/python/MANIFEST.in b/python/MANIFEST.in deleted file mode 100644 index cbc9ada3..00000000 --- a/python/MANIFEST.in +++ /dev/null @@ -1,3 +0,0 @@ -include setup.py -include COPYING -recursive-include msgpack *.h *.c *.pyx diff --git a/python/Makefile b/python/Makefile deleted file mode 100644 index 245c09c2..00000000 --- a/python/Makefile +++ /dev/null @@ -1,12 +0,0 @@ -.PHONY: test all python3 - -all: - python setup.py build_ext -i -f - python setup.py build sdist - -python3: - python3 setup.py build_ext -i -f - python3 setup.py build sdist - -test: - nosetests test diff --git a/python/README b/python/README deleted file mode 100644 index a7e8c53a..00000000 --- a/python/README +++ /dev/null @@ -1,42 +0,0 @@ -=========================== -MessagePack Python Binding -=========================== - -:author: INADA Naoki -:version: 0.1.0 -:date: 2009-07-12 - -HOW TO USE ------------ -You can read document in docstring after `import msgpack` - - -INSTALL ---------- -Cython_ is required to build msgpack. - -.. _Cython: http://www.cython.org/ - -posix -'''''' -You can install msgpack in common way. - - $ python setup.py install - -Windows -'''''''' -MessagePack requires gcc currently. So you need to prepare -MinGW GCC. - - $ python setup.py install -c mingw32 - -TEST ----- -MessagePack uses `nosetest` for testing. -Run test with following command: - - $ nosetests test - - -.. - vim: filetype=rst diff --git a/python/msgpack/__init__.py b/python/msgpack/__init__.py deleted file mode 100644 index cdf045fb..00000000 --- a/python/msgpack/__init__.py +++ /dev/null @@ -1,11 +0,0 @@ -# coding: utf-8 -from msgpack.__version__ import * -from msgpack._msgpack import * - -# alias for compatibility to simplejson/marshal/pickle. -load = unpack -loads = unpackb - -dump = pack -dumps = packb - diff --git a/python/msgpack/_msgpack.pyx b/python/msgpack/_msgpack.pyx deleted file mode 100644 index 443cbd75..00000000 --- a/python/msgpack/_msgpack.pyx +++ /dev/null @@ -1,388 +0,0 @@ -# coding: utf-8 - -from cpython cimport * -cdef extern from "Python.h": - ctypedef char* const_char_ptr "const char*" - ctypedef char* const_void_ptr "const void*" - ctypedef struct PyObject - cdef int PyObject_AsReadBuffer(object o, const_void_ptr* buff, Py_ssize_t* buf_len) except -1 - -from libc.stdlib cimport * -from libc.string cimport * -import gc -_gc_disable = gc.disable -_gc_enable = gc.enable - -cdef extern from "pack.h": - struct msgpack_packer: - char* buf - size_t length - size_t buf_size - - int msgpack_pack_int(msgpack_packer* pk, int d) - int msgpack_pack_nil(msgpack_packer* pk) - int msgpack_pack_true(msgpack_packer* pk) - int msgpack_pack_false(msgpack_packer* pk) - int msgpack_pack_long(msgpack_packer* pk, long d) - int msgpack_pack_long_long(msgpack_packer* pk, long long d) - int msgpack_pack_unsigned_long_long(msgpack_packer* pk, unsigned long long d) - int msgpack_pack_double(msgpack_packer* pk, double d) - int msgpack_pack_array(msgpack_packer* pk, size_t l) - int msgpack_pack_map(msgpack_packer* pk, size_t l) - int msgpack_pack_raw(msgpack_packer* pk, size_t l) - int msgpack_pack_raw_body(msgpack_packer* pk, char* body, size_t l) - -cdef int DEFAULT_RECURSE_LIMIT=511 - -cdef class Packer(object): - """MessagePack Packer - - usage: - - packer = Packer() - astream.write(packer.pack(a)) - astream.write(packer.pack(b)) - """ - cdef msgpack_packer pk - cdef object _default - cdef object _bencoding - cdef object _berrors - cdef char *encoding - cdef char *unicode_errors - - def __cinit__(self): - cdef int buf_size = 1024*1024 - self.pk.buf = malloc(buf_size); - if self.pk.buf == NULL: - raise MemoryError("Unable to allocate internal buffer.") - self.pk.buf_size = buf_size - self.pk.length = 0 - - def __init__(self, default=None, encoding='utf-8', unicode_errors='strict'): - if default is not None: - if not PyCallable_Check(default): - raise TypeError("default must be a callable.") - self._default = default - if encoding is None: - self.encoding = NULL - self.unicode_errors = NULL - else: - if isinstance(encoding, unicode): - self._bencoding = encoding.encode('ascii') - else: - self._bencoding = encoding - self.encoding = PyBytes_AsString(self._bencoding) - if isinstance(unicode_errors, unicode): - self._berrors = unicode_errors.encode('ascii') - else: - self._berrors = unicode_errors - self.unicode_errors = PyBytes_AsString(self._berrors) - - def __dealloc__(self): - free(self.pk.buf); - - cdef int _pack(self, object o, int nest_limit=DEFAULT_RECURSE_LIMIT) except -1: - cdef long long llval - cdef unsigned long long ullval - cdef long longval - cdef double fval - cdef char* rawval - cdef int ret - cdef dict d - - if nest_limit < 0: - raise ValueError("Too deep.") - - if o is None: - ret = msgpack_pack_nil(&self.pk) - elif isinstance(o, bool): - if o: - ret = msgpack_pack_true(&self.pk) - else: - ret = msgpack_pack_false(&self.pk) - elif PyLong_Check(o): - if o > 0: - ullval = o - ret = msgpack_pack_unsigned_long_long(&self.pk, ullval) - else: - llval = o - ret = msgpack_pack_long_long(&self.pk, llval) - elif PyInt_Check(o): - longval = o - ret = msgpack_pack_long(&self.pk, longval) - elif PyFloat_Check(o): - fval = o - ret = msgpack_pack_double(&self.pk, fval) - elif PyBytes_Check(o): - rawval = o - ret = msgpack_pack_raw(&self.pk, len(o)) - if ret == 0: - ret = msgpack_pack_raw_body(&self.pk, rawval, len(o)) - elif PyUnicode_Check(o): - if not self.encoding: - raise TypeError("Can't encode utf-8 no encoding is specified") - o = PyUnicode_AsEncodedString(o, self.encoding, self.unicode_errors) - rawval = o - ret = msgpack_pack_raw(&self.pk, len(o)) - if ret == 0: - ret = msgpack_pack_raw_body(&self.pk, rawval, len(o)) - elif PyDict_Check(o): - d = o - ret = msgpack_pack_map(&self.pk, len(d)) - if ret == 0: - for k,v in d.items(): - ret = self._pack(k, nest_limit-1) - if ret != 0: break - ret = self._pack(v, nest_limit-1) - if ret != 0: break - elif PySequence_Check(o): - ret = msgpack_pack_array(&self.pk, len(o)) - if ret == 0: - for v in o: - ret = self._pack(v, nest_limit-1) - if ret != 0: break - elif self._default: - o = self._default(o) - ret = self._pack(o, nest_limit-1) - else: - raise TypeError("can't serialize %r" % (o,)) - return ret - - def pack(self, object obj): - cdef int ret - ret = self._pack(obj, DEFAULT_RECURSE_LIMIT) - if ret: - raise TypeError - buf = PyBytes_FromStringAndSize(self.pk.buf, self.pk.length) - self.pk.length = 0 - return buf - - -def pack(object o, object stream, default=None, encoding='utf-8', unicode_errors='strict'): - """pack an object `o` and write it to stream).""" - packer = Packer(default=default, encoding=encoding, unicode_errors=unicode_errors) - stream.write(packer.pack(o)) - -def packb(object o, default=None, encoding='utf-8', unicode_errors='strict'): - """pack o and return packed bytes.""" - packer = Packer(default=default, encoding=encoding, unicode_errors=unicode_errors) - return packer.pack(o) - -dumps = packs = packb - -cdef extern from "unpack.h": - ctypedef struct msgpack_user: - int use_list - PyObject* object_hook - PyObject* list_hook - char *encoding - char *unicode_errors - - ctypedef struct template_context: - msgpack_user user - PyObject* obj - size_t count - unsigned int ct - PyObject* key - - int template_execute(template_context* ctx, const_char_ptr data, - size_t len, size_t* off) except -1 - void template_init(template_context* ctx) - object template_data(template_context* ctx) - - -def unpackb(object packed, object object_hook=None, object list_hook=None, bint use_list=0, encoding=None, unicode_errors="strict"): - """Unpack packed_bytes to object. Returns an unpacked object.""" - cdef template_context ctx - cdef size_t off = 0 - cdef int ret - - cdef char* buf - cdef Py_ssize_t buf_len - PyObject_AsReadBuffer(packed, &buf, &buf_len) - - if encoding is None: - enc = NULL - else: - if isinstance(encoding, unicode): - bencoding = encoding.encode('ascii') - else: - bencoding = encoding - if isinstance(unicode_errors, unicode): - berrors = unicode_errors.encode('ascii') - else: - berrors = unicode_errors - enc = PyBytes_AsString(bencoding) - err = PyBytes_AsString(berrors) - - template_init(&ctx) - ctx.user.use_list = use_list - ctx.user.object_hook = ctx.user.list_hook = NULL - ctx.user.encoding = enc - ctx.user.unicode_errors = err - if object_hook is not None: - if not PyCallable_Check(object_hook): - raise TypeError("object_hook must be a callable.") - ctx.user.object_hook = object_hook - if list_hook is not None: - if not PyCallable_Check(list_hook): - raise TypeError("list_hook must be a callable.") - ctx.user.list_hook = list_hook - _gc_disable() - try: - ret = template_execute(&ctx, buf, buf_len, &off) - finally: - _gc_enable() - if ret == 1: - return template_data(&ctx) - else: - return None - -loads = unpacks = unpackb - -def unpack(object stream, object object_hook=None, object list_hook=None, bint use_list=0, encoding=None, unicode_errors="strict"): - """unpack an object from stream.""" - return unpackb(stream.read(), use_list=use_list, - object_hook=object_hook, list_hook=list_hook, encoding=encoding, unicode_errors=unicode_errors) - -cdef class Unpacker(object): - """Unpacker(read_size=1024*1024) - - Streaming unpacker. - read_size is used like file_like.read(read_size) - - example: - unpacker = Unpacker() - while 1: - buf = astream.read() - unpacker.feed(buf) - for o in unpacker: - do_something(o) - """ - cdef template_context ctx - cdef char* buf - cdef size_t buf_size, buf_head, buf_tail - cdef object file_like - cdef object file_like_read - cdef Py_ssize_t read_size - cdef bint use_list - cdef object object_hook - - def __cinit__(self): - self.buf = NULL - - def __dealloc__(self): - free(self.buf); - self.buf = NULL; - - def __init__(self, file_like=None, Py_ssize_t read_size=0, bint use_list=0, - object object_hook=None, object list_hook=None, encoding=None, unicode_errors=None): - if read_size == 0: - read_size = 1024*1024 - self.use_list = use_list - self.file_like = file_like - if file_like: - self.file_like_read = file_like.read - if not PyCallable_Check(self.file_like_read): - raise ValueError("`file_like.read` must be a callable.") - self.read_size = read_size - self.buf = malloc(read_size) - if self.buf == NULL: - raise MemoryError("Unable to allocate internal buffer.") - self.buf_size = read_size - self.buf_head = 0 - self.buf_tail = 0 - template_init(&self.ctx) - self.ctx.user.use_list = use_list - self.ctx.user.object_hook = self.ctx.user.list_hook = NULL - if object_hook is not None: - if not PyCallable_Check(object_hook): - raise TypeError("object_hook must be a callable.") - self.ctx.user.object_hook = object_hook - if list_hook is not None: - if not PyCallable_Check(list_hook): - raise TypeError("list_hook must be a callable.") - self.ctx.user.list_hook = list_hook - - def feed(self, object next_bytes): - cdef char* buf - cdef Py_ssize_t buf_len - if self.file_like is not None: - raise AssertionError( - "unpacker.feed() is not be able to use with`file_like`.") - PyObject_AsReadBuffer(next_bytes, &buf, &buf_len) - self.append_buffer(buf, buf_len) - - cdef append_buffer(self, void* _buf, Py_ssize_t _buf_len): - cdef: - char* buf = self.buf - size_t head = self.buf_head - size_t tail = self.buf_tail - size_t buf_size = self.buf_size - size_t new_size - - if tail + _buf_len > buf_size: - if ((tail - head) + _buf_len)*2 < buf_size: - # move to front. - memmove(buf, buf + head, tail - head) - tail -= head - head = 0 - else: - # expand buffer. - new_size = tail + _buf_len - if new_size < buf_size*2: - new_size = buf_size*2 - buf = realloc(buf, new_size) - if buf == NULL: - # self.buf still holds old buffer and will be freed during - # obj destruction - raise MemoryError("Unable to enlarge internal buffer.") - buf_size = new_size - - memcpy(buf + tail, (_buf), _buf_len) - self.buf = buf - self.buf_head = head - self.buf_size = buf_size - self.buf_tail = tail + _buf_len - - # prepare self.buf from file_like - cdef fill_buffer(self): - if self.file_like is not None: - next_bytes = self.file_like_read(self.read_size) - if next_bytes: - self.append_buffer(PyBytes_AsString(next_bytes), - PyBytes_Size(next_bytes)) - else: - self.file_like = None - - cpdef unpack(self): - """unpack one object""" - cdef int ret - while 1: - _gc_disable() - ret = template_execute(&self.ctx, self.buf, self.buf_tail, &self.buf_head) - _gc_enable() - if ret == 1: - o = template_data(&self.ctx) - template_init(&self.ctx) - return o - elif ret == 0: - if self.file_like is not None: - self.fill_buffer() - continue - raise StopIteration("No more unpack data.") - else: - raise ValueError("Unpack failed: error = %d" % (ret,)) - - def __iter__(self): - return self - - def __next__(self): - return self.unpack() - - # for debug. - #def _buf(self): - # return PyString_FromStringAndSize(self.buf, self.buf_tail) - - #def _off(self): - # return self.buf_head diff --git a/python/msgpack/pack.h b/python/msgpack/pack.h deleted file mode 100644 index 2ae95d17..00000000 --- a/python/msgpack/pack.h +++ /dev/null @@ -1,103 +0,0 @@ -/* - * MessagePack for Python packing routine - * - * Copyright (C) 2009 Naoki INADA - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include -#include -#include "sysdep.h" -#include "pack_define.h" - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct msgpack_packer { - char *buf; - size_t length; - size_t buf_size; -} msgpack_packer; - -typedef struct Packer Packer; - -static inline int msgpack_pack_short(msgpack_packer* pk, short d); -static inline int msgpack_pack_int(msgpack_packer* pk, int d); -static inline int msgpack_pack_long(msgpack_packer* pk, long d); -static inline int msgpack_pack_long_long(msgpack_packer* pk, long long d); -static inline int msgpack_pack_unsigned_short(msgpack_packer* pk, unsigned short d); -static inline int msgpack_pack_unsigned_int(msgpack_packer* pk, unsigned int d); -static inline int msgpack_pack_unsigned_long(msgpack_packer* pk, unsigned long d); -static inline int msgpack_pack_unsigned_long_long(msgpack_packer* pk, unsigned long long d); - -static inline int msgpack_pack_uint8(msgpack_packer* pk, uint8_t d); -static inline int msgpack_pack_uint16(msgpack_packer* pk, uint16_t d); -static inline int msgpack_pack_uint32(msgpack_packer* pk, uint32_t d); -static inline int msgpack_pack_uint64(msgpack_packer* pk, uint64_t d); -static inline int msgpack_pack_int8(msgpack_packer* pk, int8_t d); -static inline int msgpack_pack_int16(msgpack_packer* pk, int16_t d); -static inline int msgpack_pack_int32(msgpack_packer* pk, int32_t d); -static inline int msgpack_pack_int64(msgpack_packer* pk, int64_t d); - -static inline int msgpack_pack_float(msgpack_packer* pk, float d); -static inline int msgpack_pack_double(msgpack_packer* pk, double d); - -static inline int msgpack_pack_nil(msgpack_packer* pk); -static inline int msgpack_pack_true(msgpack_packer* pk); -static inline int msgpack_pack_false(msgpack_packer* pk); - -static inline int msgpack_pack_array(msgpack_packer* pk, unsigned int n); - -static inline int msgpack_pack_map(msgpack_packer* pk, unsigned int n); - -static inline int msgpack_pack_raw(msgpack_packer* pk, size_t l); -static inline int msgpack_pack_raw_body(msgpack_packer* pk, const void* b, size_t l); - -static inline int msgpack_pack_write(msgpack_packer* pk, const char *data, size_t l) -{ - char* buf = pk->buf; - size_t bs = pk->buf_size; - size_t len = pk->length; - - if (len + l > bs) { - bs = (len + l) * 2; - buf = realloc(buf, bs); - if (!buf) return -1; - } - memcpy(buf + len, data, l); - len += l; - - pk->buf = buf; - pk->buf_size = bs; - pk->length = len; - return 0; -} - -#define msgpack_pack_inline_func(name) \ - static inline int msgpack_pack ## name - -#define msgpack_pack_inline_func_cint(name) \ - static inline int msgpack_pack ## name - -#define msgpack_pack_user msgpack_packer* - -#define msgpack_pack_append_buffer(user, buf, len) \ - return msgpack_pack_write(user, (const char*)buf, len) - -#include "pack_template.h" - -#ifdef __cplusplus -} -#endif diff --git a/python/msgpack/pack_define.h b/python/msgpack/pack_define.h deleted file mode 100644 index f72391b7..00000000 --- a/python/msgpack/pack_define.h +++ /dev/null @@ -1,25 +0,0 @@ -/* - * MessagePack unpacking routine template - * - * Copyright (C) 2008-2009 FURUHASHI Sadayuki - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -#ifndef MSGPACK_PACK_DEFINE_H__ -#define MSGPACK_PACK_DEFINE_H__ - -#include "sysdep.h" -#include - -#endif /* msgpack/pack_define.h */ - diff --git a/python/msgpack/pack_template.h b/python/msgpack/pack_template.h deleted file mode 100644 index de148bf6..00000000 --- a/python/msgpack/pack_template.h +++ /dev/null @@ -1,686 +0,0 @@ -/* - * MessagePack packing routine template - * - * Copyright (C) 2008-2009 FURUHASHI Sadayuki - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifdef __LITTLE_ENDIAN__ -#define TAKE8_8(d) ((uint8_t*)&d)[0] -#define TAKE8_16(d) ((uint8_t*)&d)[0] -#define TAKE8_32(d) ((uint8_t*)&d)[0] -#define TAKE8_64(d) ((uint8_t*)&d)[0] -#elif __BIG_ENDIAN__ -#define TAKE8_8(d) ((uint8_t*)&d)[0] -#define TAKE8_16(d) ((uint8_t*)&d)[1] -#define TAKE8_32(d) ((uint8_t*)&d)[3] -#define TAKE8_64(d) ((uint8_t*)&d)[7] -#endif - -#ifndef msgpack_pack_inline_func -#error msgpack_pack_inline_func template is not defined -#endif - -#ifndef msgpack_pack_user -#error msgpack_pack_user type is not defined -#endif - -#ifndef msgpack_pack_append_buffer -#error msgpack_pack_append_buffer callback is not defined -#endif - - -/* - * Integer - */ - -#define msgpack_pack_real_uint8(x, d) \ -do { \ - if(d < (1<<7)) { \ - /* fixnum */ \ - msgpack_pack_append_buffer(x, &TAKE8_8(d), 1); \ - } else { \ - /* unsigned 8 */ \ - unsigned char buf[2] = {0xcc, TAKE8_8(d)}; \ - msgpack_pack_append_buffer(x, buf, 2); \ - } \ -} while(0) - -#define msgpack_pack_real_uint16(x, d) \ -do { \ - if(d < (1<<7)) { \ - /* fixnum */ \ - msgpack_pack_append_buffer(x, &TAKE8_16(d), 1); \ - } else if(d < (1<<8)) { \ - /* unsigned 8 */ \ - unsigned char buf[2] = {0xcc, TAKE8_16(d)}; \ - msgpack_pack_append_buffer(x, buf, 2); \ - } else { \ - /* unsigned 16 */ \ - unsigned char buf[3]; \ - buf[0] = 0xcd; *(uint16_t*)&buf[1] = _msgpack_be16(d); \ - msgpack_pack_append_buffer(x, buf, 3); \ - } \ -} while(0) - -#define msgpack_pack_real_uint32(x, d) \ -do { \ - if(d < (1<<8)) { \ - if(d < (1<<7)) { \ - /* fixnum */ \ - msgpack_pack_append_buffer(x, &TAKE8_32(d), 1); \ - } else { \ - /* unsigned 8 */ \ - unsigned char buf[2] = {0xcc, TAKE8_32(d)}; \ - msgpack_pack_append_buffer(x, buf, 2); \ - } \ - } else { \ - if(d < (1<<16)) { \ - /* unsigned 16 */ \ - unsigned char buf[3]; \ - buf[0] = 0xcd; *(uint16_t*)&buf[1] = _msgpack_be16(d); \ - msgpack_pack_append_buffer(x, buf, 3); \ - } else { \ - /* unsigned 32 */ \ - unsigned char buf[5]; \ - buf[0] = 0xce; *(uint32_t*)&buf[1] = _msgpack_be32(d); \ - msgpack_pack_append_buffer(x, buf, 5); \ - } \ - } \ -} while(0) - -#define msgpack_pack_real_uint64(x, d) \ -do { \ - if(d < (1ULL<<8)) { \ - if(d < (1<<7)) { \ - /* fixnum */ \ - msgpack_pack_append_buffer(x, &TAKE8_64(d), 1); \ - } else { \ - /* unsigned 8 */ \ - unsigned char buf[2] = {0xcc, TAKE8_64(d)}; \ - msgpack_pack_append_buffer(x, buf, 2); \ - } \ - } else { \ - if(d < (1ULL<<16)) { \ - /* signed 16 */ \ - unsigned char buf[3]; \ - buf[0] = 0xcd; *(uint16_t*)&buf[1] = _msgpack_be16(d); \ - msgpack_pack_append_buffer(x, buf, 3); \ - } else if(d < (1ULL<<32)) { \ - /* signed 32 */ \ - unsigned char buf[5]; \ - buf[0] = 0xce; *(uint32_t*)&buf[1] = _msgpack_be32(d); \ - msgpack_pack_append_buffer(x, buf, 5); \ - } else { \ - /* signed 64 */ \ - unsigned char buf[9]; \ - buf[0] = 0xcf; *(uint64_t*)&buf[1] = _msgpack_be64(d); \ - msgpack_pack_append_buffer(x, buf, 9); \ - } \ - } \ -} while(0) - -#define msgpack_pack_real_int8(x, d) \ -do { \ - if(d < -(1<<5)) { \ - /* signed 8 */ \ - unsigned char buf[2] = {0xd0, TAKE8_8(d)}; \ - msgpack_pack_append_buffer(x, buf, 2); \ - } else { \ - /* fixnum */ \ - msgpack_pack_append_buffer(x, &TAKE8_8(d), 1); \ - } \ -} while(0) - -#define msgpack_pack_real_int16(x, d) \ -do { \ - if(d < -(1<<5)) { \ - if(d < -(1<<7)) { \ - /* signed 16 */ \ - unsigned char buf[3]; \ - buf[0] = 0xd1; *(uint16_t*)&buf[1] = _msgpack_be16(d); \ - msgpack_pack_append_buffer(x, buf, 3); \ - } else { \ - /* signed 8 */ \ - unsigned char buf[2] = {0xd0, TAKE8_16(d)}; \ - msgpack_pack_append_buffer(x, buf, 2); \ - } \ - } else if(d < (1<<7)) { \ - /* fixnum */ \ - msgpack_pack_append_buffer(x, &TAKE8_16(d), 1); \ - } else { \ - if(d < (1<<8)) { \ - /* unsigned 8 */ \ - unsigned char buf[2] = {0xcc, TAKE8_16(d)}; \ - msgpack_pack_append_buffer(x, buf, 2); \ - } else { \ - /* unsigned 16 */ \ - unsigned char buf[3]; \ - buf[0] = 0xcd; *(uint16_t*)&buf[1] = _msgpack_be16(d); \ - msgpack_pack_append_buffer(x, buf, 3); \ - } \ - } \ -} while(0) - -#define msgpack_pack_real_int32(x, d) \ -do { \ - if(d < -(1<<5)) { \ - if(d < -(1<<15)) { \ - /* signed 32 */ \ - unsigned char buf[5]; \ - buf[0] = 0xd2; *(uint32_t*)&buf[1] = _msgpack_be32(d); \ - msgpack_pack_append_buffer(x, buf, 5); \ - } else if(d < -(1<<7)) { \ - /* signed 16 */ \ - unsigned char buf[3]; \ - buf[0] = 0xd1; *(uint16_t*)&buf[1] = _msgpack_be16(d); \ - msgpack_pack_append_buffer(x, buf, 3); \ - } else { \ - /* signed 8 */ \ - unsigned char buf[2] = {0xd0, TAKE8_32(d)}; \ - msgpack_pack_append_buffer(x, buf, 2); \ - } \ - } else if(d < (1<<7)) { \ - /* fixnum */ \ - msgpack_pack_append_buffer(x, &TAKE8_32(d), 1); \ - } else { \ - if(d < (1<<8)) { \ - /* unsigned 8 */ \ - unsigned char buf[2] = {0xcc, TAKE8_32(d)}; \ - msgpack_pack_append_buffer(x, buf, 2); \ - } else if(d < (1<<16)) { \ - /* unsigned 16 */ \ - unsigned char buf[3]; \ - buf[0] = 0xcd; *(uint16_t*)&buf[1] = _msgpack_be16(d); \ - msgpack_pack_append_buffer(x, buf, 3); \ - } else { \ - /* unsigned 32 */ \ - unsigned char buf[5]; \ - buf[0] = 0xce; *(uint32_t*)&buf[1] = _msgpack_be32(d); \ - msgpack_pack_append_buffer(x, buf, 5); \ - } \ - } \ -} while(0) - -#define msgpack_pack_real_int64(x, d) \ -do { \ - if(d < -(1LL<<5)) { \ - if(d < -(1LL<<15)) { \ - if(d < -(1LL<<31)) { \ - /* signed 64 */ \ - unsigned char buf[9]; \ - buf[0] = 0xd3; *(uint64_t*)&buf[1] = _msgpack_be64(d); \ - msgpack_pack_append_buffer(x, buf, 9); \ - } else { \ - /* signed 32 */ \ - unsigned char buf[5]; \ - buf[0] = 0xd2; *(uint32_t*)&buf[1] = _msgpack_be32(d); \ - msgpack_pack_append_buffer(x, buf, 5); \ - } \ - } else { \ - if(d < -(1<<7)) { \ - /* signed 16 */ \ - unsigned char buf[3]; \ - buf[0] = 0xd1; *(uint16_t*)&buf[1] = _msgpack_be16(d); \ - msgpack_pack_append_buffer(x, buf, 3); \ - } else { \ - /* signed 8 */ \ - unsigned char buf[2] = {0xd0, TAKE8_64(d)}; \ - msgpack_pack_append_buffer(x, buf, 2); \ - } \ - } \ - } else if(d < (1<<7)) { \ - /* fixnum */ \ - msgpack_pack_append_buffer(x, &TAKE8_64(d), 1); \ - } else { \ - if(d < (1LL<<16)) { \ - if(d < (1<<8)) { \ - /* unsigned 8 */ \ - unsigned char buf[2] = {0xcc, TAKE8_64(d)}; \ - msgpack_pack_append_buffer(x, buf, 2); \ - } else { \ - /* unsigned 16 */ \ - unsigned char buf[3]; \ - buf[0] = 0xcd; *(uint16_t*)&buf[1] = _msgpack_be16(d); \ - msgpack_pack_append_buffer(x, buf, 3); \ - } \ - } else { \ - if(d < (1LL<<32)) { \ - /* unsigned 32 */ \ - unsigned char buf[5]; \ - buf[0] = 0xce; *(uint32_t*)&buf[1] = _msgpack_be32(d); \ - msgpack_pack_append_buffer(x, buf, 5); \ - } else { \ - /* unsigned 64 */ \ - unsigned char buf[9]; \ - buf[0] = 0xcf; *(uint64_t*)&buf[1] = _msgpack_be64(d); \ - msgpack_pack_append_buffer(x, buf, 9); \ - } \ - } \ - } \ -} while(0) - - -#ifdef msgpack_pack_inline_func_fastint - -msgpack_pack_inline_func_fastint(_uint8)(msgpack_pack_user x, uint8_t d) -{ - unsigned char buf[2] = {0xcc, TAKE8_8(d)}; - msgpack_pack_append_buffer(x, buf, 2); -} - -msgpack_pack_inline_func_fastint(_uint16)(msgpack_pack_user x, uint16_t d) -{ - unsigned char buf[3]; - buf[0] = 0xcd; *(uint16_t*)&buf[1] = _msgpack_be16(d); - msgpack_pack_append_buffer(x, buf, 3); -} - -msgpack_pack_inline_func_fastint(_uint32)(msgpack_pack_user x, uint32_t d) -{ - unsigned char buf[5]; - buf[0] = 0xce; *(uint32_t*)&buf[1] = _msgpack_be32(d); - msgpack_pack_append_buffer(x, buf, 5); -} - -msgpack_pack_inline_func_fastint(_uint64)(msgpack_pack_user x, uint64_t d) -{ - unsigned char buf[9]; - buf[0] = 0xcf; *(uint64_t*)&buf[1] = _msgpack_be64(d); - msgpack_pack_append_buffer(x, buf, 9); -} - -msgpack_pack_inline_func_fastint(_int8)(msgpack_pack_user x, int8_t d) -{ - unsigned char buf[2] = {0xd0, TAKE8_8(d)}; - msgpack_pack_append_buffer(x, buf, 2); -} - -msgpack_pack_inline_func_fastint(_int16)(msgpack_pack_user x, int16_t d) -{ - unsigned char buf[3]; - buf[0] = 0xd1; *(uint16_t*)&buf[1] = _msgpack_be16(d); - msgpack_pack_append_buffer(x, buf, 3); -} - -msgpack_pack_inline_func_fastint(_int32)(msgpack_pack_user x, int32_t d) -{ - unsigned char buf[5]; - buf[0] = 0xd2; *(uint32_t*)&buf[1] = _msgpack_be32(d); - msgpack_pack_append_buffer(x, buf, 5); -} - -msgpack_pack_inline_func_fastint(_int64)(msgpack_pack_user x, int64_t d) -{ - unsigned char buf[9]; - buf[0] = 0xd3; *(uint64_t*)&buf[1] = _msgpack_be64(d); - msgpack_pack_append_buffer(x, buf, 9); -} - -#undef msgpack_pack_inline_func_fastint -#endif - - -msgpack_pack_inline_func(_uint8)(msgpack_pack_user x, uint8_t d) -{ - msgpack_pack_real_uint8(x, d); -} - -msgpack_pack_inline_func(_uint16)(msgpack_pack_user x, uint16_t d) -{ - msgpack_pack_real_uint16(x, d); -} - -msgpack_pack_inline_func(_uint32)(msgpack_pack_user x, uint32_t d) -{ - msgpack_pack_real_uint32(x, d); -} - -msgpack_pack_inline_func(_uint64)(msgpack_pack_user x, uint64_t d) -{ - msgpack_pack_real_uint64(x, d); -} - -msgpack_pack_inline_func(_int8)(msgpack_pack_user x, int8_t d) -{ - msgpack_pack_real_int8(x, d); -} - -msgpack_pack_inline_func(_int16)(msgpack_pack_user x, int16_t d) -{ - msgpack_pack_real_int16(x, d); -} - -msgpack_pack_inline_func(_int32)(msgpack_pack_user x, int32_t d) -{ - msgpack_pack_real_int32(x, d); -} - -msgpack_pack_inline_func(_int64)(msgpack_pack_user x, int64_t d) -{ - msgpack_pack_real_int64(x, d); -} - - -#ifdef msgpack_pack_inline_func_cint - -msgpack_pack_inline_func_cint(_short)(msgpack_pack_user x, short d) -{ -#if defined(SIZEOF_SHORT) || defined(SHRT_MAX) -#if SIZEOF_SHORT == 2 || SHRT_MAX == 0x7fff - msgpack_pack_real_int16(x, d); -#elif SIZEOF_SHORT == 4 || SHRT_MAX == 0x7fffffff - msgpack_pack_real_int32(x, d); -#else - msgpack_pack_real_int64(x, d); -#endif -#else -if(sizeof(short) == 2) { - msgpack_pack_real_int16(x, d); -} else if(sizeof(short) == 4) { - msgpack_pack_real_int32(x, d); -} else { - msgpack_pack_real_int64(x, d); -} -#endif -} - -msgpack_pack_inline_func_cint(_int)(msgpack_pack_user x, int d) -{ -#if defined(SIZEOF_INT) || defined(INT_MAX) -#if SIZEOF_INT == 2 || INT_MAX == 0x7fff - msgpack_pack_real_int16(x, d); -#elif SIZEOF_INT == 4 || INT_MAX == 0x7fffffff - msgpack_pack_real_int32(x, d); -#else - msgpack_pack_real_int64(x, d); -#endif -#else -if(sizeof(int) == 2) { - msgpack_pack_real_int16(x, d); -} else if(sizeof(int) == 4) { - msgpack_pack_real_int32(x, d); -} else { - msgpack_pack_real_int64(x, d); -} -#endif -} - -msgpack_pack_inline_func_cint(_long)(msgpack_pack_user x, long d) -{ -#if defined(SIZEOF_LONG) || defined(LONG_MAX) -#if SIZEOF_LONG == 2 || LONG_MAX == 0x7fffL - msgpack_pack_real_int16(x, d); -#elif SIZEOF_LONG == 4 || LONG_MAX == 0x7fffffffL - msgpack_pack_real_int32(x, d); -#else - msgpack_pack_real_int64(x, d); -#endif -#else -if(sizeof(long) == 2) { - msgpack_pack_real_int16(x, d); -} else if(sizeof(long) == 4) { - msgpack_pack_real_int32(x, d); -} else { - msgpack_pack_real_int64(x, d); -} -#endif -} - -msgpack_pack_inline_func_cint(_long_long)(msgpack_pack_user x, long long d) -{ -#if defined(SIZEOF_LONG_LONG) || defined(LLONG_MAX) -#if SIZEOF_LONG_LONG == 2 || LLONG_MAX == 0x7fffL - msgpack_pack_real_int16(x, d); -#elif SIZEOF_LONG_LONG == 4 || LLONG_MAX == 0x7fffffffL - msgpack_pack_real_int32(x, d); -#else - msgpack_pack_real_int64(x, d); -#endif -#else -if(sizeof(long long) == 2) { - msgpack_pack_real_int16(x, d); -} else if(sizeof(long long) == 4) { - msgpack_pack_real_int32(x, d); -} else { - msgpack_pack_real_int64(x, d); -} -#endif -} - -msgpack_pack_inline_func_cint(_unsigned_short)(msgpack_pack_user x, unsigned short d) -{ -#if defined(SIZEOF_SHORT) || defined(USHRT_MAX) -#if SIZEOF_SHORT == 2 || USHRT_MAX == 0xffffU - msgpack_pack_real_uint16(x, d); -#elif SIZEOF_SHORT == 4 || USHRT_MAX == 0xffffffffU - msgpack_pack_real_uint32(x, d); -#else - msgpack_pack_real_uint64(x, d); -#endif -#else -if(sizeof(unsigned short) == 2) { - msgpack_pack_real_uint16(x, d); -} else if(sizeof(unsigned short) == 4) { - msgpack_pack_real_uint32(x, d); -} else { - msgpack_pack_real_uint64(x, d); -} -#endif -} - -msgpack_pack_inline_func_cint(_unsigned_int)(msgpack_pack_user x, unsigned int d) -{ -#if defined(SIZEOF_INT) || defined(UINT_MAX) -#if SIZEOF_INT == 2 || UINT_MAX == 0xffffU - msgpack_pack_real_uint16(x, d); -#elif SIZEOF_INT == 4 || UINT_MAX == 0xffffffffU - msgpack_pack_real_uint32(x, d); -#else - msgpack_pack_real_uint64(x, d); -#endif -#else -if(sizeof(unsigned int) == 2) { - msgpack_pack_real_uint16(x, d); -} else if(sizeof(unsigned int) == 4) { - msgpack_pack_real_uint32(x, d); -} else { - msgpack_pack_real_uint64(x, d); -} -#endif -} - -msgpack_pack_inline_func_cint(_unsigned_long)(msgpack_pack_user x, unsigned long d) -{ -#if defined(SIZEOF_LONG) || defined(ULONG_MAX) -#if SIZEOF_LONG == 2 || ULONG_MAX == 0xffffUL - msgpack_pack_real_uint16(x, d); -#elif SIZEOF_LONG == 4 || ULONG_MAX == 0xffffffffUL - msgpack_pack_real_uint32(x, d); -#else - msgpack_pack_real_uint64(x, d); -#endif -#else -if(sizeof(unsigned int) == 2) { - msgpack_pack_real_uint16(x, d); -} else if(sizeof(unsigned int) == 4) { - msgpack_pack_real_uint32(x, d); -} else { - msgpack_pack_real_uint64(x, d); -} -#endif -} - -msgpack_pack_inline_func_cint(_unsigned_long_long)(msgpack_pack_user x, unsigned long long d) -{ -#if defined(SIZEOF_LONG_LONG) || defined(ULLONG_MAX) -#if SIZEOF_LONG_LONG == 2 || ULLONG_MAX == 0xffffUL - msgpack_pack_real_uint16(x, d); -#elif SIZEOF_LONG_LONG == 4 || ULLONG_MAX == 0xffffffffUL - msgpack_pack_real_uint32(x, d); -#else - msgpack_pack_real_uint64(x, d); -#endif -#else -if(sizeof(unsigned long long) == 2) { - msgpack_pack_real_uint16(x, d); -} else if(sizeof(unsigned long long) == 4) { - msgpack_pack_real_uint32(x, d); -} else { - msgpack_pack_real_uint64(x, d); -} -#endif -} - -#undef msgpack_pack_inline_func_cint -#endif - - - -/* - * Float - */ - -msgpack_pack_inline_func(_float)(msgpack_pack_user x, float d) -{ - union { char buf[4]; uint32_t num; } f; - *((float*)&f.buf) = d; // FIXME - unsigned char buf[5]; - buf[0] = 0xca; *(uint32_t*)&buf[1] = _msgpack_be32(f.num); - msgpack_pack_append_buffer(x, buf, 5); -} - -msgpack_pack_inline_func(_double)(msgpack_pack_user x, double d) -{ - union { char buf[8]; uint64_t num; } f; - *((double*)&f.buf) = d; // FIXME - unsigned char buf[9]; - buf[0] = 0xcb; *(uint64_t*)&buf[1] = _msgpack_be64(f.num); - msgpack_pack_append_buffer(x, buf, 9); -} - - -/* - * Nil - */ - -msgpack_pack_inline_func(_nil)(msgpack_pack_user x) -{ - static const unsigned char d = 0xc0; - msgpack_pack_append_buffer(x, &d, 1); -} - - -/* - * Boolean - */ - -msgpack_pack_inline_func(_true)(msgpack_pack_user x) -{ - static const unsigned char d = 0xc3; - msgpack_pack_append_buffer(x, &d, 1); -} - -msgpack_pack_inline_func(_false)(msgpack_pack_user x) -{ - static const unsigned char d = 0xc2; - msgpack_pack_append_buffer(x, &d, 1); -} - - -/* - * Array - */ - -msgpack_pack_inline_func(_array)(msgpack_pack_user x, unsigned int n) -{ - if(n < 16) { - unsigned char d = 0x90 | n; - msgpack_pack_append_buffer(x, &d, 1); - } else if(n < 65536) { - unsigned char buf[3]; - buf[0] = 0xdc; *(uint16_t*)&buf[1] = _msgpack_be16(n); - msgpack_pack_append_buffer(x, buf, 3); - } else { - unsigned char buf[5]; - buf[0] = 0xdd; *(uint32_t*)&buf[1] = _msgpack_be32(n); - msgpack_pack_append_buffer(x, buf, 5); - } -} - - -/* - * Map - */ - -msgpack_pack_inline_func(_map)(msgpack_pack_user x, unsigned int n) -{ - if(n < 16) { - unsigned char d = 0x80 | n; - msgpack_pack_append_buffer(x, &TAKE8_8(d), 1); - } else if(n < 65536) { - unsigned char buf[3]; - buf[0] = 0xde; *(uint16_t*)&buf[1] = _msgpack_be16(n); - msgpack_pack_append_buffer(x, buf, 3); - } else { - unsigned char buf[5]; - buf[0] = 0xdf; *(uint32_t*)&buf[1] = _msgpack_be32(n); - msgpack_pack_append_buffer(x, buf, 5); - } -} - - -/* - * Raw - */ - -msgpack_pack_inline_func(_raw)(msgpack_pack_user x, size_t l) -{ - if(l < 32) { - unsigned char d = 0xa0 | l; - msgpack_pack_append_buffer(x, &TAKE8_8(d), 1); - } else if(l < 65536) { - unsigned char buf[3]; - buf[0] = 0xda; *(uint16_t*)&buf[1] = _msgpack_be16(l); - msgpack_pack_append_buffer(x, buf, 3); - } else { - unsigned char buf[5]; - buf[0] = 0xdb; *(uint32_t*)&buf[1] = _msgpack_be32(l); - msgpack_pack_append_buffer(x, buf, 5); - } -} - -msgpack_pack_inline_func(_raw_body)(msgpack_pack_user x, const void* b, size_t l) -{ - msgpack_pack_append_buffer(x, (const unsigned char*)b, l); -} - -#undef msgpack_pack_inline_func -#undef msgpack_pack_user -#undef msgpack_pack_append_buffer - -#undef TAKE8_8 -#undef TAKE8_16 -#undef TAKE8_32 -#undef TAKE8_64 - -#undef msgpack_pack_real_uint8 -#undef msgpack_pack_real_uint16 -#undef msgpack_pack_real_uint32 -#undef msgpack_pack_real_uint64 -#undef msgpack_pack_real_int8 -#undef msgpack_pack_real_int16 -#undef msgpack_pack_real_int32 -#undef msgpack_pack_real_int64 - diff --git a/python/msgpack/sysdep.h b/python/msgpack/sysdep.h deleted file mode 100644 index 106158ea..00000000 --- a/python/msgpack/sysdep.h +++ /dev/null @@ -1,94 +0,0 @@ -/* - * MessagePack system dependencies - * - * Copyright (C) 2008-2009 FURUHASHI Sadayuki - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -#ifndef MSGPACK_SYSDEP_H__ -#define MSGPACK_SYSDEP_H__ - - -#ifdef _MSC_VER -typedef __int8 int8_t; -typedef unsigned __int8 uint8_t; -typedef __int16 int16_t; -typedef unsigned __int16 uint16_t; -typedef __int32 int32_t; -typedef unsigned __int32 uint32_t; -typedef __int64 int64_t; -typedef unsigned __int64 uint64_t; -#else -#include -#include -#include -#endif - - -#ifdef _WIN32 -typedef long _msgpack_atomic_counter_t; -#define _msgpack_sync_decr_and_fetch(ptr) InterlockedDecrement(ptr) -#define _msgpack_sync_incr_and_fetch(ptr) InterlockedIncrement(ptr) -#else -typedef unsigned int _msgpack_atomic_counter_t; -#define _msgpack_sync_decr_and_fetch(ptr) __sync_sub_and_fetch(ptr, 1) -#define _msgpack_sync_incr_and_fetch(ptr) __sync_add_and_fetch(ptr, 1) -#endif - - -#ifdef _WIN32 -#include -#else -#include /* __BYTE_ORDER */ -#endif - -#if !defined(__LITTLE_ENDIAN__) && !defined(__BIG_ENDIAN__) -#if __BYTE_ORDER == __LITTLE_ENDIAN -#define __LITTLE_ENDIAN__ -#elif __BYTE_ORDER == __BIG_ENDIAN -#define __BIG_ENDIAN__ -#endif -#endif - -#ifdef __LITTLE_ENDIAN__ - -#define _msgpack_be16(x) ntohs(x) -#define _msgpack_be32(x) ntohl(x) - -#if defined(_byteswap_uint64) -# define _msgpack_be64(x) (_byteswap_uint64(x)) -#elif defined(bswap_64) -# define _msgpack_be64(x) bswap_64(x) -#elif defined(__DARWIN_OSSwapInt64) -# define _msgpack_be64(x) __DARWIN_OSSwapInt64(x) -#else -#define _msgpack_be64(x) \ - ( ((((uint64_t)x) << 56) & 0xff00000000000000ULL ) | \ - ((((uint64_t)x) << 40) & 0x00ff000000000000ULL ) | \ - ((((uint64_t)x) << 24) & 0x0000ff0000000000ULL ) | \ - ((((uint64_t)x) << 8) & 0x000000ff00000000ULL ) | \ - ((((uint64_t)x) >> 8) & 0x00000000ff000000ULL ) | \ - ((((uint64_t)x) >> 24) & 0x0000000000ff0000ULL ) | \ - ((((uint64_t)x) >> 40) & 0x000000000000ff00ULL ) | \ - ((((uint64_t)x) >> 56) & 0x00000000000000ffULL ) ) -#endif - -#else -#define _msgpack_be16(x) (x) -#define _msgpack_be32(x) (x) -#define _msgpack_be64(x) (x) -#endif - - -#endif /* msgpack/sysdep.h */ - diff --git a/python/msgpack/unpack.h b/python/msgpack/unpack.h deleted file mode 100644 index 0586ca86..00000000 --- a/python/msgpack/unpack.h +++ /dev/null @@ -1,213 +0,0 @@ -/* - * MessagePack for Python unpacking routine - * - * Copyright (C) 2009 Naoki INADA - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#define MSGPACK_MAX_STACK_SIZE (1024) -#include "unpack_define.h" - -typedef struct unpack_user { - int use_list; - PyObject *object_hook; - PyObject *list_hook; - const char *encoding; - const char *unicode_errors; -} unpack_user; - - -#define msgpack_unpack_struct(name) \ - struct template ## name - -#define msgpack_unpack_func(ret, name) \ - static inline ret template ## name - -#define msgpack_unpack_callback(name) \ - template_callback ## name - -#define msgpack_unpack_object PyObject* - -#define msgpack_unpack_user unpack_user - - -struct template_context; -typedef struct template_context template_context; - -static inline msgpack_unpack_object template_callback_root(unpack_user* u) -{ - return NULL; -} - -static inline int template_callback_uint16(unpack_user* u, uint16_t d, msgpack_unpack_object* o) -{ - PyObject *p = PyInt_FromLong((long)d); - if (!p) - return -1; - *o = p; - return 0; -} -static inline int template_callback_uint8(unpack_user* u, uint8_t d, msgpack_unpack_object* o) -{ - return template_callback_uint16(u, d, o); -} - - -static inline int template_callback_uint32(unpack_user* u, uint32_t d, msgpack_unpack_object* o) -{ - PyObject *p; - if (d > LONG_MAX) { - p = PyLong_FromUnsignedLong((unsigned long)d); - } else { - p = PyInt_FromLong((long)d); - } - if (!p) - return -1; - *o = p; - return 0; -} - -static inline int template_callback_uint64(unpack_user* u, uint64_t d, msgpack_unpack_object* o) -{ - PyObject *p = PyLong_FromUnsignedLongLong(d); - if (!p) - return -1; - *o = p; - return 0; -} - -static inline int template_callback_int32(unpack_user* u, int32_t d, msgpack_unpack_object* o) -{ - PyObject *p = PyInt_FromLong(d); - if (!p) - return -1; - *o = p; - return 0; -} - -static inline int template_callback_int16(unpack_user* u, int16_t d, msgpack_unpack_object* o) -{ - return template_callback_int32(u, d, o); -} - -static inline int template_callback_int8(unpack_user* u, int8_t d, msgpack_unpack_object* o) -{ - return template_callback_int32(u, d, o); -} - -static inline int template_callback_int64(unpack_user* u, int64_t d, msgpack_unpack_object* o) -{ - PyObject *p = PyLong_FromLongLong(d); - if (!p) - return -1; - *o = p; - return 0; -} - -static inline int template_callback_double(unpack_user* u, double d, msgpack_unpack_object* o) -{ - PyObject *p = PyFloat_FromDouble(d); - if (!p) - return -1; - *o = p; - return 0; -} - -static inline int template_callback_float(unpack_user* u, float d, msgpack_unpack_object* o) -{ - return template_callback_double(u, d, o); -} - -static inline int template_callback_nil(unpack_user* u, msgpack_unpack_object* o) -{ Py_INCREF(Py_None); *o = Py_None; return 0; } - -static inline int template_callback_true(unpack_user* u, msgpack_unpack_object* o) -{ Py_INCREF(Py_True); *o = Py_True; return 0; } - -static inline int template_callback_false(unpack_user* u, msgpack_unpack_object* o) -{ Py_INCREF(Py_False); *o = Py_False; return 0; } - -static inline int template_callback_array(unpack_user* u, unsigned int n, msgpack_unpack_object* o) -{ - PyObject *p = u->use_list ? PyList_New(n) : PyTuple_New(n); - - if (!p) - return -1; - *o = p; - return 0; -} - -static inline int template_callback_array_item(unpack_user* u, unsigned int current, msgpack_unpack_object* c, msgpack_unpack_object o) -{ - if (u->use_list) - PyList_SET_ITEM(*c, current, o); - else - PyTuple_SET_ITEM(*c, current, o); - return 0; -} - -static inline int template_callback_array_end(unpack_user* u, msgpack_unpack_object* c) -{ - if (u->list_hook) { - PyObject *arglist = Py_BuildValue("(O)", *c); - *c = PyEval_CallObject(u->list_hook, arglist); - Py_DECREF(arglist); - } - return 0; -} - -static inline int template_callback_map(unpack_user* u, unsigned int n, msgpack_unpack_object* o) -{ - PyObject *p = PyDict_New(); - if (!p) - return -1; - *o = p; - return 0; -} - -static inline int template_callback_map_item(unpack_user* u, msgpack_unpack_object* c, msgpack_unpack_object k, msgpack_unpack_object v) -{ - if (PyDict_SetItem(*c, k, v) == 0) { - Py_DECREF(k); - Py_DECREF(v); - return 0; - } - return -1; -} - -static inline int template_callback_map_end(unpack_user* u, msgpack_unpack_object* c) -{ - if (u->object_hook) { - PyObject *arglist = Py_BuildValue("(O)", *c); - *c = PyEval_CallObject(u->object_hook, arglist); - Py_DECREF(arglist); - } - return 0; -} - -static inline int template_callback_raw(unpack_user* u, const char* b, const char* p, unsigned int l, msgpack_unpack_object* o) -{ - PyObject *py; - if(u->encoding) { - py = PyUnicode_Decode(p, l, u->encoding, u->unicode_errors); - } else { - py = PyBytes_FromStringAndSize(p, l); - } - if (!py) - return -1; - *o = py; - return 0; -} - -#include "unpack_template.h" diff --git a/python/msgpack/unpack_define.h b/python/msgpack/unpack_define.h deleted file mode 100644 index 63d90a8e..00000000 --- a/python/msgpack/unpack_define.h +++ /dev/null @@ -1,92 +0,0 @@ -/* - * MessagePack unpacking routine template - * - * Copyright (C) 2008-2009 FURUHASHI Sadayuki - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -#ifndef MSGPACK_UNPACK_DEFINE_H__ -#define MSGPACK_UNPACK_DEFINE_H__ - -#include "sysdep.h" -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - - -#ifndef MSGPACK_MAX_STACK_SIZE -#define MSGPACK_MAX_STACK_SIZE 16 -#endif - - -typedef enum { - CS_HEADER = 0x00, // nil - - //CS_ = 0x01, - //CS_ = 0x02, // false - //CS_ = 0x03, // true - - //CS_ = 0x04, - //CS_ = 0x05, - //CS_ = 0x06, - //CS_ = 0x07, - - //CS_ = 0x08, - //CS_ = 0x09, - CS_FLOAT = 0x0a, - CS_DOUBLE = 0x0b, - CS_UINT_8 = 0x0c, - CS_UINT_16 = 0x0d, - CS_UINT_32 = 0x0e, - CS_UINT_64 = 0x0f, - CS_INT_8 = 0x10, - CS_INT_16 = 0x11, - CS_INT_32 = 0x12, - CS_INT_64 = 0x13, - - //CS_ = 0x14, - //CS_ = 0x15, - //CS_BIG_INT_16 = 0x16, - //CS_BIG_INT_32 = 0x17, - //CS_BIG_FLOAT_16 = 0x18, - //CS_BIG_FLOAT_32 = 0x19, - CS_RAW_16 = 0x1a, - CS_RAW_32 = 0x1b, - CS_ARRAY_16 = 0x1c, - CS_ARRAY_32 = 0x1d, - CS_MAP_16 = 0x1e, - CS_MAP_32 = 0x1f, - - //ACS_BIG_INT_VALUE, - //ACS_BIG_FLOAT_VALUE, - ACS_RAW_VALUE, -} msgpack_unpack_state; - - -typedef enum { - CT_ARRAY_ITEM, - CT_MAP_KEY, - CT_MAP_VALUE, -} msgpack_container_type; - - -#ifdef __cplusplus -} -#endif - -#endif /* msgpack/unpack_define.h */ - diff --git a/python/msgpack/unpack_template.h b/python/msgpack/unpack_template.h deleted file mode 100644 index 7a2288f1..00000000 --- a/python/msgpack/unpack_template.h +++ /dev/null @@ -1,385 +0,0 @@ -/* - * MessagePack unpacking routine template - * - * Copyright (C) 2008-2009 FURUHASHI Sadayuki - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef msgpack_unpack_func -#error msgpack_unpack_func template is not defined -#endif - -#ifndef msgpack_unpack_callback -#error msgpack_unpack_callback template is not defined -#endif - -#ifndef msgpack_unpack_struct -#error msgpack_unpack_struct template is not defined -#endif - -#ifndef msgpack_unpack_struct_decl -#define msgpack_unpack_struct_decl(name) msgpack_unpack_struct(name) -#endif - -#ifndef msgpack_unpack_object -#error msgpack_unpack_object type is not defined -#endif - -#ifndef msgpack_unpack_user -#error msgpack_unpack_user type is not defined -#endif - -#ifndef USE_CASE_RANGE -#if !defined(_MSC_VER) -#define USE_CASE_RANGE -#endif -#endif - -msgpack_unpack_struct_decl(_stack) { - msgpack_unpack_object obj; - size_t count; - unsigned int ct; - - union { - size_t curr; - msgpack_unpack_object map_key; - }; -}; - -msgpack_unpack_struct_decl(_context) { - msgpack_unpack_user user; - unsigned int cs; - unsigned int trail; - unsigned int top; - msgpack_unpack_struct(_stack) stack[MSGPACK_MAX_STACK_SIZE]; -}; - - -msgpack_unpack_func(void, _init)(msgpack_unpack_struct(_context)* ctx) -{ - ctx->cs = CS_HEADER; - ctx->trail = 0; - ctx->top = 0; - ctx->stack[0].obj = msgpack_unpack_callback(_root)(&ctx->user); -} - -msgpack_unpack_func(msgpack_unpack_object, _data)(msgpack_unpack_struct(_context)* ctx) -{ - return (ctx)->stack[0].obj; -} - - -msgpack_unpack_func(int, _execute)(msgpack_unpack_struct(_context)* ctx, const char* data, size_t len, size_t* off) -{ - assert(len >= *off); - - const unsigned char* p = (unsigned char*)data + *off; - const unsigned char* const pe = (unsigned char*)data + len; - const void* n = NULL; - - unsigned int trail = ctx->trail; - unsigned int cs = ctx->cs; - unsigned int top = ctx->top; - msgpack_unpack_struct(_stack)* stack = ctx->stack; - msgpack_unpack_user* user = &ctx->user; - - msgpack_unpack_object obj; - msgpack_unpack_struct(_stack)* c = NULL; - - int ret; - -#define push_simple_value(func) \ - if(msgpack_unpack_callback(func)(user, &obj) < 0) { goto _failed; } \ - goto _push -#define push_fixed_value(func, arg) \ - if(msgpack_unpack_callback(func)(user, arg, &obj) < 0) { goto _failed; } \ - goto _push -#define push_variable_value(func, base, pos, len) \ - if(msgpack_unpack_callback(func)(user, \ - (const char*)base, (const char*)pos, len, &obj) < 0) { goto _failed; } \ - goto _push - -#define again_fixed_trail(_cs, trail_len) \ - trail = trail_len; \ - cs = _cs; \ - goto _fixed_trail_again -#define again_fixed_trail_if_zero(_cs, trail_len, ifzero) \ - trail = trail_len; \ - if(trail == 0) { goto ifzero; } \ - cs = _cs; \ - goto _fixed_trail_again - -#define start_container(func, count_, ct_) \ - if(msgpack_unpack_callback(func)(user, count_, &stack[top].obj) < 0) { goto _failed; } \ - if((count_) == 0) { obj = stack[top].obj; goto _push; } \ - if(top >= MSGPACK_MAX_STACK_SIZE) { goto _failed; } \ - stack[top].ct = ct_; \ - stack[top].curr = 0; \ - stack[top].count = count_; \ - /*printf("container %d count %d stack %d\n",stack[top].obj,count_,top);*/ \ - /*printf("stack push %d\n", top);*/ \ - ++top; \ - goto _header_again - -#define NEXT_CS(p) \ - ((unsigned int)*p & 0x1f) - -#define PTR_CAST_8(ptr) (*(uint8_t*)ptr) -#define PTR_CAST_16(ptr) _msgpack_be16(*(uint16_t*)ptr) -#define PTR_CAST_32(ptr) _msgpack_be32(*(uint32_t*)ptr) -#define PTR_CAST_64(ptr) _msgpack_be64(*(uint64_t*)ptr) - -#ifdef USE_CASE_RANGE -#define SWITCH_RANGE_BEGIN switch(*p) { -#define SWITCH_RANGE(FROM, TO) case FROM ... TO: -#define SWITCH_RANGE_DEFAULT default: -#define SWITCH_RANGE_END } -#else -#define SWITCH_RANGE_BEGIN { if(0) { -#define SWITCH_RANGE(FROM, TO) } else if(FROM <= *p && *p <= TO) { -#define SWITCH_RANGE_DEFAULT } else { -#define SWITCH_RANGE_END } } -#endif - - if(p == pe) { goto _out; } - do { - switch(cs) { - case CS_HEADER: - SWITCH_RANGE_BEGIN - SWITCH_RANGE(0x00, 0x7f) // Positive Fixnum - push_fixed_value(_uint8, *(uint8_t*)p); - SWITCH_RANGE(0xe0, 0xff) // Negative Fixnum - push_fixed_value(_int8, *(int8_t*)p); - SWITCH_RANGE(0xc0, 0xdf) // Variable - switch(*p) { - case 0xc0: // nil - push_simple_value(_nil); - //case 0xc1: // string - // again_terminal_trail(NEXT_CS(p), p+1); - case 0xc2: // false - push_simple_value(_false); - case 0xc3: // true - push_simple_value(_true); - //case 0xc4: - //case 0xc5: - //case 0xc6: - //case 0xc7: - //case 0xc8: - //case 0xc9: - case 0xca: // float - case 0xcb: // double - case 0xcc: // unsigned int 8 - case 0xcd: // unsigned int 16 - case 0xce: // unsigned int 32 - case 0xcf: // unsigned int 64 - case 0xd0: // signed int 8 - case 0xd1: // signed int 16 - case 0xd2: // signed int 32 - case 0xd3: // signed int 64 - again_fixed_trail(NEXT_CS(p), 1 << (((unsigned int)*p) & 0x03)); - //case 0xd4: - //case 0xd5: - //case 0xd6: // big integer 16 - //case 0xd7: // big integer 32 - //case 0xd8: // big float 16 - //case 0xd9: // big float 32 - case 0xda: // raw 16 - case 0xdb: // raw 32 - case 0xdc: // array 16 - case 0xdd: // array 32 - case 0xde: // map 16 - case 0xdf: // map 32 - again_fixed_trail(NEXT_CS(p), 2 << (((unsigned int)*p) & 0x01)); - default: - goto _failed; - } - SWITCH_RANGE(0xa0, 0xbf) // FixRaw - again_fixed_trail_if_zero(ACS_RAW_VALUE, ((unsigned int)*p & 0x1f), _raw_zero); - SWITCH_RANGE(0x90, 0x9f) // FixArray - start_container(_array, ((unsigned int)*p) & 0x0f, CT_ARRAY_ITEM); - SWITCH_RANGE(0x80, 0x8f) // FixMap - start_container(_map, ((unsigned int)*p) & 0x0f, CT_MAP_KEY); - - SWITCH_RANGE_DEFAULT - goto _failed; - SWITCH_RANGE_END - // end CS_HEADER - - - _fixed_trail_again: - ++p; - - default: - if((size_t)(pe - p) < trail) { goto _out; } - n = p; p += trail - 1; - switch(cs) { - //case CS_ - //case CS_ - case CS_FLOAT: { - union { uint32_t num; char buf[4]; } f; - f.num = PTR_CAST_32(n); // FIXME - push_fixed_value(_float, *((float*)f.buf)); } - case CS_DOUBLE: { - union { uint64_t num; char buf[8]; } f; - f.num = PTR_CAST_64(n); // FIXME - push_fixed_value(_double, *((double*)f.buf)); } - case CS_UINT_8: - push_fixed_value(_uint8, (uint8_t)PTR_CAST_8(n)); - case CS_UINT_16: - push_fixed_value(_uint16, (uint16_t)PTR_CAST_16(n)); - case CS_UINT_32: - push_fixed_value(_uint32, (uint32_t)PTR_CAST_32(n)); - case CS_UINT_64: - push_fixed_value(_uint64, (uint64_t)PTR_CAST_64(n)); - - case CS_INT_8: - push_fixed_value(_int8, (int8_t)PTR_CAST_8(n)); - case CS_INT_16: - push_fixed_value(_int16, (int16_t)PTR_CAST_16(n)); - case CS_INT_32: - push_fixed_value(_int32, (int32_t)PTR_CAST_32(n)); - case CS_INT_64: - push_fixed_value(_int64, (int64_t)PTR_CAST_64(n)); - - //case CS_ - //case CS_ - //case CS_BIG_INT_16: - // again_fixed_trail_if_zero(ACS_BIG_INT_VALUE, (uint16_t)PTR_CAST_16(n), _big_int_zero); - //case CS_BIG_INT_32: - // again_fixed_trail_if_zero(ACS_BIG_INT_VALUE, (uint32_t)PTR_CAST_32(n), _big_int_zero); - //case ACS_BIG_INT_VALUE: - //_big_int_zero: - // // FIXME - // push_variable_value(_big_int, data, n, trail); - - //case CS_BIG_FLOAT_16: - // again_fixed_trail_if_zero(ACS_BIG_FLOAT_VALUE, (uint16_t)PTR_CAST_16(n), _big_float_zero); - //case CS_BIG_FLOAT_32: - // again_fixed_trail_if_zero(ACS_BIG_FLOAT_VALUE, (uint32_t)PTR_CAST_32(n), _big_float_zero); - //case ACS_BIG_FLOAT_VALUE: - //_big_float_zero: - // // FIXME - // push_variable_value(_big_float, data, n, trail); - - case CS_RAW_16: - again_fixed_trail_if_zero(ACS_RAW_VALUE, (uint16_t)PTR_CAST_16(n), _raw_zero); - case CS_RAW_32: - again_fixed_trail_if_zero(ACS_RAW_VALUE, (uint32_t)PTR_CAST_32(n), _raw_zero); - case ACS_RAW_VALUE: - _raw_zero: - push_variable_value(_raw, data, n, trail); - - case CS_ARRAY_16: - start_container(_array, (uint16_t)PTR_CAST_16(n), CT_ARRAY_ITEM); - case CS_ARRAY_32: - /* FIXME security guard */ - start_container(_array, (uint32_t)PTR_CAST_32(n), CT_ARRAY_ITEM); - - case CS_MAP_16: - start_container(_map, (uint16_t)PTR_CAST_16(n), CT_MAP_KEY); - case CS_MAP_32: - /* FIXME security guard */ - start_container(_map, (uint32_t)PTR_CAST_32(n), CT_MAP_KEY); - - default: - goto _failed; - } - } - -_push: - if(top == 0) { goto _finish; } - c = &stack[top-1]; - switch(c->ct) { - case CT_ARRAY_ITEM: - if(msgpack_unpack_callback(_array_item)(user, c->curr, &c->obj, obj) < 0) { goto _failed; } - if(++c->curr == c->count) { - msgpack_unpack_callback(_array_end)(user, &c->obj); - obj = c->obj; - --top; - /*printf("stack pop %d\n", top);*/ - goto _push; - } - goto _header_again; - case CT_MAP_KEY: - c->map_key = obj; - c->ct = CT_MAP_VALUE; - goto _header_again; - case CT_MAP_VALUE: - if(msgpack_unpack_callback(_map_item)(user, &c->obj, c->map_key, obj) < 0) { goto _failed; } - if(--c->count == 0) { - msgpack_unpack_callback(_map_end)(user, &c->obj); - obj = c->obj; - --top; - /*printf("stack pop %d\n", top);*/ - goto _push; - } - c->ct = CT_MAP_KEY; - goto _header_again; - - default: - goto _failed; - } - -_header_again: - cs = CS_HEADER; - ++p; - } while(p != pe); - goto _out; - - -_finish: - stack[0].obj = obj; - ++p; - ret = 1; - /*printf("-- finish --\n"); */ - goto _end; - -_failed: - /*printf("** FAILED **\n"); */ - ret = -1; - goto _end; - -_out: - ret = 0; - goto _end; - -_end: - ctx->cs = cs; - ctx->trail = trail; - ctx->top = top; - *off = p - (const unsigned char*)data; - - return ret; -} - - -#undef msgpack_unpack_func -#undef msgpack_unpack_callback -#undef msgpack_unpack_struct -#undef msgpack_unpack_object -#undef msgpack_unpack_user - -#undef push_simple_value -#undef push_fixed_value -#undef push_variable_value -#undef again_fixed_trail -#undef again_fixed_trail_if_zero -#undef start_container - -#undef NEXT_CS -#undef PTR_CAST_8 -#undef PTR_CAST_16 -#undef PTR_CAST_32 -#undef PTR_CAST_64 - diff --git a/python/setup.py b/python/setup.py deleted file mode 100755 index 16987a46..00000000 --- a/python/setup.py +++ /dev/null @@ -1,84 +0,0 @@ -#!/usr/bin/env python -# coding: utf-8 -version = (0, 1, 9, 'final') - -import os -import sys -from glob import glob -from distutils.core import setup, Extension -from distutils.command.sdist import sdist - -try: - from Cython.Distutils import build_ext - import Cython.Compiler.Main as cython_compiler - have_cython = True -except ImportError: - from distutils.command.build_ext import build_ext - have_cython = False - -# make msgpack/__verison__.py -f = open('msgpack/__version__.py', 'w') -f.write("version = %r\n" % (version,)) -f.close() -del f - -version_str = '.'.join(str(x) for x in version[:3]) -if len(version) > 3 and version[3] != 'final': - version_str += version[3] - -# take care of extension modules. -if have_cython: - sources = ['msgpack/_msgpack.pyx'] - - class Sdist(sdist): - def __init__(self, *args, **kwargs): - for src in glob('msgpack/*.pyx'): - cython_compiler.compile(glob('msgpack/*.pyx'), - cython_compiler.default_options) - sdist.__init__(self, *args, **kwargs) -else: - sources = ['msgpack/_msgpack.c'] - - for f in sources: - if not os.path.exists(f): - raise ImportError("Building msgpack from VCS needs Cython. Install Cython or use sdist package.") - - Sdist = sdist - -libraries = ['ws2_32'] if sys.platform == 'win32' else [] - -msgpack_mod = Extension('msgpack._msgpack', - sources=sources, - libraries=libraries, - ) -del sources, libraries - - -desc = 'MessagePack (de)serializer.' -long_desc = """MessagePack (de)serializer for Python. - -What's MessagePack? (from http://msgpack.org/) - - MessagePack is a binary-based efficient data interchange format that is - focused on high performance. It is like JSON, but very fast and small. -""" - -setup(name='msgpack-python', - author='INADA Naoki', - author_email='songofacandy@gmail.com', - version=version_str, - cmdclass={'build_ext': build_ext, 'sdist': Sdist}, - ext_modules=[msgpack_mod], - packages=['msgpack'], - description=desc, - long_description=long_desc, - url='http://msgpack.org/', - download_url='http://pypi.python.org/pypi/msgpack/', - classifiers=[ - 'Programming Language :: Python :: 2', - 'Programming Language :: Python :: 3', - 'Development Status :: 4 - Beta', - 'Intended Audience :: Developers', - 'License :: OSI Approved :: Apache Software License', - ] - ) diff --git a/python/test/test_buffer.py b/python/test/test_buffer.py deleted file mode 100644 index ce7a72d2..00000000 --- a/python/test/test_buffer.py +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/env python -# coding: utf-8 - -from nose import main -from nose.tools import * -from msgpack import packb, unpackb - -def test_unpack_buffer(): - from array import array - buf = array('c') - buf.fromstring(packb(('foo', 'bar'))) - obj = unpackb(buf) - assert_equal(('foo', 'bar'), obj) - -if __name__ == '__main__': - main() diff --git a/python/test/test_case.py b/python/test/test_case.py deleted file mode 100644 index 1cbc4945..00000000 --- a/python/test/test_case.py +++ /dev/null @@ -1,105 +0,0 @@ -#!/usr/bin/env python -# coding: utf-8 - -from nose import main -from nose.tools import * -from msgpack import packs, unpacks - - -def check(length, obj): - v = packs(obj) - assert_equal(len(v), length, "%r length should be %r but get %r" % (obj, length, len(v))) - assert_equal(unpacks(v), obj) - -def test_1(): - for o in [None, True, False, 0, 1, (1 << 6), (1 << 7) - 1, -1, - -((1<<5)-1), -(1<<5)]: - check(1, o) - -def test_2(): - for o in [1 << 7, (1 << 8) - 1, - -((1<<5)+1), -(1<<7) - ]: - check(2, o) - -def test_3(): - for o in [1 << 8, (1 << 16) - 1, - -((1<<7)+1), -(1<<15)]: - check(3, o) - -def test_5(): - for o in [1 << 16, (1 << 32) - 1, - -((1<<15)+1), -(1<<31)]: - check(5, o) - -def test_9(): - for o in [1 << 32, (1 << 64) - 1, - -((1<<31)+1), -(1<<63), - 1.0, 0.1, -0.1, -1.0]: - check(9, o) - - -def check_raw(overhead, num): - check(num + overhead, " " * num) - -def test_fixraw(): - check_raw(1, 0) - check_raw(1, (1<<5) - 1) - -def test_raw16(): - check_raw(3, 1<<5) - check_raw(3, (1<<16) - 1) - -def test_raw32(): - check_raw(5, 1<<16) - - -def check_array(overhead, num): - check(num + overhead, (None,) * num) - -def test_fixarray(): - check_array(1, 0) - check_array(1, (1 << 4) - 1) - -def test_array16(): - check_array(3, 1 << 4) - check_array(3, (1<<16)-1) - -def test_array32(): - check_array(5, (1<<16)) - - -def match(obj, buf): - assert_equal(packs(obj), buf) - assert_equal(unpacks(buf), obj) - -def test_match(): - cases = [ - (None, '\xc0'), - (False, '\xc2'), - (True, '\xc3'), - (0, '\x00'), - (127, '\x7f'), - (128, '\xcc\x80'), - (256, '\xcd\x01\x00'), - (-1, '\xff'), - (-33, '\xd0\xdf'), - (-129, '\xd1\xff\x7f'), - ({1:1}, '\x81\x01\x01'), - (1.0, "\xcb\x3f\xf0\x00\x00\x00\x00\x00\x00"), - ((), '\x90'), - (tuple(range(15)),"\x9f\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e"), - (tuple(range(16)),"\xdc\x00\x10\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"), - ({}, '\x80'), - (dict([(x,x) for x in range(15)]), '\x8f\x00\x00\x01\x01\x02\x02\x03\x03\x04\x04\x05\x05\x06\x06\x07\x07\x08\x08\t\t\n\n\x0b\x0b\x0c\x0c\r\r\x0e\x0e'), - (dict([(x,x) for x in range(16)]), '\xde\x00\x10\x00\x00\x01\x01\x02\x02\x03\x03\x04\x04\x05\x05\x06\x06\x07\x07\x08\x08\t\t\n\n\x0b\x0b\x0c\x0c\r\r\x0e\x0e\x0f\x0f'), - ] - - for v, p in cases: - match(v, p) - -def test_unicode(): - assert_equal('foobar', unpacks(packs(u'foobar'))) - -if __name__ == '__main__': - main() diff --git a/python/test/test_except.py b/python/test/test_except.py deleted file mode 100644 index 574728fb..00000000 --- a/python/test/test_except.py +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env python -# coding: utf-8 - -from nose.tools import * -from msgpack import packs, unpacks - -import datetime - -def test_raise_on_find_unsupported_value(): - assert_raises(TypeError, packs, datetime.datetime.now()) - -if __name__ == '__main__': - from nose import main - main() diff --git a/python/test/test_format.py b/python/test/test_format.py deleted file mode 100644 index 562ef54a..00000000 --- a/python/test/test_format.py +++ /dev/null @@ -1,75 +0,0 @@ -#!/usr/bin/env python -# coding: utf-8 - -from nose import main -from nose.tools import * -from msgpack import unpacks - -def check(src, should): - assert_equal(unpacks(src), should) - -def testSimpleValue(): - check("\x93\xc0\xc2\xc3", - (None, False, True,)) - -def testFixnum(): - check("\x92\x93\x00\x40\x7f\x93\xe0\xf0\xff", - ((0,64,127,), (-32,-16,-1,),) - ) - -def testFixArray(): - check("\x92\x90\x91\x91\xc0", - ((),((None,),),), - ) - -def testFixRaw(): - check("\x94\xa0\xa1a\xa2bc\xa3def", - ("", "a", "bc", "def",), - ) - -def testFixMap(): - check( - "\x82\xc2\x81\xc0\xc0\xc3\x81\xc0\x80", - {False: {None: None}, True:{None:{}}}, - ) - -def testUnsignedInt(): - check( - "\x99\xcc\x00\xcc\x80\xcc\xff\xcd\x00\x00\xcd\x80\x00" - "\xcd\xff\xff\xce\x00\x00\x00\x00\xce\x80\x00\x00\x00" - "\xce\xff\xff\xff\xff", - (0, 128, 255, 0, 32768, 65535, 0, 2147483648, 4294967295,), - ) - -def testSignedInt(): - check("\x99\xd0\x00\xd0\x80\xd0\xff\xd1\x00\x00\xd1\x80\x00" - "\xd1\xff\xff\xd2\x00\x00\x00\x00\xd2\x80\x00\x00\x00" - "\xd2\xff\xff\xff\xff", - (0, -128, -1, 0, -32768, -1, 0, -2147483648, -1,)) - -def testRaw(): - check("\x96\xda\x00\x00\xda\x00\x01a\xda\x00\x02ab\xdb\x00\x00" - "\x00\x00\xdb\x00\x00\x00\x01a\xdb\x00\x00\x00\x02ab", - ("", "a", "ab", "", "a", "ab")) - -def testArray(): - check("\x96\xdc\x00\x00\xdc\x00\x01\xc0\xdc\x00\x02\xc2\xc3\xdd\x00" - "\x00\x00\x00\xdd\x00\x00\x00\x01\xc0\xdd\x00\x00\x00\x02" - "\xc2\xc3", - ((), (None,), (False,True), (), (None,), (False,True)) - ) - -def testMap(): - check( - "\x96" - "\xde\x00\x00" - "\xde\x00\x01\xc0\xc2" - "\xde\x00\x02\xc0\xc2\xc3\xc2" - "\xdf\x00\x00\x00\x00" - "\xdf\x00\x00\x00\x01\xc0\xc2" - "\xdf\x00\x00\x00\x02\xc0\xc2\xc3\xc2", - ({}, {None: False}, {True: False, None: False}, {}, - {None: False}, {True: False, None: False})) - -if __name__ == '__main__': - main() diff --git a/python/test/test_obj.py b/python/test/test_obj.py deleted file mode 100644 index 0eebe7be..00000000 --- a/python/test/test_obj.py +++ /dev/null @@ -1,46 +0,0 @@ -#!/usr/bin/env python -# coding: utf-8 - -from nose import main -from nose.tools import * - -from msgpack import packs, unpacks - -def _decode_complex(obj): - if '__complex__' in obj: - return complex(obj['real'], obj['imag']) - return obj - -def _encode_complex(obj): - if isinstance(obj, complex): - return {'__complex__': True, 'real': 1, 'imag': 2} - return obj - -def test_encode_hook(): - packed = packs([3, 1+2j], default=_encode_complex) - unpacked = unpacks(packed) - eq_(unpacked[1], {'__complex__': True, 'real': 1, 'imag': 2}) - -def test_decode_hook(): - packed = packs([3, {'__complex__': True, 'real': 1, 'imag': 2}]) - unpacked = unpacks(packed, object_hook=_decode_complex) - eq_(unpacked[1], 1+2j) - -@raises(ValueError) -def test_bad_hook(): - packed = packs([3, 1+2j], default=lambda o: o) - unpacked = unpacks(packed) - -def _arr_to_str(arr): - return ''.join(str(c) for c in arr) - -def test_array_hook(): - packed = packs([1,2,3]) - unpacked = unpacks(packed, list_hook=_arr_to_str) - eq_(unpacked, '123') - -if __name__ == '__main__': - test_decode_hook() - test_encode_hook() - test_bad_hook() - test_array_hook() diff --git a/python/test/test_pack.py b/python/test/test_pack.py deleted file mode 100644 index 2b5f1ade..00000000 --- a/python/test/test_pack.py +++ /dev/null @@ -1,82 +0,0 @@ -#!/usr/bin/env python -# coding: utf-8 - -from nose import main -from nose.tools import * -from nose.plugins.skip import SkipTest - -from msgpack import packs, unpacks - -def check(data): - re = unpacks(packs(data)) - assert_equal(re, data) - -def testPack(): - test_data = [ - 0, 1, 127, 128, 255, 256, 65535, 65536, - -1, -32, -33, -128, -129, -32768, -32769, - 1.0, - "", "a", "a"*31, "a"*32, - None, True, False, - (), ((),), ((), None,), - {None: 0}, - (1<<23), - ] - for td in test_data: - check(td) - -def testPackUnicode(): - test_data = [ - u"", u"abcd", (u"defgh",), u"Русский текст", - ] - for td in test_data: - re = unpacks(packs(td, encoding='utf-8'), encoding='utf-8') - assert_equal(re, td) - -def testPackUTF32(): - try: - test_data = [ - u"", u"abcd", (u"defgh",), u"Русский текст", - ] - for td in test_data: - re = unpacks(packs(td, encoding='utf-32'), encoding='utf-32') - assert_equal(re, td) - except LookupError: - raise SkipTest - -def testPackBytes(): - test_data = [ - "", "abcd", ("defgh",), - ] - for td in test_data: - check(td) - -def testIgnoreUnicodeErrors(): - re = unpacks(packs('abc\xeddef'), - encoding='ascii', unicode_errors='ignore') - assert_equal(re, "abcdef") - -@raises(UnicodeDecodeError) -def testStrictUnicodeUnpack(): - unpacks(packs('abc\xeddef'), encoding='utf-8') - -@raises(UnicodeEncodeError) -def testStrictUnicodePack(): - packs(u"abc\xeddef", encoding='ascii', unicode_errors='strict') - -def testIgnoreErrorsPack(): - re = unpacks( - packs(u"abcФФФdef", encoding='ascii', unicode_errors='ignore'), - encoding='utf-8') - assert_equal(re, u"abcdef") - -@raises(TypeError) -def testNoEncoding(): - packs(u"abc", encoding=None) - -def testDecodeBinary(): - re = unpacks(packs(u"abc"), encoding=None) - assert_equal(re, "abc") - -if __name__ == '__main__': - main() diff --git a/python/test/test_seq.py b/python/test/test_seq.py deleted file mode 100644 index 993a59ec..00000000 --- a/python/test/test_seq.py +++ /dev/null @@ -1,49 +0,0 @@ -#!/usr/bin/env python -# coding: utf-8 - -from nose import main -from nose.tools import * - -import StringIO -import msgpack - -binarydata = [chr(i) for i in xrange(256)] -binarydata = "".join(binarydata) - -def gen_binary_data(idx): - data = binarydata[:idx % 300] - return data - -def test_exceeding_unpacker_read_size(): - dumpf = StringIO.StringIO() - - packer = msgpack.Packer() - - NUMBER_OF_STRINGS = 6 - read_size = 16 - # 5 ok for read_size=16, while 6 glibc detected *** python: double free or corruption (fasttop): - # 20 ok for read_size=256, while 25 segfaults / glibc detected *** python: double free or corruption (!prev) - # 40 ok for read_size=1024, while 50 introduces errors - # 7000 ok for read_size=1024*1024, while 8000 leads to glibc detected *** python: double free or corruption (!prev): - - for idx in xrange(NUMBER_OF_STRINGS): - data = gen_binary_data(idx) - dumpf.write(packer.pack(data)) - - f = StringIO.StringIO(dumpf.getvalue()) - dumpf.close() - - unpacker = msgpack.Unpacker(f, read_size=read_size) - - read_count = 0 - for idx, o in enumerate(unpacker): - assert_equal(type(o), str) - assert_equal(o, gen_binary_data(idx)) - read_count += 1 - - assert_equal(read_count, NUMBER_OF_STRINGS) - - -if __name__ == '__main__': - # main() - test_exceeding_unpacker_read_size() diff --git a/python/test/test_sequnpack.py b/python/test/test_sequnpack.py deleted file mode 100644 index d61be230..00000000 --- a/python/test/test_sequnpack.py +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/env python -# coding: utf-8 - -from msgpack import Unpacker - -def test_foobar(): - unpacker = Unpacker(read_size=3) - unpacker.feed('foobar') - assert unpacker.unpack() == ord('f') - assert unpacker.unpack() == ord('o') - assert unpacker.unpack() == ord('o') - assert unpacker.unpack() == ord('b') - assert unpacker.unpack() == ord('a') - assert unpacker.unpack() == ord('r') - try: - o = unpacker.unpack() - print "Oops!", o - assert 0 - except StopIteration: - assert 1 - else: - assert 0 - unpacker.feed('foo') - unpacker.feed('bar') - - k = 0 - for o, e in zip(unpacker, 'foobarbaz'): - assert o == ord(e) - k += 1 - assert k == len('foobar') - -if __name__ == '__main__': - test_foobar() - diff --git a/python/test3/test_buffer.py b/python/test3/test_buffer.py deleted file mode 100644 index 01310a07..00000000 --- a/python/test3/test_buffer.py +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/env python -# coding: utf-8 - -from nose import main -from nose.tools import * -from msgpack import packb, unpackb - -def test_unpack_buffer(): - from array import array - buf = array('b') - buf.fromstring(packb(('foo', 'bar'))) - obj = unpackb(buf) - assert_equal((b'foo', b'bar'), obj) - -if __name__ == '__main__': - main() diff --git a/python/test3/test_case.py b/python/test3/test_case.py deleted file mode 100644 index 2f423161..00000000 --- a/python/test3/test_case.py +++ /dev/null @@ -1,105 +0,0 @@ -#!/usr/bin/env python -# coding: utf-8 - -from nose import main -from nose.tools import * -from msgpack import packs, unpacks - - -def check(length, obj): - v = packs(obj) - assert_equal(len(v), length, "%r length should be %r but get %r" % (obj, length, len(v))) - assert_equal(unpacks(v), obj) - -def test_1(): - for o in [None, True, False, 0, 1, (1 << 6), (1 << 7) - 1, -1, - -((1<<5)-1), -(1<<5)]: - check(1, o) - -def test_2(): - for o in [1 << 7, (1 << 8) - 1, - -((1<<5)+1), -(1<<7) - ]: - check(2, o) - -def test_3(): - for o in [1 << 8, (1 << 16) - 1, - -((1<<7)+1), -(1<<15)]: - check(3, o) - -def test_5(): - for o in [1 << 16, (1 << 32) - 1, - -((1<<15)+1), -(1<<31)]: - check(5, o) - -def test_9(): - for o in [1 << 32, (1 << 64) - 1, - -((1<<31)+1), -(1<<63), - 1.0, 0.1, -0.1, -1.0]: - check(9, o) - - -def check_raw(overhead, num): - check(num + overhead, b" " * num) - -def test_fixraw(): - check_raw(1, 0) - check_raw(1, (1<<5) - 1) - -def test_raw16(): - check_raw(3, 1<<5) - check_raw(3, (1<<16) - 1) - -def test_raw32(): - check_raw(5, 1<<16) - - -def check_array(overhead, num): - check(num + overhead, (None,) * num) - -def test_fixarray(): - check_array(1, 0) - check_array(1, (1 << 4) - 1) - -def test_array16(): - check_array(3, 1 << 4) - check_array(3, (1<<16)-1) - -def test_array32(): - check_array(5, (1<<16)) - - -def match(obj, buf): - assert_equal(packs(obj), buf) - assert_equal(unpacks(buf), obj) - -def test_match(): - cases = [ - (None, b'\xc0'), - (False, b'\xc2'), - (True, b'\xc3'), - (0, b'\x00'), - (127, b'\x7f'), - (128, b'\xcc\x80'), - (256, b'\xcd\x01\x00'), - (-1, b'\xff'), - (-33, b'\xd0\xdf'), - (-129, b'\xd1\xff\x7f'), - ({1:1}, b'\x81\x01\x01'), - (1.0, b"\xcb\x3f\xf0\x00\x00\x00\x00\x00\x00"), - ((), b'\x90'), - (tuple(range(15)),b"\x9f\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e"), - (tuple(range(16)),b"\xdc\x00\x10\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"), - ({}, b'\x80'), - (dict([(x,x) for x in range(15)]), b'\x8f\x00\x00\x01\x01\x02\x02\x03\x03\x04\x04\x05\x05\x06\x06\x07\x07\x08\x08\t\t\n\n\x0b\x0b\x0c\x0c\r\r\x0e\x0e'), - (dict([(x,x) for x in range(16)]), b'\xde\x00\x10\x00\x00\x01\x01\x02\x02\x03\x03\x04\x04\x05\x05\x06\x06\x07\x07\x08\x08\t\t\n\n\x0b\x0b\x0c\x0c\r\r\x0e\x0e\x0f\x0f'), - ] - - for v, p in cases: - match(v, p) - -def test_unicode(): - assert_equal(b'foobar', unpacks(packs('foobar'))) - -if __name__ == '__main__': - main() diff --git a/python/test3/test_except.py b/python/test3/test_except.py deleted file mode 100644 index 574728fb..00000000 --- a/python/test3/test_except.py +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env python -# coding: utf-8 - -from nose.tools import * -from msgpack import packs, unpacks - -import datetime - -def test_raise_on_find_unsupported_value(): - assert_raises(TypeError, packs, datetime.datetime.now()) - -if __name__ == '__main__': - from nose import main - main() diff --git a/python/test3/test_format.py b/python/test3/test_format.py deleted file mode 100644 index 022e6801..00000000 --- a/python/test3/test_format.py +++ /dev/null @@ -1,75 +0,0 @@ -#!/usr/bin/env python -# coding: utf-8 - -from nose import main -from nose.tools import * -from msgpack import unpacks - -def check(src, should): - assert_equal(unpacks(src), should) - -def testSimpleValue(): - check(b"\x93\xc0\xc2\xc3", - (None, False, True,)) - -def testFixnum(): - check(b"\x92\x93\x00\x40\x7f\x93\xe0\xf0\xff", - ((0,64,127,), (-32,-16,-1,),) - ) - -def testFixArray(): - check(b"\x92\x90\x91\x91\xc0", - ((),((None,),),), - ) - -def testFixRaw(): - check(b"\x94\xa0\xa1a\xa2bc\xa3def", - (b"", b"a", b"bc", b"def",), - ) - -def testFixMap(): - check( - b"\x82\xc2\x81\xc0\xc0\xc3\x81\xc0\x80", - {False: {None: None}, True:{None:{}}}, - ) - -def testUnsignedInt(): - check( - b"\x99\xcc\x00\xcc\x80\xcc\xff\xcd\x00\x00\xcd\x80\x00" - b"\xcd\xff\xff\xce\x00\x00\x00\x00\xce\x80\x00\x00\x00" - b"\xce\xff\xff\xff\xff", - (0, 128, 255, 0, 32768, 65535, 0, 2147483648, 4294967295,), - ) - -def testSignedInt(): - check(b"\x99\xd0\x00\xd0\x80\xd0\xff\xd1\x00\x00\xd1\x80\x00" - b"\xd1\xff\xff\xd2\x00\x00\x00\x00\xd2\x80\x00\x00\x00" - b"\xd2\xff\xff\xff\xff", - (0, -128, -1, 0, -32768, -1, 0, -2147483648, -1,)) - -def testRaw(): - check(b"\x96\xda\x00\x00\xda\x00\x01a\xda\x00\x02ab\xdb\x00\x00" - b"\x00\x00\xdb\x00\x00\x00\x01a\xdb\x00\x00\x00\x02ab", - (b"", b"a", b"ab", b"", b"a", b"ab")) - -def testArray(): - check(b"\x96\xdc\x00\x00\xdc\x00\x01\xc0\xdc\x00\x02\xc2\xc3\xdd\x00" - b"\x00\x00\x00\xdd\x00\x00\x00\x01\xc0\xdd\x00\x00\x00\x02" - b"\xc2\xc3", - ((), (None,), (False,True), (), (None,), (False,True)) - ) - -def testMap(): - check( - b"\x96" - b"\xde\x00\x00" - b"\xde\x00\x01\xc0\xc2" - b"\xde\x00\x02\xc0\xc2\xc3\xc2" - b"\xdf\x00\x00\x00\x00" - b"\xdf\x00\x00\x00\x01\xc0\xc2" - b"\xdf\x00\x00\x00\x02\xc0\xc2\xc3\xc2", - ({}, {None: False}, {True: False, None: False}, {}, - {None: False}, {True: False, None: False})) - -if __name__ == '__main__': - main() diff --git a/python/test3/test_obj.py b/python/test3/test_obj.py deleted file mode 100644 index b54021f2..00000000 --- a/python/test3/test_obj.py +++ /dev/null @@ -1,44 +0,0 @@ -#!/usr/bin/env python -# coding: utf-8 - -from nose import main -from nose.tools import * - -from msgpack import packs, unpacks - -def _decode_complex(obj): - if b'__complex__' in obj: - return complex(obj[b'real'], obj[b'imag']) - return obj - -def _encode_complex(obj): - if isinstance(obj, complex): - return {b'__complex__': True, b'real': 1, b'imag': 2} - return obj - -def test_encode_hook(): - packed = packs([3, 1+2j], default=_encode_complex) - unpacked = unpacks(packed) - eq_(unpacked[1], {b'__complex__': True, b'real': 1, b'imag': 2}) - -def test_decode_hook(): - packed = packs([3, {b'__complex__': True, b'real': 1, b'imag': 2}]) - unpacked = unpacks(packed, object_hook=_decode_complex) - eq_(unpacked[1], 1+2j) - -@raises(ValueError) -def test_bad_hook(): - packed = packs([3, 1+2j], default=lambda o: o) - unpacked = unpacks(packed) - -def _arr_to_str(arr): - return ''.join(str(c) for c in arr) - -def test_array_hook(): - packed = packs([1,2,3]) - unpacked = unpacks(packed, list_hook=_arr_to_str) - eq_(unpacked, '123') - -if __name__ == '__main__': - #main() - test_decode_hook() diff --git a/python/test3/test_pack.py b/python/test3/test_pack.py deleted file mode 100644 index e53f7e64..00000000 --- a/python/test3/test_pack.py +++ /dev/null @@ -1,77 +0,0 @@ -#!/usr/bin/env python -# coding: utf-8 - -from nose import main -from nose.tools import * - -from msgpack import packs, unpacks - -def check(data): - re = unpacks(packs(data)) - assert_equal(re, data) - -def testPack(): - test_data = [ - 0, 1, 127, 128, 255, 256, 65535, 65536, - -1, -32, -33, -128, -129, -32768, -32769, - 1.0, - b"", b"a", b"a"*31, b"a"*32, - None, True, False, - (), ((),), ((), None,), - {None: 0}, - (1<<23), - ] - for td in test_data: - check(td) - -def testPackUnicode(): - test_data = [ - "", "abcd", ("defgh",), "Русский текст", - ] - for td in test_data: - re = unpacks(packs(td, encoding='utf-8'), encoding='utf-8') - assert_equal(re, td) - -def testPackUTF32(): - test_data = [ - "", "abcd", ("defgh",), "Русский текст", - ] - for td in test_data: - print(packs(td, encoding='utf-32')) - re = unpacks(packs(td, encoding='utf-32'), encoding='utf-32') - assert_equal(re, td) - -def testPackBytes(): - test_data = [ - b"", b"abcd", (b"defgh",), - ] - for td in test_data: - check(td) - -def testIgnoreUnicodeErrors(): - re = unpacks(packs(b'abc\xeddef'), - encoding='utf-8', unicode_errors='ignore') - assert_equal(re, "abcdef") - -@raises(UnicodeDecodeError) -def testStrictUnicodeUnpack(): - unpacks(packs(b'abc\xeddef'), encoding='utf-8') - -@raises(UnicodeEncodeError) -def testStrictUnicodePack(): - packs("abc\xeddef", encoding='ascii', unicode_errors='strict') - -def testIgnoreErrorsPack(): - re = unpacks(packs("abcФФФdef", encoding='ascii', unicode_errors='ignore'), encoding='utf-8') - assert_equal(re, "abcdef") - -@raises(TypeError) -def testNoEncoding(): - packs("abc", encoding=None) - -def testDecodeBinary(): - re = unpacks(packs("abc"), encoding=None) - assert_equal(re, b"abc") - -if __name__ == '__main__': - main() diff --git a/python/test3/test_sequnpack.py b/python/test3/test_sequnpack.py deleted file mode 100644 index 5fd377c4..00000000 --- a/python/test3/test_sequnpack.py +++ /dev/null @@ -1,36 +0,0 @@ -#!/usr/bin/env python -# coding: utf-8 - - - -from msgpack import Unpacker - -def test_foobar(): - unpacker = Unpacker(read_size=3) - unpacker.feed(b'foobar') - assert unpacker.unpack() == ord(b'f') - assert unpacker.unpack() == ord(b'o') - assert unpacker.unpack() == ord(b'o') - assert unpacker.unpack() == ord(b'b') - assert unpacker.unpack() == ord(b'a') - assert unpacker.unpack() == ord(b'r') - try: - o = unpacker.unpack() - print(("Oops!", o)) - assert 0 - except StopIteration: - assert 1 - else: - assert 0 - unpacker.feed(b'foo') - unpacker.feed(b'bar') - - k = 0 - for o, e in zip(unpacker, b'foobarbaz'): - assert o == e - k += 1 - assert k == len(b'foobar') - -if __name__ == '__main__': - test_foobar() -