mirror of
https://github.com/msgpack/msgpack-c.git
synced 2025-10-24 17:30:46 +02:00
Compare commits
2290 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b3de6f83cb | ||
|
|
01f3d24fee | ||
|
|
551308ae10 | ||
|
|
f2c446799c | ||
|
|
c2430635f9 | ||
|
|
bffd3f2091 | ||
|
|
076b5ed7fd | ||
|
|
52fa74804c | ||
|
|
5ae6077234 | ||
|
|
43de525dc7 | ||
|
|
f7961b798b | ||
|
|
5cada9eb27 | ||
|
|
ce42436f20 | ||
|
|
c3df1bb26e | ||
|
|
63d3b093f0 | ||
|
|
8b57d2caf9 | ||
|
|
a9a48cea3a | ||
|
|
e96853a946 | ||
|
|
2ebe884c0e | ||
|
|
823caa8d8c | ||
|
|
9c5654ed44 | ||
|
|
5d30e42c01 | ||
|
|
6b4a7b3b16 | ||
|
|
0f1d0ed78c | ||
|
|
825017ac50 | ||
|
|
4bc64de0ec | ||
|
|
08a42a347c | ||
|
|
734e47c067 | ||
|
|
fa7bb8ec77 | ||
|
|
dc51f5d236 | ||
|
|
f06b46d412 | ||
|
|
1c97e051ad | ||
|
|
4f59b98185 | ||
|
|
208ec65034 | ||
|
|
3bd0172a9a | ||
|
|
3bb121fb8f | ||
|
|
fd9e377bac | ||
|
|
82ddfc1170 | ||
|
|
6b195acba0 | ||
|
|
ea1435784d | ||
|
|
9eba7c482c | ||
|
|
9c6857c425 | ||
|
|
111b91a3e2 | ||
|
|
ee546036a1 | ||
|
|
6e7deb8091 | ||
|
|
66fa561256 | ||
|
|
243fb27c3c | ||
|
|
746e983bf3 | ||
|
|
766afb90ed | ||
|
|
403567c1c5 | ||
|
|
f3fe1b801e | ||
|
|
4fdbc7518f | ||
|
|
0dbdb3d974 | ||
|
|
d7d5be414f | ||
|
|
4d36456799 | ||
|
|
b1725d4007 | ||
|
|
102dba8e24 | ||
|
|
1a372058a6 | ||
|
|
f8b691f622 | ||
|
|
7893d4d8c9 | ||
|
|
9a3cd0c951 | ||
|
|
46684265d5 | ||
|
|
9e0d87b725 | ||
|
|
bbc03b2b0a | ||
|
|
b4d28c3d9d | ||
|
|
cc1098998f | ||
|
|
d9c5978958 | ||
|
|
d05daa1df6 | ||
|
|
534466894e | ||
|
|
d04520044f | ||
|
|
c0fb6b3b8c | ||
|
|
19df3314f4 | ||
|
|
b530b7f21a | ||
|
|
ed49ea3c95 | ||
|
|
7918c19f8f | ||
|
|
0d7caecdb5 | ||
|
|
f8b0ad1766 | ||
|
|
7ed7af90b6 | ||
|
|
4a94f836a7 | ||
|
|
b36e548db2 | ||
|
|
e6c276edf3 | ||
|
|
befc3cdd0c | ||
|
|
2e2e93ba2e | ||
|
|
3b2bb56243 | ||
|
|
9c4562382b | ||
|
|
08b0c88c21 | ||
|
|
d105f97ea0 | ||
|
|
bd0665bed3 | ||
|
|
8dc865d92d | ||
|
|
8085ab8721 | ||
|
|
b36e75a42e | ||
|
|
f17f8d79c4 | ||
|
|
f89f05b883 | ||
|
|
bd5f814cb2 | ||
|
|
bf6cc035c7 | ||
|
|
a6bf728a5c | ||
|
|
698a482b67 | ||
|
|
fbf5b9d74c | ||
|
|
65c35caab2 | ||
|
|
ff9f14742b | ||
|
|
4b4eb83cd1 | ||
|
|
7761497778 | ||
|
|
6046d5c666 | ||
|
|
83eb70d718 | ||
|
|
70f950ac05 | ||
|
|
3129326432 | ||
|
|
799cd15107 | ||
|
|
942965ee87 | ||
|
|
a123053823 | ||
|
|
c7603fbbd1 | ||
|
|
6954e01338 | ||
|
|
7e23ec496a | ||
|
|
bae148bd76 | ||
|
|
3fcecf7099 | ||
|
|
7d994630d2 | ||
|
|
29b9505cb7 | ||
|
|
e07d774004 | ||
|
|
ff77227e10 | ||
|
|
de99222801 | ||
|
|
7cdc5b88e3 | ||
|
|
fbdf16db09 | ||
|
|
41b2af8884 | ||
|
|
9389912eaf | ||
|
|
d5242a7d8c | ||
|
|
d3fecce359 | ||
|
|
7a70d74971 | ||
|
|
fcf89fe901 | ||
|
|
ec8c0bc1c1 | ||
|
|
a2f3689865 | ||
|
|
2d54c0e918 | ||
|
|
ce088e7e0a | ||
|
|
a1b86507da | ||
|
|
9235d1acae | ||
|
|
12172e7dc7 | ||
|
|
6a08446b3d | ||
|
|
c93a42b5f4 | ||
|
|
8febbfd9f5 | ||
|
|
33a8d8c30f | ||
|
|
ef5bcadd95 | ||
|
|
fadc615f4e | ||
|
|
eff6f5a2fd | ||
|
|
ed30252bdc | ||
|
|
2deed25da0 | ||
|
|
419877cf3a | ||
|
|
17267ed475 | ||
|
|
b759f5bdf7 | ||
|
|
f72372314e | ||
|
|
530561eec0 | ||
|
|
aec88c06a0 | ||
|
|
09e06a8cb7 | ||
|
|
084db3fcf1 | ||
|
|
709d6f4fdd | ||
|
|
27cf578e8c | ||
|
|
7001679959 | ||
|
|
daa78b4606 | ||
|
|
b893f7750c | ||
|
|
8792f42f8d | ||
|
|
4f9ec65713 | ||
|
|
db54c78ed4 | ||
|
|
1155babda8 | ||
|
|
83a82e3eb5 | ||
|
|
aa9c73352c | ||
|
|
df9e003b35 | ||
|
|
f6ddc9b85a | ||
|
|
11cfeeec92 | ||
|
|
d72765870a | ||
|
|
349c133171 | ||
|
|
c056026dad | ||
|
|
0421dabc1e | ||
|
|
60930f4b12 | ||
|
|
b3dfe28be4 | ||
|
|
e703d8a2f7 | ||
|
|
801f61c12c | ||
|
|
a3e75a0709 | ||
|
|
92d34cbd79 | ||
|
|
c99fd62ae6 | ||
|
|
a3986b3bdc | ||
|
|
7fed49e6fe | ||
|
|
005e06e00a | ||
|
|
b6d4bb5cb0 | ||
|
|
f57bfd998b | ||
|
|
e8d3387a04 | ||
|
|
53d2ea9ad3 | ||
|
|
b6803a5fec | ||
|
|
210d3ce390 | ||
|
|
a350e0714e | ||
|
|
72757feae4 | ||
|
|
fe2346efa1 | ||
|
|
43ae287be3 | ||
|
|
b804e12dec | ||
|
|
99c221ad01 | ||
|
|
3a615bcf44 | ||
|
|
87863c1696 | ||
|
|
45defd565a | ||
|
|
f1726cef0d | ||
|
|
8a788f3a48 | ||
|
|
7710868556 | ||
|
|
0b53833856 | ||
|
|
43c643bab6 | ||
|
|
ac64fcace8 | ||
|
|
84ba0c7b4b | ||
|
|
f79606d9ff | ||
|
|
3aaadb9b12 | ||
|
|
8a3a11f123 | ||
|
|
32f1f0edf2 | ||
|
|
5bd75905cb | ||
|
|
eebdc007a9 | ||
|
|
3aae588a6a | ||
|
|
cb2dcb19b9 | ||
|
|
c58a565366 | ||
|
|
93b944eec4 | ||
|
|
7340f1e9c8 | ||
|
|
0a65c443a2 | ||
|
|
bae6a8db57 | ||
|
|
ddb320197a | ||
|
|
dc51f6493b | ||
|
|
c027909acc | ||
|
|
2bd56533fa | ||
|
|
c07452a7a2 | ||
|
|
8701aeec30 | ||
|
|
2c4f2b890e | ||
|
|
f1acd78e54 | ||
|
|
49d22b7d28 | ||
|
|
96133c8dd9 | ||
|
|
bd18a36dae | ||
|
|
3fe630769e | ||
|
|
2f80758889 | ||
|
|
9f3efe9e54 | ||
|
|
6e44edf290 | ||
|
|
d28cbf32b9 | ||
|
|
48d226e97c | ||
|
|
64698e8e8c | ||
|
|
e0d098641c | ||
|
|
06f4b05487 | ||
|
|
122fce5aee | ||
|
|
e3f5281903 | ||
|
|
88e94e3776 | ||
|
|
95275ff16e | ||
|
|
4cb938ed18 | ||
|
|
5f3e62461e | ||
|
|
ec239933db | ||
|
|
de59b393c7 | ||
|
|
b02371efe5 | ||
|
|
f34289fdfd | ||
|
|
584478a4f1 | ||
|
|
700ec688f7 | ||
|
|
a133c1d393 | ||
|
|
6ba9a58648 | ||
|
|
bb92d326c8 | ||
|
|
1e13dadf1f | ||
|
|
7b271c2af2 | ||
|
|
c3f4e52bdb | ||
|
|
458b4c0363 | ||
|
|
f8dc0f0d04 | ||
|
|
347658cdc1 | ||
|
|
427a6e7313 | ||
|
|
7f76a3caf0 | ||
|
|
40539727e6 | ||
|
|
30e56d0a45 | ||
|
|
8eef2a245b | ||
|
|
2bcfe2fdb0 | ||
|
|
2b49e62b3c | ||
|
|
bf70a36a1d | ||
|
|
eb92058cf4 | ||
|
|
423eaf25fb | ||
|
|
280abe852c | ||
|
|
c91307aaa1 | ||
|
|
88ffd08087 | ||
|
|
bd337129c6 | ||
|
|
1f5cb86366 | ||
|
|
0d39c577d8 | ||
|
|
7e66dc28f0 | ||
|
|
bec47a59f0 | ||
|
|
064f854ddf | ||
|
|
a05d92ae85 | ||
|
|
1fdfde5d5f | ||
|
|
b1620f1f6a | ||
|
|
f789635ddc | ||
|
|
f65c26e280 | ||
|
|
579212996f | ||
|
|
208595b262 | ||
|
|
83a4b89818 | ||
|
|
d46f220737 | ||
|
|
b4db293181 | ||
|
|
d1eac600e9 | ||
|
|
7e758ca053 | ||
|
|
db6d4f2003 | ||
|
|
1ba46a30ce | ||
|
|
5ece2ef2c7 | ||
|
|
9513734040 | ||
|
|
d452625ed1 | ||
|
|
b02c6beb4d | ||
|
|
06c2896def | ||
|
|
724db8ed89 | ||
|
|
fa48078a52 | ||
|
|
d8ad85fa8c | ||
|
|
cc3b895449 | ||
|
|
384242e5eb | ||
|
|
7a98138f27 | ||
|
|
cd4e0bda57 | ||
|
|
1ad2db0c42 | ||
|
|
96a76a7a5c | ||
|
|
bc964bd847 | ||
|
|
12604b5c8e | ||
|
|
7c67109396 | ||
|
|
fd4e28f23d | ||
|
|
2098062613 | ||
|
|
22bc707035 | ||
|
|
7ad743f2da | ||
|
|
315bbd4b40 | ||
|
|
288a6b2e31 | ||
|
|
a0e4294b5a | ||
|
|
64baa15f8e | ||
|
|
354ee5b9a3 | ||
|
|
2ddd79499c | ||
|
|
7f0614e998 | ||
|
|
150d74508e | ||
|
|
8674c821c4 | ||
|
|
10be66712d | ||
|
|
2698cfc254 | ||
|
|
333ee98ab2 | ||
|
|
156e315394 | ||
|
|
01fedf847b | ||
|
|
56db4475f2 | ||
|
|
f065c2a447 | ||
|
|
ba4d8df63e | ||
|
|
c00584281f | ||
|
|
45a0124ede | ||
|
|
ceb27348bd | ||
|
|
1ad737ee08 | ||
|
|
7024a1ec2c | ||
|
|
ca4a425a52 | ||
|
|
a502097fd0 | ||
|
|
6b99a0c8b7 | ||
|
|
1a3fcc3a22 | ||
|
|
111739f8ce | ||
|
|
f638e2186b | ||
|
|
002376c678 | ||
|
|
09a2f81b5f | ||
|
|
ffcaaeb482 | ||
|
|
bd511a4bd1 | ||
|
|
684c5e0bb0 | ||
|
|
8e74449181 | ||
|
|
f2b788e51f | ||
|
|
7214b4c73f | ||
|
|
a7a78bde9b | ||
|
|
c50fbe4ce9 | ||
|
|
d7d28b6f24 | ||
|
|
5ebed34376 | ||
|
|
6871a82af7 | ||
|
|
3f79968910 | ||
|
|
2e10adabb1 | ||
|
|
0411ef85e7 | ||
|
|
28b6ee0db0 | ||
|
|
3d0fa6043c | ||
|
|
ee169c4eb5 | ||
|
|
0aaf95608f | ||
|
|
918e7edba4 | ||
|
|
88338195c0 | ||
|
|
e90231c865 | ||
|
|
15d8bb6792 | ||
|
|
20ef1f925b | ||
|
|
89b8f4ee13 | ||
|
|
304ff96d04 | ||
|
|
10c1917f22 | ||
|
|
d85e731ab4 | ||
|
|
d431e25257 | ||
|
|
3d82c2d651 | ||
|
|
2cbaa3a7db | ||
|
|
bfc6e45a2f | ||
|
|
e8fa6c1aee | ||
|
|
d49bec4e11 | ||
|
|
004939e732 | ||
|
|
09e8833d53 | ||
|
|
9ed842c014 | ||
|
|
99c4d37a39 | ||
|
|
4df2bdecda | ||
|
|
597cd63121 | ||
|
|
a51f33c02f | ||
|
|
88032f37e1 | ||
|
|
a76911a72c | ||
|
|
1bc27d72cc | ||
|
|
a6599e5fb4 | ||
|
|
791f55da35 | ||
|
|
e58b00016b | ||
|
|
b4fe698777 | ||
|
|
e89045cfcd | ||
|
|
c6e6dbc608 | ||
|
|
e271cf2aed | ||
|
|
53e4bb92fe | ||
|
|
303c1000c2 | ||
|
|
088ce946b9 | ||
|
|
dc86adbf8e | ||
|
|
ad0cae30ad | ||
|
|
bf3e2abc9e | ||
|
|
b7543e1386 | ||
|
|
1f515b3ae7 | ||
|
|
a933fa5892 | ||
|
|
a07622c276 | ||
|
|
c955727d8c | ||
|
|
094b70213a | ||
|
|
c0bf8b3aff | ||
|
|
5be2757216 | ||
|
|
c6c31dc5cd | ||
|
|
c704d4bfab | ||
|
|
4466bda819 | ||
|
|
4623654996 | ||
|
|
84ad9a2634 | ||
|
|
9b141fa9b6 | ||
|
|
6a1fa2e0fc | ||
|
|
c55f778198 | ||
|
|
b4f2acb945 | ||
|
|
7e139125e2 | ||
|
|
9d37316b44 | ||
|
|
364fc0daf6 | ||
|
|
f24201f71f | ||
|
|
9a113bb0ca | ||
|
|
2674e34769 | ||
|
|
c5c3de8f61 | ||
|
|
0b7cabd322 | ||
|
|
22780a6808 | ||
|
|
4ec0fdf207 | ||
|
|
85a0404d8c | ||
|
|
ce67c8ed35 | ||
|
|
1893a8e31e | ||
|
|
dc8c253577 | ||
|
|
9c77a0f24a | ||
|
|
61c053d37e | ||
|
|
04b549a46b | ||
|
|
4a1db60af8 | ||
|
|
55b51c506f | ||
|
|
a97c00e463 | ||
|
|
e61cd76310 | ||
|
|
c30962da25 | ||
|
|
6b7becdef0 | ||
|
|
cfa1ab38cc | ||
|
|
2f34d22bf5 | ||
|
|
401460b7d9 | ||
|
|
03b770fdf2 | ||
|
|
d3cd07987b | ||
|
|
b4786711df | ||
|
|
ccc9ac5538 | ||
|
|
1df97bc37b | ||
|
|
8d09b7090d | ||
|
|
2a7335ae90 | ||
|
|
e7eae65ab7 | ||
|
|
4e663609ca | ||
|
|
98820ec6c7 | ||
|
|
baea172cc9 | ||
|
|
e9e31a2899 | ||
|
|
8ffb619031 | ||
|
|
a3ed6274c2 | ||
|
|
f795e5d568 | ||
|
|
87ff7e4ccc | ||
|
|
da46fb1ef7 | ||
|
|
b90bcf3c11 | ||
|
|
c1f19c0e47 | ||
|
|
d9a77e220a | ||
|
|
894547582b | ||
|
|
3a87cc8826 | ||
|
|
6177038fcf | ||
|
|
25259dc705 | ||
|
|
5d69c22bf9 | ||
|
|
a9caff538e | ||
|
|
9a2bb0c972 | ||
|
|
7191a3b014 | ||
|
|
b82b58f184 | ||
|
|
73af452ed8 | ||
|
|
95b31d0d16 | ||
|
|
c73d9a9dab | ||
|
|
0164c1efe2 | ||
|
|
48abfe7aa1 | ||
|
|
8105c33f9d | ||
|
|
237cf888d8 | ||
|
|
b9bc9d4195 | ||
|
|
aa790ba785 | ||
|
|
1da0539a00 | ||
|
|
d7a656523b | ||
|
|
f573fd6a26 | ||
|
|
4fa661a63d | ||
|
|
2e4de8b65c | ||
|
|
42181289ed | ||
|
|
cd84d04860 | ||
|
|
0d1e1787de | ||
|
|
45b8d29cc0 | ||
|
|
0bfe4c49b7 | ||
|
|
3c997edd71 | ||
|
|
523e986077 | ||
|
|
90c2e35694 | ||
|
|
4ffdc01135 | ||
|
|
b398ce9acc | ||
|
|
1b87018a0a | ||
|
|
755342bb25 | ||
|
|
438c4ff8ca | ||
|
|
20e777c1fa | ||
|
|
3f98327f3b | ||
|
|
224a830ce0 | ||
|
|
b4c4c213b1 | ||
|
|
edc8004985 | ||
|
|
7f37eac04c | ||
|
|
0f66e144ab | ||
|
|
0d475a9dbc | ||
|
|
ca5ef097ac | ||
|
|
4ee616bbde | ||
|
|
de972fbe0f | ||
|
|
585f330694 | ||
|
|
89faf6ee9f | ||
|
|
83dbe398fd | ||
|
|
b68c073d1b | ||
|
|
7eb8c8221a | ||
|
|
7094e0872e | ||
|
|
4b26a82ae8 | ||
|
|
22613d4dd0 | ||
|
|
d15d9220ff | ||
|
|
a3f353ef42 | ||
|
|
cc02da0ccf | ||
|
|
e6f82cf2bb | ||
|
|
6593cba284 | ||
|
|
d5b515899c | ||
|
|
068041f05e | ||
|
|
e21b4ef28d | ||
|
|
4c9685977b | ||
|
|
c9814de513 | ||
|
|
bf7bc19ccb | ||
|
|
07b5000824 | ||
|
|
d6ef2bc91d | ||
|
|
db90ee4283 | ||
|
|
a3e868acb8 | ||
|
|
62048e1aa0 | ||
|
|
31a06a0682 | ||
|
|
72c7feb2c4 | ||
|
|
a83e43a52f | ||
|
|
8b1632dc1d | ||
|
|
170d29a13c | ||
|
|
1bfcf55469 | ||
|
|
85164687f3 | ||
|
|
f5f42782be | ||
|
|
60a4cba6d6 | ||
|
|
5ecb797d8a | ||
|
|
455e0190d1 | ||
|
|
84932e62e9 | ||
|
|
fe229d1df0 | ||
|
|
b5b865a6ca | ||
|
|
d8e9941fa9 | ||
|
|
bab3eea3a8 | ||
|
|
07e635f158 | ||
|
|
b641065d1f | ||
|
|
60d4b2833d | ||
|
|
1244edeaf1 | ||
|
|
acf4ac01fc | ||
|
|
549c28459e | ||
|
|
86ac7c6eb7 | ||
|
|
0e53b350d3 | ||
|
|
db0726fa76 | ||
|
|
664ab708e4 | ||
|
|
f88e621dca | ||
|
|
0e7345c282 | ||
|
|
7b578cc065 | ||
|
|
988f72d5eb | ||
|
|
c51e8ace48 | ||
|
|
43a86cf5b9 | ||
|
|
54cb4350b3 | ||
|
|
cabd8a8a03 | ||
|
|
8640754417 | ||
|
|
7d1be40e10 | ||
|
|
3c271892e3 | ||
|
|
83ab53ecd4 | ||
|
|
ba73841240 | ||
|
|
13afc54ccc | ||
|
|
2865a96ba5 | ||
|
|
79222b65a3 | ||
|
|
83f0429db8 | ||
|
|
6c035f7d2b | ||
|
|
ed5a4123b5 | ||
|
|
b8530e30df | ||
|
|
8bf2f33782 | ||
|
|
356fbcf187 | ||
|
|
1adf90e9df | ||
|
|
c2f523e463 | ||
|
|
1e8f5d0d67 | ||
|
|
0a8d25cd35 | ||
|
|
72e0d1a424 | ||
|
|
c06d4d70ef | ||
|
|
69f588dd36 | ||
|
|
65b47fa032 | ||
|
|
22fd249b12 | ||
|
|
96831350b8 | ||
|
|
5da3c031fd | ||
|
|
71eba2406d | ||
|
|
892fa8c2bd | ||
|
|
42e332bb8c | ||
|
|
40604c3d40 | ||
|
|
e183efcce2 | ||
|
|
772e4e01a3 | ||
|
|
3660b495c3 | ||
|
|
7a02f03a82 | ||
|
|
953077b73f | ||
|
|
ba15089d86 | ||
|
|
b8ee27c672 | ||
|
|
ee65a319ba | ||
|
|
46502480e9 | ||
|
|
50e1c23941 | ||
|
|
b76c8aeb83 | ||
|
|
b5599ef3fc | ||
|
|
39e7856c48 | ||
|
|
1a7aa5e5ec | ||
|
|
aad5b96083 | ||
|
|
dea3190d36 | ||
|
|
c001a52582 | ||
|
|
f58eb11fd5 | ||
|
|
134beee0cd | ||
|
|
434dae8424 | ||
|
|
d8dd77884b | ||
|
|
ea991d5a01 | ||
|
|
6a127eb24f | ||
|
|
5e57dc5da7 | ||
|
|
d23a649427 | ||
|
|
12ae60fd77 | ||
|
|
282b0b5927 | ||
|
|
0a261fca42 | ||
|
|
20104301f3 | ||
|
|
428780db53 | ||
|
|
6bf5160bf2 | ||
|
|
ef45359d81 | ||
|
|
3202bb6a2e | ||
|
|
63971da5a4 | ||
|
|
8a17e7f647 | ||
|
|
69607f4117 | ||
|
|
e5948a3450 | ||
|
|
3fc061b5fd | ||
|
|
2b38389f68 | ||
|
|
9e4dfb2484 | ||
|
|
356a5ea42d | ||
|
|
93142323f0 | ||
|
|
3352b2f029 | ||
|
|
364658ea99 | ||
|
|
50088365df | ||
|
|
d640395765 | ||
|
|
be0f8c280a | ||
|
|
9b156823ff | ||
|
|
dc2e1a4ead | ||
|
|
96f145812f | ||
|
|
33de24239a | ||
|
|
d17c70cbb0 | ||
|
|
88ab7b6349 | ||
|
|
df5f84d49d | ||
|
|
0609347d82 | ||
|
|
61eb4b1f6e | ||
|
|
9ee1168cc4 | ||
|
|
95e0fc5cef | ||
|
|
a0b7e7cc27 | ||
|
|
92822996e2 | ||
|
|
e9eac32238 | ||
|
|
c61446b988 | ||
|
|
294aa52c3a | ||
|
|
90f7b9c732 | ||
|
|
720c18bcf8 | ||
|
|
23a040f2e5 | ||
|
|
cd9d6c5940 | ||
|
|
8cae20ffc4 | ||
|
|
1788d6ce01 | ||
|
|
722143c0de | ||
|
|
57b030a6dd | ||
|
|
9c0f629c68 | ||
|
|
018c6c819e | ||
|
|
8d3673e7ee | ||
|
|
871a796037 | ||
|
|
4e65bc35ed | ||
|
|
062864a6b7 | ||
|
|
767099a0eb | ||
|
|
1c810bcb74 | ||
|
|
0fafa7a4b3 | ||
|
|
c75009d513 | ||
|
|
a1ca382b2d | ||
|
|
8eadc04d37 | ||
|
|
849ba867d6 | ||
|
|
11f2f333c6 | ||
|
|
94ddf1ac5d | ||
|
|
5da1abb1ce | ||
|
|
efc27e8eb4 | ||
|
|
51dd7cbf22 | ||
|
|
866e73acc3 | ||
|
|
a1fc7863e9 | ||
|
|
12b5a6235a | ||
|
|
e50cc5d79f | ||
|
|
4501551267 | ||
|
|
e719cbbb7a | ||
|
|
5adea26044 | ||
|
|
4b2b3a18df | ||
|
|
8f8d1800bd | ||
|
|
091715671c | ||
|
|
41bff7b96d | ||
|
|
b13cb13efc | ||
|
|
38f946d2cf | ||
|
|
6007f4ea05 | ||
|
|
078eb3a436 | ||
|
|
22b6bb9f78 | ||
|
|
4dcd162879 | ||
|
|
cd54ba99fc | ||
|
|
d437961546 | ||
|
|
f1679a17a2 | ||
|
|
afc9666760 | ||
|
|
d4199b59f9 | ||
|
|
7e2076b799 | ||
|
|
41f27b5d62 | ||
|
|
d91c510d8c | ||
|
|
ebb7c05bdc | ||
|
|
78b3e8adad | ||
|
|
3dc0e83513 | ||
|
|
298c97ec08 | ||
|
|
0f0598a6b9 | ||
|
|
fee4faa82f | ||
|
|
e182b06816 | ||
|
|
f9a16ad690 | ||
|
|
2034427cfd | ||
|
|
f986370634 | ||
|
|
db588909b9 | ||
|
|
7e6a498c14 | ||
|
|
9650def29a | ||
|
|
2a7d9977b1 | ||
|
|
a746afa7cc | ||
|
|
87f0da1ff1 | ||
|
|
14ec30038b | ||
|
|
09722fe540 | ||
|
|
85b01d28da | ||
|
|
763c2613df | ||
|
|
98c285c679 | ||
|
|
2164723c86 | ||
|
|
5cc712ceeb | ||
|
|
840101640b | ||
|
|
60e737f622 | ||
|
|
4cc1087124 | ||
|
|
b750b17598 | ||
|
|
5f1d5e8722 | ||
|
|
1b13523c7f | ||
|
|
a35fe57737 | ||
|
|
b8d357c2ad | ||
|
|
4f1e47aa78 | ||
|
|
7a131db2a0 | ||
|
|
756d02f8c0 | ||
|
|
d3450c1fce | ||
|
|
fa7f840427 | ||
|
|
e25ecc5287 | ||
|
|
f1504d851a | ||
|
|
1a97e761fb | ||
|
|
6771302f62 | ||
|
|
188c0a9a6b | ||
|
|
62537967fe | ||
|
|
42df06dd3d | ||
|
|
ab438ac9b9 | ||
|
|
2216fda5ce | ||
|
|
9b655faa64 | ||
|
|
a37e7232c7 | ||
|
|
b559187a7e | ||
|
|
9e7564c9d7 | ||
|
|
584bd8575f | ||
|
|
777e5f13f3 | ||
|
|
6131e3d747 | ||
|
|
e0a2c2a4bf | ||
|
|
d26e68e3bb | ||
|
|
57ba93a2b2 | ||
|
|
34a42415be | ||
|
|
1a6f826f0f | ||
|
|
22e428b104 | ||
|
|
89f117fcd9 | ||
|
|
9a50cc4345 | ||
|
|
addf52e9f0 | ||
|
|
45b57c292c | ||
|
|
860a5ae06e | ||
|
|
55d09e6c30 | ||
|
|
32c42d2f4c | ||
|
|
1cfee8c347 | ||
|
|
2893c799bf | ||
|
|
b4e50d54a0 | ||
|
|
d6c5682ef5 | ||
|
|
de721af166 | ||
|
|
5f73d3f19f | ||
|
|
846016b8b7 | ||
|
|
b225f15f29 | ||
|
|
b1481b33f8 | ||
|
|
c230ff7ab8 | ||
|
|
6edf10cecd | ||
|
|
d88d6c34b9 | ||
|
|
ff14be8fdb | ||
|
|
f75da23e1d | ||
|
|
17900625d0 | ||
|
|
5722ab6b51 | ||
|
|
072f0cd183 | ||
|
|
4af6d4ddc8 | ||
|
|
7359720403 | ||
|
|
9cb2c91d58 | ||
|
|
9e18ac5d2d | ||
|
|
e18f5b2d52 | ||
|
|
e979f04d75 | ||
|
|
5002f2cf6a | ||
|
|
b6018f3d57 | ||
|
|
aee537099d | ||
|
|
e37f14fd6a | ||
|
|
432c9cc542 | ||
|
|
9d4da1ad2e | ||
|
|
9725bac5c4 | ||
|
|
68e270b029 | ||
|
|
bf859f234e | ||
|
|
70fbae3c5f | ||
|
|
7cd77292fc | ||
|
|
e8e3052d1a | ||
|
|
eb96312b41 | ||
|
|
ab359b259f | ||
|
|
83ee2c82df | ||
|
|
0bfbd8dcbd | ||
|
|
a112ebb4df | ||
|
|
993d007c4b | ||
|
|
92a7f3f794 | ||
|
|
2919033f3c | ||
|
|
cb9114e31c | ||
|
|
2f9912a012 | ||
|
|
fc10a3e486 | ||
|
|
dcdc51ce30 | ||
|
|
ef09252dff | ||
|
|
e3aa02b6af | ||
|
|
d3e6f017be | ||
|
|
721700bfe5 | ||
|
|
a277ea7c64 | ||
|
|
285ccfeeea | ||
|
|
232b8039a0 | ||
|
|
10a315e00e | ||
|
|
904dd65965 | ||
|
|
dff7af2075 | ||
|
|
ed91c18af8 | ||
|
|
616b1d8fb0 | ||
|
|
ce98964348 | ||
|
|
07a509a53a | ||
|
|
35483b95ae | ||
|
|
a2c8154960 | ||
|
|
e8d3c8d6c5 | ||
|
|
ae5734e8d1 | ||
|
|
6ec09053b1 | ||
|
|
5401660b07 | ||
|
|
f3caa8e160 | ||
|
|
8921f9dcfc | ||
|
|
1911513acb | ||
|
|
7bee573a72 | ||
|
|
5568abb6ab | ||
|
|
67486480ac | ||
|
|
0e3bb789b8 | ||
|
|
e1eabbfebf | ||
|
|
e416b534b8 | ||
|
|
212ef8eb2b | ||
|
|
7bf06a5885 | ||
|
|
1822523289 | ||
|
|
156a4403ab | ||
|
|
ad5da7f131 | ||
|
|
62be3f1212 | ||
|
|
8dbe25a51d | ||
|
|
7cfd4bb1d8 | ||
|
|
037a108c49 | ||
|
|
79a127a8b6 | ||
|
|
ace27f6238 | ||
|
|
cc2ded6338 | ||
|
|
13a746f6fa | ||
|
|
b0ff2802d2 | ||
|
|
4b0c90fc90 | ||
|
|
4b11fb32cd | ||
|
|
f707c6b47c | ||
|
|
081ee0e99a | ||
|
|
8eaa2e9e74 | ||
|
|
ac1eb6e1d3 | ||
|
|
343ceabe9a | ||
|
|
eb765d21f2 | ||
|
|
2d5c68055c | ||
|
|
de68fbd6d0 | ||
|
|
118cf7270c | ||
|
|
cf1487f8ba | ||
|
|
e4cd479bf3 | ||
|
|
8dae63e4c1 | ||
|
|
a3f350842c | ||
|
|
c1e9f92d7f | ||
|
|
582fe38e78 | ||
|
|
6443738f66 | ||
|
|
45eb2ad0c7 | ||
|
|
37593400c3 | ||
|
|
60648fc3a8 | ||
|
|
0482e4fcd1 | ||
|
|
82a10cba5c | ||
|
|
0d9a21ea08 | ||
|
|
f399ec8c30 | ||
|
|
8ad9ce059b | ||
|
|
a4aa14d1e2 | ||
|
|
f7f2d4b990 | ||
|
|
c675881f3b | ||
|
|
f6d0cd9a4b | ||
|
|
4ef5894856 | ||
|
|
07ddfa1430 | ||
|
|
252d66a4b2 | ||
|
|
b4eba4ba09 | ||
|
|
2266505eed | ||
|
|
46e2398e02 | ||
|
|
3662a17e81 | ||
|
|
66f221d088 | ||
|
|
9ed4e443fb | ||
|
|
15aec0493d | ||
|
|
d6a7bd1995 | ||
|
|
ff86d61799 | ||
|
|
97886c50e7 | ||
|
|
327b0db626 | ||
|
|
994144dac2 | ||
|
|
023f81ae9c | ||
|
|
83fac26762 | ||
|
|
213ba44b65 | ||
|
|
fa231139d7 | ||
|
|
5cd1c6bfa1 | ||
|
|
c4fb47c00d | ||
|
|
70e50d9679 | ||
|
|
978e6b9057 | ||
|
|
571f1a27a2 | ||
|
|
c3518c0666 | ||
|
|
64ac09c492 | ||
|
|
414da4e8c6 | ||
|
|
3eadb124fc | ||
|
|
fd9eb26688 | ||
|
|
6c59e5195a | ||
|
|
3bdf646cc6 | ||
|
|
2bbf10a324 | ||
|
|
737e6703df | ||
|
|
7f48ddc85e | ||
|
|
a84f444ce2 | ||
|
|
7e597779e4 | ||
|
|
bf8c830eef | ||
|
|
5f52ec5030 | ||
|
|
c71ce9eb49 | ||
|
|
f105b4bbb0 | ||
|
|
f64be3b2d0 | ||
|
|
abac9fe90a | ||
|
|
5798fa0e47 | ||
|
|
fe4af1125d | ||
|
|
ce96ca8bfc | ||
|
|
57732f0c1b | ||
|
|
7ccef5b787 | ||
|
|
1a116fb644 | ||
|
|
f79fd82953 | ||
|
|
b9a80697bc | ||
|
|
467822c97a | ||
|
|
7ab7eaf61b | ||
|
|
3ed6b673d4 | ||
|
|
469040be6b | ||
|
|
309e96087a | ||
|
|
2d61fdf865 | ||
|
|
6e560e345a | ||
|
|
8b796dc788 | ||
|
|
240b02174d | ||
|
|
38a380684e | ||
|
|
1a615af437 | ||
|
|
9162610682 | ||
|
|
c52a58b322 | ||
|
|
ac3433f5dd | ||
|
|
dab725624e | ||
|
|
037b1c22dc | ||
|
|
0de0b434b3 | ||
|
|
7eb3d2aa59 | ||
|
|
0827d08cd7 | ||
|
|
3d20ec6f21 | ||
|
|
bcdbf78542 | ||
|
|
a4af97b32c | ||
|
|
e00b299fe0 | ||
|
|
d6cc5494a9 | ||
|
|
96c688708c | ||
|
|
79e7a9810c | ||
|
|
a0ae0289dc | ||
|
|
31a3d34b49 | ||
|
|
1c54d804f5 | ||
|
|
111efdf50f | ||
|
|
dac8f6290d | ||
|
|
3bfd142660 | ||
|
|
d031162d96 | ||
|
|
8e24d9206a | ||
|
|
b78b49a7bd | ||
|
|
561e9ba105 | ||
|
|
6e84266043 | ||
|
|
151c92d08d | ||
|
|
1285470c21 | ||
|
|
837c5ecfc3 | ||
|
|
04aa309f24 | ||
|
|
69b2ea4002 | ||
|
|
8ddc219365 | ||
|
|
a9cf916b82 | ||
|
|
8455a2eb70 | ||
|
|
5c0f1db25c | ||
|
|
466986b519 | ||
|
|
a6aac482dd | ||
|
|
bb984d3445 | ||
|
|
f8e2766d28 | ||
|
|
2d5d12f9a6 | ||
|
|
11a2a1b8ec | ||
|
|
b5e66150e9 | ||
|
|
e21e3245db | ||
|
|
07e7ad6b7e | ||
|
|
44b524529d | ||
|
|
fc65bc0682 | ||
|
|
ca12e6d39d | ||
|
|
db8578a62b | ||
|
|
4a292193f2 | ||
|
|
1e7fbc0349 | ||
|
|
479d50bd93 | ||
|
|
982787865f | ||
|
|
bf4a57da34 | ||
|
|
2fcbe6116d | ||
|
|
4c00f448aa | ||
|
|
3ddeb08e6e | ||
|
|
0176dd760a | ||
|
|
d30548af3f | ||
|
|
ab12b2b2b9 | ||
|
|
7ce69a362f | ||
|
|
cc08146b1c | ||
|
|
6896cc602f | ||
|
|
d8f366daf2 | ||
|
|
ef649009e4 | ||
|
|
cd03ab62f8 | ||
|
|
44e41efa0c | ||
|
|
ecf4b09acd | ||
|
|
d6122b4a18 | ||
|
|
4fcb4777f3 | ||
|
|
03ed30ce03 | ||
|
|
6e810df2a4 | ||
|
|
847a7852e5 | ||
|
|
e265beef91 | ||
|
|
0335df55e1 | ||
|
|
dd4043a616 | ||
|
|
6a8412d6de | ||
|
|
7491c1996a | ||
|
|
0ab14b4138 | ||
|
|
6e77c6df11 | ||
|
|
bcc91d78e9 | ||
|
|
32b65dba47 | ||
|
|
aa75e6ecd3 | ||
|
|
dc679a2572 | ||
|
|
b6bc7f7ecb | ||
|
|
896dead7cc | ||
|
|
dfa277a9e0 | ||
|
|
501260eb54 | ||
|
|
370a9251f5 | ||
|
|
7737f1cb77 | ||
|
|
f72022037c | ||
|
|
865528f778 | ||
|
|
d54048eabe | ||
|
|
103a6c56e4 | ||
|
|
11f1d5fbbd | ||
|
|
7ebdb63131 | ||
|
|
a186725213 | ||
|
|
8615358515 | ||
|
|
86ad026f11 | ||
|
|
93d0f0bd00 | ||
|
|
a0f5392876 | ||
|
|
5896ff3746 | ||
|
|
d15e49cb73 | ||
|
|
2103c12e05 | ||
|
|
f0a12a23a1 | ||
|
|
30b946ee85 | ||
|
|
a388000d47 | ||
|
|
4c888294b5 | ||
|
|
68bf4acb4b | ||
|
|
2c2df64427 | ||
|
|
4d6e9d6c05 | ||
|
|
f969f6f39c | ||
|
|
8920c49597 | ||
|
|
e18102d16f | ||
|
|
ea23bf843e | ||
|
|
e217e72c22 | ||
|
|
0bc4b3f599 | ||
|
|
b2f5893669 | ||
|
|
9a1ccaf155 | ||
|
|
0201c21b9a | ||
|
|
dee68403df | ||
|
|
0a99b9f933 | ||
|
|
17e696fc0d | ||
|
|
b5b459cfca | ||
|
|
7822bc787d | ||
|
|
1f5d6b9cac | ||
|
|
ce21ab0ebf | ||
|
|
5af6d36341 | ||
|
|
15a0d61a64 | ||
|
|
66014eebc0 | ||
|
|
fd566afeb4 | ||
|
|
e4d32b176e | ||
|
|
b27c87c9ed | ||
|
|
3729f334a1 | ||
|
|
55bf279a7c | ||
|
|
78e8cbdfb5 | ||
|
|
dd083ca933 | ||
|
|
23d670f3bd | ||
|
|
6fab3594a2 | ||
|
|
421aeb5021 | ||
|
|
47f4ffe9f3 | ||
|
|
09325ed846 | ||
|
|
bfa428ab13 | ||
|
|
ecdeec9948 | ||
|
|
f11a811114 | ||
|
|
c203928fae | ||
|
|
59b111e026 | ||
|
|
2a694f8c20 | ||
|
|
0380215982 | ||
|
|
0e48f65a4b | ||
|
|
aa79fc2ff4 | ||
|
|
cc571b8bb1 | ||
|
|
b0df21295c | ||
|
|
0889e6117e | ||
|
|
212f025f00 | ||
|
|
f6a5402194 | ||
|
|
6a349d0b28 | ||
|
|
dac5c60608 | ||
|
|
bc33317b7e | ||
|
|
754b1682a5 | ||
|
|
cb9eed8ccc | ||
|
|
862905742f | ||
|
|
ba98315f65 | ||
|
|
124a871923 | ||
|
|
378f6afccd | ||
|
|
1320863cb3 | ||
|
|
a951ea90b8 | ||
|
|
3b7a2f8f32 | ||
|
|
038c3e3518 | ||
|
|
c08439ff41 | ||
|
|
59d994ea5f | ||
|
|
ed51d23335 | ||
|
|
2be892bfda | ||
|
|
723d900098 | ||
|
|
13404a7444 | ||
|
|
a20594dfdc | ||
|
|
bff4cadeff | ||
|
|
6515577dc3 | ||
|
|
beebccd323 | ||
|
|
d70c44b723 | ||
|
|
33d3192ca2 | ||
|
|
0d13931844 | ||
|
|
293c839a22 | ||
|
|
f187ae35d9 | ||
|
|
74013e7e7d | ||
|
|
e2026c0507 | ||
|
|
c375e14705 | ||
|
|
fade0644c7 | ||
|
|
5fedaf285b | ||
|
|
fe82444db1 | ||
|
|
f7692691ca | ||
|
|
7fba3484c5 | ||
|
|
561b6b583d | ||
|
|
7675c15fa9 | ||
|
|
99971abc9b | ||
|
|
b7a1ba9ba0 | ||
|
|
63c26cd58b | ||
|
|
f8fc03b482 | ||
|
|
b0b1a0e9a7 | ||
|
|
4d2a9c23af | ||
|
|
c41154989a | ||
|
|
541ece13c0 | ||
|
|
b6b2ef5e57 | ||
|
|
4ef69da25d | ||
|
|
9bd339baf8 | ||
|
|
616be1aa60 | ||
|
|
415b14335f | ||
|
|
1fb707f93f | ||
|
|
aa4ed82b66 | ||
|
|
7ce8abe5d6 | ||
|
|
27629a8dd6 | ||
|
|
521a4f4190 | ||
|
|
bad3801eae | ||
|
|
72b3064a67 | ||
|
|
7593e5ce0e | ||
|
|
8a08548f36 | ||
|
|
56b0ad6809 | ||
|
|
f8561fbfd5 | ||
|
|
e80cbd4437 | ||
|
|
da601e4589 | ||
|
|
36a87b6968 | ||
|
|
e0b42939ba | ||
|
|
7d731f83a4 | ||
|
|
40ad7da455 | ||
|
|
e0d1e5c722 | ||
|
|
5b3a168b86 | ||
|
|
11afd4820f | ||
|
|
ec5c1194fc | ||
|
|
7eccd1029a | ||
|
|
c2ca709d68 | ||
|
|
197ed8c983 | ||
|
|
990860fe65 | ||
|
|
dbeb6e61c6 | ||
|
|
2b3f37f9e0 | ||
|
|
f50148a9cc | ||
|
|
9fc8ec5b61 | ||
|
|
751a6f98fe | ||
|
|
9d8e6b92fc | ||
|
|
c868da2879 | ||
|
|
e0c40c1c59 | ||
|
|
f185284776 | ||
|
|
1656ef0111 | ||
|
|
3cb2e4f7c6 | ||
|
|
3104f7e451 | ||
|
|
ab8e7ea822 | ||
|
|
6daef66ea7 | ||
|
|
04286eb9dc | ||
|
|
d15e30bf4a | ||
|
|
fb1d480faf | ||
|
|
c8fa0be345 | ||
|
|
643b0c9523 | ||
|
|
06930616b2 | ||
|
|
6e5fc6d396 | ||
|
|
17b0753023 | ||
|
|
7491348d40 | ||
|
|
eef2036c36 | ||
|
|
fbec8f4470 | ||
|
|
8e0137e1d2 | ||
|
|
1dac3f890a | ||
|
|
9f33266f23 | ||
|
|
d8c7fd5161 | ||
|
|
731bc643d0 | ||
|
|
12e8615ac5 | ||
|
|
22703d2cdb | ||
|
|
cb518f472a | ||
|
|
271f1fa319 | ||
|
|
9ecc4f0a1e | ||
|
|
977eab7c4a | ||
|
|
c9f342f4b2 | ||
|
|
126e4d8414 | ||
|
|
14ee1e5827 | ||
|
|
ecbb9055a2 | ||
|
|
862f04104d | ||
|
|
d47f72be0c | ||
|
|
98c5767372 | ||
|
|
97a7b7545a | ||
|
|
caf5616573 | ||
|
|
b8076fa71f | ||
|
|
2360466aa9 | ||
|
|
28370b36aa | ||
|
|
9d82356ea9 | ||
|
|
ca24e040c4 | ||
|
|
0fd629857d | ||
|
|
8eff14db11 | ||
|
|
81e26fe9b9 | ||
|
|
9eb4583dd5 | ||
|
|
5a23c86dc1 | ||
|
|
ffd0525607 | ||
|
|
3dc636bf3e | ||
|
|
260ce4aa1d | ||
|
|
8bc827ebf5 | ||
|
|
a97f764088 | ||
|
|
143b90af3e | ||
|
|
4e0a6ae624 | ||
|
|
0c60cfc5c0 | ||
|
|
deb6b0e334 | ||
|
|
27777dcd31 | ||
|
|
bdb397e043 | ||
|
|
cb4d851761 | ||
|
|
17aa517e41 | ||
|
|
7ac16f4834 | ||
|
|
bf7fece440 | ||
|
|
c04ef9efe5 | ||
|
|
b774c07d19 | ||
|
|
229467cb29 | ||
|
|
949b472f7e | ||
|
|
be67d3e362 | ||
|
|
2c1a1fd4f8 | ||
|
|
3e2ae7cc78 | ||
|
|
505660e1fa | ||
|
|
09d90e1231 | ||
|
|
5a9f89ae1f | ||
|
|
6f56345dd8 | ||
|
|
edef040688 | ||
|
|
9fc196e750 | ||
|
|
dc1698eaf4 | ||
|
|
53ded063a0 | ||
|
|
8a2c50c374 | ||
|
|
f71148f3a6 | ||
|
|
172105828c | ||
|
|
6cca6cb20d | ||
|
|
b7336f817c | ||
|
|
88356b79be | ||
|
|
ce9e543882 | ||
|
|
3ff3ba83f4 | ||
|
|
edb525a030 | ||
|
|
ea5314f076 | ||
|
|
be8e53163b | ||
|
|
79151f517f | ||
|
|
e8ffe7ef96 | ||
|
|
b5a7b5e277 | ||
|
|
85b5e1088f | ||
|
|
680ddb1557 | ||
|
|
44fff522bd | ||
|
|
90815f0d27 | ||
|
|
f07950c60a | ||
|
|
f8c4125892 | ||
|
|
1f30cc203a | ||
|
|
764bfdcb9f | ||
|
|
f290814f64 | ||
|
|
3a2508545d | ||
|
|
79a06a338a | ||
|
|
509f27eee1 | ||
|
|
e511c32a36 | ||
|
|
b463d9b687 | ||
|
|
e96e20ccfd | ||
|
|
06ebdbfd37 | ||
|
|
df9fd047b4 | ||
|
|
85d65c59d2 | ||
|
|
754126644f | ||
|
|
220436f4f9 | ||
|
|
b62a6ae1d0 | ||
|
|
eae0532b8c | ||
|
|
d642487f99 | ||
|
|
320510506b | ||
|
|
b2839ac78b | ||
|
|
834d5a0e72 | ||
|
|
13ce808c47 | ||
|
|
980a6529c1 | ||
|
|
c92384fe68 | ||
|
|
9f563f87b9 | ||
|
|
44f37b8d1b | ||
|
|
5f41c1cf3f | ||
|
|
2a664b9ae6 | ||
|
|
5456814199 | ||
|
|
33ceaeb208 | ||
|
|
b33e60b3ae | ||
|
|
9dd0a6eb86 | ||
|
|
ed6faf4e65 | ||
|
|
df2ee5de49 | ||
|
|
36fef91a67 | ||
|
|
3399148d75 | ||
|
|
0eea92de66 | ||
|
|
92975bb21d | ||
|
|
bf18e04134 | ||
|
|
4a0d7f18fd | ||
|
|
65c360a2ca | ||
|
|
71919f7523 | ||
|
|
31a49db68b | ||
|
|
0d615442ba | ||
|
|
8f35dbc306 | ||
|
|
154bcbc4f7 | ||
|
|
c96a39d315 | ||
|
|
06ba74c366 | ||
|
|
8786a8e6e0 | ||
|
|
748236fef0 | ||
|
|
ae1b06f20b | ||
|
|
b8aa93ce30 | ||
|
|
49d40a42f1 | ||
|
|
1845f34b81 | ||
|
|
43903d446a | ||
|
|
256da2124b | ||
|
|
7869e96bac | ||
|
|
79b51a6e4b | ||
|
|
cad9f6d46e | ||
|
|
da2960880a | ||
|
|
0eacc58e29 | ||
|
|
3bec736aee | ||
|
|
3241ffd1b4 | ||
|
|
d0d7b266bc | ||
|
|
c24948258b | ||
|
|
d36666bd98 | ||
|
|
2794b1d310 | ||
|
|
f456fa03da | ||
|
|
356b7b43f8 | ||
|
|
92718e2140 | ||
|
|
4021160a64 | ||
|
|
6f043e3326 | ||
|
|
74b0b1da21 | ||
|
|
3a5f676687 | ||
|
|
4fa7cffc37 | ||
|
|
79b83e78a5 | ||
|
|
048a3835e7 | ||
|
|
4a4891036a | ||
|
|
ff00c83f15 | ||
|
|
79d31b7452 | ||
|
|
20cc6f7463 | ||
|
|
8acabaa135 | ||
|
|
ba7183a5b4 | ||
|
|
28f4338a6c | ||
|
|
800a93a859 | ||
|
|
2e969e3a0a | ||
|
|
3fb31f651d | ||
|
|
682d25b551 | ||
|
|
bcad8d4c4c | ||
|
|
96bab8e02e | ||
|
|
fa4a615d0f | ||
|
|
f1265c4fed | ||
|
|
df01cd9a09 | ||
|
|
255bac642d | ||
|
|
6d8c3bd13d | ||
|
|
75b8272710 | ||
|
|
2f80e154f2 | ||
|
|
cc0114c482 | ||
|
|
e5e2b9095c | ||
|
|
6977edc032 | ||
|
|
177cc55ee5 | ||
|
|
feb7ec03ba | ||
|
|
6630a643d3 | ||
|
|
d70e64a434 | ||
|
|
896ad51102 | ||
|
|
be6d6560a7 | ||
|
|
709d0cc33e | ||
|
|
bd73742552 | ||
|
|
ed4518e09a | ||
|
|
6c8301eae8 | ||
|
|
6e30d504e3 | ||
|
|
cee09a0261 | ||
|
|
76a72558b3 | ||
|
|
22124a33ce | ||
|
|
3731373de1 | ||
|
|
bbaf8c2f67 | ||
|
|
f50694cc96 | ||
|
|
4930ea7dab | ||
|
|
96bb4cf49d | ||
|
|
5e7563ac5b | ||
|
|
f199b80453 | ||
|
|
5de8eec206 | ||
|
|
076bd07f39 | ||
|
|
00e897503b | ||
|
|
2f3c47f385 | ||
|
|
2b28211701 | ||
|
|
46c794fc2e | ||
|
|
0408738b48 | ||
|
|
6cfea98501 | ||
|
|
33498d3673 | ||
|
|
ed3ead06fe | ||
|
|
eb8a338a0e | ||
|
|
23480bfe8a | ||
|
|
3384dbc92d | ||
|
|
8446549ed8 | ||
|
|
6a9f3ae71d | ||
|
|
94e5b0d78f | ||
|
|
0812eb1c04 | ||
|
|
8cb5ccad99 | ||
|
|
743d69ec0b | ||
|
|
f6de4c9479 | ||
|
|
fb59927d32 | ||
|
|
c58ce1a975 | ||
|
|
c6d9bbd7b0 | ||
|
|
08974f00ed | ||
|
|
60643f023f | ||
|
|
65ddd1a455 | ||
|
|
68a98d3dd0 | ||
|
|
ca9015452e | ||
|
|
05ac2603e6 | ||
|
|
8e923777b8 | ||
|
|
8949551c2e | ||
|
|
0b45e9442b | ||
|
|
1d1a9d7933 | ||
|
|
58c0fe0f91 | ||
|
|
b96b62f2ac | ||
|
|
43fc0a52a6 | ||
|
|
4f3d9a1ded | ||
|
|
b50ff920f0 | ||
|
|
983ae0c5a2 | ||
|
|
9d4db84987 | ||
|
|
1f372cf0cc | ||
|
|
c43d597aa9 | ||
|
|
dfaa281476 | ||
|
|
df14629a25 | ||
|
|
c1c25c455c | ||
|
|
e65197f386 | ||
|
|
ecbb8f8711 | ||
|
|
03aa736199 | ||
|
|
821b1f0384 | ||
|
|
233ad3aaff | ||
|
|
9c4812f4d4 | ||
|
|
337cc9fa78 | ||
|
|
dfe29a0329 | ||
|
|
85e90aa81e | ||
|
|
86d30fe571 | ||
|
|
173302267f | ||
|
|
8e3ea8d26c | ||
|
|
cb065563c2 | ||
|
|
27b89b237b | ||
|
|
21f0d0bfc4 | ||
|
|
d5e583b09e | ||
|
|
15fb9bbcb2 | ||
|
|
a03418ab12 | ||
|
|
035513844d | ||
|
|
193906b8ce | ||
|
|
d354f2e8c2 | ||
|
|
24a8ee436f | ||
|
|
6e5f9404b7 | ||
|
|
64fe90aabb | ||
|
|
7e31d487e0 | ||
|
|
ee16e2eb30 | ||
|
|
003fb3392f | ||
|
|
0e82278cd5 | ||
|
|
5b544248bc | ||
|
|
d4d7495c0a | ||
|
|
8325cce44c | ||
|
|
ee0debc5b3 | ||
|
|
8f1bd12a17 | ||
|
|
fccf1016e4 | ||
|
|
1b010a082b | ||
|
|
324f215316 | ||
|
|
ace4f1e7f0 | ||
|
|
5c5f16f148 | ||
|
|
f50855d5c0 | ||
|
|
86917b0ba7 | ||
|
|
7201fcbe0f | ||
|
|
83f1735fbb | ||
|
|
80fd8e70f0 | ||
|
|
698c1c2b7a | ||
|
|
5d3287f5aa | ||
|
|
6990fe6f51 | ||
|
|
0b81068368 | ||
|
|
5b1851ae22 | ||
|
|
0d5708a01d | ||
|
|
67ab510b5d | ||
|
|
d1264a1289 | ||
|
|
3b973021a1 | ||
|
|
182624895f | ||
|
|
548de3739c | ||
|
|
718a3efd64 | ||
|
|
76b8c3250b | ||
|
|
dafaa8bd8c | ||
|
|
9c9b2c25ea | ||
|
|
e89cd81022 | ||
|
|
5debbd2be8 | ||
|
|
fe26df5355 | ||
|
|
85778494e4 | ||
|
|
a94ce3c715 | ||
|
|
a440ff1117 | ||
|
|
8195137bc5 | ||
|
|
3e2bd25e4e | ||
|
|
ffd0c2f624 | ||
|
|
23333c98d7 | ||
|
|
5a12ab98c4 | ||
|
|
0b327a63fc | ||
|
|
15b28a245c | ||
|
|
6ef5684797 | ||
|
|
d439b1495b | ||
|
|
9e096a3f0e | ||
|
|
0acf6ec150 | ||
|
|
4b36340474 | ||
|
|
910e642a8b | ||
|
|
9f571146fb | ||
|
|
339725f73d | ||
|
|
aff964c58b | ||
|
|
0c07e745f8 | ||
|
|
419d2e9564 | ||
|
|
f936a307c6 | ||
|
|
4e4678edfa | ||
|
|
cb7a4b3116 | ||
|
|
5ca4c42a74 | ||
|
|
1238a7ca07 | ||
|
|
a9db60a73d | ||
|
|
bd32ac19d4 | ||
|
|
eaf9944e43 | ||
|
|
703fdbc01d | ||
|
|
2daa08b0e7 | ||
|
|
05d9d22d9e | ||
|
|
8b7894f9bd | ||
|
|
a71439607f | ||
|
|
aca0d7f969 | ||
|
|
310a8e4342 | ||
|
|
24fbe1ef5b | ||
|
|
33d8faa35d | ||
|
|
44be714f65 | ||
|
|
0df3da6b10 | ||
|
|
79197b6ec7 | ||
|
|
353b6b51cb | ||
|
|
bd9a2c0d3a | ||
|
|
53b0ee6536 | ||
|
|
78daac0f1b | ||
|
|
b970b9b9a8 | ||
|
|
0339db57f1 | ||
|
|
461b147897 | ||
|
|
a3cd13b399 | ||
|
|
eb5d326a1e | ||
|
|
cce6eb94e2 | ||
|
|
8311c72c69 | ||
|
|
9a059285d9 | ||
|
|
469ac7891d | ||
|
|
16264a5693 | ||
|
|
6eedb50f56 | ||
|
|
5f07215662 | ||
|
|
d3a02fb2ca | ||
|
|
2c823f1aaa | ||
|
|
706293aadc | ||
|
|
dfdceb4258 | ||
|
|
0014b7fdb9 | ||
|
|
3b28f1f8af | ||
|
|
c689d476ca | ||
|
|
cc534fd21f | ||
|
|
124efcf247 | ||
|
|
dd452b05e3 | ||
|
|
b5617f7df9 | ||
|
|
b73ca1ba3a | ||
|
|
39ad071c4f | ||
|
|
fa0b576a45 | ||
|
|
c2c7591987 | ||
|
|
3e939e3775 | ||
|
|
f6384e10bc | ||
|
|
c283842563 | ||
|
|
1135976225 | ||
|
|
76679d33df | ||
|
|
e9d44b90bc | ||
|
|
8a7a391166 | ||
|
|
d6c5a9eece | ||
|
|
56ad6915d0 | ||
|
|
466c260782 | ||
|
|
d8e2d1725a | ||
|
|
33b43d03ac | ||
|
|
517509db6e | ||
|
|
95f01a5976 | ||
|
|
d08d3bf56d | ||
|
|
587fd669e8 | ||
|
|
e3553b87fe | ||
|
|
a078d2360c | ||
|
|
2d3abf8e6e | ||
|
|
cacae0fb7d | ||
|
|
d7fc215c16 | ||
|
|
bb69aa18f2 | ||
|
|
e4f515166a | ||
|
|
f325acb0ea | ||
|
|
d1b6e65dd8 | ||
|
|
4688252bd4 | ||
|
|
b1df5d3ad7 | ||
|
|
09bad2938e | ||
|
|
bad69fd397 | ||
|
|
b4ae6bf82c | ||
|
|
eac0f83864 | ||
|
|
3f16f080ac | ||
|
|
5de2b974fb | ||
|
|
6a9cb51828 | ||
|
|
f1c294ca50 | ||
|
|
c320e44a23 | ||
|
|
ea36ef3107 | ||
|
|
fedc37d079 | ||
|
|
86ccfcc03c | ||
|
|
bc8d8ab65a | ||
|
|
a7a23d3bc8 | ||
|
|
82d33944e6 | ||
|
|
8a629ad6fb | ||
|
|
e1711ffcf2 | ||
|
|
063d51c662 | ||
|
|
d8e3575a46 | ||
|
|
6fa609be3f | ||
|
|
70982e204c | ||
|
|
2af7df5865 | ||
|
|
59610e81de | ||
|
|
cdfac703ef | ||
|
|
ad5ebd007e | ||
|
|
1bd347d997 | ||
|
|
147056073d | ||
|
|
1b3231e617 | ||
|
|
7ac4ad3e38 | ||
|
|
0a345cb12b | ||
|
|
19ff0dd17f | ||
|
|
e3bf8a404b | ||
|
|
dbb28d9a8f | ||
|
|
19fd4e755c | ||
|
|
77698cd924 | ||
|
|
945d279f28 | ||
|
|
645d296841 | ||
|
|
57446de875 | ||
|
|
3473800ab6 | ||
|
|
7e5c5153a8 | ||
|
|
1b8979f285 | ||
|
|
2aac51dd20 | ||
|
|
69e32d264c | ||
|
|
71ae75a5bf | ||
|
|
86043fd87e | ||
|
|
d8aaef4f04 | ||
|
|
7fc34b6369 | ||
|
|
92b346efa7 | ||
|
|
c790735b9f | ||
|
|
64711e615e | ||
|
|
2065affd45 | ||
|
|
4067c56b5d | ||
|
|
65515638aa | ||
|
|
371ba3ffe3 | ||
|
|
5395b62f2f | ||
|
|
3e164eab26 | ||
|
|
ad85533975 | ||
|
|
d6c2a97931 | ||
|
|
17def94ba4 | ||
|
|
cf254ea240 | ||
|
|
2d05110239 | ||
|
|
0017f4fce8 | ||
|
|
02f3dd947a | ||
|
|
ef0874feba | ||
|
|
14aa1420f0 | ||
|
|
c506cd97e0 | ||
|
|
3761aacb1d | ||
|
|
233f13aac5 | ||
|
|
0ced3ec2d2 | ||
|
|
5b786f65a4 | ||
|
|
770542c8c7 | ||
|
|
4f1207a38c | ||
|
|
2b65f81e23 | ||
|
|
c10eb2c17b | ||
|
|
3f5ac54bf5 | ||
|
|
790f9409b1 | ||
|
|
a3d831b723 | ||
|
|
b9483deea3 | ||
|
|
c211d2ac45 | ||
|
|
119a03dd5f | ||
|
|
f3fbb7e1f6 | ||
|
|
2be98e8467 | ||
|
|
91b1806e9d | ||
|
|
8548b3645a | ||
|
|
4bbfb3f9a3 | ||
|
|
98eec72522 | ||
|
|
562d50df4d | ||
|
|
f3ee5ab372 | ||
|
|
aa2a3e5b07 | ||
|
|
8467307239 | ||
|
|
90da951a6f | ||
|
|
59f81b331c | ||
|
|
77a7d3d26a | ||
|
|
4321b80999 | ||
|
|
4b93b06323 | ||
|
|
96fb2e4b7c | ||
|
|
3dc1048dfb | ||
|
|
28f4bd5a67 | ||
|
|
b01c270889 | ||
|
|
7c92f8a90b | ||
|
|
a4a04872a3 | ||
|
|
f2d13cd647 | ||
|
|
9346908485 | ||
|
|
b3a7ba14f7 | ||
|
|
524ef9553c | ||
|
|
a85f6e72fe | ||
|
|
1ae6a41336 | ||
|
|
3ec55791c6 | ||
|
|
a3accd28ea | ||
|
|
fc5bc84207 | ||
|
|
d8b4051d6d | ||
|
|
804a1cc22d | ||
|
|
cdd60e5f9c | ||
|
|
7c76f07384 | ||
|
|
a3b1ef9527 | ||
|
|
0bd4150a80 | ||
|
|
7f7f5253f2 | ||
|
|
2a0a847634 | ||
|
|
92ddb37ed3 | ||
|
|
01f944e6bd | ||
|
|
732c8d7350 | ||
|
|
21678aeef5 | ||
|
|
cda1ca35a4 | ||
|
|
923580d2cd | ||
|
|
190af1d32b | ||
|
|
bffe0443f9 | ||
|
|
29e99e229b | ||
|
|
2736b88dd5 | ||
|
|
e739c60e9f | ||
|
|
1c0afbc5c5 | ||
|
|
ee1ba5c0f2 | ||
|
|
02342ba540 | ||
|
|
12a130e9bc | ||
|
|
dfb97e7961 | ||
|
|
54e03a62bd | ||
|
|
ec9659ff25 | ||
|
|
0a41b253f3 | ||
|
|
002b86198c | ||
|
|
7161a235f1 | ||
|
|
391034a785 | ||
|
|
446a7fbd67 | ||
|
|
2ccb09434f | ||
|
|
7974060a40 | ||
|
|
e8abcc1765 | ||
|
|
1be1927a1f | ||
|
|
894ff71664 | ||
|
|
93bed9c5df | ||
|
|
34c008adce | ||
|
|
22ddd91b1f | ||
|
|
e121f34407 | ||
|
|
df8a3e870a | ||
|
|
13b6708a09 | ||
|
|
6aa196cf55 | ||
|
|
142493076a | ||
|
|
3d905a7a4f | ||
|
|
0a8a6ed168 | ||
|
|
68b6fa46e6 | ||
|
|
80f7c54e4d | ||
|
|
c0e2041006 | ||
|
|
f6d2cd7704 | ||
|
|
6d9a629b15 | ||
|
|
ead8edc7cd | ||
|
|
664eefdddb | ||
|
|
220d76c974 | ||
|
|
d973192b5e | ||
|
|
978bb5059f | ||
|
|
f59178bc33 | ||
|
|
53899cc492 | ||
|
|
6379d0fe0f | ||
|
|
a1c4d8696a | ||
|
|
7f42ed86f2 | ||
|
|
6bb8b4c994 | ||
|
|
afefbe4e56 | ||
|
|
5cd37e5505 | ||
|
|
d6a825981d | ||
|
|
a1c01c6722 | ||
|
|
8d182f1d79 | ||
|
|
29707bd2ea | ||
|
|
c2bf2a8174 | ||
|
|
b402849557 | ||
|
|
cb85dcfcb8 | ||
|
|
49379140c7 | ||
|
|
63f6c86b46 | ||
|
|
1865898cd4 | ||
|
|
8935ecfdb8 | ||
|
|
4902bed409 | ||
|
|
e6f6aba207 | ||
|
|
bab622de25 | ||
|
|
a86c1624a7 | ||
|
|
c707392a5a | ||
|
|
1f07721ec4 | ||
|
|
4767e45035 | ||
|
|
f2a64ed685 | ||
|
|
2c9966a0a3 | ||
|
|
953aa95c64 | ||
|
|
446266776e | ||
|
|
845af014dc | ||
|
|
7c8f8703a1 | ||
|
|
a0c18e4380 | ||
|
|
e8d8099563 | ||
|
|
2c9d90d463 | ||
|
|
130d2064d5 | ||
|
|
a10eb2a0d7 | ||
|
|
b71cc5d7ee | ||
|
|
8512f9eda1 | ||
|
|
80058083b8 | ||
|
|
d5a17a3c25 | ||
|
|
eab7c87781 | ||
|
|
d2962d8676 | ||
|
|
5e602fb575 | ||
|
|
599964ea5f | ||
|
|
562de7926b | ||
|
|
8eaed95e02 | ||
|
|
3cffd46008 | ||
|
|
e239bfda8a | ||
|
|
bd887b660d | ||
|
|
7c1e0ea95d | ||
|
|
afbddbfcda | ||
|
|
9eeb702ca5 | ||
|
|
4cb6d6995f | ||
|
|
fe7e7a8d07 | ||
|
|
f8ee79ab72 | ||
|
|
a11165830b | ||
|
|
11cde61eab | ||
|
|
cd862409cc | ||
|
|
7644555d6b | ||
|
|
07e68aa694 | ||
|
|
0ae206b1bb | ||
|
|
5bdac96375 | ||
|
|
f0e044ecd8 | ||
|
|
f32234291e | ||
|
|
83acd6529f | ||
|
|
6a60cb4dc0 | ||
|
|
1de03fbe18 | ||
|
|
0e0a2aa981 | ||
|
|
af73b9d11b | ||
|
|
859969241a | ||
|
|
6852a8ca9d | ||
|
|
c694f1a4a9 | ||
|
|
d36543b204 | ||
|
|
6981234736 | ||
|
|
10bf3ee9de | ||
|
|
9953218de1 | ||
|
|
50c74103aa | ||
|
|
c5e15123fd | ||
|
|
4adcdb5ba8 | ||
|
|
60b36ffaa3 | ||
|
|
d86104ed5d | ||
|
|
0f02ef20a9 | ||
|
|
0768cf17b6 | ||
|
|
197205853f | ||
|
|
bebcc24ab8 | ||
|
|
987248ccbb | ||
|
|
56ece4db0f | ||
|
|
c7f8b94ccd | ||
|
|
95b820305a | ||
|
|
599b200ca5 | ||
|
|
a9566b31be | ||
|
|
f30837d726 | ||
|
|
1242ffa4c6 | ||
|
|
37c0347c47 | ||
|
|
65befb84a0 | ||
|
|
a41f7ce3bd | ||
|
|
81ced6bf2a | ||
|
|
fa8033f998 | ||
|
|
19e3178d0c | ||
|
|
1e6262f24f | ||
|
|
beb2284440 | ||
|
|
0c4f0de13d | ||
|
|
0cd31a4b96 | ||
|
|
ef0a86e7cc | ||
|
|
b79c1345b9 | ||
|
|
5bb8b6f16c | ||
|
|
f6f675d1e1 | ||
|
|
9f684e7670 | ||
|
|
a998706452 | ||
|
|
5e19bc6f84 | ||
|
|
169f287970 | ||
|
|
c56926428c | ||
|
|
43eab5c4e5 | ||
|
|
c6424c2ce7 | ||
|
|
dfe19d308c | ||
|
|
b75db110dc | ||
|
|
9e50ba6ec6 | ||
|
|
aca2ba13c2 | ||
|
|
c5afe7a573 | ||
|
|
8b90968cb1 | ||
|
|
9281dba896 | ||
|
|
c7555f1c3c | ||
|
|
e781831032 | ||
|
|
8025895168 | ||
|
|
799935e44c | ||
|
|
209d8d058c | ||
|
|
0368a70dd7 | ||
|
|
c3603426de | ||
|
|
80db9971b5 | ||
|
|
e3e771708e | ||
|
|
b9bca2a19f | ||
|
|
ffae70a99a | ||
|
|
10ec1e48b0 | ||
|
|
84123f5445 | ||
|
|
25531d8393 | ||
|
|
adfadc542a | ||
|
|
7682e1cb57 | ||
|
|
1fe4109a42 | ||
|
|
b97baf4d47 | ||
|
|
f91728561f | ||
|
|
2b75d54ce1 | ||
|
|
cdc09a7d30 | ||
|
|
4cc6c3e535 | ||
|
|
8f43e033a4 | ||
|
|
918dbd1926 | ||
|
|
8fc86ce7fa | ||
|
|
bf0cb40586 | ||
|
|
a62aefe74b | ||
|
|
138d232149 | ||
|
|
8fa64e3ab2 | ||
|
|
8d0d2bd3fc | ||
|
|
2146f5f623 | ||
|
|
623df23570 | ||
|
|
4a15d8b6d2 | ||
|
|
af83a62474 | ||
|
|
a0705a6c67 | ||
|
|
712b8eec3d | ||
|
|
558e9c21ed | ||
|
|
23a7137e6a | ||
|
|
71a1cb0184 | ||
|
|
09b47cc536 | ||
|
|
b5c78de2dd | ||
|
|
a1bd14e516 | ||
|
|
9684c8664f | ||
|
|
3c75361e5a | ||
|
|
c44c9ab74d | ||
|
|
8cc9c871b7 | ||
|
|
31d211cded | ||
|
|
c42cba1d54 | ||
|
|
c87f7cb9ac | ||
|
|
421bee3871 | ||
|
|
2c7573a032 | ||
|
|
fe2a0f5089 | ||
|
|
59ba8dec4e | ||
|
|
ff0e1bbbc0 | ||
|
|
18c712cd99 | ||
|
|
8de1f764fd | ||
|
|
a91c1ec6d9 | ||
|
|
c8e351b31e | ||
|
|
b4c98584db | ||
|
|
1d17836b7d | ||
|
|
193a739749 | ||
|
|
48da2b8353 | ||
|
|
40dc9de6c9 | ||
|
|
d7469e4694 | ||
|
|
fdfabc9f88 | ||
|
|
5658ca5b90 | ||
|
|
8b79e6d3c7 | ||
|
|
8c67087a15 | ||
|
|
057f73a73e | ||
|
|
d3bb37d113 | ||
|
|
6c91b862c9 | ||
|
|
cba47b635a | ||
|
|
cd83388f8b | ||
|
|
02ae247536 | ||
|
|
1621a68191 | ||
|
|
2aef495d62 | ||
|
|
227c168b65 | ||
|
|
dcbcf5842f | ||
|
|
8a3ac6d9bd | ||
|
|
6cabad19d5 | ||
|
|
dad7a03d19 | ||
|
|
7b152640d9 | ||
|
|
78fddff34e | ||
|
|
78f542f6c0 | ||
|
|
f8a016edb5 | ||
|
|
f5453d38ec | ||
|
|
331bf0af21 | ||
|
|
9ac69337e8 | ||
|
|
ca0c844f32 | ||
|
|
e629e8784f | ||
|
|
e944c1ee93 | ||
|
|
02c882bda3 | ||
|
|
2c29377abf | ||
|
|
21992f1b9e | ||
|
|
8a3f090684 | ||
|
|
a4258505a9 | ||
|
|
ba4a971bfa | ||
|
|
6abc120279 | ||
|
|
64c36b7a8f | ||
|
|
64b9f0762c | ||
|
|
e799082e5c | ||
|
|
eab66a022e | ||
|
|
485915c27a | ||
|
|
45fb482ab4 | ||
|
|
167e2475d8 | ||
|
|
fe77251242 | ||
|
|
0c331d2887 | ||
|
|
39facd5dc6 | ||
|
|
a2bd5ae638 | ||
|
|
c57f616141 | ||
|
|
3af10a1d00 | ||
|
|
b3987e2402 | ||
|
|
71dd44f430 | ||
|
|
584462f9b9 | ||
|
|
ff5d5d7cbc | ||
|
|
370e92b1a6 | ||
|
|
2469768a85 | ||
|
|
acb8fa613e | ||
|
|
83b4b7d83d | ||
|
|
33a7d56042 | ||
|
|
20de730541 | ||
|
|
134c27c900 | ||
|
|
123ae024c6 | ||
|
|
34a29cd0a5 | ||
|
|
9fffa9800a | ||
|
|
8f7f23a0e5 | ||
|
|
358457f49d | ||
|
|
90e305d789 | ||
|
|
b471e52e28 | ||
|
|
9b5fc37399 | ||
|
|
537322e3b5 | ||
|
|
279121f87f | ||
|
|
a1b2b41cdc | ||
|
|
0cca90c21d | ||
|
|
ad052cb510 | ||
|
|
57f0598373 | ||
|
|
92d192277e | ||
|
|
2cdfbd8970 | ||
|
|
bc0c5f0cdc | ||
|
|
230ee3a03b | ||
|
|
ab0bf37d30 | ||
|
|
b1e66256ce | ||
|
|
fd80693420 | ||
|
|
f222f5ed9b | ||
|
|
59603b902a | ||
|
|
82a5dd6cf9 | ||
|
|
a97f9081a3 | ||
|
|
b3e0ad1303 | ||
|
|
251090406a | ||
|
|
9c3ed173b1 | ||
|
|
7cd41aeb72 | ||
|
|
8ecaf7ad4c | ||
|
|
d4049fe593 | ||
|
|
989b14b519 | ||
|
|
fb3e11408c | ||
|
|
3d3af3284e | ||
|
|
eabcf15790 | ||
|
|
684bca203a | ||
|
|
d42ecccf6f | ||
|
|
5a92c861e3 | ||
|
|
103b14ea3c | ||
|
|
e49f091b4e | ||
|
|
6056f93910 | ||
|
|
18fa2d1af4 | ||
|
|
062ed8a4c4 | ||
|
|
49f3872d04 | ||
|
|
d9b467098a | ||
|
|
7d1e51437e | ||
|
|
f5a7d444e2 | ||
|
|
a0071c2f9f | ||
|
|
98a5e43883 | ||
|
|
f40ebe5b43 | ||
|
|
d7d78d9a2b | ||
|
|
5a12d36a0a | ||
|
|
e61dc76ae1 | ||
|
|
0da22193bd | ||
|
|
d43921823e | ||
|
|
6b5b76b0c9 | ||
|
|
602971408b | ||
|
|
2f5d83f07d | ||
|
|
81b0c316cd | ||
|
|
6df86384ca | ||
|
|
3fbcde4bd7 | ||
|
|
293293c23c | ||
|
|
47185d757e | ||
|
|
94c3998507 | ||
|
|
5fa589691c | ||
|
|
26bc835c7e | ||
|
|
fc7da17fa2 | ||
|
|
dbebe9771b | ||
|
|
d0af8aa9f1 | ||
|
|
f8173e93f5 | ||
|
|
fa6ea6848f | ||
|
|
5982970e21 | ||
|
|
c43e5e0c95 | ||
|
|
b4fc79c38e | ||
|
|
b9cb270b8f | ||
|
|
1fe35d7efe | ||
|
|
ec8c19b1f0 | ||
|
|
c2525bcc05 | ||
|
|
985c31b378 | ||
|
|
135a9f5586 | ||
|
|
979ff80982 | ||
|
|
6cde9f3a9d | ||
|
|
5cad81bf4c | ||
|
|
18967162cf | ||
|
|
6ea75f3a9f | ||
|
|
f51123d009 | ||
|
|
be6376ee2d | ||
|
|
120a85a3e5 | ||
|
|
262fe96c29 | ||
|
|
1864df5ed0 | ||
|
|
09bae0a9e8 | ||
|
|
ebe41a24f1 | ||
|
|
f0f574a15b | ||
|
|
9420436c09 | ||
|
|
2b8f853b96 | ||
|
|
2c2bf60d0c | ||
|
|
62b82448d5 | ||
|
|
2f12e6c3d0 | ||
|
|
8ce23f8e3e | ||
|
|
dbe760d6e2 | ||
|
|
674c26d9c7 | ||
|
|
7b68b04efd | ||
|
|
e0b65bf196 | ||
|
|
77f5cb1f1f | ||
|
|
2a222737f8 | ||
|
|
77d48f9cee | ||
|
|
c77eac325e | ||
|
|
517ced2a54 | ||
|
|
70d2c47367 | ||
|
|
e57084f6df | ||
|
|
8783cf8ec3 | ||
|
|
2af7a7c6ac | ||
|
|
91a1f8d9e1 | ||
|
|
fc5e8ddca1 | ||
|
|
6352472c5f | ||
|
|
833ee6484c | ||
|
|
dda3d24bca | ||
|
|
f77d76a320 | ||
|
|
c51fabf6ed | ||
|
|
b10cb658ca | ||
|
|
68f60568ac | ||
|
|
9fbca83ac0 | ||
|
|
d19bfaa2cb | ||
|
|
53d5ddb345 | ||
|
|
0a5c2e7ab9 | ||
|
|
35802ba949 | ||
|
|
72160aac9a | ||
|
|
9df6916029 | ||
|
|
9bfa2354ff | ||
|
|
7d945d3c8e | ||
|
|
05e28752f1 | ||
|
|
01b6673528 | ||
|
|
4e85ebbf98 | ||
|
|
120e8bffd7 | ||
|
|
8335823748 | ||
|
|
c9fcf4020f | ||
|
|
b10a736744 | ||
|
|
60fbaf7612 | ||
|
|
d24193630e | ||
|
|
354af69f62 | ||
|
|
bccac610a4 | ||
|
|
5aa6209664 | ||
|
|
d693d92702 | ||
|
|
f2622e54e3 | ||
|
|
20fe9b6dde | ||
|
|
11f7aa4212 | ||
|
|
f53c351fd2 | ||
|
|
fb96617377 | ||
|
|
05b8c00ee7 | ||
|
|
58854fdae9 | ||
|
|
fd31ff772f | ||
|
|
ab8e0c9e31 | ||
|
|
abeed3be84 | ||
|
|
a65438c6fe | ||
|
|
c3f43fb0cf | ||
|
|
2807504a81 | ||
|
|
08b716c96d | ||
|
|
b4b1f0a2c9 | ||
|
|
228f742b2f | ||
|
|
a55affe4d5 | ||
|
|
a6ec726ed7 | ||
|
|
87835a4e60 | ||
|
|
1f18af4395 | ||
|
|
e79747a600 | ||
|
|
bd36ac2c0c | ||
|
|
c6186f2c01 | ||
|
|
d639f57470 | ||
|
|
99a2d28592 | ||
|
|
254ee80c16 | ||
|
|
e43f57fe1a | ||
|
|
f88c029a4c | ||
|
|
93c3cbeaef | ||
|
|
88c77b793f | ||
|
|
11286524a5 | ||
|
|
7c863c341e | ||
|
|
3416cf984e | ||
|
|
1784746e7e | ||
|
|
6c6df1adaf | ||
|
|
f91e1c17c0 | ||
|
|
58201b95f2 | ||
|
|
fcce8f6d51 | ||
|
|
f7bdda8828 | ||
|
|
df5a60fd5b | ||
|
|
5782ab7ccc | ||
|
|
72e3f98213 | ||
|
|
1b1433a664 | ||
|
|
568704ed22 | ||
|
|
05a7e4eb64 | ||
|
|
7a0acf2838 | ||
|
|
27787505e0 | ||
|
|
2c8048115d | ||
|
|
7df1780853 | ||
|
|
d5609f3207 | ||
|
|
cd10fbc1fe | ||
|
|
ca0b085d15 | ||
|
|
9a034234d8 | ||
|
|
66ef6c9e4c | ||
|
|
7df60b259b | ||
|
|
34b3bbc883 | ||
|
|
e02d20dd74 | ||
|
|
1a11608f1f | ||
|
|
9e2c9d7812 | ||
|
|
404a393315 | ||
|
|
c69092e110 | ||
|
|
ebc0eeac79 | ||
|
|
2b72f35c32 | ||
|
|
d8212ad620 | ||
|
|
1066bb38a8 | ||
|
|
2bf3f1856f | ||
|
|
f145129f6e | ||
|
|
8d365458d5 | ||
|
|
55cfbf378e | ||
|
|
d76093b148 | ||
|
|
7873e41e00 | ||
|
|
9817e9b18d | ||
|
|
519716bbe4 | ||
|
|
c2dd22ec10 | ||
|
|
232aced926 | ||
|
|
63b9a876b0 | ||
|
|
5cf85a82d3 | ||
|
|
b9f78821d4 | ||
|
|
f4c5b15cc6 | ||
|
|
4d33bd456c | ||
|
|
3a5f7f53ff | ||
|
|
1ed4236bcf | ||
|
|
5ff2c6be74 | ||
|
|
dd18402737 | ||
|
|
686e8ca0f0 | ||
|
|
5aa47d6677 | ||
|
|
0d44348c7d | ||
|
|
35929b46ae | ||
|
|
ba3ba0367c | ||
|
|
7ce866ad7c | ||
|
|
0ae1965f6b | ||
|
|
eb9e892491 | ||
|
|
e39e1d4f60 | ||
|
|
93a95725fc | ||
|
|
4758d9f04b | ||
|
|
d39c016e1d | ||
|
|
5393a0df16 | ||
|
|
68176e10f5 | ||
|
|
c6a2569af8 | ||
|
|
3424dc916c | ||
|
|
c8ad32a39e | ||
|
|
d0b76814b0 | ||
|
|
bf3cb63d46 | ||
|
|
8da7b692f6 | ||
|
|
320c79db49 | ||
|
|
ebf64d9892 | ||
|
|
c12d5b8461 | ||
|
|
7186edc45e | ||
|
|
c94772104d | ||
|
|
9374571056 | ||
|
|
c232e91f83 | ||
|
|
5b8777026a | ||
|
|
51e435d46c | ||
|
|
d3f9ab7dec | ||
|
|
1ba330c473 | ||
|
|
dba7f480ed | ||
|
|
3a39accb0b | ||
|
|
387eca6fbf | ||
|
|
b2381d0513 | ||
|
|
92952f6566 | ||
|
|
a62a5d6c69 | ||
|
|
0627324da6 | ||
|
|
394331cd4e | ||
|
|
0491768fb2 |
53
.github/workflows/coverage.yml
vendored
Normal file
53
.github/workflows/coverage.yml
vendored
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
name: coverage
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
types: [opened, synchronize]
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- c_master
|
||||||
|
tags:
|
||||||
|
- '*'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
|
||||||
|
codecov:
|
||||||
|
timeout-minutes: 30
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v1
|
||||||
|
- name: install depends
|
||||||
|
run: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install g++-multilib lcov
|
||||||
|
- name: Compile tests
|
||||||
|
run: |
|
||||||
|
# install gtest
|
||||||
|
BASE=`pwd`
|
||||||
|
wget https://github.com/google/googletest/archive/release-1.7.0.zip -O googletest-release-1.7.0.zip
|
||||||
|
unzip -q googletest-release-1.7.0.zip
|
||||||
|
cd googletest-release-1.7.0
|
||||||
|
g++ -m64 src/gtest-all.cc -I. -Iinclude -c -fPIC
|
||||||
|
g++ -m64 src/gtest_main.cc -I. -Iinclude -c -fPIC
|
||||||
|
ar -rv libgtest.a gtest-all.o
|
||||||
|
ar -rv libgtest_main.a gtest_main.o
|
||||||
|
mkdir -p ${BASE}/usr/include
|
||||||
|
cp -r include/gtest ${BASE}/usr/include
|
||||||
|
mkdir -p ${BASE}/usr/lib
|
||||||
|
mv *.a ${BASE}/usr/lib
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
mkdir build && cd build
|
||||||
|
CMAKE_LIBRARY_PATH="${BASE}/build" GTEST_ROOT="${BASE}/usr" CMAKE_PREFIX_PATH="${BASE}/usr/gcc/lib64/cmake" cmake -DMSGPACK_32BIT=OFF -DBUILD_SHARED_LIBS=ON -DMSGPACK_CHAR_SIGN=signed -DMSGPACK_BUILD_EXAMPLES=ON -DMSGPACK_BUILD_TESTS=ON -DCMAKE_BUILD_TYPE=Debug -DMSGPACK_GEN_COVERAGE=ON ..
|
||||||
|
make -j4
|
||||||
|
make test
|
||||||
|
- name: Upload coverage to Codecov
|
||||||
|
working-directory: build
|
||||||
|
run: |
|
||||||
|
# Create lcov report
|
||||||
|
lcov --capture --directory . --output-file coverage.info
|
||||||
|
lcov --remove coverage.info '/usr/*' --output-file coverage.info # filter system-files
|
||||||
|
lcov --list coverage.info # debug info
|
||||||
|
# Uploading report to CodeCov
|
||||||
|
bash <(curl -s https://codecov.io/bash) -f coverage.info || echo "Codecov did not collect coverage reports"
|
||||||
233
.github/workflows/gha.yml
vendored
Normal file
233
.github/workflows/gha.yml
vendored
Normal file
@@ -0,0 +1,233 @@
|
|||||||
|
name: CI
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
types: [opened, synchronize]
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- c_master
|
||||||
|
tags:
|
||||||
|
- '*'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
macos:
|
||||||
|
runs-on: macos-latest
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
pattern: [0, 1, 2, 3]
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v1
|
||||||
|
- name: build and test
|
||||||
|
env:
|
||||||
|
CC: clang
|
||||||
|
CXX: clang++
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
BASE=`pwd`;
|
||||||
|
|
||||||
|
# matrix config
|
||||||
|
ACTION="ci/build_cmake.sh"
|
||||||
|
export ARCH="64"
|
||||||
|
if [ ${{ matrix.pattern }} == 0 ]; then
|
||||||
|
export SHARED="ON"
|
||||||
|
export SAN="-fsanitize=address -fno-omit-frame-pointer"
|
||||||
|
export CHAR_SIGN="unsigned"
|
||||||
|
fi
|
||||||
|
if [ ${{ matrix.pattern }} == 1 ]; then
|
||||||
|
export SHARED="ON"
|
||||||
|
export SAN="-fsanitize=address -fno-omit-frame-pointer"
|
||||||
|
export CHAR_SIGN="signed"
|
||||||
|
fi
|
||||||
|
if [ ${{ matrix.pattern }} == 2 ]; then
|
||||||
|
export SHARED="OFF"
|
||||||
|
export CHAR_SIGN="signed"
|
||||||
|
fi
|
||||||
|
if [ ${{ matrix.pattern }} == 3 ]; then
|
||||||
|
export SHARED="OFF"
|
||||||
|
export CHAR_SIGN="unsigned"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# install gtest
|
||||||
|
wget https://github.com/google/googletest/archive/release-1.7.0.zip -O googletest-release-1.7.0.zip
|
||||||
|
unzip -q googletest-release-1.7.0.zip
|
||||||
|
cd googletest-release-1.7.0
|
||||||
|
$CXX -m${ARCH} src/gtest-all.cc -I. -Iinclude -c
|
||||||
|
$CXX -m${ARCH} src/gtest_main.cc -I. -Iinclude -c
|
||||||
|
ar -rv libgtest.a gtest-all.o
|
||||||
|
ar -rv libgtest_main.a gtest_main.o
|
||||||
|
mkdir -p ${BASE}/usr/include
|
||||||
|
cp -r include/gtest ${BASE}/usr/include
|
||||||
|
mkdir -p ${BASE}/usr/lib
|
||||||
|
mv *.a ${BASE}/usr/lib
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
# build and test
|
||||||
|
CMAKE_CXX_COMPILER="${CXX}" CMAKE_C_COMPILER="${CC}" GTEST_ROOT="${BASE}/usr" CFLAGS="-Werror -g -fsanitize=undefined -fno-sanitize-recover=all" CXXFLAGS="-Werror -g -ggdb3 -fsanitize=undefined -fno-sanitize-recover=all" ${ACTION}
|
||||||
|
|
||||||
|
linux:
|
||||||
|
runs-on: ubuntu-18.04
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
pattern: [0, 1, 2, 3, 4, 5, 6, 7, 8]
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v1
|
||||||
|
- name: install build depends
|
||||||
|
run: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install g++-multilib clang-8 valgrind
|
||||||
|
- name: build and test
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
BASE=`pwd`;
|
||||||
|
|
||||||
|
# matrix config
|
||||||
|
if [ ${{ matrix.pattern }} == 0 ]; then
|
||||||
|
export CC=clang
|
||||||
|
export CXX=clang++
|
||||||
|
ACTION="ci/build_cmake.sh"
|
||||||
|
export ARCH="64"
|
||||||
|
export SHARED="ON"
|
||||||
|
export SAN="-fsanitize=address -fno-omit-frame-pointer"
|
||||||
|
export CHAR_SIGN="unsigned"
|
||||||
|
fi
|
||||||
|
if [ ${{ matrix.pattern }} == 1 ]; then
|
||||||
|
export CC=clang
|
||||||
|
export CXX=clang++
|
||||||
|
ACTION="ci/build_cmake.sh"
|
||||||
|
export ARCH="32"
|
||||||
|
export SHARED="ON"
|
||||||
|
export SAN="-fsanitize=address -fno-omit-frame-pointer"
|
||||||
|
export CHAR_SIGN="signed"
|
||||||
|
fi
|
||||||
|
if [ ${{ matrix.pattern }} == 2 ]; then
|
||||||
|
export CC=clang
|
||||||
|
export CXX=clang++
|
||||||
|
ACTION="ci/build_cmake.sh"
|
||||||
|
export ARCH="64"
|
||||||
|
export SHARED="ON"
|
||||||
|
export SAN="-fsanitize=address -fno-omit-frame-pointer"
|
||||||
|
export CHAR_SIGN="signed"
|
||||||
|
fi
|
||||||
|
if [ ${{ matrix.pattern }} == 3 ]; then
|
||||||
|
export CC=clang
|
||||||
|
export CXX=clang++
|
||||||
|
ACTION="ci/build_cmake.sh"
|
||||||
|
export ARCH="32"
|
||||||
|
export SHARED="OFF"
|
||||||
|
export CHAR_SIGN="unsigned"
|
||||||
|
fi
|
||||||
|
if [ ${{ matrix.pattern }} == 4 ]; then
|
||||||
|
export CC=gcc
|
||||||
|
export CXX=g++
|
||||||
|
ACTION="ci/build_cmake.sh"
|
||||||
|
export ARCH="64"
|
||||||
|
export SHARED="ON"
|
||||||
|
export SAN="-fsanitize=address -fno-omit-frame-pointer"
|
||||||
|
export CHAR_SIGN="signed"
|
||||||
|
fi
|
||||||
|
if [ ${{ matrix.pattern }} == 5 ]; then
|
||||||
|
export CC=gcc
|
||||||
|
export CXX=g++
|
||||||
|
ACTION="ci/build_cmake.sh"
|
||||||
|
export ARCH="32"
|
||||||
|
export SHARED="ON"
|
||||||
|
export SAN="-fsanitize=address -fno-omit-frame-pointer"
|
||||||
|
export CHAR_SIGN="unsigned"
|
||||||
|
fi
|
||||||
|
if [ ${{ matrix.pattern }} == 6 ]; then
|
||||||
|
export CC=gcc
|
||||||
|
export CXX=g++
|
||||||
|
ACTION="ci/build_cmake.sh"
|
||||||
|
export ARCH="64"
|
||||||
|
export SHARED="ON"
|
||||||
|
export SAN="-fsanitize=address -fno-omit-frame-pointer"
|
||||||
|
export CHAR_SIGN="unsigned"
|
||||||
|
fi
|
||||||
|
if [ ${{ matrix.pattern }} == 7 ]; then
|
||||||
|
export CC=gcc
|
||||||
|
export CXX=g++
|
||||||
|
ACTION="ci/build_cmake.sh"
|
||||||
|
export ARCH="32"
|
||||||
|
export SHARED="OFF"
|
||||||
|
export CHAR_SIGN="signed"
|
||||||
|
fi
|
||||||
|
if [ ${{ matrix.pattern }} == 8 ]; then
|
||||||
|
export CC=gcc
|
||||||
|
export CXX=g++
|
||||||
|
ACTION="ci/build_cmake_embedded.sh"
|
||||||
|
export ARCH="64"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# install gtest
|
||||||
|
wget https://github.com/google/googletest/archive/release-1.7.0.zip -O googletest-release-1.7.0.zip
|
||||||
|
unzip -q googletest-release-1.7.0.zip
|
||||||
|
cd googletest-release-1.7.0
|
||||||
|
$CXX -m${ARCH} src/gtest-all.cc -I. -Iinclude -c -fPIC
|
||||||
|
$CXX -m${ARCH} src/gtest_main.cc -I. -Iinclude -c -fPIC
|
||||||
|
ar -rv libgtest.a gtest-all.o
|
||||||
|
ar -rv libgtest_main.a gtest_main.o
|
||||||
|
mkdir -p ${BASE}/usr/include
|
||||||
|
cp -r include/gtest ${BASE}/usr/include
|
||||||
|
mkdir -p ${BASE}/usr/lib
|
||||||
|
mv *.a ${BASE}/usr/lib
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
# install zlib
|
||||||
|
if [ ${ARCH} == 32 ]; then
|
||||||
|
sudo apt-get install lib32z1-dev
|
||||||
|
fi
|
||||||
|
|
||||||
|
# build and test
|
||||||
|
CMAKE_CXX_COMPILER="${CXX}" CMAKE_C_COMPILER="${CC}" GTEST_ROOT="${BASE}/usr" CFLAGS="-Werror -g -fsanitize=undefined -fno-sanitize-recover=all" CXXFLAGS="-Werror -g -ggdb3 -fsanitize=undefined -fno-sanitize-recover=all" ${ACTION}
|
||||||
|
|
||||||
|
windows:
|
||||||
|
runs-on: windows-2019
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
pattern: [0, 1, 2, 3]
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2.0.0
|
||||||
|
- name: Cache vcpkg
|
||||||
|
id: cache-vcpkg
|
||||||
|
uses: actions/cache@v1.1.2
|
||||||
|
with:
|
||||||
|
path: C:/vcpkg/installed
|
||||||
|
key: windows-2019-vcpkg-v2
|
||||||
|
- name: Build dependencies
|
||||||
|
if: steps.cache-vcpkg.outputs.cache-hit != 'true'
|
||||||
|
shell: powershell
|
||||||
|
run: |
|
||||||
|
vcpkg install gtest:x64-windows gtest:x86-windows
|
||||||
|
vcpkg install zlib:x64-windows zlib:x86-windows
|
||||||
|
- name: Build and test
|
||||||
|
shell: powershell
|
||||||
|
run: |
|
||||||
|
if (${{ matrix.pattern }} -eq 0) {
|
||||||
|
$ARCH="x64"
|
||||||
|
$SHARED="ON"
|
||||||
|
}
|
||||||
|
elseif (${{ matrix.pattern }} -eq 1) {
|
||||||
|
$ARCH="x64"
|
||||||
|
$SHARED="OFF"
|
||||||
|
}
|
||||||
|
elseif (${{ matrix.pattern }} -eq 2) {
|
||||||
|
$ARCH="Win32"
|
||||||
|
$SHARED="ON"
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$ARCH="Win32"
|
||||||
|
$SHARED="OFF"
|
||||||
|
}
|
||||||
|
|
||||||
|
$CUR=(Get-Location).Path
|
||||||
|
md build
|
||||||
|
cd build
|
||||||
|
cmake -A $ARCH -DBUILD_SHARED_LIBS=$SHARED -DCMAKE_TOOLCHAIN_FILE="C:/vcpkg/scripts/buildsystems/vcpkg.cmake" "-DCMAKE_CXX_FLAGS=/D_VARIADIC_MAX=10 /EHsc /D_SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING" ..
|
||||||
|
cmake --build . --config Release
|
||||||
|
$pathbak="$env:PATH"
|
||||||
|
$env:PATH="C:\vcpkg\installed\x64-windows\bin;$CUR\build\Release;$pathbak"
|
||||||
|
ctest -V
|
||||||
|
$env:PATH=$pathbak
|
||||||
51
.gitignore
vendored
Normal file
51
.gitignore
vendored
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
# Files generated by the bootstrap script.
|
||||||
|
/INSTALL
|
||||||
|
/AUTHORS
|
||||||
|
/ChangeLog
|
||||||
|
/NEWS
|
||||||
|
/README
|
||||||
|
/ac/
|
||||||
|
/aclocal.m4
|
||||||
|
/autom4te.cache/
|
||||||
|
/config.h.in
|
||||||
|
/configure
|
||||||
|
/msgpack_vc2008.sln
|
||||||
|
/msgpack_vc2008.vcproj
|
||||||
|
Makefile.in
|
||||||
|
|
||||||
|
# Files generated by the configure script.
|
||||||
|
|
||||||
|
/config.h
|
||||||
|
/config.log
|
||||||
|
/config.status
|
||||||
|
/libtool
|
||||||
|
/msgpack-c.pc
|
||||||
|
/src/msgpack/version.h
|
||||||
|
/src/msgpack/version.hpp
|
||||||
|
/stamp-h1
|
||||||
|
Makefile
|
||||||
|
.deps
|
||||||
|
.libs
|
||||||
|
|
||||||
|
# Files generated by make.
|
||||||
|
*.o
|
||||||
|
*.so
|
||||||
|
*.lo
|
||||||
|
*.la
|
||||||
|
|
||||||
|
# Files generated by make check.
|
||||||
|
# TODO: Replace these with something like /test/*_test
|
||||||
|
/test/buffer
|
||||||
|
/test/cases
|
||||||
|
/test/convert
|
||||||
|
/test/fixint
|
||||||
|
/test/fixint_c
|
||||||
|
/test/msgpack_test
|
||||||
|
/test/msgpackc_test
|
||||||
|
/test/object
|
||||||
|
/test/pack_unpack
|
||||||
|
/test/pack_unpack_c
|
||||||
|
/test/streaming
|
||||||
|
/test/streaming_c
|
||||||
|
/test/version
|
||||||
|
/test/zone
|
||||||
434
CHANGELOG.md
Normal file
434
CHANGELOG.md
Normal file
@@ -0,0 +1,434 @@
|
|||||||
|
# 2023-02-28 version 6.0.0
|
||||||
|
## << breaking changes >>
|
||||||
|
* Change CMake package name of C library to msgpack-c (#1053)
|
||||||
|
Unified all C package, library, cmake, tarball name become msgpack-c.
|
||||||
|
|
||||||
|
# 2023-01-10 version 5.0.0
|
||||||
|
* Add additional address sanitizer for CI. (#1023)
|
||||||
|
## << breaking changes >>
|
||||||
|
* Change CMake package name of C library to msgpackc (#1044, #1049)
|
||||||
|
|
||||||
|
# 2021-08-01 version 4.0.0
|
||||||
|
* Fix and improve alignment logic (#962)
|
||||||
|
* Fix iovec name conflict (#953)
|
||||||
|
* Fix empty string print (#942)
|
||||||
|
* Fix buffer ptr size (#899)
|
||||||
|
* Fix UB. Check null pointer before using memcpy() (#890)
|
||||||
|
* Improve CI environment (#885, #899)
|
||||||
|
|
||||||
|
## << breaking changes >>
|
||||||
|
* Separate C part of the msgpack-c from C/C++ mixed msgpack-c (#876, #878)
|
||||||
|
|
||||||
|
|
||||||
|
# 2020-06-05 version 3.3.0
|
||||||
|
* Add json example for C (#870)
|
||||||
|
* Add both header and body packing functions for C (#870)
|
||||||
|
* Set default ref_size and chunk_size to vrefbuffer (#865)
|
||||||
|
* Add examples (#861)
|
||||||
|
* Improve build system (#839, #842)
|
||||||
|
* Improve tests (#829)
|
||||||
|
* Improve documents (#828)
|
||||||
|
* Remove some warnings (#827, #851, #871)
|
||||||
|
* Improve CI environment (#824, #831, #833, #834, #846, #860, 874)
|
||||||
|
|
||||||
|
# 2019-12-10 version 3.2.1
|
||||||
|
* Fix snprintf return value checking (#821)
|
||||||
|
* Remove some warnings (#819)
|
||||||
|
* Fix fbuffer result checking (#812)
|
||||||
|
* Fix temporary object handling (#807)
|
||||||
|
* Improve cmake support (#804)
|
||||||
|
* Fix invalid `int main` parameter (#800)
|
||||||
|
* Improve supporting platform (#797, #817)
|
||||||
|
* Fix ZLIB error handling (#795)
|
||||||
|
* Remove unused variable (#793)
|
||||||
|
* Improve integer overflow checking (#792)
|
||||||
|
|
||||||
|
# 2019-05-27 version 3.2.0
|
||||||
|
|
||||||
|
* Fix invalid include (#783)
|
||||||
|
* Add timespec support (#781)
|
||||||
|
* Fix unchecked fnprintf on C (#780)
|
||||||
|
* Improve integer overflow checking on C (#776)
|
||||||
|
* Fix warnings on `-Wconversion` (#770, #777, #784)
|
||||||
|
* Fix invalid passed by value on aligned_zone_size_visitor (#764)
|
||||||
|
* Improve windows support (#757, #779)
|
||||||
|
* Fix msgpack::object size caluclation error (#754)
|
||||||
|
* Fix memory error on example code (#753)
|
||||||
|
* Fix redundant memory allocation on C (#747)
|
||||||
|
* Fix msgpack::type::tuple base class conversion (#743)
|
||||||
|
|
||||||
|
# 2018-09-09 version 3.1.1
|
||||||
|
|
||||||
|
* Add force endian set functionality (#736)
|
||||||
|
* Fix vrefbuffer memory management problem (#733)
|
||||||
|
* Fix msvc specific problem (#731, #732)
|
||||||
|
* Update boost from 1.61.0 to 1.68.0 (#730)
|
||||||
|
* Fix msgpack_timestamp type mismatch bug (#726)
|
||||||
|
|
||||||
|
# 2018-08-10 version 3.1.0
|
||||||
|
|
||||||
|
* Improve documents (#687, #718)
|
||||||
|
* Add fuzzer support (#689)
|
||||||
|
* Fix msgpack::object union member access bug (#694)
|
||||||
|
* Improve cross platform configuration (#704)
|
||||||
|
* Fix out of range dereference bug of EXT (#705)
|
||||||
|
* Add timestamp support. std::chrono::system_clock::time_point is mapped to TIMESTAMP (#706)
|
||||||
|
* Add minimal timestamp support for C. The type `msgpack_timestamp` and the function `msgpack_object_to_timestamp()` are introduced (#707)
|
||||||
|
* Improve MSGPACK_DEFINE family name confliction probability (#710)
|
||||||
|
* Add no static-library build option (BUILD_SHARED_LIBS=ON) (#713, #717, #722)
|
||||||
|
* Add header only cmake target (#721)
|
||||||
|
* Add `std::byte` adaptor (#719)
|
||||||
|
* Remove some warnings (#720)
|
||||||
|
|
||||||
|
# 2018-05-12 version 3.0.1
|
||||||
|
|
||||||
|
* Add fuzz directory to release tar ball (#686)
|
||||||
|
* Add include file checking for X-Code (#683)
|
||||||
|
|
||||||
|
# 2018-05-09 version 3.0.0
|
||||||
|
|
||||||
|
## << breaking changes >>
|
||||||
|
|
||||||
|
* Change offset parameter updating rule. If parse error happens, offset is updated to the error position. (#639, #666)
|
||||||
|
|
||||||
|
## << other updates >>
|
||||||
|
|
||||||
|
* Improve cross platform configuration (#655, #677)
|
||||||
|
* Improve build system (#647)
|
||||||
|
* Improve user class adaptor (#645, #673)
|
||||||
|
* Improve msgpack::object visitation logic (#676)
|
||||||
|
* Remove some warnings (#641, 659)
|
||||||
|
* Add `->` and `*` operators to object_handle (#635)
|
||||||
|
* Improve CI environment (#631, #634, #643, #657, #662, #668)
|
||||||
|
* Improve documents (#630, #661)
|
||||||
|
* Refactoring (#670)
|
||||||
|
* Add OSS-Fuzz support (#672, #674, #675, #678)
|
||||||
|
|
||||||
|
# 2017-08-04 version 2.1.5
|
||||||
|
* Improve cross platform configuration (#624)
|
||||||
|
* Add boost asio examples (including zlib) (#610)
|
||||||
|
* Remove some warnings (#611)
|
||||||
|
* Fix unpack visitor to treat float32/64 correctly (#613)
|
||||||
|
* Improve documents (#616)
|
||||||
|
* Fix alignment problem on some platform (#617, #518)
|
||||||
|
* Fix conflict std::tuple, std::pair, and boost::fusion::sequence problem (#619)
|
||||||
|
|
||||||
|
# 2017-08-03 version 2.1.4 (Invalid)
|
||||||
|
* See https://github.com/msgpack/msgpack-c/issues/623
|
||||||
|
|
||||||
|
# 2017-06-15 version 2.1.3
|
||||||
|
* Improve build system (#603)
|
||||||
|
* Add C++17 adaptors `std::optional` and `std::string_view`. (#607, #608)
|
||||||
|
* Improve cross platform configuration (#601)
|
||||||
|
* Remove some warnings (#599, #602, #605)
|
||||||
|
|
||||||
|
# 2017-06-07 version 2.1.2
|
||||||
|
|
||||||
|
* Improve documents (#565)
|
||||||
|
* Fix empty map parse bug (#568)
|
||||||
|
* Improve build system (#569, #570, #572, #579, #591, #592)
|
||||||
|
* Remove some warnings (#574, #578, #586, #588)
|
||||||
|
* Improve cross platform configuration (#577, #582)
|
||||||
|
* Add cmake package config support (#580)
|
||||||
|
* Fix streaming unpack bug (#585)
|
||||||
|
|
||||||
|
# 2017-02-04 version 2.1.1
|
||||||
|
|
||||||
|
* Fix unpacker's buffer management bug (#561)
|
||||||
|
* Add boost string_view adaptor (#558)
|
||||||
|
* Remove some warnings (#557, #559)
|
||||||
|
* Improve coding style (#556)
|
||||||
|
|
||||||
|
# 2017-01-10 version 2.1.0
|
||||||
|
|
||||||
|
## << breaking changes >>
|
||||||
|
|
||||||
|
* Fix object internal data type is float if msgpack format is float32 (#531)
|
||||||
|
|
||||||
|
## << recommended changes >>
|
||||||
|
|
||||||
|
* Add `FLOAT64` type. Please use it instead of `DOUBLE` (#531)
|
||||||
|
* Add `FLOAT32` type. Please use it instead of `FLOAT` (#531)
|
||||||
|
|
||||||
|
## << other updates >>
|
||||||
|
|
||||||
|
* Add iterator based parse/unpack function(experimental) (#553)
|
||||||
|
* Add `[[deprecated]]` attribute for C++14 (#552)
|
||||||
|
* Fix `msgpack_unpack()` return code (#548)
|
||||||
|
* Fix integer overflow (#547, #549, #550)
|
||||||
|
* Add example codes (#542)
|
||||||
|
* Add MSGPACK_NVP. You can use not only variable name but also any strings (#535)
|
||||||
|
* Fix and Improve build system (#532, #545)
|
||||||
|
* Fix `gcc_atomic.hpp` include path (#529, #530)
|
||||||
|
* Improve CI environment (#526)
|
||||||
|
* Improve documents (#524)
|
||||||
|
* Add msgpack_unpacker_next_with_size() function (#515)
|
||||||
|
* Fix `as()` applying condition (#511)
|
||||||
|
* Fix fbuffer write (#504)
|
||||||
|
* Add gcc bug workaround (#499)
|
||||||
|
* Improve object print (#497, #500, #505, #533)
|
||||||
|
* Remove some warnings (#495, #506, #508, #513, #528, #538, #545)
|
||||||
|
|
||||||
|
# 2016-06-25 version 2.0.0
|
||||||
|
|
||||||
|
## << breaking changes >>
|
||||||
|
|
||||||
|
* Removed autotools support. Use cmake instead (#476, #479)
|
||||||
|
* Removed pointer version of msgpack::unpack APIs. Use reference version instead (#453)
|
||||||
|
* Removed MSGPACK_DISABLE_LEGACY_CONVERT. msgpack::object::convert(T*) is removed by default. Use msgpack::object::convert(T&) instead (#451)
|
||||||
|
* Removed msgpacl::type::nil. Use nil_t or define MSGPACK_USE_LECACY_NIL (#444)
|
||||||
|
* Removed std::string to msgpack::object conversion (#434)
|
||||||
|
|
||||||
|
## << recommended changes >>
|
||||||
|
|
||||||
|
* Replaced msgpack::unpacked with msgpack::object_handle. msgpack::unpacked is kept as a typedef of msgpack::object_handle. (#448)
|
||||||
|
|
||||||
|
## << other updates >>
|
||||||
|
|
||||||
|
* Add strict size checking adaptor. Relaxed tuple conversion (#489)
|
||||||
|
* Fix and Improve example codes (#487)
|
||||||
|
* Add C++/CLI support for nullptr (#481)
|
||||||
|
* Update the boost libraries that are contained by msgpack-c (#475)
|
||||||
|
* Fix gcc_atomic.hpp location (#474)
|
||||||
|
* Add C-Style array support (#466, #488)
|
||||||
|
* Fix include file dependency (#464)
|
||||||
|
* Add a visitor version of unpack API (#461)
|
||||||
|
* Fix JSON string conversion from "nil" to "null" (#458)
|
||||||
|
* Fix and Improve build system (#455, #471, #473, #486, #491)
|
||||||
|
* Fix comments (#452)
|
||||||
|
* Fix unintentional msgpack::zone moving problem (#447)
|
||||||
|
* Fix operator>> and << for msgpack::object (#443)
|
||||||
|
* Fix C++03 msgpack::zone::clear() memory access violation bug (#441)
|
||||||
|
* Fix TARGET_OS_IPHONE checking (#436)
|
||||||
|
* Fix invalid front() call for empty container (#435)
|
||||||
|
* Fix compile error on g++6 (C++11 only) (#426, #430)
|
||||||
|
* Fix zone size expansion logic (#423)
|
||||||
|
* Fix wrong hader file dependency (#421)
|
||||||
|
* Fix msvc specific problem (#420)
|
||||||
|
* Add v2 API support (#415)
|
||||||
|
|
||||||
|
# 2016-01-22 version 1.4.0
|
||||||
|
|
||||||
|
## << recommended changes >>
|
||||||
|
|
||||||
|
* Define [MSGPACK_DISABLE_LEGACY_NIL](https://github.com/msgpack/msgpack-c/wiki/v1_1_cpp_configure#msgpack_disable_legacy_nil-since-140), then `msgpack::type::nil` is replaced by with `msgpack::type::nil_t` (#408, #411, #412).
|
||||||
|
Replace `msgpack::type::nil` with `msgpack::type::nil_t` in client codes.
|
||||||
|
`msgpack::type::nil` will be removed on the version 2.0.0.
|
||||||
|
* Define [MSGPACK_DISABLE_LEGACY_CONVERT](https://github.com/msgpack/msgpack-c/wiki/v1_1_cpp_configure#msgpack_disable_legacy_convert-since-140), then `msgpack::object::convert(T*)` is removed (#410).
|
||||||
|
Replace calling `msgpack::bojectconvert(T*)` with `msgpack::bojectconvert(T&)` in client codes as follows:
|
||||||
|
|
||||||
|
```C++
|
||||||
|
int i;
|
||||||
|
obj.convert(&i); // before
|
||||||
|
```
|
||||||
|
|
||||||
|
```C++
|
||||||
|
int i;
|
||||||
|
obj.convert(i); // after
|
||||||
|
```
|
||||||
|
|
||||||
|
`msgpack::object::convert(T*)` will be removed on the version 2.0.0.
|
||||||
|
|
||||||
|
Define the macros above as follows when you compile C++ codes that use msgpack-c:
|
||||||
|
|
||||||
|
```
|
||||||
|
g++ -Ipath_to_msgpack/include -DMSGPACK_DISABLE_LEGACY_NIL -DMSGPACK_DISABLE_LEGACY_CONVERT your_code.cpp
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
You can compile existing codes without defining macros above but I recommend defining them and updating your codes to fix the issues #408, #411, #412, #399, and #410. It is also a good preparation for the version 2.0.0.
|
||||||
|
|
||||||
|
## << other updates >>
|
||||||
|
|
||||||
|
* Improve documents (#387, #407)
|
||||||
|
* Remove C++ version library (#394, #402)
|
||||||
|
* Add Doxyfile and ChangeLog to the distribution package (#397)
|
||||||
|
* Add signed/unsigned char test to travis-ci (#398)
|
||||||
|
* Remove some warnings (#400, #401, #409)
|
||||||
|
* Fix endian checking. (#404)
|
||||||
|
|
||||||
|
# 2015-11-21 version 1.3.0
|
||||||
|
|
||||||
|
* Change the license from the Apache License Version 2.0 to the
|
||||||
|
Boost Software License, Version 1.0.(#386)
|
||||||
|
* Remove some warnings (#365)
|
||||||
|
* Add std::reference_wrapper support(#373, #384)
|
||||||
|
* Improve tests (#375, #378, #379, #380)
|
||||||
|
* Fix msvc specific problem (#376, #383)
|
||||||
|
* Fix typos (#381)
|
||||||
|
|
||||||
|
# 2015-09-04 version 1.2.0
|
||||||
|
|
||||||
|
## << breaking changes >>
|
||||||
|
|
||||||
|
* Change std::vector<unsigned char> and std::array<unsigned char>
|
||||||
|
mapped to BIN instead of ARRAY (#243)
|
||||||
|
* Remove redundant copy (#285)
|
||||||
|
|
||||||
|
|
||||||
|
## << other updates >>
|
||||||
|
|
||||||
|
* Add array_ref to map to ARRAY (#243)
|
||||||
|
* Add variant type and adaptor (#349)
|
||||||
|
* Add object::convert_if_not_nil() (#357)
|
||||||
|
* Fix invalid offset update (#354)
|
||||||
|
* Add C++11 support on MSVC2015(#339, #347)
|
||||||
|
* Fix and Improve build system (#346, #350, #361, #363)
|
||||||
|
* Import Boost.Preprocessor as a part of msgpack-c (#312)
|
||||||
|
* Fix OSX with libc++ specific errors (#334, #362)
|
||||||
|
* Add customized containers support (#330)
|
||||||
|
* Add std::unique_ptr and std::shared_ptr support (#329)
|
||||||
|
* Add missing install files (#328)
|
||||||
|
* Add shared/static library switching option (#316)
|
||||||
|
* Improve no throw description on C++11 (#313)
|
||||||
|
* Import Boost.Predef as a part of msgpack-c (#312)
|
||||||
|
* Add map based serialize support (#306)
|
||||||
|
* Add Boost.Fusion support (#305)
|
||||||
|
* Add v4 format RAW support (#304)
|
||||||
|
* Fix zbuffer with empty string problem (#303)
|
||||||
|
* Add non default constructible class support (#302, #324, #327, #331, #332, #345)
|
||||||
|
* Add inline keyword to function (template) (#299)
|
||||||
|
* Add EXT type supporting classes (#292, #308)
|
||||||
|
* Fix raw_ref != comparison (#290)
|
||||||
|
* Add object deep copy (#288)
|
||||||
|
* Remove some warnings (#284, #322, #323, #335)
|
||||||
|
* Improve compiler version checking (#283)
|
||||||
|
* Add return value to object::convert() (#282)
|
||||||
|
* Improve move semantic support in C++11 (#279, #353)
|
||||||
|
* Add Boost.StringRef support (#278)
|
||||||
|
* Improve CI environment (#276, #294, #338)
|
||||||
|
* Add converting to JSON (#274, #301)
|
||||||
|
* Fix iOS specific problem (#270)
|
||||||
|
* Improve doxtgen document generation (#269)
|
||||||
|
* Add Boost.Optional support (#268)
|
||||||
|
* Fix msvc specific problem (#267, #295)
|
||||||
|
* Add base class serialization. (#265, #277)
|
||||||
|
* Add and improve examples. (#264, #310, #311, #341, #342, #344)
|
||||||
|
* Fix wiki URL. (#263)
|
||||||
|
|
||||||
|
# 2015-04-03 version 1.1.0
|
||||||
|
|
||||||
|
## << breaking changes >>
|
||||||
|
|
||||||
|
* Remove msgpack_fwd.hpp
|
||||||
|
* Improve user types adaptation mechanism (#262)
|
||||||
|
Since version 1.0.0, users need to obey the correct include order.
|
||||||
|
However, it is very difficult to maintain the correct order in big
|
||||||
|
projects. version 1.1.0 removed this order. Users don't need to
|
||||||
|
care about include order. Migration guide from 1.0.x to 1.1.0 has
|
||||||
|
been written. See https://github.com/msgpack/msgpack-c/wiki
|
||||||
|
|
||||||
|
|
||||||
|
## << other updates >>
|
||||||
|
|
||||||
|
* Fix vector<bool> size check (#251)
|
||||||
|
* Fix inttypes.h inclusion on MSVC (#257)
|
||||||
|
* Support documents generation by Doxygen (#259)
|
||||||
|
* Remove C99 style variable declaration (#253)
|
||||||
|
* Improve documents (https://github.com/msgpack/msgpack-c/wiki)
|
||||||
|
|
||||||
|
# 2015-03-22 version 1.0.1:
|
||||||
|
|
||||||
|
* Fix compilation error on Mac 10.9 (#244)
|
||||||
|
* Fix typos in documents (#240)
|
||||||
|
* Update CHANGELOG.md for version 1.0.0 (#242)
|
||||||
|
* Fix erb templates for the next code generation (#239)
|
||||||
|
|
||||||
|
# 2015-03-10 version 1.0.0:
|
||||||
|
|
||||||
|
* Support msgpack v5 format (str, bin, and ext) https://github.com/msgpack/msgpack/blob/master/spec.md (#142)
|
||||||
|
* Support std::tuple, std::forward_list, std::array, std::unordered_set, std::unordered_map on C++11. tr1 unordered containers are still supported (#53, #130, #137, #154, #169)
|
||||||
|
* Update msgpack-c as a header-only library on C++ (#142)
|
||||||
|
* Move include directory (#142)
|
||||||
|
* Update the name of float format family on msgpack::object from 'dec' to 'f64' (#194)
|
||||||
|
* Remove existing elements on associative containers when unpacking (#127)
|
||||||
|
* Add an API versioning functionality https://github.com/msgpack/msgpack-c/wiki/cpp_versioning (#139)
|
||||||
|
* Add C++11 enum class support (#205)
|
||||||
|
* Map std::vector<char> and std::array<char> to BIN (#100)
|
||||||
|
* Map '\0' teminated char* and char const* to STR (#206)
|
||||||
|
* Add the new parameter on unpacking functions and classes to limit msgpack's bytestream size (https://github.com/msgpack/msgpack-c/wiki/cpp_unpacker#limit-size-of-elements) (#175)
|
||||||
|
* Add the copy or reference choosing function on unpack() and unpacker (https://github.com/msgpack/msgpack-c/wiki/cpp_unpacker#memory-management)
|
||||||
|
* Add the new unpack() overloads for C++11 https://github.com/msgpack/msgpack-c/wiki/cpp_unpacker (#128)
|
||||||
|
* Add a msgpack::object::with_zone (deep) copying function (#133, #163)
|
||||||
|
* Remove the compile-time defined limit of msgpack nest level on C++ (#218)
|
||||||
|
* Add the new unpack() overloads that use an existing zone (#201)
|
||||||
|
* Add the range-based for loop support on msgpack object array and map (#203)
|
||||||
|
* Add msgpack revision getter function for 'revision' (#237)
|
||||||
|
* Support EXT for C (#118, #129)
|
||||||
|
* Fix unpacking buffer allocation problem when malformed data is given (#160, #185)
|
||||||
|
* Add dll exporting function on MSVC (#162)
|
||||||
|
* Fix msgpack::zone::allocate_no_align(). Now it allocates the memory that is not aligned as expected (#171)
|
||||||
|
* Improve documents (https://github.com/msgpack/msgpack-c/wiki)
|
||||||
|
* Other bug fixes and refactoring: #62, #91, #95, #97, #107, #109, #113, #117, #119, #121, #122, #123, #126, #131, #136, #138, #140, #143, #145, #146, #150, #151, #152, #156, #157, #158, #161, #165, #170, #172, #179, #180, #181, #182, #183, #192, #195, #199, #200, #207, #211, #212, #219, #222, #224, #230, #231, #232, #233, #234, #235
|
||||||
|
|
||||||
|
# 2014-07-02 version 0.5.9:
|
||||||
|
|
||||||
|
* Support std::tr1 unordered containers by default (#51, #63, #68, #69)
|
||||||
|
* Remove some warnings (#56)
|
||||||
|
* Fix segmentation fault after malloc failures (#58, #59)
|
||||||
|
* Fix alloc/dealloc mismatch (#52, #61)
|
||||||
|
* Fix sample codes (#60, #64)
|
||||||
|
* Support implicit conversion from integer to float/double (#54)
|
||||||
|
* Improve documents (#45, #75, #82, #83)
|
||||||
|
* Support CMake (#20, #87)
|
||||||
|
* Remove Ruby dependencies in bootstrap (#86, #87)
|
||||||
|
* Add FILE* buffer (#40)
|
||||||
|
* Other bug fixes and refactoring: #39, #73, #77, #79, #80, #81, #84, #90
|
||||||
|
|
||||||
|
# 2013-12-23 version 0.5.8:
|
||||||
|
|
||||||
|
* Move to the new github repository msgpack/msgpack-c
|
||||||
|
* Support the new deserialization specification
|
||||||
|
* fixes the problem of unpack helpers for array and map with 32bit compilers (#37, #38)
|
||||||
|
* Other bug fixes and refactoring: #46, #41, #36, #35, #33, #32, #30, #29, #28, #27, #26, #25, #8, #3
|
||||||
|
* Update of documents: #23, #18, #17
|
||||||
|
|
||||||
|
# 2011-08-08 version 0.5.7:
|
||||||
|
|
||||||
|
* fixes compile error problem with llvm-gcc and Mac OS X Lion
|
||||||
|
|
||||||
|
# 2011-04-24 version 0.5.6:
|
||||||
|
|
||||||
|
* #42 fixes double-free problem on msgpack_unpacker_release_zone
|
||||||
|
|
||||||
|
# 2011-02-24 version 0.5.5:
|
||||||
|
|
||||||
|
* eliminates dependency of winsock2.h header
|
||||||
|
* fixes msgpack_vc.postbuild.bat file
|
||||||
|
* fixes some implicit cast warnings
|
||||||
|
|
||||||
|
# 2010-08-29 version 0.5.4:
|
||||||
|
|
||||||
|
* includes msgpack_vc2008.vcproj file in source package
|
||||||
|
* fixes type::fix_int types
|
||||||
|
|
||||||
|
# 2010-08-27 version 0.5.3:
|
||||||
|
|
||||||
|
* adds type::fix_{u,}int{8,16,32,64} types
|
||||||
|
* adds msgpack_pack_fix_{u,}int{8,16,32,64} functions
|
||||||
|
* adds packer<Stream>::pack_fix_{u,}int{8,16,32,64} functions
|
||||||
|
* fixes include paths
|
||||||
|
|
||||||
|
# 2010-07-14 version 0.5.2:
|
||||||
|
|
||||||
|
* type::raw::str(), operator==, operator!=, operator< and operator> are now const
|
||||||
|
* generates version.h using AC_OUTPUT macro in ./configure
|
||||||
|
|
||||||
|
# 2010-07-06 version 0.5.1:
|
||||||
|
|
||||||
|
* Add msgpack_vrefbuffer_new and msgpack_vrefbuffer_free
|
||||||
|
* Add msgpack_sbuffer_new and msgpack_sbuffer_free
|
||||||
|
* Add msgpack_unpacker_next and msgpack_unpack_next
|
||||||
|
* msgpack::unpack returns void
|
||||||
|
* Add MSGPACK_VERSION{,_MAJOR,_MINOR} macros to check header version
|
||||||
|
* Add msgpack_version{,_major,_minor} functions to check library version
|
||||||
|
* ./configure supports --disable-cxx option not to build C++ API
|
||||||
|
|
||||||
|
# 2010-04-29 version 0.5.0:
|
||||||
|
|
||||||
|
* msgpack_object_type is changed. MSGPACK_OBJECT_NIL is now 0x00.
|
||||||
|
* New safe streaming deserializer API.
|
||||||
|
* Add object::object(const T&) and object::operator=(const T&)
|
||||||
|
* Add operator==(object, const T&)
|
||||||
|
* MSGPACK_DEFINE macro defines msgpack_object(object* obj, zone* z)
|
||||||
|
* C++ programs doesn't need to link "msgpackc" library.
|
||||||
333
CMakeLists.txt
Normal file
333
CMakeLists.txt
Normal file
@@ -0,0 +1,333 @@
|
|||||||
|
CMAKE_MINIMUM_REQUIRED (VERSION 2.8.12)
|
||||||
|
|
||||||
|
IF ((CMAKE_VERSION VERSION_GREATER 3.1) OR
|
||||||
|
(CMAKE_VERSION VERSION_EQUAL 3.1))
|
||||||
|
CMAKE_POLICY(SET CMP0054 NEW)
|
||||||
|
ENDIF ()
|
||||||
|
|
||||||
|
PROJECT (msgpack-c)
|
||||||
|
|
||||||
|
FILE (READ ${CMAKE_CURRENT_SOURCE_DIR}/include/msgpack/version_master.h contents)
|
||||||
|
STRING (REGEX MATCH "#define MSGPACK_VERSION_MAJOR *([0-9a-zA-Z_]*)" NULL_OUT ${contents})
|
||||||
|
SET (VERSION_MAJOR ${CMAKE_MATCH_1})
|
||||||
|
STRING (REGEX MATCH "#define MSGPACK_VERSION_MINOR *([0-9a-zA-Z_]*)" NULL_OUT ${contents})
|
||||||
|
SET (VERSION_MINOR ${CMAKE_MATCH_1})
|
||||||
|
STRING (REGEX MATCH "#define MSGPACK_VERSION_REVISION *([0-9a-zA-Z_]*)" NULL_OUT ${contents})
|
||||||
|
SET (VERSION_REVISION ${CMAKE_MATCH_1})
|
||||||
|
SET (VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_REVISION})
|
||||||
|
|
||||||
|
LIST (APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake/")
|
||||||
|
SET (prefix ${CMAKE_INSTALL_PREFIX})
|
||||||
|
SET (exec_prefix "\${prefix}")
|
||||||
|
SET (libdir "\${exec_prefix}/lib")
|
||||||
|
SET (includedir "\${prefix}/include")
|
||||||
|
|
||||||
|
OPTION (MSGPACK_32BIT "32bit compile" OFF)
|
||||||
|
|
||||||
|
INCLUDE(TestBigEndian)
|
||||||
|
TEST_BIG_ENDIAN(BIGENDIAN)
|
||||||
|
IF (BIGENDIAN)
|
||||||
|
SET(MSGPACK_ENDIAN_BIG_BYTE 1)
|
||||||
|
SET(MSGPACK_ENDIAN_LITTLE_BYTE 0)
|
||||||
|
ELSE ()
|
||||||
|
SET(MSGPACK_ENDIAN_BIG_BYTE 0)
|
||||||
|
SET(MSGPACK_ENDIAN_LITTLE_BYTE 1)
|
||||||
|
ENDIF ()
|
||||||
|
|
||||||
|
CONFIGURE_FILE (
|
||||||
|
cmake/sysdep.h.in
|
||||||
|
include/msgpack/sysdep.h
|
||||||
|
@ONLY
|
||||||
|
)
|
||||||
|
|
||||||
|
CONFIGURE_FILE (
|
||||||
|
cmake/pack_template.h.in
|
||||||
|
include/msgpack/pack_template.h
|
||||||
|
@ONLY
|
||||||
|
)
|
||||||
|
|
||||||
|
IF (APPLE)
|
||||||
|
SET(CMAKE_MACOSX_RPATH ON)
|
||||||
|
SET(CMAKE_SKIP_BUILD_RPATH FALSE)
|
||||||
|
SET(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
|
||||||
|
SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
|
||||||
|
SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
|
||||||
|
LIST(FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES "${CMAKE_INSTALL_PREFIX}/lib" isSystemDir)
|
||||||
|
IF ("${isSystemDir}" STREQUAL "-1")
|
||||||
|
SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
|
||||||
|
ENDIF ()
|
||||||
|
ENDIF ()
|
||||||
|
|
||||||
|
IF (MSGPACK_32BIT)
|
||||||
|
IF ("${CMAKE_C_COMPILER_ID}" STREQUAL "GNU")
|
||||||
|
SET (CMAKE_C_FLAGS "-m32 ${CMAKE_C_FLAGS}")
|
||||||
|
SET (CMAKE_EXE_LINKER_FLAGS "-m32 ${CMAKE_EXE_LINKER_FLAGS}")
|
||||||
|
ELSEIF ("${CMAKE_C_COMPILER_ID}" STREQUAL "Clang")
|
||||||
|
SET (CMAKE_C_FLAGS "-m32 ${CMAKE_C_FLAGS}")
|
||||||
|
SET (CMAKE_EXE_LINKER_FLAGS "-m32 ${CMAKE_EXE_LINKER_FLAGS}")
|
||||||
|
ENDIF ()
|
||||||
|
ENDIF ()
|
||||||
|
|
||||||
|
OPTION (MSGPACK_BUILD_EXAMPLES "Build msgpack examples." ON)
|
||||||
|
|
||||||
|
IF (MSGPACK_CHAR_SIGN)
|
||||||
|
SET (CMAKE_C_FLAGS "-f${MSGPACK_CHAR_SIGN}-char ${CMAKE_C_FLAGS}")
|
||||||
|
ENDIF ()
|
||||||
|
|
||||||
|
FIND_PACKAGE (GTest)
|
||||||
|
FIND_PACKAGE (ZLIB)
|
||||||
|
FIND_PACKAGE (Threads)
|
||||||
|
IF (GTEST_FOUND AND ZLIB_FOUND AND THREADS_FOUND)
|
||||||
|
OPTION (MSGPACK_BUILD_TESTS "Build msgpack tests." ON)
|
||||||
|
OPTION (MSGPACK_GEN_COVERAGE "Enable running gcov to get a test coverage report." OFF)
|
||||||
|
ENDIF ()
|
||||||
|
|
||||||
|
IF (DEFINED BUILD_SHARED_LIBS)
|
||||||
|
IF (BUILD_SHARED_LIBS)
|
||||||
|
IF (DEFINED MSGPACK_ENABLE_SHARED AND NOT MSGPACK_ENABLE_SHARED)
|
||||||
|
MESSAGE(WARNING "MSGPACK_ENABLE_SHARED is overridden to ON by BUILD_SHARED_LIBS")
|
||||||
|
ENDIF ()
|
||||||
|
SET (MSGPACK_ENABLE_SHARED ON)
|
||||||
|
IF (DEFINED MSGPACK_ENABLE_STATIC AND MSGPACK_ENABLE_STATIC)
|
||||||
|
MESSAGE(WARNING "MSGPACK_ENABLE_STATIC is overridden to OFF by BUILD_SHARED_LIBS")
|
||||||
|
ENDIF ()
|
||||||
|
SET (MSGPACK_ENABLE_STATIC OFF)
|
||||||
|
ELSE ()
|
||||||
|
IF (DEFINED MSGPACK_ENABLE_SHARED AND MSGPACK_ENABLE_SHARED)
|
||||||
|
MESSAGE(WARNING "MSGPACK_ENABLE_SHARED is overridden to OFF by BUILD_SHARED_LIBS")
|
||||||
|
ENDIF ()
|
||||||
|
SET (MSGPACK_ENABLE_SHARED OFF)
|
||||||
|
IF (DEFINED MSGPACK_ENABLE_STATIC AND NOT MSGPACK_ENABLE_STATIC)
|
||||||
|
MESSAGE(WARNING "MSGPACK_ENABLE_STATIC is overridden to ON by BUILD_SHARED_LIBS")
|
||||||
|
ENDIF ()
|
||||||
|
SET (MSGPACK_ENABLE_STATIC ON)
|
||||||
|
ENDIF ()
|
||||||
|
ELSE ()
|
||||||
|
IF (NOT DEFINED MSGPACK_ENABLE_SHARED)
|
||||||
|
SET (MSGPACK_ENABLE_SHARED ON)
|
||||||
|
ENDIF ()
|
||||||
|
IF (NOT DEFINED MSGPACK_ENABLE_STATIC)
|
||||||
|
SET (MSGPACK_ENABLE_STATIC ON)
|
||||||
|
ENDIF ()
|
||||||
|
SET (BUILD_SHARED_LIBS ${MSGPACK_ENABLE_SHARED})
|
||||||
|
ENDIF ()
|
||||||
|
|
||||||
|
INCLUDE (Files.cmake)
|
||||||
|
|
||||||
|
CONFIGURE_FILE (
|
||||||
|
msgpack-c.pc.in
|
||||||
|
msgpack-c.pc
|
||||||
|
@ONLY
|
||||||
|
)
|
||||||
|
|
||||||
|
IF (MSGPACK_ENABLE_SHARED OR MSGPACK_ENABLE_STATIC)
|
||||||
|
ADD_LIBRARY (msgpack-c
|
||||||
|
${msgpack-c_SOURCES}
|
||||||
|
${msgpack-c_HEADERS}
|
||||||
|
)
|
||||||
|
|
||||||
|
SET_TARGET_PROPERTIES (msgpack-c PROPERTIES SOVERSION 2 VERSION 2.0.0)
|
||||||
|
|
||||||
|
TARGET_INCLUDE_DIRECTORIES (msgpack-c
|
||||||
|
PUBLIC
|
||||||
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
|
||||||
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>
|
||||||
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include/msgpack>
|
||||||
|
$<INSTALL_INTERFACE:include>
|
||||||
|
PRIVATE
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}
|
||||||
|
)
|
||||||
|
ENDIF ()
|
||||||
|
|
||||||
|
|
||||||
|
IF (MSGPACK_ENABLE_SHARED AND MSGPACK_ENABLE_STATIC)
|
||||||
|
ADD_LIBRARY (msgpack-c-static STATIC
|
||||||
|
${msgpack-c_SOURCES}
|
||||||
|
${msgpack-c_HEADERS}
|
||||||
|
)
|
||||||
|
|
||||||
|
TARGET_INCLUDE_DIRECTORIES (msgpack-c-static
|
||||||
|
PUBLIC
|
||||||
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
|
||||||
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>
|
||||||
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include/msgpack>
|
||||||
|
$<INSTALL_INTERFACE:include>
|
||||||
|
PRIVATE
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}
|
||||||
|
)
|
||||||
|
|
||||||
|
SET_TARGET_PROPERTIES (msgpack-c-static PROPERTIES OUTPUT_NAME "msgpack-c")
|
||||||
|
|
||||||
|
IF (MSGPACK_ENABLE_SHARED)
|
||||||
|
IF (MSVC)
|
||||||
|
SET_TARGET_PROPERTIES (msgpack-c PROPERTIES IMPORT_SUFFIX "_import.lib")
|
||||||
|
ELSEIF (MINGW)
|
||||||
|
SET_TARGET_PROPERTIES (msgpack-c PROPERTIES IMPORT_SUFFIX ".dll.a")
|
||||||
|
ENDIF ()
|
||||||
|
ENDIF ()
|
||||||
|
ENDIF ()
|
||||||
|
|
||||||
|
IF (MSGPACK_GEN_COVERAGE)
|
||||||
|
IF (NOT MSGPACK_BUILD_TESTS)
|
||||||
|
MESSAGE(FATAL_ERROR "Coverage requires -DMSGPACK_BUILD_TESTS=ON")
|
||||||
|
ENDIF ()
|
||||||
|
STRING(TOUPPER "${CMAKE_BUILD_TYPE}" UPPER_CMAKE_BUILD_TYPE)
|
||||||
|
IF (NOT "${UPPER_CMAKE_BUILD_TYPE}" STREQUAL "DEBUG")
|
||||||
|
MESSAGE(FATAL_ERROR "Coverage requires -DCMAKE_BUILD_TYPE=Debug")
|
||||||
|
ENDIF ()
|
||||||
|
|
||||||
|
INCLUDE(CodeCoverage)
|
||||||
|
SET (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${COVERAGE_FLAGS}")
|
||||||
|
|
||||||
|
SETUP_TARGET_FOR_COVERAGE(coverage make coverage test)
|
||||||
|
ENDIF ()
|
||||||
|
|
||||||
|
IF (MSGPACK_BUILD_TESTS)
|
||||||
|
ENABLE_TESTING ()
|
||||||
|
list(APPEND CMAKE_CTEST_ARGUMENTS "--output-on-failure")
|
||||||
|
# MEMORYCHECK_COMMAND_OPTIONS needs to place prior to CTEST_MEMORYCHECK_COMMAND
|
||||||
|
SET (MEMORYCHECK_COMMAND_OPTIONS "--leak-check=full --show-leak-kinds=definite,possible --error-exitcode=1")
|
||||||
|
FIND_PROGRAM(CTEST_MEMORYCHECK_COMMAND NAMES valgrind)
|
||||||
|
INCLUDE(Dart)
|
||||||
|
ADD_SUBDIRECTORY (test)
|
||||||
|
ENDIF ()
|
||||||
|
|
||||||
|
IF ("${CMAKE_C_COMPILER_ID}" STREQUAL "Clang" OR "${CMAKE_C_COMPILER_ID}" STREQUAL "GNU")
|
||||||
|
IF (MSGPACK_ENABLE_SHARED OR MSGPACK_ENABLE_STATIC)
|
||||||
|
SET_PROPERTY (TARGET msgpack-c APPEND_STRING PROPERTY COMPILE_FLAGS " -Wall -Wextra -DPIC")
|
||||||
|
ENDIF ()
|
||||||
|
IF (MSGPACK_ENABLE_SHARED AND MSGPACK_ENABLE_STATIC)
|
||||||
|
SET_PROPERTY (TARGET msgpack-c-static APPEND_STRING PROPERTY COMPILE_FLAGS " -Wall -Wextra" )
|
||||||
|
ENDIF ()
|
||||||
|
ENDIF ()
|
||||||
|
|
||||||
|
IF ("${CMAKE_C_COMPILER_ID}" STREQUAL "Clang")
|
||||||
|
IF (MSGPACK_ENABLE_SHARED OR MSGPACK_ENABLE_STATIC)
|
||||||
|
SET_PROPERTY (TARGET msgpack-c APPEND_STRING PROPERTY COMPILE_FLAGS " -Wno-mismatched-tags")
|
||||||
|
ENDIF ()
|
||||||
|
IF (MSGPACK_ENABLE_SHARED AND MSGPACK_ENABLE_STATIC)
|
||||||
|
SET_PROPERTY (TARGET msgpack-c-static APPEND_STRING PROPERTY COMPILE_FLAGS " -Wno-mismatched-tags")
|
||||||
|
ENDIF ()
|
||||||
|
ENDIF ()
|
||||||
|
|
||||||
|
IF ("${CMAKE_C_COMPILER_ID}" STREQUAL "MSVC")
|
||||||
|
IF (CMAKE_C_FLAGS MATCHES "/W[0-4]")
|
||||||
|
STRING(REGEX REPLACE "/W[0-4]" "/W3 /WX" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
|
||||||
|
ELSE ()
|
||||||
|
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W3 /WX")
|
||||||
|
ENDIF ()
|
||||||
|
ENDIF ()
|
||||||
|
|
||||||
|
IF ("${CMAKE_C_COMPILER_ID}" STREQUAL "MSVC")
|
||||||
|
IF (CMAKE_C_FLAGS MATCHES "/W[0-4]")
|
||||||
|
STRING(REGEX REPLACE "/W[0-4]" "/W3 /WX" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
|
||||||
|
ELSE ()
|
||||||
|
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W3 /WX")
|
||||||
|
ENDIF ()
|
||||||
|
ENDIF ()
|
||||||
|
|
||||||
|
IF ("${CMAKE_C_COMPILER_ID}" STREQUAL "MSVC90" OR "${CMAKE_C_COMPILER_ID}" STREQUAL "MSVC10")
|
||||||
|
SET_SOURCE_FILES_PROPERTIES(${msgpack-c_SOURCES} PROPERTIES LANGUAGE C)
|
||||||
|
ENDIF ()
|
||||||
|
|
||||||
|
IF ("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "sparc")
|
||||||
|
SET (CMAKE_C_FLAGS "-DMSGPACK_ZONE_ALIGN=8 ${CMAKE_C_FLAGS}")
|
||||||
|
ENDIF ()
|
||||||
|
|
||||||
|
IF (NOT DEFINED CMAKE_INSTALL_BINDIR)
|
||||||
|
SET(CMAKE_INSTALL_BINDIR bin)
|
||||||
|
ENDIF ()
|
||||||
|
|
||||||
|
IF (NOT DEFINED CMAKE_INSTALL_LIBDIR)
|
||||||
|
SET(CMAKE_INSTALL_LIBDIR lib)
|
||||||
|
ENDIF ()
|
||||||
|
|
||||||
|
IF (MSGPACK_BUILD_EXAMPLES)
|
||||||
|
ADD_SUBDIRECTORY (example)
|
||||||
|
ENDIF ()
|
||||||
|
|
||||||
|
IF (MSGPACK_ENABLE_SHARED OR MSGPACK_ENABLE_STATIC)
|
||||||
|
SET (MSGPACK_INSTALLTARGETS msgpack-c)
|
||||||
|
ENDIF ()
|
||||||
|
|
||||||
|
IF (MSGPACK_ENABLE_SHARED AND MSGPACK_ENABLE_STATIC)
|
||||||
|
LIST (APPEND MSGPACK_INSTALLTARGETS msgpack-c-static)
|
||||||
|
ENDIF ()
|
||||||
|
|
||||||
|
INSTALL (TARGETS ${MSGPACK_INSTALLTARGETS} EXPORT msgpack-c-targets
|
||||||
|
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
||||||
|
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||||
|
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||||
|
)
|
||||||
|
FOREACH (file ${msgpack-c_common_HEADERS})
|
||||||
|
GET_FILENAME_COMPONENT (dir ${file} PATH)
|
||||||
|
INSTALL (FILES ${file} DESTINATION ${CMAKE_INSTALL_PREFIX}/${dir})
|
||||||
|
ENDFOREACH ()
|
||||||
|
FOREACH (file ${msgpack-c_configured_HEADERS})
|
||||||
|
GET_FILENAME_COMPONENT (dir ${file} PATH)
|
||||||
|
INSTALL (FILES ${CMAKE_CURRENT_BINARY_DIR}/${file} DESTINATION ${CMAKE_INSTALL_PREFIX}/${dir})
|
||||||
|
ENDFOREACH ()
|
||||||
|
IF (NOT MSVC)
|
||||||
|
INSTALL (FILES ${CMAKE_CURRENT_BINARY_DIR}/msgpack-c.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
|
||||||
|
ENDIF ()
|
||||||
|
|
||||||
|
# Doxygen
|
||||||
|
FIND_PACKAGE (Doxygen)
|
||||||
|
IF (DOXYGEN_FOUND)
|
||||||
|
LIST (APPEND Doxyfile_c_CONTENT
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_c
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E echo "FILE_PATTERNS = *.h" >> ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_c
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E echo "OUTPUT_DIRECTORY = doc_c" >> ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_c
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E echo "INPUT = ${CMAKE_CURRENT_SOURCE_DIR}/include" >> ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_c
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E echo "EXTRACT_ALL = YES" >> ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_c
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E echo "PROJECT_NAME = \"MessagePack for C\"" >> ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_c
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E echo "STRIP_FROM_PATH = ${CMAKE_CURRENT_SOURCE_DIR}/include" >> ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_c
|
||||||
|
)
|
||||||
|
IF (DOXYGEN_DOT_FOUND)
|
||||||
|
LIST (APPEND Doxyfile_c_CONTENT
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E echo "HAVE_DOT = YES" >> ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_c
|
||||||
|
)
|
||||||
|
ENDIF ()
|
||||||
|
ADD_CUSTOM_TARGET (
|
||||||
|
doxygen
|
||||||
|
${Doxyfile_c_CONTENT}
|
||||||
|
COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_c
|
||||||
|
VERBATIM
|
||||||
|
)
|
||||||
|
ENDIF ()
|
||||||
|
|
||||||
|
INCLUDE (CMakePackageConfigHelpers)
|
||||||
|
|
||||||
|
SET (CMAKE_INSTALL_CMAKEDIR "${CMAKE_INSTALL_LIBDIR}/cmake/msgpack-c")
|
||||||
|
|
||||||
|
WRITE_BASIC_PACKAGE_VERSION_FILE (
|
||||||
|
msgpack-c-config-version.cmake
|
||||||
|
VERSION ${VERSION}
|
||||||
|
COMPATIBILITY SameMajorVersion
|
||||||
|
)
|
||||||
|
|
||||||
|
IF (NOT CMAKE_VERSION VERSION_LESS 3.0)
|
||||||
|
EXPORT (EXPORT msgpack-c-targets
|
||||||
|
FILE "${CMAKE_CURRENT_BINARY_DIR}/msgpack-c-targets.cmake"
|
||||||
|
)
|
||||||
|
ENDIF ()
|
||||||
|
|
||||||
|
CONFIGURE_PACKAGE_CONFIG_FILE (msgpack-c-config.cmake.in
|
||||||
|
msgpack-c-config.cmake
|
||||||
|
INSTALL_DESTINATION "${CMAKE_INSTALL_CMAKEDIR}"
|
||||||
|
)
|
||||||
|
|
||||||
|
INSTALL (EXPORT msgpack-c-targets
|
||||||
|
FILE
|
||||||
|
msgpack-c-targets.cmake
|
||||||
|
DESTINATION
|
||||||
|
"${CMAKE_INSTALL_CMAKEDIR}"
|
||||||
|
)
|
||||||
|
|
||||||
|
INSTALL (
|
||||||
|
FILES
|
||||||
|
"${CMAKE_CURRENT_BINARY_DIR}/msgpack-c-config.cmake"
|
||||||
|
"${CMAKE_CURRENT_BINARY_DIR}/msgpack-c-config-version.cmake"
|
||||||
|
DESTINATION
|
||||||
|
"${CMAKE_INSTALL_CMAKEDIR}"
|
||||||
|
)
|
||||||
17
COPYING
17
COPYING
@@ -1,14 +1,5 @@
|
|||||||
Copyright (C) 2008-2009 FURUHASHI Sadayuki
|
Copyright (C) 2008-2015 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.
|
|
||||||
|
|
||||||
|
Distributed under the Boost Software License, Version 1.0.
|
||||||
|
(See accompanying file LICENSE_1_0.txt or copy at
|
||||||
|
http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
|||||||
41
Files.cmake
Normal file
41
Files.cmake
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
# Source files
|
||||||
|
SET (msgpack-c_SOURCES
|
||||||
|
src/objectc.c
|
||||||
|
src/unpack.c
|
||||||
|
src/version.c
|
||||||
|
src/vrefbuffer.c
|
||||||
|
src/zone.c
|
||||||
|
)
|
||||||
|
|
||||||
|
# Header files
|
||||||
|
SET (msgpack-c_common_HEADERS
|
||||||
|
include/msgpack.h
|
||||||
|
include/msgpack/fbuffer.h
|
||||||
|
include/msgpack/gcc_atomic.h
|
||||||
|
include/msgpack/object.h
|
||||||
|
include/msgpack/pack.h
|
||||||
|
include/msgpack/pack_define.h
|
||||||
|
include/msgpack/sbuffer.h
|
||||||
|
include/msgpack/timestamp.h
|
||||||
|
include/msgpack/unpack.h
|
||||||
|
include/msgpack/unpack_define.h
|
||||||
|
include/msgpack/unpack_template.h
|
||||||
|
include/msgpack/util.h
|
||||||
|
include/msgpack/version.h
|
||||||
|
include/msgpack/version_master.h
|
||||||
|
include/msgpack/vrefbuffer.h
|
||||||
|
include/msgpack/zbuffer.h
|
||||||
|
include/msgpack/zone.h
|
||||||
|
)
|
||||||
|
|
||||||
|
# Header files will configured
|
||||||
|
SET (msgpack-c_configured_HEADERS
|
||||||
|
include/msgpack/pack_template.h
|
||||||
|
include/msgpack/sysdep.h
|
||||||
|
)
|
||||||
|
|
||||||
|
# All header files
|
||||||
|
LIST (APPEND msgpack-c_HEADERS
|
||||||
|
${msgpack-c_common_HEADERS}
|
||||||
|
${msgpack-c_configured_HEADERS}
|
||||||
|
)
|
||||||
202
LICENSE
202
LICENSE
@@ -1,202 +0,0 @@
|
|||||||
|
|
||||||
Apache License
|
|
||||||
Version 2.0, January 2004
|
|
||||||
http://www.apache.org/licenses/
|
|
||||||
|
|
||||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
|
||||||
|
|
||||||
1. Definitions.
|
|
||||||
|
|
||||||
"License" shall mean the terms and conditions for use, reproduction,
|
|
||||||
and distribution as defined by Sections 1 through 9 of this document.
|
|
||||||
|
|
||||||
"Licensor" shall mean the copyright owner or entity authorized by
|
|
||||||
the copyright owner that is granting the License.
|
|
||||||
|
|
||||||
"Legal Entity" shall mean the union of the acting entity and all
|
|
||||||
other entities that control, are controlled by, or are under common
|
|
||||||
control with that entity. For the purposes of this definition,
|
|
||||||
"control" means (i) the power, direct or indirect, to cause the
|
|
||||||
direction or management of such entity, whether by contract or
|
|
||||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
|
||||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
|
||||||
|
|
||||||
"You" (or "Your") shall mean an individual or Legal Entity
|
|
||||||
exercising permissions granted by this License.
|
|
||||||
|
|
||||||
"Source" form shall mean the preferred form for making modifications,
|
|
||||||
including but not limited to software source code, documentation
|
|
||||||
source, and configuration files.
|
|
||||||
|
|
||||||
"Object" form shall mean any form resulting from mechanical
|
|
||||||
transformation or translation of a Source form, including but
|
|
||||||
not limited to compiled object code, generated documentation,
|
|
||||||
and conversions to other media types.
|
|
||||||
|
|
||||||
"Work" shall mean the work of authorship, whether in Source or
|
|
||||||
Object form, made available under the License, as indicated by a
|
|
||||||
copyright notice that is included in or attached to the work
|
|
||||||
(an example is provided in the Appendix below).
|
|
||||||
|
|
||||||
"Derivative Works" shall mean any work, whether in Source or Object
|
|
||||||
form, that is based on (or derived from) the Work and for which the
|
|
||||||
editorial revisions, annotations, elaborations, or other modifications
|
|
||||||
represent, as a whole, an original work of authorship. For the purposes
|
|
||||||
of this License, Derivative Works shall not include works that remain
|
|
||||||
separable from, or merely link (or bind by name) to the interfaces of,
|
|
||||||
the Work and Derivative Works thereof.
|
|
||||||
|
|
||||||
"Contribution" shall mean any work of authorship, including
|
|
||||||
the original version of the Work and any modifications or additions
|
|
||||||
to that Work or Derivative Works thereof, that is intentionally
|
|
||||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
|
||||||
or by an individual or Legal Entity authorized to submit on behalf of
|
|
||||||
the copyright owner. For the purposes of this definition, "submitted"
|
|
||||||
means any form of electronic, verbal, or written communication sent
|
|
||||||
to the Licensor or its representatives, including but not limited to
|
|
||||||
communication on electronic mailing lists, source code control systems,
|
|
||||||
and issue tracking systems that are managed by, or on behalf of, the
|
|
||||||
Licensor for the purpose of discussing and improving the Work, but
|
|
||||||
excluding communication that is conspicuously marked or otherwise
|
|
||||||
designated in writing by the copyright owner as "Not a Contribution."
|
|
||||||
|
|
||||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
|
||||||
on behalf of whom a Contribution has been received by Licensor and
|
|
||||||
subsequently incorporated within the Work.
|
|
||||||
|
|
||||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
|
||||||
this License, each Contributor hereby grants to You a perpetual,
|
|
||||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
||||||
copyright license to reproduce, prepare Derivative Works of,
|
|
||||||
publicly display, publicly perform, sublicense, and distribute the
|
|
||||||
Work and such Derivative Works in Source or Object form.
|
|
||||||
|
|
||||||
3. Grant of Patent License. Subject to the terms and conditions of
|
|
||||||
this License, each Contributor hereby grants to You a perpetual,
|
|
||||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
||||||
(except as stated in this section) patent license to make, have made,
|
|
||||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
|
||||||
where such license applies only to those patent claims licensable
|
|
||||||
by such Contributor that are necessarily infringed by their
|
|
||||||
Contribution(s) alone or by combination of their Contribution(s)
|
|
||||||
with the Work to which such Contribution(s) was submitted. If You
|
|
||||||
institute patent litigation against any entity (including a
|
|
||||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
|
||||||
or a Contribution incorporated within the Work constitutes direct
|
|
||||||
or contributory patent infringement, then any patent licenses
|
|
||||||
granted to You under this License for that Work shall terminate
|
|
||||||
as of the date such litigation is filed.
|
|
||||||
|
|
||||||
4. Redistribution. You may reproduce and distribute copies of the
|
|
||||||
Work or Derivative Works thereof in any medium, with or without
|
|
||||||
modifications, and in Source or Object form, provided that You
|
|
||||||
meet the following conditions:
|
|
||||||
|
|
||||||
(a) You must give any other recipients of the Work or
|
|
||||||
Derivative Works a copy of this License; and
|
|
||||||
|
|
||||||
(b) You must cause any modified files to carry prominent notices
|
|
||||||
stating that You changed the files; and
|
|
||||||
|
|
||||||
(c) You must retain, in the Source form of any Derivative Works
|
|
||||||
that You distribute, all copyright, patent, trademark, and
|
|
||||||
attribution notices from the Source form of the Work,
|
|
||||||
excluding those notices that do not pertain to any part of
|
|
||||||
the Derivative Works; and
|
|
||||||
|
|
||||||
(d) If the Work includes a "NOTICE" text file as part of its
|
|
||||||
distribution, then any Derivative Works that You distribute must
|
|
||||||
include a readable copy of the attribution notices contained
|
|
||||||
within such NOTICE file, excluding those notices that do not
|
|
||||||
pertain to any part of the Derivative Works, in at least one
|
|
||||||
of the following places: within a NOTICE text file distributed
|
|
||||||
as part of the Derivative Works; within the Source form or
|
|
||||||
documentation, if provided along with the Derivative Works; or,
|
|
||||||
within a display generated by the Derivative Works, if and
|
|
||||||
wherever such third-party notices normally appear. The contents
|
|
||||||
of the NOTICE file are for informational purposes only and
|
|
||||||
do not modify the License. You may add Your own attribution
|
|
||||||
notices within Derivative Works that You distribute, alongside
|
|
||||||
or as an addendum to the NOTICE text from the Work, provided
|
|
||||||
that such additional attribution notices cannot be construed
|
|
||||||
as modifying the License.
|
|
||||||
|
|
||||||
You may add Your own copyright statement to Your modifications and
|
|
||||||
may provide additional or different license terms and conditions
|
|
||||||
for use, reproduction, or distribution of Your modifications, or
|
|
||||||
for any such Derivative Works as a whole, provided Your use,
|
|
||||||
reproduction, and distribution of the Work otherwise complies with
|
|
||||||
the conditions stated in this License.
|
|
||||||
|
|
||||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
|
||||||
any Contribution intentionally submitted for inclusion in the Work
|
|
||||||
by You to the Licensor shall be under the terms and conditions of
|
|
||||||
this License, without any additional terms or conditions.
|
|
||||||
Notwithstanding the above, nothing herein shall supersede or modify
|
|
||||||
the terms of any separate license agreement you may have executed
|
|
||||||
with Licensor regarding such Contributions.
|
|
||||||
|
|
||||||
6. Trademarks. This License does not grant permission to use the trade
|
|
||||||
names, trademarks, service marks, or product names of the Licensor,
|
|
||||||
except as required for reasonable and customary use in describing the
|
|
||||||
origin of the Work and reproducing the content of the NOTICE file.
|
|
||||||
|
|
||||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
|
||||||
agreed to in writing, Licensor provides the Work (and each
|
|
||||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
||||||
implied, including, without limitation, any warranties or conditions
|
|
||||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
|
||||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
|
||||||
appropriateness of using or redistributing the Work and assume any
|
|
||||||
risks associated with Your exercise of permissions under this License.
|
|
||||||
|
|
||||||
8. Limitation of Liability. In no event and under no legal theory,
|
|
||||||
whether in tort (including negligence), contract, or otherwise,
|
|
||||||
unless required by applicable law (such as deliberate and grossly
|
|
||||||
negligent acts) or agreed to in writing, shall any Contributor be
|
|
||||||
liable to You for damages, including any direct, indirect, special,
|
|
||||||
incidental, or consequential damages of any character arising as a
|
|
||||||
result of this License or out of the use or inability to use the
|
|
||||||
Work (including but not limited to damages for loss of goodwill,
|
|
||||||
work stoppage, computer failure or malfunction, or any and all
|
|
||||||
other commercial damages or losses), even if such Contributor
|
|
||||||
has been advised of the possibility of such damages.
|
|
||||||
|
|
||||||
9. Accepting Warranty or Additional Liability. While redistributing
|
|
||||||
the Work or Derivative Works thereof, You may choose to offer,
|
|
||||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
|
||||||
or other liability obligations and/or rights consistent with this
|
|
||||||
License. However, in accepting such obligations, You may act only
|
|
||||||
on Your own behalf and on Your sole responsibility, not on behalf
|
|
||||||
of any other Contributor, and only if You agree to indemnify,
|
|
||||||
defend, and hold each Contributor harmless for any liability
|
|
||||||
incurred by, or claims asserted against, such Contributor by reason
|
|
||||||
of your accepting any such warranty or additional liability.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
APPENDIX: How to apply the Apache License to your work.
|
|
||||||
|
|
||||||
To apply the Apache License to your work, attach the following
|
|
||||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
|
||||||
replaced with your own identifying information. (Don't include
|
|
||||||
the brackets!) The text should be enclosed in the appropriate
|
|
||||||
comment syntax for the file format. We also recommend that a
|
|
||||||
file or class name and description of purpose be included on the
|
|
||||||
same "printed page" as the copyright notice for easier
|
|
||||||
identification within third-party archives.
|
|
||||||
|
|
||||||
Copyright [yyyy] [name of copyright owner]
|
|
||||||
|
|
||||||
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.
|
|
||||||
23
LICENSE_1_0.txt
Normal file
23
LICENSE_1_0.txt
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
Boost Software License - Version 1.0 - August 17th, 2003
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person or organization
|
||||||
|
obtaining a copy of the software and accompanying documentation covered by
|
||||||
|
this license (the "Software") to use, reproduce, display, distribute,
|
||||||
|
execute, and transmit the Software, and to prepare derivative works of the
|
||||||
|
Software, and to permit third-parties to whom the Software is furnished to
|
||||||
|
do so, all subject to the following:
|
||||||
|
|
||||||
|
The copyright notices in the Software and this entire statement, including
|
||||||
|
the above license grant, this restriction and the following disclaimer,
|
||||||
|
must be included in all copies of the Software, in whole or in part, and
|
||||||
|
all derivative works of the Software, unless such copies or derivative
|
||||||
|
works are solely in the form of machine-executable object code generated by
|
||||||
|
a source language processor.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||||
|
SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||||
|
FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||||
|
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||||
|
DEALINGS IN THE SOFTWARE.
|
||||||
13
Makefile.am
13
Makefile.am
@@ -1,13 +0,0 @@
|
|||||||
if ENABLE_CXX
|
|
||||||
export ERB
|
|
||||||
SUBDIRS = c cpp
|
|
||||||
else
|
|
||||||
SUBDIRS = c
|
|
||||||
endif
|
|
||||||
|
|
||||||
nobase_include_HEADERS = \
|
|
||||||
msgpack/pack_define.h \
|
|
||||||
msgpack/pack_template.h \
|
|
||||||
msgpack/unpack_define.h \
|
|
||||||
msgpack/unpack_template.h
|
|
||||||
|
|
||||||
16
NOTICE
16
NOTICE
@@ -1,4 +1,14 @@
|
|||||||
MessagePack is developed by FURUHASHI Sadayuki, licensed under Apache License,
|
This product bundles Boost Predef and Boost Preprocessor.
|
||||||
Version 2.0. The original software and related information is available at
|
They are distributed under the Boost Software License, Version 1.0.
|
||||||
http://msgpack.sourceforge.jp/.
|
(See accompanying file LICENSE_1_0.txt or copy at
|
||||||
|
http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
|
||||||
|
For details, see the following files:
|
||||||
|
|
||||||
|
external/boost/predef
|
||||||
|
include/msgpack/predef.h
|
||||||
|
include/msgpack/predef/*
|
||||||
|
|
||||||
|
external/boost/preprocessor
|
||||||
|
include/msgpack/preprocessor.hpp
|
||||||
|
include/msgpack/preprocessor/*
|
||||||
|
|||||||
193
QUICKSTART-C.md
Normal file
193
QUICKSTART-C.md
Normal file
@@ -0,0 +1,193 @@
|
|||||||
|
# Implementation Status
|
||||||
|
|
||||||
|
The serialization library is production-ready.
|
||||||
|
|
||||||
|
Currently, RPC implementation is not available.
|
||||||
|
|
||||||
|
# Install
|
||||||
|
|
||||||
|
## Install with package manager
|
||||||
|
|
||||||
|
### MacOS with MacPorts
|
||||||
|
|
||||||
|
On MacOS, you can install MessagePack for C using MacPorts.
|
||||||
|
|
||||||
|
```
|
||||||
|
$ sudo port install msgpack
|
||||||
|
```
|
||||||
|
|
||||||
|
You might need to run `sudo port selfupdate` before installing to update the package repository.
|
||||||
|
|
||||||
|
You can also install via Homebrew.
|
||||||
|
|
||||||
|
```
|
||||||
|
$ brew install msgpack
|
||||||
|
```
|
||||||
|
|
||||||
|
### FreeBSD with Ports Collection
|
||||||
|
|
||||||
|
On FreeBSD, you can use Ports Collection. Install [net/msgpack](http://www.freebsd.org/cgi/cvsweb.cgi/ports/devel/msgpack/) package.
|
||||||
|
|
||||||
|
### Gentoo Linux with Portage
|
||||||
|
|
||||||
|
On Gentoo Linux, you can use emerge. Install [dev-libs/msgpack](http://gentoo-portage.com/dev-libs/msgpack) package.
|
||||||
|
|
||||||
|
### Windows with vcpkg
|
||||||
|
|
||||||
|
There are several package managers available, and vcpkg is typical.
|
||||||
|
|
||||||
|
```
|
||||||
|
$ vcpkg install msgpack:x64-windows
|
||||||
|
```
|
||||||
|
## Install with source code
|
||||||
|
|
||||||
|
### Build with cmake
|
||||||
|
|
||||||
|
You need to install cmake (2.8.12 or higher) first.
|
||||||
|
|
||||||
|
```
|
||||||
|
$ git clone https://github.com/msgpack/msgpack-c.git
|
||||||
|
$ cd msgpack-c
|
||||||
|
$ mkdir build
|
||||||
|
$ cd build
|
||||||
|
$ cmake ..
|
||||||
|
$ cmake --build .
|
||||||
|
$ cmake --build . --target install
|
||||||
|
```
|
||||||
|
### Build with autotools
|
||||||
|
|
||||||
|
In versions 1.4.2 and below, you can use `autotools` to build on UNIX-like platforms.
|
||||||
|
```
|
||||||
|
$ wget https://github.com/msgpack/msgpack-c/archive/cpp-1.3.0.tar.gz
|
||||||
|
$ tar zxvf msgpack-1.3.0.tar.gz
|
||||||
|
$ cd msgpack-1.3.0
|
||||||
|
$ ./bootstrap # If the 'configure' script already exists, you can omit this step.
|
||||||
|
$ ./configure
|
||||||
|
$ make
|
||||||
|
$ sudo make install
|
||||||
|
```
|
||||||
|
|
||||||
|
# Serialization QuickStart for C
|
||||||
|
|
||||||
|
## First program
|
||||||
|
|
||||||
|
Include `msgpack.h` header and link `msgpack` library to use MessagePack on your program.
|
||||||
|
|
||||||
|
```c
|
||||||
|
#include <msgpack.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
|
||||||
|
/* creates buffer and serializer instance. */
|
||||||
|
msgpack_sbuffer* buffer = msgpack_sbuffer_new();
|
||||||
|
msgpack_packer* pk = msgpack_packer_new(buffer, msgpack_sbuffer_write);
|
||||||
|
|
||||||
|
/* serializes ["Hello", "MessagePack"]. */
|
||||||
|
msgpack_pack_array(pk, 2);
|
||||||
|
msgpack_pack_bin(pk, 5);
|
||||||
|
msgpack_pack_bin_body(pk, "Hello", 5);
|
||||||
|
msgpack_pack_bin(pk, 11);
|
||||||
|
msgpack_pack_bin_body(pk, "MessagePack", 11);
|
||||||
|
|
||||||
|
/* deserializes it. */
|
||||||
|
msgpack_unpacked msg;
|
||||||
|
msgpack_unpacked_init(&msg);
|
||||||
|
msgpack_unpack_return ret = msgpack_unpack_next(&msg, buffer->data, buffer->size, NULL);
|
||||||
|
|
||||||
|
/* prints the deserialized object. */
|
||||||
|
msgpack_object obj = msg.data;
|
||||||
|
msgpack_object_print(stdout, obj); /*=> ["Hello", "MessagePack"] */
|
||||||
|
|
||||||
|
/* cleaning */
|
||||||
|
msgpack_unpacked_destroy(&msg);
|
||||||
|
msgpack_sbuffer_free(buffer);
|
||||||
|
msgpack_packer_free(pk);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Simple program with a loop
|
||||||
|
|
||||||
|
```c
|
||||||
|
#include <msgpack.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
|
||||||
|
/* creates buffer and serializer instance. */
|
||||||
|
msgpack_sbuffer* buffer = msgpack_sbuffer_new();
|
||||||
|
msgpack_packer* pk = msgpack_packer_new(buffer, msgpack_sbuffer_write);
|
||||||
|
|
||||||
|
int j;
|
||||||
|
|
||||||
|
for(j = 0; j<23; j++) {
|
||||||
|
/* NB: the buffer needs to be cleared on each iteration */
|
||||||
|
msgpack_sbuffer_clear(buffer);
|
||||||
|
|
||||||
|
/* serializes ["Hello", "MessagePack"]. */
|
||||||
|
msgpack_pack_array(pk, 3);
|
||||||
|
msgpack_pack_bin(pk, 5);
|
||||||
|
msgpack_pack_bin_body(pk, "Hello", 5);
|
||||||
|
msgpack_pack_bin(pk, 11);
|
||||||
|
msgpack_pack_bin_body(pk, "MessagePack", 11);
|
||||||
|
msgpack_pack_int(pk, j);
|
||||||
|
|
||||||
|
/* deserializes it. */
|
||||||
|
msgpack_unpacked msg;
|
||||||
|
msgpack_unpacked_init(&msg);
|
||||||
|
msgpack_unpack_return ret = msgpack_unpack_next(&msg, buffer->data, buffer->size, NULL);
|
||||||
|
|
||||||
|
/* prints the deserialized object. */
|
||||||
|
msgpack_object obj = msg.data;
|
||||||
|
msgpack_object_print(stdout, obj); /*=> ["Hello", "MessagePack"] */
|
||||||
|
msgpack_unpacked_destroy(&msg);
|
||||||
|
puts("");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* cleaning */
|
||||||
|
msgpack_sbuffer_free(buffer);
|
||||||
|
msgpack_packer_free(pk);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Streaming feature
|
||||||
|
|
||||||
|
```c
|
||||||
|
#include <msgpack.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
/* serializes multiple objects using msgpack_packer. */
|
||||||
|
msgpack_sbuffer* buffer = msgpack_sbuffer_new();
|
||||||
|
msgpack_packer* pk = msgpack_packer_new(buffer, msgpack_sbuffer_write);
|
||||||
|
msgpack_pack_int(pk, 1);
|
||||||
|
msgpack_pack_int(pk, 2);
|
||||||
|
msgpack_pack_int(pk, 3);
|
||||||
|
|
||||||
|
/* deserializes these objects using msgpack_unpacker. */
|
||||||
|
msgpack_unpacker pac;
|
||||||
|
msgpack_unpacker_init(&pac, MSGPACK_UNPACKER_INIT_BUFFER_SIZE);
|
||||||
|
|
||||||
|
/* feeds the buffer. */
|
||||||
|
msgpack_unpacker_reserve_buffer(&pac, buffer->size);
|
||||||
|
memcpy(msgpack_unpacker_buffer(&pac), buffer->data, buffer->size);
|
||||||
|
msgpack_unpacker_buffer_consumed(&pac, buffer->size);
|
||||||
|
|
||||||
|
/* now starts streaming deserialization. */
|
||||||
|
msgpack_unpacked result;
|
||||||
|
msgpack_unpacked_init(&result);
|
||||||
|
|
||||||
|
while(msgpack_unpacker_next(&pac, &result)) {
|
||||||
|
msgpack_object_print(stdout, result.data);
|
||||||
|
puts("");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* results:
|
||||||
|
* $ gcc stream.cc -lmsgpack-c -o stream
|
||||||
|
* $ ./stream
|
||||||
|
* 1
|
||||||
|
* 2
|
||||||
|
* 3
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
```
|
||||||
72
README
72
README
@@ -1,72 +0,0 @@
|
|||||||
MessagePack
|
|
||||||
-----------
|
|
||||||
Binary-based efficient data interchange format.
|
|
||||||
|
|
||||||
|
|
||||||
*Requirements
|
|
||||||
|
|
||||||
MessagePack is only tested on Linux and Mac OS X, but it may run on other
|
|
||||||
UNIX-like platforms.
|
|
||||||
|
|
||||||
Following programs are required to build:
|
|
||||||
- gcc >= 4.1 with C++ support
|
|
||||||
- ruby >= 1.8 (ruby is used as a preprocessor)
|
|
||||||
|
|
||||||
|
|
||||||
*Installation
|
|
||||||
|
|
||||||
Simply run ./configure && make && make install to install C and C++ binding.
|
|
||||||
|
|
||||||
$ ./configure
|
|
||||||
$ make
|
|
||||||
$ sudo make install
|
|
||||||
|
|
||||||
To install Ruby binding, run ./gengem.sh script on ruby/ directory and install
|
|
||||||
generated gem package.
|
|
||||||
|
|
||||||
$ cd ruby
|
|
||||||
$ ./gengem.sh
|
|
||||||
$ gem install gem/pkg/msgpack-*.gem
|
|
||||||
|
|
||||||
|
|
||||||
*Usage
|
|
||||||
|
|
||||||
C++:
|
|
||||||
include msgpack.hpp header and link libmsgpack library.
|
|
||||||
see example/simple.cc for example.
|
|
||||||
|
|
||||||
g++ simple.cc -lmsgpack
|
|
||||||
g++ stream.cc -lmsgpack -lpthread
|
|
||||||
|
|
||||||
|
|
||||||
C:
|
|
||||||
include msgpack.h header and link libmsgpackc library.
|
|
||||||
see example/simple.c for example.
|
|
||||||
|
|
||||||
gcc simple.c -lmsgpackc
|
|
||||||
|
|
||||||
|
|
||||||
Ruby:
|
|
||||||
require msgpack library.
|
|
||||||
see example/simple.rb for example.
|
|
||||||
|
|
||||||
ruby -rubygems simple.rb
|
|
||||||
|
|
||||||
|
|
||||||
API Document is available at http://msgpack.sourceforge.jp/.
|
|
||||||
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
139
README.md
Normal file
139
README.md
Normal file
@@ -0,0 +1,139 @@
|
|||||||
|
`msgpack` for C
|
||||||
|
===================
|
||||||
|
|
||||||
|
Version 6.0.0 [](https://github.com/msgpack/msgpack-c/actions) [](https://ci.appveyor.com/project/redboltz/msgpack-c/branch/c_master)
|
||||||
|
[](https://codecov.io/gh/msgpack/msgpack-c/branch/c_master)
|
||||||
|
|
||||||
|
It's like JSON but smaller and faster.
|
||||||
|
|
||||||
|
Overview
|
||||||
|
--------
|
||||||
|
|
||||||
|
[MessagePack](http://msgpack.org/) is an efficient binary serialization
|
||||||
|
format, which lets you exchange data among multiple languages like JSON,
|
||||||
|
except that it's faster and smaller. Small integers are encoded into a
|
||||||
|
single byte and short strings require only one extra byte in
|
||||||
|
addition to the strings themselves.
|
||||||
|
|
||||||
|
Example
|
||||||
|
-------
|
||||||
|
|
||||||
|
```c
|
||||||
|
#include <msgpack.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
/* msgpack::sbuffer is a simple buffer implementation. */
|
||||||
|
msgpack_sbuffer sbuf;
|
||||||
|
msgpack_sbuffer_init(&sbuf);
|
||||||
|
|
||||||
|
/* serialize values into the buffer using msgpack_sbuffer_write callback function. */
|
||||||
|
msgpack_packer pk;
|
||||||
|
msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
|
||||||
|
|
||||||
|
msgpack_pack_array(&pk, 3);
|
||||||
|
msgpack_pack_int(&pk, 1);
|
||||||
|
msgpack_pack_true(&pk);
|
||||||
|
msgpack_pack_str(&pk, 7);
|
||||||
|
msgpack_pack_str_body(&pk, "example", 7);
|
||||||
|
|
||||||
|
/* deserialize the buffer into msgpack_object instance. */
|
||||||
|
/* deserialized object is valid during the msgpack_zone instance alive. */
|
||||||
|
msgpack_zone mempool;
|
||||||
|
msgpack_zone_init(&mempool, 2048);
|
||||||
|
|
||||||
|
msgpack_object deserialized;
|
||||||
|
msgpack_unpack(sbuf.data, sbuf.size, NULL, &mempool, &deserialized);
|
||||||
|
|
||||||
|
/* print the deserialized object. */
|
||||||
|
msgpack_object_print(stdout, deserialized);
|
||||||
|
puts("");
|
||||||
|
|
||||||
|
msgpack_zone_destroy(&mempool);
|
||||||
|
msgpack_sbuffer_destroy(&sbuf);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
See [`QUICKSTART-C.md`](./QUICKSTART-C.md) for more details.
|
||||||
|
|
||||||
|
Usage
|
||||||
|
-----
|
||||||
|
|
||||||
|
### Building and Installing
|
||||||
|
|
||||||
|
#### Install from git repository
|
||||||
|
|
||||||
|
##### Using the Terminal (CLI)
|
||||||
|
|
||||||
|
You will need:
|
||||||
|
|
||||||
|
- `gcc >= 4.1.0`
|
||||||
|
- `cmake >= 2.8.0`
|
||||||
|
|
||||||
|
How to build:
|
||||||
|
|
||||||
|
$ git clone https://github.com/msgpack/msgpack-c.git
|
||||||
|
$ cd msgpack-c
|
||||||
|
$ git checkout c_master
|
||||||
|
$ cmake .
|
||||||
|
$ make
|
||||||
|
$ sudo make install
|
||||||
|
|
||||||
|
How to run tests:
|
||||||
|
|
||||||
|
In order to run tests you must have the [GoogleTest](https://github.com/google/googletest) framework installed. If you do not currently have it, install it and re-run `cmake`.
|
||||||
|
Then:
|
||||||
|
|
||||||
|
$ make test
|
||||||
|
|
||||||
|
When you use the C part of `msgpack-c`, you need to build and link the library. By default, both static/shared libraries are built. If you want to build only static library, set `BUILD_SHARED_LIBS=OFF` to cmake. If you want to build only shared library, set `BUILD_SHARED_LIBS=ON`.
|
||||||
|
|
||||||
|
#### GUI on Windows
|
||||||
|
|
||||||
|
Clone msgpack-c git repository.
|
||||||
|
|
||||||
|
$ git clone https://github.com/msgpack/msgpack-c.git
|
||||||
|
|
||||||
|
or using GUI git client.
|
||||||
|
|
||||||
|
e.g.) tortoise git https://code.google.com/p/tortoisegit/
|
||||||
|
|
||||||
|
1. Checkout to c_master branch
|
||||||
|
|
||||||
|
2. Launch [cmake GUI client](http://www.cmake.org/cmake/resources/software.html).
|
||||||
|
|
||||||
|
3. Set 'Where is the source code:' text box and 'Where to build
|
||||||
|
the binaries:' text box.
|
||||||
|
|
||||||
|
4. Click 'Configure' button.
|
||||||
|
|
||||||
|
5. Choose your Visual Studio version.
|
||||||
|
|
||||||
|
6. Click 'Generate' button.
|
||||||
|
|
||||||
|
7. Open the created msgpack.sln on Visual Studio.
|
||||||
|
|
||||||
|
8. Build all.
|
||||||
|
|
||||||
|
### Documentation
|
||||||
|
|
||||||
|
You can get additional information including the tutorial on the
|
||||||
|
[wiki](https://github.com/msgpack/msgpack-c/wiki).
|
||||||
|
|
||||||
|
Contributing
|
||||||
|
------------
|
||||||
|
|
||||||
|
`msgpack-c` is developed on GitHub at [msgpack/msgpack-c](https://github.com/msgpack/msgpack-c).
|
||||||
|
To report an issue or send a pull request, use the
|
||||||
|
[issue tracker](https://github.com/msgpack/msgpack-c/issues).
|
||||||
|
|
||||||
|
Here's the list of [great contributors](https://github.com/msgpack/msgpack-c/graphs/contributors).
|
||||||
|
|
||||||
|
License
|
||||||
|
-------
|
||||||
|
|
||||||
|
`msgpack-c` is licensed under the Boost Software License, Version 1.0. See
|
||||||
|
the [`LICENSE_1_0.txt`](./LICENSE_1_0.txt) file for details.
|
||||||
43
appveyor.yml
Normal file
43
appveyor.yml
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
version: 6.0.0.{build}
|
||||||
|
|
||||||
|
branches:
|
||||||
|
only:
|
||||||
|
- c_master
|
||||||
|
|
||||||
|
image:
|
||||||
|
- Visual Studio 2015
|
||||||
|
environment:
|
||||||
|
matrix:
|
||||||
|
- msvc: '"Visual Studio 10 2010"'
|
||||||
|
- msvc: '"Visual Studio 11 2012"'
|
||||||
|
- msvc: '"Visual Studio 12 2013"'
|
||||||
|
- msvc: '"Visual Studio 14 2015"'
|
||||||
|
build_script:
|
||||||
|
- appveyor DownloadFile https://github.com/google/googletest/archive/release-1.7.0.zip -FileName googletest-release-1.7.0.zip
|
||||||
|
- 7z x googletest-release-1.7.0.zip > NUL
|
||||||
|
- cd googletest-release-1.7.0
|
||||||
|
- md build
|
||||||
|
- cd build
|
||||||
|
- cmake -G %msvc% -DBUILD_SHARED_LIBS=ON -DCMAKE_CXX_FLAGS=/D_VARIADIC_MAX=10 ..
|
||||||
|
- cmake --build . --config Release
|
||||||
|
- cd ..
|
||||||
|
- cd ..
|
||||||
|
- appveyor DownloadFile http://zlib.net/zlib-1.2.13.tar.gz -FileName zlib-1.2.13.tar.gz
|
||||||
|
- 7z x zlib-1.2.13.tar.gz > NUL
|
||||||
|
- 7z x zlib-1.2.13.tar > NUL
|
||||||
|
- cd zlib-1.2.13
|
||||||
|
- md build
|
||||||
|
- cd build
|
||||||
|
- cmake -G %msvc% ..
|
||||||
|
- cmake --build . --config Release
|
||||||
|
- copy zconf.h ..
|
||||||
|
- cd ..
|
||||||
|
- cd ..
|
||||||
|
- md build
|
||||||
|
- cd build
|
||||||
|
- cmake -G %msvc% -DGTEST_LIBRARY=%APPVEYOR_BUILD_FOLDER%\googletest-release-1.7.0\build\Release\gtest.lib -DGTEST_MAIN_LIBRARY=%APPVEYOR_BUILD_FOLDER%\googletest-release-1.7.0\build\Release\gtest_main.lib -DGTEST_INCLUDE_DIR=%APPVEYOR_BUILD_FOLDER%\googletest-release-1.7.0\include -DZLIB_LIBRARY=%APPVEYOR_BUILD_FOLDER%\zlib-1.2.13\build\Release\zlib.lib -DZLIB_INCLUDE_DIR=%APPVEYOR_BUILD_FOLDER%\zlib-1.2.13 -DCMAKE_CXX_FLAGS='"/D_VARIADIC_MAX=10 /EHsc"' ..
|
||||||
|
- cmake --build . --config Release -v
|
||||||
|
|
||||||
|
test_script:
|
||||||
|
- set PATH=%PATH%;%APPVEYOR_BUILD_FOLDER%\googletest-release-1.7.0\build\Release;%APPVEYOR_BUILD_FOLDER%\zlib-1.2.13\build\Release;%APPVEYOR_BUILD_FOLDER%\build\release
|
||||||
|
- ctest -V
|
||||||
120
bootstrap
120
bootstrap
@@ -1,120 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
# vim:ts=4:sw=4
|
|
||||||
# Calls autotools to build configure script and Makefile.in.
|
|
||||||
# Generated automatically using bootstrapper 0.2.1
|
|
||||||
# http://bootstrapper.sourceforge.net/
|
|
||||||
#
|
|
||||||
# Copyright (C) 2002 Anthony Ventimiglia
|
|
||||||
#
|
|
||||||
# This bootstrap script is free software; you can redistribute
|
|
||||||
# it and/or modify it under the terms of the GNU General Public
|
|
||||||
# License as published by the Free Software Foundation; either
|
|
||||||
# version 2 of the License, or (at your option) any later version.
|
|
||||||
#
|
|
||||||
#
|
|
||||||
# Calls proper programs to create configure script and Makefile.in files.
|
|
||||||
# if run with the --clean option, bootstrap removes files it generates. To
|
|
||||||
# clean all autogenerated files (eg: for cvs imports) first run
|
|
||||||
# make distclean, then bootstrap --clean
|
|
||||||
# see bootstrapper(1) for more infor
|
|
||||||
|
|
||||||
|
|
||||||
if test x"$1" = x"--help"; then
|
|
||||||
echo "$0: automatic bootstrapping utility for GNU Autotools"
|
|
||||||
echo " cleans up old autogenerated files and runs autoconf,"
|
|
||||||
echo " automake and aclocal on local directory"
|
|
||||||
echo
|
|
||||||
echo " --clean clean up auto-generated files without"
|
|
||||||
echo " creating new scripts"
|
|
||||||
echo
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
#if [ -z "$NO_NEST" ];then
|
|
||||||
# cd c && ./bootstrap $@; cd ..
|
|
||||||
# cd cpp && ./bootstrap $@; cd ..
|
|
||||||
#fi
|
|
||||||
mkdir -p ac
|
|
||||||
|
|
||||||
|
|
||||||
ACLOCAL="aclocal"
|
|
||||||
ACLOCAL_FILES="aclocal.m4"
|
|
||||||
ALWAYS_CLEAN="config.status config.log config.cache libtool"
|
|
||||||
AUTOCONF="autoconf"
|
|
||||||
AUTOCONF_FILES="configure"
|
|
||||||
AUTOHEADER="autoheader"
|
|
||||||
AUTOHEADER_FILES=""
|
|
||||||
AUTOMAKE="automake --add-missing --copy"
|
|
||||||
AUTOMAKE_FILES="config.sub stamp-h.in ltmain.sh missing mkinstalldirs install-sh config.guess"
|
|
||||||
CONFIG_AUX_DIR="."
|
|
||||||
CONFIG_FILES="stamp-h ltconfig"
|
|
||||||
CONFIG_HEADER=""
|
|
||||||
if [ x`uname` = x"Darwin" ]; then
|
|
||||||
LIBTOOLIZE="glibtoolize --force --copy"
|
|
||||||
else
|
|
||||||
LIBTOOLIZE="libtoolize --force --copy"
|
|
||||||
fi
|
|
||||||
LIBTOOLIZE_FILES="config.sub ltmain.sh config.guess"
|
|
||||||
RM="rm"
|
|
||||||
SUBDIRS="[]"
|
|
||||||
|
|
||||||
|
|
||||||
# These are files created by configure, so we'll always clean them
|
|
||||||
for i in $ALWAYS_CLEAN; do
|
|
||||||
test -f $i && \
|
|
||||||
$RM $i
|
|
||||||
done
|
|
||||||
|
|
||||||
if test x"$1" = x"--clean"; then
|
|
||||||
#
|
|
||||||
#Clean Files left by previous bootstrap run
|
|
||||||
#
|
|
||||||
if test -n "$CONFIG_AUX_DIR";
|
|
||||||
then CONFIG_AUX_DIR="$CONFIG_AUX_DIR/"
|
|
||||||
fi
|
|
||||||
# Clean Libtoolize generated files
|
|
||||||
for cf in $LIBTOOLIZE_FILES; do
|
|
||||||
cf="$CONFIG_AUX_DIR$cf"
|
|
||||||
test -f $cf && \
|
|
||||||
$RM $cf
|
|
||||||
done
|
|
||||||
#aclocal.m4 created by aclocal
|
|
||||||
test -f $ACLOCAL_FILES && $RM $ACLOCAL_FILES
|
|
||||||
#Clean Autoheader Generated files
|
|
||||||
for cf in $AUTOHEADER_FILES; do
|
|
||||||
cf=$CONFIG_AUX_DIR$cf
|
|
||||||
test -f $cf && \
|
|
||||||
$RM $cf
|
|
||||||
done
|
|
||||||
# remove config header (Usaually config.h)
|
|
||||||
test -n "$CONFIG_HEADER" && test -f $CONFIG_HEADER && $RM $CONFIG_HEADER
|
|
||||||
#Clean Automake generated files
|
|
||||||
for cf in $AUTOMAKE_FILES; do
|
|
||||||
cf=$CONFIG_AUX_DIR$cf
|
|
||||||
test -f $cf && \
|
|
||||||
$RM $cf
|
|
||||||
done
|
|
||||||
for i in $SUBDIRS; do
|
|
||||||
test -f $i/Makefile.in && \
|
|
||||||
$RM $i/Makefile.in
|
|
||||||
done
|
|
||||||
#Autoconf generated files
|
|
||||||
for cf in $AUTOCONF_FILES; do
|
|
||||||
test -f $cf && \
|
|
||||||
$RM $cf
|
|
||||||
done
|
|
||||||
for cf in $CONFIG_FILES; do
|
|
||||||
cf="$CONFIG_AUX_DIR$cf"
|
|
||||||
test -f $cf && \
|
|
||||||
$RM $cf
|
|
||||||
done
|
|
||||||
else
|
|
||||||
$LIBTOOLIZE
|
|
||||||
$ACLOCAL
|
|
||||||
$AUTOHEADER
|
|
||||||
$AUTOMAKE
|
|
||||||
$AUTOCONF
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
lib_LTLIBRARIES = libmsgpackc.la
|
|
||||||
|
|
||||||
libmsgpackc_la_SOURCES = \
|
|
||||||
unpack.c \
|
|
||||||
object.c \
|
|
||||||
vrefbuffer.c \
|
|
||||||
zone.c
|
|
||||||
|
|
||||||
nobase_include_HEADERS = \
|
|
||||||
msgpack.h \
|
|
||||||
msgpack/sbuffer.h \
|
|
||||||
msgpack/vrefbuffer.h \
|
|
||||||
msgpack/pack.h \
|
|
||||||
msgpack/unpack.h \
|
|
||||||
msgpack/object.h \
|
|
||||||
msgpack/zone.h
|
|
||||||
|
|
||||||
# -version-info CURRENT:REVISION:AGE
|
|
||||||
libmsgpackc_la_LDFLAGS = -version-info 1:0:0
|
|
||||||
|
|
||||||
323
c/bench.c
323
c/bench.c
@@ -1,323 +0,0 @@
|
|||||||
#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <sys/time.h>
|
|
||||||
|
|
||||||
#include <msgpack/pack.h>
|
|
||||||
#include <msgpack/unpack.h>
|
|
||||||
#include <yajl/yajl_parse.h>
|
|
||||||
#include <yajl/yajl_gen.h>
|
|
||||||
|
|
||||||
|
|
||||||
static struct timeval g_timer;
|
|
||||||
|
|
||||||
void reset_timer()
|
|
||||||
{
|
|
||||||
gettimeofday(&g_timer, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
void show_timer(size_t bufsz)
|
|
||||||
{
|
|
||||||
struct timeval endtime;
|
|
||||||
gettimeofday(&endtime, NULL);
|
|
||||||
double sec = (endtime.tv_sec - g_timer.tv_sec)
|
|
||||||
+ (double)(endtime.tv_usec - g_timer.tv_usec) / 1000 / 1000;
|
|
||||||
printf("%f sec\n", sec);
|
|
||||||
printf("%f MB\n", ((double)bufsz)/1024/1024);
|
|
||||||
printf("%f Mbps\n", ((double)bufsz)*8/sec/1000/1000);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static int reformat_null(void * ctx) { return 1; }
|
|
||||||
static int reformat_boolean(void * ctx, int boolean) { return 1; }
|
|
||||||
static int reformat_number(void * ctx, const char * s, unsigned int l) { return 1; }
|
|
||||||
static int reformat_string(void * ctx, const unsigned char * stringVal, unsigned int stringLen) { return 1; }
|
|
||||||
static int reformat_map_key(void * ctx, const unsigned char * stringVal, unsigned int stringLen) { return 1; }
|
|
||||||
static int reformat_start_map(void * ctx) { return 1; }
|
|
||||||
static int reformat_end_map(void * ctx) { return 1; }
|
|
||||||
static int reformat_start_array(void * ctx) { return 1; }
|
|
||||||
static int reformat_end_array(void * ctx) { return 1; }
|
|
||||||
|
|
||||||
|
|
||||||
static void* unpack_uint8(void* data, uint8_t d) { return NULL; }
|
|
||||||
static void* unpack_uint16(void* data, uint16_t d) { return NULL; }
|
|
||||||
static void* unpack_uint32(void* data, uint32_t d) { return NULL; }
|
|
||||||
static void* unpack_uint64(void* data, uint64_t d) { return NULL; }
|
|
||||||
static void* unpack_int8(void* data, int8_t d) { return NULL; }
|
|
||||||
static void* unpack_int16(void* data, int16_t d) { return NULL; }
|
|
||||||
static void* unpack_int32(void* data, int32_t d) { return NULL; }
|
|
||||||
static void* unpack_int64(void* data, int64_t d) { return NULL; }
|
|
||||||
static void* unpack_float(void* data, float d) { return NULL; }
|
|
||||||
static void* unpack_double(void* data, double d) { return NULL; }
|
|
||||||
static void* unpack_nil(void* data) { return NULL; }
|
|
||||||
static void* unpack_true(void* data) { return NULL; }
|
|
||||||
static void* unpack_false(void* data) { return NULL; }
|
|
||||||
static void* unpack_array(void* data, unsigned int n) { return NULL; }
|
|
||||||
static void unpack_array_item(void* data, void* c, void* o) { }
|
|
||||||
static void* unpack_map(void* data, unsigned int n) { return NULL; }
|
|
||||||
static void unpack_map_item(void* data, void* c, void* k, void* v) { }
|
|
||||||
static void* unpack_raw(void* data, const char* b, const char* p, unsigned int l) { /*printf("unpack raw %p %lu\n",p,l);*/ return NULL; }
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
size_t allocated;
|
|
||||||
size_t length;
|
|
||||||
char* buffer;
|
|
||||||
} pack_buffer;
|
|
||||||
|
|
||||||
static const size_t PACK_INITIAL_BUFFER_SIZE = 32*1024;
|
|
||||||
|
|
||||||
static void pack_buffer_init(pack_buffer* data)
|
|
||||||
{
|
|
||||||
data->buffer = malloc(PACK_INITIAL_BUFFER_SIZE);
|
|
||||||
data->length = 0;
|
|
||||||
data->allocated = PACK_INITIAL_BUFFER_SIZE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void pack_buffer_reset(pack_buffer* data)
|
|
||||||
{
|
|
||||||
data->buffer = realloc(data->buffer, PACK_INITIAL_BUFFER_SIZE);
|
|
||||||
data->allocated = PACK_INITIAL_BUFFER_SIZE;
|
|
||||||
data->length = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void pack_buffer_free(pack_buffer* data)
|
|
||||||
{
|
|
||||||
free(data->buffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void pack_append_buffer(void* user, const char* b, unsigned int l)
|
|
||||||
{
|
|
||||||
pack_buffer* data = (pack_buffer*)user;
|
|
||||||
if(data->allocated - data->length < l) {
|
|
||||||
data->buffer = realloc(data->buffer, data->allocated*2);
|
|
||||||
data->allocated *= 2;
|
|
||||||
}
|
|
||||||
memcpy(data->buffer + data->length, b, l);
|
|
||||||
data->length += l;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static const unsigned int TASK_INT_NUM = 1<<24;
|
|
||||||
static const unsigned int TASK_STR_LEN = 1<<15;
|
|
||||||
//static const unsigned int TASK_INT_NUM = 1<<20;
|
|
||||||
//static const unsigned int TASK_STR_LEN = 1<<12;
|
|
||||||
static const char* TASK_STR_PTR;
|
|
||||||
|
|
||||||
|
|
||||||
void bench_json(void)
|
|
||||||
{
|
|
||||||
puts("== JSON ==");
|
|
||||||
|
|
||||||
|
|
||||||
yajl_gen_config gcfg = {0, NULL};
|
|
||||||
yajl_gen g = yajl_gen_alloc(&gcfg);
|
|
||||||
|
|
||||||
yajl_parser_config hcfg = { 0, 0 };
|
|
||||||
yajl_callbacks callbacks = {
|
|
||||||
reformat_null,
|
|
||||||
reformat_boolean,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
reformat_number,
|
|
||||||
reformat_string,
|
|
||||||
reformat_start_map,
|
|
||||||
reformat_map_key,
|
|
||||||
reformat_end_map,
|
|
||||||
reformat_start_array,
|
|
||||||
reformat_end_array
|
|
||||||
};
|
|
||||||
yajl_handle h = yajl_alloc(&callbacks, &hcfg, NULL);
|
|
||||||
|
|
||||||
|
|
||||||
const unsigned char * buf;
|
|
||||||
unsigned int len;
|
|
||||||
|
|
||||||
|
|
||||||
puts("generate integer");
|
|
||||||
reset_timer();
|
|
||||||
{
|
|
||||||
unsigned int i;
|
|
||||||
yajl_gen_array_open(g);
|
|
||||||
for(i=0; i < TASK_INT_NUM; ++i) {
|
|
||||||
yajl_gen_integer(g, i);
|
|
||||||
}
|
|
||||||
yajl_gen_array_close(g);
|
|
||||||
}
|
|
||||||
show_timer(len);
|
|
||||||
|
|
||||||
yajl_gen_get_buf(g, &buf, &len);
|
|
||||||
|
|
||||||
puts("----");
|
|
||||||
puts("parse integer");
|
|
||||||
reset_timer();
|
|
||||||
{
|
|
||||||
yajl_status stat = yajl_parse(h, buf, len);
|
|
||||||
if (stat != yajl_status_ok && stat != yajl_status_insufficient_data) {
|
|
||||||
unsigned char * str = yajl_get_error(h, 1, buf, len);
|
|
||||||
fprintf(stderr, (const char *) str);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
show_timer(len);
|
|
||||||
|
|
||||||
|
|
||||||
//yajl_gen_clear(g);
|
|
||||||
yajl_gen_free(g);
|
|
||||||
g = yajl_gen_alloc(&gcfg);
|
|
||||||
yajl_free(h);
|
|
||||||
h = yajl_alloc(&callbacks, &hcfg, NULL);
|
|
||||||
|
|
||||||
|
|
||||||
puts("----");
|
|
||||||
puts("generate string");
|
|
||||||
reset_timer();
|
|
||||||
{
|
|
||||||
unsigned int i;
|
|
||||||
yajl_gen_array_open(g);
|
|
||||||
for(i=0; i < TASK_STR_LEN; ++i) {
|
|
||||||
yajl_gen_string(g, (const unsigned char*)TASK_STR_PTR, i);
|
|
||||||
}
|
|
||||||
yajl_gen_array_close(g);
|
|
||||||
}
|
|
||||||
show_timer(len);
|
|
||||||
|
|
||||||
yajl_gen_get_buf(g, &buf, &len);
|
|
||||||
|
|
||||||
puts("----");
|
|
||||||
puts("parse string");
|
|
||||||
reset_timer();
|
|
||||||
{
|
|
||||||
yajl_status stat = yajl_parse(h, buf, len);
|
|
||||||
if (stat != yajl_status_ok && stat != yajl_status_insufficient_data) {
|
|
||||||
unsigned char * str = yajl_get_error(h, 1, buf, len);
|
|
||||||
fprintf(stderr, (const char *) str);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
show_timer(len);
|
|
||||||
|
|
||||||
|
|
||||||
yajl_gen_free(g);
|
|
||||||
yajl_free(h);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void bench_msgpack(void)
|
|
||||||
{
|
|
||||||
puts("== MessagePack ==");
|
|
||||||
|
|
||||||
|
|
||||||
pack_buffer mpkbuf;
|
|
||||||
pack_buffer_init(&mpkbuf);
|
|
||||||
|
|
||||||
msgpack_pack_t* mpk = msgpack_pack_new(
|
|
||||||
&mpkbuf, pack_append_buffer);
|
|
||||||
|
|
||||||
msgpack_unpack_callback cb = {
|
|
||||||
unpack_uint8,
|
|
||||||
unpack_uint16,
|
|
||||||
unpack_uint32,
|
|
||||||
unpack_uint64,
|
|
||||||
unpack_int8,
|
|
||||||
unpack_int16,
|
|
||||||
unpack_int32,
|
|
||||||
unpack_int64,
|
|
||||||
unpack_float,
|
|
||||||
unpack_double,
|
|
||||||
unpack_nil,
|
|
||||||
unpack_true,
|
|
||||||
unpack_false,
|
|
||||||
unpack_array,
|
|
||||||
unpack_array_item,
|
|
||||||
unpack_map,
|
|
||||||
unpack_map_item,
|
|
||||||
unpack_raw,
|
|
||||||
};
|
|
||||||
msgpack_unpack_t* mupk = msgpack_unpack_new(NULL, &cb);
|
|
||||||
|
|
||||||
|
|
||||||
size_t len;
|
|
||||||
const char* buf;
|
|
||||||
|
|
||||||
|
|
||||||
puts("pack integer");
|
|
||||||
reset_timer();
|
|
||||||
{
|
|
||||||
unsigned int i;
|
|
||||||
msgpack_pack_array(mpk, TASK_INT_NUM);
|
|
||||||
for(i=0; i < TASK_INT_NUM; ++i) {
|
|
||||||
msgpack_pack_unsigned_int(mpk, i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
show_timer(mpkbuf.length);
|
|
||||||
|
|
||||||
len = mpkbuf.length;
|
|
||||||
buf = mpkbuf.buffer;
|
|
||||||
|
|
||||||
puts("----");
|
|
||||||
puts("unpack integer");
|
|
||||||
reset_timer();
|
|
||||||
{
|
|
||||||
size_t off = 0;
|
|
||||||
int ret = msgpack_unpack_execute(mupk, buf, len, &off);
|
|
||||||
if(ret < 0) {
|
|
||||||
fprintf(stderr, "Parse error.\n");
|
|
||||||
} else if(ret == 0) {
|
|
||||||
fprintf(stderr, "Not finished.\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
show_timer(mpkbuf.length);
|
|
||||||
|
|
||||||
|
|
||||||
pack_buffer_reset(&mpkbuf);
|
|
||||||
msgpack_unpack_reset(mupk);
|
|
||||||
|
|
||||||
|
|
||||||
puts("----");
|
|
||||||
puts("pack string");
|
|
||||||
reset_timer();
|
|
||||||
{
|
|
||||||
unsigned int i;
|
|
||||||
msgpack_pack_array(mpk, TASK_STR_LEN);
|
|
||||||
for(i=0; i < TASK_STR_LEN; ++i) {
|
|
||||||
msgpack_pack_raw(mpk, i);
|
|
||||||
msgpack_pack_raw_body(mpk, TASK_STR_PTR, i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
show_timer(mpkbuf.length);
|
|
||||||
|
|
||||||
len = mpkbuf.length;
|
|
||||||
buf = mpkbuf.buffer;
|
|
||||||
|
|
||||||
puts("----");
|
|
||||||
puts("unpack string");
|
|
||||||
reset_timer();
|
|
||||||
{
|
|
||||||
size_t off = 0;
|
|
||||||
int ret = msgpack_unpack_execute(mupk, buf, len, &off);
|
|
||||||
if(ret < 0) {
|
|
||||||
fprintf(stderr, "Parse error.\n");
|
|
||||||
} else if(ret == 0) {
|
|
||||||
fprintf(stderr, "Not finished.\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
show_timer(mpkbuf.length);
|
|
||||||
|
|
||||||
|
|
||||||
msgpack_unpack_free(mupk);
|
|
||||||
msgpack_pack_free(mpk);
|
|
||||||
pack_buffer_free(&mpkbuf);
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char* argv[])
|
|
||||||
{
|
|
||||||
char* str = malloc(TASK_STR_LEN);
|
|
||||||
memset(str, 'a', TASK_STR_LEN);
|
|
||||||
TASK_STR_PTR = str;
|
|
||||||
|
|
||||||
bench_msgpack();
|
|
||||||
bench_json();
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
|
|
||||||
CFLAGS += -Wall -g -I. -I.. -O4
|
|
||||||
LDFLAGS += -lyajl
|
|
||||||
|
|
||||||
all: bench
|
|
||||||
|
|
||||||
bench: bench.o pack.o unpack.o pack.h unpack.h
|
|
||||||
$(CC) bench.o pack.o unpack.o $(CFLAGS) $(LDFLAGS) -o $@
|
|
||||||
|
|
||||||
23
c/msgpack.h
23
c/msgpack.h
@@ -1,23 +0,0 @@
|
|||||||
/*
|
|
||||||
* MessagePack for C
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
#include "msgpack/object.h"
|
|
||||||
#include "msgpack/zone.h"
|
|
||||||
#include "msgpack/pack.h"
|
|
||||||
#include "msgpack/unpack.h"
|
|
||||||
#include "msgpack/sbuffer.h"
|
|
||||||
#include "msgpack/vrefbuffer.h"
|
|
||||||
161
c/object.c
161
c/object.c
@@ -1,161 +0,0 @@
|
|||||||
/*
|
|
||||||
* MessagePack for C dynamic typing routine
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
#include "msgpack/object.h"
|
|
||||||
#include "msgpack/pack.h"
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <inttypes.h>
|
|
||||||
|
|
||||||
|
|
||||||
int msgpack_pack_object(msgpack_packer* pk, msgpack_object d)
|
|
||||||
{
|
|
||||||
switch(d.type) {
|
|
||||||
case MSGPACK_OBJECT_NIL:
|
|
||||||
return msgpack_pack_nil(pk);
|
|
||||||
|
|
||||||
case MSGPACK_OBJECT_BOOLEAN:
|
|
||||||
if(d.via.boolean) {
|
|
||||||
return msgpack_pack_true(pk);
|
|
||||||
} else {
|
|
||||||
return msgpack_pack_false(pk);
|
|
||||||
}
|
|
||||||
|
|
||||||
case MSGPACK_OBJECT_POSITIVE_INTEGER:
|
|
||||||
return msgpack_pack_uint64(pk, d.via.u64);
|
|
||||||
|
|
||||||
case MSGPACK_OBJECT_NEGATIVE_INTEGER:
|
|
||||||
return msgpack_pack_int64(pk, d.via.i64);
|
|
||||||
|
|
||||||
case MSGPACK_OBJECT_DOUBLE:
|
|
||||||
return msgpack_pack_double(pk, d.via.dec);
|
|
||||||
|
|
||||||
case MSGPACK_OBJECT_RAW:
|
|
||||||
{
|
|
||||||
int ret = msgpack_pack_raw(pk, d.via.raw.size);
|
|
||||||
if(ret < 0) { return ret; }
|
|
||||||
return msgpack_pack_raw_body(pk, d.via.raw.ptr, d.via.raw.size);
|
|
||||||
}
|
|
||||||
|
|
||||||
case MSGPACK_OBJECT_ARRAY:
|
|
||||||
{
|
|
||||||
int ret = msgpack_pack_array(pk, d.via.array.size);
|
|
||||||
if(ret < 0) { return ret; }
|
|
||||||
|
|
||||||
msgpack_object* o = d.via.array.ptr;
|
|
||||||
msgpack_object* const oend = d.via.array.ptr + d.via.array.size;
|
|
||||||
for(; o != oend; ++o) {
|
|
||||||
ret = msgpack_pack_object(pk, *o);
|
|
||||||
if(ret < 0) { return ret; }
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
case MSGPACK_OBJECT_MAP:
|
|
||||||
{
|
|
||||||
int ret = msgpack_pack_map(pk, d.via.map.size);
|
|
||||||
if(ret < 0) { return ret; }
|
|
||||||
|
|
||||||
msgpack_object_kv* kv = d.via.map.ptr;
|
|
||||||
msgpack_object_kv* const kvend = d.via.map.ptr + d.via.map.size;
|
|
||||||
for(; kv != kvend; ++kv) {
|
|
||||||
ret = msgpack_pack_object(pk, kv->key);
|
|
||||||
if(ret < 0) { return ret; }
|
|
||||||
ret = msgpack_pack_object(pk, kv->val);
|
|
||||||
if(ret < 0) { return ret; }
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void msgpack_object_print(FILE* out, msgpack_object o)
|
|
||||||
{
|
|
||||||
switch(o.type) {
|
|
||||||
case MSGPACK_OBJECT_NIL:
|
|
||||||
fprintf(out, "nil");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case MSGPACK_OBJECT_BOOLEAN:
|
|
||||||
fprintf(out, (o.via.boolean ? "true" : "false"));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case MSGPACK_OBJECT_POSITIVE_INTEGER:
|
|
||||||
fprintf(out, "%"PRIu64, o.via.u64);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case MSGPACK_OBJECT_NEGATIVE_INTEGER:
|
|
||||||
fprintf(out, "%"PRIi64, o.via.i64);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case MSGPACK_OBJECT_DOUBLE:
|
|
||||||
fprintf(out, "%f", o.via.dec);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case MSGPACK_OBJECT_RAW:
|
|
||||||
fprintf(out, "\"");
|
|
||||||
fwrite(o.via.raw.ptr, o.via.raw.size, 1, out);
|
|
||||||
fprintf(out, "\"");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case MSGPACK_OBJECT_ARRAY:
|
|
||||||
fprintf(out, "[");
|
|
||||||
if(o.via.array.size != 0) {
|
|
||||||
msgpack_object* p = o.via.array.ptr;
|
|
||||||
msgpack_object_print(out, *p);
|
|
||||||
++p;
|
|
||||||
msgpack_object* const pend = o.via.array.ptr + o.via.array.size;
|
|
||||||
for(; p < pend; ++p) {
|
|
||||||
fprintf(out, ", ");
|
|
||||||
msgpack_object_print(out, *p);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fprintf(out, "]");
|
|
||||||
break;
|
|
||||||
// FIXME loop optimiziation
|
|
||||||
|
|
||||||
case MSGPACK_OBJECT_MAP:
|
|
||||||
fprintf(out, "{");
|
|
||||||
if(o.via.map.size != 0) {
|
|
||||||
msgpack_object_kv* p = o.via.map.ptr;
|
|
||||||
msgpack_object_print(out, p->key);
|
|
||||||
fprintf(out, "=>");
|
|
||||||
msgpack_object_print(out, p->val);
|
|
||||||
++p;
|
|
||||||
msgpack_object_kv* const pend = o.via.map.ptr + o.via.map.size;
|
|
||||||
for(; p < pend; ++p) {
|
|
||||||
fprintf(out, ", ");
|
|
||||||
msgpack_object_print(out, p->key);
|
|
||||||
fprintf(out, "=>");
|
|
||||||
msgpack_object_print(out, p->val);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fprintf(out, "}");
|
|
||||||
break;
|
|
||||||
// FIXME loop optimiziation
|
|
||||||
|
|
||||||
default:
|
|
||||||
// FIXME
|
|
||||||
fprintf(out, "#<UNKNOWN %hu %"PRIu64">", o.type, o.via.u64);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
91
c/object.h
91
c/object.h
@@ -1,91 +0,0 @@
|
|||||||
/*
|
|
||||||
* MessagePack for C dynamic typing routine
|
|
||||||
*
|
|
||||||
* 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_OBJECT_H__
|
|
||||||
#define MSGPACK_OBJECT_H__
|
|
||||||
|
|
||||||
#include "msgpack/zone.h"
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stddef.h>
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
MSGPACK_OBJECT_NIL = 0x01,
|
|
||||||
MSGPACK_OBJECT_BOOLEAN = 0x02,
|
|
||||||
MSGPACK_OBJECT_POSITIVE_INTEGER = 0x03,
|
|
||||||
MSGPACK_OBJECT_NEGATIVE_INTEGER = 0x04,
|
|
||||||
MSGPACK_OBJECT_DOUBLE = 0x05,
|
|
||||||
MSGPACK_OBJECT_RAW = 0x06,
|
|
||||||
MSGPACK_OBJECT_ARRAY = 0x07,
|
|
||||||
MSGPACK_OBJECT_MAP = 0x08,
|
|
||||||
} msgpack_object_type;
|
|
||||||
|
|
||||||
|
|
||||||
struct msgpack_object;
|
|
||||||
struct msgpack_object_kv;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
uint32_t size;
|
|
||||||
struct msgpack_object* ptr;
|
|
||||||
} msgpack_object_array;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
uint32_t size;
|
|
||||||
struct msgpack_object_kv* ptr;
|
|
||||||
} msgpack_object_map;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
uint32_t size;
|
|
||||||
const char* ptr;
|
|
||||||
} msgpack_object_raw;
|
|
||||||
|
|
||||||
typedef union {
|
|
||||||
bool boolean;
|
|
||||||
uint64_t u64;
|
|
||||||
int64_t i64;
|
|
||||||
double dec;
|
|
||||||
msgpack_object_array array;
|
|
||||||
msgpack_object_map map;
|
|
||||||
msgpack_object_raw raw;
|
|
||||||
} msgpack_object_union;
|
|
||||||
|
|
||||||
typedef struct msgpack_object {
|
|
||||||
msgpack_object_type type;
|
|
||||||
msgpack_object_union via;
|
|
||||||
} msgpack_object;
|
|
||||||
|
|
||||||
typedef struct msgpack_object_kv {
|
|
||||||
msgpack_object key;
|
|
||||||
msgpack_object val;
|
|
||||||
} msgpack_object_kv;
|
|
||||||
|
|
||||||
|
|
||||||
void msgpack_object_print(FILE* out, msgpack_object o);
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* msgpack/object.h */
|
|
||||||
|
|
||||||
118
c/pack.h
118
c/pack.h
@@ -1,118 +0,0 @@
|
|||||||
/*
|
|
||||||
* MessagePack for C packing routine
|
|
||||||
*
|
|
||||||
* 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_H__
|
|
||||||
#define MSGPACK_PACK_H__
|
|
||||||
|
|
||||||
#include <stddef.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include "msgpack/pack_define.h"
|
|
||||||
#include "msgpack/object.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
typedef int (*msgpack_packer_write)(void* data, const char* buf, unsigned int len);
|
|
||||||
|
|
||||||
typedef struct msgpack_packer {
|
|
||||||
void* data;
|
|
||||||
msgpack_packer_write callback;
|
|
||||||
} msgpack_packer;
|
|
||||||
|
|
||||||
static void msgpack_packer_init(msgpack_packer* pk, void* data, msgpack_packer_write callback);
|
|
||||||
|
|
||||||
static msgpack_packer* msgpack_packer_new(void* data, msgpack_packer_write callback);
|
|
||||||
static void msgpack_packer_free(msgpack_packer* pk);
|
|
||||||
|
|
||||||
static int msgpack_pack_short(msgpack_packer* pk, short d);
|
|
||||||
static int msgpack_pack_int(msgpack_packer* pk, int d);
|
|
||||||
static int msgpack_pack_long(msgpack_packer* pk, long d);
|
|
||||||
static int msgpack_pack_long_long(msgpack_packer* pk, long long d);
|
|
||||||
static int msgpack_pack_unsigned_short(msgpack_packer* pk, unsigned short d);
|
|
||||||
static int msgpack_pack_unsigned_int(msgpack_packer* pk, unsigned int d);
|
|
||||||
static int msgpack_pack_unsigned_long(msgpack_packer* pk, unsigned long d);
|
|
||||||
static int msgpack_pack_unsigned_long_long(msgpack_packer* pk, unsigned long long d);
|
|
||||||
|
|
||||||
static int msgpack_pack_uint8(msgpack_packer* pk, uint8_t d);
|
|
||||||
static int msgpack_pack_uint16(msgpack_packer* pk, uint16_t d);
|
|
||||||
static int msgpack_pack_uint32(msgpack_packer* pk, uint32_t d);
|
|
||||||
static int msgpack_pack_uint64(msgpack_packer* pk, uint64_t d);
|
|
||||||
static int msgpack_pack_int8(msgpack_packer* pk, int8_t d);
|
|
||||||
static int msgpack_pack_int16(msgpack_packer* pk, int16_t d);
|
|
||||||
static int msgpack_pack_int32(msgpack_packer* pk, int32_t d);
|
|
||||||
static int msgpack_pack_int64(msgpack_packer* pk, int64_t d);
|
|
||||||
|
|
||||||
static int msgpack_pack_float(msgpack_packer* pk, float d);
|
|
||||||
static int msgpack_pack_double(msgpack_packer* pk, double d);
|
|
||||||
|
|
||||||
static int msgpack_pack_nil(msgpack_packer* pk);
|
|
||||||
static int msgpack_pack_true(msgpack_packer* pk);
|
|
||||||
static int msgpack_pack_false(msgpack_packer* pk);
|
|
||||||
|
|
||||||
static int msgpack_pack_array(msgpack_packer* pk, unsigned int n);
|
|
||||||
|
|
||||||
static int msgpack_pack_map(msgpack_packer* pk, unsigned int n);
|
|
||||||
|
|
||||||
static int msgpack_pack_raw(msgpack_packer* pk, size_t l);
|
|
||||||
static int msgpack_pack_raw_body(msgpack_packer* pk, const void* b, size_t l);
|
|
||||||
|
|
||||||
int msgpack_pack_object(msgpack_packer* pk, msgpack_object d);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#define msgpack_pack_inline_func(name) \
|
|
||||||
inline int msgpack_pack ## name
|
|
||||||
|
|
||||||
#define msgpack_pack_inline_func_cint(name) \
|
|
||||||
inline int msgpack_pack ## name
|
|
||||||
|
|
||||||
#define msgpack_pack_user msgpack_packer*
|
|
||||||
|
|
||||||
#define msgpack_pack_append_buffer(user, buf, len) \
|
|
||||||
return (*(user)->callback)((user)->data, (const char*)buf, len)
|
|
||||||
|
|
||||||
#include "msgpack/pack_template.h"
|
|
||||||
|
|
||||||
inline void msgpack_packer_init(msgpack_packer* pk, void* data, msgpack_packer_write callback)
|
|
||||||
{
|
|
||||||
pk->data = data;
|
|
||||||
pk->callback = callback;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline msgpack_packer* msgpack_packer_new(void* data, msgpack_packer_write callback)
|
|
||||||
{
|
|
||||||
msgpack_packer* pk = (msgpack_packer*)calloc(1, sizeof(msgpack_packer));
|
|
||||||
if(!pk) { return NULL; }
|
|
||||||
msgpack_packer_init(pk, data, callback);
|
|
||||||
return pk;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void msgpack_packer_free(msgpack_packer* pk)
|
|
||||||
{
|
|
||||||
free(pk);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* msgpack/pack.h */
|
|
||||||
|
|
||||||
85
c/sbuffer.h
85
c/sbuffer.h
@@ -1,85 +0,0 @@
|
|||||||
/*
|
|
||||||
* MessagePack for C simple buffer implementation
|
|
||||||
*
|
|
||||||
* 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_SBUFFER_H__
|
|
||||||
#define MSGPACK_SBUFFER_H__
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#ifndef MSGPACK_SBUFFER_INIT_SIZE
|
|
||||||
#define MSGPACK_SBUFFER_INIT_SIZE 2048
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef struct msgpack_sbuffer {
|
|
||||||
size_t size;
|
|
||||||
char* data;
|
|
||||||
size_t alloc;
|
|
||||||
} msgpack_sbuffer;
|
|
||||||
|
|
||||||
static inline void msgpack_sbuffer_init(msgpack_sbuffer* sbuf)
|
|
||||||
{
|
|
||||||
memset(sbuf, 0, sizeof(msgpack_sbuffer));
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void msgpack_sbuffer_destroy(msgpack_sbuffer* sbuf)
|
|
||||||
{
|
|
||||||
free(sbuf->data);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int msgpack_sbuffer_write(void* data, const char* buf, unsigned int len)
|
|
||||||
{
|
|
||||||
msgpack_sbuffer* sbuf = (msgpack_sbuffer*)data;
|
|
||||||
|
|
||||||
if(sbuf->alloc - sbuf->size < len) {
|
|
||||||
size_t nsize = (sbuf->alloc) ?
|
|
||||||
sbuf->alloc * 2 : MSGPACK_SBUFFER_INIT_SIZE;
|
|
||||||
|
|
||||||
while(nsize < sbuf->size + len) { nsize *= 2; }
|
|
||||||
|
|
||||||
void* tmp = realloc(sbuf->data, nsize);
|
|
||||||
if(!tmp) { return -1; }
|
|
||||||
|
|
||||||
sbuf->data = (char*)tmp;
|
|
||||||
sbuf->alloc = nsize;
|
|
||||||
}
|
|
||||||
|
|
||||||
memcpy(sbuf->data + sbuf->size, buf, len);
|
|
||||||
sbuf->size += len;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline char* msgpack_sbuffer_release(msgpack_sbuffer* sbuf)
|
|
||||||
{
|
|
||||||
char* tmp = sbuf->data;
|
|
||||||
sbuf->size = 0;
|
|
||||||
sbuf->data = NULL;
|
|
||||||
sbuf->alloc = 0;
|
|
||||||
return tmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* msgpack/sbuffer.h */
|
|
||||||
|
|
||||||
399
c/unpack.c
399
c/unpack.c
@@ -1,399 +0,0 @@
|
|||||||
/*
|
|
||||||
* MessagePack for C unpacking routine
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
#include "msgpack/unpack.h"
|
|
||||||
#include "msgpack/unpack_define.h"
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
msgpack_zone* z;
|
|
||||||
bool referenced;
|
|
||||||
} unpack_user;
|
|
||||||
|
|
||||||
|
|
||||||
#define msgpack_unpack_struct(name) \
|
|
||||||
struct template ## name
|
|
||||||
|
|
||||||
#define msgpack_unpack_func(ret, name) \
|
|
||||||
ret template ## name
|
|
||||||
|
|
||||||
#define msgpack_unpack_callback(name) \
|
|
||||||
template_callback ## name
|
|
||||||
|
|
||||||
#define msgpack_unpack_object msgpack_object
|
|
||||||
|
|
||||||
#define msgpack_unpack_user unpack_user
|
|
||||||
|
|
||||||
|
|
||||||
struct template_context;
|
|
||||||
typedef struct template_context template_context;
|
|
||||||
|
|
||||||
static void template_init(template_context* ctx);
|
|
||||||
|
|
||||||
static msgpack_object template_data(template_context* ctx);
|
|
||||||
|
|
||||||
static int template_execute(template_context* ctx,
|
|
||||||
const char* data, size_t len, size_t* off);
|
|
||||||
|
|
||||||
|
|
||||||
static inline msgpack_object template_callback_root(unpack_user* u)
|
|
||||||
{ msgpack_object o; return o; }
|
|
||||||
|
|
||||||
static inline int template_callback_uint8(unpack_user* u, uint8_t d, msgpack_object* o)
|
|
||||||
{ o->type = MSGPACK_OBJECT_POSITIVE_INTEGER; o->via.u64 = d; return 0; }
|
|
||||||
|
|
||||||
static inline int template_callback_uint16(unpack_user* u, uint16_t d, msgpack_object* o)
|
|
||||||
{ o->type = MSGPACK_OBJECT_POSITIVE_INTEGER; o->via.u64 = d; return 0; }
|
|
||||||
|
|
||||||
static inline int template_callback_uint32(unpack_user* u, uint32_t d, msgpack_object* o)
|
|
||||||
{ o->type = MSGPACK_OBJECT_POSITIVE_INTEGER; o->via.u64 = d; return 0; }
|
|
||||||
|
|
||||||
static inline int template_callback_uint64(unpack_user* u, uint64_t d, msgpack_object* o)
|
|
||||||
{ o->type = MSGPACK_OBJECT_POSITIVE_INTEGER; o->via.u64 = d; return 0; }
|
|
||||||
|
|
||||||
static inline int template_callback_int8(unpack_user* u, int8_t d, msgpack_object* o)
|
|
||||||
{ if(d >= 0) { o->type = MSGPACK_OBJECT_POSITIVE_INTEGER; o->via.u64 = d; return 0; }
|
|
||||||
else { o->type = MSGPACK_OBJECT_NEGATIVE_INTEGER; o->via.i64 = d; return 0; } }
|
|
||||||
|
|
||||||
static inline int template_callback_int16(unpack_user* u, int16_t d, msgpack_object* o)
|
|
||||||
{ if(d >= 0) { o->type = MSGPACK_OBJECT_POSITIVE_INTEGER; o->via.u64 = d; return 0; }
|
|
||||||
else { o->type = MSGPACK_OBJECT_NEGATIVE_INTEGER; o->via.i64 = d; return 0; } }
|
|
||||||
|
|
||||||
static inline int template_callback_int32(unpack_user* u, int32_t d, msgpack_object* o)
|
|
||||||
{ if(d >= 0) { o->type = MSGPACK_OBJECT_POSITIVE_INTEGER; o->via.u64 = d; return 0; }
|
|
||||||
else { o->type = MSGPACK_OBJECT_NEGATIVE_INTEGER; o->via.i64 = d; return 0; } }
|
|
||||||
|
|
||||||
static inline int template_callback_int64(unpack_user* u, int64_t d, msgpack_object* o)
|
|
||||||
{ if(d >= 0) { o->type = MSGPACK_OBJECT_POSITIVE_INTEGER; o->via.u64 = d; return 0; }
|
|
||||||
else { o->type = MSGPACK_OBJECT_NEGATIVE_INTEGER; o->via.i64 = d; return 0; } }
|
|
||||||
|
|
||||||
static inline int template_callback_float(unpack_user* u, float d, msgpack_object* o)
|
|
||||||
{ o->type = MSGPACK_OBJECT_DOUBLE; o->via.dec = d; return 0; }
|
|
||||||
|
|
||||||
static inline int template_callback_double(unpack_user* u, double d, msgpack_object* o)
|
|
||||||
{ o->type = MSGPACK_OBJECT_DOUBLE; o->via.dec = d; return 0; }
|
|
||||||
|
|
||||||
static inline int template_callback_nil(unpack_user* u, msgpack_object* o)
|
|
||||||
{ o->type = MSGPACK_OBJECT_NIL; return 0; }
|
|
||||||
|
|
||||||
static inline int template_callback_true(unpack_user* u, msgpack_object* o)
|
|
||||||
{ o->type = MSGPACK_OBJECT_BOOLEAN; o->via.boolean = true; return 0; }
|
|
||||||
|
|
||||||
static inline int template_callback_false(unpack_user* u, msgpack_object* o)
|
|
||||||
{ o->type = MSGPACK_OBJECT_BOOLEAN; o->via.boolean = false; return 0; }
|
|
||||||
|
|
||||||
static inline int template_callback_array(unpack_user* u, unsigned int n, msgpack_object* o)
|
|
||||||
{
|
|
||||||
o->type = MSGPACK_OBJECT_ARRAY;
|
|
||||||
o->via.array.size = 0;
|
|
||||||
o->via.array.ptr = msgpack_zone_malloc(u->z, n*sizeof(msgpack_object));
|
|
||||||
if(o->via.array.ptr == NULL) { return -1; }
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int template_callback_array_item(unpack_user* u, msgpack_object* c, msgpack_object o)
|
|
||||||
{ c->via.array.ptr[c->via.array.size++] = o; return 0; }
|
|
||||||
|
|
||||||
static inline int template_callback_map(unpack_user* u, unsigned int n, msgpack_object* o)
|
|
||||||
{
|
|
||||||
o->type = MSGPACK_OBJECT_MAP;
|
|
||||||
o->via.map.size = 0;
|
|
||||||
o->via.map.ptr = (msgpack_object_kv*)msgpack_zone_malloc(u->z, n*sizeof(msgpack_object_kv));
|
|
||||||
if(o->via.map.ptr == NULL) { return -1; }
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int template_callback_map_item(unpack_user* u, msgpack_object* c, msgpack_object k, msgpack_object v)
|
|
||||||
{
|
|
||||||
c->via.map.ptr[c->via.map.size].key = k;
|
|
||||||
c->via.map.ptr[c->via.map.size].val = v;
|
|
||||||
++c->via.map.size;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int template_callback_raw(unpack_user* u, const char* b, const char* p, unsigned int l, msgpack_object* o)
|
|
||||||
{
|
|
||||||
o->type = MSGPACK_OBJECT_RAW;
|
|
||||||
o->via.raw.ptr = p;
|
|
||||||
o->via.raw.size = l;
|
|
||||||
u->referenced = true;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#include "msgpack/unpack_template.h"
|
|
||||||
|
|
||||||
|
|
||||||
#define CTX_CAST(m) ((template_context*)(m))
|
|
||||||
#define CTX_REFERENCED(mpac) CTX_CAST((mpac)->ctx)->user.referenced
|
|
||||||
|
|
||||||
|
|
||||||
static const size_t COUNTER_SIZE = sizeof(unsigned int);
|
|
||||||
|
|
||||||
static inline void init_count(void* buffer)
|
|
||||||
{
|
|
||||||
*(volatile unsigned int*)buffer = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void decl_count(void* buffer)
|
|
||||||
{
|
|
||||||
//if(--*(unsigned int*)buffer == 0) {
|
|
||||||
if(__sync_sub_and_fetch((unsigned int*)buffer, 1) == 0) {
|
|
||||||
free(buffer);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void incr_count(void* buffer)
|
|
||||||
{
|
|
||||||
//++*(unsigned int*)buffer;
|
|
||||||
__sync_add_and_fetch((unsigned int*)buffer, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline unsigned int get_count(void* buffer)
|
|
||||||
{
|
|
||||||
return *(volatile unsigned int*)buffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool msgpack_unpacker_init(msgpack_unpacker* mpac, size_t initial_buffer_size)
|
|
||||||
{
|
|
||||||
if(initial_buffer_size < COUNTER_SIZE) {
|
|
||||||
initial_buffer_size = COUNTER_SIZE;
|
|
||||||
}
|
|
||||||
|
|
||||||
char* buffer = (char*)malloc(initial_buffer_size);
|
|
||||||
if(buffer == NULL) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void* ctx = malloc(sizeof(template_context));
|
|
||||||
if(ctx == NULL) {
|
|
||||||
free(buffer);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
msgpack_zone* z = msgpack_zone_new(MSGPACK_ZONE_CHUNK_SIZE);
|
|
||||||
if(z == NULL) {
|
|
||||||
free(ctx);
|
|
||||||
free(buffer);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
mpac->buffer = buffer;
|
|
||||||
mpac->used = COUNTER_SIZE;
|
|
||||||
mpac->free = initial_buffer_size - mpac->used;
|
|
||||||
mpac->off = COUNTER_SIZE;
|
|
||||||
mpac->parsed = 0;
|
|
||||||
mpac->initial_buffer_size = initial_buffer_size;
|
|
||||||
mpac->z = z;
|
|
||||||
mpac->ctx = ctx;
|
|
||||||
|
|
||||||
init_count(mpac->buffer);
|
|
||||||
|
|
||||||
template_init(CTX_CAST(mpac->ctx));
|
|
||||||
CTX_CAST(mpac->ctx)->user.z = mpac->z;
|
|
||||||
CTX_CAST(mpac->ctx)->user.referenced = false;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void msgpack_unpacker_destroy(msgpack_unpacker* mpac)
|
|
||||||
{
|
|
||||||
msgpack_zone_free(mpac->z);
|
|
||||||
free(mpac->ctx);
|
|
||||||
decl_count(mpac->buffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
msgpack_unpacker* msgpack_unpacker_new(size_t initial_buffer_size)
|
|
||||||
{
|
|
||||||
msgpack_unpacker* mpac = (msgpack_unpacker*)malloc(sizeof(msgpack_unpacker));
|
|
||||||
if(mpac == NULL) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!msgpack_unpacker_init(mpac, initial_buffer_size)) {
|
|
||||||
free(mpac);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return mpac;
|
|
||||||
}
|
|
||||||
|
|
||||||
void msgpack_unpacker_free(msgpack_unpacker* mpac)
|
|
||||||
{
|
|
||||||
msgpack_unpacker_destroy(mpac);
|
|
||||||
free(mpac);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool msgpack_unpacker_expand_buffer(msgpack_unpacker* mpac, size_t size)
|
|
||||||
{
|
|
||||||
if(mpac->used == mpac->off && get_count(mpac->buffer) == 1
|
|
||||||
&& !CTX_REFERENCED(mpac)) {
|
|
||||||
// rewind buffer
|
|
||||||
mpac->free += mpac->used - COUNTER_SIZE;
|
|
||||||
mpac->used = COUNTER_SIZE;
|
|
||||||
mpac->off = COUNTER_SIZE;
|
|
||||||
|
|
||||||
if(mpac->free >= size) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(mpac->off == COUNTER_SIZE) {
|
|
||||||
size_t next_size = (mpac->used + mpac->free) * 2; // include COUNTER_SIZE
|
|
||||||
while(next_size < size + mpac->used) {
|
|
||||||
next_size *= 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
char* tmp = (char*)realloc(mpac->buffer, next_size);
|
|
||||||
if(tmp == NULL) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
mpac->buffer = tmp;
|
|
||||||
mpac->free = next_size - mpac->used;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
size_t next_size = mpac->initial_buffer_size; // include COUNTER_SIZE
|
|
||||||
size_t not_parsed = mpac->used - mpac->off;
|
|
||||||
while(next_size < size + not_parsed + COUNTER_SIZE) {
|
|
||||||
next_size *= 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
char* tmp = (char*)malloc(next_size);
|
|
||||||
if(tmp == NULL) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
init_count(tmp);
|
|
||||||
|
|
||||||
memcpy(tmp+COUNTER_SIZE, mpac->buffer+mpac->off, not_parsed);
|
|
||||||
|
|
||||||
if(CTX_REFERENCED(mpac)) {
|
|
||||||
if(!msgpack_zone_push_finalizer(mpac->z, decl_count, mpac->buffer)) {
|
|
||||||
free(tmp);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
CTX_REFERENCED(mpac) = false;
|
|
||||||
} else {
|
|
||||||
decl_count(mpac->buffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
mpac->buffer = tmp;
|
|
||||||
mpac->used = not_parsed + COUNTER_SIZE;
|
|
||||||
mpac->free = next_size - mpac->used;
|
|
||||||
mpac->off = COUNTER_SIZE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
int msgpack_unpacker_execute(msgpack_unpacker* mpac)
|
|
||||||
{
|
|
||||||
size_t off = mpac->off;
|
|
||||||
int ret = template_execute(CTX_CAST(mpac->ctx),
|
|
||||||
mpac->buffer, mpac->used, &mpac->off);
|
|
||||||
if(mpac->off > off) {
|
|
||||||
mpac->parsed += mpac->off - off;
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
msgpack_object msgpack_unpacker_data(msgpack_unpacker* mpac)
|
|
||||||
{
|
|
||||||
return template_data(CTX_CAST(mpac->ctx));
|
|
||||||
}
|
|
||||||
|
|
||||||
msgpack_zone* msgpack_unpacker_release_zone(msgpack_unpacker* mpac)
|
|
||||||
{
|
|
||||||
if(!msgpack_unpacker_flush_zone(mpac)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
msgpack_zone* r = msgpack_zone_new(MSGPACK_ZONE_CHUNK_SIZE);
|
|
||||||
if(r == NULL) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
msgpack_zone* old = mpac->z;
|
|
||||||
mpac->z = r;
|
|
||||||
|
|
||||||
return old;
|
|
||||||
}
|
|
||||||
|
|
||||||
void msgpack_unpacker_reset_zone(msgpack_unpacker* mpac)
|
|
||||||
{
|
|
||||||
msgpack_zone_clear(mpac->z);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool msgpack_unpacker_flush_zone(msgpack_unpacker* mpac)
|
|
||||||
{
|
|
||||||
if(CTX_REFERENCED(mpac)) {
|
|
||||||
if(!msgpack_zone_push_finalizer(mpac->z, decl_count, mpac->buffer)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
CTX_REFERENCED(mpac) = false;
|
|
||||||
|
|
||||||
incr_count(mpac->buffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void msgpack_unpacker_reset(msgpack_unpacker* mpac)
|
|
||||||
{
|
|
||||||
template_init(CTX_CAST(mpac->ctx));
|
|
||||||
// don't reset referenced flag
|
|
||||||
mpac->parsed = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
msgpack_unpack_return
|
|
||||||
msgpack_unpack(const char* data, size_t len, size_t* off,
|
|
||||||
msgpack_zone* z, msgpack_object* result)
|
|
||||||
{
|
|
||||||
template_context ctx;
|
|
||||||
template_init(&ctx);
|
|
||||||
|
|
||||||
ctx.user.z = z;
|
|
||||||
ctx.user.referenced = false;
|
|
||||||
|
|
||||||
size_t noff = 0;
|
|
||||||
if(off != NULL) { noff = *off; }
|
|
||||||
|
|
||||||
int ret = template_execute(&ctx, data, len, &noff);
|
|
||||||
if(ret < 0) {
|
|
||||||
return MSGPACK_UNPACK_PARSE_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(off != NULL) { *off = noff; }
|
|
||||||
|
|
||||||
if(ret == 0) {
|
|
||||||
return MSGPACK_UNPACK_CONTINUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
*result = template_data(&ctx);
|
|
||||||
|
|
||||||
if(noff < len) {
|
|
||||||
return MSGPACK_UNPACK_EXTRA_BYTES;
|
|
||||||
}
|
|
||||||
|
|
||||||
return MSGPACK_UNPACK_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
125
c/unpack.h
125
c/unpack.h
@@ -1,125 +0,0 @@
|
|||||||
/*
|
|
||||||
* MessagePack for C unpacking routine
|
|
||||||
*
|
|
||||||
* 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_unpacker_H__
|
|
||||||
#define msgpack_unpacker_H__
|
|
||||||
|
|
||||||
#include "msgpack/zone.h"
|
|
||||||
#include "msgpack/object.h"
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stddef.h>
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct msgpack_unpacker {
|
|
||||||
char* buffer;
|
|
||||||
size_t used;
|
|
||||||
size_t free;
|
|
||||||
size_t off;
|
|
||||||
size_t parsed;
|
|
||||||
msgpack_zone* z;
|
|
||||||
size_t initial_buffer_size;
|
|
||||||
void* ctx;
|
|
||||||
} msgpack_unpacker;
|
|
||||||
|
|
||||||
|
|
||||||
bool msgpack_unpacker_init(msgpack_unpacker* mpac, size_t initial_buffer_size);
|
|
||||||
void msgpack_unpacker_destroy(msgpack_unpacker* mpac);
|
|
||||||
|
|
||||||
msgpack_unpacker* msgpack_unpacker_new(size_t initial_buffer_size);
|
|
||||||
void msgpack_unpacker_free(msgpack_unpacker* mpac);
|
|
||||||
|
|
||||||
static inline bool msgpack_unpacker_reserve_buffer(msgpack_unpacker* mpac, size_t size);
|
|
||||||
static inline char* msgpack_unpacker_buffer(msgpack_unpacker* mpac);
|
|
||||||
static inline size_t msgpack_unpacker_buffer_capacity(const msgpack_unpacker* mpac);
|
|
||||||
static inline void msgpack_unpacker_buffer_consumed(msgpack_unpacker* mpac, size_t size);
|
|
||||||
|
|
||||||
|
|
||||||
int msgpack_unpacker_execute(msgpack_unpacker* mpac);
|
|
||||||
|
|
||||||
msgpack_object msgpack_unpacker_data(msgpack_unpacker* mpac);
|
|
||||||
|
|
||||||
msgpack_zone* msgpack_unpacker_release_zone(msgpack_unpacker* mpac);
|
|
||||||
|
|
||||||
void msgpack_unpacker_reset_zone(msgpack_unpacker* mpac);
|
|
||||||
|
|
||||||
void msgpack_unpacker_reset(msgpack_unpacker* mpac);
|
|
||||||
|
|
||||||
static inline size_t msgpack_unpacker_message_size(const msgpack_unpacker* mpac);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
MSGPACK_UNPACK_SUCCESS = 2,
|
|
||||||
MSGPACK_UNPACK_EXTRA_BYTES = 1,
|
|
||||||
MSGPACK_UNPACK_CONTINUE = 0,
|
|
||||||
MSGPACK_UNPACK_PARSE_ERROR = -1,
|
|
||||||
} msgpack_unpack_return;
|
|
||||||
|
|
||||||
msgpack_unpack_return
|
|
||||||
msgpack_unpack(const char* data, size_t len, size_t* off,
|
|
||||||
msgpack_zone* z, msgpack_object* result);
|
|
||||||
|
|
||||||
|
|
||||||
static inline size_t msgpack_unpacker_parsed_size(const msgpack_unpacker* mpac);
|
|
||||||
|
|
||||||
bool msgpack_unpacker_flush_zone(msgpack_unpacker* mpac);
|
|
||||||
|
|
||||||
bool msgpack_unpacker_expand_buffer(msgpack_unpacker* mpac, size_t size);
|
|
||||||
|
|
||||||
bool msgpack_unpacker_reserve_buffer(msgpack_unpacker* mpac, size_t size)
|
|
||||||
{
|
|
||||||
if(mpac->free >= size) { return true; }
|
|
||||||
return msgpack_unpacker_expand_buffer(mpac, size);
|
|
||||||
}
|
|
||||||
|
|
||||||
char* msgpack_unpacker_buffer(msgpack_unpacker* mpac)
|
|
||||||
{
|
|
||||||
return mpac->buffer + mpac->used;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t msgpack_unpacker_buffer_capacity(const msgpack_unpacker* mpac)
|
|
||||||
{
|
|
||||||
return mpac->free;
|
|
||||||
}
|
|
||||||
|
|
||||||
void msgpack_unpacker_buffer_consumed(msgpack_unpacker* mpac, size_t size)
|
|
||||||
{
|
|
||||||
mpac->used += size;
|
|
||||||
mpac->free -= size;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t msgpack_unpacker_message_size(const msgpack_unpacker* mpac)
|
|
||||||
{
|
|
||||||
return mpac->parsed - mpac->off + mpac->used;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t msgpack_unpacker_parsed_size(const msgpack_unpacker* mpac)
|
|
||||||
{
|
|
||||||
return mpac->parsed;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* msgpack/unpack.h */
|
|
||||||
|
|
||||||
135
c/vrefbuffer.c
135
c/vrefbuffer.c
@@ -1,135 +0,0 @@
|
|||||||
/*
|
|
||||||
* MessagePack for C zero-copy buffer implementation
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
#include "msgpack/vrefbuffer.h"
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
bool msgpack_vrefbuffer_init(msgpack_vrefbuffer* vbuf,
|
|
||||||
size_t ref_size, size_t chunk_size)
|
|
||||||
{
|
|
||||||
if(chunk_size < sizeof(msgpack_vrefbuffer_chunk)+72) {
|
|
||||||
chunk_size = 72;
|
|
||||||
} else {
|
|
||||||
chunk_size -= sizeof(msgpack_vrefbuffer_chunk);
|
|
||||||
}
|
|
||||||
|
|
||||||
vbuf->chunk_size = chunk_size;
|
|
||||||
vbuf->ref_size = ref_size;
|
|
||||||
|
|
||||||
// glibcは72バイト以下のmallocが高速
|
|
||||||
size_t nfirst = (sizeof(struct iovec) < 72/2) ?
|
|
||||||
72 / sizeof(struct iovec) : 8;
|
|
||||||
|
|
||||||
struct iovec* array = (struct iovec*)malloc(
|
|
||||||
sizeof(struct iovec) * nfirst);
|
|
||||||
if(array == NULL) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
vbuf->tail = array;
|
|
||||||
vbuf->end = array + nfirst;
|
|
||||||
vbuf->array = array;
|
|
||||||
|
|
||||||
vbuf->chunk = (msgpack_vrefbuffer_chunk*)malloc(
|
|
||||||
chunk_size + sizeof(msgpack_vrefbuffer_chunk));
|
|
||||||
if(vbuf->chunk == NULL) {
|
|
||||||
free(array);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
vbuf->chunk->next = NULL;
|
|
||||||
vbuf->chunk->free = chunk_size;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void msgpack_vrefbuffer_destroy(msgpack_vrefbuffer* vbuf)
|
|
||||||
{
|
|
||||||
msgpack_vrefbuffer_chunk* c = vbuf->chunk;
|
|
||||||
while(true) {
|
|
||||||
msgpack_vrefbuffer_chunk* n = c->next;
|
|
||||||
free(c);
|
|
||||||
if(n) {
|
|
||||||
c = n;
|
|
||||||
} else {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
free(vbuf->array);
|
|
||||||
}
|
|
||||||
|
|
||||||
int msgpack_vrefbuffer_append_ref(msgpack_vrefbuffer* vbuf,
|
|
||||||
const char* buf, unsigned int len)
|
|
||||||
{
|
|
||||||
if(vbuf->tail == vbuf->end) {
|
|
||||||
const size_t nused = vbuf->end - vbuf->array;
|
|
||||||
const size_t nnext = nused * 2;
|
|
||||||
|
|
||||||
struct iovec* nvec = (struct iovec*)realloc(
|
|
||||||
vbuf->array, sizeof(struct iovec)*nnext);
|
|
||||||
if(nvec == NULL) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
vbuf->array = nvec;
|
|
||||||
vbuf->end = nvec + nnext;
|
|
||||||
vbuf->tail = nvec + nused;
|
|
||||||
}
|
|
||||||
|
|
||||||
vbuf->tail->iov_base = (char*)buf;
|
|
||||||
vbuf->tail->iov_len = len;
|
|
||||||
++vbuf->tail;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int msgpack_vrefbuffer_append_copy(msgpack_vrefbuffer* vbuf,
|
|
||||||
const char* buf, unsigned int len)
|
|
||||||
{
|
|
||||||
msgpack_vrefbuffer_chunk* chunk = vbuf->chunk;
|
|
||||||
size_t cur_size = vbuf->chunk_size;
|
|
||||||
|
|
||||||
if(chunk->free < len) {
|
|
||||||
cur_size = (cur_size > len) ? cur_size : len;
|
|
||||||
|
|
||||||
chunk = (msgpack_vrefbuffer_chunk*)malloc(
|
|
||||||
cur_size + sizeof(msgpack_vrefbuffer_chunk));
|
|
||||||
if(chunk == NULL) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
chunk->free = cur_size;
|
|
||||||
chunk->next = vbuf->chunk;
|
|
||||||
vbuf->chunk = chunk;
|
|
||||||
}
|
|
||||||
|
|
||||||
char* m = ((char*)chunk) + sizeof(msgpack_vrefbuffer_chunk)
|
|
||||||
+ (cur_size - chunk->free);
|
|
||||||
|
|
||||||
memcpy(m, buf, len);
|
|
||||||
chunk->free -= len;
|
|
||||||
|
|
||||||
if(vbuf->tail != vbuf->array && m ==
|
|
||||||
(const char*)((vbuf->tail-1)->iov_base) + (vbuf->tail-1)->iov_len) {
|
|
||||||
(vbuf->tail-1)->iov_len += len;
|
|
||||||
return 0;
|
|
||||||
} else {
|
|
||||||
return msgpack_vrefbuffer_append_ref(vbuf, m, len);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,97 +0,0 @@
|
|||||||
/*
|
|
||||||
* MessagePack for C zero-copy buffer implementation
|
|
||||||
*
|
|
||||||
* 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_VREFBUFFER_H__
|
|
||||||
#define MSGPACK_VREFBUFFER_H__
|
|
||||||
|
|
||||||
#include "msgpack/zone.h"
|
|
||||||
#include <sys/uio.h>
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef MSGPACK_VREFBUFFER_REF_SIZE
|
|
||||||
#define MSGPACK_VREFBUFFER_REF_SIZE 32
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef MSGPACK_VREFBUFFER_CHUNK_SIZE
|
|
||||||
#define MSGPACK_VREFBUFFER_CHUNK_SIZE 2048
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef struct msgpack_vrefbuffer_chunk {
|
|
||||||
size_t free;
|
|
||||||
struct msgpack_vrefbuffer_chunk* next;
|
|
||||||
/* data ... */
|
|
||||||
} msgpack_vrefbuffer_chunk;
|
|
||||||
|
|
||||||
typedef struct msgpack_vrefbuffer {
|
|
||||||
size_t chunk_size;
|
|
||||||
size_t ref_size;
|
|
||||||
|
|
||||||
struct iovec* tail;
|
|
||||||
struct iovec* end;
|
|
||||||
struct iovec* array;
|
|
||||||
|
|
||||||
msgpack_vrefbuffer_chunk* chunk;
|
|
||||||
} msgpack_vrefbuffer;
|
|
||||||
|
|
||||||
|
|
||||||
bool msgpack_vrefbuffer_init(msgpack_vrefbuffer* vbuf,
|
|
||||||
size_t ref_size, size_t chunk_size);
|
|
||||||
void msgpack_vrefbuffer_destroy(msgpack_vrefbuffer* vbuf);
|
|
||||||
|
|
||||||
static inline int msgpack_vrefbuffer_write(void* data, const char* buf, unsigned int len);
|
|
||||||
|
|
||||||
static inline const struct iovec* msgpack_vrefbuffer_vec(const msgpack_vrefbuffer* vref);
|
|
||||||
static inline size_t msgpack_vrefbuffer_veclen(const msgpack_vrefbuffer* vref);
|
|
||||||
|
|
||||||
int msgpack_vrefbuffer_append_copy(msgpack_vrefbuffer* vbuf,
|
|
||||||
const char* buf, unsigned int len);
|
|
||||||
|
|
||||||
int msgpack_vrefbuffer_append_ref(msgpack_vrefbuffer* vbuf,
|
|
||||||
const char* buf, unsigned int len);
|
|
||||||
|
|
||||||
|
|
||||||
int msgpack_vrefbuffer_write(void* data, const char* buf, unsigned int len)
|
|
||||||
{
|
|
||||||
msgpack_vrefbuffer* vbuf = (msgpack_vrefbuffer*)data;
|
|
||||||
|
|
||||||
if(len < vbuf->ref_size) {
|
|
||||||
return msgpack_vrefbuffer_append_copy(vbuf, buf, len);
|
|
||||||
} else {
|
|
||||||
return msgpack_vrefbuffer_append_ref(vbuf, buf, len);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const struct iovec* msgpack_vrefbuffer_vec(const msgpack_vrefbuffer* vref)
|
|
||||||
{
|
|
||||||
return vref->array;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t msgpack_vrefbuffer_veclen(const msgpack_vrefbuffer* vref)
|
|
||||||
{
|
|
||||||
return vref->tail - vref->array;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* msgpack/vrefbuffer.h */
|
|
||||||
|
|
||||||
241
c/zone.c
241
c/zone.c
@@ -1,241 +0,0 @@
|
|||||||
/*
|
|
||||||
* MessagePack for C memory pool implementation
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
#include "msgpack/zone.h"
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
static inline bool init_chunk_array(msgpack_zone_chunk_array* ca, size_t chunk_size)
|
|
||||||
{
|
|
||||||
// glibcは72バイト以下のmallocが高速
|
|
||||||
const size_t nfirst = (sizeof(msgpack_zone_chunk) < 72/2) ?
|
|
||||||
72 / sizeof(msgpack_zone_chunk) : 8;
|
|
||||||
|
|
||||||
msgpack_zone_chunk* array = (msgpack_zone_chunk*)malloc(
|
|
||||||
sizeof(msgpack_zone_chunk) * nfirst);
|
|
||||||
if(array == NULL) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
const size_t sz = chunk_size;
|
|
||||||
|
|
||||||
char* ptr = (char*)malloc(sz);
|
|
||||||
if(ptr == NULL) {
|
|
||||||
free(array);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
ca->tail = array;
|
|
||||||
ca->end = array + nfirst;
|
|
||||||
ca->array = array;
|
|
||||||
|
|
||||||
array[0].free = sz;
|
|
||||||
array[0].ptr = ptr;
|
|
||||||
array[0].alloc = ptr;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void destroy_chunk_array(msgpack_zone_chunk_array* ca)
|
|
||||||
{
|
|
||||||
msgpack_zone_chunk* chunk = ca->array;
|
|
||||||
for(; chunk != ca->tail+1; ++chunk) {
|
|
||||||
free(chunk->alloc);
|
|
||||||
}
|
|
||||||
|
|
||||||
free(ca->array);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void clear_chunk_array(msgpack_zone_chunk_array* ca)
|
|
||||||
{
|
|
||||||
msgpack_zone_chunk* chunk = ca->array + 1;
|
|
||||||
for(; chunk != ca->tail+1; ++chunk) {
|
|
||||||
free(chunk->alloc);
|
|
||||||
}
|
|
||||||
|
|
||||||
ca->tail = ca->array;
|
|
||||||
|
|
||||||
ca->array[0].free += ca->array[0].ptr - (char*)ca->array[0].alloc;
|
|
||||||
ca->array[0].ptr = (char*)ca->array[0].alloc;
|
|
||||||
}
|
|
||||||
|
|
||||||
void* msgpack_zone_malloc_expand(msgpack_zone* zone, size_t size)
|
|
||||||
{
|
|
||||||
msgpack_zone_chunk_array* const ca = &zone->chunk_array;
|
|
||||||
|
|
||||||
msgpack_zone_chunk* chunk = ++ca->tail;
|
|
||||||
|
|
||||||
if(chunk == ca->end) {
|
|
||||||
// ca->arrayに空きがない
|
|
||||||
// ca->arrayを拡張する
|
|
||||||
|
|
||||||
const size_t nused = ca->end - ca->array;
|
|
||||||
const size_t nnext = (ca->end - ca->array) * 2;
|
|
||||||
|
|
||||||
chunk = (msgpack_zone_chunk*)realloc(ca->array,
|
|
||||||
sizeof(msgpack_zone_chunk) * nnext);
|
|
||||||
if(chunk == NULL) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
ca->array = chunk;
|
|
||||||
ca->end = chunk + nnext;
|
|
||||||
chunk = ca->tail = chunk + nused;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t sz = zone->chunk_size;
|
|
||||||
|
|
||||||
while(sz < size) {
|
|
||||||
sz *= 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
char* ptr = (char*)malloc(sz);
|
|
||||||
if(ptr == NULL) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
chunk->free = sz - size;
|
|
||||||
chunk->ptr = ptr + size;
|
|
||||||
chunk->alloc = ptr;
|
|
||||||
|
|
||||||
return ptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static inline void init_finalizer_array(msgpack_zone_finalizer_array* fa)
|
|
||||||
{
|
|
||||||
fa->tail = NULL;
|
|
||||||
fa->end = NULL;
|
|
||||||
fa->array = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void call_finalizer_array(msgpack_zone_finalizer_array* fa)
|
|
||||||
{
|
|
||||||
// 逆順に呼び出し
|
|
||||||
msgpack_zone_finalizer* fin = fa->tail;
|
|
||||||
for(; fin != fa->array; --fin) {
|
|
||||||
(*(fin-1)->func)((fin-1)->data);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void destroy_finalizer_array(msgpack_zone_finalizer_array* fa)
|
|
||||||
{
|
|
||||||
call_finalizer_array(fa);
|
|
||||||
free(fa->array);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void clear_finalizer_array(msgpack_zone_finalizer_array* fa)
|
|
||||||
{
|
|
||||||
call_finalizer_array(fa);
|
|
||||||
fa->tail = fa->array;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool msgpack_zone_push_finalizer_expand(msgpack_zone* zone,
|
|
||||||
void (*func)(void* data), void* data)
|
|
||||||
{
|
|
||||||
msgpack_zone_finalizer_array* const fa = &zone->finalizer_array;
|
|
||||||
|
|
||||||
const size_t nused = fa->end - fa->array;
|
|
||||||
|
|
||||||
size_t nnext;
|
|
||||||
if(nused == 0) {
|
|
||||||
// 初回の呼び出し:fa->tail == fa->end == fa->array == NULL
|
|
||||||
|
|
||||||
// glibcは72バイト以下のmallocが高速
|
|
||||||
nnext = (sizeof(msgpack_zone_finalizer) < 72/2) ?
|
|
||||||
72 / sizeof(msgpack_zone_finalizer) : 8;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
nnext = nused * 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
msgpack_zone_finalizer* tmp =
|
|
||||||
(msgpack_zone_finalizer*)realloc(fa->array,
|
|
||||||
sizeof(msgpack_zone_finalizer) * nnext);
|
|
||||||
if(tmp == NULL) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
fa->array = tmp;
|
|
||||||
fa->end = tmp + nnext;
|
|
||||||
fa->tail = tmp + nused;
|
|
||||||
|
|
||||||
fa->tail->func = func;
|
|
||||||
fa->tail->data = data;
|
|
||||||
|
|
||||||
++fa->tail;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool msgpack_zone_is_empty(msgpack_zone* zone)
|
|
||||||
{
|
|
||||||
msgpack_zone_chunk_array* const ca = &zone->chunk_array;
|
|
||||||
msgpack_zone_finalizer_array* const fa = &zone->finalizer_array;
|
|
||||||
return ca->array[0].ptr == ca->array[0].alloc &&
|
|
||||||
ca->tail == ca->array &&
|
|
||||||
fa->tail == fa->array;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool msgpack_zone_init(msgpack_zone* zone, size_t chunk_size)
|
|
||||||
{
|
|
||||||
zone->chunk_size = chunk_size;
|
|
||||||
|
|
||||||
if(!init_chunk_array(&zone->chunk_array, chunk_size)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
init_finalizer_array(&zone->finalizer_array);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void msgpack_zone_destroy(msgpack_zone* zone)
|
|
||||||
{
|
|
||||||
destroy_finalizer_array(&zone->finalizer_array);
|
|
||||||
destroy_chunk_array(&zone->chunk_array);
|
|
||||||
}
|
|
||||||
|
|
||||||
void msgpack_zone_clear(msgpack_zone* zone)
|
|
||||||
{
|
|
||||||
clear_finalizer_array(&zone->finalizer_array);
|
|
||||||
clear_chunk_array(&zone->chunk_array);
|
|
||||||
}
|
|
||||||
|
|
||||||
msgpack_zone* msgpack_zone_new(size_t chunk_size)
|
|
||||||
{
|
|
||||||
msgpack_zone* zone = (msgpack_zone*)malloc(sizeof(msgpack_zone));
|
|
||||||
if(zone == NULL) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!msgpack_zone_init(zone, chunk_size)) {
|
|
||||||
free(zone);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return zone;
|
|
||||||
}
|
|
||||||
|
|
||||||
void msgpack_zone_free(msgpack_zone* zone)
|
|
||||||
{
|
|
||||||
msgpack_zone_destroy(zone);
|
|
||||||
free(zone);
|
|
||||||
}
|
|
||||||
|
|
||||||
135
c/zone.h
135
c/zone.h
@@ -1,135 +0,0 @@
|
|||||||
/*
|
|
||||||
* MessagePack for C memory pool implementation
|
|
||||||
*
|
|
||||||
* 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_ZONE_H__
|
|
||||||
#define MSGPACK_ZONE_H__
|
|
||||||
|
|
||||||
#include <stddef.h>
|
|
||||||
#include <stdbool.h>
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct msgpack_zone_chunk {
|
|
||||||
size_t free;
|
|
||||||
char* ptr;
|
|
||||||
void* alloc;
|
|
||||||
} msgpack_zone_chunk;
|
|
||||||
|
|
||||||
typedef struct msgpack_zone_finalizer {
|
|
||||||
void (*func)(void* data);
|
|
||||||
void* data;
|
|
||||||
} msgpack_zone_finalizer;
|
|
||||||
|
|
||||||
typedef struct msgpack_zone_chunk_array {
|
|
||||||
msgpack_zone_chunk* tail;
|
|
||||||
msgpack_zone_chunk* end;
|
|
||||||
msgpack_zone_chunk* array;
|
|
||||||
} msgpack_zone_chunk_array;
|
|
||||||
|
|
||||||
typedef struct msgpack_zone_finalizer_array {
|
|
||||||
msgpack_zone_finalizer* tail;
|
|
||||||
msgpack_zone_finalizer* end;
|
|
||||||
msgpack_zone_finalizer* array;
|
|
||||||
} msgpack_zone_finalizer_array;
|
|
||||||
|
|
||||||
typedef struct msgpack_zone {
|
|
||||||
msgpack_zone_chunk_array chunk_array;
|
|
||||||
msgpack_zone_finalizer_array finalizer_array;
|
|
||||||
size_t chunk_size;
|
|
||||||
} msgpack_zone;
|
|
||||||
|
|
||||||
#ifndef MSGPACK_ZONE_CHUNK_SIZE
|
|
||||||
#define MSGPACK_ZONE_CHUNK_SIZE 2048
|
|
||||||
#endif
|
|
||||||
|
|
||||||
bool msgpack_zone_init(msgpack_zone* zone, size_t chunk_size);
|
|
||||||
void msgpack_zone_destroy(msgpack_zone* zone);
|
|
||||||
|
|
||||||
msgpack_zone* msgpack_zone_new(size_t chunk_size);
|
|
||||||
void msgpack_zone_free(msgpack_zone* zone);
|
|
||||||
|
|
||||||
static inline void* msgpack_zone_malloc(msgpack_zone* zone, size_t size);
|
|
||||||
static inline void* msgpack_zone_malloc_no_align(msgpack_zone* zone, size_t size);
|
|
||||||
|
|
||||||
static inline bool msgpack_zone_push_finalizer(msgpack_zone* zone,
|
|
||||||
void (*func)(void* data), void* data);
|
|
||||||
|
|
||||||
bool msgpack_zone_is_empty(msgpack_zone* zone);
|
|
||||||
|
|
||||||
void msgpack_zone_clear(msgpack_zone* zone);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef MSGPACK_ZONE_ALIGN
|
|
||||||
#define MSGPACK_ZONE_ALIGN sizeof(int)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void* msgpack_zone_malloc_expand(msgpack_zone* zone, size_t size);
|
|
||||||
|
|
||||||
void* msgpack_zone_malloc_no_align(msgpack_zone* zone, size_t size)
|
|
||||||
{
|
|
||||||
msgpack_zone_chunk* chunk = zone->chunk_array.tail;
|
|
||||||
|
|
||||||
if(chunk->free < size) {
|
|
||||||
return msgpack_zone_malloc_expand(zone, size);
|
|
||||||
}
|
|
||||||
|
|
||||||
char* ptr = chunk->ptr;
|
|
||||||
chunk->ptr += size;
|
|
||||||
chunk->free -= size;
|
|
||||||
|
|
||||||
return ptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
void* msgpack_zone_malloc(msgpack_zone* zone, size_t size)
|
|
||||||
{
|
|
||||||
return msgpack_zone_malloc_no_align(zone,
|
|
||||||
((size)+((MSGPACK_ZONE_ALIGN)-1)) & ~((MSGPACK_ZONE_ALIGN)-1));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool msgpack_zone_push_finalizer_expand(msgpack_zone* zone,
|
|
||||||
void (*func)(void* data), void* data);
|
|
||||||
|
|
||||||
bool msgpack_zone_push_finalizer(msgpack_zone* zone,
|
|
||||||
void (*func)(void* data), void* data)
|
|
||||||
{
|
|
||||||
msgpack_zone_finalizer_array* const fa = &zone->finalizer_array;
|
|
||||||
msgpack_zone_finalizer* fin = fa->tail;
|
|
||||||
|
|
||||||
if(fin == fa->end) {
|
|
||||||
return msgpack_zone_push_finalizer_expand(zone, func, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
fin->func = func;
|
|
||||||
fin->data = data;
|
|
||||||
|
|
||||||
++fa->tail;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* msgpack/zone.h */
|
|
||||||
|
|
||||||
113
ci/build_cmake.sh
Executable file
113
ci/build_cmake.sh
Executable file
@@ -0,0 +1,113 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
mkdir build
|
||||||
|
|
||||||
|
ret=$?
|
||||||
|
if [ $ret -ne 0 ]
|
||||||
|
then
|
||||||
|
exit $ret
|
||||||
|
fi
|
||||||
|
|
||||||
|
cd build
|
||||||
|
|
||||||
|
ret=$?
|
||||||
|
if [ $ret -ne 0 ]
|
||||||
|
then
|
||||||
|
exit $ret
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "${ARCH}" == "32" ]
|
||||||
|
then
|
||||||
|
export BIT32="ON"
|
||||||
|
export ARCH_FLAG="-m32"
|
||||||
|
else
|
||||||
|
export BIT32="OFF"
|
||||||
|
export ARCH_FLAG="-m64"
|
||||||
|
fi
|
||||||
|
|
||||||
|
cmake -DMSGPACK_32BIT=${BIT32} -DBUILD_SHARED_LIBS=${SHARED} -DMSGPACK_CHAR_SIGN=${CHAR_SIGN} -DCMAKE_CXX_FLAGS="${ARCH_FLAG} ${CXXFLAGS} ${SAN}" -DCMAKE_C_FLAGS="${CFLAGS} ${SAN}" ..
|
||||||
|
|
||||||
|
ret=$?
|
||||||
|
if [ $ret -ne 0 ]
|
||||||
|
then
|
||||||
|
exit $ret
|
||||||
|
fi
|
||||||
|
|
||||||
|
make
|
||||||
|
|
||||||
|
ret=$?
|
||||||
|
if [ $ret -ne 0 ]
|
||||||
|
then
|
||||||
|
exit $ret
|
||||||
|
fi
|
||||||
|
|
||||||
|
ctest -VV
|
||||||
|
|
||||||
|
ret=$?
|
||||||
|
if [ $ret -ne 0 ]
|
||||||
|
then
|
||||||
|
exit $ret
|
||||||
|
fi
|
||||||
|
|
||||||
|
cmake -DMSGPACK_32BIT=${BIT32} -DBUILD_SHARED_LIBS=${SHARED} -DMSGPACK_CHAR_SIGN=${CHAR_SIGN} -DCMAKE_CXX_FLAGS="${ARCH_FLAG} ${CXXFLAGS}" -DCMAKE_C_FLAGS="${CFLAGS}" ..
|
||||||
|
make install DESTDIR=`pwd`/install
|
||||||
|
|
||||||
|
ret=$?
|
||||||
|
if [ $ret -ne 0 ]
|
||||||
|
then
|
||||||
|
exit $ret
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "${ARCH}" != "32" ] && [ `uname` = "Linux" ]
|
||||||
|
then
|
||||||
|
ctest -T memcheck | tee memcheck.log
|
||||||
|
|
||||||
|
ret=${PIPESTATUS[0]}
|
||||||
|
if [ $ret -ne 0 ]
|
||||||
|
then
|
||||||
|
exit $ret
|
||||||
|
fi
|
||||||
|
cat memcheck.log | grep "Memory Leak" > /dev/null
|
||||||
|
ret=$?
|
||||||
|
if [ $ret -eq 0 ]
|
||||||
|
then
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "${ARCH}" != "32" ]
|
||||||
|
then
|
||||||
|
mkdir install-test
|
||||||
|
|
||||||
|
ret=$?
|
||||||
|
if [ $ret -ne 0 ]
|
||||||
|
then
|
||||||
|
exit $ret
|
||||||
|
fi
|
||||||
|
|
||||||
|
cd install-test
|
||||||
|
|
||||||
|
ret=$?
|
||||||
|
if [ $ret -ne 0 ]
|
||||||
|
then
|
||||||
|
exit $ret
|
||||||
|
fi
|
||||||
|
|
||||||
|
cmake -DCMAKE_PREFIX_PATH=`pwd`/../install/usr/local/lib/cmake ../../example/cmake
|
||||||
|
|
||||||
|
ret=$?
|
||||||
|
if [ $ret -ne 0 ]
|
||||||
|
then
|
||||||
|
exit $ret
|
||||||
|
fi
|
||||||
|
|
||||||
|
make
|
||||||
|
|
||||||
|
ret=$?
|
||||||
|
if [ $ret -ne 0 ]
|
||||||
|
then
|
||||||
|
exit $ret
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
exit 0
|
||||||
59
ci/build_cmake_embedded.sh
Executable file
59
ci/build_cmake_embedded.sh
Executable file
@@ -0,0 +1,59 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
cd example/cmake
|
||||||
|
|
||||||
|
ret=$?
|
||||||
|
if [ $ret -ne 0 ]
|
||||||
|
then
|
||||||
|
exit $ret
|
||||||
|
fi
|
||||||
|
|
||||||
|
rm -f msgpack-c
|
||||||
|
|
||||||
|
ret=$?
|
||||||
|
if [ $ret -ne 0 ]
|
||||||
|
then
|
||||||
|
exit $ret
|
||||||
|
fi
|
||||||
|
|
||||||
|
ln -s ../.. msgpack-c
|
||||||
|
|
||||||
|
ret=$?
|
||||||
|
if [ $ret -ne 0 ]
|
||||||
|
then
|
||||||
|
exit $ret
|
||||||
|
fi
|
||||||
|
|
||||||
|
mkdir build
|
||||||
|
|
||||||
|
ret=$?
|
||||||
|
if [ $ret -ne 0 ]
|
||||||
|
then
|
||||||
|
exit $ret
|
||||||
|
fi
|
||||||
|
|
||||||
|
cd build
|
||||||
|
|
||||||
|
ret=$?
|
||||||
|
if [ $ret -ne 0 ]
|
||||||
|
then
|
||||||
|
exit $ret
|
||||||
|
fi
|
||||||
|
|
||||||
|
cmake -DEXAMPLE_MSGPACK_EMBEDDED=ON ..
|
||||||
|
|
||||||
|
ret=$?
|
||||||
|
if [ $ret -ne 0 ]
|
||||||
|
then
|
||||||
|
exit $ret
|
||||||
|
fi
|
||||||
|
|
||||||
|
make example example-static
|
||||||
|
|
||||||
|
ret=$?
|
||||||
|
if [ $ret -ne 0 ]
|
||||||
|
then
|
||||||
|
exit $ret
|
||||||
|
fi
|
||||||
|
|
||||||
|
exit 0
|
||||||
55
cmake/CodeCoverage.cmake
Normal file
55
cmake/CodeCoverage.cmake
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
# Check prereqs
|
||||||
|
FIND_PROGRAM(GCOV_PATH gcov)
|
||||||
|
FIND_PROGRAM(LCOV_PATH lcov)
|
||||||
|
FIND_PROGRAM(GENHTML_PATH genhtml)
|
||||||
|
|
||||||
|
IF(NOT GCOV_PATH)
|
||||||
|
MESSAGE(FATAL_ERROR "gcov not found! Aborting...")
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
|
IF(NOT CMAKE_COMPILER_IS_GNUCC AND NOT CMAKE_COMPILER_IS_GNUCXX)
|
||||||
|
# Clang version 3.0.0 and greater now supports gcov as well.
|
||||||
|
MESSAGE(STATUS "Compiler is not GNU gcc! Clang Version 3.0.0 and greater supports gcov as well, but older versions don't.")
|
||||||
|
IF(NOT "${CMAKE_C_COMPILER_ID}" MATCHES "Clang" AND NOT "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
|
||||||
|
MESSAGE(FATAL_ERROR "Compiler is not GNU gcc! Aborting...")
|
||||||
|
ENDIF()
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
|
SET(COVERAGE_FLAGS "-g -O0 --coverage")
|
||||||
|
|
||||||
|
FUNCTION(SETUP_TARGET_FOR_COVERAGE _targetname _testrunner _outputname)
|
||||||
|
|
||||||
|
IF(NOT LCOV_PATH)
|
||||||
|
MESSAGE(FATAL_ERROR "lcov not found! Aborting...")
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
|
IF(NOT GENHTML_PATH)
|
||||||
|
MESSAGE(FATAL_ERROR "genhtml not found! Aborting...")
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
|
# Setup target
|
||||||
|
ADD_CUSTOM_TARGET(${_targetname}
|
||||||
|
|
||||||
|
# Cleanup lcov
|
||||||
|
${LCOV_PATH} --directory . --zerocounters
|
||||||
|
|
||||||
|
# Run tests
|
||||||
|
COMMAND ${_testrunner} ${ARGV3}
|
||||||
|
|
||||||
|
# Capturing lcov counters and generating report
|
||||||
|
COMMAND ${LCOV_PATH} --directory . --capture --output-file ${_outputname}.info --base-directory ${CMAKE_SOURCE_DIR} --no-external --quiet
|
||||||
|
COMMAND ${LCOV_PATH} --remove ${_outputname}.info '*/test/*' '*/fuzz/*' --output-file ${_outputname}.info.cleaned --quiet
|
||||||
|
COMMAND ${GENHTML_PATH} -o ${_outputname} ${_outputname}.info.cleaned --prefix ${CMAKE_SOURCE_DIR}
|
||||||
|
# COMMAND ${CMAKE_COMMAND} -E remove ${_outputname}.info ${_outputname}.info.cleaned
|
||||||
|
|
||||||
|
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
|
||||||
|
COMMENT "Resetting code coverage counters to zero.\nProcessing code coverage counters and generating report."
|
||||||
|
)
|
||||||
|
|
||||||
|
# Show info where to find the report
|
||||||
|
ADD_CUSTOM_COMMAND(TARGET ${_targetname} POST_BUILD
|
||||||
|
COMMAND ;
|
||||||
|
COMMENT "Open ./${_outputname}/index.html in your browser to view the coverage report."
|
||||||
|
)
|
||||||
|
|
||||||
|
ENDFUNCTION()
|
||||||
952
cmake/pack_template.h.in
Normal file
952
cmake/pack_template.h.in
Normal file
@@ -0,0 +1,952 @@
|
|||||||
|
/*
|
||||||
|
* MessagePack packing routine template
|
||||||
|
*
|
||||||
|
* Copyright (C) 2008-2010 FURUHASHI Sadayuki
|
||||||
|
*
|
||||||
|
* Distributed under the Boost Software License, Version 1.0.
|
||||||
|
* (See accompanying file LICENSE_1_0.txt or copy at
|
||||||
|
* http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef MSGPACK_ENDIAN_BIG_BYTE
|
||||||
|
#define MSGPACK_ENDIAN_BIG_BYTE @MSGPACK_ENDIAN_BIG_BYTE@
|
||||||
|
#endif
|
||||||
|
#ifndef MSGPACK_ENDIAN_LITTLE_BYTE
|
||||||
|
#define MSGPACK_ENDIAN_LITTLE_BYTE @MSGPACK_ENDIAN_LITTLE_BYTE@
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if MSGPACK_ENDIAN_LITTLE_BYTE
|
||||||
|
#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 MSGPACK_ENDIAN_BIG_BYTE
|
||||||
|
#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]
|
||||||
|
#else
|
||||||
|
#error msgpack-c supports only big endian and little endian
|
||||||
|
#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
|
||||||
|
|
||||||
|
#if defined(_MSC_VER)
|
||||||
|
# pragma warning(push)
|
||||||
|
# pragma warning(disable : 4204) /* nonstandard extension used: non-constant aggregate initializer */
|
||||||
|
#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; _msgpack_store16(&buf[1], (uint16_t)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; _msgpack_store16(&buf[1], (uint16_t)d); \
|
||||||
|
msgpack_pack_append_buffer(x, buf, 3); \
|
||||||
|
} else { \
|
||||||
|
/* unsigned 32 */ \
|
||||||
|
unsigned char buf[5]; \
|
||||||
|
buf[0] = 0xce; _msgpack_store32(&buf[1], (uint32_t)d); \
|
||||||
|
msgpack_pack_append_buffer(x, buf, 5); \
|
||||||
|
} \
|
||||||
|
} \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
#define msgpack_pack_real_uint64(x, d) \
|
||||||
|
do { \
|
||||||
|
if(d < (1ULL<<8)) { \
|
||||||
|
if(d < (1ULL<<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)) { \
|
||||||
|
/* unsigned 16 */ \
|
||||||
|
unsigned char buf[3]; \
|
||||||
|
buf[0] = 0xcd; _msgpack_store16(&buf[1], (uint16_t)d); \
|
||||||
|
msgpack_pack_append_buffer(x, buf, 3); \
|
||||||
|
} else if(d < (1ULL<<32)) { \
|
||||||
|
/* unsigned 32 */ \
|
||||||
|
unsigned char buf[5]; \
|
||||||
|
buf[0] = 0xce; _msgpack_store32(&buf[1], (uint32_t)d); \
|
||||||
|
msgpack_pack_append_buffer(x, buf, 5); \
|
||||||
|
} else { \
|
||||||
|
/* unsigned 64 */ \
|
||||||
|
unsigned char buf[9]; \
|
||||||
|
buf[0] = 0xcf; _msgpack_store64(&buf[1], 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; _msgpack_store16(&buf[1], (int16_t)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; _msgpack_store16(&buf[1], (uint16_t)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; _msgpack_store32(&buf[1], (int32_t)d); \
|
||||||
|
msgpack_pack_append_buffer(x, buf, 5); \
|
||||||
|
} else if(d < -(1<<7)) { \
|
||||||
|
/* signed 16 */ \
|
||||||
|
unsigned char buf[3]; \
|
||||||
|
buf[0] = 0xd1; _msgpack_store16(&buf[1], (int16_t)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; _msgpack_store16(&buf[1], (uint16_t)d); \
|
||||||
|
msgpack_pack_append_buffer(x, buf, 3); \
|
||||||
|
} else { \
|
||||||
|
/* unsigned 32 */ \
|
||||||
|
unsigned char buf[5]; \
|
||||||
|
buf[0] = 0xce; _msgpack_store32(&buf[1], (uint32_t)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; _msgpack_store64(&buf[1], d); \
|
||||||
|
msgpack_pack_append_buffer(x, buf, 9); \
|
||||||
|
} else { \
|
||||||
|
/* signed 32 */ \
|
||||||
|
unsigned char buf[5]; \
|
||||||
|
buf[0] = 0xd2; _msgpack_store32(&buf[1], (int32_t)d); \
|
||||||
|
msgpack_pack_append_buffer(x, buf, 5); \
|
||||||
|
} \
|
||||||
|
} else { \
|
||||||
|
if(d < -(1<<7)) { \
|
||||||
|
/* signed 16 */ \
|
||||||
|
unsigned char buf[3]; \
|
||||||
|
buf[0] = 0xd1; _msgpack_store16(&buf[1], (int16_t)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; _msgpack_store16(&buf[1], (uint16_t)d); \
|
||||||
|
msgpack_pack_append_buffer(x, buf, 3); \
|
||||||
|
} \
|
||||||
|
} else { \
|
||||||
|
if(d < (1LL<<32)) { \
|
||||||
|
/* unsigned 32 */ \
|
||||||
|
unsigned char buf[5]; \
|
||||||
|
buf[0] = 0xce; _msgpack_store32(&buf[1], (uint32_t)d); \
|
||||||
|
msgpack_pack_append_buffer(x, buf, 5); \
|
||||||
|
} else { \
|
||||||
|
/* unsigned 64 */ \
|
||||||
|
unsigned char buf[9]; \
|
||||||
|
buf[0] = 0xcf; _msgpack_store64(&buf[1], d); \
|
||||||
|
msgpack_pack_append_buffer(x, buf, 9); \
|
||||||
|
} \
|
||||||
|
} \
|
||||||
|
} \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef msgpack_pack_inline_func_fixint
|
||||||
|
|
||||||
|
msgpack_pack_inline_func_fixint(_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_fixint(_uint16)(msgpack_pack_user x, uint16_t d)
|
||||||
|
{
|
||||||
|
unsigned char buf[3];
|
||||||
|
buf[0] = 0xcd; _msgpack_store16(&buf[1], d);
|
||||||
|
msgpack_pack_append_buffer(x, buf, 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
msgpack_pack_inline_func_fixint(_uint32)(msgpack_pack_user x, uint32_t d)
|
||||||
|
{
|
||||||
|
unsigned char buf[5];
|
||||||
|
buf[0] = 0xce; _msgpack_store32(&buf[1], d);
|
||||||
|
msgpack_pack_append_buffer(x, buf, 5);
|
||||||
|
}
|
||||||
|
|
||||||
|
msgpack_pack_inline_func_fixint(_uint64)(msgpack_pack_user x, uint64_t d)
|
||||||
|
{
|
||||||
|
unsigned char buf[9];
|
||||||
|
buf[0] = 0xcf; _msgpack_store64(&buf[1], d);
|
||||||
|
msgpack_pack_append_buffer(x, buf, 9);
|
||||||
|
}
|
||||||
|
|
||||||
|
msgpack_pack_inline_func_fixint(_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_fixint(_int16)(msgpack_pack_user x, int16_t d)
|
||||||
|
{
|
||||||
|
unsigned char buf[3];
|
||||||
|
buf[0] = 0xd1; _msgpack_store16(&buf[1], d);
|
||||||
|
msgpack_pack_append_buffer(x, buf, 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
msgpack_pack_inline_func_fixint(_int32)(msgpack_pack_user x, int32_t d)
|
||||||
|
{
|
||||||
|
unsigned char buf[5];
|
||||||
|
buf[0] = 0xd2; _msgpack_store32(&buf[1], d);
|
||||||
|
msgpack_pack_append_buffer(x, buf, 5);
|
||||||
|
}
|
||||||
|
|
||||||
|
msgpack_pack_inline_func_fixint(_int64)(msgpack_pack_user x, int64_t d)
|
||||||
|
{
|
||||||
|
unsigned char buf[9];
|
||||||
|
buf[0] = 0xd3; _msgpack_store64(&buf[1], d);
|
||||||
|
msgpack_pack_append_buffer(x, buf, 9);
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef msgpack_pack_inline_func_fixint
|
||||||
|
#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);
|
||||||
|
}
|
||||||
|
|
||||||
|
msgpack_pack_inline_func(_char)(msgpack_pack_user x, char d)
|
||||||
|
{
|
||||||
|
#if defined(CHAR_MIN)
|
||||||
|
#if CHAR_MIN < 0
|
||||||
|
msgpack_pack_real_int8(x, d);
|
||||||
|
#else
|
||||||
|
msgpack_pack_real_uint8(x, d);
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#error CHAR_MIN is not defined
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
msgpack_pack_inline_func(_signed_char)(msgpack_pack_user x, signed char d)
|
||||||
|
{
|
||||||
|
msgpack_pack_real_int8(x, d);
|
||||||
|
}
|
||||||
|
|
||||||
|
msgpack_pack_inline_func(_unsigned_char)(msgpack_pack_user x, unsigned char d)
|
||||||
|
{
|
||||||
|
msgpack_pack_real_uint8(x, d);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef msgpack_pack_inline_func_cint
|
||||||
|
|
||||||
|
msgpack_pack_inline_func_cint(_short)(msgpack_pack_user x, short d)
|
||||||
|
{
|
||||||
|
#if defined(SIZEOF_SHORT)
|
||||||
|
#if SIZEOF_SHORT == 2
|
||||||
|
msgpack_pack_real_int16(x, d);
|
||||||
|
#elif SIZEOF_SHORT == 4
|
||||||
|
msgpack_pack_real_int32(x, d);
|
||||||
|
#else
|
||||||
|
msgpack_pack_real_int64(x, d);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#elif defined(SHRT_MAX)
|
||||||
|
#if SHRT_MAX == 0x7fff
|
||||||
|
msgpack_pack_real_int16(x, d);
|
||||||
|
#elif 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)
|
||||||
|
#if SIZEOF_INT == 2
|
||||||
|
msgpack_pack_real_int16(x, d);
|
||||||
|
#elif SIZEOF_INT == 4
|
||||||
|
msgpack_pack_real_int32(x, d);
|
||||||
|
#else
|
||||||
|
msgpack_pack_real_int64(x, d);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#elif defined(INT_MAX)
|
||||||
|
#if INT_MAX == 0x7fff
|
||||||
|
msgpack_pack_real_int16(x, d);
|
||||||
|
#elif 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)
|
||||||
|
#if SIZEOF_LONG == 2
|
||||||
|
msgpack_pack_real_int16(x, d);
|
||||||
|
#elif SIZEOF_LONG == 4
|
||||||
|
msgpack_pack_real_int32(x, d);
|
||||||
|
#else
|
||||||
|
msgpack_pack_real_int64(x, d);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#elif defined(LONG_MAX)
|
||||||
|
#if LONG_MAX == 0x7fffL
|
||||||
|
msgpack_pack_real_int16(x, d);
|
||||||
|
#elif 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)
|
||||||
|
#if SIZEOF_LONG_LONG == 2
|
||||||
|
msgpack_pack_real_int16(x, d);
|
||||||
|
#elif SIZEOF_LONG_LONG == 4
|
||||||
|
msgpack_pack_real_int32(x, d);
|
||||||
|
#else
|
||||||
|
msgpack_pack_real_int64(x, d);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#elif defined(LLONG_MAX)
|
||||||
|
#if LLONG_MAX == 0x7fffL
|
||||||
|
msgpack_pack_real_int16(x, d);
|
||||||
|
#elif 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)
|
||||||
|
#if SIZEOF_SHORT == 2
|
||||||
|
msgpack_pack_real_uint16(x, d);
|
||||||
|
#elif SIZEOF_SHORT == 4
|
||||||
|
msgpack_pack_real_uint32(x, d);
|
||||||
|
#else
|
||||||
|
msgpack_pack_real_uint64(x, d);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#elif defined(USHRT_MAX)
|
||||||
|
#if USHRT_MAX == 0xffffU
|
||||||
|
msgpack_pack_real_uint16(x, d);
|
||||||
|
#elif 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)
|
||||||
|
#if SIZEOF_INT == 2
|
||||||
|
msgpack_pack_real_uint16(x, d);
|
||||||
|
#elif SIZEOF_INT == 4
|
||||||
|
msgpack_pack_real_uint32(x, d);
|
||||||
|
#else
|
||||||
|
msgpack_pack_real_uint64(x, d);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#elif defined(UINT_MAX)
|
||||||
|
#if UINT_MAX == 0xffffU
|
||||||
|
msgpack_pack_real_uint16(x, d);
|
||||||
|
#elif 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)
|
||||||
|
#if SIZEOF_LONG == 2
|
||||||
|
msgpack_pack_real_uint16(x, d);
|
||||||
|
#elif SIZEOF_LONG == 4
|
||||||
|
msgpack_pack_real_uint32(x, d);
|
||||||
|
#else
|
||||||
|
msgpack_pack_real_uint64(x, d);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#elif defined(ULONG_MAX)
|
||||||
|
#if ULONG_MAX == 0xffffUL
|
||||||
|
msgpack_pack_real_uint16(x, d);
|
||||||
|
#elif ULONG_MAX == 0xffffffffUL
|
||||||
|
msgpack_pack_real_uint32(x, d);
|
||||||
|
#else
|
||||||
|
msgpack_pack_real_uint64(x, d);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#else
|
||||||
|
if(sizeof(unsigned long) == 2) {
|
||||||
|
msgpack_pack_real_uint16(x, d);
|
||||||
|
} else if(sizeof(unsigned long) == 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)
|
||||||
|
#if SIZEOF_LONG_LONG == 2
|
||||||
|
msgpack_pack_real_uint16(x, d);
|
||||||
|
#elif SIZEOF_LONG_LONG == 4
|
||||||
|
msgpack_pack_real_uint32(x, d);
|
||||||
|
#else
|
||||||
|
msgpack_pack_real_uint64(x, d);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#elif defined(ULLONG_MAX)
|
||||||
|
#if ULLONG_MAX == 0xffffUL
|
||||||
|
msgpack_pack_real_uint16(x, d);
|
||||||
|
#elif 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)
|
||||||
|
{
|
||||||
|
unsigned char buf[5];
|
||||||
|
union { float f; uint32_t i; } mem;
|
||||||
|
mem.f = d;
|
||||||
|
buf[0] = 0xca; _msgpack_store32(&buf[1], mem.i);
|
||||||
|
msgpack_pack_append_buffer(x, buf, 5);
|
||||||
|
}
|
||||||
|
|
||||||
|
msgpack_pack_inline_func(_double)(msgpack_pack_user x, double d)
|
||||||
|
{
|
||||||
|
unsigned char buf[9];
|
||||||
|
union { double f; uint64_t i; } mem;
|
||||||
|
mem.f = d;
|
||||||
|
buf[0] = 0xcb;
|
||||||
|
#if defined(TARGET_OS_IPHONE)
|
||||||
|
// ok
|
||||||
|
#elif defined(__arm__) && !(__ARM_EABI__) // arm-oabi
|
||||||
|
// https://github.com/msgpack/msgpack-perl/pull/1
|
||||||
|
mem.i = (mem.i & 0xFFFFFFFFUL) << 32UL | (mem.i >> 32UL);
|
||||||
|
#endif
|
||||||
|
_msgpack_store64(&buf[1], mem.i);
|
||||||
|
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, size_t n)
|
||||||
|
{
|
||||||
|
if(n < 16) {
|
||||||
|
unsigned char d = 0x90 | (uint8_t)n;
|
||||||
|
msgpack_pack_append_buffer(x, &d, 1);
|
||||||
|
} else if(n < 65536) {
|
||||||
|
unsigned char buf[3];
|
||||||
|
buf[0] = 0xdc; _msgpack_store16(&buf[1], (uint16_t)n);
|
||||||
|
msgpack_pack_append_buffer(x, buf, 3);
|
||||||
|
} else {
|
||||||
|
unsigned char buf[5];
|
||||||
|
buf[0] = 0xdd; _msgpack_store32(&buf[1], (uint32_t)n);
|
||||||
|
msgpack_pack_append_buffer(x, buf, 5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Map
|
||||||
|
*/
|
||||||
|
|
||||||
|
msgpack_pack_inline_func(_map)(msgpack_pack_user x, size_t n)
|
||||||
|
{
|
||||||
|
if(n < 16) {
|
||||||
|
unsigned char d = 0x80 | (uint8_t)n;
|
||||||
|
msgpack_pack_append_buffer(x, &TAKE8_8(d), 1);
|
||||||
|
} else if(n < 65536) {
|
||||||
|
unsigned char buf[3];
|
||||||
|
buf[0] = 0xde; _msgpack_store16(&buf[1], (uint16_t)n);
|
||||||
|
msgpack_pack_append_buffer(x, buf, 3);
|
||||||
|
} else {
|
||||||
|
unsigned char buf[5];
|
||||||
|
buf[0] = 0xdf; _msgpack_store32(&buf[1], (uint32_t)n);
|
||||||
|
msgpack_pack_append_buffer(x, buf, 5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Str
|
||||||
|
*/
|
||||||
|
|
||||||
|
msgpack_pack_inline_func(_str)(msgpack_pack_user x, size_t l)
|
||||||
|
{
|
||||||
|
if(l < 32) {
|
||||||
|
unsigned char d = 0xa0 | (uint8_t)l;
|
||||||
|
msgpack_pack_append_buffer(x, &TAKE8_8(d), 1);
|
||||||
|
} else if(l < 256) {
|
||||||
|
unsigned char buf[2];
|
||||||
|
buf[0] = 0xd9; buf[1] = (uint8_t)l;
|
||||||
|
msgpack_pack_append_buffer(x, buf, 2);
|
||||||
|
} else if(l < 65536) {
|
||||||
|
unsigned char buf[3];
|
||||||
|
buf[0] = 0xda; _msgpack_store16(&buf[1], (uint16_t)l);
|
||||||
|
msgpack_pack_append_buffer(x, buf, 3);
|
||||||
|
} else {
|
||||||
|
unsigned char buf[5];
|
||||||
|
buf[0] = 0xdb; _msgpack_store32(&buf[1], (uint32_t)l);
|
||||||
|
msgpack_pack_append_buffer(x, buf, 5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
msgpack_pack_inline_func(_str_body)(msgpack_pack_user x, const void* b, size_t l)
|
||||||
|
{
|
||||||
|
msgpack_pack_append_buffer(x, (const unsigned char*)b, l);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Raw (V4)
|
||||||
|
*/
|
||||||
|
|
||||||
|
msgpack_pack_inline_func(_v4raw)(msgpack_pack_user x, size_t l)
|
||||||
|
{
|
||||||
|
if(l < 32) {
|
||||||
|
unsigned char d = 0xa0 | (uint8_t)l;
|
||||||
|
msgpack_pack_append_buffer(x, &TAKE8_8(d), 1);
|
||||||
|
} else if(l < 65536) {
|
||||||
|
unsigned char buf[3];
|
||||||
|
buf[0] = 0xda; _msgpack_store16(&buf[1], (uint16_t)l);
|
||||||
|
msgpack_pack_append_buffer(x, buf, 3);
|
||||||
|
} else {
|
||||||
|
unsigned char buf[5];
|
||||||
|
buf[0] = 0xdb; _msgpack_store32(&buf[1], (uint32_t)l);
|
||||||
|
msgpack_pack_append_buffer(x, buf, 5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
msgpack_pack_inline_func(_v4raw_body)(msgpack_pack_user x, const void* b, size_t l)
|
||||||
|
{
|
||||||
|
msgpack_pack_append_buffer(x, (const unsigned char*)b, l);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Bin
|
||||||
|
*/
|
||||||
|
|
||||||
|
msgpack_pack_inline_func(_bin)(msgpack_pack_user x, size_t l)
|
||||||
|
{
|
||||||
|
if(l < 256) {
|
||||||
|
unsigned char buf[2];
|
||||||
|
buf[0] = 0xc4; buf[1] = (uint8_t)l;
|
||||||
|
msgpack_pack_append_buffer(x, buf, 2);
|
||||||
|
} else if(l < 65536) {
|
||||||
|
unsigned char buf[3];
|
||||||
|
buf[0] = 0xc5; _msgpack_store16(&buf[1], (uint16_t)l);
|
||||||
|
msgpack_pack_append_buffer(x, buf, 3);
|
||||||
|
} else {
|
||||||
|
unsigned char buf[5];
|
||||||
|
buf[0] = 0xc6; _msgpack_store32(&buf[1], (uint32_t)l);
|
||||||
|
msgpack_pack_append_buffer(x, buf, 5);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
msgpack_pack_inline_func(_bin_body)(msgpack_pack_user x, const void* b, size_t l)
|
||||||
|
{
|
||||||
|
msgpack_pack_append_buffer(x, (const unsigned char*)b, l);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Ext
|
||||||
|
*/
|
||||||
|
|
||||||
|
msgpack_pack_inline_func(_ext)(msgpack_pack_user x, size_t l, int8_t type)
|
||||||
|
{
|
||||||
|
switch(l) {
|
||||||
|
case 1: {
|
||||||
|
unsigned char buf[2];
|
||||||
|
buf[0] = 0xd4;
|
||||||
|
buf[1] = (unsigned char)type;
|
||||||
|
msgpack_pack_append_buffer(x, buf, 2);
|
||||||
|
} break;
|
||||||
|
case 2: {
|
||||||
|
unsigned char buf[2];
|
||||||
|
buf[0] = 0xd5;
|
||||||
|
buf[1] = (unsigned char)type;
|
||||||
|
msgpack_pack_append_buffer(x, buf, 2);
|
||||||
|
} break;
|
||||||
|
case 4: {
|
||||||
|
unsigned char buf[2];
|
||||||
|
buf[0] = 0xd6;
|
||||||
|
buf[1] = (unsigned char)type;
|
||||||
|
msgpack_pack_append_buffer(x, buf, 2);
|
||||||
|
} break;
|
||||||
|
case 8: {
|
||||||
|
unsigned char buf[2];
|
||||||
|
buf[0] = 0xd7;
|
||||||
|
buf[1] = (unsigned char)type;
|
||||||
|
msgpack_pack_append_buffer(x, buf, 2);
|
||||||
|
} break;
|
||||||
|
case 16: {
|
||||||
|
unsigned char buf[2];
|
||||||
|
buf[0] = 0xd8;
|
||||||
|
buf[1] = (unsigned char)type;
|
||||||
|
msgpack_pack_append_buffer(x, buf, 2);
|
||||||
|
} break;
|
||||||
|
default:
|
||||||
|
if(l < 256) {
|
||||||
|
unsigned char buf[3];
|
||||||
|
buf[0] = 0xc7;
|
||||||
|
buf[1] = (unsigned char)l;
|
||||||
|
buf[2] = (unsigned char)type;
|
||||||
|
msgpack_pack_append_buffer(x, buf, 3);
|
||||||
|
} else if(l < 65536) {
|
||||||
|
unsigned char buf[4];
|
||||||
|
buf[0] = 0xc8;
|
||||||
|
_msgpack_store16(&buf[1], l);
|
||||||
|
buf[3] = (unsigned char)type;
|
||||||
|
msgpack_pack_append_buffer(x, buf, 4);
|
||||||
|
} else {
|
||||||
|
unsigned char buf[6];
|
||||||
|
buf[0] = 0xc9;
|
||||||
|
_msgpack_store32(&buf[1], l);
|
||||||
|
buf[5] = (unsigned char)type;
|
||||||
|
msgpack_pack_append_buffer(x, buf, 6);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
msgpack_pack_inline_func(_ext_body)(msgpack_pack_user x, const void* b, size_t l)
|
||||||
|
{
|
||||||
|
msgpack_pack_append_buffer(x, (const unsigned char*)b, l);
|
||||||
|
}
|
||||||
|
|
||||||
|
msgpack_pack_inline_func(_timestamp)(msgpack_pack_user x, const msgpack_timestamp* d)
|
||||||
|
{
|
||||||
|
if ((((int64_t)d->tv_sec) >> 34) == 0) {
|
||||||
|
uint64_t data64 = ((uint64_t) d->tv_nsec << 34) | (uint64_t)d->tv_sec;
|
||||||
|
if ((data64 & 0xffffffff00000000L) == 0) {
|
||||||
|
// timestamp 32
|
||||||
|
char buf[4];
|
||||||
|
uint32_t data32 = (uint32_t)data64;
|
||||||
|
msgpack_pack_ext(x, 4, -1);
|
||||||
|
_msgpack_store32(buf, data32);
|
||||||
|
msgpack_pack_append_buffer(x, buf, 4);
|
||||||
|
} else {
|
||||||
|
// timestamp 64
|
||||||
|
char buf[8];
|
||||||
|
msgpack_pack_ext(x, 8, -1);
|
||||||
|
_msgpack_store64(buf, data64);
|
||||||
|
msgpack_pack_append_buffer(x, buf, 8);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// timestamp 96
|
||||||
|
char buf[12];
|
||||||
|
_msgpack_store32(&buf[0], d->tv_nsec);
|
||||||
|
_msgpack_store64(&buf[4], d->tv_sec);
|
||||||
|
msgpack_pack_ext(x, 12, -1);
|
||||||
|
msgpack_pack_append_buffer(x, buf, 12);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#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
|
||||||
|
|
||||||
|
#if defined(_MSC_VER)
|
||||||
|
# pragma warning(pop)
|
||||||
|
#endif
|
||||||
228
cmake/sysdep.h.in
Normal file
228
cmake/sysdep.h.in
Normal file
@@ -0,0 +1,228 @@
|
|||||||
|
/*
|
||||||
|
* MessagePack system dependencies
|
||||||
|
*
|
||||||
|
* Copyright (C) 2008-2010 FURUHASHI Sadayuki
|
||||||
|
*
|
||||||
|
* Distributed under the Boost Software License, Version 1.0.
|
||||||
|
* (See accompanying file LICENSE_1_0.txt or copy at
|
||||||
|
* http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
*/
|
||||||
|
#ifndef MSGPACK_SYSDEP_H
|
||||||
|
#define MSGPACK_SYSDEP_H
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
#ifndef MSGPACK_ENDIAN_BIG_BYTE
|
||||||
|
#define MSGPACK_ENDIAN_BIG_BYTE @MSGPACK_ENDIAN_BIG_BYTE@
|
||||||
|
#endif
|
||||||
|
#ifndef MSGPACK_ENDIAN_LITTLE_BYTE
|
||||||
|
#define MSGPACK_ENDIAN_LITTLE_BYTE @MSGPACK_ENDIAN_LITTLE_BYTE@
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(_MSC_VER) && _MSC_VER <= 1800
|
||||||
|
# define snprintf(buf, len, format,...) _snprintf_s(buf, len, _TRUNCATE, format, __VA_ARGS__)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(_MSC_VER) && _MSC_VER < 1600
|
||||||
|
typedef signed __int8 int8_t;
|
||||||
|
typedef unsigned __int8 uint8_t;
|
||||||
|
typedef signed __int16 int16_t;
|
||||||
|
typedef unsigned __int16 uint16_t;
|
||||||
|
typedef signed __int32 int32_t;
|
||||||
|
typedef unsigned __int32 uint32_t;
|
||||||
|
typedef signed __int64 int64_t;
|
||||||
|
typedef unsigned __int64 uint64_t;
|
||||||
|
# if defined(_WIN64)
|
||||||
|
typedef signed __int64 intptr_t;
|
||||||
|
typedef unsigned __int64 uintptr_t;
|
||||||
|
# else
|
||||||
|
typedef signed __int32 intptr_t;
|
||||||
|
typedef unsigned __int32 uintptr_t;
|
||||||
|
# endif
|
||||||
|
#elif defined(_MSC_VER) // && _MSC_VER >= 1600
|
||||||
|
# include <stdint.h>
|
||||||
|
#else
|
||||||
|
# include <stdint.h>
|
||||||
|
# include <stdbool.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(MSGPACK_DLLEXPORT)
|
||||||
|
#if defined(_MSC_VER)
|
||||||
|
# define MSGPACK_DLLEXPORT __declspec(dllexport)
|
||||||
|
#else /* _MSC_VER */
|
||||||
|
# define MSGPACK_DLLEXPORT
|
||||||
|
#endif /* _MSC_VER */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
# if defined(_KERNEL_MODE)
|
||||||
|
# define _msgpack_atomic_counter_header <ntddk.h>
|
||||||
|
# else
|
||||||
|
# define _msgpack_atomic_counter_header <windows.h>
|
||||||
|
# if !defined(WIN32_LEAN_AND_MEAN)
|
||||||
|
# define WIN32_LEAN_AND_MEAN
|
||||||
|
# endif /* WIN32_LEAN_AND_MEAN */
|
||||||
|
# endif
|
||||||
|
typedef long _msgpack_atomic_counter_t;
|
||||||
|
#if defined(_AMD64_) || defined(_M_X64) || defined(_M_ARM64)
|
||||||
|
# define _msgpack_sync_decr_and_fetch(ptr) _InterlockedDecrement(ptr)
|
||||||
|
# define _msgpack_sync_incr_and_fetch(ptr) _InterlockedIncrement(ptr)
|
||||||
|
#else
|
||||||
|
# define _msgpack_sync_decr_and_fetch(ptr) InterlockedDecrement(ptr)
|
||||||
|
# define _msgpack_sync_incr_and_fetch(ptr) InterlockedIncrement(ptr)
|
||||||
|
#endif
|
||||||
|
#elif defined(__GNUC__) && ((__GNUC__*10 + __GNUC_MINOR__) < 41)
|
||||||
|
|
||||||
|
# if defined(__cplusplus)
|
||||||
|
# define _msgpack_atomic_counter_header "msgpack/gcc_atomic.hpp"
|
||||||
|
# else
|
||||||
|
# define _msgpack_atomic_counter_header "msgpack/gcc_atomic.h"
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#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
|
||||||
|
|
||||||
|
# ifdef __cplusplus
|
||||||
|
/* numeric_limits<T>::min,max */
|
||||||
|
# ifdef max
|
||||||
|
# undef max
|
||||||
|
# endif
|
||||||
|
# ifdef min
|
||||||
|
# undef min
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#elif defined(unix) || defined(__unix) || defined(__APPLE__) || defined(__OpenBSD__)
|
||||||
|
|
||||||
|
#include <arpa/inet.h> /* __BYTE_ORDER */
|
||||||
|
# if defined(linux)
|
||||||
|
# include <byteswap.h>
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(MSGPACK_ENDIAN_LITTLE_BYTE) && !defined(MSGPACK_ENDIAN_BIG_BYTE)
|
||||||
|
#include <msgpack/predef/other/endian.h>
|
||||||
|
#endif // !defined(MSGPACK_ENDIAN_LITTLE_BYTE) && !defined(MSGPACK_ENDIAN_BIG_BYTE)
|
||||||
|
|
||||||
|
#if MSGPACK_ENDIAN_LITTLE_BYTE
|
||||||
|
|
||||||
|
# if defined(unix) || defined(__unix) || defined(__APPLE__) || defined(__OpenBSD__)
|
||||||
|
# define _msgpack_be16(x) ntohs((uint16_t)x)
|
||||||
|
# else
|
||||||
|
# if defined(ntohs)
|
||||||
|
# define _msgpack_be16(x) ntohs(x)
|
||||||
|
# elif defined(_byteswap_ushort) || (defined(_MSC_VER) && _MSC_VER >= 1400)
|
||||||
|
# define _msgpack_be16(x) ((uint16_t)_byteswap_ushort((unsigned short)x))
|
||||||
|
# else
|
||||||
|
# define _msgpack_be16(x) ( \
|
||||||
|
((((uint16_t)x) << 8) ) | \
|
||||||
|
((((uint16_t)x) >> 8) ) )
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# if defined(unix) || defined(__unix) || defined(__APPLE__) || defined(__OpenBSD__)
|
||||||
|
# define _msgpack_be32(x) ntohl((uint32_t)x)
|
||||||
|
# else
|
||||||
|
# if defined(ntohl)
|
||||||
|
# define _msgpack_be32(x) ntohl(x)
|
||||||
|
# elif defined(_byteswap_ulong) || (defined(_MSC_VER) && _MSC_VER >= 1400)
|
||||||
|
# define _msgpack_be32(x) ((uint32_t)_byteswap_ulong((unsigned long)x))
|
||||||
|
# else
|
||||||
|
# define _msgpack_be32(x) \
|
||||||
|
( ((((uint32_t)x) << 24) ) | \
|
||||||
|
((((uint32_t)x) << 8) & 0x00ff0000U ) | \
|
||||||
|
((((uint32_t)x) >> 8) & 0x0000ff00U ) | \
|
||||||
|
((((uint32_t)x) >> 24) ) )
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# if defined(_byteswap_uint64) || (defined(_MSC_VER) && _MSC_VER >= 1400)
|
||||||
|
# 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) ) | \
|
||||||
|
((((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) ) )
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#elif MSGPACK_ENDIAN_BIG_BYTE
|
||||||
|
|
||||||
|
# define _msgpack_be16(x) (x)
|
||||||
|
# define _msgpack_be32(x) (x)
|
||||||
|
# define _msgpack_be64(x) (x)
|
||||||
|
|
||||||
|
#else
|
||||||
|
# error msgpack-c supports only big endian and little endian
|
||||||
|
#endif /* MSGPACK_ENDIAN_LITTLE_BYTE */
|
||||||
|
|
||||||
|
#define _msgpack_load16(cast, from, to) do { \
|
||||||
|
memcpy((cast*)(to), (from), sizeof(cast)); \
|
||||||
|
*(to) = (cast)_msgpack_be16(*(to)); \
|
||||||
|
} while (0);
|
||||||
|
|
||||||
|
#define _msgpack_load32(cast, from, to) do { \
|
||||||
|
memcpy((cast*)(to), (from), sizeof(cast)); \
|
||||||
|
*(to) = (cast)_msgpack_be32(*(to)); \
|
||||||
|
} while (0);
|
||||||
|
#define _msgpack_load64(cast, from, to) do { \
|
||||||
|
memcpy((cast*)(to), (from), sizeof(cast)); \
|
||||||
|
*(to) = (cast)_msgpack_be64(*(to)); \
|
||||||
|
} while (0);
|
||||||
|
|
||||||
|
#define _msgpack_store16(to, num) \
|
||||||
|
do { uint16_t val = _msgpack_be16(num); memcpy(to, &val, 2); } while(0)
|
||||||
|
#define _msgpack_store32(to, num) \
|
||||||
|
do { uint32_t val = _msgpack_be32(num); memcpy(to, &val, 4); } while(0)
|
||||||
|
#define _msgpack_store64(to, num) \
|
||||||
|
do { uint64_t val = _msgpack_be64(num); memcpy(to, &val, 8); } while(0)
|
||||||
|
|
||||||
|
/*
|
||||||
|
#define _msgpack_load16(cast, from) \
|
||||||
|
({ cast val; memcpy(&val, (char*)from, 2); _msgpack_be16(val); })
|
||||||
|
#define _msgpack_load32(cast, from) \
|
||||||
|
({ cast val; memcpy(&val, (char*)from, 4); _msgpack_be32(val); })
|
||||||
|
#define _msgpack_load64(cast, from) \
|
||||||
|
({ cast val; memcpy(&val, (char*)from, 8); _msgpack_be64(val); })
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#if !defined(__cplusplus) && defined(_MSC_VER)
|
||||||
|
# if !defined(_KERNEL_MODE)
|
||||||
|
# if !defined(FALSE)
|
||||||
|
# define FALSE (0)
|
||||||
|
# endif
|
||||||
|
# if !defined(TRUE)
|
||||||
|
# define TRUE (!FALSE)
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
# if _MSC_VER >= 1800
|
||||||
|
# include <stdbool.h>
|
||||||
|
# else
|
||||||
|
# define bool int
|
||||||
|
# define true TRUE
|
||||||
|
# define false FALSE
|
||||||
|
# endif
|
||||||
|
# define inline __inline
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __APPLE__
|
||||||
|
# include <TargetConditionals.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* msgpack/sysdep.h */
|
||||||
36
codecov.yml
Normal file
36
codecov.yml
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
codecov:
|
||||||
|
notify:
|
||||||
|
require_ci_to_pass: yes
|
||||||
|
|
||||||
|
coverage:
|
||||||
|
precision: 2
|
||||||
|
round: down
|
||||||
|
range: "70...100"
|
||||||
|
|
||||||
|
status:
|
||||||
|
project: yes
|
||||||
|
patch: yes
|
||||||
|
changes: no
|
||||||
|
|
||||||
|
parsers:
|
||||||
|
gcov:
|
||||||
|
branch_detection:
|
||||||
|
conditional: yes
|
||||||
|
loop: yes
|
||||||
|
method: no
|
||||||
|
macro: no
|
||||||
|
|
||||||
|
comment:
|
||||||
|
layout: "header, diff"
|
||||||
|
behavior: default
|
||||||
|
require_changes: no
|
||||||
|
|
||||||
|
ignore:
|
||||||
|
- "test"
|
||||||
|
- "fuzz"
|
||||||
|
- "erb"
|
||||||
|
- "ci"
|
||||||
|
- "cmake"
|
||||||
|
- "examle"
|
||||||
|
- "external"
|
||||||
|
- "usr"
|
||||||
44
configure.in
44
configure.in
@@ -1,44 +0,0 @@
|
|||||||
AC_INIT(msgpack/unpack_template.h)
|
|
||||||
AC_CONFIG_AUX_DIR(ac)
|
|
||||||
AM_INIT_AUTOMAKE(msgpack, 0.3.5)
|
|
||||||
AC_CONFIG_HEADER(config.h)
|
|
||||||
|
|
||||||
AC_SUBST(CFLAGS)
|
|
||||||
if test "" = "$CFLAGS"; then
|
|
||||||
CFLAGS="-g -O4"
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_PROG_CC
|
|
||||||
|
|
||||||
CFLAGS="-O4 -Wall $CFLAGS -I.."
|
|
||||||
|
|
||||||
|
|
||||||
AC_MSG_CHECKING([if c++ api is enabled])
|
|
||||||
AC_ARG_ENABLE(cxx,
|
|
||||||
AS_HELP_STRING([--disable-cxx],
|
|
||||||
[don't build c++ api.]) )
|
|
||||||
AC_MSG_RESULT($enable_cxx)
|
|
||||||
if test "$enable_cxx" != "no"; then
|
|
||||||
AC_SUBST(CXXFLAGS)
|
|
||||||
if test "" = "$CXXFLAGS"; then
|
|
||||||
CXXFLAGS="-g -O4"
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_CHECK_PROG(ERB, erb, erb)
|
|
||||||
if test "x$ERB" = x; then
|
|
||||||
AC_MSG_ERROR([cannot find erb. Ruby is needed to build.])
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# FIXME
|
|
||||||
AC_PROG_CXX
|
|
||||||
|
|
||||||
CXXFLAGS="-O4 -Wall $CXXFLAGS -I.. -I../c"
|
|
||||||
|
|
||||||
|
|
||||||
AM_CONDITIONAL(ENABLE_CXX, test "$enable_cxx" != "no")
|
|
||||||
|
|
||||||
AC_PROG_LIBTOOL
|
|
||||||
|
|
||||||
AC_OUTPUT([Makefile c/Makefile cpp/Makefile])
|
|
||||||
|
|
||||||
@@ -1,54 +0,0 @@
|
|||||||
lib_LTLIBRARIES = libmsgpack.la
|
|
||||||
|
|
||||||
libmsgpack_la_SOURCES = \
|
|
||||||
object.cpp
|
|
||||||
|
|
||||||
nobase_include_HEADERS = \
|
|
||||||
msgpack.hpp \
|
|
||||||
msgpack/sbuffer.hpp \
|
|
||||||
msgpack/vrefbuffer.hpp \
|
|
||||||
msgpack/pack.hpp \
|
|
||||||
msgpack/unpack.hpp \
|
|
||||||
msgpack/object.hpp \
|
|
||||||
msgpack/zone.hpp \
|
|
||||||
msgpack/type.hpp \
|
|
||||||
msgpack/type/array.hpp \
|
|
||||||
msgpack/type/boolean.hpp \
|
|
||||||
msgpack/type/float.hpp \
|
|
||||||
msgpack/type/integer.hpp \
|
|
||||||
msgpack/type/map.hpp \
|
|
||||||
msgpack/type/nil.hpp \
|
|
||||||
msgpack/type/raw.hpp \
|
|
||||||
msgpack/type/tuple.hpp \
|
|
||||||
msgpack/type/define.hpp
|
|
||||||
|
|
||||||
# FIXME
|
|
||||||
object.lo: msgpack/type/tuple.hpp msgpack/zone.hpp
|
|
||||||
|
|
||||||
msgpack/type/tuple.hpp: msgpack/type/tuple.hpp.erb
|
|
||||||
$(ERB) $< > $@.tmp
|
|
||||||
mv $@.tmp $@
|
|
||||||
|
|
||||||
msgpack/type/define.hpp: msgpack/type/define.hpp.erb
|
|
||||||
$(ERB) $< > $@.tmp
|
|
||||||
mv $@.tmp $@
|
|
||||||
|
|
||||||
msgpack/zone.hpp: msgpack/zone.hpp.erb
|
|
||||||
$(ERB) $< > $@.tmp
|
|
||||||
mv $@.tmp $@
|
|
||||||
|
|
||||||
MOSTLYCLEANFILES = \
|
|
||||||
msgpack/type/tuple.hpp \
|
|
||||||
msgpack/type/define.hpp \
|
|
||||||
msgpack/zone.hpp
|
|
||||||
|
|
||||||
EXTRA_DIST = \
|
|
||||||
msgpack/type/tuple.hpp.erb \
|
|
||||||
msgpack/type/define.hpp.erb \
|
|
||||||
msgpack/zone.hpp.erb
|
|
||||||
|
|
||||||
libmsgpack_la_LIBADD = -L../c -lmsgpackc
|
|
||||||
|
|
||||||
# -version-info CURRENT:REVISION:AGE
|
|
||||||
libmsgpack_la_LDFLAGS = -version-info 1:0:0
|
|
||||||
|
|
||||||
188
cpp/bench.cpp
188
cpp/bench.cpp
@@ -1,188 +0,0 @@
|
|||||||
#include <msgpack/unpack.hpp>
|
|
||||||
#include <msgpack/pack.hpp>
|
|
||||||
#include <string.h>
|
|
||||||
#include <sys/time.h>
|
|
||||||
#include <iostream>
|
|
||||||
#include <stdexcept>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
static const unsigned int TASK_INT_NUM = 1<<24;
|
|
||||||
static const unsigned int TASK_STR_LEN = 1<<15;
|
|
||||||
//static const unsigned int TASK_INT_NUM = 1<<22;
|
|
||||||
//static const unsigned int TASK_STR_LEN = 1<<13;
|
|
||||||
static const char* TASK_STR_PTR;
|
|
||||||
|
|
||||||
|
|
||||||
class simple_timer {
|
|
||||||
public:
|
|
||||||
void reset() { gettimeofday(&m_timeval, NULL); }
|
|
||||||
void show_stat(size_t bufsz)
|
|
||||||
{
|
|
||||||
struct timeval endtime;
|
|
||||||
gettimeofday(&endtime, NULL);
|
|
||||||
double sec = (endtime.tv_sec - m_timeval.tv_sec)
|
|
||||||
+ (double)(endtime.tv_usec - m_timeval.tv_usec) / 1000 / 1000;
|
|
||||||
std::cout << sec << " sec" << std::endl;
|
|
||||||
std::cout << (double(bufsz)/1024/1024) << " MB" << std::endl;
|
|
||||||
std::cout << (bufsz/sec/1000/1000*8) << " Mbps" << std::endl;
|
|
||||||
}
|
|
||||||
private:
|
|
||||||
timeval m_timeval;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
class simple_buffer {
|
|
||||||
public:
|
|
||||||
static const size_t DEFAULT_INITIAL_SIZE = 32*1024;//512*1024*1024*2;
|
|
||||||
|
|
||||||
simple_buffer(size_t initial_size = DEFAULT_INITIAL_SIZE) :
|
|
||||||
m_storage((char*)malloc(initial_size)),
|
|
||||||
m_allocated(initial_size),
|
|
||||||
m_used(0)
|
|
||||||
{
|
|
||||||
if(!m_storage) { throw std::bad_alloc(); }
|
|
||||||
}
|
|
||||||
|
|
||||||
~simple_buffer()
|
|
||||||
{
|
|
||||||
free(m_storage);
|
|
||||||
}
|
|
||||||
|
|
||||||
public:
|
|
||||||
inline void write(const char* buf, size_t len)
|
|
||||||
{
|
|
||||||
if(m_allocated - m_used < len) {
|
|
||||||
expand_buffer(len);
|
|
||||||
}
|
|
||||||
memcpy(m_storage + m_used, buf, len);
|
|
||||||
m_used += len;
|
|
||||||
}
|
|
||||||
|
|
||||||
void clear()
|
|
||||||
{
|
|
||||||
m_used = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
void expand_buffer(size_t req)
|
|
||||||
{
|
|
||||||
size_t nsize = m_allocated * 2;
|
|
||||||
size_t at_least = m_used + req;
|
|
||||||
while(nsize < at_least) { nsize *= 2; }
|
|
||||||
char* tmp = (char*)realloc(m_storage, nsize);
|
|
||||||
if(!tmp) { throw std::bad_alloc(); }
|
|
||||||
m_storage = tmp;
|
|
||||||
m_allocated = nsize;
|
|
||||||
}
|
|
||||||
|
|
||||||
public:
|
|
||||||
size_t size() const { return m_used; }
|
|
||||||
const char* data() const { return m_storage; }
|
|
||||||
|
|
||||||
private:
|
|
||||||
char* m_storage;
|
|
||||||
size_t m_allocated;
|
|
||||||
size_t m_used;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
void bench_msgpack_int()
|
|
||||||
{
|
|
||||||
simple_buffer buf;
|
|
||||||
simple_timer timer;
|
|
||||||
|
|
||||||
std::cout << "----" << std::endl;
|
|
||||||
std::cout << "pack integer" << std::endl;
|
|
||||||
|
|
||||||
timer.reset();
|
|
||||||
{
|
|
||||||
msgpack::packer<simple_buffer> pk(buf);
|
|
||||||
pk.pack_array(TASK_INT_NUM);
|
|
||||||
for(unsigned int i=0; i < TASK_INT_NUM; ++i) {
|
|
||||||
pk.pack_unsigned_int(i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
timer.show_stat(buf.size());
|
|
||||||
|
|
||||||
|
|
||||||
std::cout << "----" << std::endl;
|
|
||||||
std::cout << "unpack integer" << std::endl;
|
|
||||||
|
|
||||||
msgpack::zone z;
|
|
||||||
msgpack::object obj;
|
|
||||||
|
|
||||||
timer.reset();
|
|
||||||
{
|
|
||||||
obj = msgpack::unpack(buf.data(), buf.size(), z);
|
|
||||||
}
|
|
||||||
timer.show_stat(buf.size());
|
|
||||||
|
|
||||||
/*
|
|
||||||
std::cout << "----" << std::endl;
|
|
||||||
std::cout << "dynamic pack integer" << std::endl;
|
|
||||||
|
|
||||||
buf.clear();
|
|
||||||
|
|
||||||
timer.reset();
|
|
||||||
msgpack::pack(buf, obj);
|
|
||||||
timer.show_stat(buf.size());
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
|
|
||||||
void bench_msgpack_str()
|
|
||||||
{
|
|
||||||
simple_buffer buf;
|
|
||||||
simple_timer timer;
|
|
||||||
|
|
||||||
std::cout << "----" << std::endl;
|
|
||||||
std::cout << "pack string" << std::endl;
|
|
||||||
|
|
||||||
timer.reset();
|
|
||||||
{
|
|
||||||
msgpack::packer<simple_buffer> pk(buf);
|
|
||||||
pk.pack_array(TASK_STR_LEN);
|
|
||||||
for(unsigned int i=0; i < TASK_STR_LEN; ++i) {
|
|
||||||
pk.pack_raw(i);
|
|
||||||
pk.pack_raw_body(TASK_STR_PTR, i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
timer.show_stat(buf.size());
|
|
||||||
|
|
||||||
|
|
||||||
std::cout << "----" << std::endl;
|
|
||||||
std::cout << "unpack string" << std::endl;
|
|
||||||
|
|
||||||
msgpack::zone z;
|
|
||||||
msgpack::object obj;
|
|
||||||
|
|
||||||
timer.reset();
|
|
||||||
{
|
|
||||||
obj = msgpack::unpack(buf.data(), buf.size(), z);
|
|
||||||
}
|
|
||||||
timer.show_stat(buf.size());
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
std::cout << "----" << std::endl;
|
|
||||||
std::cout << "dynamic pack string" << std::endl;
|
|
||||||
|
|
||||||
buf.clear();
|
|
||||||
|
|
||||||
timer.reset();
|
|
||||||
msgpack::pack(buf, obj);
|
|
||||||
timer.show_stat(buf.size());
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
char* str = (char*)malloc(TASK_STR_LEN);
|
|
||||||
memset(str, 'a', TASK_STR_LEN);
|
|
||||||
TASK_STR_PTR = str;
|
|
||||||
|
|
||||||
bench_msgpack_int();
|
|
||||||
bench_msgpack_str();
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
|
|
||||||
CXXFLAGS += -Wall -g -I. -I.. -O4
|
|
||||||
LDFLAGS +=
|
|
||||||
|
|
||||||
all: bench
|
|
||||||
|
|
||||||
bench: bench.o unpack.o zone.o object.o pack.hpp unpack.hpp zone.hpp object.hpp
|
|
||||||
$(CXX) bench.o unpack.o zone.o object.o $(CXXFLAGS) $(LDFLAGS) -o $@
|
|
||||||
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
.
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++
|
|
||||||
//
|
|
||||||
// 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.
|
|
||||||
//
|
|
||||||
#include "msgpack/object.hpp"
|
|
||||||
#include "msgpack/zone.hpp"
|
|
||||||
#include "msgpack/pack.hpp"
|
|
||||||
#include "msgpack/unpack.hpp"
|
|
||||||
#include "msgpack/sbuffer.hpp"
|
|
||||||
#include "msgpack/vrefbuffer.hpp"
|
|
||||||
#include "msgpack.h"
|
|
||||||
139
cpp/object.cpp
139
cpp/object.cpp
@@ -1,139 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ dynamic typed objects
|
|
||||||
//
|
|
||||||
// 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.
|
|
||||||
//
|
|
||||||
#include "msgpack/object.hpp"
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
namespace msgpack {
|
|
||||||
|
|
||||||
|
|
||||||
std::ostream& operator<< (std::ostream& s, const object o)
|
|
||||||
{
|
|
||||||
switch(o.type) {
|
|
||||||
case type::NIL:
|
|
||||||
s << "nil";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case type::BOOLEAN:
|
|
||||||
s << (o.via.boolean ? "true" : "false");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case type::POSITIVE_INTEGER:
|
|
||||||
s << o.via.u64;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case type::NEGATIVE_INTEGER:
|
|
||||||
s << o.via.i64;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case type::DOUBLE:
|
|
||||||
s << o.via.dec;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case type::RAW:
|
|
||||||
(s << '"').write(o.via.raw.ptr, o.via.raw.size) << '"';
|
|
||||||
break;
|
|
||||||
|
|
||||||
case type::ARRAY:
|
|
||||||
s << "[";
|
|
||||||
if(o.via.array.size != 0) {
|
|
||||||
object* p(o.via.array.ptr);
|
|
||||||
s << *p;
|
|
||||||
++p;
|
|
||||||
for(object* const pend(o.via.array.ptr + o.via.array.size);
|
|
||||||
p < pend; ++p) {
|
|
||||||
s << ", " << *p;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
s << "]";
|
|
||||||
break;
|
|
||||||
// FIXME loop optimiziation
|
|
||||||
|
|
||||||
case type::MAP:
|
|
||||||
s << "{";
|
|
||||||
if(o.via.map.size != 0) {
|
|
||||||
object_kv* p(o.via.map.ptr);
|
|
||||||
s << p->key << "=>" << p->val;
|
|
||||||
++p;
|
|
||||||
for(object_kv* const pend(o.via.map.ptr + o.via.map.size);
|
|
||||||
p < pend; ++p) {
|
|
||||||
s << ", " << p->key << "=>" << p->val;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
s << "}";
|
|
||||||
break;
|
|
||||||
// FIXME loop optimiziation
|
|
||||||
|
|
||||||
default:
|
|
||||||
// FIXME
|
|
||||||
s << "#<UNKNOWN " << (uint16_t)o.type << ">";
|
|
||||||
}
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool operator==(const object x, const object y)
|
|
||||||
{
|
|
||||||
if(x.type != y.type) { return false; }
|
|
||||||
|
|
||||||
switch(x.type) {
|
|
||||||
case type::NIL:
|
|
||||||
return true;
|
|
||||||
|
|
||||||
case type::BOOLEAN:
|
|
||||||
return x.via.boolean == y.via.boolean;
|
|
||||||
|
|
||||||
case type::POSITIVE_INTEGER:
|
|
||||||
return x.via.u64 == y.via.u64;
|
|
||||||
|
|
||||||
case type::NEGATIVE_INTEGER:
|
|
||||||
return x.via.i64 == y.via.i64;
|
|
||||||
|
|
||||||
case type::RAW:
|
|
||||||
return x.via.raw.size == y.via.raw.size &&
|
|
||||||
memcmp(x.via.raw.ptr, y.via.raw.ptr, x.via.raw.size) == 0;
|
|
||||||
|
|
||||||
case type::ARRAY:
|
|
||||||
if(x.via.array.size != y.via.array.size) { return false; }
|
|
||||||
for(object* px(x.via.array.ptr),
|
|
||||||
* const pxend(x.via.array.ptr + x.via.array.size),
|
|
||||||
* py(y.via.array.ptr);
|
|
||||||
px < pxend; ++px, ++py) {
|
|
||||||
if(*px != *py) { return false; }
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
// FIXME loop optimiziation
|
|
||||||
|
|
||||||
case type::MAP:
|
|
||||||
if(x.via.map.size != y.via.map.size) { return false; }
|
|
||||||
for(object_kv* px(x.via.map.ptr),
|
|
||||||
* const pxend(x.via.map.ptr + x.via.map.size),
|
|
||||||
* py(y.via.map.ptr);
|
|
||||||
px < pxend; ++px, ++py) {
|
|
||||||
if(px->key != py->key || px->val != py->val) { return false; }
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
|
|
||||||
default:
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
} // namespace msgpack
|
|
||||||
|
|
||||||
330
cpp/object.hpp
330
cpp/object.hpp
@@ -1,330 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// 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_OBJECT_HPP__
|
|
||||||
#define MSGPACK_OBJECT_HPP__
|
|
||||||
|
|
||||||
#include "msgpack/object.h"
|
|
||||||
#include "msgpack/pack.hpp"
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdexcept>
|
|
||||||
#include <typeinfo>
|
|
||||||
#include <limits>
|
|
||||||
#include <ostream>
|
|
||||||
|
|
||||||
namespace msgpack {
|
|
||||||
|
|
||||||
|
|
||||||
class type_error : public std::bad_cast { };
|
|
||||||
|
|
||||||
|
|
||||||
namespace type {
|
|
||||||
enum object_type {
|
|
||||||
NIL = 0x01,
|
|
||||||
BOOLEAN = 0x02,
|
|
||||||
POSITIVE_INTEGER = 0x03,
|
|
||||||
NEGATIVE_INTEGER = 0x04,
|
|
||||||
DOUBLE = 0x05,
|
|
||||||
RAW = 0x06,
|
|
||||||
ARRAY = 0x07,
|
|
||||||
MAP = 0x08,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
struct object;
|
|
||||||
struct object_kv;
|
|
||||||
|
|
||||||
struct object_array {
|
|
||||||
uint32_t size;
|
|
||||||
object* ptr;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct object_map {
|
|
||||||
uint32_t size;
|
|
||||||
object_kv* ptr;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct object_raw {
|
|
||||||
uint32_t size;
|
|
||||||
const char* ptr;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct object {
|
|
||||||
union union_type {
|
|
||||||
bool boolean;
|
|
||||||
uint64_t u64;
|
|
||||||
int64_t i64;
|
|
||||||
double dec;
|
|
||||||
object_array array;
|
|
||||||
object_map map;
|
|
||||||
object_raw raw;
|
|
||||||
object_raw ref; // obsolete
|
|
||||||
};
|
|
||||||
|
|
||||||
type::object_type type;
|
|
||||||
union_type via;
|
|
||||||
|
|
||||||
bool is_nil() const { return type == type::NIL; }
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
T as() const;
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
void convert(T* v) const;
|
|
||||||
|
|
||||||
object();
|
|
||||||
object(msgpack_object obj);
|
|
||||||
operator msgpack_object();
|
|
||||||
|
|
||||||
private:
|
|
||||||
struct implicit_type;
|
|
||||||
|
|
||||||
public:
|
|
||||||
implicit_type convert() const;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct object_kv {
|
|
||||||
object key;
|
|
||||||
object val;
|
|
||||||
};
|
|
||||||
|
|
||||||
bool operator==(const object x, const object y);
|
|
||||||
bool operator!=(const object x, const object y);
|
|
||||||
|
|
||||||
std::ostream& operator<< (std::ostream& s, const object o);
|
|
||||||
|
|
||||||
|
|
||||||
template <typename Stream, typename T>
|
|
||||||
packer<Stream>& operator<< (packer<Stream>& o, const T& v);
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
T& operator>> (object o, T& v);
|
|
||||||
|
|
||||||
|
|
||||||
struct object::implicit_type {
|
|
||||||
implicit_type(object o) : obj(o) { }
|
|
||||||
~implicit_type() { }
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
operator T() { return obj.as<T>(); }
|
|
||||||
|
|
||||||
private:
|
|
||||||
object obj;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// obsolete
|
|
||||||
template <typename Type>
|
|
||||||
class define : public Type {
|
|
||||||
public:
|
|
||||||
typedef Type msgpack_type;
|
|
||||||
typedef define<Type> define_type;
|
|
||||||
|
|
||||||
define() {}
|
|
||||||
define(const msgpack_type& v) : msgpack_type(v) {}
|
|
||||||
|
|
||||||
template <typename Packer>
|
|
||||||
void msgpack_pack(Packer& o) const
|
|
||||||
{
|
|
||||||
o << static_cast<const msgpack_type&>(*this);
|
|
||||||
}
|
|
||||||
|
|
||||||
void msgpack_unpack(object o)
|
|
||||||
{
|
|
||||||
o >> static_cast<msgpack_type&>(*this);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
template <typename Stream>
|
|
||||||
template <typename T>
|
|
||||||
inline packer<Stream>& packer<Stream>::pack(const T& v)
|
|
||||||
{
|
|
||||||
*this << v;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline object& operator>> (object o, object& v)
|
|
||||||
{
|
|
||||||
v = o;
|
|
||||||
return v;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
inline T& operator>> (object o, T& v)
|
|
||||||
{
|
|
||||||
v.msgpack_unpack(o.convert());
|
|
||||||
return v;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename Stream, typename T>
|
|
||||||
inline packer<Stream>& operator<< (packer<Stream>& o, const T& v)
|
|
||||||
{
|
|
||||||
v.msgpack_pack(o);
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline bool operator!=(const object x, const object y)
|
|
||||||
{ return !(x == y); }
|
|
||||||
|
|
||||||
|
|
||||||
inline object::object() { }
|
|
||||||
|
|
||||||
inline object::object(msgpack_object obj)
|
|
||||||
{
|
|
||||||
// FIXME beter way?
|
|
||||||
::memcpy(this, &obj, sizeof(obj));
|
|
||||||
}
|
|
||||||
|
|
||||||
inline object::operator msgpack_object()
|
|
||||||
{
|
|
||||||
// FIXME beter way?
|
|
||||||
msgpack_object obj;
|
|
||||||
::memcpy(&obj, this, sizeof(obj));
|
|
||||||
return obj;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline object::implicit_type object::convert() const
|
|
||||||
{
|
|
||||||
return implicit_type(*this);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
inline void object::convert(T* v) const
|
|
||||||
{
|
|
||||||
*this >> *v;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
inline T object::as() const
|
|
||||||
{
|
|
||||||
T v;
|
|
||||||
convert(&v);
|
|
||||||
return v;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// obsolete
|
|
||||||
template <typename T>
|
|
||||||
inline void convert(T& v, object o)
|
|
||||||
{
|
|
||||||
o.convert(&v);
|
|
||||||
}
|
|
||||||
|
|
||||||
// obsolete
|
|
||||||
template <typename Stream, typename T>
|
|
||||||
inline void pack(packer<Stream>& o, const T& v)
|
|
||||||
{
|
|
||||||
o.pack(v);
|
|
||||||
}
|
|
||||||
|
|
||||||
// obsolete
|
|
||||||
template <typename Stream, typename T>
|
|
||||||
inline void pack_copy(packer<Stream>& o, T v)
|
|
||||||
{
|
|
||||||
pack(o, v);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template <typename Stream>
|
|
||||||
packer<Stream>& operator<< (packer<Stream>& o, const object& v)
|
|
||||||
{
|
|
||||||
switch(v.type) {
|
|
||||||
case type::NIL:
|
|
||||||
o.pack_nil();
|
|
||||||
return o;
|
|
||||||
|
|
||||||
case type::BOOLEAN:
|
|
||||||
if(v.via.boolean) {
|
|
||||||
o.pack_true();
|
|
||||||
} else {
|
|
||||||
o.pack_false();
|
|
||||||
}
|
|
||||||
return o;
|
|
||||||
|
|
||||||
case type::POSITIVE_INTEGER:
|
|
||||||
if(v.via.u64 <= (uint64_t)std::numeric_limits<uint16_t>::max()) {
|
|
||||||
if(v.via.u64 <= (uint16_t)std::numeric_limits<uint8_t>::max()) {
|
|
||||||
o.pack_uint8(v.via.u64);
|
|
||||||
} else {
|
|
||||||
o.pack_uint16(v.via.u64);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if(v.via.u64 <= (uint64_t)std::numeric_limits<uint32_t>::max()) {
|
|
||||||
o.pack_uint32(v.via.u64);
|
|
||||||
} else {
|
|
||||||
o.pack_uint64(v.via.u64);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return o;
|
|
||||||
|
|
||||||
case type::NEGATIVE_INTEGER:
|
|
||||||
if(v.via.i64 >= (int64_t)std::numeric_limits<int16_t>::min()) {
|
|
||||||
if(v.via.i64 >= (int64_t)std::numeric_limits<int8_t>::min()) {
|
|
||||||
o.pack_int8(v.via.i64);
|
|
||||||
} else {
|
|
||||||
o.pack_int16(v.via.i64);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if(v.via.i64 >= (int64_t)std::numeric_limits<int32_t>::min()) {
|
|
||||||
o.pack_int64(v.via.i64);
|
|
||||||
} else {
|
|
||||||
o.pack_int64(v.via.i64);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return o;
|
|
||||||
|
|
||||||
case type::RAW:
|
|
||||||
o.pack_raw(v.via.raw.size);
|
|
||||||
o.pack_raw_body(v.via.raw.ptr, v.via.raw.size);
|
|
||||||
return o;
|
|
||||||
|
|
||||||
case type::ARRAY:
|
|
||||||
o.pack_array(v.via.array.size);
|
|
||||||
for(object* p(v.via.array.ptr),
|
|
||||||
* const pend(v.via.array.ptr + v.via.array.size);
|
|
||||||
p < pend; ++p) {
|
|
||||||
o << *p;
|
|
||||||
}
|
|
||||||
return o;
|
|
||||||
|
|
||||||
case type::MAP:
|
|
||||||
o.pack_map(v.via.map.size);
|
|
||||||
for(object_kv* p(v.via.map.ptr),
|
|
||||||
* const pend(v.via.map.ptr + v.via.map.size);
|
|
||||||
p < pend; ++p) {
|
|
||||||
o << p->key;
|
|
||||||
o << p->val;
|
|
||||||
}
|
|
||||||
return o;
|
|
||||||
|
|
||||||
default:
|
|
||||||
throw type_error();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
} // namespace msgpack
|
|
||||||
|
|
||||||
#include "msgpack/type.hpp"
|
|
||||||
|
|
||||||
#endif /* msgpack/object.hpp */
|
|
||||||
|
|
||||||
253
cpp/pack.hpp
253
cpp/pack.hpp
@@ -1,253 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ serializing routine
|
|
||||||
//
|
|
||||||
// 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_HPP__
|
|
||||||
#define MSGPACK_PACK_HPP__
|
|
||||||
|
|
||||||
#include <arpa/inet.h> // __BYTE_ORDER
|
|
||||||
#include <stdexcept>
|
|
||||||
#include <limits.h>
|
|
||||||
#include "msgpack/pack_define.h"
|
|
||||||
|
|
||||||
namespace msgpack {
|
|
||||||
|
|
||||||
|
|
||||||
template <typename Stream>
|
|
||||||
class packer {
|
|
||||||
public:
|
|
||||||
packer(Stream& s);
|
|
||||||
~packer();
|
|
||||||
|
|
||||||
public:
|
|
||||||
template <typename T>
|
|
||||||
packer<Stream>& pack(const T& v);
|
|
||||||
|
|
||||||
packer<Stream>& pack_uint8(uint8_t d);
|
|
||||||
packer<Stream>& pack_uint16(uint16_t d);
|
|
||||||
packer<Stream>& pack_uint32(uint32_t d);
|
|
||||||
packer<Stream>& pack_uint64(uint64_t d);
|
|
||||||
packer<Stream>& pack_int8(uint8_t d);
|
|
||||||
packer<Stream>& pack_int16(uint16_t d);
|
|
||||||
packer<Stream>& pack_int32(uint32_t d);
|
|
||||||
packer<Stream>& pack_int64(uint64_t d);
|
|
||||||
|
|
||||||
packer<Stream>& pack_short(int d);
|
|
||||||
packer<Stream>& pack_int(int d);
|
|
||||||
packer<Stream>& pack_long(long d);
|
|
||||||
packer<Stream>& pack_long_long(long long d);
|
|
||||||
packer<Stream>& pack_unsigned_short(unsigned short d);
|
|
||||||
packer<Stream>& pack_unsigned_int(unsigned int d);
|
|
||||||
packer<Stream>& pack_unsigned_long(unsigned long d);
|
|
||||||
packer<Stream>& pack_unsigned_long_long(unsigned long long d);
|
|
||||||
|
|
||||||
packer<Stream>& pack_float(float d);
|
|
||||||
packer<Stream>& pack_double(double d);
|
|
||||||
|
|
||||||
packer<Stream>& pack_nil();
|
|
||||||
packer<Stream>& pack_true();
|
|
||||||
packer<Stream>& pack_false();
|
|
||||||
|
|
||||||
packer<Stream>& pack_array(unsigned int n);
|
|
||||||
|
|
||||||
packer<Stream>& pack_map(unsigned int n);
|
|
||||||
|
|
||||||
packer<Stream>& pack_raw(size_t l);
|
|
||||||
packer<Stream>& pack_raw_body(const char* b, size_t l);
|
|
||||||
|
|
||||||
private:
|
|
||||||
static void _pack_uint8(Stream& x, uint8_t d);
|
|
||||||
static void _pack_uint16(Stream& x, uint16_t d);
|
|
||||||
static void _pack_uint32(Stream& x, uint32_t d);
|
|
||||||
static void _pack_uint64(Stream& x, uint64_t d);
|
|
||||||
static void _pack_int8(Stream& x, int8_t d);
|
|
||||||
static void _pack_int16(Stream& x, int16_t d);
|
|
||||||
static void _pack_int32(Stream& x, int32_t d);
|
|
||||||
static void _pack_int64(Stream& x, int64_t d);
|
|
||||||
|
|
||||||
static void _pack_short(Stream& x, short d);
|
|
||||||
static void _pack_int(Stream& x, int d);
|
|
||||||
static void _pack_long(Stream& x, long d);
|
|
||||||
static void _pack_long_long(Stream& x, long long d);
|
|
||||||
static void _pack_unsigned_short(Stream& x, unsigned short d);
|
|
||||||
static void _pack_unsigned_int(Stream& x, unsigned int d);
|
|
||||||
static void _pack_unsigned_long(Stream& x, unsigned long d);
|
|
||||||
static void _pack_unsigned_long_long(Stream& x, unsigned long long d);
|
|
||||||
|
|
||||||
static void _pack_float(Stream& x, float d);
|
|
||||||
static void _pack_double(Stream& x, double d);
|
|
||||||
|
|
||||||
static void _pack_nil(Stream& x);
|
|
||||||
static void _pack_true(Stream& x);
|
|
||||||
static void _pack_false(Stream& x);
|
|
||||||
|
|
||||||
static void _pack_array(Stream& x, unsigned int n);
|
|
||||||
|
|
||||||
static void _pack_map(Stream& x, unsigned int n);
|
|
||||||
|
|
||||||
static void _pack_raw(Stream& x, size_t l);
|
|
||||||
static void _pack_raw_body(Stream& x, const void* b, size_t l);
|
|
||||||
|
|
||||||
static void append_buffer(Stream& x, const unsigned char* buf, unsigned int len)
|
|
||||||
{ x.write((const char*)buf, len); }
|
|
||||||
|
|
||||||
private:
|
|
||||||
Stream& m_stream;
|
|
||||||
|
|
||||||
private:
|
|
||||||
packer();
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
template <typename Stream, typename T>
|
|
||||||
inline void pack(Stream& s, const T& v)
|
|
||||||
{
|
|
||||||
packer<Stream>(s).pack(v);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#define msgpack_pack_inline_func(name) \
|
|
||||||
template <typename Stream> \
|
|
||||||
inline void packer<Stream>::_pack ## name
|
|
||||||
|
|
||||||
#define msgpack_pack_inline_func_cint(name) \
|
|
||||||
template <typename Stream> \
|
|
||||||
inline void packer<Stream>::_pack ## name
|
|
||||||
|
|
||||||
#define msgpack_pack_user Stream&
|
|
||||||
|
|
||||||
#define msgpack_pack_append_buffer append_buffer
|
|
||||||
|
|
||||||
#include "msgpack/pack_template.h"
|
|
||||||
|
|
||||||
|
|
||||||
template <typename Stream>
|
|
||||||
packer<Stream>::packer(Stream& s) : m_stream(s) { }
|
|
||||||
|
|
||||||
template <typename Stream>
|
|
||||||
packer<Stream>::~packer() { }
|
|
||||||
|
|
||||||
template <typename Stream>
|
|
||||||
inline packer<Stream>& packer<Stream>::pack_uint8(uint8_t d)
|
|
||||||
{ _pack_uint8(m_stream, d); return *this; }
|
|
||||||
|
|
||||||
template <typename Stream>
|
|
||||||
inline packer<Stream>& packer<Stream>::pack_uint16(uint16_t d)
|
|
||||||
{ _pack_uint16(m_stream, d); return *this; }
|
|
||||||
|
|
||||||
template <typename Stream>
|
|
||||||
inline packer<Stream>& packer<Stream>::pack_uint32(uint32_t d)
|
|
||||||
{ _pack_uint32(m_stream, d); return *this; }
|
|
||||||
|
|
||||||
template <typename Stream>
|
|
||||||
inline packer<Stream>& packer<Stream>::pack_uint64(uint64_t d)
|
|
||||||
{ _pack_uint64(m_stream, d); return *this; }
|
|
||||||
|
|
||||||
template <typename Stream>
|
|
||||||
inline packer<Stream>& packer<Stream>::pack_int8(uint8_t d)
|
|
||||||
{ _pack_int8(m_stream, d); return *this; }
|
|
||||||
|
|
||||||
template <typename Stream>
|
|
||||||
inline packer<Stream>& packer<Stream>::pack_int16(uint16_t d)
|
|
||||||
{ _pack_int16(m_stream, d); return *this; }
|
|
||||||
|
|
||||||
template <typename Stream>
|
|
||||||
inline packer<Stream>& packer<Stream>::pack_int32(uint32_t d)
|
|
||||||
{ _pack_int32(m_stream, d); return *this; }
|
|
||||||
|
|
||||||
template <typename Stream>
|
|
||||||
inline packer<Stream>& packer<Stream>::pack_int64(uint64_t d)
|
|
||||||
{ _pack_int64(m_stream, d); return *this;}
|
|
||||||
|
|
||||||
|
|
||||||
template <typename Stream>
|
|
||||||
inline packer<Stream>& packer<Stream>::pack_short(int d)
|
|
||||||
{ _pack_short(m_stream, d); return *this; }
|
|
||||||
|
|
||||||
template <typename Stream>
|
|
||||||
inline packer<Stream>& packer<Stream>::pack_int(int d)
|
|
||||||
{ _pack_int(m_stream, d); return *this; }
|
|
||||||
|
|
||||||
template <typename Stream>
|
|
||||||
inline packer<Stream>& packer<Stream>::pack_long(long d)
|
|
||||||
{ _pack_long(m_stream, d); return *this; }
|
|
||||||
|
|
||||||
template <typename Stream>
|
|
||||||
inline packer<Stream>& packer<Stream>::pack_long_long(long long d)
|
|
||||||
{ _pack_long_long(m_stream, d); return *this; }
|
|
||||||
|
|
||||||
template <typename Stream>
|
|
||||||
inline packer<Stream>& packer<Stream>::pack_unsigned_short(unsigned short d)
|
|
||||||
{ _pack_unsigned_short(m_stream, d); return *this; }
|
|
||||||
|
|
||||||
template <typename Stream>
|
|
||||||
inline packer<Stream>& packer<Stream>::pack_unsigned_int(unsigned int d)
|
|
||||||
{ _pack_unsigned_int(m_stream, d); return *this; }
|
|
||||||
|
|
||||||
template <typename Stream>
|
|
||||||
inline packer<Stream>& packer<Stream>::pack_unsigned_long(unsigned long d)
|
|
||||||
{ _pack_unsigned_long(m_stream, d); return *this; }
|
|
||||||
|
|
||||||
template <typename Stream>
|
|
||||||
inline packer<Stream>& packer<Stream>::pack_unsigned_long_long(unsigned long long d)
|
|
||||||
{ _pack_unsigned_long_long(m_stream, d); return *this; }
|
|
||||||
|
|
||||||
|
|
||||||
template <typename Stream>
|
|
||||||
inline packer<Stream>& packer<Stream>::pack_float(float d)
|
|
||||||
{ _pack_float(m_stream, d); return *this; }
|
|
||||||
|
|
||||||
template <typename Stream>
|
|
||||||
inline packer<Stream>& packer<Stream>::pack_double(double d)
|
|
||||||
{ _pack_double(m_stream, d); return *this; }
|
|
||||||
|
|
||||||
|
|
||||||
template <typename Stream>
|
|
||||||
inline packer<Stream>& packer<Stream>::pack_nil()
|
|
||||||
{ _pack_nil(m_stream); return *this; }
|
|
||||||
|
|
||||||
template <typename Stream>
|
|
||||||
inline packer<Stream>& packer<Stream>::pack_true()
|
|
||||||
{ _pack_true(m_stream); return *this; }
|
|
||||||
|
|
||||||
template <typename Stream>
|
|
||||||
inline packer<Stream>& packer<Stream>::pack_false()
|
|
||||||
{ _pack_false(m_stream); return *this; }
|
|
||||||
|
|
||||||
|
|
||||||
template <typename Stream>
|
|
||||||
inline packer<Stream>& packer<Stream>::pack_array(unsigned int n)
|
|
||||||
{ _pack_array(m_stream, n); return *this; }
|
|
||||||
|
|
||||||
|
|
||||||
template <typename Stream>
|
|
||||||
inline packer<Stream>& packer<Stream>::pack_map(unsigned int n)
|
|
||||||
{ _pack_map(m_stream, n); return *this; }
|
|
||||||
|
|
||||||
|
|
||||||
template <typename Stream>
|
|
||||||
inline packer<Stream>& packer<Stream>::pack_raw(size_t l)
|
|
||||||
{ _pack_raw(m_stream, l); return *this; }
|
|
||||||
|
|
||||||
template <typename Stream>
|
|
||||||
inline packer<Stream>& packer<Stream>::pack_raw_body(const char* b, size_t l)
|
|
||||||
{ _pack_raw_body(m_stream, b, l); return *this; }
|
|
||||||
|
|
||||||
|
|
||||||
} // namespace msgpack
|
|
||||||
|
|
||||||
#endif /* msgpack/pack.hpp */
|
|
||||||
|
|
||||||
103
cpp/sbuffer.hpp
103
cpp/sbuffer.hpp
@@ -1,103 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ simple buffer implementation
|
|
||||||
//
|
|
||||||
// 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_SBUFFER_HPP__
|
|
||||||
#define MSGPACK_SBUFFER_HPP__
|
|
||||||
|
|
||||||
#include "msgpack/sbuffer.h"
|
|
||||||
#include <stdexcept>
|
|
||||||
|
|
||||||
namespace msgpack {
|
|
||||||
|
|
||||||
|
|
||||||
class sbuffer : public msgpack_sbuffer {
|
|
||||||
public:
|
|
||||||
sbuffer(size_t initsz = MSGPACK_SBUFFER_INIT_SIZE)
|
|
||||||
{
|
|
||||||
base::data = (char*)::malloc(initsz);
|
|
||||||
if(!base::data) {
|
|
||||||
throw std::bad_alloc();
|
|
||||||
}
|
|
||||||
|
|
||||||
base::size = 0;
|
|
||||||
base::alloc = initsz;
|
|
||||||
}
|
|
||||||
|
|
||||||
~sbuffer()
|
|
||||||
{
|
|
||||||
::free(base::data);
|
|
||||||
}
|
|
||||||
|
|
||||||
public:
|
|
||||||
void write(const char* buf, unsigned int len)
|
|
||||||
{
|
|
||||||
if(base::alloc - base::size < len) {
|
|
||||||
expand_buffer(len);
|
|
||||||
}
|
|
||||||
memcpy(base::data + base::size, buf, len);
|
|
||||||
base::size += len;
|
|
||||||
}
|
|
||||||
|
|
||||||
char* data()
|
|
||||||
{
|
|
||||||
return base::data;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char* data() const
|
|
||||||
{
|
|
||||||
return base::data;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t size() const
|
|
||||||
{
|
|
||||||
return base::size;
|
|
||||||
}
|
|
||||||
|
|
||||||
char* release()
|
|
||||||
{
|
|
||||||
return msgpack_sbuffer_release(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
void expand_buffer(size_t len)
|
|
||||||
{
|
|
||||||
size_t nsize = (base::alloc) ?
|
|
||||||
base::alloc * 2 : MSGPACK_SBUFFER_INIT_SIZE;
|
|
||||||
|
|
||||||
while(nsize < base::size + len) { nsize *= 2; }
|
|
||||||
|
|
||||||
void* tmp = realloc(base::data, nsize);
|
|
||||||
if(!tmp) {
|
|
||||||
throw std::bad_alloc();
|
|
||||||
}
|
|
||||||
|
|
||||||
base::data = (char*)tmp;
|
|
||||||
base::alloc = nsize;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
typedef msgpack_sbuffer base;
|
|
||||||
|
|
||||||
private:
|
|
||||||
sbuffer(const sbuffer&);
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
} // namespace msgpack
|
|
||||||
|
|
||||||
#endif /* msgpack/sbuffer.hpp */
|
|
||||||
|
|
||||||
201
cpp/test.cpp
201
cpp/test.cpp
@@ -1,201 +0,0 @@
|
|||||||
#include <iostream>
|
|
||||||
#include <string>
|
|
||||||
#include <msgpack.hpp>
|
|
||||||
#include <sstream>
|
|
||||||
#include <memory>
|
|
||||||
|
|
||||||
using namespace msgpack;
|
|
||||||
|
|
||||||
class checker {
|
|
||||||
public:
|
|
||||||
template <typename T>
|
|
||||||
void check(const char* d, size_t len, T should) {
|
|
||||||
try {
|
|
||||||
std::cout << "----" << std::endl;
|
|
||||||
|
|
||||||
object o;
|
|
||||||
try {
|
|
||||||
o = unpack(d, len, m_zone);
|
|
||||||
} catch (std::runtime_error& e) {
|
|
||||||
std::cout << o << std::endl;
|
|
||||||
std::cout << "**" << e.what() << "**" << std::endl;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::cout << o << std::endl;
|
|
||||||
|
|
||||||
try {
|
|
||||||
std::stringstream s;
|
|
||||||
pack(s, should);
|
|
||||||
std::string str(s.str());
|
|
||||||
object ro = unpack(str.data(), str.size(), m_zone);
|
|
||||||
std::cout << ro << std::endl;
|
|
||||||
if(ro != o) { throw std::runtime_error("NOT MATCH"); }
|
|
||||||
} catch (std::runtime_error& e) {
|
|
||||||
std::cout << "** REUNPACK FAILED **" << std::endl;
|
|
||||||
std::cout << e.what() << std::endl;
|
|
||||||
} catch (...) {
|
|
||||||
std::cout << "** REUNPACK FAILED **" << std::endl;
|
|
||||||
std::cout << "unknown error" << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
} catch (...) { m_zone.clear(); throw; }
|
|
||||||
m_zone.clear();
|
|
||||||
}
|
|
||||||
private:
|
|
||||||
zone m_zone;
|
|
||||||
};
|
|
||||||
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
checker c;
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
{ // SimpleValue
|
|
||||||
const char d[] = {
|
|
||||||
0x93, 0xc0, 0xc2, 0xc3,
|
|
||||||
};
|
|
||||||
c.check(d, sizeof(d),
|
|
||||||
type::make_tuple(
|
|
||||||
type::nil(), false, true
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
{ // Fixnum
|
|
||||||
const char d[] = {
|
|
||||||
0x92,
|
|
||||||
0x93, 0x00, 0x40, 0x7f,
|
|
||||||
0x93, 0xe0, 0xf0, 0xff,
|
|
||||||
};
|
|
||||||
c.check(d, sizeof(d),
|
|
||||||
type::make_tuple(
|
|
||||||
type::make_tuple(
|
|
||||||
0, 64, 127
|
|
||||||
),
|
|
||||||
type::make_tuple(
|
|
||||||
-32, -16, -1
|
|
||||||
)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
{ // FixArray
|
|
||||||
const char d[] = {
|
|
||||||
0x92,
|
|
||||||
0x90,
|
|
||||||
0x91,
|
|
||||||
0x91, 0xc0,
|
|
||||||
};
|
|
||||||
std::vector<int> empty;
|
|
||||||
c.check(d, sizeof(d),
|
|
||||||
type::make_tuple(
|
|
||||||
empty,
|
|
||||||
type::make_tuple(
|
|
||||||
type::make_tuple(
|
|
||||||
type::nil()
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
{ // FixRaw
|
|
||||||
const char d[] = {
|
|
||||||
0x94,
|
|
||||||
0xa0,
|
|
||||||
0xa1, 'a',
|
|
||||||
0xa2, 'b', 'c',
|
|
||||||
0xa3, 'd', 'e', 'f',
|
|
||||||
};
|
|
||||||
c.check(d, sizeof(d),
|
|
||||||
type::make_tuple(
|
|
||||||
std::string(""),
|
|
||||||
std::string("a"),
|
|
||||||
std::string("bc"),
|
|
||||||
type::raw_ref("def", 3)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
static const unsigned TASK_ARRAY = 1000;
|
|
||||||
static const unsigned TASK_REPEAT = 10;
|
|
||||||
std::vector<std::string> task;
|
|
||||||
|
|
||||||
// create task
|
|
||||||
{
|
|
||||||
static char traw[64];
|
|
||||||
memset(traw, 'a', sizeof(traw));
|
|
||||||
|
|
||||||
task.resize(TASK_ARRAY);
|
|
||||||
for(unsigned i=0; i < TASK_ARRAY; ++i) {
|
|
||||||
task[i] = std::string(traw, sizeof(traw));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
std::stringstream stream;
|
|
||||||
|
|
||||||
// send message
|
|
||||||
{
|
|
||||||
for(unsigned i=0; i < TASK_REPEAT; ++i) {
|
|
||||||
pack(stream, task);
|
|
||||||
}
|
|
||||||
std::cout << "send " << stream.str().size() << " bytes" << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
ssize_t total_bytes = stream.str().size();
|
|
||||||
stream.seekg(0);
|
|
||||||
|
|
||||||
// reserive message
|
|
||||||
{
|
|
||||||
unsigned num_msg = 0;
|
|
||||||
static const size_t RESERVE_SIZE = 32;//*1024;
|
|
||||||
|
|
||||||
unpacker pac;
|
|
||||||
|
|
||||||
while(stream.good() && total_bytes > 0) {
|
|
||||||
|
|
||||||
// 1. reserve buffer
|
|
||||||
pac.reserve_buffer(RESERVE_SIZE);
|
|
||||||
|
|
||||||
// 2. read data to buffer() up to buffer_capacity() bytes
|
|
||||||
size_t sz = stream.readsome(
|
|
||||||
pac.buffer(),
|
|
||||||
pac.buffer_capacity());
|
|
||||||
|
|
||||||
total_bytes -= sz;
|
|
||||||
std::cout << "read " << sz << " bytes to capacity "
|
|
||||||
<< pac.buffer_capacity() << " bytes"
|
|
||||||
<< std::endl;
|
|
||||||
|
|
||||||
// 3. specify the number of bytes actually copied
|
|
||||||
pac.buffer_consumed(sz);
|
|
||||||
|
|
||||||
// 4. repeat execute() until it returns false
|
|
||||||
while( pac.execute() ) {
|
|
||||||
// 5.1. take out the parsed object
|
|
||||||
object o = pac.data();
|
|
||||||
|
|
||||||
// 5.2 release the zone
|
|
||||||
std::auto_ptr<zone> olife( pac.release_zone() );
|
|
||||||
|
|
||||||
// 5.3 re-initialize the unpacker */
|
|
||||||
pac.reset();
|
|
||||||
|
|
||||||
// do some with the o and olife
|
|
||||||
std::cout << "message parsed: " << o << std::endl;
|
|
||||||
++num_msg;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
std::cout << "stream finished" << std::endl;
|
|
||||||
std::cout << num_msg << " messages reached" << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
|
|
||||||
CXXFLAGS += -Wall -g -I. -I.. -O4
|
|
||||||
LDFLAGS +=
|
|
||||||
|
|
||||||
all: test
|
|
||||||
|
|
||||||
test: test.o unpack.o zone.o object.o pack.hpp unpack.hpp zone.hpp object.hpp
|
|
||||||
$(CXX) test.o unpack.o zone.o object.o $(CXXFLAGS) $(LDFLAGS) -o $@
|
|
||||||
|
|
||||||
10
cpp/type.hpp
10
cpp/type.hpp
@@ -1,10 +0,0 @@
|
|||||||
#include "msgpack/type/array.hpp"
|
|
||||||
#include "msgpack/type/boolean.hpp"
|
|
||||||
#include "msgpack/type/float.hpp"
|
|
||||||
#include "msgpack/type/integer.hpp"
|
|
||||||
#include "msgpack/type/map.hpp"
|
|
||||||
#include "msgpack/type/nil.hpp"
|
|
||||||
#include "msgpack/type/raw.hpp"
|
|
||||||
#include "msgpack/type/tuple.hpp"
|
|
||||||
#include "msgpack/type/define.hpp"
|
|
||||||
|
|
||||||
@@ -1,57 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// 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_TYPE_ARRAY_HPP__
|
|
||||||
#define MSGPACK_TYPE_ARRAY_HPP__
|
|
||||||
|
|
||||||
#include "msgpack/object.hpp"
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
namespace msgpack {
|
|
||||||
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
inline std::vector<T>& operator>> (object o, std::vector<T>& v)
|
|
||||||
{
|
|
||||||
if(o.type != type::ARRAY) { throw type_error(); }
|
|
||||||
v.resize(o.via.array.size);
|
|
||||||
object* p = o.via.array.ptr;
|
|
||||||
object* const pend = o.via.array.ptr + o.via.array.size;
|
|
||||||
T* it = &v.front();
|
|
||||||
for(; p < pend; ++p, ++it) {
|
|
||||||
p->convert(it);
|
|
||||||
}
|
|
||||||
return v;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template <typename Stream, typename T>
|
|
||||||
inline packer<Stream>& operator<< (packer<Stream>& o, const std::vector<T>& v)
|
|
||||||
{
|
|
||||||
o.pack_array(v.size());
|
|
||||||
for(typename std::vector<T>::const_iterator it(v.begin()), it_end(v.end());
|
|
||||||
it != it_end; ++it) {
|
|
||||||
o.pack(*it);
|
|
||||||
}
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
} // namespace msgpack
|
|
||||||
|
|
||||||
#endif /* msgpack/type/array.hpp */
|
|
||||||
|
|
||||||
@@ -1,47 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// 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_TYPE_BOOLEAN_HPP__
|
|
||||||
#define MSGPACK_TYPE_BOOLEAN_HPP__
|
|
||||||
|
|
||||||
#include "msgpack/object.hpp"
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
namespace msgpack {
|
|
||||||
|
|
||||||
|
|
||||||
inline bool& operator>> (object o, bool& v)
|
|
||||||
{
|
|
||||||
if(o.type != type::BOOLEAN) { throw type_error(); }
|
|
||||||
v = o.via.boolean;
|
|
||||||
return v;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template <typename Stream>
|
|
||||||
inline packer<Stream>& operator<< (packer<Stream>& o, const bool& v)
|
|
||||||
{
|
|
||||||
if(v) { o.pack_true(); }
|
|
||||||
else { o.pack_false(); }
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
} // namespace msgpack
|
|
||||||
|
|
||||||
#endif /* msgpack/type/bool.hpp */
|
|
||||||
|
|
||||||
@@ -1,98 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// 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_TYPE_DEFINE_HPP__
|
|
||||||
#define MSGPACK_TYPE_DEFINE_HPP__
|
|
||||||
|
|
||||||
#define MSGPACK_DEFINE(...) \
|
|
||||||
template <typename Packer> \
|
|
||||||
void msgpack_pack(Packer& pk) const \
|
|
||||||
{ \
|
|
||||||
msgpack::type::make_define(__VA_ARGS__).msgpack_pack(pk); \
|
|
||||||
} \
|
|
||||||
void msgpack_unpack(msgpack::object o) \
|
|
||||||
{ \
|
|
||||||
msgpack::type::make_define(__VA_ARGS__).msgpack_unpack(o); \
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace msgpack {
|
|
||||||
namespace type {
|
|
||||||
|
|
||||||
|
|
||||||
<% GENERATION_LIMIT = 15 %>
|
|
||||||
template <typename A0 = void<%1.upto(GENERATION_LIMIT+1) {|i|%>, typename A<%=i%> = void<%}%>>
|
|
||||||
struct define;
|
|
||||||
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct define<> {
|
|
||||||
typedef define<> value_type;
|
|
||||||
typedef tuple<> tuple_type;
|
|
||||||
template <typename Packer>
|
|
||||||
void msgpack_pack(Packer& pk) const
|
|
||||||
{
|
|
||||||
pk.pack_array(1);
|
|
||||||
}
|
|
||||||
void msgpack_unpack(msgpack::object o)
|
|
||||||
{
|
|
||||||
if(o.type != type::ARRAY) { throw type_error(); }
|
|
||||||
}
|
|
||||||
};
|
|
||||||
<%0.upto(GENERATION_LIMIT) {|i|%>
|
|
||||||
template <typename A0<%1.upto(i) {|j|%>, typename A<%=j%><%}%>>
|
|
||||||
struct define<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> {
|
|
||||||
typedef define<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> value_type;
|
|
||||||
typedef tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> tuple_type;
|
|
||||||
define(A0& _a0<%1.upto(i) {|j|%>, A<%=j%>& _a<%=j%><%}%>) :
|
|
||||||
a0(_a0)<%1.upto(i) {|j|%>, a<%=j%>(_a<%=j%>)<%}%> {}
|
|
||||||
template <typename Packer>
|
|
||||||
void msgpack_pack(Packer& pk) const
|
|
||||||
{
|
|
||||||
pk.pack_array(<%=i+1%>);
|
|
||||||
<%0.upto(i) {|j|%>
|
|
||||||
pk.pack(a<%=j%>);<%}%>
|
|
||||||
}
|
|
||||||
void msgpack_unpack(msgpack::object o)
|
|
||||||
{
|
|
||||||
if(o.type != type::ARRAY) { throw type_error(); }
|
|
||||||
const size_t size = o.via.array.size;
|
|
||||||
<%0.upto(i) {|j|%>
|
|
||||||
if(size <= <%=j%>) { return; } o.via.array.ptr[<%=j%>].convert(&a<%=j%>);<%}%>
|
|
||||||
}
|
|
||||||
<%0.upto(i) {|j|%>
|
|
||||||
A<%=j%>& a<%=j%>;<%}%>
|
|
||||||
};
|
|
||||||
<%}%>
|
|
||||||
|
|
||||||
inline define<> make_define()
|
|
||||||
{
|
|
||||||
return define<>();
|
|
||||||
}
|
|
||||||
<%0.upto(GENERATION_LIMIT) {|i|%>
|
|
||||||
template <typename A0<%1.upto(i) {|j|%>, typename A<%=j%><%}%>>
|
|
||||||
define<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> make_define(A0& a0<%1.upto(i) {|j|%>, A<%=j%>& a<%=j%><%}%>)
|
|
||||||
{
|
|
||||||
return define<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>>(a0<%1.upto(i) {|j|%>, a<%=j%><%}%>);
|
|
||||||
}
|
|
||||||
<%}%>
|
|
||||||
|
|
||||||
} // namespace type
|
|
||||||
} // namespace msgpack
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* msgpack/type/define.hpp */
|
|
||||||
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// 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_TYPE_FLOAT_HPP__
|
|
||||||
#define MSGPACK_TYPE_FLOAT_HPP__
|
|
||||||
|
|
||||||
#include "msgpack/object.hpp"
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
namespace msgpack {
|
|
||||||
|
|
||||||
|
|
||||||
// FIXME check overflow, underflow
|
|
||||||
|
|
||||||
|
|
||||||
inline float& operator>> (object o, float& v)
|
|
||||||
{
|
|
||||||
if(o.type != type::DOUBLE) { throw type_error(); }
|
|
||||||
v = o.via.dec;
|
|
||||||
return v;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template <typename Stream>
|
|
||||||
inline packer<Stream>& operator<< (packer<Stream>& o, const float& v)
|
|
||||||
{
|
|
||||||
o.pack_float(v);
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline double& operator>> (object o, double& v)
|
|
||||||
{
|
|
||||||
if(o.type != type::DOUBLE) { throw type_error(); }
|
|
||||||
v = o.via.dec;
|
|
||||||
return v;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template <typename Stream>
|
|
||||||
inline packer<Stream>& operator<< (packer<Stream>& o, const double& v)
|
|
||||||
{
|
|
||||||
o.pack_double(v);
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
} // namespace msgpack
|
|
||||||
|
|
||||||
#endif /* msgpack/type/float.hpp */
|
|
||||||
|
|
||||||
@@ -1,147 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// 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_TYPE_INTEGER_HPP__
|
|
||||||
#define MSGPACK_TYPE_INTEGER_HPP__
|
|
||||||
|
|
||||||
#include "msgpack/object.hpp"
|
|
||||||
#include <limits>
|
|
||||||
|
|
||||||
namespace msgpack {
|
|
||||||
|
|
||||||
|
|
||||||
namespace type {
|
|
||||||
namespace detail {
|
|
||||||
template <typename T, bool Signed>
|
|
||||||
struct convert_integer_sign;
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct convert_integer_sign<T, true> {
|
|
||||||
static inline T convert(object o) {
|
|
||||||
if(o.type == type::POSITIVE_INTEGER) {
|
|
||||||
if(o.via.u64 > (uint64_t)std::numeric_limits<T>::max())
|
|
||||||
{ throw type_error(); }
|
|
||||||
return o.via.u64;
|
|
||||||
} else if(o.type == type::NEGATIVE_INTEGER) {
|
|
||||||
if(o.via.i64 < (int64_t)-std::numeric_limits<T>::max())
|
|
||||||
{ throw type_error(); }
|
|
||||||
return o.via.i64;
|
|
||||||
}
|
|
||||||
throw type_error();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct convert_integer_sign<T, false> {
|
|
||||||
static inline T convert(object o) {
|
|
||||||
if(o.type == type::POSITIVE_INTEGER) {
|
|
||||||
if(o.via.u64 > (uint64_t)std::numeric_limits<T>::max())
|
|
||||||
{ throw type_error(); }
|
|
||||||
return o.via.u64;
|
|
||||||
}
|
|
||||||
throw type_error();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
static inline T convert_integer(object o)
|
|
||||||
{
|
|
||||||
return detail::convert_integer_sign<T, std::numeric_limits<T>::is_signed>::convert(o);
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace detail
|
|
||||||
} // namespace type
|
|
||||||
|
|
||||||
|
|
||||||
inline signed char& operator>> (object o, signed char& v)
|
|
||||||
{ v = type::detail::convert_integer<signed char>(o); return v; }
|
|
||||||
|
|
||||||
inline signed short& operator>> (object o, signed short& v)
|
|
||||||
{ v = type::detail::convert_integer<signed short>(o); return v; }
|
|
||||||
|
|
||||||
inline signed int& operator>> (object o, signed int& v)
|
|
||||||
{ v = type::detail::convert_integer<signed int>(o); return v; }
|
|
||||||
|
|
||||||
inline signed long& operator>> (object o, signed long& v)
|
|
||||||
{ v = type::detail::convert_integer<signed long>(o); return v; }
|
|
||||||
|
|
||||||
inline signed long long& operator>> (object o, signed long long& v)
|
|
||||||
{ v = type::detail::convert_integer<signed long long>(o); return v; }
|
|
||||||
|
|
||||||
|
|
||||||
inline unsigned char& operator>> (object o, unsigned char& v)
|
|
||||||
{ v = type::detail::convert_integer<unsigned char>(o); return v; }
|
|
||||||
|
|
||||||
inline unsigned short& operator>> (object o, unsigned short& v)
|
|
||||||
{ v = type::detail::convert_integer<unsigned short>(o); return v; }
|
|
||||||
|
|
||||||
inline unsigned int& operator>> (object o, unsigned int& v)
|
|
||||||
{ v = type::detail::convert_integer<unsigned int>(o); return v; }
|
|
||||||
|
|
||||||
inline unsigned long& operator>> (object o, unsigned long& v)
|
|
||||||
{ v = type::detail::convert_integer<unsigned long>(o); return v; }
|
|
||||||
|
|
||||||
inline unsigned long long& operator>> (object o, unsigned long long& v)
|
|
||||||
{ v = type::detail::convert_integer<unsigned long long>(o); return v; }
|
|
||||||
|
|
||||||
|
|
||||||
template <typename Stream>
|
|
||||||
inline packer<Stream>& operator<< (packer<Stream>& o, const signed char& v)
|
|
||||||
{ o.pack_int8(v); return o; }
|
|
||||||
|
|
||||||
template <typename Stream>
|
|
||||||
inline packer<Stream>& operator<< (packer<Stream>& o, const signed short& v)
|
|
||||||
{ o.pack_short(v); return o; }
|
|
||||||
|
|
||||||
template <typename Stream>
|
|
||||||
inline packer<Stream>& operator<< (packer<Stream>& o, const signed int& v)
|
|
||||||
{ o.pack_int(v); return o; }
|
|
||||||
|
|
||||||
template <typename Stream>
|
|
||||||
inline packer<Stream>& operator<< (packer<Stream>& o, const signed long& v)
|
|
||||||
{ o.pack_long(v); return o; }
|
|
||||||
|
|
||||||
template <typename Stream>
|
|
||||||
inline packer<Stream>& operator<< (packer<Stream>& o, const signed long long& v)
|
|
||||||
{ o.pack_long_long(v); return o; }
|
|
||||||
|
|
||||||
|
|
||||||
template <typename Stream>
|
|
||||||
inline packer<Stream>& operator<< (packer<Stream>& o, const unsigned char& v)
|
|
||||||
{ o.pack_uint8(v); return o; }
|
|
||||||
|
|
||||||
template <typename Stream>
|
|
||||||
inline packer<Stream>& operator<< (packer<Stream>& o, const unsigned short& v)
|
|
||||||
{ o.pack_unsigned_short(v); return o; }
|
|
||||||
|
|
||||||
template <typename Stream>
|
|
||||||
inline packer<Stream>& operator<< (packer<Stream>& o, const unsigned int& v)
|
|
||||||
{ o.pack_unsigned_int(v); return o; }
|
|
||||||
|
|
||||||
template <typename Stream>
|
|
||||||
inline packer<Stream>& operator<< (packer<Stream>& o, const unsigned long& v)
|
|
||||||
{ o.pack_unsigned_long(v); return o; }
|
|
||||||
|
|
||||||
template <typename Stream>
|
|
||||||
inline packer<Stream>& operator<< (packer<Stream>& o, const unsigned long long& v)
|
|
||||||
{ o.pack_unsigned_long_long(v); return o; }
|
|
||||||
|
|
||||||
|
|
||||||
} // namespace msgpack
|
|
||||||
|
|
||||||
#endif /* msgpack/type/integer.hpp */
|
|
||||||
|
|
||||||
139
cpp/type/map.hpp
139
cpp/type/map.hpp
@@ -1,139 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// 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_TYPE_MAP_HPP__
|
|
||||||
#define MSGPACK_TYPE_MAP_HPP__
|
|
||||||
|
|
||||||
#include "msgpack/object.hpp"
|
|
||||||
#include <map>
|
|
||||||
#include <vector>
|
|
||||||
#include <algorithm>
|
|
||||||
|
|
||||||
namespace msgpack {
|
|
||||||
|
|
||||||
|
|
||||||
namespace type {
|
|
||||||
|
|
||||||
template <typename K, typename V>
|
|
||||||
class assoc_vector : public std::vector< std::pair<K, V> > {};
|
|
||||||
|
|
||||||
namespace detail {
|
|
||||||
template <typename K, typename V>
|
|
||||||
struct pair_first_less {
|
|
||||||
bool operator() (const std::pair<K, V>& x, const std::pair<K, V>& y) const
|
|
||||||
{ return x.first < y.first; }
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
} //namespace type
|
|
||||||
|
|
||||||
|
|
||||||
template <typename K, typename V>
|
|
||||||
inline type::assoc_vector<K,V>& operator>> (object o, type::assoc_vector<K,V>& v)
|
|
||||||
{
|
|
||||||
if(o.type != type::MAP) { throw type_error(); }
|
|
||||||
v.resize(o.via.map.size);
|
|
||||||
object_kv* p = o.via.map.ptr;
|
|
||||||
object_kv* const pend = o.via.map.ptr + o.via.map.size;
|
|
||||||
std::pair<K, V>* it(&v.front());
|
|
||||||
for(; p < pend; ++p, ++it) {
|
|
||||||
p->key.convert(&it->first);
|
|
||||||
p->val.convert(&it->second);
|
|
||||||
}
|
|
||||||
std::sort(v.begin(), v.end(), type::detail::pair_first_less<K,V>());
|
|
||||||
return v;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename Stream, typename K, typename V>
|
|
||||||
inline packer<Stream>& operator<< (packer<Stream>& o, const type::assoc_vector<K,V>& v)
|
|
||||||
{
|
|
||||||
o.pack_map(v.size());
|
|
||||||
for(typename type::assoc_vector<K,V>::const_iterator it(v.begin()), it_end(v.end());
|
|
||||||
it != it_end; ++it) {
|
|
||||||
o.pack(it->first);
|
|
||||||
o.pack(it->second);
|
|
||||||
}
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template <typename K, typename V>
|
|
||||||
inline std::map<K, V> operator>> (object o, std::map<K, V>& v)
|
|
||||||
{
|
|
||||||
if(o.type != type::MAP) { throw type_error(); }
|
|
||||||
object_kv* p(o.via.map.ptr);
|
|
||||||
object_kv* const pend(o.via.map.ptr + o.via.map.size);
|
|
||||||
for(; p != pend; ++p) {
|
|
||||||
K key;
|
|
||||||
p->key.convert(&key);
|
|
||||||
typename std::map<K,V>::iterator it(v.lower_bound(key));
|
|
||||||
if(it != v.end() && !(key < it->first)) {
|
|
||||||
p->val.convert(&it->second);
|
|
||||||
} else {
|
|
||||||
V val;
|
|
||||||
p->val.convert(&val);
|
|
||||||
v.insert(it, std::pair<K,V>(key, val));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return v;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename Stream, typename K, typename V>
|
|
||||||
inline packer<Stream>& operator<< (packer<Stream>& o, const std::map<K,V>& v)
|
|
||||||
{
|
|
||||||
o.pack_map(v.size());
|
|
||||||
for(typename std::map<K,V>::const_iterator it(v.begin()), it_end(v.end());
|
|
||||||
it != it_end; ++it) {
|
|
||||||
o.pack(it->first);
|
|
||||||
o.pack(it->second);
|
|
||||||
}
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template <typename K, typename V>
|
|
||||||
inline std::multimap<K, V> operator>> (object o, std::multimap<K, V>& v)
|
|
||||||
{
|
|
||||||
if(o.type != type::MAP) { throw type_error(); }
|
|
||||||
object_kv* p(o.via.map.ptr);
|
|
||||||
object_kv* const pend(o.via.map.ptr + o.via.map.size);
|
|
||||||
for(; p != pend; ++p) {
|
|
||||||
std::pair<K, V> value;
|
|
||||||
p->key.convert(&value.first);
|
|
||||||
p->val.convert(&value.second);
|
|
||||||
v.insert(value);
|
|
||||||
}
|
|
||||||
return v;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename Stream, typename K, typename V>
|
|
||||||
inline packer<Stream>& operator<< (packer<Stream>& o, const std::multimap<K,V>& v)
|
|
||||||
{
|
|
||||||
o.pack_map(v.size());
|
|
||||||
for(typename std::multimap<K,V>::const_iterator it(v.begin()), it_end(v.end());
|
|
||||||
it != it_end; ++it) {
|
|
||||||
o.pack(it->first);
|
|
||||||
o.pack(it->second);
|
|
||||||
}
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
} // namespace msgpack
|
|
||||||
|
|
||||||
#endif /* msgpack/type/map.hpp */
|
|
||||||
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// 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_TYPE_NIL_HPP__
|
|
||||||
#define MSGPACK_TYPE_NIL_HPP__
|
|
||||||
|
|
||||||
#include "msgpack/object.hpp"
|
|
||||||
|
|
||||||
namespace msgpack {
|
|
||||||
|
|
||||||
namespace type {
|
|
||||||
|
|
||||||
struct nil { };
|
|
||||||
|
|
||||||
} // namespace type
|
|
||||||
|
|
||||||
|
|
||||||
inline type::nil& operator>> (object o, type::nil& v)
|
|
||||||
{
|
|
||||||
if(o.type != type::NIL) { throw type_error(); }
|
|
||||||
return v;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename Stream>
|
|
||||||
inline packer<Stream>& operator<< (packer<Stream>& o, const type::nil& v)
|
|
||||||
{
|
|
||||||
o.pack_nil();
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
} // namespace msgpack
|
|
||||||
|
|
||||||
#endif /* msgpack/type/nil.hpp */
|
|
||||||
|
|
||||||
103
cpp/type/raw.hpp
103
cpp/type/raw.hpp
@@ -1,103 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// 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_TYPE_RAW_HPP__
|
|
||||||
#define MSGPACK_TYPE_RAW_HPP__
|
|
||||||
|
|
||||||
#include "msgpack/object.hpp"
|
|
||||||
#include <string.h>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
namespace msgpack {
|
|
||||||
|
|
||||||
namespace type {
|
|
||||||
|
|
||||||
struct raw_ref {
|
|
||||||
raw_ref() : size(0), ptr(NULL) {}
|
|
||||||
raw_ref(const char* p, uint32_t s) : size(s), ptr(p) {}
|
|
||||||
|
|
||||||
uint32_t size;
|
|
||||||
const char* ptr;
|
|
||||||
|
|
||||||
std::string str() { return std::string(ptr, size); }
|
|
||||||
|
|
||||||
bool operator== (const raw_ref& x)
|
|
||||||
{
|
|
||||||
return size == x.size && memcmp(ptr, x.ptr, size) == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator!= (const raw_ref& x)
|
|
||||||
{
|
|
||||||
return !(*this != x);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator< (const raw_ref& x)
|
|
||||||
{
|
|
||||||
if(size == x.size) { return memcmp(ptr, x.ptr, size) < 0; }
|
|
||||||
else { return size < x.size; }
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator> (const raw_ref& x)
|
|
||||||
{
|
|
||||||
if(size == x.size) { return memcmp(ptr, x.ptr, size) > 0; }
|
|
||||||
else { return size > x.size; }
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace type
|
|
||||||
|
|
||||||
|
|
||||||
inline type::raw_ref& operator>> (object o, type::raw_ref& v)
|
|
||||||
{
|
|
||||||
if(o.type != type::RAW) { throw type_error(); }
|
|
||||||
v.ptr = o.via.raw.ptr;
|
|
||||||
v.size = o.via.raw.size;
|
|
||||||
return v;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline std::string& operator>> (object o, std::string& v)
|
|
||||||
{
|
|
||||||
type::raw_ref r;
|
|
||||||
o >> r;
|
|
||||||
v.assign(r.ptr, r.size);
|
|
||||||
return v;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template <typename Stream>
|
|
||||||
inline packer<Stream>& operator<< (packer<Stream>& o, const type::raw_ref& v)
|
|
||||||
{
|
|
||||||
o.pack_raw(v.size);
|
|
||||||
o.pack_raw_body(v.ptr, v.size);
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template <typename Stream>
|
|
||||||
inline packer<Stream>& operator<< (packer<Stream>& o, const std::string& v)
|
|
||||||
{
|
|
||||||
o.pack_raw(v.size());
|
|
||||||
o.pack_raw_body(v.data(), v.size());
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
} // namespace msgpack
|
|
||||||
|
|
||||||
#endif /* msgpack/type/raw.hpp */
|
|
||||||
|
|
||||||
@@ -1,169 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// 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_TYPE_TUPLE_HPP__
|
|
||||||
#define MSGPACK_TYPE_TUPLE_HPP__
|
|
||||||
|
|
||||||
#include "msgpack/object.hpp"
|
|
||||||
|
|
||||||
namespace msgpack {
|
|
||||||
|
|
||||||
namespace type {
|
|
||||||
|
|
||||||
// FIXME operator==
|
|
||||||
// FIXME operator!=
|
|
||||||
<% GENERATION_LIMIT = 15 %>
|
|
||||||
|
|
||||||
template <typename A0 = void<%1.upto(GENERATION_LIMIT+1) {|i|%>, typename A<%=i%> = void<%}%>>
|
|
||||||
struct tuple;
|
|
||||||
|
|
||||||
template <typename Tuple, int N>
|
|
||||||
struct tuple_element;
|
|
||||||
|
|
||||||
template <typename Tuple, int N>
|
|
||||||
struct const_tuple_element;
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct tuple_type {
|
|
||||||
typedef T type;
|
|
||||||
typedef T value_type;
|
|
||||||
typedef T& reference;
|
|
||||||
typedef const T& const_reference;
|
|
||||||
typedef const T& transparent_reference;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct tuple_type<T&> {
|
|
||||||
typedef T type;
|
|
||||||
typedef T& value_type;
|
|
||||||
typedef T& reference;
|
|
||||||
typedef const T& const_reference;
|
|
||||||
typedef T& transparent_reference;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct tuple_type<const T&> {
|
|
||||||
typedef T type;
|
|
||||||
typedef T& value_type;
|
|
||||||
typedef T& reference;
|
|
||||||
typedef const T& const_reference;
|
|
||||||
typedef const T& transparent_reference;
|
|
||||||
};
|
|
||||||
|
|
||||||
<%0.upto(GENERATION_LIMIT) {|i|%>
|
|
||||||
<%0.upto(i) {|j|%>
|
|
||||||
template <typename A0<%1.upto(i) {|k|%>, typename A<%=k%><%}%>>
|
|
||||||
struct tuple_element<tuple<A0<%1.upto(i) {|k|%>, A<%=k%><%}%>>, <%=j%>> : tuple_type<A<%=j%>> {
|
|
||||||
tuple_element(tuple<A0<%1.upto(i) {|k|%>, A<%=k%> <%}%>>& x) : _x(x.a<%=j%>) {}
|
|
||||||
typename tuple_type<A<%=j%>>::reference get() { return _x; }
|
|
||||||
typename tuple_type<A<%=j%>>::const_reference get() const { return _x; }
|
|
||||||
private:
|
|
||||||
typename tuple_type<A<%=j%>>::reference _x;
|
|
||||||
};
|
|
||||||
<%}%>
|
|
||||||
<%}%>
|
|
||||||
|
|
||||||
<%0.upto(GENERATION_LIMIT) {|i|%>
|
|
||||||
<%0.upto(i) {|j|%>
|
|
||||||
template <typename A0<%1.upto(i) {|k|%>, typename A<%=k%><%}%>>
|
|
||||||
struct const_tuple_element<tuple<A0<%1.upto(i) {|k|%>, A<%=k%><%}%>>, <%=j%>> : tuple_type<A<%=j%>> {
|
|
||||||
const_tuple_element(const tuple<A0<%1.upto(i) {|k|%>, A<%=k%><%}%>>& x) : _x(x.a<%=j%>) {}
|
|
||||||
typename tuple_type<A<%=j%>>::const_reference get() const { return _x; }
|
|
||||||
private:
|
|
||||||
typename tuple_type<A<%=j%>>::const_reference _x;
|
|
||||||
};
|
|
||||||
<%}%>
|
|
||||||
<%}%>
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct tuple<> {
|
|
||||||
typedef tuple<> value_type;
|
|
||||||
};
|
|
||||||
<%0.upto(GENERATION_LIMIT) {|i|%>
|
|
||||||
template <typename A0<%1.upto(i) {|j|%>, typename A<%=j%><%}%>>
|
|
||||||
struct tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> {
|
|
||||||
typedef tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> value_type;
|
|
||||||
tuple() {}
|
|
||||||
tuple(typename tuple_type<A0>::transparent_reference _a0<%1.upto(i) {|j|%>, typename tuple_type<A<%=j%>>::transparent_reference _a<%=j%><%}%>) :
|
|
||||||
a0(_a0)<%1.upto(i) {|j|%>, a<%=j%>(_a<%=j%>)<%}%> {}
|
|
||||||
tuple(object o) { o.convert(this); }
|
|
||||||
template <int N> typename tuple_element<value_type, N>::reference get()
|
|
||||||
{ return tuple_element<value_type, N>(*this).get(); }
|
|
||||||
template <int N> typename const_tuple_element<value_type, N>::const_reference get() const
|
|
||||||
{ return const_tuple_element<value_type, N>(*this).get(); }
|
|
||||||
<%0.upto(i) {|j|%>
|
|
||||||
A<%=j%> a<%=j%>;<%}%>
|
|
||||||
};
|
|
||||||
<%}%>
|
|
||||||
|
|
||||||
inline tuple<> make_tuple()
|
|
||||||
{
|
|
||||||
return tuple<>();
|
|
||||||
}
|
|
||||||
<%0.upto(GENERATION_LIMIT) {|i|%>
|
|
||||||
template <typename A0<%1.upto(i) {|j|%>, typename A<%=j%><%}%>>
|
|
||||||
tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> make_tuple(typename tuple_type<A0>::transparent_reference a0<%1.upto(i) {|j|%>, typename tuple_type<A<%=j%>>::transparent_reference a<%=j%><%}%>)
|
|
||||||
{
|
|
||||||
return tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>>(a0<%1.upto(i) {|j|%>, a<%=j%><%}%>);
|
|
||||||
}
|
|
||||||
<%}%>
|
|
||||||
|
|
||||||
} // namespace type
|
|
||||||
|
|
||||||
|
|
||||||
inline type::tuple<>& operator>> (
|
|
||||||
object o,
|
|
||||||
type::tuple<>& v) {
|
|
||||||
if(o.type != type::ARRAY) { throw type_error(); }
|
|
||||||
return v;
|
|
||||||
}
|
|
||||||
<%0.upto(GENERATION_LIMIT) {|i|%>
|
|
||||||
template <typename A0<%1.upto(i) {|j|%>, typename A<%=j%><%}%>>
|
|
||||||
type::tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>>& operator>> (
|
|
||||||
object o,
|
|
||||||
type::tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>>& v) {
|
|
||||||
if(o.type != type::ARRAY) { throw type_error(); }
|
|
||||||
if(o.via.array.size < <%=i+1%>) { throw type_error(); }
|
|
||||||
<%0.upto(i) {|j|%>
|
|
||||||
o.via.array.ptr[<%=j%>].convert<A<%=j%>>(&v.template get<<%=j%>>());<%}%>
|
|
||||||
return v;
|
|
||||||
}
|
|
||||||
<%}%>
|
|
||||||
|
|
||||||
template <typename Stream>
|
|
||||||
const packer<Stream>& operator<< (
|
|
||||||
packer<Stream>& o,
|
|
||||||
const type::tuple<>& v) {
|
|
||||||
o.pack_array(0);
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
<%0.upto(GENERATION_LIMIT) {|i|%>
|
|
||||||
template <typename Stream, typename A0<%1.upto(i) {|j|%>, typename A<%=j%><%}%>>
|
|
||||||
const packer<Stream>& operator<< (
|
|
||||||
packer<Stream>& o,
|
|
||||||
const type::tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>>& v) {
|
|
||||||
o.pack_array(<%=i+1%>);
|
|
||||||
<%0.upto(i) {|j|%>
|
|
||||||
o.pack(v.template get<<%=j%>>());<%}%>
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
<%}%>
|
|
||||||
|
|
||||||
} // namespace msgpack
|
|
||||||
|
|
||||||
#endif /* msgpack/type/tuple.hpp */
|
|
||||||
|
|
||||||
301
cpp/unpack.hpp
301
cpp/unpack.hpp
@@ -1,301 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ deserializing routine
|
|
||||||
//
|
|
||||||
// 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_HPP__
|
|
||||||
#define MSGPACK_UNPACK_HPP__
|
|
||||||
|
|
||||||
#include "msgpack/unpack.h"
|
|
||||||
#include "msgpack/object.hpp"
|
|
||||||
#include "msgpack/zone.hpp"
|
|
||||||
#include <memory>
|
|
||||||
#include <stdexcept>
|
|
||||||
|
|
||||||
#ifndef MSGPACK_UNPACKER_DEFAULT_INITIAL_BUFFER_SIZE
|
|
||||||
#define MSGPACK_UNPACKER_DEFAULT_INITIAL_BUFFER_SIZE (32*1024)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace msgpack {
|
|
||||||
|
|
||||||
|
|
||||||
struct unpack_error : public std::runtime_error {
|
|
||||||
unpack_error(const std::string& msg) :
|
|
||||||
std::runtime_error(msg) { }
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
class unpacker : public msgpack_unpacker {
|
|
||||||
public:
|
|
||||||
unpacker(size_t init_buffer_size = MSGPACK_UNPACKER_DEFAULT_INITIAL_BUFFER_SIZE);
|
|
||||||
~unpacker();
|
|
||||||
|
|
||||||
public:
|
|
||||||
/*! 1. reserve buffer. at least `size' bytes of capacity will be ready */
|
|
||||||
void reserve_buffer(size_t size);
|
|
||||||
|
|
||||||
/*! 2. read data to the buffer() up to buffer_capacity() bytes */
|
|
||||||
char* buffer();
|
|
||||||
size_t buffer_capacity() const;
|
|
||||||
|
|
||||||
/*! 3. specify the number of bytes actually copied */
|
|
||||||
void buffer_consumed(size_t size);
|
|
||||||
|
|
||||||
/*! 4. repeat execute() until it retunrs false */
|
|
||||||
bool execute();
|
|
||||||
|
|
||||||
/*! 5.1. if execute() returns true, take out the parsed object */
|
|
||||||
object data();
|
|
||||||
|
|
||||||
/*! 5.2. the object is valid until the zone is deleted */
|
|
||||||
// Note that once release_zone() from unpacker, you must delete it
|
|
||||||
// otherwise the memrory will leak.
|
|
||||||
zone* release_zone();
|
|
||||||
|
|
||||||
/*! 5.2. this method is equivalence to `delete release_zone()` */
|
|
||||||
void reset_zone();
|
|
||||||
|
|
||||||
/*! 5.3. after release_zone(), re-initialize unpacker */
|
|
||||||
void reset();
|
|
||||||
|
|
||||||
/*! 6. check if the size of message doesn't exceed assumption. */
|
|
||||||
size_t message_size() const;
|
|
||||||
|
|
||||||
|
|
||||||
// Basic usage of the unpacker is as following:
|
|
||||||
//
|
|
||||||
// msgpack::unpacker pac;
|
|
||||||
//
|
|
||||||
// while( /* readable */ ) {
|
|
||||||
//
|
|
||||||
// // 1.
|
|
||||||
// pac.reserve(1024);
|
|
||||||
//
|
|
||||||
// // 2.
|
|
||||||
// ssize_t bytes =
|
|
||||||
// read(the_source, pac.buffer(), pac.buffer_capacity());
|
|
||||||
//
|
|
||||||
// // error handling ...
|
|
||||||
//
|
|
||||||
// // 3.
|
|
||||||
// pac.buffer_consumed(bytes);
|
|
||||||
//
|
|
||||||
// // 4.
|
|
||||||
// while(pac.execute()) {
|
|
||||||
// // 5.1
|
|
||||||
// object o = pac.data();
|
|
||||||
//
|
|
||||||
// // 5.2
|
|
||||||
// std::auto_ptr<msgpack::zone> olife( pac.release_zone() );
|
|
||||||
//
|
|
||||||
// // boost::shared_ptr is also usable:
|
|
||||||
// // boost::shared_ptr<msgpack::zone> olife( pac.release_zone() );
|
|
||||||
//
|
|
||||||
// // 5.3
|
|
||||||
// pac.reset();
|
|
||||||
//
|
|
||||||
// // do some with the object with the old zone.
|
|
||||||
// do_something(o, olife);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
|
|
||||||
public:
|
|
||||||
// These functions are usable when non-MessagePack message follows after
|
|
||||||
// MessagePack message.
|
|
||||||
size_t parsed_size() const;
|
|
||||||
|
|
||||||
/*! get address of the buffer that is not parsed */
|
|
||||||
char* nonparsed_buffer();
|
|
||||||
size_t nonparsed_size() const;
|
|
||||||
|
|
||||||
/*! skip specified size of non-parsed buffer, leaving the buffer */
|
|
||||||
// Note that the `size' argument must be smaller than nonparsed_size()
|
|
||||||
void skip_nonparsed_buffer(size_t size);
|
|
||||||
|
|
||||||
/*! remove unparsed buffer from unpacker */
|
|
||||||
// Note that reset() leaves non-parsed buffer.
|
|
||||||
void remove_nonparsed_buffer();
|
|
||||||
|
|
||||||
private:
|
|
||||||
typedef msgpack_unpacker base;
|
|
||||||
|
|
||||||
private:
|
|
||||||
unpacker(const unpacker&);
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
UNPACK_SUCCESS = 2,
|
|
||||||
UNPACK_EXTRA_BYTES = 1,
|
|
||||||
UNPACK_CONTINUE = 0,
|
|
||||||
UNPACK_PARSE_ERROR = -1,
|
|
||||||
} unpack_return;
|
|
||||||
|
|
||||||
static unpack_return unpack(const char* data, size_t len, size_t* off,
|
|
||||||
zone* z, object* result);
|
|
||||||
|
|
||||||
|
|
||||||
// obsolete
|
|
||||||
static object unpack(const char* data, size_t len, zone& z, size_t* off = NULL);
|
|
||||||
|
|
||||||
|
|
||||||
inline unpacker::unpacker(size_t initial_buffer_size)
|
|
||||||
{
|
|
||||||
if(!msgpack_unpacker_init(this, initial_buffer_size)) {
|
|
||||||
throw std::bad_alloc();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
inline unpacker::~unpacker()
|
|
||||||
{
|
|
||||||
msgpack_unpacker_destroy(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline void unpacker::reserve_buffer(size_t size)
|
|
||||||
{
|
|
||||||
if(!msgpack_unpacker_reserve_buffer(this, size)) {
|
|
||||||
throw std::bad_alloc();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
inline char* unpacker::buffer()
|
|
||||||
{
|
|
||||||
return msgpack_unpacker_buffer(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline size_t unpacker::buffer_capacity() const
|
|
||||||
{
|
|
||||||
return msgpack_unpacker_buffer_capacity(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void unpacker::buffer_consumed(size_t size)
|
|
||||||
{
|
|
||||||
return msgpack_unpacker_buffer_consumed(this, size);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline bool unpacker::execute()
|
|
||||||
{
|
|
||||||
int ret = msgpack_unpacker_execute(this);
|
|
||||||
if(ret < 0) {
|
|
||||||
throw unpack_error("parse error");
|
|
||||||
} else if(ret == 0) {
|
|
||||||
return false;
|
|
||||||
} else {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
inline object unpacker::data()
|
|
||||||
{
|
|
||||||
return msgpack_unpacker_data(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline zone* unpacker::release_zone()
|
|
||||||
{
|
|
||||||
if(!msgpack_unpacker_flush_zone(this)) {
|
|
||||||
throw std::bad_alloc();
|
|
||||||
}
|
|
||||||
|
|
||||||
zone* r = new zone();
|
|
||||||
|
|
||||||
msgpack_zone old = *base::z;
|
|
||||||
*base::z = *r;
|
|
||||||
*static_cast<msgpack_zone*>(r) = old;
|
|
||||||
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void unpacker::reset_zone()
|
|
||||||
{
|
|
||||||
msgpack_unpacker_reset_zone(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void unpacker::reset()
|
|
||||||
{
|
|
||||||
msgpack_unpacker_reset(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline size_t unpacker::message_size() const
|
|
||||||
{
|
|
||||||
return msgpack_unpacker_message_size(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline size_t unpacker::parsed_size() const
|
|
||||||
{
|
|
||||||
return msgpack_unpacker_parsed_size(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline char* unpacker::nonparsed_buffer()
|
|
||||||
{
|
|
||||||
return base::buffer + base::off;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline size_t unpacker::nonparsed_size() const
|
|
||||||
{
|
|
||||||
return base::used - base::off;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void unpacker::skip_nonparsed_buffer(size_t size)
|
|
||||||
{
|
|
||||||
base::off += size;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void unpacker::remove_nonparsed_buffer()
|
|
||||||
{
|
|
||||||
base::used = base::off;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline unpack_return unpack(const char* data, size_t len, size_t* off,
|
|
||||||
zone* z, object* result)
|
|
||||||
{
|
|
||||||
return (unpack_return)msgpack_unpack(data, len, off,
|
|
||||||
z, reinterpret_cast<msgpack_object*>(result));
|
|
||||||
}
|
|
||||||
|
|
||||||
// obsolete
|
|
||||||
inline object unpack(const char* data, size_t len, zone& z, size_t* off)
|
|
||||||
{
|
|
||||||
object result;
|
|
||||||
|
|
||||||
switch( msgpack::unpack(data, len, off, &z, &result) ) {
|
|
||||||
case UNPACK_SUCCESS:
|
|
||||||
return result;
|
|
||||||
|
|
||||||
case UNPACK_EXTRA_BYTES:
|
|
||||||
if(off) {
|
|
||||||
return result;
|
|
||||||
} else {
|
|
||||||
throw unpack_error("extra bytes");
|
|
||||||
}
|
|
||||||
|
|
||||||
case UNPACK_CONTINUE:
|
|
||||||
throw unpack_error("insufficient bytes");
|
|
||||||
|
|
||||||
case UNPACK_PARSE_ERROR:
|
|
||||||
default:
|
|
||||||
throw unpack_error("parse error");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
} // namespace msgpack
|
|
||||||
|
|
||||||
#endif /* msgpack/unpack.hpp */
|
|
||||||
|
|
||||||
@@ -1,85 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ zero-copy buffer implementation
|
|
||||||
//
|
|
||||||
// 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_VREFBUFFER_HPP__
|
|
||||||
#define MSGPACK_VREFBUFFER_HPP__
|
|
||||||
|
|
||||||
#include "msgpack/vrefbuffer.h"
|
|
||||||
#include <stdexcept>
|
|
||||||
|
|
||||||
namespace msgpack {
|
|
||||||
|
|
||||||
|
|
||||||
class vrefbuffer : public msgpack_vrefbuffer {
|
|
||||||
public:
|
|
||||||
vrefbuffer(size_t ref_size = MSGPACK_VREFBUFFER_REF_SIZE,
|
|
||||||
size_t chunk_size = MSGPACK_VREFBUFFER_CHUNK_SIZE)
|
|
||||||
{
|
|
||||||
msgpack_vrefbuffer_init(this, ref_size, chunk_size);
|
|
||||||
}
|
|
||||||
|
|
||||||
~vrefbuffer()
|
|
||||||
{
|
|
||||||
msgpack_vrefbuffer_destroy(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
public:
|
|
||||||
void write(const char* buf, unsigned int len)
|
|
||||||
{
|
|
||||||
if(len < base::ref_size) {
|
|
||||||
append_copy(buf, len);
|
|
||||||
} else {
|
|
||||||
append_ref(buf, len);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void append_ref(const char* buf, size_t len)
|
|
||||||
{
|
|
||||||
if(msgpack_vrefbuffer_append_ref(this, buf, len) < 0) {
|
|
||||||
throw std::bad_alloc();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void append_copy(const char* buf, size_t len)
|
|
||||||
{
|
|
||||||
if(msgpack_vrefbuffer_append_copy(this, buf, len) < 0) {
|
|
||||||
throw std::bad_alloc();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const struct iovec* vector() const
|
|
||||||
{
|
|
||||||
return msgpack_vrefbuffer_vec(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t vector_size() const
|
|
||||||
{
|
|
||||||
return msgpack_vrefbuffer_veclen(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
typedef msgpack_vrefbuffer base;
|
|
||||||
|
|
||||||
private:
|
|
||||||
vrefbuffer(const vrefbuffer&);
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
} // namespace msgpack
|
|
||||||
|
|
||||||
#endif /* msgpack/vrefbuffer.hpp */
|
|
||||||
|
|
||||||
137
cpp/zone.hpp.erb
137
cpp/zone.hpp.erb
@@ -1,137 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ memory pool
|
|
||||||
//
|
|
||||||
// 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_ZONE_HPP__
|
|
||||||
#define MSGPACK_ZONE_HPP__
|
|
||||||
|
|
||||||
#include "msgpack/object.hpp"
|
|
||||||
#include "msgpack/zone.h"
|
|
||||||
#include <cstdlib>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
<% GENERATION_LIMIT = 15 %>
|
|
||||||
namespace msgpack {
|
|
||||||
|
|
||||||
|
|
||||||
class zone : public msgpack_zone {
|
|
||||||
public:
|
|
||||||
zone(size_t chunk_size = MSGPACK_ZONE_CHUNK_SIZE);
|
|
||||||
~zone();
|
|
||||||
|
|
||||||
public:
|
|
||||||
void* malloc(size_t size);
|
|
||||||
void* malloc_no_align(size_t size);
|
|
||||||
|
|
||||||
void push_finalizer(void (*func)(void*), void* data);
|
|
||||||
|
|
||||||
void clear();
|
|
||||||
|
|
||||||
<%0.upto(GENERATION_LIMIT) {|i|%>
|
|
||||||
template <typename T<%1.upto(i) {|j|%>, typename A<%=j%><%}%>>
|
|
||||||
T* allocate(<%=(1..i).map{|j|"A#{j} a#{j}"}.join(', ')%>);
|
|
||||||
<%}%>
|
|
||||||
|
|
||||||
private:
|
|
||||||
void undo_malloc(size_t size);
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
static void object_destructor(void* obj);
|
|
||||||
|
|
||||||
typedef msgpack_zone base;
|
|
||||||
|
|
||||||
private:
|
|
||||||
zone(const zone&);
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
inline zone::zone(size_t chunk_size)
|
|
||||||
{
|
|
||||||
msgpack_zone_init(this, chunk_size);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline zone::~zone()
|
|
||||||
{
|
|
||||||
msgpack_zone_destroy(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void* zone::malloc(size_t size)
|
|
||||||
{
|
|
||||||
void* ptr = msgpack_zone_malloc(this, size);
|
|
||||||
if(!ptr) {
|
|
||||||
throw std::bad_alloc();
|
|
||||||
}
|
|
||||||
return ptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void* zone::malloc_no_align(size_t size)
|
|
||||||
{
|
|
||||||
void* ptr = msgpack_zone_malloc_no_align(this, size);
|
|
||||||
if(!ptr) {
|
|
||||||
throw std::bad_alloc();
|
|
||||||
}
|
|
||||||
return ptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void zone::push_finalizer(void (*func)(void*), void* data)
|
|
||||||
{
|
|
||||||
if(!msgpack_zone_push_finalizer(this, func, data)) {
|
|
||||||
throw std::bad_alloc();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void zone::clear()
|
|
||||||
{
|
|
||||||
msgpack_zone_clear(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
void zone::object_destructor(void* obj)
|
|
||||||
{
|
|
||||||
reinterpret_cast<T*>(obj)->~T();
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void zone::undo_malloc(size_t size)
|
|
||||||
{
|
|
||||||
msgpack_zone_chunk* chunk = base::chunk_array.tail;
|
|
||||||
chunk->ptr -= size;
|
|
||||||
chunk->free += size;
|
|
||||||
}
|
|
||||||
|
|
||||||
<%0.upto(GENERATION_LIMIT) {|i|%>
|
|
||||||
template <typename T<%1.upto(i) {|j|%>, typename A<%=j%><%}%>>
|
|
||||||
T* zone::allocate(<%=(1..i).map{|j|"A#{j} a#{j}"}.join(', ')%>)
|
|
||||||
{
|
|
||||||
void* x = malloc(sizeof(T));
|
|
||||||
if(!msgpack_zone_push_finalizer(this, &zone::object_destructor<T>, x)) {
|
|
||||||
undo_malloc(sizeof(T));
|
|
||||||
throw std::bad_alloc();
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
return new (x) T(<%=(1..i).map{|j|"a#{j}"}.join(', ')%>);
|
|
||||||
} catch (...) {
|
|
||||||
--base::finalizer_array.tail;
|
|
||||||
undo_malloc(sizeof(T));
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
<%}%>
|
|
||||||
|
|
||||||
} // namespace msgpack
|
|
||||||
|
|
||||||
#endif /* msgpack/zone.hpp */
|
|
||||||
|
|
||||||
44
example/CMakeLists.txt
Normal file
44
example/CMakeLists.txt
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
FIND_PACKAGE (cJSON)
|
||||||
|
|
||||||
|
LIST (APPEND exec_PROGRAMS
|
||||||
|
boundary.c
|
||||||
|
lib_buffer_unpack.c
|
||||||
|
simple_c.c
|
||||||
|
speed_test_uint32_array.c
|
||||||
|
speed_test_uint64_array.c
|
||||||
|
user_buffer_unpack.c
|
||||||
|
)
|
||||||
|
IF (cJSON_FOUND)
|
||||||
|
LIST (APPEND exec_PROGRAMS jsonconv.c)
|
||||||
|
ENDIF ()
|
||||||
|
|
||||||
|
FOREACH (source_file ${exec_PROGRAMS})
|
||||||
|
GET_FILENAME_COMPONENT (source_file_we ${source_file} NAME_WE)
|
||||||
|
ADD_EXECUTABLE (
|
||||||
|
${source_file_we}
|
||||||
|
${source_file}
|
||||||
|
)
|
||||||
|
TARGET_LINK_LIBRARIES (${source_file_we}
|
||||||
|
msgpack-c
|
||||||
|
)
|
||||||
|
IF ("${CMAKE_C_COMPILER_ID}" STREQUAL "Clang" OR "${CMAKE_C_COMPILER_ID}" STREQUAL "GNU")
|
||||||
|
SET_PROPERTY (TARGET ${source_file_we} APPEND_STRING PROPERTY COMPILE_FLAGS " -Wall -Wextra")
|
||||||
|
ENDIF ()
|
||||||
|
|
||||||
|
IF ("${CMAKE_C_COMPILER_ID}" STREQUAL "Clang")
|
||||||
|
SET_PROPERTY (TARGET ${source_file_we} APPEND_STRING PROPERTY COMPILE_FLAGS " -Wno-mismatched-tags")
|
||||||
|
ENDIF ()
|
||||||
|
|
||||||
|
IF ("${CMAKE_C_COMPILER_ID}" STREQUAL "MSVC")
|
||||||
|
IF (CMAKE_C_FLAGS MATCHES "/W[0-4]")
|
||||||
|
STRING(REGEX REPLACE "/W[0-4]" "/W3 /WX" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
|
||||||
|
ELSE ()
|
||||||
|
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W3 /WX")
|
||||||
|
ENDIF ()
|
||||||
|
ENDIF ()
|
||||||
|
ENDFOREACH ()
|
||||||
|
|
||||||
|
IF (cJSON_FOUND)
|
||||||
|
TARGET_LINK_LIBRARIES (jsonconv ${CJSON_LIBRARIES})
|
||||||
|
TARGET_INCLUDE_DIRECTORIES(jsonconv PRIVATE ${CJSON_INCLUDE_DIRS})
|
||||||
|
ENDIF ()
|
||||||
296
example/boundary.c
Normal file
296
example/boundary.c
Normal file
@@ -0,0 +1,296 @@
|
|||||||
|
/* gcc boundary.c -o boundary -Wconversion -Wpointer-sign */
|
||||||
|
#include <msgpack.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
|
static inline unsigned char atohex(char a)
|
||||||
|
{
|
||||||
|
int x;
|
||||||
|
if (a >= 'a') {
|
||||||
|
x = a - 'a' + 10;
|
||||||
|
} else if (a >= 'A') {
|
||||||
|
x = a - 'A' + 10;
|
||||||
|
} else {
|
||||||
|
x = a - '0';
|
||||||
|
}
|
||||||
|
assert(x >= 0 && x < 16);
|
||||||
|
return (unsigned char)x;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return 0 if equal
|
||||||
|
static inline int bytesncmp(char *data, const char *bytes, size_t len)
|
||||||
|
{
|
||||||
|
size_t n = len >> 1;
|
||||||
|
size_t i = 0;
|
||||||
|
int diff;
|
||||||
|
for (; i < n; i++) {
|
||||||
|
diff = (unsigned char)data[i] - (atohex(bytes[2 * i]) << 4) - atohex(bytes[2 * i + 1]);
|
||||||
|
if (diff != 0) {
|
||||||
|
return diff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
msgpack_sbuffer sbuf;
|
||||||
|
msgpack_packer *x;
|
||||||
|
size_t offset = 0;
|
||||||
|
char data[65536];
|
||||||
|
msgpack_timestamp ts[] = {
|
||||||
|
{ 0xFFFFFFFF, 0 },
|
||||||
|
{ 0x100000000, 0 },
|
||||||
|
{ 0x3FFFFFFFF, 0 },
|
||||||
|
{ 0x400000000, 0 },
|
||||||
|
{ INT64_MAX, UINT32_MAX }
|
||||||
|
};
|
||||||
|
|
||||||
|
#define check_sbuffer(b) \
|
||||||
|
do { \
|
||||||
|
size_t len = strlen(#b); \
|
||||||
|
assert((sbuf.size - offset) * 2 == len); \
|
||||||
|
assert(bytesncmp(sbuf.data + offset, #b, len) == 0); \
|
||||||
|
offset = sbuf.size; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
msgpack_sbuffer_init(&sbuf);
|
||||||
|
x = msgpack_packer_new(&sbuf, msgpack_sbuffer_write);
|
||||||
|
|
||||||
|
msgpack_pack_fix_uint8(x, 0); check_sbuffer(cc00); /* cc 00 */
|
||||||
|
msgpack_pack_fix_uint8(x, 0xFF); check_sbuffer(ccff); /* cc ff */
|
||||||
|
msgpack_pack_fix_uint16(x, 0); check_sbuffer(cd0000); /* cd 00 00 */
|
||||||
|
msgpack_pack_fix_uint16(x, 0xFFFF); check_sbuffer(cdffff); /* cd ff ff */
|
||||||
|
msgpack_pack_fix_uint32(x, 0); check_sbuffer(ce00000000); /* ce 00 00 00 00 */
|
||||||
|
msgpack_pack_fix_uint32(x, 0xFFFFFFFF); check_sbuffer(ceffffffff); /* ce ff ff ff ff */
|
||||||
|
msgpack_pack_fix_uint64(x, 0); check_sbuffer(cf0000000000000000); /* cf 00 00 00 00 00 00 00 00 */
|
||||||
|
msgpack_pack_fix_uint64(x, 0xFFFFFFFFFFFFFFFF); check_sbuffer(cfffffffffffffffff); /* cf ff ff ff ff ff ff ff ff */
|
||||||
|
|
||||||
|
msgpack_pack_uint8(x, 0); check_sbuffer(00); /* 00 */
|
||||||
|
msgpack_pack_uint8(x, 0x7F); check_sbuffer(7f); /* 7f */
|
||||||
|
msgpack_pack_uint8(x, 0x80); check_sbuffer(cc80); /* cc 80 */
|
||||||
|
msgpack_pack_uint8(x, 0xFF); check_sbuffer(ccff); /* cc ff */
|
||||||
|
|
||||||
|
msgpack_pack_uint16(x, 0); check_sbuffer(00); /* 00 */
|
||||||
|
msgpack_pack_uint16(x, 0x7F); check_sbuffer(7f); /* 7f */
|
||||||
|
msgpack_pack_uint16(x, 0x80); check_sbuffer(cc80); /* cc 80 */
|
||||||
|
msgpack_pack_uint16(x, 0xFF); check_sbuffer(ccff); /* cc ff */
|
||||||
|
msgpack_pack_uint16(x, 0x100); check_sbuffer(cd0100); /* cd 01 00 */
|
||||||
|
msgpack_pack_uint16(x, 0xFFFF); check_sbuffer(cdffff); /* cd ff ff */
|
||||||
|
|
||||||
|
msgpack_pack_uint32(x, 0); check_sbuffer(00); /* 00 */
|
||||||
|
msgpack_pack_uint32(x, 0x7F); check_sbuffer(7f); /* 7f */
|
||||||
|
msgpack_pack_uint32(x, 0x80); check_sbuffer(cc80); /* cc 80 */
|
||||||
|
msgpack_pack_uint32(x, 0xFF); check_sbuffer(ccff); /* cc ff */
|
||||||
|
msgpack_pack_uint32(x, 0x100); check_sbuffer(cd0100); /* cd 01 00 */
|
||||||
|
msgpack_pack_uint32(x, 0xFFFF); check_sbuffer(cdffff); /* cd ff ff */
|
||||||
|
msgpack_pack_uint32(x, 0x10000); check_sbuffer(ce00010000); /* ce 00 01 00 00 */
|
||||||
|
msgpack_pack_uint32(x, 0xFFFFFFFF); check_sbuffer(ceffffffff); /* ce ff ff ff ff */
|
||||||
|
|
||||||
|
msgpack_pack_uint64(x, 0); check_sbuffer(00); /* 00 */
|
||||||
|
msgpack_pack_uint64(x, 0x7F); check_sbuffer(7f); /* 7f */
|
||||||
|
msgpack_pack_uint64(x, 0x80); check_sbuffer(cc80); /* cc 80 */
|
||||||
|
msgpack_pack_uint64(x, 0xFF); check_sbuffer(ccff); /* cc ff */
|
||||||
|
msgpack_pack_uint64(x, 0x100); check_sbuffer(cd0100); /* cd 01 00 */
|
||||||
|
msgpack_pack_uint64(x, 0xFFFF); check_sbuffer(cdffff); /* cd ff ff */
|
||||||
|
msgpack_pack_uint64(x, 0x10000); check_sbuffer(ce00010000); /* ce 00 01 00 00 */
|
||||||
|
msgpack_pack_uint64(x, 0xFFFFFFFF); check_sbuffer(ceffffffff); /* ce ff ff ff ff */
|
||||||
|
msgpack_pack_uint64(x, 0x100000000); check_sbuffer(cf0000000100000000); /* cf 00 00 00 01 00 00 00 00 */
|
||||||
|
msgpack_pack_uint64(x, 0xFFFFFFFFFFFFFFFF); check_sbuffer(cfffffffffffffffff); /* cf ff ff ff ff ff ff ff ff */
|
||||||
|
|
||||||
|
msgpack_pack_fix_int8(x, 0x7F); check_sbuffer(d07f); /* d0 7f */
|
||||||
|
msgpack_pack_fix_int8(x, -0x7F-1); check_sbuffer(d080); /* d0 80 */
|
||||||
|
msgpack_pack_fix_int16(x, 0x7FFF); check_sbuffer(d17fff); /* d1 7f ff */
|
||||||
|
msgpack_pack_fix_int16(x, -0x7FFF-1); check_sbuffer(d18000); /* d1 80 00 */
|
||||||
|
msgpack_pack_fix_int32(x, 0x7FFFFFFF); check_sbuffer(d27fffffff); /* d2 7f ff ff ff */
|
||||||
|
msgpack_pack_fix_int32(x, -0x7FFFFFFF-1); check_sbuffer(d280000000); /* d2 80 00 00 00 */
|
||||||
|
msgpack_pack_fix_int64(x, 0x7FFFFFFFFFFFFFFF); check_sbuffer(d37fffffffffffffff); /* d3 7f ff ff ff ff ff ff ff */
|
||||||
|
msgpack_pack_fix_int64(x, -0x7FFFFFFFFFFFFFFF-1); check_sbuffer(d38000000000000000); /* d3 80 00 00 00 00 00 00 00 */
|
||||||
|
|
||||||
|
msgpack_pack_int8(x, -0x7F-1); check_sbuffer(d080); /* d0 80 */
|
||||||
|
msgpack_pack_int8(x, -0x21); check_sbuffer(d0df); /* d0 df */
|
||||||
|
msgpack_pack_int8(x, -0x20); check_sbuffer(e0); /* e0 */
|
||||||
|
msgpack_pack_int8(x, -1); check_sbuffer(ff); /* ff */
|
||||||
|
msgpack_pack_int8(x, 0); check_sbuffer(00); /* 00 */
|
||||||
|
msgpack_pack_int8(x, 0x7F); check_sbuffer(7f); /* 7f */
|
||||||
|
|
||||||
|
msgpack_pack_int16(x, -0x7FFF-1); check_sbuffer(d18000); /* d1 80 00 */
|
||||||
|
msgpack_pack_int16(x, -0x81); check_sbuffer(d1ff7f); /* d1 ff 7f */
|
||||||
|
msgpack_pack_int16(x, -0x80); check_sbuffer(d080); /* d0 80 */
|
||||||
|
msgpack_pack_int16(x, -0x21); check_sbuffer(d0df); /* d0 df */
|
||||||
|
msgpack_pack_int16(x, -0x20); check_sbuffer(e0); /* e0 */
|
||||||
|
msgpack_pack_int16(x, -0x1); check_sbuffer(ff); /* ff */
|
||||||
|
msgpack_pack_int16(x, 0); check_sbuffer(00); /* 00 */
|
||||||
|
msgpack_pack_int16(x, 0x7F); check_sbuffer(7f); /* 7f */
|
||||||
|
msgpack_pack_int16(x, 0x80); check_sbuffer(cc80); /* cc 80 */
|
||||||
|
msgpack_pack_int16(x, 0xFF); check_sbuffer(ccff); /* cc ff */
|
||||||
|
msgpack_pack_int16(x, 0x100); check_sbuffer(cd0100); /* cd 01 00 */
|
||||||
|
msgpack_pack_int16(x, 0x7FFF); check_sbuffer(cd7fff); /* cd 7f ff */
|
||||||
|
|
||||||
|
msgpack_pack_int32(x, -0x7FFFFFFF-1); check_sbuffer(d280000000); /* d2 80 00 00 00 */
|
||||||
|
msgpack_pack_int32(x, -0x8001); check_sbuffer(d2ffff7fff); /* d2 ff ff 7f ff */
|
||||||
|
msgpack_pack_int32(x, -0x8000); check_sbuffer(d18000); /* d1 80 00 */
|
||||||
|
msgpack_pack_int32(x, -0x81); check_sbuffer(d1ff7f); /* d1 ff 7f */
|
||||||
|
msgpack_pack_int32(x, -0x80); check_sbuffer(d080); /* d0 80 */
|
||||||
|
msgpack_pack_int32(x, -0x21); check_sbuffer(d0df); /* d0 df */
|
||||||
|
msgpack_pack_int32(x, -0x20); check_sbuffer(e0); /* e0 */
|
||||||
|
msgpack_pack_int32(x, -0x1); check_sbuffer(ff); /* ff */
|
||||||
|
msgpack_pack_int32(x, 0); check_sbuffer(00); /* 00 */
|
||||||
|
msgpack_pack_int32(x, 0x7F); check_sbuffer(7f); /* 7f */
|
||||||
|
msgpack_pack_int32(x, 0x80); check_sbuffer(cc80); /* cc 80 */
|
||||||
|
msgpack_pack_int32(x, 0xFF); check_sbuffer(ccff); /* cc ff */
|
||||||
|
msgpack_pack_int32(x, 0x100); check_sbuffer(cd0100); /* cd 01 00 */
|
||||||
|
msgpack_pack_int32(x, 0xFFFF); check_sbuffer(cdffff); /* cd ff ff */
|
||||||
|
msgpack_pack_int32(x, 0x10000); check_sbuffer(ce00010000); /* ce 00 01 00 00 */
|
||||||
|
msgpack_pack_int32(x, 0x7FFFFFFF); check_sbuffer(ce7fffffff); /* ce 7f ff ff ff */
|
||||||
|
|
||||||
|
msgpack_pack_int64(x, -0x7FFFFFFFFFFFFFFF-1); check_sbuffer(d38000000000000000); /* d3 80 00 00 00 00 00 00 00 */
|
||||||
|
msgpack_pack_int64(x, -((1LL<<31)+1)); check_sbuffer(d3ffffffff7fffffff); /* d3 ff ff ff ff 7f ff ff ff */
|
||||||
|
msgpack_pack_int64(x, -(1LL<<31)); check_sbuffer(d280000000); /* d2 80 00 00 00 */
|
||||||
|
msgpack_pack_int64(x, -0x8001); check_sbuffer(d2ffff7fff); /* d2 ff ff 7f ff */
|
||||||
|
msgpack_pack_int64(x, -0x8000); check_sbuffer(d18000); /* d1 80 00 */
|
||||||
|
msgpack_pack_int64(x, -0x81); check_sbuffer(d1ff7f); /* d1 ff 7f */
|
||||||
|
msgpack_pack_int64(x, -0x80); check_sbuffer(d080); /* d0 80 */
|
||||||
|
msgpack_pack_int64(x, -0x21); check_sbuffer(d0df); /* d0 df */
|
||||||
|
msgpack_pack_int64(x, -0x20); check_sbuffer(e0); /* e0 */
|
||||||
|
msgpack_pack_int64(x, -0x1); check_sbuffer(ff); /* ff */
|
||||||
|
msgpack_pack_int64(x, 0); check_sbuffer(00); /* 00 */
|
||||||
|
msgpack_pack_int64(x, 0x7F); check_sbuffer(7f); /* 7f */
|
||||||
|
msgpack_pack_int64(x, 0x80); check_sbuffer(cc80); /* cc 80 */
|
||||||
|
msgpack_pack_int64(x, 0xFF); check_sbuffer(ccff); /* cc ff */
|
||||||
|
msgpack_pack_int64(x, 0x100); check_sbuffer(cd0100); /* cd 01 00 */
|
||||||
|
msgpack_pack_int64(x, 0xFFFF); check_sbuffer(cdffff); /* cd ff ff */
|
||||||
|
msgpack_pack_int64(x, 0x10000); check_sbuffer(ce00010000); /* ce 00 01 00 00 */
|
||||||
|
msgpack_pack_int64(x, 0xFFFFFFFF); check_sbuffer(ceffffffff); /* ce ff ff ff ff */
|
||||||
|
msgpack_pack_int64(x, 0x100000000); check_sbuffer(cf0000000100000000); /* cf 00 00 00 01 00 00 00 00 */
|
||||||
|
msgpack_pack_int64(x, 0x7FFFFFFFFFFFFFFF); check_sbuffer(cf7fffffffffffffff); /* cf 7f ff ff ff ff ff ff ff */
|
||||||
|
|
||||||
|
msgpack_pack_nil(x); check_sbuffer(c0); /* c0 */
|
||||||
|
msgpack_pack_false(x); check_sbuffer(c2); /* c2 */
|
||||||
|
msgpack_pack_true(x); check_sbuffer(c3); /* c3 */
|
||||||
|
|
||||||
|
msgpack_pack_float(x, 1.0); check_sbuffer(ca3f800000); /* ca 3f 80 00 00 */
|
||||||
|
msgpack_pack_double(x, 1.0); check_sbuffer(cb3ff0000000000000); /* cb 3f f0 00 00 00 00 00 00 */
|
||||||
|
|
||||||
|
msgpack_pack_unsigned_char(x, UINT8_MAX); /* same as msgpack_pack_uint8() */
|
||||||
|
msgpack_pack_unsigned_short(x, (unsigned short)UINT64_MAX);
|
||||||
|
msgpack_pack_unsigned_int(x, (unsigned int)UINT64_MAX);
|
||||||
|
msgpack_pack_unsigned_long(x, (unsigned long)UINT64_MAX);
|
||||||
|
msgpack_pack_unsigned_long_long(x, (unsigned long long)UINT64_MAX);
|
||||||
|
|
||||||
|
msgpack_pack_signed_char(x, INT8_MAX); /* same as msgpack_pack_int8() */
|
||||||
|
|
||||||
|
#define check_sbuffer_n(b) \
|
||||||
|
do { \
|
||||||
|
size_t len = strlen(#b); \
|
||||||
|
assert(bytesncmp(sbuf.data + offset, #b, len) == 0); \
|
||||||
|
offset = sbuf.size; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define fill_str(n) msgpack_pack_str_body(x, data, n)
|
||||||
|
|
||||||
|
offset = sbuf.size;
|
||||||
|
msgpack_pack_str(x, 0); /* "" */ check_sbuffer(a0); /* a0 */
|
||||||
|
msgpack_pack_str(x, 31);
|
||||||
|
fill_str(31); check_sbuffer_n(bf); /* bf ... */
|
||||||
|
msgpack_pack_str(x, 32);
|
||||||
|
fill_str(32); check_sbuffer_n(d920); /* d9 20 ... */
|
||||||
|
msgpack_pack_str(x, 255);
|
||||||
|
fill_str(255); check_sbuffer_n(d9ff); /* d9 ff ... */
|
||||||
|
msgpack_pack_str(x, 256);
|
||||||
|
fill_str(256); check_sbuffer_n(da0100); /* da 01 00 ... */
|
||||||
|
msgpack_pack_str(x, 65535);
|
||||||
|
fill_str(65535); check_sbuffer_n(daffff); /* da ff ff ... */
|
||||||
|
msgpack_pack_str(x, 65536);
|
||||||
|
fill_str(65536); check_sbuffer_n(db00010000); /* db 00 01 00 00 ... */
|
||||||
|
|
||||||
|
#define fill_map(n) \
|
||||||
|
do { \
|
||||||
|
size_t i = 0; \
|
||||||
|
for (; i < n * 2; i++) { msgpack_pack_int8(x, 0x1); } \
|
||||||
|
} while (0);
|
||||||
|
|
||||||
|
msgpack_pack_map(x, 0); /* {} */ check_sbuffer(80); /* 80 */
|
||||||
|
msgpack_pack_map(x, 1);
|
||||||
|
fill_map(1); check_sbuffer_n(81); /* 81 ... */
|
||||||
|
msgpack_pack_map(x, 15);
|
||||||
|
fill_map(15); check_sbuffer_n(8f); /* 8f ... */
|
||||||
|
msgpack_pack_map(x, 16);
|
||||||
|
fill_map(16); check_sbuffer_n(de0010); /* de 00 10 ... */
|
||||||
|
msgpack_pack_map(x, 65535);
|
||||||
|
fill_map(65535); check_sbuffer_n(deffff); /* de ff ff ... */
|
||||||
|
msgpack_pack_map(x, 65536);
|
||||||
|
fill_map(65536); check_sbuffer_n(df00010000); /* df 00 01 00 00 ... */
|
||||||
|
|
||||||
|
#define fill_array(n) \
|
||||||
|
do { \
|
||||||
|
size_t i = 0; \
|
||||||
|
for (; i < n; i++) { msgpack_pack_int8(x, 0x1); } \
|
||||||
|
} while (0);
|
||||||
|
|
||||||
|
msgpack_pack_array(x, 0); /* [] */ check_sbuffer(90); /* 90 */
|
||||||
|
msgpack_pack_array(x, 1);
|
||||||
|
fill_array(1); check_sbuffer_n(91); /* 91 ... */
|
||||||
|
msgpack_pack_array(x, 15);
|
||||||
|
fill_array(15); check_sbuffer_n(9f); /* 9f ... */
|
||||||
|
msgpack_pack_array(x, 16);
|
||||||
|
fill_array(16); check_sbuffer_n(dc0010); /* dc 00 10 ... */
|
||||||
|
msgpack_pack_array(x, 65535);
|
||||||
|
fill_array(65535); check_sbuffer_n(dcffff); /* dc ff ff ... */
|
||||||
|
msgpack_pack_array(x, 65536);
|
||||||
|
fill_array(65536); check_sbuffer_n(dd00010000); /* dd 00 01 00 00 ... */
|
||||||
|
|
||||||
|
#define fill_bin(n) msgpack_pack_bin_body(x, data, n)
|
||||||
|
|
||||||
|
msgpack_pack_bin(x, 0); check_sbuffer(c400); /* c4 00 */
|
||||||
|
msgpack_pack_bin(x, 1);
|
||||||
|
fill_bin(1); check_sbuffer_n(c401); /* c4 01 ... */
|
||||||
|
msgpack_pack_bin(x, 255);
|
||||||
|
fill_bin(255); check_sbuffer_n(c4ff); /* c4 ff ... */
|
||||||
|
msgpack_pack_bin(x, 256);
|
||||||
|
fill_bin(256); check_sbuffer_n(c50100); /* c5 01 00 ... */
|
||||||
|
msgpack_pack_bin(x, 65535);
|
||||||
|
fill_bin(65535); check_sbuffer_n(c5ffff); /* c5 ff ff ... */
|
||||||
|
msgpack_pack_bin(x, 65536);
|
||||||
|
fill_bin(65536); check_sbuffer_n(c600010000); /* c6 00 01 00 00 ... */
|
||||||
|
|
||||||
|
#define fill_ext(n) msgpack_pack_ext_body(x, data, n)
|
||||||
|
|
||||||
|
msgpack_pack_ext(x, 1, 0x7F);
|
||||||
|
fill_ext(1); check_sbuffer_n(d47f); /* d4 7f ... */
|
||||||
|
msgpack_pack_ext(x, 2, 0x7F);
|
||||||
|
fill_ext(2); check_sbuffer_n(d57f); /* d5 7f ... */
|
||||||
|
msgpack_pack_ext(x, 4, 0x7F);
|
||||||
|
fill_ext(4); check_sbuffer_n(d67f); /* d6 7f ... */
|
||||||
|
msgpack_pack_ext(x, 8, 0x7F);
|
||||||
|
fill_ext(8); check_sbuffer_n(d77f); /* d7 7f ... */
|
||||||
|
msgpack_pack_ext(x, 16, 0x7F);
|
||||||
|
fill_ext(16); check_sbuffer_n(d87f); /* d8 7f ... */
|
||||||
|
|
||||||
|
msgpack_pack_ext(x, 0, 0x7F); check_sbuffer(c7007f); /* c7 00 7f */
|
||||||
|
msgpack_pack_ext(x, 3, 0x7F);
|
||||||
|
fill_ext(3); check_sbuffer_n(c7037f); /* c7 03 7f */
|
||||||
|
msgpack_pack_ext(x, 5, 0x7F);
|
||||||
|
fill_ext(5); check_sbuffer_n(c7057f); /* c7 05 7f */
|
||||||
|
msgpack_pack_ext(x, 17, 0x7F);
|
||||||
|
fill_ext(17); check_sbuffer_n(c7117f); /* c7 11 7f */
|
||||||
|
msgpack_pack_ext(x, 255, 0x7F);
|
||||||
|
fill_ext(255); check_sbuffer_n(c7ff7f); /* c7 ff 7f ... */
|
||||||
|
msgpack_pack_ext(x, 256, 0x7F);
|
||||||
|
fill_ext(256); check_sbuffer_n(c801007f); /* c8 01 00 7f ... */
|
||||||
|
msgpack_pack_ext(x, 65535, 0x7F);
|
||||||
|
fill_ext(65535); check_sbuffer_n(c8ffff7f); /* c8 ff ff 7f ... */
|
||||||
|
msgpack_pack_ext(x, 65536, 0x7F);
|
||||||
|
fill_ext(65536); check_sbuffer_n(c9000100007f); /* c9 00 01 00 00 7f ... */
|
||||||
|
|
||||||
|
msgpack_pack_timestamp(x, ts); check_sbuffer(d6ffffffffff); /* d6 ff ff ff ff ff */
|
||||||
|
msgpack_pack_timestamp(x, ts + 1); check_sbuffer(d7ff0000000100000000); /* d7 ff 00 00 00 01 00 00 00 00 */
|
||||||
|
msgpack_pack_timestamp(x, ts + 2); check_sbuffer(d7ff00000003ffffffff); /* d7 ff 00 00 00 03 ff ff ff ff */
|
||||||
|
msgpack_pack_timestamp(x, ts + 3); check_sbuffer(c70cff000000000000000400000000); /* c7 0c ff 00 00 00 00 00 00 00 04 00 00 00 00 */
|
||||||
|
msgpack_pack_timestamp(x, ts + 4); check_sbuffer(c70cffffffffff7fffffffffffffff); /* c7 0c ff ff ff ff ff 7f ff ff ff ff ff ff ff */
|
||||||
|
|
||||||
|
msgpack_sbuffer_destroy(&sbuf);
|
||||||
|
msgpack_packer_free(x);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
17
example/cmake/CMakeLists.txt
Normal file
17
example/cmake/CMakeLists.txt
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
cmake_minimum_required (VERSION 3.0)
|
||||||
|
project (example)
|
||||||
|
|
||||||
|
if(EXAMPLE_MSGPACK_EMBEDDED)
|
||||||
|
add_subdirectory(msgpack-c)
|
||||||
|
set(msgpack-c_DIR ${CMAKE_CURRENT_BINARY_DIR}/msgpack-c)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
find_package(msgpack-c REQUIRED)
|
||||||
|
|
||||||
|
add_executable (${PROJECT_NAME} ${CMAKE_CURRENT_LIST_DIR}/../simple_c.c)
|
||||||
|
target_link_libraries(${PROJECT_NAME} msgpack-c)
|
||||||
|
|
||||||
|
if(TARGET msgpack-c-static)
|
||||||
|
add_executable (${PROJECT_NAME}-static ${CMAKE_CURRENT_LIST_DIR}/../simple_c.c)
|
||||||
|
target_link_libraries(${PROJECT_NAME}-static msgpack-c-static)
|
||||||
|
endif()
|
||||||
@@ -1,58 +0,0 @@
|
|||||||
#include <msgpack.hpp>
|
|
||||||
#include <string>
|
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
class old_class {
|
|
||||||
public:
|
|
||||||
old_class() : value("default") { }
|
|
||||||
|
|
||||||
std::string value;
|
|
||||||
|
|
||||||
MSGPACK_DEFINE(value);
|
|
||||||
};
|
|
||||||
|
|
||||||
class new_class {
|
|
||||||
public:
|
|
||||||
new_class() : value("default"), flag(-1) { }
|
|
||||||
|
|
||||||
std::string value;
|
|
||||||
int flag;
|
|
||||||
|
|
||||||
MSGPACK_DEFINE(value, flag);
|
|
||||||
};
|
|
||||||
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
{
|
|
||||||
old_class oc;
|
|
||||||
new_class nc;
|
|
||||||
|
|
||||||
msgpack::sbuffer sbuf;
|
|
||||||
msgpack::pack(sbuf, oc);
|
|
||||||
|
|
||||||
msgpack::zone zone;
|
|
||||||
msgpack::object obj;
|
|
||||||
msgpack::unpack(sbuf.data(), sbuf.size(), NULL, &zone, &obj);
|
|
||||||
|
|
||||||
obj.convert(&nc);
|
|
||||||
|
|
||||||
std::cout << obj << " value=" << nc.value << " flag=" << nc.flag << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
new_class nc;
|
|
||||||
old_class oc;
|
|
||||||
|
|
||||||
msgpack::sbuffer sbuf;
|
|
||||||
msgpack::pack(sbuf, nc);
|
|
||||||
|
|
||||||
msgpack::zone zone;
|
|
||||||
msgpack::object obj;
|
|
||||||
msgpack::unpack(sbuf.data(), sbuf.size(), NULL, &zone, &obj);
|
|
||||||
|
|
||||||
obj.convert(&oc);
|
|
||||||
|
|
||||||
std::cout << obj << " value=" << oc.value << std::endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
419
example/jsonconv.c
Normal file
419
example/jsonconv.c
Normal file
@@ -0,0 +1,419 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <msgpack.h>
|
||||||
|
#include <cjson/cJSON.h>
|
||||||
|
|
||||||
|
#if defined(_MSC_VER)
|
||||||
|
#if _MSC_VER >= 1800
|
||||||
|
#include <inttypes.h>
|
||||||
|
#else
|
||||||
|
#define PRIu64 "I64u"
|
||||||
|
#define PRIi64 "I64i"
|
||||||
|
#define PRIi8 "i"
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#include <inttypes.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(_KERNEL_MODE)
|
||||||
|
# undef snprintf
|
||||||
|
# define snprintf _snprintf
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define DEBUG(...) printf(__VA_ARGS__)
|
||||||
|
|
||||||
|
static char *format_string(const char *input)
|
||||||
|
{
|
||||||
|
const char *inptr;
|
||||||
|
char *output;
|
||||||
|
char *outptr;
|
||||||
|
size_t output_length = 0;
|
||||||
|
/* numbers of additional characters*/
|
||||||
|
size_t escape_characters = 0;
|
||||||
|
|
||||||
|
if (input == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (inptr = input; *inptr; inptr++) {
|
||||||
|
switch (*inptr) {
|
||||||
|
case '\"':
|
||||||
|
case '\\':
|
||||||
|
case '\b':
|
||||||
|
case '\f':
|
||||||
|
case '\n':
|
||||||
|
case '\r':
|
||||||
|
case '\t':
|
||||||
|
/* one character escape sequence */
|
||||||
|
escape_characters++;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
output_length = (size_t)(inptr - input) + escape_characters;
|
||||||
|
|
||||||
|
output = (char *)malloc(output_length + 1);
|
||||||
|
if (output == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* no add characters*/
|
||||||
|
if (escape_characters == 0) {
|
||||||
|
memcpy(output, input, output_length);
|
||||||
|
output[output_length] = '\0';
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
outptr = output;
|
||||||
|
/* copy string */
|
||||||
|
for (inptr = input; *inptr != '\0'; (void)inptr++, outptr++) {
|
||||||
|
if ((*inptr > 31) && (*inptr != '\"') && (*inptr != '\\')) {
|
||||||
|
/* normal character, copy */
|
||||||
|
*outptr = *inptr;
|
||||||
|
} else {
|
||||||
|
/* character needs to be escaped */
|
||||||
|
*outptr++ = '\\';
|
||||||
|
switch (*inptr)
|
||||||
|
{
|
||||||
|
case '\\':
|
||||||
|
*outptr = '\\';
|
||||||
|
break;
|
||||||
|
case '\"':
|
||||||
|
*outptr = '\"';
|
||||||
|
break;
|
||||||
|
case '\b':
|
||||||
|
*outptr = 'b';
|
||||||
|
break;
|
||||||
|
case '\f':
|
||||||
|
*outptr = 'f';
|
||||||
|
break;
|
||||||
|
case '\n':
|
||||||
|
*outptr = 'n';
|
||||||
|
break;
|
||||||
|
case '\r':
|
||||||
|
*outptr = 'r';
|
||||||
|
break;
|
||||||
|
case '\t':
|
||||||
|
*outptr = 't';
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
output[output_length] = '\0';
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Pack cJSON object.
|
||||||
|
* return 0 success, others failed
|
||||||
|
*/
|
||||||
|
static int parse_cjson_object(msgpack_packer *pk, cJSON *node)
|
||||||
|
{
|
||||||
|
int ret, sz, i;
|
||||||
|
cJSON *child;
|
||||||
|
char *strvalue;
|
||||||
|
|
||||||
|
if (node == NULL) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (node->type & 0xFF) {
|
||||||
|
case cJSON_Invalid:
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
case cJSON_False:
|
||||||
|
return msgpack_pack_false(pk);
|
||||||
|
|
||||||
|
case cJSON_True:
|
||||||
|
return msgpack_pack_true(pk);
|
||||||
|
|
||||||
|
case cJSON_NULL:
|
||||||
|
return msgpack_pack_nil(pk);
|
||||||
|
|
||||||
|
case cJSON_String:
|
||||||
|
strvalue = format_string(node->valuestring);
|
||||||
|
if (strvalue != NULL) {
|
||||||
|
ret = msgpack_pack_str_with_body(pk, strvalue, strlen(strvalue));
|
||||||
|
free(strvalue);
|
||||||
|
return ret;
|
||||||
|
} else {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
case cJSON_Number:
|
||||||
|
if (isnan(node->valuedouble) || isinf(node->valuedouble)) {
|
||||||
|
ret = msgpack_pack_nil(pk);
|
||||||
|
} else if (node->valuedouble == node->valueint) {
|
||||||
|
ret = msgpack_pack_int(pk, node->valueint);
|
||||||
|
} else {
|
||||||
|
ret = msgpack_pack_double(pk, node->valuedouble);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
case cJSON_Array:
|
||||||
|
sz = cJSON_GetArraySize(node);
|
||||||
|
if (msgpack_pack_array(pk, sz) != 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
for (i = 0; i < sz; i++) {
|
||||||
|
if (parse_cjson_object(pk, cJSON_GetArrayItem(node, i)) != 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
case cJSON_Object:
|
||||||
|
sz = cJSON_GetArraySize(node);
|
||||||
|
if (msgpack_pack_map(pk, sz) != 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
for (i = 0; i < sz; i++) {
|
||||||
|
child = cJSON_GetArrayItem(node, i);
|
||||||
|
strvalue = format_string(child->string);
|
||||||
|
if (strvalue == NULL) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (msgpack_pack_str_with_body(pk, strvalue, strlen(strvalue)) != 0) {
|
||||||
|
free(strvalue);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
free(strvalue);
|
||||||
|
if (parse_cjson_object(pk, child) != 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
default:
|
||||||
|
DEBUG("unknown type.\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Pack json string to msgpack format data.
|
||||||
|
* return 0 success, -1 failed
|
||||||
|
*/
|
||||||
|
int msgpack_pack_jsonstr(msgpack_packer *pk, const char *jsonstr)
|
||||||
|
{
|
||||||
|
int status;
|
||||||
|
cJSON *node;
|
||||||
|
const char *end = NULL;
|
||||||
|
|
||||||
|
if (pk == NULL || jsonstr == NULL) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
node = cJSON_ParseWithOpts(jsonstr, &end, 1);
|
||||||
|
if (node == NULL) {
|
||||||
|
DEBUG("parse error: unexpected string `%s`\n", end);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
status = parse_cjson_object(pk, node);
|
||||||
|
cJSON_Delete(node);
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int bytes_contain_zero(const msgpack_object_bin *bin)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
for (i = 0; i < bin->size; i++) {
|
||||||
|
if (bin->ptr[i] == 0) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define PRINT_JSONSTR_CALL(ret, func, aux_buffer, aux_buffer_size, ...) \
|
||||||
|
ret = func(aux_buffer, aux_buffer_size, __VA_ARGS__); \
|
||||||
|
if (ret <= 0) \
|
||||||
|
return ret; \
|
||||||
|
if (ret > aux_buffer_size) \
|
||||||
|
return 0; \
|
||||||
|
aux_buffer = aux_buffer + ret; \
|
||||||
|
aux_buffer_size = aux_buffer_size - ret
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Convert msgpack format data to json string.
|
||||||
|
* return >0: success, 0: length of buffer not enough, -1: failed
|
||||||
|
*/
|
||||||
|
size_t msgpack_object_print_jsonstr(char *buffer, size_t length, const msgpack_object o)
|
||||||
|
{
|
||||||
|
char *aux_buffer = buffer;
|
||||||
|
size_t aux_buffer_size = length;
|
||||||
|
size_t ret;
|
||||||
|
|
||||||
|
switch (o.type) {
|
||||||
|
case MSGPACK_OBJECT_NIL:
|
||||||
|
PRINT_JSONSTR_CALL(ret, snprintf, aux_buffer, aux_buffer_size, "null");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MSGPACK_OBJECT_BOOLEAN:
|
||||||
|
PRINT_JSONSTR_CALL(ret, snprintf, aux_buffer, aux_buffer_size, (o.via.boolean ? "true" : "false"));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MSGPACK_OBJECT_POSITIVE_INTEGER:
|
||||||
|
#if defined(PRIu64)
|
||||||
|
PRINT_JSONSTR_CALL(ret, snprintf, aux_buffer, aux_buffer_size, "%" PRIu64, o.via.u64);
|
||||||
|
#else
|
||||||
|
if (o.via.u64 > ULONG_MAX) {
|
||||||
|
PRINT_JSONSTR_CALL(ret, snprintf, aux_buffer, aux_buffer_size, "%lu", ULONG_MAX);
|
||||||
|
} else {
|
||||||
|
PRINT_JSONSTR_CALL(ret, snprintf, aux_buffer, aux_buffer_size, "%lu", (unsigned long)o.via.u64);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MSGPACK_OBJECT_NEGATIVE_INTEGER:
|
||||||
|
#if defined(PRIi64)
|
||||||
|
PRINT_JSONSTR_CALL(ret, snprintf, aux_buffer, aux_buffer_size, "%" PRIi64, o.via.i64);
|
||||||
|
#else
|
||||||
|
if (o.via.i64 > LONG_MAX) {
|
||||||
|
PRINT_JSONSTR_CALL(ret, snprintf, aux_buffer, aux_buffer_size, "%ld", LONG_MAX);
|
||||||
|
} else if (o.via.i64 < LONG_MIN) {
|
||||||
|
PRINT_JSONSTR_CALL(ret, snprintf, aux_buffer, aux_buffer_size, "%ld", LONG_MIN);
|
||||||
|
} else {
|
||||||
|
PRINT_JSONSTR_CALL(ret, snprintf, aux_buffer, aux_buffer_size, "%ld", (signed long)o.via.i64);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MSGPACK_OBJECT_FLOAT32:
|
||||||
|
case MSGPACK_OBJECT_FLOAT64:
|
||||||
|
PRINT_JSONSTR_CALL(ret, snprintf, aux_buffer, aux_buffer_size, "%f", o.via.f64);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MSGPACK_OBJECT_STR:
|
||||||
|
PRINT_JSONSTR_CALL(ret, snprintf, aux_buffer, aux_buffer_size, "\"%.*s\"", (int)o.via.str.size, o.via.str.ptr);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MSGPACK_OBJECT_BIN:
|
||||||
|
if (bytes_contain_zero(&o.via.bin)) {
|
||||||
|
DEBUG("the value contains zero\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
PRINT_JSONSTR_CALL(ret, snprintf, aux_buffer, aux_buffer_size, "\"%.*s\"", (int)o.via.bin.size, o.via.bin.ptr);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MSGPACK_OBJECT_EXT:
|
||||||
|
DEBUG("not support type: MSGPACK_OBJECT_EXT.\n");
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
case MSGPACK_OBJECT_ARRAY:
|
||||||
|
PRINT_JSONSTR_CALL(ret, snprintf, aux_buffer, aux_buffer_size, "[");
|
||||||
|
if (o.via.array.size != 0) {
|
||||||
|
msgpack_object *p = o.via.array.ptr;
|
||||||
|
msgpack_object *const pend = o.via.array.ptr + o.via.array.size;
|
||||||
|
PRINT_JSONSTR_CALL(ret, msgpack_object_print_jsonstr, aux_buffer, aux_buffer_size, *p);
|
||||||
|
++p;
|
||||||
|
for (; p < pend; ++p) {
|
||||||
|
PRINT_JSONSTR_CALL(ret, snprintf, aux_buffer, aux_buffer_size, ",");
|
||||||
|
PRINT_JSONSTR_CALL(ret, msgpack_object_print_jsonstr, aux_buffer, aux_buffer_size, *p);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
PRINT_JSONSTR_CALL(ret, snprintf, aux_buffer, aux_buffer_size, "]");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MSGPACK_OBJECT_MAP:
|
||||||
|
PRINT_JSONSTR_CALL(ret, snprintf, aux_buffer, aux_buffer_size, "{");
|
||||||
|
if (o.via.map.size != 0) {
|
||||||
|
msgpack_object_kv *p = o.via.map.ptr;
|
||||||
|
msgpack_object_kv *const pend = o.via.map.ptr + o.via.map.size;
|
||||||
|
|
||||||
|
for (; p < pend; ++p) {
|
||||||
|
if (p->key.type != MSGPACK_OBJECT_STR) {
|
||||||
|
DEBUG("the key of in a map must be string.\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (p != o.via.map.ptr) {
|
||||||
|
PRINT_JSONSTR_CALL(ret, snprintf, aux_buffer, aux_buffer_size, ",");
|
||||||
|
}
|
||||||
|
PRINT_JSONSTR_CALL(ret, msgpack_object_print_jsonstr, aux_buffer, aux_buffer_size, p->key);
|
||||||
|
PRINT_JSONSTR_CALL(ret, snprintf, aux_buffer, aux_buffer_size, ":");
|
||||||
|
PRINT_JSONSTR_CALL(ret, msgpack_object_print_jsonstr, aux_buffer, aux_buffer_size, p->val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
PRINT_JSONSTR_CALL(ret, snprintf, aux_buffer, aux_buffer_size, "}");
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
DEBUG("unknown type.\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return length - aux_buffer_size;
|
||||||
|
}
|
||||||
|
#undef PRINT_JSONSTR_CALL
|
||||||
|
|
||||||
|
static void test(const char *name, const char *input, const char *expect)
|
||||||
|
{
|
||||||
|
msgpack_sbuffer sbuf;
|
||||||
|
{
|
||||||
|
// pack
|
||||||
|
msgpack_packer pk;
|
||||||
|
msgpack_sbuffer_init(&sbuf);
|
||||||
|
msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
|
||||||
|
if (msgpack_pack_jsonstr(&pk, input) < 0) {
|
||||||
|
msgpack_sbuffer_destroy(&sbuf);
|
||||||
|
printf("%s: invalid json string.\n", name);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
// unpack
|
||||||
|
#define MAX_JSONLEN 1024
|
||||||
|
msgpack_zone z;
|
||||||
|
msgpack_object obj;
|
||||||
|
size_t jsonstrlen = MAX_JSONLEN - 1;
|
||||||
|
char jsonparsed[MAX_JSONLEN];
|
||||||
|
|
||||||
|
msgpack_zone_init(&z, jsonstrlen);
|
||||||
|
msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
|
||||||
|
jsonstrlen = msgpack_object_print_jsonstr(jsonparsed, jsonstrlen, obj);
|
||||||
|
jsonparsed[jsonstrlen] = '\0';
|
||||||
|
|
||||||
|
//compare input and output
|
||||||
|
if (expect == NULL) {
|
||||||
|
expect = input;
|
||||||
|
}
|
||||||
|
if (strcmp(expect, jsonparsed) == 0) {
|
||||||
|
printf("%s: ok\n", name);
|
||||||
|
} else {
|
||||||
|
printf("%s: failed\n", name);
|
||||||
|
}
|
||||||
|
msgpack_zone_destroy(&z);
|
||||||
|
}
|
||||||
|
msgpack_sbuffer_destroy(&sbuf);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
test("null", "null", NULL);
|
||||||
|
test("boolean", "false", NULL);
|
||||||
|
test("single string", "\"frsyuki\"", NULL);
|
||||||
|
test("single number", "\"100\"", NULL);
|
||||||
|
test("space", "[{\"valuespace\":\"\",\"\":\"keyspace\"},\"\",[\"\"]]", NULL);
|
||||||
|
test("quote", "\"My name is Tom (\\\"Bee\\\") Kobe\"", NULL);
|
||||||
|
test("escape", "\"\\\\b\\f\\n\\r\\t\"", NULL);
|
||||||
|
test("escape2", "\"\b\f\n\r\t\"", "\"\\b\\f\\n\\r\\t\"");
|
||||||
|
test("map", "{\"name\":\"Tom (\\\"Bee\\\") Kobe\",\"type\":\"image\",\"data\":{\"width\":360,\"height\":460,\"title\":\"View me\",\"ips\":[116,943,256,711]}}", NULL);
|
||||||
|
test("array", "[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"]", NULL);
|
||||||
|
test("number array", "[[101,121,-33],[119,911,171],[0,2,-3]]", NULL);
|
||||||
|
test("mix array", "[{\"name\":\"Tom\",\"city\":\"London\",\"country\":\"UK\",\"longitude\":23},{\"name\":\"Jack\",\"city\":\"Birmingham\",\"country\":\"UK\",\"longitude\":-22}]", NULL);
|
||||||
|
test("unicode", "\"\\u5C71\\u5DDD\\u7570\\u57DF\\u98A8\\u6708\\u540C\\u5929\"", "\"山川異域風月同天\"");
|
||||||
|
test("utf8", "\"山川異域風月同天\"", NULL);
|
||||||
|
test("double", "12.34", "12.340000");
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
127
example/lib_buffer_unpack.c
Normal file
127
example/lib_buffer_unpack.c
Normal file
@@ -0,0 +1,127 @@
|
|||||||
|
#include <msgpack.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct receiver {
|
||||||
|
msgpack_sbuffer sbuf;
|
||||||
|
size_t rest;
|
||||||
|
} receiver;
|
||||||
|
|
||||||
|
void receiver_init(receiver *r) {
|
||||||
|
msgpack_packer pk;
|
||||||
|
|
||||||
|
msgpack_sbuffer_init(&r->sbuf);
|
||||||
|
msgpack_packer_init(&pk, &r->sbuf, msgpack_sbuffer_write);
|
||||||
|
/* 1st object */
|
||||||
|
msgpack_pack_array(&pk, 3);
|
||||||
|
msgpack_pack_int(&pk, 1);
|
||||||
|
msgpack_pack_true(&pk);
|
||||||
|
msgpack_pack_str(&pk, 7);
|
||||||
|
msgpack_pack_str_body(&pk, "example", 7);
|
||||||
|
/* 2nd object */
|
||||||
|
msgpack_pack_str(&pk, 6);
|
||||||
|
msgpack_pack_str_body(&pk, "second", 6);
|
||||||
|
/* 3rd object */
|
||||||
|
msgpack_pack_array(&pk, 2);
|
||||||
|
msgpack_pack_int(&pk, 42);
|
||||||
|
msgpack_pack_false(&pk);
|
||||||
|
r->rest = r->sbuf.size;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t receiver_recv(receiver *r, char* buf, size_t try_size) {
|
||||||
|
size_t off = r->sbuf.size - r->rest;
|
||||||
|
|
||||||
|
size_t actual_size = try_size;
|
||||||
|
if (actual_size > r->rest) actual_size = r->rest;
|
||||||
|
|
||||||
|
memcpy(buf, r->sbuf.data + off, actual_size);
|
||||||
|
r->rest -= actual_size;
|
||||||
|
|
||||||
|
return actual_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t receiver_to_unpacker(receiver* r, size_t request_size,
|
||||||
|
msgpack_unpacker *unpacker)
|
||||||
|
{
|
||||||
|
size_t recv_len;
|
||||||
|
// make sure there's enough room, or expand the unpacker accordingly
|
||||||
|
if (msgpack_unpacker_buffer_capacity(unpacker) < request_size) {
|
||||||
|
msgpack_unpacker_reserve_buffer(unpacker, request_size);
|
||||||
|
assert(msgpack_unpacker_buffer_capacity(unpacker) >= request_size);
|
||||||
|
}
|
||||||
|
recv_len = receiver_recv(r, msgpack_unpacker_buffer(unpacker),
|
||||||
|
request_size);
|
||||||
|
msgpack_unpacker_buffer_consumed(unpacker, recv_len);
|
||||||
|
return recv_len;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define EACH_RECV_SIZE 4
|
||||||
|
|
||||||
|
void unpack(receiver* r) {
|
||||||
|
/* buf is allocated by unpacker. */
|
||||||
|
msgpack_unpacker* unp = msgpack_unpacker_new(100);
|
||||||
|
msgpack_unpacked result;
|
||||||
|
msgpack_unpack_return ret;
|
||||||
|
size_t recv_len;
|
||||||
|
int recv_count = 0;
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
msgpack_unpacked_init(&result);
|
||||||
|
while (true) {
|
||||||
|
recv_len = receiver_to_unpacker(r, EACH_RECV_SIZE, unp);
|
||||||
|
if (recv_len == 0) break; // (reached end of input)
|
||||||
|
#if defined(_MSC_VER) || defined(__MINGW32__)
|
||||||
|
printf("receive count: %d %Id bytes received.\n", recv_count++, recv_len);
|
||||||
|
#else // defined(_MSC_VER) || defined(__MINGW32__)
|
||||||
|
printf("receive count: %d %zd bytes received.\n", recv_count++, recv_len);
|
||||||
|
#endif // defined(_MSC_VER) || defined(__MINGW32__)
|
||||||
|
ret = msgpack_unpacker_next(unp, &result);
|
||||||
|
while (ret == MSGPACK_UNPACK_SUCCESS) {
|
||||||
|
msgpack_object obj = result.data;
|
||||||
|
|
||||||
|
/* Use obj. */
|
||||||
|
printf("Object no %d:\n", ++i);
|
||||||
|
msgpack_object_print(stdout, obj);
|
||||||
|
printf("\n");
|
||||||
|
/* If you want to allocate something on the zone, you can use zone. */
|
||||||
|
/* msgpack_zone* zone = result.zone; */
|
||||||
|
/* The lifetime of the obj and the zone, */
|
||||||
|
|
||||||
|
ret = msgpack_unpacker_next(unp, &result);
|
||||||
|
}
|
||||||
|
if (ret == MSGPACK_UNPACK_PARSE_ERROR) {
|
||||||
|
printf("The data in the buf is invalid format.\n");
|
||||||
|
msgpack_unpacked_destroy(&result);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
msgpack_unpacked_destroy(&result);
|
||||||
|
msgpack_unpacker_free(unp);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
receiver r;
|
||||||
|
receiver_init(&r);
|
||||||
|
|
||||||
|
unpack(&r);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Output */
|
||||||
|
|
||||||
|
/*
|
||||||
|
receive count: 0 4 bytes received.
|
||||||
|
receive count: 1 4 bytes received.
|
||||||
|
receive count: 2 4 bytes received.
|
||||||
|
Object no 1:
|
||||||
|
[1, true, "example"]
|
||||||
|
receive count: 3 4 bytes received.
|
||||||
|
receive count: 4 4 bytes received.
|
||||||
|
Object no 2:
|
||||||
|
"second"
|
||||||
|
receive count: 5 1 bytes received.
|
||||||
|
Object no 3:
|
||||||
|
[42, false]
|
||||||
|
*/
|
||||||
@@ -1,86 +0,0 @@
|
|||||||
#include <msgpack.hpp>
|
|
||||||
#include <string>
|
|
||||||
#include <iostream>
|
|
||||||
#include <sstream>
|
|
||||||
|
|
||||||
namespace myprotocol {
|
|
||||||
using namespace msgpack::type;
|
|
||||||
using msgpack::define;
|
|
||||||
|
|
||||||
struct Get : define< tuple<uint32_t, std::string> > {
|
|
||||||
Get() { }
|
|
||||||
Get(uint32_t f, const std::string& k) :
|
|
||||||
define_type(msgpack_type(f, k)) { }
|
|
||||||
uint32_t& flags() { return get<0>(); }
|
|
||||||
std::string& key() { return get<1>(); }
|
|
||||||
};
|
|
||||||
|
|
||||||
struct Put : define< tuple<uint32_t, std::string, raw_ref> > {
|
|
||||||
Put() { }
|
|
||||||
Put(uint32_t f, const std::string& k, const char* valref, size_t vallen) :
|
|
||||||
define_type(msgpack_type( f, k, raw_ref(valref,vallen) )) { }
|
|
||||||
uint32_t& flags() { return get<0>(); }
|
|
||||||
std::string& key() { return get<1>(); }
|
|
||||||
raw_ref& value() { return get<2>(); }
|
|
||||||
};
|
|
||||||
|
|
||||||
struct MultiGet : define< std::vector<Get> > {
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
// send Get request
|
|
||||||
std::stringstream stream;
|
|
||||||
{
|
|
||||||
myprotocol::Get req;
|
|
||||||
req.flags() = 0;
|
|
||||||
req.key() = "key0";
|
|
||||||
msgpack::pack(stream, req);
|
|
||||||
}
|
|
||||||
|
|
||||||
stream.seekg(0);
|
|
||||||
|
|
||||||
// receive Get request
|
|
||||||
{
|
|
||||||
std::string buffer(stream.str());
|
|
||||||
|
|
||||||
msgpack::zone mempool;
|
|
||||||
msgpack::object o =
|
|
||||||
msgpack::unpack(buffer.data(), buffer.size(), mempool);
|
|
||||||
|
|
||||||
myprotocol::Get req;
|
|
||||||
msgpack::convert(req, o);
|
|
||||||
std::cout << "received: " << o << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
stream.str("");
|
|
||||||
|
|
||||||
|
|
||||||
// send MultiGet request
|
|
||||||
{
|
|
||||||
myprotocol::MultiGet req;
|
|
||||||
req.push_back( myprotocol::Get(1, "key1") );
|
|
||||||
req.push_back( myprotocol::Get(2, "key2") );
|
|
||||||
req.push_back( myprotocol::Get(3, "key3") );
|
|
||||||
msgpack::pack(stream, req);
|
|
||||||
}
|
|
||||||
|
|
||||||
stream.seekg(0);
|
|
||||||
|
|
||||||
// receive MultiGet request
|
|
||||||
{
|
|
||||||
std::string buffer(stream.str());
|
|
||||||
|
|
||||||
msgpack::zone mempool;
|
|
||||||
msgpack::object o =
|
|
||||||
msgpack::unpack(buffer.data(), buffer.size(), mempool);
|
|
||||||
|
|
||||||
myprotocol::MultiGet req;
|
|
||||||
msgpack::convert(req, o);
|
|
||||||
std::cout << "received: " << o << std::endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
#include <msgpack.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
/* msgpack::sbuffer is a simple buffer implementation. */
|
|
||||||
msgpack_sbuffer sbuf;
|
|
||||||
msgpack_sbuffer_init(&sbuf);
|
|
||||||
|
|
||||||
/* serialize values into the buffer using msgpack_sbuffer_write callback function. */
|
|
||||||
msgpack_packer pk;
|
|
||||||
msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
|
|
||||||
|
|
||||||
msgpack_pack_array(&pk, 3);
|
|
||||||
msgpack_pack_int(&pk, 1);
|
|
||||||
msgpack_pack_true(&pk);
|
|
||||||
msgpack_pack_raw(&pk, 7);
|
|
||||||
msgpack_pack_raw_body(&pk, "example", 7);
|
|
||||||
|
|
||||||
/* deserialize the buffer into msgpack_object instance. */
|
|
||||||
/* deserialized object is valid during the msgpack_zone instance alive. */
|
|
||||||
msgpack_zone mempool;
|
|
||||||
msgpack_zone_init(&mempool, 2048);
|
|
||||||
|
|
||||||
msgpack_object deserialized;
|
|
||||||
msgpack_unpack(sbuf.data, sbuf.size, NULL, &mempool, &deserialized);
|
|
||||||
|
|
||||||
/* print the deserialized object. */
|
|
||||||
msgpack_object_print(stdout, deserialized);
|
|
||||||
puts("");
|
|
||||||
|
|
||||||
msgpack_zone_destroy(&mempool);
|
|
||||||
msgpack_sbuffer_destroy(&sbuf);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
#include <msgpack.hpp>
|
|
||||||
#include <string>
|
|
||||||
#include <iostream>
|
|
||||||
#include <sstream>
|
|
||||||
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
msgpack::type::tuple<int, bool, std::string> src(1, true, "example");
|
|
||||||
|
|
||||||
// serialize the object into the buffer.
|
|
||||||
// any classes that implements write(const char*,size_t) can be a buffer.
|
|
||||||
std::stringstream buffer;
|
|
||||||
msgpack::pack(buffer, src);
|
|
||||||
|
|
||||||
// send the buffer ...
|
|
||||||
buffer.seekg(0);
|
|
||||||
|
|
||||||
// deserialize the buffer into msgpack::object instance.
|
|
||||||
std::string str(buffer.str());
|
|
||||||
|
|
||||||
// deserialized object is valid during the msgpack::zone instance alive.
|
|
||||||
msgpack::zone mempool;
|
|
||||||
|
|
||||||
msgpack::object deserialized;
|
|
||||||
msgpack::unpack(str.data(), str.size(), NULL, &mempool, &deserialized);
|
|
||||||
|
|
||||||
// msgpack::object supports ostream.
|
|
||||||
std::cout << deserialized << std::endl;
|
|
||||||
|
|
||||||
// convert msgpack::object instance into the original type.
|
|
||||||
// if the type is mismatched, it throws msgpack::type_error exception.
|
|
||||||
msgpack::type::tuple<int, bool, std::string> dst;
|
|
||||||
deserialized.convert(&dst);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
require 'msgpack'
|
|
||||||
|
|
||||||
serialized = [1, -1, true, false, nil, {"key" => "value"}].to_msgpack
|
|
||||||
p MessagePack.unpack(serialized)
|
|
||||||
|
|
||||||
47
example/simple_c.c
Normal file
47
example/simple_c.c
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
#include <msgpack.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
void print(char const* buf,size_t len)
|
||||||
|
{
|
||||||
|
size_t i = 0;
|
||||||
|
for(; i < len ; ++i)
|
||||||
|
printf("%02x ", 0xff & buf[i]);
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
msgpack_sbuffer sbuf;
|
||||||
|
msgpack_packer pk;
|
||||||
|
msgpack_zone mempool;
|
||||||
|
msgpack_object deserialized;
|
||||||
|
|
||||||
|
/* msgpack::sbuffer is a simple buffer implementation. */
|
||||||
|
msgpack_sbuffer_init(&sbuf);
|
||||||
|
|
||||||
|
/* serialize values into the buffer using msgpack_sbuffer_write callback function. */
|
||||||
|
msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
|
||||||
|
|
||||||
|
msgpack_pack_array(&pk, 3);
|
||||||
|
msgpack_pack_int(&pk, 1);
|
||||||
|
msgpack_pack_true(&pk);
|
||||||
|
msgpack_pack_str(&pk, 7);
|
||||||
|
msgpack_pack_str_body(&pk, "example", 7);
|
||||||
|
|
||||||
|
print(sbuf.data, sbuf.size);
|
||||||
|
|
||||||
|
/* deserialize the buffer into msgpack_object instance. */
|
||||||
|
/* deserialized object is valid during the msgpack_zone instance alive. */
|
||||||
|
msgpack_zone_init(&mempool, 2048);
|
||||||
|
|
||||||
|
msgpack_unpack(sbuf.data, sbuf.size, NULL, &mempool, &deserialized);
|
||||||
|
|
||||||
|
/* print the deserialized object. */
|
||||||
|
msgpack_object_print(stdout, deserialized);
|
||||||
|
puts("");
|
||||||
|
|
||||||
|
msgpack_zone_destroy(&mempool);
|
||||||
|
msgpack_sbuffer_destroy(&sbuf);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
37
example/speed_test_uint32_array.c
Normal file
37
example/speed_test_uint32_array.c
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
#include <msgpack.h>
|
||||||
|
|
||||||
|
void test()
|
||||||
|
{
|
||||||
|
size_t size = 10000000;
|
||||||
|
msgpack_sbuffer buf;
|
||||||
|
msgpack_packer * pk;
|
||||||
|
size_t upk_pos = 0;
|
||||||
|
msgpack_unpacked msg;
|
||||||
|
|
||||||
|
msgpack_sbuffer_init(&buf);
|
||||||
|
|
||||||
|
pk = msgpack_packer_new(&buf, msgpack_sbuffer_write);
|
||||||
|
|
||||||
|
msgpack_pack_array(pk, size);
|
||||||
|
{
|
||||||
|
size_t idx = 0;
|
||||||
|
for (; idx < size; ++idx)
|
||||||
|
msgpack_pack_uint32(pk, 1);
|
||||||
|
}
|
||||||
|
msgpack_packer_free(pk);
|
||||||
|
|
||||||
|
msgpack_unpacked_init(&msg);
|
||||||
|
|
||||||
|
while (msgpack_unpack_next(&msg, buf.data, buf.size, &upk_pos) == MSGPACK_UNPACK_SUCCESS) {
|
||||||
|
}
|
||||||
|
|
||||||
|
msgpack_unpacked_destroy(&msg);
|
||||||
|
msgpack_sbuffer_destroy(&buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
for (; i < 10; ++i) test();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
37
example/speed_test_uint64_array.c
Normal file
37
example/speed_test_uint64_array.c
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
#include <msgpack.h>
|
||||||
|
|
||||||
|
void test()
|
||||||
|
{
|
||||||
|
uint64_t test_u64 = 0xFFF0000000000001LL;
|
||||||
|
size_t size = 10000000;
|
||||||
|
msgpack_sbuffer buf;
|
||||||
|
msgpack_packer * pk;
|
||||||
|
size_t upk_pos = 0;
|
||||||
|
msgpack_unpacked msg;
|
||||||
|
|
||||||
|
msgpack_sbuffer_init(&buf);
|
||||||
|
|
||||||
|
pk = msgpack_packer_new(&buf, msgpack_sbuffer_write);
|
||||||
|
|
||||||
|
msgpack_pack_array(pk, size);
|
||||||
|
{
|
||||||
|
size_t idx = 0;
|
||||||
|
for (; idx < size; ++idx)
|
||||||
|
msgpack_pack_uint64(pk, test_u64);
|
||||||
|
}
|
||||||
|
msgpack_packer_free(pk);
|
||||||
|
|
||||||
|
msgpack_unpacked_init(&msg);
|
||||||
|
|
||||||
|
while (msgpack_unpack_next(&msg, buf.data, buf.size, &upk_pos) == MSGPACK_UNPACK_SUCCESS) {
|
||||||
|
}
|
||||||
|
msgpack_unpacked_destroy(&msg);
|
||||||
|
msgpack_sbuffer_destroy(&buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
for (; i < 10; ++i) test();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
@@ -1,136 +0,0 @@
|
|||||||
#include <msgpack.hpp>
|
|
||||||
#include <iostream>
|
|
||||||
#include <stdexcept>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <pthread.h>
|
|
||||||
|
|
||||||
class Server {
|
|
||||||
public:
|
|
||||||
Server(int sock) : m_sock(sock) { }
|
|
||||||
|
|
||||||
~Server() { }
|
|
||||||
|
|
||||||
typedef std::auto_ptr<msgpack::zone> auto_zone;
|
|
||||||
|
|
||||||
void socket_readable()
|
|
||||||
{
|
|
||||||
m_pac.reserve_buffer(1024);
|
|
||||||
|
|
||||||
ssize_t count =
|
|
||||||
read(m_sock, m_pac.buffer(), m_pac.buffer_capacity());
|
|
||||||
|
|
||||||
if(count <= 0) {
|
|
||||||
if(count == 0) {
|
|
||||||
throw std::runtime_error("connection closed");
|
|
||||||
}
|
|
||||||
if(errno == EAGAIN || errno == EINTR) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
throw std::runtime_error(strerror(errno));
|
|
||||||
}
|
|
||||||
|
|
||||||
m_pac.buffer_consumed(count);
|
|
||||||
|
|
||||||
while(m_pac.execute()) {
|
|
||||||
msgpack::object msg = m_pac.data();
|
|
||||||
|
|
||||||
auto_zone life( m_pac.release_zone() );
|
|
||||||
|
|
||||||
m_pac.reset();
|
|
||||||
|
|
||||||
process_message(msg, life);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(m_pac.message_size() > 10*1024*1024) {
|
|
||||||
throw std::runtime_error("message is too large");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
void process_message(msgpack::object msg, auto_zone& life)
|
|
||||||
{
|
|
||||||
std::cout << "message reached: " << msg << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
int m_sock;
|
|
||||||
msgpack::unpacker m_pac;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
static void* run_server(void* arg)
|
|
||||||
try {
|
|
||||||
Server* srv = reinterpret_cast<Server*>(arg);
|
|
||||||
|
|
||||||
while(true) {
|
|
||||||
srv->socket_readable();
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
} catch (std::exception& e) {
|
|
||||||
std::cerr << "error while processing client packet: "
|
|
||||||
<< e.what() << std::endl;
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
} catch (...) {
|
|
||||||
std::cerr << "error while processing client packet: "
|
|
||||||
<< "unknown error" << std::endl;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
struct fwriter {
|
|
||||||
fwriter(int fd) : m_fp( fdopen(fd, "w") ) { }
|
|
||||||
|
|
||||||
void write(const char* buf, size_t buflen)
|
|
||||||
{
|
|
||||||
size_t count = fwrite(buf, buflen, 1, m_fp);
|
|
||||||
if(count < 1) {
|
|
||||||
std::cout << buflen << std::endl;
|
|
||||||
std::cout << count << std::endl;
|
|
||||||
throw std::runtime_error(strerror(errno));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void flush() { fflush(m_fp); }
|
|
||||||
|
|
||||||
void close() { fclose(m_fp); }
|
|
||||||
|
|
||||||
private:
|
|
||||||
FILE* m_fp;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
int pair[2];
|
|
||||||
pipe(pair);
|
|
||||||
|
|
||||||
// run server thread
|
|
||||||
Server srv(pair[0]);
|
|
||||||
pthread_t thread;
|
|
||||||
pthread_create(&thread, NULL,
|
|
||||||
run_server, reinterpret_cast<void*>(&srv));
|
|
||||||
|
|
||||||
// client thread:
|
|
||||||
fwriter writer(pair[1]);
|
|
||||||
msgpack::packer<fwriter> pk(writer);
|
|
||||||
|
|
||||||
typedef msgpack::type::tuple<std::string, std::string, std::string> put_t;
|
|
||||||
typedef msgpack::type::tuple<std::string, std::string> get_t;
|
|
||||||
|
|
||||||
put_t req1("put", "apple", "red");
|
|
||||||
put_t req2("put", "lemon", "yellow");
|
|
||||||
get_t req3("get", "apple");
|
|
||||||
pk.pack(req1);
|
|
||||||
pk.pack(req2);
|
|
||||||
pk.pack(req3);
|
|
||||||
writer.flush();
|
|
||||||
writer.close();
|
|
||||||
|
|
||||||
pthread_join(thread, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,72 +0,0 @@
|
|||||||
require 'msgpack'
|
|
||||||
|
|
||||||
class Server
|
|
||||||
def initialize(sock)
|
|
||||||
@sock = sock
|
|
||||||
@pk = MessagePack::Unpacker.new
|
|
||||||
@buffer = ''
|
|
||||||
@nread = 0
|
|
||||||
end
|
|
||||||
|
|
||||||
def run
|
|
||||||
while true
|
|
||||||
begin
|
|
||||||
data = @sock.sysread(1024)
|
|
||||||
rescue
|
|
||||||
puts "connection closed (#{$!})"
|
|
||||||
return
|
|
||||||
end
|
|
||||||
receive_data(data)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
|
||||||
def receive_data(data)
|
|
||||||
@buffer << data
|
|
||||||
|
|
||||||
while true
|
|
||||||
@nread = @pk.execute(@buffer, @nread)
|
|
||||||
|
|
||||||
if @pk.finished?
|
|
||||||
msg = @pk.data
|
|
||||||
process_message(msg)
|
|
||||||
|
|
||||||
@pk.reset
|
|
||||||
@buffer.slice!(0, @nread)
|
|
||||||
@nread = 0
|
|
||||||
|
|
||||||
next unless @buffer.empty?
|
|
||||||
end
|
|
||||||
|
|
||||||
break
|
|
||||||
end
|
|
||||||
|
|
||||||
if @buffer.length > 10*1024*1024
|
|
||||||
raise "message is too large"
|
|
||||||
end
|
|
||||||
|
|
||||||
rescue
|
|
||||||
puts "error while processing client packet: #{$!}"
|
|
||||||
end
|
|
||||||
|
|
||||||
def process_message(msg)
|
|
||||||
puts "message reached: #{msg.inspect}"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
rpipe, wpipe = IO.pipe
|
|
||||||
|
|
||||||
# run server thread
|
|
||||||
thread = Thread.new(Server.new(rpipe)) {|srv|
|
|
||||||
srv.run
|
|
||||||
}
|
|
||||||
|
|
||||||
# client thread:
|
|
||||||
wpipe.write ["put", "apple", "red"].to_msgpack
|
|
||||||
wpipe.write ["put", "lemon", "yellow"].to_msgpack
|
|
||||||
wpipe.write ["get", "apple"].to_msgpack
|
|
||||||
wpipe.close
|
|
||||||
|
|
||||||
thread.join
|
|
||||||
|
|
||||||
81
example/user_buffer_unpack.c
Normal file
81
example/user_buffer_unpack.c
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
#include <msgpack.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
|
#define UNPACKED_BUFFER_SIZE 2048
|
||||||
|
|
||||||
|
void prepare(msgpack_sbuffer* sbuf) {
|
||||||
|
msgpack_packer pk;
|
||||||
|
|
||||||
|
msgpack_packer_init(&pk, sbuf, msgpack_sbuffer_write);
|
||||||
|
/* 1st object */
|
||||||
|
msgpack_pack_array(&pk, 3);
|
||||||
|
msgpack_pack_int(&pk, 1);
|
||||||
|
msgpack_pack_true(&pk);
|
||||||
|
msgpack_pack_str(&pk, 7);
|
||||||
|
msgpack_pack_str_body(&pk, "example", 7);
|
||||||
|
/* 2nd object */
|
||||||
|
msgpack_pack_str(&pk, 6);
|
||||||
|
msgpack_pack_str_body(&pk, "second", 6);
|
||||||
|
/* 3rd object */
|
||||||
|
msgpack_pack_array(&pk, 2);
|
||||||
|
msgpack_pack_int(&pk, 42);
|
||||||
|
msgpack_pack_false(&pk);
|
||||||
|
}
|
||||||
|
|
||||||
|
void unpack(char const* buf, size_t len) {
|
||||||
|
/* buf is allocated by client. */
|
||||||
|
msgpack_unpacked result;
|
||||||
|
size_t off = 0;
|
||||||
|
msgpack_unpack_return ret;
|
||||||
|
int i = 0;
|
||||||
|
char unpacked_buffer[UNPACKED_BUFFER_SIZE];
|
||||||
|
msgpack_unpacked_init(&result);
|
||||||
|
ret = msgpack_unpack_next(&result, buf, len, &off);
|
||||||
|
while (ret == MSGPACK_UNPACK_SUCCESS) {
|
||||||
|
msgpack_object obj = result.data;
|
||||||
|
|
||||||
|
/* Use obj. */
|
||||||
|
printf("Object no %d:\n", ++i);
|
||||||
|
msgpack_object_print(stdout, obj);
|
||||||
|
printf("\n");
|
||||||
|
msgpack_object_print_buffer(unpacked_buffer, UNPACKED_BUFFER_SIZE, obj);
|
||||||
|
printf("%s\n", unpacked_buffer);
|
||||||
|
/* If you want to allocate something on the zone, you can use zone. */
|
||||||
|
/* msgpack_zone* zone = result.zone; */
|
||||||
|
/* The lifetime of the obj and the zone, */
|
||||||
|
|
||||||
|
ret = msgpack_unpack_next(&result, buf, len, &off);
|
||||||
|
}
|
||||||
|
msgpack_unpacked_destroy(&result);
|
||||||
|
|
||||||
|
if (ret == MSGPACK_UNPACK_CONTINUE) {
|
||||||
|
printf("All msgpack_object in the buffer is consumed.\n");
|
||||||
|
}
|
||||||
|
else if (ret == MSGPACK_UNPACK_PARSE_ERROR) {
|
||||||
|
printf("The data in the buf is invalid format.\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
msgpack_sbuffer sbuf;
|
||||||
|
msgpack_sbuffer_init(&sbuf);
|
||||||
|
|
||||||
|
prepare(&sbuf);
|
||||||
|
unpack(sbuf.data, sbuf.size);
|
||||||
|
|
||||||
|
msgpack_sbuffer_destroy(&sbuf);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Output */
|
||||||
|
|
||||||
|
/*
|
||||||
|
Object no 1:
|
||||||
|
[1, true, "example"]
|
||||||
|
Object no 2:
|
||||||
|
"second"
|
||||||
|
Object no 3:
|
||||||
|
[42, false]
|
||||||
|
All msgpack_object in the buffer is consumed.
|
||||||
|
*/
|
||||||
24
include/msgpack.h
Normal file
24
include/msgpack.h
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
/*
|
||||||
|
* MessagePack for C
|
||||||
|
*
|
||||||
|
* Copyright (C) 2008-2009 FURUHASHI Sadayuki
|
||||||
|
*
|
||||||
|
* Distributed under the Boost Software License, Version 1.0.
|
||||||
|
* (See accompanying file LICENSE_1_0.txt or copy at
|
||||||
|
* http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* @defgroup msgpack MessagePack C
|
||||||
|
* @{
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "msgpack/util.h"
|
||||||
|
#include "msgpack/object.h"
|
||||||
|
#include "msgpack/zone.h"
|
||||||
|
#include "msgpack/pack.h"
|
||||||
|
#include "msgpack/unpack.h"
|
||||||
|
#include "msgpack/sbuffer.h"
|
||||||
|
#include "msgpack/vrefbuffer.h"
|
||||||
|
#include "msgpack/version.h"
|
||||||
|
|
||||||
42
include/msgpack/fbuffer.h
Normal file
42
include/msgpack/fbuffer.h
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
/*
|
||||||
|
* MessagePack for C FILE* buffer adaptor
|
||||||
|
*
|
||||||
|
* Copyright (C) 2013 Vladimir Volodko
|
||||||
|
*
|
||||||
|
* Distributed under the Boost Software License, Version 1.0.
|
||||||
|
* (See accompanying file LICENSE_1_0.txt or copy at
|
||||||
|
* http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
*/
|
||||||
|
#ifndef MSGPACK_FBUFFER_H
|
||||||
|
#define MSGPACK_FBUFFER_H
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup msgpack_fbuffer FILE* buffer
|
||||||
|
* @ingroup msgpack_buffer
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
static inline int msgpack_fbuffer_write(void* data, const char* buf, size_t len)
|
||||||
|
{
|
||||||
|
assert(buf || len == 0);
|
||||||
|
if(!buf) return 0;
|
||||||
|
|
||||||
|
return (1 == fwrite(buf, len, 1, (FILE *)data)) ? 0 : -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* msgpack/fbuffer.h */
|
||||||
25
include/msgpack/gcc_atomic.h
Normal file
25
include/msgpack/gcc_atomic.h
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
/*
|
||||||
|
* Distributed under the Boost Software License, Version 1.0.
|
||||||
|
* (See accompanying file LICENSE_1_0.txt or copy at
|
||||||
|
* http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef MSGPACK_GCC_ATOMIC_H
|
||||||
|
#define MSGPACK_GCC_ATOMIC_H
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef int _msgpack_atomic_counter_t;
|
||||||
|
|
||||||
|
int _msgpack_sync_decr_and_fetch(volatile _msgpack_atomic_counter_t* ptr);
|
||||||
|
int _msgpack_sync_incr_and_fetch(volatile _msgpack_atomic_counter_t* ptr);
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#endif // MSGPACK_GCC_ATOMIC_H
|
||||||
118
include/msgpack/object.h
Normal file
118
include/msgpack/object.h
Normal file
@@ -0,0 +1,118 @@
|
|||||||
|
/*
|
||||||
|
* MessagePack for C dynamic typing routine
|
||||||
|
*
|
||||||
|
* Copyright (C) 2008-2009 FURUHASHI Sadayuki
|
||||||
|
*
|
||||||
|
* Distributed under the Boost Software License, Version 1.0.
|
||||||
|
* (See accompanying file LICENSE_1_0.txt or copy at
|
||||||
|
* http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
*/
|
||||||
|
#ifndef MSGPACK_OBJECT_H
|
||||||
|
#define MSGPACK_OBJECT_H
|
||||||
|
|
||||||
|
#include "zone.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup msgpack_object Dynamically typed object
|
||||||
|
* @ingroup msgpack
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
MSGPACK_OBJECT_NIL = 0x00,
|
||||||
|
MSGPACK_OBJECT_BOOLEAN = 0x01,
|
||||||
|
MSGPACK_OBJECT_POSITIVE_INTEGER = 0x02,
|
||||||
|
MSGPACK_OBJECT_NEGATIVE_INTEGER = 0x03,
|
||||||
|
MSGPACK_OBJECT_FLOAT32 = 0x0a,
|
||||||
|
MSGPACK_OBJECT_FLOAT64 = 0x04,
|
||||||
|
MSGPACK_OBJECT_FLOAT = 0x04,
|
||||||
|
#if defined(MSGPACK_USE_LEGACY_NAME_AS_FLOAT)
|
||||||
|
MSGPACK_OBJECT_DOUBLE = MSGPACK_OBJECT_FLOAT, /* obsolete */
|
||||||
|
#endif /* MSGPACK_USE_LEGACY_NAME_AS_FLOAT */
|
||||||
|
MSGPACK_OBJECT_STR = 0x05,
|
||||||
|
MSGPACK_OBJECT_ARRAY = 0x06,
|
||||||
|
MSGPACK_OBJECT_MAP = 0x07,
|
||||||
|
MSGPACK_OBJECT_BIN = 0x08,
|
||||||
|
MSGPACK_OBJECT_EXT = 0x09
|
||||||
|
} msgpack_object_type;
|
||||||
|
|
||||||
|
|
||||||
|
struct msgpack_object;
|
||||||
|
struct msgpack_object_kv;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint32_t size;
|
||||||
|
struct msgpack_object* ptr;
|
||||||
|
} msgpack_object_array;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint32_t size;
|
||||||
|
struct msgpack_object_kv* ptr;
|
||||||
|
} msgpack_object_map;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint32_t size;
|
||||||
|
const char* ptr;
|
||||||
|
} msgpack_object_str;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint32_t size;
|
||||||
|
const char* ptr;
|
||||||
|
} msgpack_object_bin;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int8_t type;
|
||||||
|
uint32_t size;
|
||||||
|
const char* ptr;
|
||||||
|
} msgpack_object_ext;
|
||||||
|
|
||||||
|
typedef union {
|
||||||
|
bool boolean;
|
||||||
|
uint64_t u64;
|
||||||
|
int64_t i64;
|
||||||
|
#if defined(MSGPACK_USE_LEGACY_NAME_AS_FLOAT)
|
||||||
|
double dec; /* obsolete*/
|
||||||
|
#endif /* MSGPACK_USE_LEGACY_NAME_AS_FLOAT */
|
||||||
|
double f64;
|
||||||
|
msgpack_object_array array;
|
||||||
|
msgpack_object_map map;
|
||||||
|
msgpack_object_str str;
|
||||||
|
msgpack_object_bin bin;
|
||||||
|
msgpack_object_ext ext;
|
||||||
|
} msgpack_object_union;
|
||||||
|
|
||||||
|
typedef struct msgpack_object {
|
||||||
|
msgpack_object_type type;
|
||||||
|
msgpack_object_union via;
|
||||||
|
} msgpack_object;
|
||||||
|
|
||||||
|
typedef struct msgpack_object_kv {
|
||||||
|
msgpack_object key;
|
||||||
|
msgpack_object val;
|
||||||
|
} msgpack_object_kv;
|
||||||
|
|
||||||
|
#if !defined(_KERNEL_MODE)
|
||||||
|
MSGPACK_DLLEXPORT
|
||||||
|
void msgpack_object_print(FILE* out, msgpack_object o);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
MSGPACK_DLLEXPORT
|
||||||
|
int msgpack_object_print_buffer(char *buffer, size_t buffer_size, msgpack_object o);
|
||||||
|
|
||||||
|
MSGPACK_DLLEXPORT
|
||||||
|
bool msgpack_object_equal(const msgpack_object x, const msgpack_object y);
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* msgpack/object.h */
|
||||||
174
include/msgpack/pack.h
Normal file
174
include/msgpack/pack.h
Normal file
@@ -0,0 +1,174 @@
|
|||||||
|
/*
|
||||||
|
* MessagePack for C packing routine
|
||||||
|
*
|
||||||
|
* Copyright (C) 2008-2009 FURUHASHI Sadayuki
|
||||||
|
*
|
||||||
|
* Distributed under the Boost Software License, Version 1.0.
|
||||||
|
* (See accompanying file LICENSE_1_0.txt or copy at
|
||||||
|
* http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
*/
|
||||||
|
#ifndef MSGPACK_PACK_H
|
||||||
|
#define MSGPACK_PACK_H
|
||||||
|
|
||||||
|
#include "pack_define.h"
|
||||||
|
#include "object.h"
|
||||||
|
#include "timestamp.h"
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup msgpack_buffer Buffers
|
||||||
|
* @ingroup msgpack
|
||||||
|
* @{
|
||||||
|
* @}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup msgpack_pack Serializer
|
||||||
|
* @ingroup msgpack
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef int (*msgpack_packer_write)(void* data, const char* buf, size_t len);
|
||||||
|
|
||||||
|
typedef struct msgpack_packer {
|
||||||
|
void* data;
|
||||||
|
msgpack_packer_write callback;
|
||||||
|
} msgpack_packer;
|
||||||
|
|
||||||
|
static void msgpack_packer_init(msgpack_packer* pk, void* data, msgpack_packer_write callback);
|
||||||
|
|
||||||
|
static msgpack_packer* msgpack_packer_new(void* data, msgpack_packer_write callback);
|
||||||
|
static void msgpack_packer_free(msgpack_packer* pk);
|
||||||
|
|
||||||
|
static int msgpack_pack_char(msgpack_packer* pk, char d);
|
||||||
|
|
||||||
|
static int msgpack_pack_signed_char(msgpack_packer* pk, signed char d);
|
||||||
|
static int msgpack_pack_short(msgpack_packer* pk, short d);
|
||||||
|
static int msgpack_pack_int(msgpack_packer* pk, int d);
|
||||||
|
static int msgpack_pack_long(msgpack_packer* pk, long d);
|
||||||
|
static int msgpack_pack_long_long(msgpack_packer* pk, long long d);
|
||||||
|
static int msgpack_pack_unsigned_char(msgpack_packer* pk, unsigned char d);
|
||||||
|
static int msgpack_pack_unsigned_short(msgpack_packer* pk, unsigned short d);
|
||||||
|
static int msgpack_pack_unsigned_int(msgpack_packer* pk, unsigned int d);
|
||||||
|
static int msgpack_pack_unsigned_long(msgpack_packer* pk, unsigned long d);
|
||||||
|
static int msgpack_pack_unsigned_long_long(msgpack_packer* pk, unsigned long long d);
|
||||||
|
|
||||||
|
static int msgpack_pack_uint8(msgpack_packer* pk, uint8_t d);
|
||||||
|
static int msgpack_pack_uint16(msgpack_packer* pk, uint16_t d);
|
||||||
|
static int msgpack_pack_uint32(msgpack_packer* pk, uint32_t d);
|
||||||
|
static int msgpack_pack_uint64(msgpack_packer* pk, uint64_t d);
|
||||||
|
static int msgpack_pack_int8(msgpack_packer* pk, int8_t d);
|
||||||
|
static int msgpack_pack_int16(msgpack_packer* pk, int16_t d);
|
||||||
|
static int msgpack_pack_int32(msgpack_packer* pk, int32_t d);
|
||||||
|
static int msgpack_pack_int64(msgpack_packer* pk, int64_t d);
|
||||||
|
|
||||||
|
static int msgpack_pack_fix_uint8(msgpack_packer* pk, uint8_t d);
|
||||||
|
static int msgpack_pack_fix_uint16(msgpack_packer* pk, uint16_t d);
|
||||||
|
static int msgpack_pack_fix_uint32(msgpack_packer* pk, uint32_t d);
|
||||||
|
static int msgpack_pack_fix_uint64(msgpack_packer* pk, uint64_t d);
|
||||||
|
static int msgpack_pack_fix_int8(msgpack_packer* pk, int8_t d);
|
||||||
|
static int msgpack_pack_fix_int16(msgpack_packer* pk, int16_t d);
|
||||||
|
static int msgpack_pack_fix_int32(msgpack_packer* pk, int32_t d);
|
||||||
|
static int msgpack_pack_fix_int64(msgpack_packer* pk, int64_t d);
|
||||||
|
|
||||||
|
static int msgpack_pack_float(msgpack_packer* pk, float d);
|
||||||
|
static int msgpack_pack_double(msgpack_packer* pk, double d);
|
||||||
|
|
||||||
|
static int msgpack_pack_nil(msgpack_packer* pk);
|
||||||
|
static int msgpack_pack_true(msgpack_packer* pk);
|
||||||
|
static int msgpack_pack_false(msgpack_packer* pk);
|
||||||
|
|
||||||
|
static int msgpack_pack_array(msgpack_packer* pk, size_t n);
|
||||||
|
|
||||||
|
static int msgpack_pack_map(msgpack_packer* pk, size_t n);
|
||||||
|
|
||||||
|
static int msgpack_pack_str(msgpack_packer* pk, size_t l);
|
||||||
|
static int msgpack_pack_str_body(msgpack_packer* pk, const void* b, size_t l);
|
||||||
|
static int msgpack_pack_str_with_body(msgpack_packer* pk, const void* b, size_t l);
|
||||||
|
|
||||||
|
static int msgpack_pack_v4raw(msgpack_packer* pk, size_t l);
|
||||||
|
static int msgpack_pack_v4raw_body(msgpack_packer* pk, const void* b, size_t l);
|
||||||
|
|
||||||
|
static int msgpack_pack_bin(msgpack_packer* pk, size_t l);
|
||||||
|
static int msgpack_pack_bin_body(msgpack_packer* pk, const void* b, size_t l);
|
||||||
|
static int msgpack_pack_bin_with_body(msgpack_packer* pk, const void* b, size_t l);
|
||||||
|
|
||||||
|
static int msgpack_pack_ext(msgpack_packer* pk, size_t l, int8_t type);
|
||||||
|
static int msgpack_pack_ext_body(msgpack_packer* pk, const void* b, size_t l);
|
||||||
|
static int msgpack_pack_ext_with_body(msgpack_packer* pk, const void* b, size_t l, int8_t type);
|
||||||
|
|
||||||
|
static int msgpack_pack_timestamp(msgpack_packer* pk, const msgpack_timestamp* d);
|
||||||
|
|
||||||
|
MSGPACK_DLLEXPORT
|
||||||
|
int msgpack_pack_object(msgpack_packer* pk, msgpack_object d);
|
||||||
|
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
|
||||||
|
#define msgpack_pack_inline_func(name) \
|
||||||
|
inline int msgpack_pack ## name
|
||||||
|
|
||||||
|
#define msgpack_pack_inline_func_cint(name) \
|
||||||
|
inline int msgpack_pack ## name
|
||||||
|
|
||||||
|
#define msgpack_pack_inline_func_fixint(name) \
|
||||||
|
inline int msgpack_pack_fix ## name
|
||||||
|
|
||||||
|
#define msgpack_pack_user msgpack_packer*
|
||||||
|
|
||||||
|
#define msgpack_pack_append_buffer(user, buf, len) \
|
||||||
|
return (*(user)->callback)((user)->data, (const char*)buf, len)
|
||||||
|
|
||||||
|
#include "pack_template.h"
|
||||||
|
|
||||||
|
inline void msgpack_packer_init(msgpack_packer* pk, void* data, msgpack_packer_write callback)
|
||||||
|
{
|
||||||
|
pk->data = data;
|
||||||
|
pk->callback = callback;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline msgpack_packer* msgpack_packer_new(void* data, msgpack_packer_write callback)
|
||||||
|
{
|
||||||
|
msgpack_packer* pk = (msgpack_packer*)calloc(1, sizeof(msgpack_packer));
|
||||||
|
if(!pk) { return NULL; }
|
||||||
|
msgpack_packer_init(pk, data, callback);
|
||||||
|
return pk;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void msgpack_packer_free(msgpack_packer* pk)
|
||||||
|
{
|
||||||
|
free(pk);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline int msgpack_pack_str_with_body(msgpack_packer* pk, const void* b, size_t l)
|
||||||
|
{
|
||||||
|
int ret = msgpack_pack_str(pk, l);
|
||||||
|
if (ret != 0) { return ret; }
|
||||||
|
return msgpack_pack_str_body(pk, b, l);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline int msgpack_pack_bin_with_body(msgpack_packer* pk, const void* b, size_t l)
|
||||||
|
{
|
||||||
|
int ret = msgpack_pack_bin(pk, l);
|
||||||
|
if (ret != 0) { return ret; }
|
||||||
|
return msgpack_pack_bin_body(pk, b, l);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline int msgpack_pack_ext_with_body(msgpack_packer* pk, const void* b, size_t l, int8_t type)
|
||||||
|
{
|
||||||
|
int ret = msgpack_pack_ext(pk, l, type);
|
||||||
|
if (ret != 0) { return ret; }
|
||||||
|
return msgpack_pack_ext_body(pk, b, l);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* msgpack/pack.h */
|
||||||
18
include/msgpack/pack_define.h
Normal file
18
include/msgpack/pack_define.h
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
/*
|
||||||
|
* MessagePack unpacking routine template
|
||||||
|
*
|
||||||
|
* Copyright (C) 2008-2010 FURUHASHI Sadayuki
|
||||||
|
*
|
||||||
|
* Distributed under the Boost Software License, Version 1.0.
|
||||||
|
* (See accompanying file LICENSE_1_0.txt or copy at
|
||||||
|
* http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
*/
|
||||||
|
#ifndef MSGPACK_PACK_DEFINE_H
|
||||||
|
#define MSGPACK_PACK_DEFINE_H
|
||||||
|
|
||||||
|
#include "msgpack/sysdep.h"
|
||||||
|
#include <limits.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#endif /* msgpack/pack_define.h */
|
||||||
|
|
||||||
115
include/msgpack/sbuffer.h
Normal file
115
include/msgpack/sbuffer.h
Normal file
@@ -0,0 +1,115 @@
|
|||||||
|
/*
|
||||||
|
* MessagePack for C simple buffer implementation
|
||||||
|
*
|
||||||
|
* Copyright (C) 2008-2009 FURUHASHI Sadayuki
|
||||||
|
*
|
||||||
|
* Distributed under the Boost Software License, Version 1.0.
|
||||||
|
* (See accompanying file LICENSE_1_0.txt or copy at
|
||||||
|
* http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
*/
|
||||||
|
#ifndef MSGPACK_SBUFFER_H
|
||||||
|
#define MSGPACK_SBUFFER_H
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup msgpack_sbuffer Simple buffer
|
||||||
|
* @ingroup msgpack_buffer
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef struct msgpack_sbuffer {
|
||||||
|
size_t size;
|
||||||
|
char* data;
|
||||||
|
size_t alloc;
|
||||||
|
} msgpack_sbuffer;
|
||||||
|
|
||||||
|
static inline void msgpack_sbuffer_init(msgpack_sbuffer* sbuf)
|
||||||
|
{
|
||||||
|
memset(sbuf, 0, sizeof(msgpack_sbuffer));
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void msgpack_sbuffer_destroy(msgpack_sbuffer* sbuf)
|
||||||
|
{
|
||||||
|
free(sbuf->data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline msgpack_sbuffer* msgpack_sbuffer_new(void)
|
||||||
|
{
|
||||||
|
return (msgpack_sbuffer*)calloc(1, sizeof(msgpack_sbuffer));
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void msgpack_sbuffer_free(msgpack_sbuffer* sbuf)
|
||||||
|
{
|
||||||
|
if(sbuf == NULL) { return; }
|
||||||
|
msgpack_sbuffer_destroy(sbuf);
|
||||||
|
free(sbuf);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef MSGPACK_SBUFFER_INIT_SIZE
|
||||||
|
#define MSGPACK_SBUFFER_INIT_SIZE 8192
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static inline int msgpack_sbuffer_write(void* data, const char* buf, size_t len)
|
||||||
|
{
|
||||||
|
msgpack_sbuffer* sbuf = (msgpack_sbuffer*)data;
|
||||||
|
|
||||||
|
assert(buf || len == 0);
|
||||||
|
if(!buf) return 0;
|
||||||
|
|
||||||
|
if(sbuf->alloc - sbuf->size < len) {
|
||||||
|
void* tmp;
|
||||||
|
size_t nsize = (sbuf->alloc) ?
|
||||||
|
sbuf->alloc * 2 : MSGPACK_SBUFFER_INIT_SIZE;
|
||||||
|
|
||||||
|
while(nsize < sbuf->size + len) {
|
||||||
|
size_t tmp_nsize = nsize * 2;
|
||||||
|
if (tmp_nsize <= nsize) {
|
||||||
|
nsize = sbuf->size + len;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
nsize = tmp_nsize;
|
||||||
|
}
|
||||||
|
|
||||||
|
tmp = realloc(sbuf->data, nsize);
|
||||||
|
if(!tmp) { return -1; }
|
||||||
|
|
||||||
|
sbuf->data = (char*)tmp;
|
||||||
|
sbuf->alloc = nsize;
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(sbuf->data + sbuf->size, buf, len);
|
||||||
|
sbuf->size += len;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline char* msgpack_sbuffer_release(msgpack_sbuffer* sbuf)
|
||||||
|
{
|
||||||
|
char* tmp = sbuf->data;
|
||||||
|
sbuf->size = 0;
|
||||||
|
sbuf->data = NULL;
|
||||||
|
sbuf->alloc = 0;
|
||||||
|
return tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void msgpack_sbuffer_clear(msgpack_sbuffer* sbuf)
|
||||||
|
{
|
||||||
|
sbuf->size = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* msgpack/sbuffer.h */
|
||||||
58
include/msgpack/timestamp.h
Normal file
58
include/msgpack/timestamp.h
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
/*
|
||||||
|
* MessagePack for C TimeStamp
|
||||||
|
*
|
||||||
|
* Copyright (C) 2018 KONDO Takatoshi
|
||||||
|
*
|
||||||
|
* Distributed under the Boost Software License, Version 1.0.
|
||||||
|
* (See accompanying file LICENSE_1_0.txt or copy at
|
||||||
|
* http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
*/
|
||||||
|
#ifndef MSGPACK_TIMESTAMP_H
|
||||||
|
#define MSGPACK_TIMESTAMP_H
|
||||||
|
|
||||||
|
#include <msgpack/object.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct msgpack_timestamp {
|
||||||
|
int64_t tv_sec;
|
||||||
|
uint32_t tv_nsec;
|
||||||
|
} msgpack_timestamp;
|
||||||
|
|
||||||
|
static inline bool msgpack_object_to_timestamp(const msgpack_object* obj, msgpack_timestamp* ts) {
|
||||||
|
if (obj->type != MSGPACK_OBJECT_EXT) return false;
|
||||||
|
if (obj->via.ext.type != -1) return false;
|
||||||
|
switch (obj->via.ext.size) {
|
||||||
|
case 4:
|
||||||
|
ts->tv_nsec = 0;
|
||||||
|
{
|
||||||
|
uint32_t v;
|
||||||
|
_msgpack_load32(uint32_t, obj->via.ext.ptr, &v);
|
||||||
|
ts->tv_sec = v;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
case 8: {
|
||||||
|
uint64_t value;
|
||||||
|
_msgpack_load64(uint64_t, obj->via.ext.ptr, &value);
|
||||||
|
ts->tv_nsec = (uint32_t)(value >> 34);
|
||||||
|
ts->tv_sec = value & 0x00000003ffffffffLL;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
case 12:
|
||||||
|
_msgpack_load32(uint32_t, obj->via.ext.ptr, &ts->tv_nsec);
|
||||||
|
_msgpack_load64(int64_t, obj->via.ext.ptr + 4, &ts->tv_sec);
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* msgpack/timestamp.h */
|
||||||
281
include/msgpack/unpack.h
Normal file
281
include/msgpack/unpack.h
Normal file
@@ -0,0 +1,281 @@
|
|||||||
|
/*
|
||||||
|
* MessagePack for C unpacking routine
|
||||||
|
*
|
||||||
|
* Copyright (C) 2008-2009 FURUHASHI Sadayuki
|
||||||
|
*
|
||||||
|
* Distributed under the Boost Software License, Version 1.0.
|
||||||
|
* (See accompanying file LICENSE_1_0.txt or copy at
|
||||||
|
* http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
*/
|
||||||
|
#ifndef MSGPACK_UNPACKER_H
|
||||||
|
#define MSGPACK_UNPACKER_H
|
||||||
|
|
||||||
|
#include "zone.h"
|
||||||
|
#include "object.h"
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup msgpack_unpack Deserializer
|
||||||
|
* @ingroup msgpack
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef struct msgpack_unpacked {
|
||||||
|
msgpack_zone* zone;
|
||||||
|
msgpack_object data;
|
||||||
|
} msgpack_unpacked;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
MSGPACK_UNPACK_SUCCESS = 2,
|
||||||
|
MSGPACK_UNPACK_EXTRA_BYTES = 1,
|
||||||
|
MSGPACK_UNPACK_CONTINUE = 0,
|
||||||
|
MSGPACK_UNPACK_PARSE_ERROR = -1,
|
||||||
|
MSGPACK_UNPACK_NOMEM_ERROR = -2
|
||||||
|
} msgpack_unpack_return;
|
||||||
|
|
||||||
|
|
||||||
|
MSGPACK_DLLEXPORT
|
||||||
|
msgpack_unpack_return
|
||||||
|
msgpack_unpack_next(msgpack_unpacked* result,
|
||||||
|
const char* data, size_t len, size_t* off);
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup msgpack_unpacker Streaming deserializer
|
||||||
|
* @ingroup msgpack
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef struct msgpack_unpacker {
|
||||||
|
char* buffer;
|
||||||
|
size_t used;
|
||||||
|
size_t free;
|
||||||
|
size_t off;
|
||||||
|
size_t parsed;
|
||||||
|
msgpack_zone* z;
|
||||||
|
size_t initial_buffer_size;
|
||||||
|
void* ctx;
|
||||||
|
} msgpack_unpacker;
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef MSGPACK_UNPACKER_INIT_BUFFER_SIZE
|
||||||
|
#define MSGPACK_UNPACKER_INIT_BUFFER_SIZE (64*1024)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initializes a streaming deserializer.
|
||||||
|
* The initialized deserializer must be destroyed by msgpack_unpacker_destroy(msgpack_unpacker*).
|
||||||
|
*/
|
||||||
|
MSGPACK_DLLEXPORT
|
||||||
|
bool msgpack_unpacker_init(msgpack_unpacker* mpac, size_t initial_buffer_size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Destroys a streaming deserializer initialized by msgpack_unpacker_init(msgpack_unpacker*, size_t).
|
||||||
|
*/
|
||||||
|
MSGPACK_DLLEXPORT
|
||||||
|
void msgpack_unpacker_destroy(msgpack_unpacker* mpac);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a streaming deserializer.
|
||||||
|
* The created deserializer must be destroyed by msgpack_unpacker_free(msgpack_unpacker*).
|
||||||
|
*/
|
||||||
|
MSGPACK_DLLEXPORT
|
||||||
|
msgpack_unpacker* msgpack_unpacker_new(size_t initial_buffer_size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Frees a streaming deserializer created by msgpack_unpacker_new(size_t).
|
||||||
|
*/
|
||||||
|
MSGPACK_DLLEXPORT
|
||||||
|
void msgpack_unpacker_free(msgpack_unpacker* mpac);
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef MSGPACK_UNPACKER_RESERVE_SIZE
|
||||||
|
#define MSGPACK_UNPACKER_RESERVE_SIZE (32*1024)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reserves free space of the internal buffer.
|
||||||
|
* Use this function to fill the internal buffer with
|
||||||
|
* msgpack_unpacker_buffer(msgpack_unpacker*),
|
||||||
|
* msgpack_unpacker_buffer_capacity(const msgpack_unpacker*) and
|
||||||
|
* msgpack_unpacker_buffer_consumed(msgpack_unpacker*).
|
||||||
|
*/
|
||||||
|
static inline bool msgpack_unpacker_reserve_buffer(msgpack_unpacker* mpac, size_t size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets pointer to the free space of the internal buffer.
|
||||||
|
* Use this function to fill the internal buffer with
|
||||||
|
* msgpack_unpacker_reserve_buffer(msgpack_unpacker*, size_t),
|
||||||
|
* msgpack_unpacker_buffer_capacity(const msgpack_unpacker*) and
|
||||||
|
* msgpack_unpacker_buffer_consumed(msgpack_unpacker*).
|
||||||
|
*/
|
||||||
|
static inline char* msgpack_unpacker_buffer(msgpack_unpacker* mpac);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets size of the free space of the internal buffer.
|
||||||
|
* Use this function to fill the internal buffer with
|
||||||
|
* msgpack_unpacker_reserve_buffer(msgpack_unpacker*, size_t),
|
||||||
|
* msgpack_unpacker_buffer(const msgpack_unpacker*) and
|
||||||
|
* msgpack_unpacker_buffer_consumed(msgpack_unpacker*).
|
||||||
|
*/
|
||||||
|
static inline size_t msgpack_unpacker_buffer_capacity(const msgpack_unpacker* mpac);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Notifies the deserializer that the internal buffer filled.
|
||||||
|
* Use this function to fill the internal buffer with
|
||||||
|
* msgpack_unpacker_reserve_buffer(msgpack_unpacker*, size_t),
|
||||||
|
* msgpack_unpacker_buffer(msgpack_unpacker*) and
|
||||||
|
* msgpack_unpacker_buffer_capacity(const msgpack_unpacker*).
|
||||||
|
*/
|
||||||
|
static inline void msgpack_unpacker_buffer_consumed(msgpack_unpacker* mpac, size_t size);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deserializes one object.
|
||||||
|
* Returns true if it successes. Otherwise false is returned.
|
||||||
|
* @param pac pointer to an initialized msgpack_unpacked object.
|
||||||
|
*/
|
||||||
|
MSGPACK_DLLEXPORT
|
||||||
|
msgpack_unpack_return msgpack_unpacker_next(msgpack_unpacker* mpac, msgpack_unpacked* pac);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deserializes one object and set the number of parsed bytes involved.
|
||||||
|
* Returns true if it successes. Otherwise false is returned.
|
||||||
|
* @param mpac pointer to an initialized msgpack_unpacker object.
|
||||||
|
* @param result pointer to an initialized msgpack_unpacked object.
|
||||||
|
* @param p_bytes pointer to variable that will be set with the number of parsed bytes.
|
||||||
|
*/
|
||||||
|
MSGPACK_DLLEXPORT
|
||||||
|
msgpack_unpack_return msgpack_unpacker_next_with_size(msgpack_unpacker* mpac,
|
||||||
|
msgpack_unpacked* result,
|
||||||
|
size_t *p_bytes);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initializes a msgpack_unpacked object.
|
||||||
|
* The initialized object must be destroyed by msgpack_unpacked_destroy(msgpack_unpacker*).
|
||||||
|
* Use the object with msgpack_unpacker_next(msgpack_unpacker*, msgpack_unpacked*) or
|
||||||
|
* msgpack_unpack_next(msgpack_unpacked*, const char*, size_t, size_t*).
|
||||||
|
*/
|
||||||
|
static inline void msgpack_unpacked_init(msgpack_unpacked* result);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Destroys a streaming deserializer initialized by msgpack_unpacked().
|
||||||
|
*/
|
||||||
|
static inline void msgpack_unpacked_destroy(msgpack_unpacked* result);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Releases the memory zone from msgpack_unpacked object.
|
||||||
|
* The released zone must be freed by msgpack_zone_free(msgpack_zone*).
|
||||||
|
*/
|
||||||
|
static inline msgpack_zone* msgpack_unpacked_release_zone(msgpack_unpacked* result);
|
||||||
|
|
||||||
|
|
||||||
|
MSGPACK_DLLEXPORT
|
||||||
|
int msgpack_unpacker_execute(msgpack_unpacker* mpac);
|
||||||
|
|
||||||
|
MSGPACK_DLLEXPORT
|
||||||
|
msgpack_object msgpack_unpacker_data(msgpack_unpacker* mpac);
|
||||||
|
|
||||||
|
MSGPACK_DLLEXPORT
|
||||||
|
msgpack_zone* msgpack_unpacker_release_zone(msgpack_unpacker* mpac);
|
||||||
|
|
||||||
|
MSGPACK_DLLEXPORT
|
||||||
|
void msgpack_unpacker_reset_zone(msgpack_unpacker* mpac);
|
||||||
|
|
||||||
|
MSGPACK_DLLEXPORT
|
||||||
|
void msgpack_unpacker_reset(msgpack_unpacker* mpac);
|
||||||
|
|
||||||
|
static inline size_t msgpack_unpacker_message_size(const msgpack_unpacker* mpac);
|
||||||
|
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
|
||||||
|
// obsolete
|
||||||
|
MSGPACK_DLLEXPORT
|
||||||
|
msgpack_unpack_return
|
||||||
|
msgpack_unpack(const char* data, size_t len, size_t* off,
|
||||||
|
msgpack_zone* result_zone, msgpack_object* result);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static inline size_t msgpack_unpacker_parsed_size(const msgpack_unpacker* mpac);
|
||||||
|
|
||||||
|
MSGPACK_DLLEXPORT
|
||||||
|
bool msgpack_unpacker_flush_zone(msgpack_unpacker* mpac);
|
||||||
|
|
||||||
|
MSGPACK_DLLEXPORT
|
||||||
|
bool msgpack_unpacker_expand_buffer(msgpack_unpacker* mpac, size_t size);
|
||||||
|
|
||||||
|
static inline bool msgpack_unpacker_reserve_buffer(msgpack_unpacker* mpac, size_t size)
|
||||||
|
{
|
||||||
|
if(mpac->free >= size) { return true; }
|
||||||
|
return msgpack_unpacker_expand_buffer(mpac, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline char* msgpack_unpacker_buffer(msgpack_unpacker* mpac)
|
||||||
|
{
|
||||||
|
return mpac->buffer + mpac->used;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline size_t msgpack_unpacker_buffer_capacity(const msgpack_unpacker* mpac)
|
||||||
|
{
|
||||||
|
return mpac->free;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void msgpack_unpacker_buffer_consumed(msgpack_unpacker* mpac, size_t size)
|
||||||
|
{
|
||||||
|
mpac->used += size;
|
||||||
|
mpac->free -= size;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline size_t msgpack_unpacker_message_size(const msgpack_unpacker* mpac)
|
||||||
|
{
|
||||||
|
return mpac->parsed - mpac->off + mpac->used;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline size_t msgpack_unpacker_parsed_size(const msgpack_unpacker* mpac)
|
||||||
|
{
|
||||||
|
return mpac->parsed;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static inline void msgpack_unpacked_init(msgpack_unpacked* result)
|
||||||
|
{
|
||||||
|
memset(result, 0, sizeof(msgpack_unpacked));
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void msgpack_unpacked_destroy(msgpack_unpacked* result)
|
||||||
|
{
|
||||||
|
if(result->zone != NULL) {
|
||||||
|
msgpack_zone_free(result->zone);
|
||||||
|
result->zone = NULL;
|
||||||
|
memset(&result->data, 0, sizeof(msgpack_object));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline msgpack_zone* msgpack_unpacked_release_zone(msgpack_unpacked* result)
|
||||||
|
{
|
||||||
|
if(result->zone != NULL) {
|
||||||
|
msgpack_zone* z = result->zone;
|
||||||
|
result->zone = NULL;
|
||||||
|
return z;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* msgpack/unpack.h */
|
||||||
89
include/msgpack/unpack_define.h
Normal file
89
include/msgpack/unpack_define.h
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
/*
|
||||||
|
* MessagePack unpacking routine template
|
||||||
|
*
|
||||||
|
* Copyright (C) 2008-2010 FURUHASHI Sadayuki
|
||||||
|
*
|
||||||
|
* Distributed under the Boost Software License, Version 1.0.
|
||||||
|
* (See accompanying file LICENSE_1_0.txt or copy at
|
||||||
|
* http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
*/
|
||||||
|
#ifndef MSGPACK_UNPACK_DEFINE_H
|
||||||
|
#define MSGPACK_UNPACK_DEFINE_H
|
||||||
|
|
||||||
|
#include "msgpack/sysdep.h"
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <assert.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef MSGPACK_EMBED_STACK_SIZE
|
||||||
|
#define MSGPACK_EMBED_STACK_SIZE 32
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
MSGPACK_CS_HEADER = 0x00, // nil
|
||||||
|
|
||||||
|
//MSGPACK_CS_ = 0x01,
|
||||||
|
//MSGPACK_CS_ = 0x02, // false
|
||||||
|
//MSGPACK_CS_ = 0x03, // true
|
||||||
|
|
||||||
|
MSGPACK_CS_BIN_8 = 0x04,
|
||||||
|
MSGPACK_CS_BIN_16 = 0x05,
|
||||||
|
MSGPACK_CS_BIN_32 = 0x06,
|
||||||
|
|
||||||
|
MSGPACK_CS_EXT_8 = 0x07,
|
||||||
|
MSGPACK_CS_EXT_16 = 0x08,
|
||||||
|
MSGPACK_CS_EXT_32 = 0x09,
|
||||||
|
|
||||||
|
MSGPACK_CS_FLOAT = 0x0a,
|
||||||
|
MSGPACK_CS_DOUBLE = 0x0b,
|
||||||
|
MSGPACK_CS_UINT_8 = 0x0c,
|
||||||
|
MSGPACK_CS_UINT_16 = 0x0d,
|
||||||
|
MSGPACK_CS_UINT_32 = 0x0e,
|
||||||
|
MSGPACK_CS_UINT_64 = 0x0f,
|
||||||
|
MSGPACK_CS_INT_8 = 0x10,
|
||||||
|
MSGPACK_CS_INT_16 = 0x11,
|
||||||
|
MSGPACK_CS_INT_32 = 0x12,
|
||||||
|
MSGPACK_CS_INT_64 = 0x13,
|
||||||
|
|
||||||
|
MSGPACK_CS_FIXEXT_1 = 0x14,
|
||||||
|
MSGPACK_CS_FIXEXT_2 = 0x15,
|
||||||
|
MSGPACK_CS_FIXEXT_4 = 0x16,
|
||||||
|
MSGPACK_CS_FIXEXT_8 = 0x17,
|
||||||
|
MSGPACK_CS_FIXEXT_16 = 0x18,
|
||||||
|
|
||||||
|
MSGPACK_CS_STR_8 = 0x19, // str8
|
||||||
|
MSGPACK_CS_STR_16 = 0x1a, // str16
|
||||||
|
MSGPACK_CS_STR_32 = 0x1b, // str32
|
||||||
|
MSGPACK_CS_ARRAY_16 = 0x1c,
|
||||||
|
MSGPACK_CS_ARRAY_32 = 0x1d,
|
||||||
|
MSGPACK_CS_MAP_16 = 0x1e,
|
||||||
|
MSGPACK_CS_MAP_32 = 0x1f,
|
||||||
|
|
||||||
|
//MSGPACK_ACS_BIG_INT_VALUE,
|
||||||
|
//MSGPACK_ACS_BIG_FLOAT_VALUE,
|
||||||
|
MSGPACK_ACS_STR_VALUE,
|
||||||
|
MSGPACK_ACS_BIN_VALUE,
|
||||||
|
MSGPACK_ACS_EXT_VALUE
|
||||||
|
} msgpack_unpack_state;
|
||||||
|
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
MSGPACK_CT_ARRAY_ITEM,
|
||||||
|
MSGPACK_CT_MAP_KEY,
|
||||||
|
MSGPACK_CT_MAP_VALUE
|
||||||
|
} msgpack_container_type;
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* msgpack/unpack_define.h */
|
||||||
|
|
||||||
471
include/msgpack/unpack_template.h
Normal file
471
include/msgpack/unpack_template.h
Normal file
@@ -0,0 +1,471 @@
|
|||||||
|
/*
|
||||||
|
* MessagePack unpacking routine template
|
||||||
|
*
|
||||||
|
* Copyright (C) 2008-2010 FURUHASHI Sadayuki
|
||||||
|
*
|
||||||
|
* Distributed under the Boost Software License, Version 1.0.
|
||||||
|
* (See accompanying file LICENSE_1_0.txt or copy at
|
||||||
|
* http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#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
|
||||||
|
|
||||||
|
#if defined(_KERNEL_MODE)
|
||||||
|
#undef assert
|
||||||
|
#define assert NT_ASSERT
|
||||||
|
#endif
|
||||||
|
|
||||||
|
msgpack_unpack_struct_decl(_stack) {
|
||||||
|
msgpack_unpack_object obj;
|
||||||
|
size_t count;
|
||||||
|
unsigned int ct;
|
||||||
|
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;
|
||||||
|
unsigned int stack_size;
|
||||||
|
msgpack_unpack_struct(_stack) embed_stack[MSGPACK_EMBED_STACK_SIZE];
|
||||||
|
*/
|
||||||
|
msgpack_unpack_struct(_stack) stack[MSGPACK_EMBED_STACK_SIZE];
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
msgpack_unpack_func(void, _init)(msgpack_unpack_struct(_context)* ctx)
|
||||||
|
{
|
||||||
|
ctx->cs = MSGPACK_CS_HEADER;
|
||||||
|
ctx->trail = 0;
|
||||||
|
ctx->top = 0;
|
||||||
|
/*
|
||||||
|
ctx->stack = ctx->embed_stack;
|
||||||
|
ctx->stack_size = MSGPACK_EMBED_STACK_SIZE;
|
||||||
|
*/
|
||||||
|
ctx->stack[0].obj = msgpack_unpack_callback(_root)(&ctx->user);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
msgpack_unpack_func(void, _destroy)(msgpack_unpack_struct(_context)* ctx)
|
||||||
|
{
|
||||||
|
if(ctx->stack_size != MSGPACK_EMBED_STACK_SIZE) {
|
||||||
|
free(ctx->stack);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
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;
|
||||||
|
/*
|
||||||
|
unsigned int stack_size = ctx->stack_size;
|
||||||
|
*/
|
||||||
|
msgpack_unpack_user* user = &ctx->user;
|
||||||
|
|
||||||
|
msgpack_unpack_object obj;
|
||||||
|
msgpack_unpack_struct(_stack)* c = NULL;
|
||||||
|
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
#define push_simple_value(func) \
|
||||||
|
ret = msgpack_unpack_callback(func)(user, &obj); \
|
||||||
|
if(ret < 0) { goto _failed; } \
|
||||||
|
goto _push
|
||||||
|
#define push_fixed_value(func, arg) \
|
||||||
|
ret = msgpack_unpack_callback(func)(user, arg, &obj); \
|
||||||
|
if(ret < 0) { goto _failed; } \
|
||||||
|
goto _push
|
||||||
|
#define push_variable_value(func, base, pos, len) \
|
||||||
|
ret = msgpack_unpack_callback(func)(user, \
|
||||||
|
(const char*)base, (const char*)pos, len, &obj); \
|
||||||
|
if(ret < 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(top >= MSGPACK_EMBED_STACK_SIZE) { \
|
||||||
|
ret = MSGPACK_UNPACK_NOMEM_ERROR; \
|
||||||
|
goto _failed; \
|
||||||
|
} /* FIXME */ \
|
||||||
|
ret = msgpack_unpack_callback(func)(user, count_, &stack[top].obj); \
|
||||||
|
if(ret < 0) { goto _failed; } \
|
||||||
|
if((count_) == 0) { obj = stack[top].obj; goto _push; } \
|
||||||
|
stack[top].ct = ct_; \
|
||||||
|
stack[top].count = count_; \
|
||||||
|
++top; \
|
||||||
|
goto _header_again
|
||||||
|
|
||||||
|
#define NEXT_CS(p) \
|
||||||
|
((unsigned int)*p & 0x1f)
|
||||||
|
|
||||||
|
#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 MSGPACK_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: // bin 8
|
||||||
|
case 0xc5: // bin 16
|
||||||
|
case 0xc6: // bin 32
|
||||||
|
again_fixed_trail(NEXT_CS(p), 1 << (((unsigned int)*p) & 0x03));
|
||||||
|
case 0xc7: // ext 8
|
||||||
|
case 0xc8: // ext 16
|
||||||
|
case 0xc9: // ext 32
|
||||||
|
again_fixed_trail(NEXT_CS(p), 1 << ((((unsigned int)*p) + 1) & 0x03));
|
||||||
|
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: // fixext 1
|
||||||
|
case 0xd5: // fixext 2
|
||||||
|
case 0xd6: // fixext 4
|
||||||
|
case 0xd7: // fixext 8
|
||||||
|
again_fixed_trail_if_zero(MSGPACK_ACS_EXT_VALUE,
|
||||||
|
(1 << (((unsigned int)*p) & 0x03)) + 1, _ext_zero);
|
||||||
|
case 0xd8: // fixext 16
|
||||||
|
again_fixed_trail_if_zero(MSGPACK_ACS_EXT_VALUE, 16+1, _ext_zero);
|
||||||
|
|
||||||
|
case 0xd9: // str 8
|
||||||
|
case 0xda: // str 16
|
||||||
|
case 0xdb: // str 32
|
||||||
|
again_fixed_trail(NEXT_CS(p), 1 << ((((unsigned int)*p) & 0x03) - 1));
|
||||||
|
case 0xdc: // array 16
|
||||||
|
case 0xdd: // array 32
|
||||||
|
case 0xde: // map 16
|
||||||
|
case 0xdf: // map 32
|
||||||
|
again_fixed_trail(NEXT_CS(p), 2u << (((unsigned int)*p) & 0x01));
|
||||||
|
default:
|
||||||
|
ret = MSGPACK_UNPACK_PARSE_ERROR;
|
||||||
|
goto _failed;
|
||||||
|
}
|
||||||
|
SWITCH_RANGE(0xa0, 0xbf) // FixStr
|
||||||
|
again_fixed_trail_if_zero(MSGPACK_ACS_STR_VALUE, ((unsigned int)*p & 0x1f), _str_zero);
|
||||||
|
SWITCH_RANGE(0x90, 0x9f) // FixArray
|
||||||
|
start_container(_array, ((unsigned int)*p) & 0x0f, MSGPACK_CT_ARRAY_ITEM);
|
||||||
|
SWITCH_RANGE(0x80, 0x8f) // FixMap
|
||||||
|
start_container(_map, ((unsigned int)*p) & 0x0f, MSGPACK_CT_MAP_KEY);
|
||||||
|
|
||||||
|
SWITCH_RANGE_DEFAULT
|
||||||
|
ret = MSGPACK_UNPACK_PARSE_ERROR;
|
||||||
|
goto _failed;
|
||||||
|
SWITCH_RANGE_END
|
||||||
|
// end MSGPACK_CS_HEADER
|
||||||
|
|
||||||
|
|
||||||
|
_fixed_trail_again:
|
||||||
|
++p;
|
||||||
|
// fallthrough
|
||||||
|
|
||||||
|
default:
|
||||||
|
if((size_t)(pe - p) < trail) { goto _out; }
|
||||||
|
n = p; p += trail - 1;
|
||||||
|
switch(cs) {
|
||||||
|
//case MSGPACK_CS_
|
||||||
|
//case MSGPACK_CS_
|
||||||
|
case MSGPACK_CS_FLOAT: {
|
||||||
|
union { uint32_t i; float f; } mem;
|
||||||
|
_msgpack_load32(uint32_t, n, &mem.i);
|
||||||
|
push_fixed_value(_float, mem.f); }
|
||||||
|
case MSGPACK_CS_DOUBLE: {
|
||||||
|
union { uint64_t i; double f; } mem;
|
||||||
|
_msgpack_load64(uint64_t, n, &mem.i);
|
||||||
|
#if defined(TARGET_OS_IPHONE)
|
||||||
|
// ok
|
||||||
|
#elif defined(__arm__) && !(__ARM_EABI__) // arm-oabi
|
||||||
|
// https://github.com/msgpack/msgpack-perl/pull/1
|
||||||
|
mem.i = (mem.i & 0xFFFFFFFFUL) << 32UL | (mem.i >> 32UL);
|
||||||
|
#endif
|
||||||
|
push_fixed_value(_double, mem.f); }
|
||||||
|
case MSGPACK_CS_UINT_8:
|
||||||
|
push_fixed_value(_uint8, *(uint8_t*)n);
|
||||||
|
case MSGPACK_CS_UINT_16:{
|
||||||
|
uint16_t tmp;
|
||||||
|
_msgpack_load16(uint16_t,n,&tmp);
|
||||||
|
push_fixed_value(_uint16, tmp);
|
||||||
|
}
|
||||||
|
case MSGPACK_CS_UINT_32:{
|
||||||
|
uint32_t tmp;
|
||||||
|
_msgpack_load32(uint32_t,n,&tmp);
|
||||||
|
push_fixed_value(_uint32, tmp);
|
||||||
|
}
|
||||||
|
case MSGPACK_CS_UINT_64:{
|
||||||
|
uint64_t tmp;
|
||||||
|
_msgpack_load64(uint64_t,n,&tmp);
|
||||||
|
push_fixed_value(_uint64, tmp);
|
||||||
|
}
|
||||||
|
case MSGPACK_CS_INT_8:
|
||||||
|
push_fixed_value(_int8, *(int8_t*)n);
|
||||||
|
case MSGPACK_CS_INT_16:{
|
||||||
|
int16_t tmp;
|
||||||
|
_msgpack_load16(int16_t,n,&tmp);
|
||||||
|
push_fixed_value(_int16, tmp);
|
||||||
|
}
|
||||||
|
case MSGPACK_CS_INT_32:{
|
||||||
|
int32_t tmp;
|
||||||
|
_msgpack_load32(int32_t,n,&tmp);
|
||||||
|
push_fixed_value(_int32, tmp);
|
||||||
|
}
|
||||||
|
case MSGPACK_CS_INT_64:{
|
||||||
|
int64_t tmp;
|
||||||
|
_msgpack_load64(int64_t,n,&tmp);
|
||||||
|
push_fixed_value(_int64, tmp);
|
||||||
|
}
|
||||||
|
case MSGPACK_CS_FIXEXT_1:
|
||||||
|
again_fixed_trail_if_zero(MSGPACK_ACS_EXT_VALUE, 1+1, _ext_zero);
|
||||||
|
case MSGPACK_CS_FIXEXT_2:
|
||||||
|
again_fixed_trail_if_zero(MSGPACK_ACS_EXT_VALUE, 2+1, _ext_zero);
|
||||||
|
case MSGPACK_CS_FIXEXT_4:
|
||||||
|
again_fixed_trail_if_zero(MSGPACK_ACS_EXT_VALUE, 4+1, _ext_zero);
|
||||||
|
case MSGPACK_CS_FIXEXT_8:
|
||||||
|
again_fixed_trail_if_zero(MSGPACK_ACS_EXT_VALUE, 8+1, _ext_zero);
|
||||||
|
case MSGPACK_CS_FIXEXT_16:
|
||||||
|
again_fixed_trail_if_zero(MSGPACK_ACS_EXT_VALUE, 16+1, _ext_zero);
|
||||||
|
case MSGPACK_CS_STR_8:
|
||||||
|
again_fixed_trail_if_zero(MSGPACK_ACS_STR_VALUE, *(uint8_t*)n, _str_zero);
|
||||||
|
case MSGPACK_CS_BIN_8:
|
||||||
|
again_fixed_trail_if_zero(MSGPACK_ACS_BIN_VALUE, *(uint8_t*)n, _bin_zero);
|
||||||
|
case MSGPACK_CS_EXT_8:
|
||||||
|
again_fixed_trail_if_zero(MSGPACK_ACS_EXT_VALUE, (*(uint8_t*)n) + 1, _ext_zero);
|
||||||
|
case MSGPACK_CS_STR_16:{
|
||||||
|
uint16_t tmp;
|
||||||
|
_msgpack_load16(uint16_t,n,&tmp);
|
||||||
|
again_fixed_trail_if_zero(MSGPACK_ACS_STR_VALUE, tmp, _str_zero);
|
||||||
|
}
|
||||||
|
case MSGPACK_CS_BIN_16:{
|
||||||
|
uint16_t tmp;
|
||||||
|
_msgpack_load16(uint16_t,n,&tmp);
|
||||||
|
again_fixed_trail_if_zero(MSGPACK_ACS_BIN_VALUE, tmp, _bin_zero);
|
||||||
|
}
|
||||||
|
case MSGPACK_CS_EXT_16:{
|
||||||
|
uint16_t tmp;
|
||||||
|
_msgpack_load16(uint16_t,n,&tmp);
|
||||||
|
again_fixed_trail_if_zero(MSGPACK_ACS_EXT_VALUE, tmp + 1, _ext_zero);
|
||||||
|
}
|
||||||
|
case MSGPACK_CS_STR_32:{
|
||||||
|
uint32_t tmp;
|
||||||
|
_msgpack_load32(uint32_t,n,&tmp);
|
||||||
|
again_fixed_trail_if_zero(MSGPACK_ACS_STR_VALUE, tmp, _str_zero);
|
||||||
|
}
|
||||||
|
case MSGPACK_CS_BIN_32:{
|
||||||
|
uint32_t tmp;
|
||||||
|
_msgpack_load32(uint32_t,n,&tmp);
|
||||||
|
again_fixed_trail_if_zero(MSGPACK_ACS_BIN_VALUE, tmp, _bin_zero);
|
||||||
|
}
|
||||||
|
case MSGPACK_CS_EXT_32:{
|
||||||
|
uint32_t tmp;
|
||||||
|
_msgpack_load32(uint32_t,n,&tmp);
|
||||||
|
again_fixed_trail_if_zero(MSGPACK_ACS_EXT_VALUE, tmp + 1, _ext_zero);
|
||||||
|
}
|
||||||
|
case MSGPACK_ACS_STR_VALUE:
|
||||||
|
_str_zero:
|
||||||
|
push_variable_value(_str, data, n, trail);
|
||||||
|
case MSGPACK_ACS_BIN_VALUE:
|
||||||
|
_bin_zero:
|
||||||
|
push_variable_value(_bin, data, n, trail);
|
||||||
|
case MSGPACK_ACS_EXT_VALUE:
|
||||||
|
_ext_zero:
|
||||||
|
push_variable_value(_ext, data, n, trail);
|
||||||
|
|
||||||
|
case MSGPACK_CS_ARRAY_16:{
|
||||||
|
uint16_t tmp;
|
||||||
|
_msgpack_load16(uint16_t,n,&tmp);
|
||||||
|
start_container(_array, tmp, MSGPACK_CT_ARRAY_ITEM);
|
||||||
|
}
|
||||||
|
case MSGPACK_CS_ARRAY_32:{
|
||||||
|
/* FIXME security guard */
|
||||||
|
uint32_t tmp;
|
||||||
|
_msgpack_load32(uint32_t,n,&tmp);
|
||||||
|
start_container(_array, tmp, MSGPACK_CT_ARRAY_ITEM);
|
||||||
|
}
|
||||||
|
|
||||||
|
case MSGPACK_CS_MAP_16:{
|
||||||
|
uint16_t tmp;
|
||||||
|
_msgpack_load16(uint16_t,n,&tmp);
|
||||||
|
start_container(_map, tmp, MSGPACK_CT_MAP_KEY);
|
||||||
|
}
|
||||||
|
case MSGPACK_CS_MAP_32:{
|
||||||
|
/* FIXME security guard */
|
||||||
|
uint32_t tmp;
|
||||||
|
_msgpack_load32(uint32_t,n,&tmp);
|
||||||
|
start_container(_map, tmp, MSGPACK_CT_MAP_KEY);
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
ret = MSGPACK_UNPACK_PARSE_ERROR;
|
||||||
|
goto _failed;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_push:
|
||||||
|
if(top == 0) { goto _finish; }
|
||||||
|
c = &stack[top-1];
|
||||||
|
switch(c->ct) {
|
||||||
|
case MSGPACK_CT_ARRAY_ITEM:
|
||||||
|
ret = msgpack_unpack_callback(_array_item)(user, &c->obj, obj); \
|
||||||
|
if(ret < 0) { goto _failed; }
|
||||||
|
if(--c->count == 0) {
|
||||||
|
obj = c->obj;
|
||||||
|
--top;
|
||||||
|
/*printf("stack pop %d\n", top);*/
|
||||||
|
goto _push;
|
||||||
|
}
|
||||||
|
goto _header_again;
|
||||||
|
case MSGPACK_CT_MAP_KEY:
|
||||||
|
c->map_key = obj;
|
||||||
|
c->ct = MSGPACK_CT_MAP_VALUE;
|
||||||
|
goto _header_again;
|
||||||
|
case MSGPACK_CT_MAP_VALUE:
|
||||||
|
ret = msgpack_unpack_callback(_map_item)(user, &c->obj, c->map_key, obj); \
|
||||||
|
if(ret < 0) { goto _failed; }
|
||||||
|
if(--c->count == 0) {
|
||||||
|
obj = c->obj;
|
||||||
|
--top;
|
||||||
|
/*printf("stack pop %d\n", top);*/
|
||||||
|
goto _push;
|
||||||
|
}
|
||||||
|
c->ct = MSGPACK_CT_MAP_KEY;
|
||||||
|
goto _header_again;
|
||||||
|
|
||||||
|
default:
|
||||||
|
ret = MSGPACK_UNPACK_PARSE_ERROR;
|
||||||
|
goto _failed;
|
||||||
|
}
|
||||||
|
|
||||||
|
_header_again:
|
||||||
|
cs = MSGPACK_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"); */
|
||||||
|
goto _end;
|
||||||
|
|
||||||
|
_out:
|
||||||
|
ret = 0;
|
||||||
|
goto _end;
|
||||||
|
|
||||||
|
_end:
|
||||||
|
ctx->cs = cs;
|
||||||
|
ctx->trail = trail;
|
||||||
|
ctx->top = top;
|
||||||
|
*off = (size_t)(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 SWITCH_RANGE_BEGIN
|
||||||
|
#undef SWITCH_RANGE
|
||||||
|
#undef SWITCH_RANGE_DEFAULT
|
||||||
|
#undef SWITCH_RANGE_END
|
||||||
15
include/msgpack/util.h
Normal file
15
include/msgpack/util.h
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
/*
|
||||||
|
* MessagePack for C utilities
|
||||||
|
*
|
||||||
|
* Copyright (C) 2014 FURUHASHI Sadayuki
|
||||||
|
*
|
||||||
|
* Distributed under the Boost Software License, Version 1.0.
|
||||||
|
* (See accompanying file LICENSE_1_0.txt or copy at
|
||||||
|
* http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
*/
|
||||||
|
#ifndef MSGPACK_UTIL_H
|
||||||
|
#define MSGPACK_UTIL_H
|
||||||
|
|
||||||
|
#define MSGPACK_UNUSED(a) (void)(a)
|
||||||
|
|
||||||
|
#endif /* MSGPACK_UTIL_H */
|
||||||
38
include/msgpack/version.h
Normal file
38
include/msgpack/version.h
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
/*
|
||||||
|
* MessagePack for C version information
|
||||||
|
*
|
||||||
|
* Copyright (C) 2008-2009 FURUHASHI Sadayuki
|
||||||
|
*
|
||||||
|
* Distributed under the Boost Software License, Version 1.0.
|
||||||
|
* (See accompanying file LICENSE_1_0.txt or copy at
|
||||||
|
* http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
*/
|
||||||
|
#ifndef MSGPACK_VERSION_H
|
||||||
|
#define MSGPACK_VERSION_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
MSGPACK_DLLEXPORT
|
||||||
|
const char* msgpack_version(void);
|
||||||
|
MSGPACK_DLLEXPORT
|
||||||
|
int msgpack_version_major(void);
|
||||||
|
MSGPACK_DLLEXPORT
|
||||||
|
int msgpack_version_minor(void);
|
||||||
|
MSGPACK_DLLEXPORT
|
||||||
|
int msgpack_version_revision(void);
|
||||||
|
|
||||||
|
#include "version_master.h"
|
||||||
|
|
||||||
|
#define MSGPACK_STR(v) #v
|
||||||
|
#define MSGPACK_VERSION_I(maj, min, rev) MSGPACK_STR(maj) "." MSGPACK_STR(min) "." MSGPACK_STR(rev)
|
||||||
|
|
||||||
|
#define MSGPACK_VERSION MSGPACK_VERSION_I(MSGPACK_VERSION_MAJOR, MSGPACK_VERSION_MINOR, MSGPACK_VERSION_REVISION)
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* msgpack/version.h */
|
||||||
|
|
||||||
3
include/msgpack/version_master.h
Normal file
3
include/msgpack/version_master.h
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#define MSGPACK_VERSION_MAJOR 6
|
||||||
|
#define MSGPACK_VERSION_MINOR 0
|
||||||
|
#define MSGPACK_VERSION_REVISION 0
|
||||||
146
include/msgpack/vrefbuffer.h
Normal file
146
include/msgpack/vrefbuffer.h
Normal file
@@ -0,0 +1,146 @@
|
|||||||
|
/*
|
||||||
|
* MessagePack for C zero-copy buffer implementation
|
||||||
|
*
|
||||||
|
* Copyright (C) 2008-2009 FURUHASHI Sadayuki
|
||||||
|
*
|
||||||
|
* Distributed under the Boost Software License, Version 1.0.
|
||||||
|
* (See accompanying file LICENSE_1_0.txt or copy at
|
||||||
|
* http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
*/
|
||||||
|
#ifndef MSGPACK_VREFBUFFER_H
|
||||||
|
#define MSGPACK_VREFBUFFER_H
|
||||||
|
|
||||||
|
#include "zone.h"
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
|
#if defined(unix) || defined(__unix) || defined(__linux__) || defined(__APPLE__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__QNX__) || defined(__QNXTO__) || defined(__HAIKU__)
|
||||||
|
#include <sys/uio.h>
|
||||||
|
typedef struct iovec msgpack_iovec;
|
||||||
|
#else
|
||||||
|
struct msgpack_iovec {
|
||||||
|
void *iov_base;
|
||||||
|
size_t iov_len;
|
||||||
|
};
|
||||||
|
typedef struct msgpack_iovec msgpack_iovec;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup msgpack_vrefbuffer Vectored Referencing buffer
|
||||||
|
* @ingroup msgpack_buffer
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
struct msgpack_vrefbuffer_chunk;
|
||||||
|
typedef struct msgpack_vrefbuffer_chunk msgpack_vrefbuffer_chunk;
|
||||||
|
|
||||||
|
typedef struct msgpack_vrefbuffer_inner_buffer {
|
||||||
|
size_t free;
|
||||||
|
char* ptr;
|
||||||
|
msgpack_vrefbuffer_chunk* head;
|
||||||
|
} msgpack_vrefbuffer_inner_buffer;
|
||||||
|
|
||||||
|
typedef struct msgpack_vrefbuffer {
|
||||||
|
msgpack_iovec* tail;
|
||||||
|
msgpack_iovec* end;
|
||||||
|
msgpack_iovec* array;
|
||||||
|
|
||||||
|
size_t chunk_size;
|
||||||
|
size_t ref_size;
|
||||||
|
|
||||||
|
msgpack_vrefbuffer_inner_buffer inner_buffer;
|
||||||
|
} msgpack_vrefbuffer;
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef MSGPACK_VREFBUFFER_REF_SIZE
|
||||||
|
#define MSGPACK_VREFBUFFER_REF_SIZE 32
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef MSGPACK_VREFBUFFER_CHUNK_SIZE
|
||||||
|
#define MSGPACK_VREFBUFFER_CHUNK_SIZE 8192
|
||||||
|
#endif
|
||||||
|
|
||||||
|
MSGPACK_DLLEXPORT
|
||||||
|
bool msgpack_vrefbuffer_init(msgpack_vrefbuffer* vbuf,
|
||||||
|
size_t ref_size, size_t chunk_size);
|
||||||
|
MSGPACK_DLLEXPORT
|
||||||
|
void msgpack_vrefbuffer_destroy(msgpack_vrefbuffer* vbuf);
|
||||||
|
|
||||||
|
static inline msgpack_vrefbuffer* msgpack_vrefbuffer_new(size_t ref_size, size_t chunk_size);
|
||||||
|
static inline void msgpack_vrefbuffer_free(msgpack_vrefbuffer* vbuf);
|
||||||
|
|
||||||
|
static inline int msgpack_vrefbuffer_write(void* data, const char* buf, size_t len);
|
||||||
|
|
||||||
|
static inline const msgpack_iovec* msgpack_vrefbuffer_vec(const msgpack_vrefbuffer* vref);
|
||||||
|
static inline size_t msgpack_vrefbuffer_veclen(const msgpack_vrefbuffer* vref);
|
||||||
|
|
||||||
|
MSGPACK_DLLEXPORT
|
||||||
|
int msgpack_vrefbuffer_append_copy(msgpack_vrefbuffer* vbuf,
|
||||||
|
const char* buf, size_t len);
|
||||||
|
|
||||||
|
MSGPACK_DLLEXPORT
|
||||||
|
int msgpack_vrefbuffer_append_ref(msgpack_vrefbuffer* vbuf,
|
||||||
|
const char* buf, size_t len);
|
||||||
|
|
||||||
|
MSGPACK_DLLEXPORT
|
||||||
|
int msgpack_vrefbuffer_migrate(msgpack_vrefbuffer* vbuf, msgpack_vrefbuffer* to);
|
||||||
|
|
||||||
|
MSGPACK_DLLEXPORT
|
||||||
|
void msgpack_vrefbuffer_clear(msgpack_vrefbuffer* vref);
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
|
||||||
|
static inline msgpack_vrefbuffer* msgpack_vrefbuffer_new(size_t ref_size, size_t chunk_size)
|
||||||
|
{
|
||||||
|
msgpack_vrefbuffer* vbuf = (msgpack_vrefbuffer*)malloc(sizeof(msgpack_vrefbuffer));
|
||||||
|
if (vbuf == NULL) return NULL;
|
||||||
|
if(!msgpack_vrefbuffer_init(vbuf, ref_size, chunk_size)) {
|
||||||
|
free(vbuf);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return vbuf;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void msgpack_vrefbuffer_free(msgpack_vrefbuffer* vbuf)
|
||||||
|
{
|
||||||
|
if(vbuf == NULL) { return; }
|
||||||
|
msgpack_vrefbuffer_destroy(vbuf);
|
||||||
|
free(vbuf);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int msgpack_vrefbuffer_write(void* data, const char* buf, size_t len)
|
||||||
|
{
|
||||||
|
msgpack_vrefbuffer* vbuf = (msgpack_vrefbuffer*)data;
|
||||||
|
assert(buf || len == 0);
|
||||||
|
|
||||||
|
if(!buf) return 0;
|
||||||
|
|
||||||
|
if(len < vbuf->ref_size) {
|
||||||
|
return msgpack_vrefbuffer_append_copy(vbuf, buf, len);
|
||||||
|
} else {
|
||||||
|
return msgpack_vrefbuffer_append_ref(vbuf, buf, len);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline const msgpack_iovec* msgpack_vrefbuffer_vec(const msgpack_vrefbuffer* vref)
|
||||||
|
{
|
||||||
|
return vref->array;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline size_t msgpack_vrefbuffer_veclen(const msgpack_vrefbuffer* vref)
|
||||||
|
{
|
||||||
|
return (size_t)(vref->tail - vref->array);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* msgpack/vrefbuffer.h */
|
||||||
205
include/msgpack/zbuffer.h
Normal file
205
include/msgpack/zbuffer.h
Normal file
@@ -0,0 +1,205 @@
|
|||||||
|
/*
|
||||||
|
* MessagePack for C deflate buffer implementation
|
||||||
|
*
|
||||||
|
* Copyright (C) 2010 FURUHASHI Sadayuki
|
||||||
|
*
|
||||||
|
* Distributed under the Boost Software License, Version 1.0.
|
||||||
|
* (See accompanying file LICENSE_1_0.txt or copy at
|
||||||
|
* http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
*/
|
||||||
|
#ifndef MSGPACK_ZBUFFER_H
|
||||||
|
#define MSGPACK_ZBUFFER_H
|
||||||
|
|
||||||
|
#include "sysdep.h"
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <assert.h>
|
||||||
|
#include <zlib.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup msgpack_zbuffer Compressed buffer
|
||||||
|
* @ingroup msgpack_buffer
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef struct msgpack_zbuffer {
|
||||||
|
z_stream stream;
|
||||||
|
char* data;
|
||||||
|
size_t init_size;
|
||||||
|
} msgpack_zbuffer;
|
||||||
|
|
||||||
|
#ifndef MSGPACK_ZBUFFER_INIT_SIZE
|
||||||
|
#define MSGPACK_ZBUFFER_INIT_SIZE 8192
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static inline bool msgpack_zbuffer_init(
|
||||||
|
msgpack_zbuffer* zbuf, int level, size_t init_size);
|
||||||
|
static inline void msgpack_zbuffer_destroy(msgpack_zbuffer* zbuf);
|
||||||
|
|
||||||
|
static inline msgpack_zbuffer* msgpack_zbuffer_new(int level, size_t init_size);
|
||||||
|
static inline void msgpack_zbuffer_free(msgpack_zbuffer* zbuf);
|
||||||
|
|
||||||
|
static inline char* msgpack_zbuffer_flush(msgpack_zbuffer* zbuf);
|
||||||
|
|
||||||
|
static inline const char* msgpack_zbuffer_data(const msgpack_zbuffer* zbuf);
|
||||||
|
static inline size_t msgpack_zbuffer_size(const msgpack_zbuffer* zbuf);
|
||||||
|
|
||||||
|
static inline bool msgpack_zbuffer_reset(msgpack_zbuffer* zbuf);
|
||||||
|
static inline void msgpack_zbuffer_reset_buffer(msgpack_zbuffer* zbuf);
|
||||||
|
static inline char* msgpack_zbuffer_release_buffer(msgpack_zbuffer* zbuf);
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef MSGPACK_ZBUFFER_RESERVE_SIZE
|
||||||
|
#define MSGPACK_ZBUFFER_RESERVE_SIZE 512
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static inline int msgpack_zbuffer_write(void* data, const char* buf, size_t len);
|
||||||
|
|
||||||
|
static inline bool msgpack_zbuffer_expand(msgpack_zbuffer* zbuf);
|
||||||
|
|
||||||
|
|
||||||
|
static inline bool msgpack_zbuffer_init(msgpack_zbuffer* zbuf,
|
||||||
|
int level, size_t init_size)
|
||||||
|
{
|
||||||
|
memset(zbuf, 0, sizeof(msgpack_zbuffer));
|
||||||
|
zbuf->init_size = init_size;
|
||||||
|
if(deflateInit(&zbuf->stream, level) != Z_OK) {
|
||||||
|
free(zbuf->data);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void msgpack_zbuffer_destroy(msgpack_zbuffer* zbuf)
|
||||||
|
{
|
||||||
|
deflateEnd(&zbuf->stream);
|
||||||
|
free(zbuf->data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline msgpack_zbuffer* msgpack_zbuffer_new(int level, size_t init_size)
|
||||||
|
{
|
||||||
|
msgpack_zbuffer* zbuf = (msgpack_zbuffer*)malloc(sizeof(msgpack_zbuffer));
|
||||||
|
if (zbuf == NULL) return NULL;
|
||||||
|
if(!msgpack_zbuffer_init(zbuf, level, init_size)) {
|
||||||
|
free(zbuf);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return zbuf;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void msgpack_zbuffer_free(msgpack_zbuffer* zbuf)
|
||||||
|
{
|
||||||
|
if(zbuf == NULL) { return; }
|
||||||
|
msgpack_zbuffer_destroy(zbuf);
|
||||||
|
free(zbuf);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline bool msgpack_zbuffer_expand(msgpack_zbuffer* zbuf)
|
||||||
|
{
|
||||||
|
size_t used = (size_t)((char *)(zbuf->stream.next_out) - zbuf->data);
|
||||||
|
size_t csize = used + zbuf->stream.avail_out;
|
||||||
|
|
||||||
|
size_t nsize = (csize == 0) ? zbuf->init_size : csize * 2;
|
||||||
|
|
||||||
|
char* tmp = (char*)realloc(zbuf->data, nsize);
|
||||||
|
if(tmp == NULL) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
zbuf->data = tmp;
|
||||||
|
zbuf->stream.next_out = (Bytef*)(tmp + used);
|
||||||
|
zbuf->stream.avail_out = (uInt)(nsize - used);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int msgpack_zbuffer_write(void* data, const char* buf, size_t len)
|
||||||
|
{
|
||||||
|
msgpack_zbuffer* zbuf = (msgpack_zbuffer*)data;
|
||||||
|
|
||||||
|
assert(buf || len == 0);
|
||||||
|
if(!buf) return 0;
|
||||||
|
|
||||||
|
zbuf->stream.next_in = (Bytef*)buf;
|
||||||
|
zbuf->stream.avail_in = (uInt)len;
|
||||||
|
|
||||||
|
while(zbuf->stream.avail_in > 0) {
|
||||||
|
if(zbuf->stream.avail_out < MSGPACK_ZBUFFER_RESERVE_SIZE) {
|
||||||
|
if(!msgpack_zbuffer_expand(zbuf)) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(deflate(&zbuf->stream, Z_NO_FLUSH) != Z_OK) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline char* msgpack_zbuffer_flush(msgpack_zbuffer* zbuf)
|
||||||
|
{
|
||||||
|
while(true) {
|
||||||
|
switch(deflate(&zbuf->stream, Z_FINISH)) {
|
||||||
|
case Z_STREAM_END:
|
||||||
|
return zbuf->data;
|
||||||
|
case Z_OK:
|
||||||
|
case Z_BUF_ERROR:
|
||||||
|
if(!msgpack_zbuffer_expand(zbuf)) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline const char* msgpack_zbuffer_data(const msgpack_zbuffer* zbuf)
|
||||||
|
{
|
||||||
|
return zbuf->data;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline size_t msgpack_zbuffer_size(const msgpack_zbuffer* zbuf)
|
||||||
|
{
|
||||||
|
return (size_t)((char *)(zbuf->stream.next_out) - zbuf->data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void msgpack_zbuffer_reset_buffer(msgpack_zbuffer* zbuf)
|
||||||
|
{
|
||||||
|
zbuf->stream.avail_out += (uInt)((char*)zbuf->stream.next_out - zbuf->data);
|
||||||
|
zbuf->stream.next_out = (Bytef*)zbuf->data;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline bool msgpack_zbuffer_reset(msgpack_zbuffer* zbuf)
|
||||||
|
{
|
||||||
|
if(deflateReset(&zbuf->stream) != Z_OK) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
msgpack_zbuffer_reset_buffer(zbuf);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline char* msgpack_zbuffer_release_buffer(msgpack_zbuffer* zbuf)
|
||||||
|
{
|
||||||
|
char* tmp = zbuf->data;
|
||||||
|
zbuf->data = NULL;
|
||||||
|
zbuf->stream.next_out = NULL;
|
||||||
|
zbuf->stream.avail_out = 0;
|
||||||
|
return tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* msgpack/zbuffer.h */
|
||||||
163
include/msgpack/zone.h
Normal file
163
include/msgpack/zone.h
Normal file
@@ -0,0 +1,163 @@
|
|||||||
|
/*
|
||||||
|
* MessagePack for C memory pool implementation
|
||||||
|
*
|
||||||
|
* Copyright (C) 2008-2010 FURUHASHI Sadayuki
|
||||||
|
*
|
||||||
|
* Distributed under the Boost Software License, Version 1.0.
|
||||||
|
* (See accompanying file LICENSE_1_0.txt or copy at
|
||||||
|
* http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
*/
|
||||||
|
#ifndef MSGPACK_ZONE_H
|
||||||
|
#define MSGPACK_ZONE_H
|
||||||
|
|
||||||
|
#include "sysdep.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup msgpack_zone Memory zone
|
||||||
|
* @ingroup msgpack
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef struct msgpack_zone_finalizer {
|
||||||
|
void (*func)(void* data);
|
||||||
|
void* data;
|
||||||
|
} msgpack_zone_finalizer;
|
||||||
|
|
||||||
|
typedef struct msgpack_zone_finalizer_array {
|
||||||
|
msgpack_zone_finalizer* tail;
|
||||||
|
msgpack_zone_finalizer* end;
|
||||||
|
msgpack_zone_finalizer* array;
|
||||||
|
} msgpack_zone_finalizer_array;
|
||||||
|
|
||||||
|
struct msgpack_zone_chunk;
|
||||||
|
typedef struct msgpack_zone_chunk msgpack_zone_chunk;
|
||||||
|
|
||||||
|
typedef struct msgpack_zone_chunk_list {
|
||||||
|
size_t free;
|
||||||
|
char* ptr;
|
||||||
|
msgpack_zone_chunk* head;
|
||||||
|
} msgpack_zone_chunk_list;
|
||||||
|
|
||||||
|
typedef struct msgpack_zone {
|
||||||
|
msgpack_zone_chunk_list chunk_list;
|
||||||
|
msgpack_zone_finalizer_array finalizer_array;
|
||||||
|
size_t chunk_size;
|
||||||
|
} msgpack_zone;
|
||||||
|
|
||||||
|
#ifndef MSGPACK_ZONE_CHUNK_SIZE
|
||||||
|
#define MSGPACK_ZONE_CHUNK_SIZE 8192
|
||||||
|
#endif
|
||||||
|
|
||||||
|
MSGPACK_DLLEXPORT
|
||||||
|
bool msgpack_zone_init(msgpack_zone* zone, size_t chunk_size);
|
||||||
|
MSGPACK_DLLEXPORT
|
||||||
|
void msgpack_zone_destroy(msgpack_zone* zone);
|
||||||
|
|
||||||
|
MSGPACK_DLLEXPORT
|
||||||
|
msgpack_zone* msgpack_zone_new(size_t chunk_size);
|
||||||
|
MSGPACK_DLLEXPORT
|
||||||
|
void msgpack_zone_free(msgpack_zone* zone);
|
||||||
|
|
||||||
|
static inline void* msgpack_zone_malloc(msgpack_zone* zone, size_t size);
|
||||||
|
static inline void* msgpack_zone_malloc_no_align(msgpack_zone* zone, size_t size);
|
||||||
|
|
||||||
|
static inline bool msgpack_zone_push_finalizer(msgpack_zone* zone,
|
||||||
|
void (*func)(void* data), void* data);
|
||||||
|
|
||||||
|
static inline void msgpack_zone_swap(msgpack_zone* a, msgpack_zone* b);
|
||||||
|
|
||||||
|
MSGPACK_DLLEXPORT
|
||||||
|
bool msgpack_zone_is_empty(msgpack_zone* zone);
|
||||||
|
|
||||||
|
MSGPACK_DLLEXPORT
|
||||||
|
void msgpack_zone_clear(msgpack_zone* zone);
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef MSGPACK_ZONE_ALIGN
|
||||||
|
#define MSGPACK_ZONE_ALIGN sizeof(void*)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
MSGPACK_DLLEXPORT
|
||||||
|
void* msgpack_zone_malloc_expand(msgpack_zone* zone, size_t size);
|
||||||
|
|
||||||
|
static inline void* msgpack_zone_malloc_no_align(msgpack_zone* zone, size_t size)
|
||||||
|
{
|
||||||
|
char* ptr;
|
||||||
|
msgpack_zone_chunk_list* cl = &zone->chunk_list;
|
||||||
|
|
||||||
|
if(zone->chunk_list.free < size) {
|
||||||
|
return msgpack_zone_malloc_expand(zone, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
ptr = cl->ptr;
|
||||||
|
cl->free -= size;
|
||||||
|
cl->ptr += size;
|
||||||
|
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void* msgpack_zone_malloc(msgpack_zone* zone, size_t size)
|
||||||
|
{
|
||||||
|
char* aligned =
|
||||||
|
(char*)(
|
||||||
|
(uintptr_t)(
|
||||||
|
zone->chunk_list.ptr + (MSGPACK_ZONE_ALIGN - 1)
|
||||||
|
) & ~(uintptr_t)(MSGPACK_ZONE_ALIGN - 1)
|
||||||
|
);
|
||||||
|
size_t adjusted_size = size + (size_t)(aligned - zone->chunk_list.ptr);
|
||||||
|
if(zone->chunk_list.free >= adjusted_size) {
|
||||||
|
zone->chunk_list.free -= adjusted_size;
|
||||||
|
zone->chunk_list.ptr += adjusted_size;
|
||||||
|
return aligned;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
void* ptr = msgpack_zone_malloc_expand(zone, size + (MSGPACK_ZONE_ALIGN - 1));
|
||||||
|
if (ptr) {
|
||||||
|
return (char*)((uintptr_t)(ptr) & ~(uintptr_t)(MSGPACK_ZONE_ALIGN - 1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool msgpack_zone_push_finalizer_expand(msgpack_zone* zone,
|
||||||
|
void (*func)(void* data), void* data);
|
||||||
|
|
||||||
|
static inline bool msgpack_zone_push_finalizer(msgpack_zone* zone,
|
||||||
|
void (*func)(void* data), void* data)
|
||||||
|
{
|
||||||
|
msgpack_zone_finalizer_array* const fa = &zone->finalizer_array;
|
||||||
|
msgpack_zone_finalizer* fin = fa->tail;
|
||||||
|
|
||||||
|
if(fin == fa->end) {
|
||||||
|
return msgpack_zone_push_finalizer_expand(zone, func, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
fin->func = func;
|
||||||
|
fin->data = data;
|
||||||
|
|
||||||
|
++fa->tail;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void msgpack_zone_swap(msgpack_zone* a, msgpack_zone* b)
|
||||||
|
{
|
||||||
|
msgpack_zone tmp = *a;
|
||||||
|
*a = *b;
|
||||||
|
*b = tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* msgpack/zone.h */
|
||||||
39
makedist.sh
Executable file
39
makedist.sh
Executable file
@@ -0,0 +1,39 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
ver=`cat include/msgpack/version_master.h | tr -d "\n" | sed -e 's/#define MSGPACK_VERSION_MAJOR[[:space:]]*\([[:alnum:]]*\)/\1./g' -e 's/#define MSGPACK_VERSION_MINOR[[:space:]]*\([[:alnum:]]*\)/\1./g' -e 's/#define MSGPACK_VERSION_REVISION[[:space:]]*\([[:alnum:]]*\)/\1/g'`
|
||||||
|
|
||||||
|
prefix=msgpack-c-$ver
|
||||||
|
filename=$prefix.tar
|
||||||
|
|
||||||
|
ln -s . $prefix
|
||||||
|
|
||||||
|
test -f AUTHORS || touch AUTHORS
|
||||||
|
test -f COPYING || touch COPYING
|
||||||
|
test -f ChangeLog || cp -f CHANGELOG.md ChangeLog
|
||||||
|
test -f NEWS || touch NEWS
|
||||||
|
test -f NOTICE || touch NOTICE
|
||||||
|
test -f README || cp -f README.md README
|
||||||
|
|
||||||
|
tar cf $filename $prefix/example
|
||||||
|
tar --append --file=$filename $prefix/test
|
||||||
|
tar --append --file=$filename $prefix/include
|
||||||
|
tar --append --file=$filename $prefix/src
|
||||||
|
tar --append --file=$filename $prefix/cmake
|
||||||
|
|
||||||
|
tar --append --file=$filename $prefix/CMakeLists.txt
|
||||||
|
tar --append --file=$filename $prefix/Files.cmake
|
||||||
|
tar --append --file=$filename $prefix/NOTICE
|
||||||
|
tar --append --file=$filename $prefix/Doxyfile
|
||||||
|
tar --append --file=$filename $prefix/msgpack-c.pc.in
|
||||||
|
tar --append --file=$filename $prefix/AUTHORS
|
||||||
|
tar --append --file=$filename $prefix/README.md
|
||||||
|
tar --append --file=$filename $prefix/LICENSE_1_0.txt
|
||||||
|
tar --append --file=$filename $prefix/ChangeLog
|
||||||
|
tar --append --file=$filename $prefix/NEWS
|
||||||
|
tar --append --file=$filename $prefix/COPYING
|
||||||
|
tar --append --file=$filename $prefix/README
|
||||||
|
tar --append --file=$filename $prefix/msgpack-c-config.cmake.in
|
||||||
|
|
||||||
|
rm -f $prefix
|
||||||
|
|
||||||
|
gzip -f $filename
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user