mirror of
https://github.com/open-source-parsers/jsoncpp.git
synced 2025-10-15 15:16:47 +02:00
Compare commits
341 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
645250b669 | ||
![]() |
25c57812e2 | ||
![]() |
9ef812a097 | ||
![]() |
60ba071aac | ||
![]() |
3c32dca892 | ||
![]() |
7924d3ff97 | ||
![]() |
95b3092ce4 | ||
![]() |
f8db40ff83 | ||
![]() |
44bc38f0a1 | ||
![]() |
ddc9e0fcd7 | ||
![]() |
879a5b80ce | ||
![]() |
dc170e30e2 | ||
![]() |
d148e28b9b | ||
![]() |
bcc0472621 | ||
![]() |
c4d1cb1cd1 | ||
![]() |
336c300ca4 | ||
![]() |
400ec89811 | ||
![]() |
181f9eb129 | ||
![]() |
13afd0e455 | ||
![]() |
caa2f3bf42 | ||
![]() |
fdcd2fc232 | ||
![]() |
92cc77392e | ||
![]() |
7e69f15a64 | ||
![]() |
8e01024ce3 | ||
![]() |
6d236e1948 | ||
![]() |
d81a3caece | ||
![]() |
2939d85b84 | ||
![]() |
9725530a4f | ||
![]() |
576b271a04 | ||
![]() |
9d6db96f36 | ||
![]() |
46d35659ef | ||
![]() |
29434414d7 | ||
![]() |
3247202676 | ||
![]() |
0e3b22dd3a | ||
![]() |
786851819e | ||
![]() |
629a727b5f | ||
![]() |
c51d718ead | ||
![]() |
7c7ccbf934 | ||
![]() |
b7feb2d493 | ||
![]() |
5510f14a71 | ||
![]() |
d34479ec34 | ||
![]() |
dd6921f479 | ||
![]() |
101d4797db | ||
![]() |
2690bc9a9a | ||
![]() |
c84f2e19c9 | ||
![]() |
408b466b57 | ||
![]() |
2a3ae0e79f | ||
![]() |
2d211de06e | ||
![]() |
18e51e23fd | ||
![]() |
56c41fbd88 | ||
![]() |
4babd12a25 | ||
![]() |
6935317d84 | ||
![]() |
d5bd1a7716 | ||
![]() |
f7182a0fdc | ||
![]() |
be4dc51c1f | ||
![]() |
12461e5bf1 | ||
![]() |
185dfd592d | ||
![]() |
518875d2ea | ||
![]() |
3e4c8f8f1d | ||
![]() |
83cc92161b | ||
![]() |
85f5b1c8f9 | ||
![]() |
1234f4227b | ||
![]() |
8d2095af3c | ||
![]() |
0155f38b5b | ||
![]() |
5b91551f39 | ||
![]() |
27290cf81d | ||
![]() |
27b9501683 | ||
![]() |
b16abf8ce1 | ||
![]() |
cd1121290a | ||
![]() |
69402d1fbb | ||
![]() |
3e2f8d3ea8 | ||
![]() |
99a99d4032 | ||
![]() |
9a629bc5e1 | ||
![]() |
d76fe5687d | ||
![]() |
eb7bd9546e | ||
![]() |
0adb053294 | ||
![]() |
863aa36165 | ||
![]() |
9a55d22d3d | ||
![]() |
00558b38db | ||
![]() |
433107f1d9 | ||
![]() |
a732207060 | ||
![]() |
36d8cfd768 | ||
![]() |
2ab1d63480 | ||
![]() |
b4ca2db5ff | ||
![]() |
0c1cc6e1a3 | ||
![]() |
d85d75045c | ||
![]() |
2b593a9da8 | ||
![]() |
756a08fbbd | ||
![]() |
2c257590a1 | ||
![]() |
deb6cca214 | ||
![]() |
b9ed29a221 | ||
![]() |
1c2ed7a10f | ||
![]() |
6e7cbf8f54 | ||
![]() |
dc4a7f9b61 | ||
![]() |
21a4185634 | ||
![]() |
d11732043a | ||
![]() |
e3e05c7085 | ||
![]() |
e817e4fc25 | ||
![]() |
b5093e8122 | ||
![]() |
1fc3de7ca1 | ||
![]() |
cbeed7b076 | ||
![]() |
3beadff472 | ||
![]() |
d3d2e17b64 | ||
![]() |
908383abeb | ||
![]() |
fdc0824505 | ||
![]() |
4e8b4e313f | ||
![]() |
31d65711d6 | ||
![]() |
2853b1cdac | ||
![]() |
8b31c6f0fd | ||
![]() |
a3c8e86c0b | ||
![]() |
10a1a38b37 | ||
![]() |
fa61a49b83 | ||
![]() |
f8ad1ab352 | ||
![]() |
056850c44b | ||
![]() |
009a3ad24c | ||
![]() |
7d16e10113 | ||
![]() |
d8723104f3 | ||
![]() |
08ddeed927 | ||
![]() |
97e05c41f2 | ||
![]() |
b3b92df879 | ||
![]() |
892a386018 | ||
![]() |
0417e626c0 | ||
![]() |
2cb1ad5d0c | ||
![]() |
4bfa962967 | ||
![]() |
e50bfefef1 | ||
![]() |
5c8e539af4 | ||
![]() |
ccd077ffce | ||
![]() |
4abf4ec208 | ||
![]() |
9026a16ff5 | ||
![]() |
f64244ed3f | ||
![]() |
6219eae304 | ||
![]() |
b955e0f699 | ||
![]() |
d501fbe741 | ||
![]() |
ec4251b728 | ||
![]() |
a72266d00b | ||
![]() |
010a2d04d3 | ||
![]() |
2baad4923e | ||
![]() |
e32ee4717c | ||
![]() |
80bc776bae | ||
![]() |
da498591fc | ||
![]() |
745287275c | ||
![]() |
c00a3b95c2 | ||
![]() |
c59db80002 | ||
![]() |
473afca1e3 | ||
![]() |
59d41de5b1 | ||
![]() |
b87f6dbc8a | ||
![]() |
ee34ac1fbb | ||
![]() |
d31a5300e1 | ||
![]() |
86789e7c2f | ||
![]() |
c4103ab390 | ||
![]() |
a5d7c714b1 | ||
![]() |
84ca7d6f0b | ||
![]() |
fc20134c92 | ||
![]() |
091e03979d | ||
![]() |
a7d0ffc717 | ||
![]() |
48112c8b62 | ||
![]() |
c8bb600d27 | ||
![]() |
85a263e89f | ||
![]() |
cfab607c0d | ||
![]() |
b5e1fe89aa | ||
![]() |
abd39e791b | ||
![]() |
768e31fc68 | ||
![]() |
aa1b383666 | ||
![]() |
8bf20bdc35 | ||
![]() |
0ba5c435f4 | ||
![]() |
fdcc2e4428 | ||
![]() |
9ebfc8d37b | ||
![]() |
4cec95a2e7 | ||
![]() |
cf73619e28 | ||
![]() |
ded953e0a6 | ||
![]() |
0a62267fe4 | ||
![]() |
2cc9b24f0d | ||
![]() |
6e5e9be736 | ||
![]() |
4050143288 | ||
![]() |
3f0d91f08a | ||
![]() |
02211117f1 | ||
![]() |
323450eafc | ||
![]() |
af17fecd29 | ||
![]() |
ffc62d26f3 | ||
![]() |
a07fc53287 | ||
![]() |
af2598cdd3 | ||
![]() |
1d95628ba8 | ||
![]() |
3e2b8ea9cc | ||
![]() |
1ab310e3ed | ||
![]() |
c7728e8658 | ||
![]() |
313a0e4c34 | ||
![]() |
592d942b3b | ||
![]() |
5b45aa55ca | ||
![]() |
07a324fb14 | ||
![]() |
1ec85c76a4 | ||
![]() |
c27936e0aa | ||
![]() |
04abe38148 | ||
![]() |
edb4bdb7ec | ||
![]() |
0ced843c97 | ||
![]() |
9b569c8ce3 | ||
![]() |
392e3a5b49 | ||
![]() |
c69148c946 | ||
![]() |
2f227cb122 | ||
![]() |
798f6ba055 | ||
![]() |
72f6cc7fd0 | ||
![]() |
d3ce75c74e | ||
![]() |
de5fb8e022 | ||
![]() |
899894f0f5 | ||
![]() |
ddabf50f72 | ||
![]() |
63ab03ca28 | ||
![]() |
41ff85f443 | ||
![]() |
9079422ac1 | ||
![]() |
c39aa295e4 | ||
![]() |
42ca02b833 | ||
![]() |
e6a588a246 | ||
![]() |
7c979e8661 | ||
![]() |
c469326b47 | ||
![]() |
240c85a10c | ||
![]() |
d61cddedac | ||
![]() |
5a2dc7a2ad | ||
![]() |
a06b390187 | ||
![]() |
42a161fc80 | ||
![]() |
a3a4059367 | ||
![]() |
4d587638af | ||
![]() |
75e0c39393 | ||
![]() |
43fd41d1fc | ||
![]() |
7287065b63 | ||
![]() |
9249878229 | ||
![]() |
17c14e73a9 | ||
![]() |
21e133c6fb | ||
![]() |
ff6b449a07 | ||
![]() |
f2f19b03fb | ||
![]() |
026c39fa1a | ||
![]() |
614671d09b | ||
![]() |
132840aaa1 | ||
![]() |
9bb984a594 | ||
![]() |
66d4573206 | ||
![]() |
b29fc9834f | ||
![]() |
1a54511aa1 | ||
![]() |
a7ad98fb82 | ||
![]() |
692164d471 | ||
![]() |
c95a841fef | ||
![]() |
e895eccd18 | ||
![]() |
3b5f8bef41 | ||
![]() |
c89f0282d1 | ||
![]() |
1b68b02ccd | ||
![]() |
adb9ab1424 | ||
![]() |
49da91c786 | ||
![]() |
e8378d1e74 | ||
![]() |
2de18021fc | ||
![]() |
c98e1d85e3 | ||
![]() |
d830c0ab94 | ||
![]() |
90591c70cd | ||
![]() |
4cfae897c0 | ||
![]() |
f4ec601fd3 | ||
![]() |
d40f26d472 | ||
![]() |
c668af9d41 | ||
![]() |
13b5ed7287 | ||
![]() |
6d31cec7cf | ||
![]() |
5331d295aa | ||
![]() |
004270db37 | ||
![]() |
9006194139 | ||
![]() |
6062f9b848 | ||
![]() |
ef16a35328 | ||
![]() |
7354da8077 | ||
![]() |
6a15ca6442 | ||
![]() |
9a048e5766 | ||
![]() |
59e4d35339 | ||
![]() |
f26edb05e5 | ||
![]() |
cadb6dd9a6 | ||
![]() |
ea9f0cec30 | ||
![]() |
ffdcc9355d | ||
![]() |
f45c01a46e | ||
![]() |
3c2069fdd1 | ||
![]() |
414b179d86 | ||
![]() |
0ba8bd73f5 | ||
![]() |
23c44d9f9e | ||
![]() |
8996c377aa | ||
![]() |
a679dde58d | ||
![]() |
c21b4bbfdb | ||
![]() |
d14d8c35c3 | ||
![]() |
ed258de63d | ||
![]() |
154652ee7a | ||
![]() |
4a9d77bcf7 | ||
![]() |
56efb6ba83 | ||
![]() |
7f9cc2705c | ||
![]() |
d7347a2623 | ||
![]() |
2e319850d1 | ||
![]() |
a3d35d7fb8 | ||
![]() |
19fc55f408 | ||
![]() |
acf74290f1 | ||
![]() |
746ef154f1 | ||
![]() |
559b4416e6 | ||
![]() |
6ca374371e | ||
![]() |
f7df408a6a | ||
![]() |
86ed860c4b | ||
![]() |
c442fd96e6 | ||
![]() |
c68443f3a0 | ||
![]() |
11c48d0047 | ||
![]() |
264c3edca7 | ||
![]() |
a47fc398ef | ||
![]() |
2f178f390f | ||
![]() |
f251f15e6a | ||
![]() |
60bfcf1715 | ||
![]() |
81065748e3 | ||
![]() |
11836ae9aa | ||
![]() |
e25fb5384a | ||
![]() |
f700fe4559 | ||
![]() |
d167a09b1c | ||
![]() |
ba158fd22d | ||
![]() |
f3a4941590 | ||
![]() |
0d25d9aebf | ||
![]() |
5021e799dc | ||
![]() |
762ad0fe9d | ||
![]() |
d6e666f573 | ||
![]() |
2ecd2a59de | ||
![]() |
a691cb19de | ||
![]() |
ee7935986e | ||
![]() |
b4abc8241f | ||
![]() |
12e9ef32f9 | ||
![]() |
77632b2611 | ||
![]() |
89aa87bd24 | ||
![]() |
34fc0020c0 | ||
![]() |
f880a9432d | ||
![]() |
5a82131033 | ||
![]() |
1839f2da34 | ||
![]() |
91c1d23461 | ||
![]() |
86f085b810 | ||
![]() |
ac372d2b00 | ||
![]() |
0e24e3c64f | ||
![]() |
89ab7eca7f | ||
![]() |
a1db52b030 | ||
![]() |
1572539bec | ||
![]() |
d8cd848ede | ||
![]() |
92259f7147 | ||
![]() |
4a431bcdac | ||
![]() |
7d868636de | ||
![]() |
ab0f1e234a | ||
![]() |
45a560a8c0 | ||
![]() |
4893a8f667 | ||
![]() |
f6d785fda8 | ||
![]() |
8d54e333ff | ||
![]() |
b063cf4ada | ||
![]() |
c4ab6d733f | ||
![]() |
2f97c0147b | ||
![]() |
52cfe5ae88 |
@@ -29,8 +29,8 @@ PenaltyExcessCharacter: 1000000
|
|||||||
PenaltyReturnTypeOnItsOwnLine: 60
|
PenaltyReturnTypeOnItsOwnLine: 60
|
||||||
PointerBindsToType: true
|
PointerBindsToType: true
|
||||||
SpacesBeforeTrailingComments: 1
|
SpacesBeforeTrailingComments: 1
|
||||||
Cpp11BracedListStyle: false
|
Cpp11BracedListStyle: true
|
||||||
Standard: Cpp03
|
Standard: Cpp11
|
||||||
IndentWidth: 2
|
IndentWidth: 2
|
||||||
TabWidth: 8
|
TabWidth: 8
|
||||||
UseTab: Never
|
UseTab: Never
|
||||||
|
26
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
26
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
---
|
||||||
|
name: Bug report
|
||||||
|
about: Create a report to help us improve
|
||||||
|
title: ''
|
||||||
|
labels: ''
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Describe the bug**
|
||||||
|
A clear and concise description of what the bug is.
|
||||||
|
|
||||||
|
**To Reproduce**
|
||||||
|
Steps to reproduce the behavior:
|
||||||
|
1.
|
||||||
|
|
||||||
|
**Expected behavior**
|
||||||
|
A clear and concise description of what you expected to happen.
|
||||||
|
|
||||||
|
**Desktop (please complete the following information):**
|
||||||
|
- OS: [e.g. iOS]
|
||||||
|
- Meson version
|
||||||
|
- Ninja version
|
||||||
|
|
||||||
|
**Additional context**
|
||||||
|
Add any other context about the problem here.
|
20
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
20
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
---
|
||||||
|
name: Feature request
|
||||||
|
about: Suggest an idea for this project
|
||||||
|
title: ''
|
||||||
|
labels: ''
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Is your feature request related to a problem? Please describe.**
|
||||||
|
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
||||||
|
|
||||||
|
**Describe the solution you'd like**
|
||||||
|
A clear and concise description of what you want to happen.
|
||||||
|
|
||||||
|
**Describe alternatives you've considered**
|
||||||
|
A clear and concise description of any alternative solutions or features you've considered.
|
||||||
|
|
||||||
|
**Additional context**
|
||||||
|
Add any other context or screenshots about the feature request here.
|
11
.gitignore
vendored
11
.gitignore
vendored
@@ -1,4 +1,5 @@
|
|||||||
/build/
|
/build/
|
||||||
|
/build-*/
|
||||||
*.pyc
|
*.pyc
|
||||||
*.swp
|
*.swp
|
||||||
*.actual
|
*.actual
|
||||||
@@ -6,7 +7,6 @@
|
|||||||
*.process-output
|
*.process-output
|
||||||
*.rewrite
|
*.rewrite
|
||||||
/bin/
|
/bin/
|
||||||
/buildscons/
|
|
||||||
/libs/
|
/libs/
|
||||||
/doc/doxyfile
|
/doc/doxyfile
|
||||||
/dist/
|
/dist/
|
||||||
@@ -30,9 +30,8 @@
|
|||||||
|
|
||||||
# CMake-generated files:
|
# CMake-generated files:
|
||||||
CMakeFiles/
|
CMakeFiles/
|
||||||
CTestTestFile.cmake
|
*.cmake
|
||||||
cmake_install.cmake
|
/pkg-config/jsoncpp.pc
|
||||||
pkg-config/jsoncpp.pc
|
|
||||||
jsoncpp_lib_static.dir/
|
jsoncpp_lib_static.dir/
|
||||||
|
|
||||||
# In case someone runs cmake in the root-dir:
|
# In case someone runs cmake in the root-dir:
|
||||||
@@ -45,8 +44,12 @@ jsoncpp_lib_static.dir/
|
|||||||
/src/lib_json/Makefile
|
/src/lib_json/Makefile
|
||||||
/src/test_lib_json/Makefile
|
/src/test_lib_json/Makefile
|
||||||
/src/test_lib_json/jsoncpp_test
|
/src/test_lib_json/jsoncpp_test
|
||||||
|
*.a
|
||||||
|
|
||||||
# eclipse project files
|
# eclipse project files
|
||||||
.project
|
.project
|
||||||
.cproject
|
.cproject
|
||||||
/.settings/
|
/.settings/
|
||||||
|
|
||||||
|
# DS_Store
|
||||||
|
.DS_Store
|
||||||
|
90
.travis.yml
90
.travis.yml
@@ -1,43 +1,65 @@
|
|||||||
# Build matrix / environment variable are explained on:
|
# Build matrix / environment variables are explained on:
|
||||||
# http://about.travis-ci.org/docs/user/build-configuration/
|
# http://about.travis-ci.org/docs/user/build-configuration/
|
||||||
# This file can be validated on:
|
# This file can be validated on: http://www.yamllint.com/
|
||||||
# http://lint.travis-ci.org/
|
# Or using the Ruby based travel command line tool:
|
||||||
# See also
|
# gem install travis --no-rdoc --no-ri
|
||||||
# http://stackoverflow.com/questions/22111549/travis-ci-with-clang-3-4-and-c11/30925448#30925448
|
# travis lint .travis.yml
|
||||||
# to allow C++11, though we are not yet building with -std=c++11
|
language: cpp
|
||||||
|
sudo: false
|
||||||
install:
|
|
||||||
# /usr/bin/gcc is 4.6 always, but gcc-X.Y is available.
|
|
||||||
- if [ "$CXX" = "g++" ]; then export CXX="g++-4.9" CC="gcc-4.9"; fi
|
|
||||||
# /usr/bin/clang is our version already, and clang-X.Y does not exist.
|
|
||||||
#- if [ "$CXX" = "clang++" ]; then export CXX="clang++-3.7" CC="clang-3.7"; fi
|
|
||||||
- echo ${PATH}
|
|
||||||
- ls /usr/local
|
|
||||||
- ls /usr/local/bin
|
|
||||||
- export PATH=/usr/local/bin:/usr/bin:${PATH}
|
|
||||||
- echo ${CXX}
|
|
||||||
- ${CXX} --version
|
|
||||||
- which valgrind
|
|
||||||
addons:
|
addons:
|
||||||
|
homebrew:
|
||||||
|
packages:
|
||||||
|
- meson
|
||||||
|
- ninja
|
||||||
|
update: false # do not update homebrew by default
|
||||||
apt:
|
apt:
|
||||||
sources:
|
sources:
|
||||||
- ubuntu-toolchain-r-test
|
- ubuntu-toolchain-r-test
|
||||||
|
- llvm-toolchain-xenial-8
|
||||||
packages:
|
packages:
|
||||||
- gcc-4.9
|
- clang-8
|
||||||
- g++-4.9
|
|
||||||
- clang
|
|
||||||
- valgrind
|
- valgrind
|
||||||
os:
|
matrix:
|
||||||
- linux
|
allow_failures:
|
||||||
language: cpp
|
- os: osx
|
||||||
compiler:
|
include:
|
||||||
- gcc
|
- name: Mac clang meson static release testing
|
||||||
- clang
|
os: osx
|
||||||
script: ./travis.sh
|
osx_image: xcode10.2
|
||||||
env:
|
compiler: clang
|
||||||
matrix:
|
env:
|
||||||
- SHARED_LIB=ON STATIC_LIB=ON CMAKE_PKG=ON BUILD_TYPE=release VERBOSE_MAKE=false
|
CXX="clang++"
|
||||||
- SHARED_LIB=OFF STATIC_LIB=ON CMAKE_PKG=OFF BUILD_TYPE=debug VERBOSE_MAKE=true VERBOSE
|
CC="clang"
|
||||||
|
LIB_TYPE=static
|
||||||
|
BUILD_TYPE=release
|
||||||
|
script: ./.travis_scripts/meson_builder.sh
|
||||||
|
- name: Linux xenial clang meson static release testing
|
||||||
|
os: linux
|
||||||
|
dist: xenial
|
||||||
|
compiler: clang
|
||||||
|
env:
|
||||||
|
CXX="clang++"
|
||||||
|
CC="clang"
|
||||||
|
LIB_TYPE=static
|
||||||
|
BUILD_TYPE=release
|
||||||
|
# before_install and install steps only needed for linux meson builds
|
||||||
|
before_install:
|
||||||
|
- source ./.travis_scripts/travis.before_install.${TRAVIS_OS_NAME}.sh
|
||||||
|
install:
|
||||||
|
- source ./.travis_scripts/travis.install.${TRAVIS_OS_NAME}.sh
|
||||||
|
script: ./.travis_scripts/meson_builder.sh
|
||||||
|
- name: Linux xenial gcc cmake coverage
|
||||||
|
os: linux
|
||||||
|
dist: xenial
|
||||||
|
compiler: gcc
|
||||||
|
env:
|
||||||
|
CXX=g++
|
||||||
|
CC=gcc
|
||||||
|
DO_Coverage=ON
|
||||||
|
BUILD_TOOL="Unix Makefiles"
|
||||||
|
BUILD_TYPE=Debug
|
||||||
|
LIB_TYPE=shared
|
||||||
|
DESTDIR=/tmp/cmake_json_cpp
|
||||||
|
script: ./.travis_scripts/cmake_builder.sh
|
||||||
notifications:
|
notifications:
|
||||||
email: false
|
email: false
|
||||||
sudo: false
|
|
||||||
|
130
.travis_scripts/cmake_builder.sh
Executable file
130
.travis_scripts/cmake_builder.sh
Executable file
@@ -0,0 +1,130 @@
|
|||||||
|
#!/usr/bin/env sh
|
||||||
|
# This script can be used on the command line directly to configure several
|
||||||
|
# different build environments.
|
||||||
|
# This is called by `.travis.yml` via Travis CI.
|
||||||
|
# Travis supplies $TRAVIS_OS_NAME.
|
||||||
|
# http://docs.travis-ci.com/user/multi-os/
|
||||||
|
# Our .travis.yml also defines:
|
||||||
|
|
||||||
|
# - BUILD_TYPE=Release/Debug
|
||||||
|
# - LIB_TYPE=static/shared
|
||||||
|
#
|
||||||
|
# Optional environmental variables
|
||||||
|
# - DESTDIR <- used for setting the install prefix
|
||||||
|
# - BUILD_TOOL=["Unix Makefile"|"Ninja"]
|
||||||
|
# - BUILDNAME <- how to identify this build on the dashboard
|
||||||
|
# - DO_MemCheck <- if set, try to use valgrind
|
||||||
|
# - DO_Coverage <- if set, try to do dashboard coverage testing
|
||||||
|
#
|
||||||
|
|
||||||
|
env_set=1
|
||||||
|
if ${BUILD_TYPE+false}; then
|
||||||
|
echo "BUILD_TYPE not set in environment."
|
||||||
|
env_set=0
|
||||||
|
fi
|
||||||
|
if ${LIB_TYPE+false}; then
|
||||||
|
echo "LIB_TYPE not set in environment."
|
||||||
|
env_set=0
|
||||||
|
fi
|
||||||
|
if ${CXX+false}; then
|
||||||
|
echo "CXX not set in environment."
|
||||||
|
env_set=0
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
if [ ${env_set} -eq 0 ]; then
|
||||||
|
echo "USAGE: CXX=$(which clang++) BUILD_TYPE=[Release|Debug] LIB_TYPE=[static|shared] $0"
|
||||||
|
echo ""
|
||||||
|
echo "Examples:"
|
||||||
|
echo " CXX=$(which clang++) BUILD_TYPE=Release LIB_TYPE=shared DESTDIR=/tmp/cmake_json_cpp $0"
|
||||||
|
echo " CXX=$(which clang++) BUILD_TYPE=Debug LIB_TYPE=shared DESTDIR=/tmp/cmake_json_cpp $0"
|
||||||
|
echo " CXX=$(which clang++) BUILD_TYPE=Release LIB_TYPE=static DESTDIR=/tmp/cmake_json_cpp $0"
|
||||||
|
echo " CXX=$(which clang++) BUILD_TYPE=Debug LIB_TYPE=static DESTDIR=/tmp/cmake_json_cpp $0"
|
||||||
|
|
||||||
|
echo " CXX=$(which g++) BUILD_TYPE=Release LIB_TYPE=shared DESTDIR=/tmp/cmake_json_cpp $0"
|
||||||
|
echo " CXX=$(which g++) BUILD_TYPE=Debug LIB_TYPE=shared DESTDIR=/tmp/cmake_json_cpp $0"
|
||||||
|
echo " CXX=$(which g++) BUILD_TYPE=Release LIB_TYPE=static DESTDIR=/tmp/cmake_json_cpp $0"
|
||||||
|
echo " CXX=$(which g++) BUILD_TYPE=Debug LIB_TYPE=static DESTDIR=/tmp/cmake_json_cpp $0"
|
||||||
|
|
||||||
|
exit -1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ${DESTDIR+false}; then
|
||||||
|
DESTDIR="/usr/local"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# -e: fail on error
|
||||||
|
# -v: show commands
|
||||||
|
# -x: show expanded commands
|
||||||
|
set -vex
|
||||||
|
|
||||||
|
env | sort
|
||||||
|
|
||||||
|
which cmake
|
||||||
|
cmake --version
|
||||||
|
|
||||||
|
echo ${CXX}
|
||||||
|
${CXX} --version
|
||||||
|
_COMPILER_NAME=`basename ${CXX}`
|
||||||
|
if [ "${BUILD_TYPE}" == "shared" ]; then
|
||||||
|
_CMAKE_BUILD_SHARED_LIBS=ON
|
||||||
|
else
|
||||||
|
_CMAKE_BUILD_SHARED_LIBS=OFF
|
||||||
|
fi
|
||||||
|
|
||||||
|
CTEST_TESTING_OPTION="-D ExperimentalTest"
|
||||||
|
# - DO_MemCheck <- if set, try to use valgrind
|
||||||
|
if ! ${DO_MemCheck+false}; then
|
||||||
|
valgrind --version
|
||||||
|
CTEST_TESTING_OPTION="-D ExperimentalMemCheck"
|
||||||
|
else
|
||||||
|
# - DO_Coverage <- if set, try to do dashboard coverage testing
|
||||||
|
if ! ${DO_Coverage+false}; then
|
||||||
|
export CXXFLAGS="-fprofile-arcs -ftest-coverage"
|
||||||
|
export LDFLAGS="-fprofile-arcs -ftest-coverage"
|
||||||
|
CTEST_TESTING_OPTION="-D ExperimentalTest -D ExperimentalCoverage"
|
||||||
|
#gcov --version
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Ninja = Generates build.ninja files.
|
||||||
|
if ${BUILD_TOOL+false}; then
|
||||||
|
BUILD_TOOL="Ninja"
|
||||||
|
export _BUILD_EXE=ninja
|
||||||
|
which ninja
|
||||||
|
ninja --version
|
||||||
|
else
|
||||||
|
# Unix Makefiles = Generates standard UNIX makefiles.
|
||||||
|
export _BUILD_EXE=make
|
||||||
|
fi
|
||||||
|
|
||||||
|
_BUILD_DIR_NAME="build-cmake_${BUILD_TYPE}_${LIB_TYPE}_${_COMPILER_NAME}_${_BUILD_EXE}"
|
||||||
|
mkdir -p ${_BUILD_DIR_NAME}
|
||||||
|
cd "${_BUILD_DIR_NAME}"
|
||||||
|
if ${BUILDNAME+false}; then
|
||||||
|
_HOSTNAME=`hostname -s`
|
||||||
|
BUILDNAME="${_HOSTNAME}_${BUILD_TYPE}_${LIB_TYPE}_${_COMPILER_NAME}_${_BUILD_EXE}"
|
||||||
|
fi
|
||||||
|
cmake \
|
||||||
|
-G "${BUILD_TOOL}" \
|
||||||
|
-DBUILDNAME:STRING="${BUILDNAME}" \
|
||||||
|
-DCMAKE_CXX_COMPILER:PATH=${CXX} \
|
||||||
|
-DCMAKE_BUILD_TYPE:STRING=${BUILD_TYPE} \
|
||||||
|
-DBUILD_SHARED_LIBS:BOOL=${_CMAKE_BUILD_SHARED_LIBS} \
|
||||||
|
-DCMAKE_INSTALL_PREFIX:PATH=${DESTDIR} \
|
||||||
|
../
|
||||||
|
|
||||||
|
ctest -C ${BUILD_TYPE} -D ExperimentalStart -D ExperimentalConfigure -D ExperimentalBuild ${CTEST_TESTING_OPTION} -D ExperimentalSubmit
|
||||||
|
# Final step is to verify that installation succeeds
|
||||||
|
cmake --build . --config ${BUILD_TYPE} --target install
|
||||||
|
|
||||||
|
if [ "${DESTDIR}" != "/usr/local" ]; then
|
||||||
|
${_BUILD_EXE} install
|
||||||
|
fi
|
||||||
|
cd -
|
||||||
|
|
||||||
|
if ${CLEANUP+false}; then
|
||||||
|
echo "Skipping cleanup: build directory will persist."
|
||||||
|
else
|
||||||
|
rm -r "${_BUILD_DIR_NAME}"
|
||||||
|
fi
|
81
.travis_scripts/meson_builder.sh
Executable file
81
.travis_scripts/meson_builder.sh
Executable file
@@ -0,0 +1,81 @@
|
|||||||
|
#!/usr/bin/env sh
|
||||||
|
# This script can be used on the command line directly to configure several
|
||||||
|
# different build environments.
|
||||||
|
# This is called by `.travis.yml` via Travis CI.
|
||||||
|
# Travis supplies $TRAVIS_OS_NAME.
|
||||||
|
# http://docs.travis-ci.com/user/multi-os/
|
||||||
|
# Our .travis.yml also defines:
|
||||||
|
|
||||||
|
# - BUILD_TYPE=release/debug
|
||||||
|
# - LIB_TYPE=static/shared
|
||||||
|
|
||||||
|
env_set=1
|
||||||
|
if ${BUILD_TYPE+false}; then
|
||||||
|
echo "BUILD_TYPE not set in environment."
|
||||||
|
env_set=0
|
||||||
|
fi
|
||||||
|
if ${LIB_TYPE+false}; then
|
||||||
|
echo "LIB_TYPE not set in environment."
|
||||||
|
env_set=0
|
||||||
|
fi
|
||||||
|
if ${CXX+false}; then
|
||||||
|
echo "CXX not set in environment."
|
||||||
|
env_set=0
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
if [ ${env_set} -eq 0 ]; then
|
||||||
|
echo "USAGE: CXX=$(which clang++) BUILD_TYPE=[release|debug] LIB_TYPE=[static|shared] $0"
|
||||||
|
echo ""
|
||||||
|
echo "Examples:"
|
||||||
|
echo " CXX=$(which clang++) BUILD_TYPE=release LIB_TYPE=shared DESTDIR=/tmp/meson_json_cpp $0"
|
||||||
|
echo " CXX=$(which clang++) BUILD_TYPE=debug LIB_TYPE=shared DESTDIR=/tmp/meson_json_cpp $0"
|
||||||
|
echo " CXX=$(which clang++) BUILD_TYPE=release LIB_TYPE=static DESTDIR=/tmp/meson_json_cpp $0"
|
||||||
|
echo " CXX=$(which clang++) BUILD_TYPE=debug LIB_TYPE=static DESTDIR=/tmp/meson_json_cpp $0"
|
||||||
|
|
||||||
|
echo " CXX=$(which g++) BUILD_TYPE=release LIB_TYPE=shared DESTDIR=/tmp/meson_json_cpp $0"
|
||||||
|
echo " CXX=$(which g++) BUILD_TYPE=debug LIB_TYPE=shared DESTDIR=/tmp/meson_json_cpp $0"
|
||||||
|
echo " CXX=$(which g++) BUILD_TYPE=release LIB_TYPE=static DESTDIR=/tmp/meson_json_cpp $0"
|
||||||
|
echo " CXX=$(which g++) BUILD_TYPE=debug LIB_TYPE=static DESTDIR=/tmp/meson_json_cpp $0"
|
||||||
|
|
||||||
|
exit -1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ${DESTDIR+false}; then
|
||||||
|
DESTDIR="/usr/local"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# -e: fail on error
|
||||||
|
# -v: show commands
|
||||||
|
# -x: show expanded commands
|
||||||
|
set -vex
|
||||||
|
|
||||||
|
|
||||||
|
env | sort
|
||||||
|
|
||||||
|
which python3
|
||||||
|
which meson
|
||||||
|
which ninja
|
||||||
|
echo ${CXX}
|
||||||
|
${CXX} --version
|
||||||
|
python3 --version
|
||||||
|
meson --version
|
||||||
|
ninja --version
|
||||||
|
_COMPILER_NAME=`basename ${CXX}`
|
||||||
|
_BUILD_DIR_NAME="build-${BUILD_TYPE}_${LIB_TYPE}_${_COMPILER_NAME}"
|
||||||
|
meson --buildtype ${BUILD_TYPE} --default-library ${LIB_TYPE} . "${_BUILD_DIR_NAME}"
|
||||||
|
ninja -v -j 2 -C "${_BUILD_DIR_NAME}"
|
||||||
|
#ninja -v -j 2 -C "${_BUILD_DIR_NAME}" test
|
||||||
|
cd "${_BUILD_DIR_NAME}"
|
||||||
|
meson test --no-rebuild --print-errorlogs
|
||||||
|
|
||||||
|
if [ "${DESTDIR}" != "/usr/local" ]; then
|
||||||
|
ninja install
|
||||||
|
fi
|
||||||
|
cd -
|
||||||
|
|
||||||
|
if ${CLEANUP+false}; then
|
||||||
|
echo "Skipping cleanup: build directory will persist."
|
||||||
|
else
|
||||||
|
rm -r "${_BUILD_DIR_NAME}"
|
||||||
|
fi
|
8
.travis_scripts/travis.before_install.linux.sh
Normal file
8
.travis_scripts/travis.before_install.linux.sh
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
set -vex
|
||||||
|
|
||||||
|
# Preinstalled versions of python are dependent on which Ubuntu distribution
|
||||||
|
# you are running. The below version needs to be updated whenever we roll
|
||||||
|
# the Ubuntu version used in Travis.
|
||||||
|
# https://docs.travis-ci.com/user/languages/python/
|
||||||
|
|
||||||
|
pyenv global 3.7.1
|
1
.travis_scripts/travis.before_install.osx.sh
Normal file
1
.travis_scripts/travis.before_install.osx.sh
Normal file
@@ -0,0 +1 @@
|
|||||||
|
# NOTHING TO DO HERE
|
10
.travis_scripts/travis.install.linux.sh
Normal file
10
.travis_scripts/travis.install.linux.sh
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
set -vex
|
||||||
|
|
||||||
|
wget https://github.com/ninja-build/ninja/releases/download/v1.9.0/ninja-linux.zip
|
||||||
|
unzip -q ninja-linux.zip -d build
|
||||||
|
|
||||||
|
pip3 install meson
|
||||||
|
echo ${PATH}
|
||||||
|
ls /usr/local
|
||||||
|
ls /usr/local/bin
|
||||||
|
export PATH="${PWD}"/build:/usr/local/bin:/usr/bin:${PATH}
|
1
.travis_scripts/travis.install.osx.sh
Normal file
1
.travis_scripts/travis.install.osx.sh
Normal file
@@ -0,0 +1 @@
|
|||||||
|
# NOTHING TO DO HERE
|
112
AUTHORS
112
AUTHORS
@@ -1 +1,113 @@
|
|||||||
Baptiste Lepilleur <blep@users.sourceforge.net>
|
Baptiste Lepilleur <blep@users.sourceforge.net>
|
||||||
|
|
||||||
|
Aaron Jacobs <aaronjjacobs@gmail.com>
|
||||||
|
Aaron Jacobs <jacobsa@google.com>
|
||||||
|
Adam Boseley <ABoseley@agjunction.com>
|
||||||
|
Adam Boseley <adam.boseley@gmail.com>
|
||||||
|
Aleksandr Derbenev <13alexac@gmail.com>
|
||||||
|
Alexander Gazarov <DrMetallius@users.noreply.github.com>
|
||||||
|
Alexander V. Brezgin <abrezgin@appliedtech.ru>
|
||||||
|
Alexandr Brezgin <albrezgin@mail.ru>
|
||||||
|
Alexey Kruchinin <alexey@mopals.com>
|
||||||
|
Anton Indrawan <anton.indrawan@gmail.com>
|
||||||
|
Baptiste Jonglez <git@bitsofnetworks.org>
|
||||||
|
Baptiste Lepilleur <baptiste.lepilleur@gmail.com>
|
||||||
|
Baruch Siach <baruch@tkos.co.il>
|
||||||
|
Ben Boeckel <mathstuf@gmail.com>
|
||||||
|
Benjamin Knecht <bknecht@logitech.com>
|
||||||
|
Bernd Kuhls <bernd.kuhls@t-online.de>
|
||||||
|
Billy Donahue <billydonahue@google.com>
|
||||||
|
Braden McDorman <bmcdorman@gmail.com>
|
||||||
|
Brandon Myers <bmyers1788@gmail.com>
|
||||||
|
Brendan Drew <brendan.drew@daqri.com>
|
||||||
|
chason <cxchao802@gmail.com>
|
||||||
|
Chris Gilling <cgilling@iparadigms.com>
|
||||||
|
Christopher Dawes <christopher.dawes.1981@googlemail.com>
|
||||||
|
Christopher Dunn <cdunn2001@gmail.com>
|
||||||
|
Chuck Atkins <chuck.atkins@kitware.com>
|
||||||
|
Cody P Schafer <dev@codyps.com>
|
||||||
|
Connor Manning <connor@hobu.co>
|
||||||
|
Cory Quammen <cory.quammen@kitware.com>
|
||||||
|
Cristóvão B da Cruz e Silva <CrisXed@gmail.com>
|
||||||
|
Daniel Krügler <daniel.kruegler@gmail.com>
|
||||||
|
Dani-Hub <daniel.kruegler@googlemail.com>
|
||||||
|
Dan Liu <gzliudan>
|
||||||
|
datadiode <datadiode@users.noreply.github.com>
|
||||||
|
datadiode <jochen.neubeck@vodafone.de>
|
||||||
|
David Seifert <soap@gentoo.org>
|
||||||
|
David West <david-west@idexx.com>
|
||||||
|
dawesc <chris.dawes@eftlab.co.uk>
|
||||||
|
Devin Jeanpierre <jeanpierreda@google.com>
|
||||||
|
Dmitry Marakasov <amdmi3@amdmi3.ru>
|
||||||
|
dominicpezzuto <dom@dompezzuto.com>
|
||||||
|
Don Milham <dmilham@gmail.com>
|
||||||
|
drgler <daniel.kruegler@gmail.com>
|
||||||
|
ds283 <D.Seery@sussex.ac.uk>
|
||||||
|
Egor Tensin <Egor.Tensin@gmail.com>
|
||||||
|
eightnoteight <mr.eightnoteight@gmail.com>
|
||||||
|
Evince <baneyue@gmail.com>
|
||||||
|
filipjs <filipjs@users.noreply.github.com>
|
||||||
|
findblar <ft@finbarr.ca>
|
||||||
|
Florian Meier <florian.meier@koalo.de>
|
||||||
|
Gaëtan Lehmann <gaetan.lehmann@gmail.com>
|
||||||
|
Gaurav <g.gupta@samsung.com>
|
||||||
|
Gergely Nagy <ngg@ngg.hu>
|
||||||
|
Gida Pataki <gida.pataki@prezi.com>
|
||||||
|
I3ck <buckmartin@buckmartin.de>
|
||||||
|
Iñaki Baz Castillo <ibc@aliax.net>
|
||||||
|
Jacco <jacco@geul.net>
|
||||||
|
Jean-Christophe Fillion-Robin <jchris.fillionr@kitware.com>
|
||||||
|
Jonas Platte <mail@jonasplatte.de>
|
||||||
|
Jordan Bayles <bayles.jordan@gmail.com>
|
||||||
|
Jörg Krause <joerg.krause@embedded.rocks>
|
||||||
|
Keith Lea <keith@whamcitylights.com>
|
||||||
|
Kevin Grant <kbradleygrant@gmail.com>
|
||||||
|
Kirill V. Lyadvinsky <jia3ep@gmail.com>
|
||||||
|
Kirill V. Lyadvinsky <mail@codeatcpp.com>
|
||||||
|
Kobi Gurkan <kobigurk@gmail.com>
|
||||||
|
Magnus Bjerke Vik <mbvett@gmail.com>
|
||||||
|
Malay Shah <malays@users.sourceforge.net>
|
||||||
|
Mara Kim <hacker.root@gmail.com>
|
||||||
|
Marek Kotewicz <marek.kotewicz@gmail.com>
|
||||||
|
Mark Lakata <mark@lakata.org>
|
||||||
|
Mark Zeren <mzeren@vmware.com>
|
||||||
|
Martin Buck <buckmartin@buckmartin.de>
|
||||||
|
Martyn Gigg <martyn.gigg@gmail.com>
|
||||||
|
Mattes D <github@xoft.cz>
|
||||||
|
Matthias Loy <matthias.loy@hbm.com>
|
||||||
|
Merlyn Morgan-Graham <kavika@gmail.com>
|
||||||
|
Michael Shields <mshields@google.com>
|
||||||
|
Michał Górny <mgorny@gentoo.org>
|
||||||
|
Mike Naberezny <mike@naberezny.com>
|
||||||
|
mloy <matthias.loy@googlemail.com>
|
||||||
|
Motti <lanzkron@gmail.com>
|
||||||
|
nnkur <nnkur@mail.ru>
|
||||||
|
Omkar Wagh <owagh@owaghlinux.ny.tower-research.com>
|
||||||
|
paulo <paulobrizolara@users.noreply.github.com>
|
||||||
|
pavel.pimenov <pavel.pimenov@gmail.com>
|
||||||
|
Paweł Bylica <chfast@gmail.com>
|
||||||
|
Péricles Lopes Machado <pericles.raskolnikoff@gmail.com>
|
||||||
|
Peter Spiess-Knafl <psk@autistici.org>
|
||||||
|
pffang <pffang@vip.qq.com>
|
||||||
|
Rémi Verschelde <remi@verschelde.fr>
|
||||||
|
renu555 <renu.tyagi@samsung.com>
|
||||||
|
Robert Dailey <rcdailey@gmail.com>
|
||||||
|
Sam Clegg <sbc@chromium.org>
|
||||||
|
selaselah <selah@outlook.com>
|
||||||
|
Sergiy80 <sil2004@gmail.com>
|
||||||
|
sergzub <sergzub@gmail.com>
|
||||||
|
Stefan Schweter <stefan@schweter.it>
|
||||||
|
Steffen Kieß <Steffen.Kiess@ipvs.uni-stuttgart.de>
|
||||||
|
Steven Hahn <hahnse@ornl.gov>
|
||||||
|
Stuart Eichert <stuart@fivemicro.com>
|
||||||
|
SuperManitu <supermanitu@gmail.com>
|
||||||
|
Techwolf <dring@g33kworld.net>
|
||||||
|
Tengiz Sharafiev <btolfa+github@gmail.com>
|
||||||
|
Tomasz Maciejewski <tmaciejewsk@gmail.com>
|
||||||
|
Vicente Olivert Riera <Vincent.Riera@imgtec.com>
|
||||||
|
xiaoyur347 <xiaoyur347@gmail.com>
|
||||||
|
ycqiu <429148848@qq.com>
|
||||||
|
yiqiju <fred_ju@selinc.com>
|
||||||
|
Yu Xiaolei <dreifachstein@gmail.com>
|
||||||
|
|
||||||
|
Google Inc.
|
||||||
|
254
CMakeLists.txt
254
CMakeLists.txt
@@ -1,125 +1,145 @@
|
|||||||
# vim: et ts=4 sts=4 sw=4 tw=0
|
# vim: et ts=4 sts=4 sw=4 tw=0
|
||||||
|
|
||||||
CMAKE_MINIMUM_REQUIRED(VERSION 2.8.5)
|
# ==== Define cmake build policies that affect compilation and linkage default behaviors
|
||||||
PROJECT(jsoncpp)
|
#
|
||||||
ENABLE_TESTING()
|
# Set the JSONCPP_NEWEST_VALIDATED_POLICIES_VERSION string to the newest cmake version
|
||||||
|
# policies that provide successful builds. By setting JSONCPP_NEWEST_VALIDATED_POLICIES_VERSION
|
||||||
|
# to a value greater than the oldest policies, all policies between
|
||||||
|
# JSONCPP_OLDEST_VALIDATED_POLICIES_VERSION and CMAKE_VERSION (used for this build)
|
||||||
|
# are set to their NEW behaivor, thereby suppressing policy warnings related to policies
|
||||||
|
# between the JSONCPP_OLDEST_VALIDATED_POLICIES_VERSION and CMAKE_VERSION.
|
||||||
|
#
|
||||||
|
# CMake versions greater than the JSONCPP_NEWEST_VALIDATED_POLICIES_VERSION policies will
|
||||||
|
# continue to generate policy warnings "CMake Warning (dev)...Policy CMP0XXX is not set:"
|
||||||
|
#
|
||||||
|
set(JSONCPP_OLDEST_VALIDATED_POLICIES_VERSION "3.8.0")
|
||||||
|
set(JSONCPP_NEWEST_VALIDATED_POLICIES_VERSION "3.13.2")
|
||||||
|
cmake_minimum_required(VERSION ${JSONCPP_OLDEST_VALIDATED_POLICIES_VERSION})
|
||||||
|
if("${CMAKE_VERSION}" VERSION_LESS "${JSONCPP_NEWEST_VALIDATED_POLICIES_VERSION}")
|
||||||
|
#Set and use the newest available cmake policies that are validated to work
|
||||||
|
set(JSONCPP_CMAKE_POLICY_VERSION "${CMAKE_VERSION}")
|
||||||
|
else()
|
||||||
|
set(JSONCPP_CMAKE_POLICY_VERSION "${JSONCPP_NEWEST_VALIDATED_POLICIES_VERSION}")
|
||||||
|
endif()
|
||||||
|
cmake_policy(VERSION ${JSONCPP_CMAKE_POLICY_VERSION})
|
||||||
|
#
|
||||||
|
# Now enumerate specific policies newer than JSONCPP_NEWEST_VALIDATED_POLICIES_VERSION
|
||||||
|
# that may need to be individually set to NEW/OLD
|
||||||
|
#
|
||||||
|
foreach(pnew "") # Currently Empty
|
||||||
|
if(POLICY ${pnew})
|
||||||
|
cmake_policy(SET ${pnew} NEW)
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
foreach(pold "") # Currently Empty
|
||||||
|
if(POLICY ${pold})
|
||||||
|
cmake_policy(SET ${pold} OLD)
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
|
||||||
OPTION(JSONCPP_WITH_TESTS "Compile and (for jsoncpp_check) run JsonCpp test executables" ON)
|
# ==== Define language standard configurations requiring at least c++11 standard
|
||||||
OPTION(JSONCPP_WITH_POST_BUILD_UNITTEST "Automatically run unit-tests as a post build step" ON)
|
if(CMAKE_CXX_STANDARD EQUAL "98" )
|
||||||
OPTION(JSONCPP_WITH_WARNING_AS_ERROR "Force compilation to fail if a warning occurs" OFF)
|
message(FATAL_ERROR "CMAKE_CXX_STANDARD:STRING=98 is not supported.")
|
||||||
OPTION(JSONCPP_WITH_STRICT_ISO "Issue all the warnings demanded by strict ISO C and ISO C++" ON)
|
endif()
|
||||||
OPTION(JSONCPP_WITH_PKGCONFIG_SUPPORT "Generate and install .pc files" ON)
|
|
||||||
OPTION(JSONCPP_WITH_CMAKE_PACKAGE "Generate and install cmake package files" OFF)
|
|
||||||
OPTION(BUILD_SHARED_LIBS "Build jsoncpp_lib as a shared library." OFF)
|
|
||||||
OPTION(BUILD_STATIC_LIBS "Build jsoncpp_lib static library." ON)
|
|
||||||
|
|
||||||
# Ensures that CMAKE_BUILD_TYPE is visible in cmake-gui on Unix
|
#####
|
||||||
IF(NOT WIN32)
|
## Set the default target properties
|
||||||
IF(NOT CMAKE_BUILD_TYPE)
|
if(NOT CMAKE_CXX_STANDARD)
|
||||||
SET(CMAKE_BUILD_TYPE Release CACHE STRING
|
set(CMAKE_CXX_STANDARD 11) # Supported values are ``11``, ``14``, and ``17``.
|
||||||
"Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel Coverage."
|
endif()
|
||||||
FORCE)
|
if(NOT CMAKE_CXX_STANDARD_REQUIRED)
|
||||||
ENDIF()
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||||
ENDIF()
|
endif()
|
||||||
|
if(NOT CMAKE_CXX_EXTENSIONS)
|
||||||
|
set(CMAKE_CXX_EXTENSIONS OFF)
|
||||||
|
endif()
|
||||||
|
|
||||||
SET(DEBUG_LIBNAME_SUFFIX "" CACHE STRING "Optional suffix to append to the library name for a debug build")
|
# ====
|
||||||
SET(LIB_SUFFIX "" CACHE STRING "Optional arch-dependent suffix for the library installation directory")
|
|
||||||
|
|
||||||
SET(RUNTIME_INSTALL_DIR bin
|
# Ensures that CMAKE_BUILD_TYPE has a default value
|
||||||
CACHE PATH "Install dir for executables and dlls")
|
if(NOT DEFINED CMAKE_BUILD_TYPE)
|
||||||
SET(ARCHIVE_INSTALL_DIR lib${LIB_SUFFIX}
|
set(CMAKE_BUILD_TYPE Release CACHE STRING
|
||||||
CACHE PATH "Install dir for static libraries")
|
"Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel Coverage.")
|
||||||
SET(LIBRARY_INSTALL_DIR lib${LIB_SUFFIX}
|
endif()
|
||||||
CACHE PATH "Install dir for shared libraries")
|
|
||||||
SET(INCLUDE_INSTALL_DIR include
|
|
||||||
CACHE PATH "Install dir for headers")
|
|
||||||
SET(PACKAGE_INSTALL_DIR lib${LIB_SUFFIX}/cmake
|
|
||||||
CACHE PATH "Install dir for cmake package config files")
|
|
||||||
MARK_AS_ADVANCED( RUNTIME_INSTALL_DIR ARCHIVE_INSTALL_DIR INCLUDE_INSTALL_DIR PACKAGE_INSTALL_DIR )
|
|
||||||
|
|
||||||
# Set variable named ${VAR_NAME} to value ${VALUE}
|
project(JSONCPP
|
||||||
FUNCTION(set_using_dynamic_name VAR_NAME VALUE)
|
VERSION 1.9.0 # <major>[.<minor>[.<patch>[.<tweak>]]]
|
||||||
SET( "${VAR_NAME}" "${VALUE}" PARENT_SCOPE)
|
LANGUAGES CXX)
|
||||||
ENDFUNCTION()
|
|
||||||
|
|
||||||
# Extract major, minor, patch from version text
|
message(STATUS "JsonCpp Version: ${JSONCPP_VERSION_MAJOR}.${JSONCPP_VERSION_MINOR}.${JSONCPP_VERSION_PATCH}")
|
||||||
# Parse a version string "X.Y.Z" and outputs
|
set( JSONCPP_SOVERSION 21 )
|
||||||
# version parts in ${OUPUT_PREFIX}_MAJOR, _MINOR, _PATCH.
|
|
||||||
# If parse succeeds then ${OUPUT_PREFIX}_FOUND is TRUE.
|
|
||||||
MACRO(jsoncpp_parse_version VERSION_TEXT OUPUT_PREFIX)
|
|
||||||
SET(VERSION_REGEX "[0-9]+\\.[0-9]+\\.[0-9]+(-[a-zA-Z0-9_]+)?")
|
|
||||||
IF( ${VERSION_TEXT} MATCHES ${VERSION_REGEX} )
|
|
||||||
STRING(REGEX MATCHALL "[0-9]+|-([A-Za-z0-9_]+)" VERSION_PARTS ${VERSION_TEXT})
|
|
||||||
LIST(GET VERSION_PARTS 0 ${OUPUT_PREFIX}_MAJOR)
|
|
||||||
LIST(GET VERSION_PARTS 1 ${OUPUT_PREFIX}_MINOR)
|
|
||||||
LIST(GET VERSION_PARTS 2 ${OUPUT_PREFIX}_PATCH)
|
|
||||||
set_using_dynamic_name( "${OUPUT_PREFIX}_FOUND" TRUE )
|
|
||||||
ELSE( ${VERSION_TEXT} MATCHES ${VERSION_REGEX} )
|
|
||||||
set_using_dynamic_name( "${OUPUT_PREFIX}_FOUND" FALSE )
|
|
||||||
ENDIF()
|
|
||||||
ENDMACRO()
|
|
||||||
|
|
||||||
# Read out version from "version" file
|
option(JSONCPP_WITH_TESTS "Compile and (for jsoncpp_check) run JsonCpp test executables" ON)
|
||||||
#FILE(STRINGS "version" JSONCPP_VERSION)
|
option(JSONCPP_WITH_POST_BUILD_UNITTEST "Automatically run unit-tests as a post build step" ON)
|
||||||
#SET( JSONCPP_VERSION_MAJOR X )
|
option(JSONCPP_WITH_WARNING_AS_ERROR "Force compilation to fail if a warning occurs" OFF)
|
||||||
#SET( JSONCPP_VERSION_MINOR Y )
|
option(JSONCPP_WITH_STRICT_ISO "Issue all the warnings demanded by strict ISO C and ISO C++" ON)
|
||||||
#SET( JSONCPP_VERSION_PATCH Z )
|
option(JSONCPP_WITH_PKGCONFIG_SUPPORT "Generate and install .pc files" ON)
|
||||||
SET( JSONCPP_VERSION 1.7.5 )
|
option(JSONCPP_WITH_CMAKE_PACKAGE "Generate and install cmake package files" ON)
|
||||||
jsoncpp_parse_version( ${JSONCPP_VERSION} JSONCPP_VERSION )
|
option(BUILD_SHARED_LIBS "Build jsoncpp_lib as a shared library." OFF)
|
||||||
#IF(NOT JSONCPP_VERSION_FOUND)
|
|
||||||
# MESSAGE(FATAL_ERROR "Failed to parse version string properly. Expect X.Y.Z")
|
# Enable runtime search path support for dynamic libraries on OSX
|
||||||
#ENDIF(NOT JSONCPP_VERSION_FOUND)
|
if(APPLE)
|
||||||
SET( JSONCPP_USE_SECURE_MEMORY "0" CACHE STRING "-D...=1 to use memory-wiping allocator for STL" )
|
set(CMAKE_MACOSX_RPATH 1)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Adhere to GNU filesystem layout conventions
|
||||||
|
include(GNUInstallDirs)
|
||||||
|
|
||||||
|
set(DEBUG_LIBNAME_SUFFIX "" CACHE STRING "Optional suffix to append to the library name for a debug build")
|
||||||
|
|
||||||
|
set(JSONCPP_USE_SECURE_MEMORY "0" CACHE STRING "-D...=1 to use memory-wiping allocator for STL" )
|
||||||
|
|
||||||
MESSAGE(STATUS "JsonCpp Version: ${JSONCPP_VERSION_MAJOR}.${JSONCPP_VERSION_MINOR}.${JSONCPP_VERSION_PATCH}")
|
|
||||||
# File version.h is only regenerated on CMake configure step
|
# File version.h is only regenerated on CMake configure step
|
||||||
CONFIGURE_FILE( "${PROJECT_SOURCE_DIR}/src/lib_json/version.h.in"
|
configure_file( "${PROJECT_SOURCE_DIR}/src/lib_json/version.h.in"
|
||||||
"${PROJECT_SOURCE_DIR}/include/json/version.h"
|
"${PROJECT_BINARY_DIR}/include/json/version.h"
|
||||||
NEWLINE_STYLE UNIX )
|
NEWLINE_STYLE UNIX )
|
||||||
CONFIGURE_FILE( "${PROJECT_SOURCE_DIR}/version.in"
|
configure_file( "${PROJECT_SOURCE_DIR}/version.in"
|
||||||
"${PROJECT_SOURCE_DIR}/version"
|
"${PROJECT_BINARY_DIR}/version"
|
||||||
NEWLINE_STYLE UNIX )
|
NEWLINE_STYLE UNIX )
|
||||||
|
|
||||||
macro(UseCompilationWarningAsError)
|
macro(UseCompilationWarningAsError)
|
||||||
if ( MSVC )
|
if(MSVC)
|
||||||
# Only enabled in debug because some old versions of VS STL generate
|
# Only enabled in debug because some old versions of VS STL generate
|
||||||
# warnings when compiled in release configuration.
|
# warnings when compiled in release configuration.
|
||||||
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /WX ")
|
add_compile_options($<$<CONFIG:Debug>:/WX>)
|
||||||
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
|
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror")
|
add_compile_options(-Werror)
|
||||||
if (JSONCPP_WITH_STRICT_ISO)
|
if(JSONCPP_WITH_STRICT_ISO)
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic-errors")
|
add_compile_options(-pedantic-errors)
|
||||||
endif ()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
endmacro()
|
endmacro()
|
||||||
|
|
||||||
# Include our configuration header
|
# Include our configuration header
|
||||||
INCLUDE_DIRECTORIES( ${jsoncpp_SOURCE_DIR}/include )
|
include_directories( ${jsoncpp_SOURCE_DIR}/include )
|
||||||
|
|
||||||
if ( MSVC )
|
if(MSVC)
|
||||||
# Only enabled in debug because some old versions of VS STL generate
|
# Only enabled in debug because some old versions of VS STL generate
|
||||||
# unreachable code warning when compiled in release configuration.
|
# unreachable code warning when compiled in release configuration.
|
||||||
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /W4 ")
|
add_compile_options($<$<CONFIG:Debug>:/W4>)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
|
if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
|
||||||
# using regular Clang or AppleClang
|
# using regular Clang or AppleClang
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -Wconversion -Wshadow -Werror=conversion -Werror=sign-compare")
|
add_compile_options(-Wall -Wconversion -Wshadow -Werror=conversion -Werror=sign-compare)
|
||||||
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
|
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
|
||||||
# using GCC
|
# using GCC
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -Wconversion -Wshadow -Wextra")
|
add_compile_options(-Wall -Wconversion -Wshadow -Wextra)
|
||||||
# not yet ready for -Wsign-conversion
|
# not yet ready for -Wsign-conversion
|
||||||
|
|
||||||
if (JSONCPP_WITH_STRICT_ISO AND NOT JSONCPP_WITH_WARNING_AS_ERROR)
|
if(JSONCPP_WITH_STRICT_ISO)
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror=conversion -pedantic")
|
add_compile_options(-pedantic)
|
||||||
endif ()
|
endif()
|
||||||
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "Intel")
|
if(JSONCPP_WITH_WARNING_AS_ERROR)
|
||||||
# using Intel compiler
|
add_compile_options(-Werror=conversion)
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -Wconversion -Wshadow -Wextra -Werror=conversion")
|
endif()
|
||||||
|
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Intel")
|
||||||
|
# using Intel compiler
|
||||||
|
add_compile_options(-Wall -Wconversion -Wshadow -Wextra -Werror=conversion)
|
||||||
|
|
||||||
if (JSONCPP_WITH_STRICT_ISO AND NOT JSONCPP_WITH_WARNING_AS_ERROR)
|
if(JSONCPP_WITH_STRICT_ISO AND NOT JSONCPP_WITH_WARNING_AS_ERROR)
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic")
|
add_compile_options(-pedantic)
|
||||||
endif ()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
find_program(CCACHE_FOUND ccache)
|
find_program(CCACHE_FOUND ccache)
|
||||||
@@ -128,27 +148,39 @@ if(CCACHE_FOUND)
|
|||||||
set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache)
|
set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache)
|
||||||
endif(CCACHE_FOUND)
|
endif(CCACHE_FOUND)
|
||||||
|
|
||||||
IF(JSONCPP_WITH_WARNING_AS_ERROR)
|
if(JSONCPP_WITH_WARNING_AS_ERROR)
|
||||||
UseCompilationWarningAsError()
|
UseCompilationWarningAsError()
|
||||||
ENDIF()
|
endif()
|
||||||
|
|
||||||
IF(JSONCPP_WITH_PKGCONFIG_SUPPORT)
|
if(JSONCPP_WITH_PKGCONFIG_SUPPORT)
|
||||||
CONFIGURE_FILE(
|
configure_file(
|
||||||
"pkg-config/jsoncpp.pc.in"
|
"pkg-config/jsoncpp.pc.in"
|
||||||
"pkg-config/jsoncpp.pc"
|
"pkg-config/jsoncpp.pc"
|
||||||
@ONLY)
|
@ONLY)
|
||||||
INSTALL(FILES "${CMAKE_CURRENT_BINARY_DIR}/pkg-config/jsoncpp.pc"
|
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/pkg-config/jsoncpp.pc"
|
||||||
DESTINATION "${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}/pkgconfig")
|
DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
|
||||||
ENDIF()
|
endif()
|
||||||
|
|
||||||
IF(JSONCPP_WITH_CMAKE_PACKAGE)
|
if(JSONCPP_WITH_CMAKE_PACKAGE)
|
||||||
INSTALL(EXPORT jsoncpp
|
include (CMakePackageConfigHelpers)
|
||||||
DESTINATION ${PACKAGE_INSTALL_DIR}/jsoncpp
|
install(EXPORT jsoncpp
|
||||||
|
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/jsoncpp
|
||||||
FILE jsoncppConfig.cmake)
|
FILE jsoncppConfig.cmake)
|
||||||
ENDIF()
|
write_basic_package_version_file ("${CMAKE_CURRENT_BINARY_DIR}/jsoncppConfigVersion.cmake"
|
||||||
|
VERSION ${PROJECT_VERSION}
|
||||||
|
COMPATIBILITY SameMajorVersion)
|
||||||
|
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/jsoncppConfigVersion.cmake
|
||||||
|
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/jsoncpp)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(JSONCPP_WITH_TESTS)
|
||||||
|
enable_testing()
|
||||||
|
include(CTest)
|
||||||
|
endif()
|
||||||
|
|
||||||
# Build the different applications
|
# Build the different applications
|
||||||
ADD_SUBDIRECTORY( src )
|
add_subdirectory( src )
|
||||||
|
|
||||||
#install the includes
|
#install the includes
|
||||||
ADD_SUBDIRECTORY( include )
|
add_subdirectory( include )
|
||||||
|
|
||||||
|
145
CONTRIBUTING.md
Normal file
145
CONTRIBUTING.md
Normal file
@@ -0,0 +1,145 @@
|
|||||||
|
# Contributing to JsonCpp
|
||||||
|
|
||||||
|
## Building
|
||||||
|
|
||||||
|
Both CMake and Meson tools are capable of generating a variety of build environments for you preferred development environment.
|
||||||
|
Using cmake or meson you can generate an XCode, Visual Studio, Unix Makefile, Ninja, or other environment that fits your needs.
|
||||||
|
|
||||||
|
An example of a common Meson/Ninja environment is described next.
|
||||||
|
|
||||||
|
## Building and testing with Meson/Ninja
|
||||||
|
Thanks to David Seifert (@SoapGentoo), we (the maintainers) now use
|
||||||
|
[meson](http://mesonbuild.com/) and [ninja](https://ninja-build.org/) to build
|
||||||
|
for debugging, as well as for continuous integration (see
|
||||||
|
[`./travis_scripts/meson_builder.sh`](./travis_scripts/meson_builder.sh) ). Other systems may work, but minor
|
||||||
|
things like version strings might break.
|
||||||
|
|
||||||
|
First, install both meson (which requires Python3) and ninja.
|
||||||
|
If you wish to install to a directory other than /usr/local, set an environment variable called DESTDIR with the desired path:
|
||||||
|
DESTDIR=/path/to/install/dir
|
||||||
|
|
||||||
|
Then,
|
||||||
|
|
||||||
|
cd jsoncpp/
|
||||||
|
BUILD_TYPE=debug
|
||||||
|
#BUILD_TYPE=release
|
||||||
|
LIB_TYPE=shared
|
||||||
|
#LIB_TYPE=static
|
||||||
|
meson --buildtype ${BUILD_TYPE} --default-library ${LIB_TYPE} . build-${LIB_TYPE}
|
||||||
|
#ninja -v -C build-${LIB_TYPE} test # This stopped working on my Mac.
|
||||||
|
ninja -v -C build-${LIB_TYPE}
|
||||||
|
cd build-${LIB_TYPE}
|
||||||
|
meson test --no-rebuild --print-errorlogs
|
||||||
|
sudo ninja install
|
||||||
|
|
||||||
|
## Building and testing with other build systems
|
||||||
|
See https://github.com/open-source-parsers/jsoncpp/wiki/Building
|
||||||
|
|
||||||
|
## Running the tests manually
|
||||||
|
|
||||||
|
You need to run tests manually only if you are troubleshooting an issue.
|
||||||
|
|
||||||
|
In the instructions below, replace `path/to/jsontest` with the path of the
|
||||||
|
`jsontest` executable that was compiled on your platform.
|
||||||
|
|
||||||
|
cd test
|
||||||
|
# This will run the Reader/Writer tests
|
||||||
|
python runjsontests.py path/to/jsontest
|
||||||
|
|
||||||
|
# This will run the Reader/Writer tests, using JSONChecker test suite
|
||||||
|
# (http://www.json.org/JSON_checker/).
|
||||||
|
# Notes: not all tests pass: JsonCpp is too lenient (for example,
|
||||||
|
# it allows an integer to start with '0'). The goal is to improve
|
||||||
|
# strict mode parsing to get all tests to pass.
|
||||||
|
python runjsontests.py --with-json-checker path/to/jsontest
|
||||||
|
|
||||||
|
# This will run the unit tests (mostly Value)
|
||||||
|
python rununittests.py path/to/test_lib_json
|
||||||
|
|
||||||
|
# You can run the tests using valgrind:
|
||||||
|
python rununittests.py --valgrind path/to/test_lib_json
|
||||||
|
|
||||||
|
## Building the documentation
|
||||||
|
|
||||||
|
Run the Python script `doxybuild.py` from the top directory:
|
||||||
|
|
||||||
|
python doxybuild.py --doxygen=$(which doxygen) --open --with-dot
|
||||||
|
|
||||||
|
See `doxybuild.py --help` for options.
|
||||||
|
|
||||||
|
## Adding a reader/writer test
|
||||||
|
|
||||||
|
To add a test, you need to create two files in test/data:
|
||||||
|
|
||||||
|
* a `TESTNAME.json` file, that contains the input document in JSON format.
|
||||||
|
* a `TESTNAME.expected` file, that contains a flatened representation of the
|
||||||
|
input document.
|
||||||
|
|
||||||
|
The `TESTNAME.expected` file format is as follows:
|
||||||
|
|
||||||
|
* Each line represents a JSON element of the element tree represented by the
|
||||||
|
input document.
|
||||||
|
* Each line has two parts: the path to access the element separated from the
|
||||||
|
element value by `=`. Array and object values are always empty (i.e.
|
||||||
|
represented by either `[]` or `{}`).
|
||||||
|
* Element path `.` represents the root element, and is used to separate object
|
||||||
|
members. `[N]` is used to specify the value of an array element at index `N`.
|
||||||
|
|
||||||
|
See the examples `test_complex_01.json` and `test_complex_01.expected` to better understand element paths.
|
||||||
|
|
||||||
|
## Understanding reader/writer test output
|
||||||
|
|
||||||
|
When a test is run, output files are generated beside the input test files. Below is a short description of the content of each file:
|
||||||
|
|
||||||
|
* `test_complex_01.json`: input JSON document.
|
||||||
|
* `test_complex_01.expected`: flattened JSON element tree used to check if
|
||||||
|
parsing was corrected.
|
||||||
|
* `test_complex_01.actual`: flattened JSON element tree produced by `jsontest`
|
||||||
|
from reading `test_complex_01.json`.
|
||||||
|
* `test_complex_01.rewrite`: JSON document written by `jsontest` using the
|
||||||
|
`Json::Value` parsed from `test_complex_01.json` and serialized using
|
||||||
|
`Json::StyledWritter`.
|
||||||
|
* `test_complex_01.actual-rewrite`: flattened JSON element tree produced by
|
||||||
|
`jsontest` from reading `test_complex_01.rewrite`.
|
||||||
|
* `test_complex_01.process-output`: `jsontest` output, typically useful for
|
||||||
|
understanding parsing errors.
|
||||||
|
|
||||||
|
## Versioning rules
|
||||||
|
|
||||||
|
Consumers of this library require a strict approach to incrementing versioning of the JsonCpp library. Currently, we follow the below set of rules:
|
||||||
|
|
||||||
|
* Any new public symbols require a minor version bump.
|
||||||
|
* Any alteration or removal of public symbols requires a major version bump, including changing the size of a class. This is necessary for
|
||||||
|
consumers to do dependency injection properly.
|
||||||
|
|
||||||
|
## Preparing code for submission
|
||||||
|
|
||||||
|
Generally, JsonCpp's style guide has been pretty relaxed, with the following common themes:
|
||||||
|
|
||||||
|
* Variables and function names use lower camel case (E.g. parseValue or collectComments).
|
||||||
|
* Class use camel case (e.g. OurReader)
|
||||||
|
* Member variables have a trailing underscore
|
||||||
|
* Prefer `nullptr` over `NULL`.
|
||||||
|
* Passing by non-const reference is allowed.
|
||||||
|
* Single statement if blocks may omit brackets.
|
||||||
|
* Generally prefer less space over more space.
|
||||||
|
|
||||||
|
For an example:
|
||||||
|
|
||||||
|
```c++
|
||||||
|
bool Reader::decodeNumber(Token& token) {
|
||||||
|
Value decoded;
|
||||||
|
if (!decodeNumber(token, decoded))
|
||||||
|
return false;
|
||||||
|
currentValue().swapPayload(decoded);
|
||||||
|
currentValue().setOffsetStart(token.start_ - begin_);
|
||||||
|
currentValue().setOffsetLimit(token.end_ - begin_);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Before submitting your code, ensure that you meet the versioning requirements above, follow the style guide of the file you are modifying (or the above rules for new files), and run clang format. Meson exposes clang format with the following command:
|
||||||
|
|
||||||
|
```
|
||||||
|
ninja -v -C build-${LIB_TYPE}/ clang-format
|
||||||
|
```
|
15
CTestConfig.cmake
Normal file
15
CTestConfig.cmake
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
## This file should be placed in the root directory of your project.
|
||||||
|
## Then modify the CMakeLists.txt file in the root directory of your
|
||||||
|
## project to incorporate the testing dashboard.
|
||||||
|
##
|
||||||
|
## # The following are required to submit to the CDash dashboard:
|
||||||
|
## ENABLE_TESTING()
|
||||||
|
## INCLUDE(CTest)
|
||||||
|
|
||||||
|
set(CTEST_PROJECT_NAME "jsoncpp")
|
||||||
|
set(CTEST_NIGHTLY_START_TIME "01:23:45 UTC")
|
||||||
|
|
||||||
|
set(CTEST_DROP_METHOD "https")
|
||||||
|
set(CTEST_DROP_SITE "my.cdash.org")
|
||||||
|
set(CTEST_DROP_LOCATION "/submit.php?project=jsoncpp")
|
||||||
|
set(CTEST_DROP_SITE_CDASH TRUE)
|
8
LICENSE
8
LICENSE
@@ -2,13 +2,13 @@ The JsonCpp library's source code, including accompanying documentation,
|
|||||||
tests and demonstration applications, are licensed under the following
|
tests and demonstration applications, are licensed under the following
|
||||||
conditions...
|
conditions...
|
||||||
|
|
||||||
The author (Baptiste Lepilleur) explicitly disclaims copyright in all
|
Baptiste Lepilleur and The JsonCpp Authors explicitly disclaim copyright in all
|
||||||
jurisdictions which recognize such a disclaimer. In such jurisdictions,
|
jurisdictions which recognize such a disclaimer. In such jurisdictions,
|
||||||
this software is released into the Public Domain.
|
this software is released into the Public Domain.
|
||||||
|
|
||||||
In jurisdictions which do not recognize Public Domain property (e.g. Germany as of
|
In jurisdictions which do not recognize Public Domain property (e.g. Germany as of
|
||||||
2010), this software is Copyright (c) 2007-2010 by Baptiste Lepilleur, and is
|
2010), this software is Copyright (c) 2007-2010 by Baptiste Lepilleur and
|
||||||
released under the terms of the MIT License (see below).
|
The JsonCpp Authors, and is released under the terms of the MIT License (see below).
|
||||||
|
|
||||||
In jurisdictions which recognize Public Domain property, the user of this
|
In jurisdictions which recognize Public Domain property, the user of this
|
||||||
software may choose to accept it either as 1) Public Domain, 2) under the
|
software may choose to accept it either as 1) Public Domain, 2) under the
|
||||||
@@ -23,7 +23,7 @@ described in clear, concise terms at:
|
|||||||
The full text of the MIT License follows:
|
The full text of the MIT License follows:
|
||||||
|
|
||||||
========================================================================
|
========================================================================
|
||||||
Copyright (c) 2007-2010 Baptiste Lepilleur
|
Copyright (c) 2007-2010 Baptiste Lepilleur and The JsonCpp Authors
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person
|
Permission is hereby granted, free of charge, to any person
|
||||||
obtaining a copy of this software and associated documentation
|
obtaining a copy of this software and associated documentation
|
||||||
|
175
NEWS.txt
175
NEWS.txt
@@ -1,175 +0,0 @@
|
|||||||
New in SVN
|
|
||||||
----------
|
|
||||||
|
|
||||||
* Updated the type system's behavior, in order to better support backwards
|
|
||||||
compatibility with code that was written before 64-bit integer support was
|
|
||||||
introduced. Here's how it works now:
|
|
||||||
|
|
||||||
* isInt, isInt64, isUInt, and isUInt64 return true if and only if the
|
|
||||||
value can be exactly represented as that type. In particular, a value
|
|
||||||
constructed with a double like 17.0 will now return true for all of
|
|
||||||
these methods.
|
|
||||||
|
|
||||||
* isDouble and isFloat now return true for all numeric values, since all
|
|
||||||
numeric values can be converted to a double or float without
|
|
||||||
truncation. Note however that the conversion may not be exact -- for
|
|
||||||
example, doubles cannot exactly represent all integers above 2^53 + 1.
|
|
||||||
|
|
||||||
* isBool, isNull, isString, isArray, and isObject now return true if and
|
|
||||||
only if the value is of that type.
|
|
||||||
|
|
||||||
* isConvertibleTo(fooValue) indicates that it is safe to call asFoo.
|
|
||||||
(For each type foo, isFoo always implies isConvertibleTo(fooValue).)
|
|
||||||
asFoo returns an approximate or exact representation as appropriate.
|
|
||||||
For example, a double value may be truncated when asInt is called.
|
|
||||||
|
|
||||||
* For backwards compatibility with old code, isConvertibleTo(intValue)
|
|
||||||
may return false even if type() == intValue. This is because the value
|
|
||||||
may have been constructed with a 64-bit integer larger than maxInt,
|
|
||||||
and calling asInt() would cause an exception. If you're writing new
|
|
||||||
code, use isInt64 to find out whether the value is exactly
|
|
||||||
representable using an Int64, or asDouble() combined with minInt64 and
|
|
||||||
maxInt64 to figure out whether it is approximately representable.
|
|
||||||
|
|
||||||
* Value
|
|
||||||
- Patch #10: BOOST_FOREACH compatibility. Made Json::iterator more
|
|
||||||
standard compliant, added missing iterator_category and value_type
|
|
||||||
typedefs (contribued by Robert A. Iannucci).
|
|
||||||
|
|
||||||
* Compilation
|
|
||||||
|
|
||||||
- New CMake based build system. Based in part on contribution from
|
|
||||||
Igor Okulist and Damien Buhl (Patch #14).
|
|
||||||
|
|
||||||
- New header json/version.h now contains version number macros
|
|
||||||
(JSONCPP_VERSION_MAJOR, JSONCPP_VERSION_MINOR, JSONCPP_VERSION_PATCH
|
|
||||||
and JSONCPP_VERSION_HEXA).
|
|
||||||
|
|
||||||
- Patch #11: added missing JSON_API on some classes causing link issues
|
|
||||||
when building as a dynamic library on Windows
|
|
||||||
(contributed by Francis Bolduc).
|
|
||||||
|
|
||||||
- Visual Studio DLL: suppressed warning "C4251: <data member>: <type>
|
|
||||||
needs to have dll-interface to be used by..." via pragma push/pop
|
|
||||||
in json-cpp headers.
|
|
||||||
|
|
||||||
- Added Travis CI intregration: https://travis-ci.org/blep/jsoncpp-mirror
|
|
||||||
|
|
||||||
* Bug fixes
|
|
||||||
- Patch #15: Copy constructor does not initialize allocated_ for stringValue
|
|
||||||
(contributed by rmongia).
|
|
||||||
|
|
||||||
- Patch #16: Missing field copy in Json::Value::iterator causing infinite
|
|
||||||
loop when using experimental internal map (#define JSON_VALUE_USE_INTERNAL_MAP)
|
|
||||||
(contributed by Ming-Lin Kao).
|
|
||||||
|
|
||||||
|
|
||||||
New in JsonCpp 0.6.0:
|
|
||||||
---------------------
|
|
||||||
|
|
||||||
* Compilation
|
|
||||||
|
|
||||||
- LD_LIBRARY_PATH and LIBRARY_PATH environment variables are now
|
|
||||||
propagated to the build environment as this is required for some
|
|
||||||
compiler installation.
|
|
||||||
|
|
||||||
- Added support for Microsoft Visual Studio 2008 (bug #2930462):
|
|
||||||
The platform "msvc90" has been added.
|
|
||||||
|
|
||||||
Notes: you need to setup the environment by running vcvars32.bat
|
|
||||||
(e.g. MSVC 2008 command prompt in start menu) before running scons.
|
|
||||||
|
|
||||||
- Added support for amalgamated source and header generation (a la sqlite).
|
|
||||||
Refer to README.md section "Generating amalgamated source and header"
|
|
||||||
for detail.
|
|
||||||
|
|
||||||
* Value
|
|
||||||
|
|
||||||
- Removed experimental ValueAllocator, it caused static
|
|
||||||
initialization/destruction order issues (bug #2934500).
|
|
||||||
The DefaultValueAllocator has been inlined in code.
|
|
||||||
|
|
||||||
- Added support for 64 bits integer:
|
|
||||||
|
|
||||||
Types Json::Int64 and Json::UInt64 have been added. They are aliased
|
|
||||||
to 64 bits integers on system that support them (based on __int64 on
|
|
||||||
Microsoft Visual Studio platform, and long long on other platforms).
|
|
||||||
|
|
||||||
Types Json::LargestInt and Json::LargestUInt have been added. They are
|
|
||||||
aliased to the largest integer type supported:
|
|
||||||
either Json::Int/Json::UInt or Json::Int64/Json::UInt64 respectively.
|
|
||||||
|
|
||||||
Json::Value::asInt() and Json::Value::asUInt() still returns plain
|
|
||||||
"int" based types, but asserts if an attempt is made to retrieve
|
|
||||||
a 64 bits value that can not represented as the return type.
|
|
||||||
|
|
||||||
Json::Value::asInt64() and Json::Value::asUInt64() have been added
|
|
||||||
to obtain the 64 bits integer value.
|
|
||||||
|
|
||||||
Json::Value::asLargestInt() and Json::Value::asLargestUInt() returns
|
|
||||||
the integer as a LargestInt/LargestUInt respectively. Those functions
|
|
||||||
functions are typically used when implementing writer.
|
|
||||||
|
|
||||||
The reader attempts to read number as 64 bits integer, and fall back
|
|
||||||
to reading a double if the number is not in the range of 64 bits
|
|
||||||
integer.
|
|
||||||
|
|
||||||
Warning: Json::Value::asInt() and Json::Value::asUInt() now returns
|
|
||||||
long long. This changes break code that was passing the return value
|
|
||||||
to *printf() function.
|
|
||||||
|
|
||||||
Support for 64 bits integer can be disabled by defining the macro
|
|
||||||
JSON_NO_INT64 (uncomment it in json/config.h for example), though
|
|
||||||
it should have no impact on existing usage.
|
|
||||||
|
|
||||||
- The type Json::ArrayIndex is used for indexes of a JSON value array. It
|
|
||||||
is an unsigned int (typically 32 bits).
|
|
||||||
|
|
||||||
- Array index can be passed as int to operator[], allowing use of literal:
|
|
||||||
Json::Value array;
|
|
||||||
array.append( 1234 );
|
|
||||||
int value = array[0].asInt(); // did not compile previously
|
|
||||||
|
|
||||||
- Added float Json::Value::asFloat() to obtain a floating point value as a
|
|
||||||
float (avoid lost of precision warning caused by used of asDouble()
|
|
||||||
to initialize a float).
|
|
||||||
|
|
||||||
* Reader
|
|
||||||
|
|
||||||
- Renamed Reader::getFormatedErrorMessages() to getFormattedErrorMessages.
|
|
||||||
Bug #3023708 (Formatted has 2 't'). The old member function is deprecated
|
|
||||||
but still present for backward compatibility.
|
|
||||||
|
|
||||||
* Tests
|
|
||||||
|
|
||||||
- Added test to ensure that the escape sequence "\/" is corrected handled
|
|
||||||
by the parser.
|
|
||||||
|
|
||||||
* Bug fixes
|
|
||||||
|
|
||||||
- Bug #3139677: JSON [1 2 3] was incorrectly parsed as [1, 3]. Error is now
|
|
||||||
correctly detected.
|
|
||||||
|
|
||||||
- Bug #3139678: stack buffer overflow when parsing a double with a
|
|
||||||
length of 32 characters.
|
|
||||||
|
|
||||||
- Fixed Value::operator <= implementation (had the semantic of operator >=).
|
|
||||||
Found when adding unit tests for comparison operators.
|
|
||||||
|
|
||||||
- Value::compare() is now const and has an actual implementation with
|
|
||||||
unit tests.
|
|
||||||
|
|
||||||
- Bug #2407932: strpbrk() can fail for NULL pointer.
|
|
||||||
|
|
||||||
- Bug #3306345: Fixed minor typo in Path::resolve().
|
|
||||||
|
|
||||||
- Bug #3314841/#3306896: errors in amalgamate.py
|
|
||||||
|
|
||||||
- Fixed some Coverity warnings and line-endings.
|
|
||||||
|
|
||||||
* License
|
|
||||||
|
|
||||||
- See file LICENSE for details. Basically JsonCpp is now licensed under
|
|
||||||
MIT license, or public domain if desired and recognized in your jurisdiction.
|
|
||||||
Thanks to Stephan G. Beal [http://wanderinghorse.net/home/stephan/]) who
|
|
||||||
helped figuring out the solution to the public domain issue.
|
|
210
README.md
210
README.md
@@ -1,5 +1,6 @@
|
|||||||
Introduction
|
# JsonCpp
|
||||||
------------
|
|
||||||
|
[](https://bintray.com/theirix/conan-repo/jsoncpp%3Atheirix)
|
||||||
|
|
||||||
[JSON][json-org] is a lightweight data-interchange format. It can represent
|
[JSON][json-org] is a lightweight data-interchange format. It can represent
|
||||||
numbers, strings, ordered sequences of values, and collections of name/value
|
numbers, strings, ordered sequences of values, and collections of name/value
|
||||||
@@ -7,208 +8,39 @@ pairs.
|
|||||||
|
|
||||||
[json-org]: http://json.org/
|
[json-org]: http://json.org/
|
||||||
|
|
||||||
[JsonCpp][] is a C++ library that allows manipulating JSON values, including
|
JsonCpp is a C++ library that allows manipulating JSON values, including
|
||||||
serialization and deserialization to and from strings. It can also preserve
|
serialization and deserialization to and from strings. It can also preserve
|
||||||
existing comment in unserialization/serialization steps, making it a convenient
|
existing comment in unserialization/serialization steps, making it a convenient
|
||||||
format to store user input files.
|
format to store user input files.
|
||||||
|
|
||||||
[JsonCpp]: http://open-source-parsers.github.io/jsoncpp-docs/doxygen/index.html
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
[JsonCpp documentation][JsonCpp-documentation] is generated using [Doxygen][].
|
||||||
|
|
||||||
|
[JsonCpp-documentation]: http://open-source-parsers.github.io/jsoncpp-docs/doxygen/index.html
|
||||||
|
[Doxygen]: http://www.doxygen.org
|
||||||
|
|
||||||
|
|
||||||
## A note on backward-compatibility
|
## A note on backward-compatibility
|
||||||
|
|
||||||
* `1.y.z` is built with C++11.
|
* `1.y.z` is built with C++11.
|
||||||
* `0.y.z` can be used with older compilers.
|
* `0.y.z` can be used with older compilers.
|
||||||
* Major versions maintain binary-compatibility.
|
* Major versions maintain binary-compatibility.
|
||||||
|
|
||||||
# Using JsonCpp in your project
|
|
||||||
-----------------------------
|
|
||||||
The recommended approach to integrating JsonCpp in your project is to include
|
|
||||||
the [amalgamated source](#generating-amalgamated-source-and-header) (a single
|
|
||||||
`.cpp` file and two `.h` files) in your project, and compile and build as you
|
|
||||||
would any other source file. This ensures consistency of compilation flags and
|
|
||||||
ABI compatibility, issues which arise when building shared or static
|
|
||||||
libraries. See the next section for instructions.
|
|
||||||
|
|
||||||
The `include/` should be added to your compiler include path. Jsoncpp headers
|
|
||||||
should be included as follow:
|
|
||||||
|
|
||||||
#include <json/json.h>
|
## Using JsonCpp in your project
|
||||||
|
|
||||||
If JsonCpp was built as a dynamic library on Windows, then your project needs to
|
### Amalgamated source
|
||||||
define the macro `JSON_DLL`.
|
https://github.com/open-source-parsers/jsoncpp/wiki/Amalgamated
|
||||||
|
|
||||||
Generating amalgamated source and header
|
### The Meson Build System
|
||||||
----------------------------------------
|
If you are using the [Meson Build System](http://mesonbuild.com), then you can get a wrap file by downloading it from [Meson WrapDB](https://wrapdb.mesonbuild.com/jsoncpp), or simply use `meson wrap install jsoncpp`.
|
||||||
JsonCpp is provided with a script to generate a single header and a single
|
|
||||||
source file to ease inclusion into an existing project. The amalgamated source
|
|
||||||
can be generated at any time by running the following command from the
|
|
||||||
top-directory (this requires Python 2.6):
|
|
||||||
|
|
||||||
python amalgamate.py
|
### Other ways
|
||||||
|
If you have trouble, see the Wiki, or post a question as an Issue.
|
||||||
|
|
||||||
It is possible to specify header name. See the `-h` option for detail.
|
## License
|
||||||
|
|
||||||
By default, the following files are generated:
|
|
||||||
* `dist/jsoncpp.cpp`: source file that needs to be added to your project.
|
|
||||||
* `dist/json/json.h`: corresponding header file for use in your project. It is
|
|
||||||
equivalent to including `json/json.h` in non-amalgamated source. This header
|
|
||||||
only depends on standard headers.
|
|
||||||
* `dist/json/json-forwards.h`: header that provides forward declaration of all
|
|
||||||
JsonCpp types.
|
|
||||||
|
|
||||||
The amalgamated sources are generated by concatenating JsonCpp source in the
|
|
||||||
correct order and defining the macro `JSON_IS_AMALGAMATION` to prevent inclusion
|
|
||||||
of other headers.
|
|
||||||
|
|
||||||
# Contributing to JsonCpp
|
|
||||||
|
|
||||||
Building and testing with CMake
|
|
||||||
-------------------------------
|
|
||||||
[CMake][] is a C++ Makefiles/Solution generator. It is usually available on most
|
|
||||||
Linux system as package. On Ubuntu:
|
|
||||||
|
|
||||||
sudo apt-get install cmake
|
|
||||||
|
|
||||||
[CMake]: http://www.cmake.org
|
|
||||||
|
|
||||||
Note that Python is also required to run the JSON reader/writer tests. If
|
|
||||||
missing, the build will skip running those tests.
|
|
||||||
|
|
||||||
When running CMake, a few parameters are required:
|
|
||||||
|
|
||||||
* a build directory where the makefiles/solution are generated. It is also used
|
|
||||||
to store objects, libraries and executables files.
|
|
||||||
* the generator to use: makefiles or Visual Studio solution? What version or
|
|
||||||
Visual Studio, 32 or 64 bits solution?
|
|
||||||
|
|
||||||
Steps for generating solution/makefiles using `cmake-gui`:
|
|
||||||
|
|
||||||
* Make "source code" point to the source directory.
|
|
||||||
* Make "where to build the binary" point to the directory to use for the build.
|
|
||||||
* Click on the "Grouped" check box.
|
|
||||||
* Review JsonCpp build options (tick `BUILD_SHARED_LIBS` to build as a
|
|
||||||
dynamic library).
|
|
||||||
* Click the configure button at the bottom, then the generate button.
|
|
||||||
* The generated solution/makefiles can be found in the binary directory.
|
|
||||||
|
|
||||||
Alternatively, from the command-line on Unix in the source directory:
|
|
||||||
|
|
||||||
mkdir -p build/debug
|
|
||||||
cd build/debug
|
|
||||||
cmake -DCMAKE_BUILD_TYPE=debug -DBUILD_STATIC_LIBS=ON -DBUILD_SHARED_LIBS=OFF -DARCHIVE_INSTALL_DIR=. -G "Unix Makefiles" ../..
|
|
||||||
make
|
|
||||||
|
|
||||||
Running `cmake -h` will display the list of available generators (passed using
|
|
||||||
the `-G` option).
|
|
||||||
|
|
||||||
By default CMake hides compilation commands. This can be modified by specifying
|
|
||||||
`-DCMAKE_VERBOSE_MAKEFILE=true` when generating makefiles.
|
|
||||||
|
|
||||||
Building and testing with SCons
|
|
||||||
-------------------------------
|
|
||||||
**Note:** The SCons-based build system is deprecated. Please use CMake; see the
|
|
||||||
section above.
|
|
||||||
|
|
||||||
JsonCpp can use [Scons][] as a build system. Note that SCons requires Python to
|
|
||||||
be installed.
|
|
||||||
|
|
||||||
[SCons]: http://www.scons.org/
|
|
||||||
|
|
||||||
Invoke SCons as follows:
|
|
||||||
|
|
||||||
scons platform=$PLATFORM [TARGET]
|
|
||||||
|
|
||||||
where `$PLATFORM` may be one of:
|
|
||||||
|
|
||||||
* `suncc`: Sun C++ (Solaris)
|
|
||||||
* `vacpp`: Visual Age C++ (AIX)
|
|
||||||
* `mingw`
|
|
||||||
* `msvc6`: Microsoft Visual Studio 6 service pack 5-6
|
|
||||||
* `msvc70`: Microsoft Visual Studio 2002
|
|
||||||
* `msvc71`: Microsoft Visual Studio 2003
|
|
||||||
* `msvc80`: Microsoft Visual Studio 2005
|
|
||||||
* `msvc90`: Microsoft Visual Studio 2008
|
|
||||||
* `linux-gcc`: Gnu C++ (linux, also reported to work for Mac OS X)
|
|
||||||
|
|
||||||
If you are building with Microsoft Visual Studio 2008, you need to set up the
|
|
||||||
environment by running `vcvars32.bat` (e.g. MSVC 2008 command prompt) before
|
|
||||||
running SCons.
|
|
||||||
|
|
||||||
## Running the tests manually
|
|
||||||
You need to run tests manually only if you are troubleshooting an issue.
|
|
||||||
|
|
||||||
In the instructions below, replace `path/to/jsontest` with the path of the
|
|
||||||
`jsontest` executable that was compiled on your platform.
|
|
||||||
|
|
||||||
cd test
|
|
||||||
# This will run the Reader/Writer tests
|
|
||||||
python runjsontests.py path/to/jsontest
|
|
||||||
|
|
||||||
# This will run the Reader/Writer tests, using JSONChecker test suite
|
|
||||||
# (http://www.json.org/JSON_checker/).
|
|
||||||
# Notes: not all tests pass: JsonCpp is too lenient (for example,
|
|
||||||
# it allows an integer to start with '0'). The goal is to improve
|
|
||||||
# strict mode parsing to get all tests to pass.
|
|
||||||
python runjsontests.py --with-json-checker path/to/jsontest
|
|
||||||
|
|
||||||
# This will run the unit tests (mostly Value)
|
|
||||||
python rununittests.py path/to/test_lib_json
|
|
||||||
|
|
||||||
# You can run the tests using valgrind:
|
|
||||||
python rununittests.py --valgrind path/to/test_lib_json
|
|
||||||
|
|
||||||
## Running the tests using scons
|
|
||||||
Note that tests can be run using SCons using the `check` target:
|
|
||||||
|
|
||||||
scons platform=$PLATFORM check
|
|
||||||
|
|
||||||
Building the documentation
|
|
||||||
--------------------------
|
|
||||||
Run the Python script `doxybuild.py` from the top directory:
|
|
||||||
|
|
||||||
python doxybuild.py --doxygen=$(which doxygen) --open --with-dot
|
|
||||||
|
|
||||||
See `doxybuild.py --help` for options.
|
|
||||||
|
|
||||||
Adding a reader/writer test
|
|
||||||
---------------------------
|
|
||||||
To add a test, you need to create two files in test/data:
|
|
||||||
|
|
||||||
* a `TESTNAME.json` file, that contains the input document in JSON format.
|
|
||||||
* a `TESTNAME.expected` file, that contains a flatened representation of the
|
|
||||||
input document.
|
|
||||||
|
|
||||||
The `TESTNAME.expected` file format is as follows:
|
|
||||||
|
|
||||||
* each line represents a JSON element of the element tree represented by the
|
|
||||||
input document.
|
|
||||||
* each line has two parts: the path to access the element separated from the
|
|
||||||
element value by `=`. Array and object values are always empty (i.e.
|
|
||||||
represented by either `[]` or `{}`).
|
|
||||||
* element path: `.` represents the root element, and is used to separate object
|
|
||||||
members. `[N]` is used to specify the value of an array element at index `N`.
|
|
||||||
|
|
||||||
See the examples `test_complex_01.json` and `test_complex_01.expected` to better
|
|
||||||
understand element paths.
|
|
||||||
|
|
||||||
Understanding reader/writer test output
|
|
||||||
---------------------------------------
|
|
||||||
When a test is run, output files are generated beside the input test files.
|
|
||||||
Below is a short description of the content of each file:
|
|
||||||
|
|
||||||
* `test_complex_01.json`: input JSON document.
|
|
||||||
* `test_complex_01.expected`: flattened JSON element tree used to check if
|
|
||||||
parsing was corrected.
|
|
||||||
* `test_complex_01.actual`: flattened JSON element tree produced by `jsontest`
|
|
||||||
from reading `test_complex_01.json`.
|
|
||||||
* `test_complex_01.rewrite`: JSON document written by `jsontest` using the
|
|
||||||
`Json::Value` parsed from `test_complex_01.json` and serialized using
|
|
||||||
`Json::StyledWritter`.
|
|
||||||
* `test_complex_01.actual-rewrite`: flattened JSON element tree produced by
|
|
||||||
`jsontest` from reading `test_complex_01.rewrite`.
|
|
||||||
* `test_complex_01.process-output`: `jsontest` output, typically useful for
|
|
||||||
understanding parsing errors.
|
|
||||||
|
|
||||||
License
|
|
||||||
-------
|
|
||||||
See the `LICENSE` file for details. In summary, JsonCpp is licensed under the
|
See the `LICENSE` file for details. In summary, JsonCpp is licensed under the
|
||||||
MIT license, or public domain if desired and recognized in your jurisdiction.
|
MIT license, or public domain if desired and recognized in your jurisdiction.
|
||||||
|
248
SConstruct
248
SConstruct
@@ -1,248 +0,0 @@
|
|||||||
"""
|
|
||||||
Notes:
|
|
||||||
- shared library support is buggy: it assumes that a static and dynamic library can be build from the same object files. This is not true on many platforms. For this reason it is only enabled on linux-gcc at the current time.
|
|
||||||
|
|
||||||
To add a platform:
|
|
||||||
- add its name in options allowed_values below
|
|
||||||
- add tool initialization for this platform. Search for "if platform == 'suncc'" as an example.
|
|
||||||
"""
|
|
||||||
|
|
||||||
import os
|
|
||||||
import os.path
|
|
||||||
import sys
|
|
||||||
|
|
||||||
JSONCPP_VERSION = open(File('#version').abspath,'rt').read().strip()
|
|
||||||
DIST_DIR = '#dist'
|
|
||||||
|
|
||||||
options = Variables()
|
|
||||||
options.Add( EnumVariable('platform',
|
|
||||||
'Platform (compiler/stl) used to build the project',
|
|
||||||
'msvc71',
|
|
||||||
allowed_values='suncc vacpp mingw msvc6 msvc7 msvc71 msvc80 msvc90 linux-gcc'.split(),
|
|
||||||
ignorecase=2) )
|
|
||||||
|
|
||||||
try:
|
|
||||||
platform = ARGUMENTS['platform']
|
|
||||||
if platform == 'linux-gcc':
|
|
||||||
CXX = 'g++' # not quite right, but env is not yet available.
|
|
||||||
import commands
|
|
||||||
version = commands.getoutput('%s -dumpversion' %CXX)
|
|
||||||
platform = 'linux-gcc-%s' %version
|
|
||||||
print "Using platform '%s'" %platform
|
|
||||||
LD_LIBRARY_PATH = os.environ.get('LD_LIBRARY_PATH', '')
|
|
||||||
LD_LIBRARY_PATH = "%s:libs/%s" %(LD_LIBRARY_PATH, platform)
|
|
||||||
os.environ['LD_LIBRARY_PATH'] = LD_LIBRARY_PATH
|
|
||||||
print "LD_LIBRARY_PATH =", LD_LIBRARY_PATH
|
|
||||||
except KeyError:
|
|
||||||
print 'You must specify a "platform"'
|
|
||||||
sys.exit(2)
|
|
||||||
|
|
||||||
print "Building using PLATFORM =", platform
|
|
||||||
|
|
||||||
rootbuild_dir = Dir('#buildscons')
|
|
||||||
build_dir = os.path.join( '#buildscons', platform )
|
|
||||||
bin_dir = os.path.join( '#bin', platform )
|
|
||||||
lib_dir = os.path.join( '#libs', platform )
|
|
||||||
sconsign_dir_path = Dir(build_dir).abspath
|
|
||||||
sconsign_path = os.path.join( sconsign_dir_path, '.sconsign.dbm' )
|
|
||||||
|
|
||||||
# Ensure build directory exist (SConsignFile fail otherwise!)
|
|
||||||
if not os.path.exists( sconsign_dir_path ):
|
|
||||||
os.makedirs( sconsign_dir_path )
|
|
||||||
|
|
||||||
# Store all dependencies signature in a database
|
|
||||||
SConsignFile( sconsign_path )
|
|
||||||
|
|
||||||
def make_environ_vars():
|
|
||||||
"""Returns a dictionnary with environment variable to use when compiling."""
|
|
||||||
# PATH is required to find the compiler
|
|
||||||
# TEMP is required for at least mingw
|
|
||||||
# LD_LIBRARY_PATH & co is required on some system for the compiler
|
|
||||||
vars = {}
|
|
||||||
for name in ('PATH', 'TEMP', 'TMP', 'LD_LIBRARY_PATH', 'LIBRARY_PATH'):
|
|
||||||
if name in os.environ:
|
|
||||||
vars[name] = os.environ[name]
|
|
||||||
return vars
|
|
||||||
|
|
||||||
|
|
||||||
env = Environment( ENV = make_environ_vars(),
|
|
||||||
toolpath = ['scons-tools'],
|
|
||||||
tools=[] ) #, tools=['default'] )
|
|
||||||
|
|
||||||
if platform == 'suncc':
|
|
||||||
env.Tool( 'sunc++' )
|
|
||||||
env.Tool( 'sunlink' )
|
|
||||||
env.Tool( 'sunar' )
|
|
||||||
env.Append( CCFLAGS = ['-mt'] )
|
|
||||||
elif platform == 'vacpp':
|
|
||||||
env.Tool( 'default' )
|
|
||||||
env.Tool( 'aixcc' )
|
|
||||||
env['CXX'] = 'xlC_r' #scons does not pick-up the correct one !
|
|
||||||
# using xlC_r ensure multi-threading is enabled:
|
|
||||||
# http://publib.boulder.ibm.com/infocenter/pseries/index.jsp?topic=/com.ibm.vacpp7a.doc/compiler/ref/cuselect.htm
|
|
||||||
env.Append( CCFLAGS = '-qrtti=all',
|
|
||||||
LINKFLAGS='-bh:5' ) # -bh:5 remove duplicate symbol warning
|
|
||||||
elif platform == 'msvc6':
|
|
||||||
env['MSVS_VERSION']='6.0'
|
|
||||||
for tool in ['msvc', 'msvs', 'mslink', 'masm', 'mslib']:
|
|
||||||
env.Tool( tool )
|
|
||||||
env['CXXFLAGS']='-GR -GX /nologo /MT'
|
|
||||||
elif platform == 'msvc70':
|
|
||||||
env['MSVS_VERSION']='7.0'
|
|
||||||
for tool in ['msvc', 'msvs', 'mslink', 'masm', 'mslib']:
|
|
||||||
env.Tool( tool )
|
|
||||||
env['CXXFLAGS']='-GR -GX /nologo /MT'
|
|
||||||
elif platform == 'msvc71':
|
|
||||||
env['MSVS_VERSION']='7.1'
|
|
||||||
for tool in ['msvc', 'msvs', 'mslink', 'masm', 'mslib']:
|
|
||||||
env.Tool( tool )
|
|
||||||
env['CXXFLAGS']='-GR -GX /nologo /MT'
|
|
||||||
elif platform == 'msvc80':
|
|
||||||
env['MSVS_VERSION']='8.0'
|
|
||||||
for tool in ['msvc', 'msvs', 'mslink', 'masm', 'mslib']:
|
|
||||||
env.Tool( tool )
|
|
||||||
env['CXXFLAGS']='-GR -EHsc /nologo /MT'
|
|
||||||
elif platform == 'msvc90':
|
|
||||||
env['MSVS_VERSION']='9.0'
|
|
||||||
# Scons 1.2 fails to detect the correct location of the platform SDK.
|
|
||||||
# So we propagate those from the environment. This requires that the
|
|
||||||
# user run vcvars32.bat before compiling.
|
|
||||||
if 'INCLUDE' in os.environ:
|
|
||||||
env['ENV']['INCLUDE'] = os.environ['INCLUDE']
|
|
||||||
if 'LIB' in os.environ:
|
|
||||||
env['ENV']['LIB'] = os.environ['LIB']
|
|
||||||
for tool in ['msvc', 'msvs', 'mslink', 'masm', 'mslib']:
|
|
||||||
env.Tool( tool )
|
|
||||||
env['CXXFLAGS']='-GR -EHsc /nologo /MT'
|
|
||||||
elif platform == 'mingw':
|
|
||||||
env.Tool( 'mingw' )
|
|
||||||
env.Append( CPPDEFINES=[ "WIN32", "NDEBUG", "_MT" ] )
|
|
||||||
elif platform.startswith('linux-gcc'):
|
|
||||||
env.Tool( 'default' )
|
|
||||||
env.Append( LIBS = ['pthread'], CCFLAGS = os.environ.get("CXXFLAGS", "-Wall"), LINKFLAGS=os.environ.get("LDFLAGS", "") )
|
|
||||||
env['SHARED_LIB_ENABLED'] = True
|
|
||||||
else:
|
|
||||||
print "UNSUPPORTED PLATFORM."
|
|
||||||
env.Exit(1)
|
|
||||||
|
|
||||||
env.Tool('targz')
|
|
||||||
env.Tool('srcdist')
|
|
||||||
env.Tool('globtool')
|
|
||||||
|
|
||||||
env.Append( CPPPATH = ['#include'],
|
|
||||||
LIBPATH = lib_dir )
|
|
||||||
short_platform = platform
|
|
||||||
if short_platform.startswith('msvc'):
|
|
||||||
short_platform = short_platform[2:]
|
|
||||||
# Notes: on Windows you need to rebuild the source for each variant
|
|
||||||
# Build script does not support that yet so we only build static libraries.
|
|
||||||
# This also fails on AIX because both dynamic and static library ends with
|
|
||||||
# extension .a.
|
|
||||||
env['SHARED_LIB_ENABLED'] = env.get('SHARED_LIB_ENABLED', False)
|
|
||||||
env['LIB_PLATFORM'] = short_platform
|
|
||||||
env['LIB_LINK_TYPE'] = 'lib' # static
|
|
||||||
env['LIB_CRUNTIME'] = 'mt'
|
|
||||||
env['LIB_NAME_SUFFIX'] = '${LIB_PLATFORM}_${LIB_LINK_TYPE}${LIB_CRUNTIME}' # must match autolink naming convention
|
|
||||||
env['JSONCPP_VERSION'] = JSONCPP_VERSION
|
|
||||||
env['BUILD_DIR'] = env.Dir(build_dir)
|
|
||||||
env['ROOTBUILD_DIR'] = env.Dir(rootbuild_dir)
|
|
||||||
env['DIST_DIR'] = DIST_DIR
|
|
||||||
if 'TarGz' in env['BUILDERS']:
|
|
||||||
class SrcDistAdder:
|
|
||||||
def __init__( self, env ):
|
|
||||||
self.env = env
|
|
||||||
def __call__( self, *args, **kw ):
|
|
||||||
apply( self.env.SrcDist, (self.env['SRCDIST_TARGET'],) + args, kw )
|
|
||||||
env['SRCDIST_BUILDER'] = env.TarGz
|
|
||||||
else: # If tarfile module is missing
|
|
||||||
class SrcDistAdder:
|
|
||||||
def __init__( self, env ):
|
|
||||||
pass
|
|
||||||
def __call__( self, *args, **kw ):
|
|
||||||
pass
|
|
||||||
env['SRCDIST_ADD'] = SrcDistAdder( env )
|
|
||||||
env['SRCDIST_TARGET'] = os.path.join( DIST_DIR, 'jsoncpp-src-%s.tar.gz' % env['JSONCPP_VERSION'] )
|
|
||||||
|
|
||||||
env_testing = env.Clone( )
|
|
||||||
env_testing.Append( LIBS = ['json_${LIB_NAME_SUFFIX}'] )
|
|
||||||
|
|
||||||
def buildJSONExample( env, target_sources, target_name ):
|
|
||||||
env = env.Clone()
|
|
||||||
env.Append( CPPPATH = ['#'] )
|
|
||||||
exe = env.Program( target=target_name,
|
|
||||||
source=target_sources )
|
|
||||||
env['SRCDIST_ADD']( source=[target_sources] )
|
|
||||||
global bin_dir
|
|
||||||
return env.Install( bin_dir, exe )
|
|
||||||
|
|
||||||
def buildJSONTests( env, target_sources, target_name ):
|
|
||||||
jsontests_node = buildJSONExample( env, target_sources, target_name )
|
|
||||||
check_alias_target = env.Alias( 'check', jsontests_node, RunJSONTests( jsontests_node, jsontests_node ) )
|
|
||||||
env.AlwaysBuild( check_alias_target )
|
|
||||||
|
|
||||||
def buildUnitTests( env, target_sources, target_name ):
|
|
||||||
jsontests_node = buildJSONExample( env, target_sources, target_name )
|
|
||||||
check_alias_target = env.Alias( 'check', jsontests_node,
|
|
||||||
RunUnitTests( jsontests_node, jsontests_node ) )
|
|
||||||
env.AlwaysBuild( check_alias_target )
|
|
||||||
|
|
||||||
def buildLibrary( env, target_sources, target_name ):
|
|
||||||
static_lib = env.StaticLibrary( target=target_name + '_${LIB_NAME_SUFFIX}',
|
|
||||||
source=target_sources )
|
|
||||||
global lib_dir
|
|
||||||
env.Install( lib_dir, static_lib )
|
|
||||||
if env['SHARED_LIB_ENABLED']:
|
|
||||||
shared_lib = env.SharedLibrary( target=target_name + '_${LIB_NAME_SUFFIX}',
|
|
||||||
source=target_sources )
|
|
||||||
env.Install( lib_dir, shared_lib )
|
|
||||||
env['SRCDIST_ADD']( source=[target_sources] )
|
|
||||||
|
|
||||||
Export( 'env env_testing buildJSONExample buildLibrary buildJSONTests buildUnitTests' )
|
|
||||||
|
|
||||||
def buildProjectInDirectory( target_directory ):
|
|
||||||
global build_dir
|
|
||||||
target_build_dir = os.path.join( build_dir, target_directory )
|
|
||||||
target = os.path.join( target_directory, 'sconscript' )
|
|
||||||
SConscript( target, build_dir=target_build_dir, duplicate=0 )
|
|
||||||
env['SRCDIST_ADD']( source=[target] )
|
|
||||||
|
|
||||||
|
|
||||||
def runJSONTests_action( target, source = None, env = None ):
|
|
||||||
# Add test scripts to python path
|
|
||||||
jsontest_path = Dir( '#test' ).abspath
|
|
||||||
sys.path.insert( 0, jsontest_path )
|
|
||||||
data_path = os.path.join( jsontest_path, 'data' )
|
|
||||||
import runjsontests
|
|
||||||
return runjsontests.runAllTests( os.path.abspath(source[0].path), data_path )
|
|
||||||
|
|
||||||
def runJSONTests_string( target, source = None, env = None ):
|
|
||||||
return 'RunJSONTests("%s")' % source[0]
|
|
||||||
|
|
||||||
import SCons.Action
|
|
||||||
ActionFactory = SCons.Action.ActionFactory
|
|
||||||
RunJSONTests = ActionFactory(runJSONTests_action, runJSONTests_string )
|
|
||||||
|
|
||||||
def runUnitTests_action( target, source = None, env = None ):
|
|
||||||
# Add test scripts to python path
|
|
||||||
jsontest_path = Dir( '#test' ).abspath
|
|
||||||
sys.path.insert( 0, jsontest_path )
|
|
||||||
import rununittests
|
|
||||||
return rununittests.runAllTests( os.path.abspath(source[0].path) )
|
|
||||||
|
|
||||||
def runUnitTests_string( target, source = None, env = None ):
|
|
||||||
return 'RunUnitTests("%s")' % source[0]
|
|
||||||
|
|
||||||
RunUnitTests = ActionFactory(runUnitTests_action, runUnitTests_string )
|
|
||||||
|
|
||||||
env.Alias( 'check' )
|
|
||||||
|
|
||||||
srcdist_cmd = env['SRCDIST_ADD']( source = """
|
|
||||||
AUTHORS README.md SConstruct
|
|
||||||
""".split() )
|
|
||||||
env.Alias( 'src-dist', srcdist_cmd )
|
|
||||||
|
|
||||||
buildProjectInDirectory( 'src/jsontestrunner' )
|
|
||||||
buildProjectInDirectory( 'src/lib_json' )
|
|
||||||
buildProjectInDirectory( 'src/test_lib_json' )
|
|
||||||
#print env.Dump()
|
|
||||||
|
|
@@ -1,9 +1,9 @@
|
|||||||
"""Amalgate json-cpp library sources into a single source and header file.
|
"""Amalgamate json-cpp library sources into a single source and header file.
|
||||||
|
|
||||||
Works with python2.6+ and python3.4+.
|
Works with python2.6+ and python3.4+.
|
||||||
|
|
||||||
Example of invocation (must be invoked from json-cpp top directory):
|
Example of invocation (must be invoked from json-cpp top directory):
|
||||||
python amalgate.py
|
python amalgamate.py
|
||||||
"""
|
"""
|
||||||
import os
|
import os
|
||||||
import os.path
|
import os.path
|
||||||
@@ -50,24 +50,24 @@ class AmalgamationFile:
|
|||||||
def amalgamate_source(source_top_dir=None,
|
def amalgamate_source(source_top_dir=None,
|
||||||
target_source_path=None,
|
target_source_path=None,
|
||||||
header_include_path=None):
|
header_include_path=None):
|
||||||
"""Produces amalgated source.
|
"""Produces amalgamated source.
|
||||||
Parameters:
|
Parameters:
|
||||||
source_top_dir: top-directory
|
source_top_dir: top-directory
|
||||||
target_source_path: output .cpp path
|
target_source_path: output .cpp path
|
||||||
header_include_path: generated header path relative to target_source_path.
|
header_include_path: generated header path relative to target_source_path.
|
||||||
"""
|
"""
|
||||||
print("Amalgating header...")
|
print("Amalgamating header...")
|
||||||
header = AmalgamationFile(source_top_dir)
|
header = AmalgamationFile(source_top_dir)
|
||||||
header.add_text("/// Json-cpp amalgated header (http://jsoncpp.sourceforge.net/).")
|
header.add_text("/// Json-cpp amalgamated header (http://jsoncpp.sourceforge.net/).")
|
||||||
header.add_text('/// It is intended to be used with #include "%s"' % header_include_path)
|
header.add_text('/// It is intended to be used with #include "%s"' % header_include_path)
|
||||||
header.add_file("LICENSE", wrap_in_comment=True)
|
header.add_file("LICENSE", wrap_in_comment=True)
|
||||||
header.add_text("#ifndef JSON_AMALGATED_H_INCLUDED")
|
header.add_text("#ifndef JSON_AMALGAMATED_H_INCLUDED")
|
||||||
header.add_text("# define JSON_AMALGATED_H_INCLUDED")
|
header.add_text("# define JSON_AMALGAMATED_H_INCLUDED")
|
||||||
header.add_text("/// If defined, indicates that the source file is amalgated")
|
header.add_text("/// If defined, indicates that the source file is amalgamated")
|
||||||
header.add_text("/// to prevent private header inclusion.")
|
header.add_text("/// to prevent private header inclusion.")
|
||||||
header.add_text("#define JSON_IS_AMALGAMATION")
|
header.add_text("#define JSON_IS_AMALGAMATION")
|
||||||
header.add_file("include/json/version.h")
|
header.add_file("include/json/version.h")
|
||||||
#header.add_file("include/json/allocator.h") # Not available here.
|
header.add_file("include/json/allocator.h")
|
||||||
header.add_file("include/json/config.h")
|
header.add_file("include/json/config.h")
|
||||||
header.add_file("include/json/forwards.h")
|
header.add_file("include/json/forwards.h")
|
||||||
header.add_file("include/json/features.h")
|
header.add_file("include/json/features.h")
|
||||||
@@ -75,37 +75,37 @@ def amalgamate_source(source_top_dir=None,
|
|||||||
header.add_file("include/json/reader.h")
|
header.add_file("include/json/reader.h")
|
||||||
header.add_file("include/json/writer.h")
|
header.add_file("include/json/writer.h")
|
||||||
header.add_file("include/json/assertions.h")
|
header.add_file("include/json/assertions.h")
|
||||||
header.add_text("#endif //ifndef JSON_AMALGATED_H_INCLUDED")
|
header.add_text("#endif //ifndef JSON_AMALGAMATED_H_INCLUDED")
|
||||||
|
|
||||||
target_header_path = os.path.join(os.path.dirname(target_source_path), header_include_path)
|
target_header_path = os.path.join(os.path.dirname(target_source_path), header_include_path)
|
||||||
print("Writing amalgated header to %r" % target_header_path)
|
print("Writing amalgamated header to %r" % target_header_path)
|
||||||
header.write_to(target_header_path)
|
header.write_to(target_header_path)
|
||||||
|
|
||||||
base, ext = os.path.splitext(header_include_path)
|
base, ext = os.path.splitext(header_include_path)
|
||||||
forward_header_include_path = base + "-forwards" + ext
|
forward_header_include_path = base + "-forwards" + ext
|
||||||
print("Amalgating forward header...")
|
print("Amalgamating forward header...")
|
||||||
header = AmalgamationFile(source_top_dir)
|
header = AmalgamationFile(source_top_dir)
|
||||||
header.add_text("/// Json-cpp amalgated forward header (http://jsoncpp.sourceforge.net/).")
|
header.add_text("/// Json-cpp amalgamated forward header (http://jsoncpp.sourceforge.net/).")
|
||||||
header.add_text('/// It is intended to be used with #include "%s"' % forward_header_include_path)
|
header.add_text('/// It is intended to be used with #include "%s"' % forward_header_include_path)
|
||||||
header.add_text("/// This header provides forward declaration for all JsonCpp types.")
|
header.add_text("/// This header provides forward declaration for all JsonCpp types.")
|
||||||
header.add_file("LICENSE", wrap_in_comment=True)
|
header.add_file("LICENSE", wrap_in_comment=True)
|
||||||
header.add_text("#ifndef JSON_FORWARD_AMALGATED_H_INCLUDED")
|
header.add_text("#ifndef JSON_FORWARD_AMALGAMATED_H_INCLUDED")
|
||||||
header.add_text("# define JSON_FORWARD_AMALGATED_H_INCLUDED")
|
header.add_text("# define JSON_FORWARD_AMALGAMATED_H_INCLUDED")
|
||||||
header.add_text("/// If defined, indicates that the source file is amalgated")
|
header.add_text("/// If defined, indicates that the source file is amalgamated")
|
||||||
header.add_text("/// to prevent private header inclusion.")
|
header.add_text("/// to prevent private header inclusion.")
|
||||||
header.add_text("#define JSON_IS_AMALGAMATION")
|
header.add_text("#define JSON_IS_AMALGAMATION")
|
||||||
header.add_file("include/json/config.h")
|
header.add_file("include/json/config.h")
|
||||||
header.add_file("include/json/forwards.h")
|
header.add_file("include/json/forwards.h")
|
||||||
header.add_text("#endif //ifndef JSON_FORWARD_AMALGATED_H_INCLUDED")
|
header.add_text("#endif //ifndef JSON_FORWARD_AMALGAMATED_H_INCLUDED")
|
||||||
|
|
||||||
target_forward_header_path = os.path.join(os.path.dirname(target_source_path),
|
target_forward_header_path = os.path.join(os.path.dirname(target_source_path),
|
||||||
forward_header_include_path)
|
forward_header_include_path)
|
||||||
print("Writing amalgated forward header to %r" % target_forward_header_path)
|
print("Writing amalgamated forward header to %r" % target_forward_header_path)
|
||||||
header.write_to(target_forward_header_path)
|
header.write_to(target_forward_header_path)
|
||||||
|
|
||||||
print("Amalgating source...")
|
print("Amalgamating source...")
|
||||||
source = AmalgamationFile(source_top_dir)
|
source = AmalgamationFile(source_top_dir)
|
||||||
source.add_text("/// Json-cpp amalgated source (http://jsoncpp.sourceforge.net/).")
|
source.add_text("/// Json-cpp amalgamated source (http://jsoncpp.sourceforge.net/).")
|
||||||
source.add_text('/// It is intended to be used with #include "%s"' % header_include_path)
|
source.add_text('/// It is intended to be used with #include "%s"' % header_include_path)
|
||||||
source.add_file("LICENSE", wrap_in_comment=True)
|
source.add_file("LICENSE", wrap_in_comment=True)
|
||||||
source.add_text("")
|
source.add_text("")
|
||||||
@@ -123,12 +123,12 @@ def amalgamate_source(source_top_dir=None,
|
|||||||
source.add_file(os.path.join(lib_json, "json_value.cpp"))
|
source.add_file(os.path.join(lib_json, "json_value.cpp"))
|
||||||
source.add_file(os.path.join(lib_json, "json_writer.cpp"))
|
source.add_file(os.path.join(lib_json, "json_writer.cpp"))
|
||||||
|
|
||||||
print("Writing amalgated source to %r" % target_source_path)
|
print("Writing amalgamated source to %r" % target_source_path)
|
||||||
source.write_to(target_source_path)
|
source.write_to(target_source_path)
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
usage = """%prog [options]
|
usage = """%prog [options]
|
||||||
Generate a single amalgated source and header file from the sources.
|
Generate a single amalgamated source and header file from the sources.
|
||||||
"""
|
"""
|
||||||
from optparse import OptionParser
|
from optparse import OptionParser
|
||||||
parser = OptionParser(usage=usage)
|
parser = OptionParser(usage=usage)
|
||||||
@@ -136,7 +136,7 @@ Generate a single amalgated source and header file from the sources.
|
|||||||
parser.add_option("-s", "--source", dest="target_source_path", action="store", default="dist/jsoncpp.cpp",
|
parser.add_option("-s", "--source", dest="target_source_path", action="store", default="dist/jsoncpp.cpp",
|
||||||
help="""Output .cpp source path. [Default: %default]""")
|
help="""Output .cpp source path. [Default: %default]""")
|
||||||
parser.add_option("-i", "--include", dest="header_include_path", action="store", default="json/json.h",
|
parser.add_option("-i", "--include", dest="header_include_path", action="store", default="json/json.h",
|
||||||
help="""Header include path. Used to include the header from the amalgated source file. [Default: %default]""")
|
help="""Header include path. Used to include the header from the amalgamated source file. [Default: %default]""")
|
||||||
parser.add_option("-t", "--top-dir", dest="top_dir", action="store", default=os.getcwd(),
|
parser.add_option("-t", "--top-dir", dest="top_dir", action="store", default=os.getcwd(),
|
||||||
help="""Source top-directory. [Default: %default]""")
|
help="""Source top-directory. [Default: %default]""")
|
||||||
parser.enable_interspersed_args()
|
parser.enable_interspersed_args()
|
||||||
@@ -149,7 +149,7 @@ Generate a single amalgated source and header file from the sources.
|
|||||||
sys.stderr.write(msg + "\n")
|
sys.stderr.write(msg + "\n")
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
else:
|
else:
|
||||||
print("Source succesfully amalagated")
|
print("Source successfully amalgamated")
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
main()
|
main()
|
||||||
|
45
appveyor.yml
45
appveyor.yml
@@ -1,30 +1,27 @@
|
|||||||
# This is a comment.
|
|
||||||
|
|
||||||
version: build.{build}
|
|
||||||
|
|
||||||
os: Windows Server 2012 R2
|
|
||||||
|
|
||||||
clone_folder: c:\projects\jsoncpp
|
clone_folder: c:\projects\jsoncpp
|
||||||
|
|
||||||
platform:
|
environment:
|
||||||
- Win32
|
matrix:
|
||||||
- x64
|
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
|
||||||
|
CMAKE_GENERATOR: Visual Studio 14 2015
|
||||||
|
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
|
||||||
|
CMAKE_GENERATOR: Visual Studio 14 2015 Win64
|
||||||
|
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
|
||||||
|
CMAKE_GENERATOR: Visual Studio 15 2017
|
||||||
|
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
|
||||||
|
CMAKE_GENERATOR: Visual Studio 15 2017 Win64
|
||||||
|
|
||||||
configuration:
|
build_script:
|
||||||
- Debug
|
- cmake --version
|
||||||
- Release
|
- cd c:\projects\jsoncpp
|
||||||
|
- cmake -G "%CMAKE_GENERATOR%" -DCMAKE_INSTALL_PREFIX:PATH=%CD:\=/%/install -DBUILD_SHARED_LIBS:BOOL=ON .
|
||||||
# scripts to run before build
|
# Use ctest to make a dashboard build:
|
||||||
before_build:
|
# - ctest -D Experimental(Start|Update|Configure|Build|Test|Coverage|MemCheck|Submit)
|
||||||
- echo "Running cmake..."
|
# NOTE: Testing on window is not yet finished:
|
||||||
- cd c:\projects\jsoncpp
|
# - ctest -C Release -D ExperimentalStart -D ExperimentalConfigure -D ExperimentalBuild -D ExperimentalTest -D ExperimentalSubmit
|
||||||
- cmake --version
|
- ctest -C Release -D ExperimentalStart -D ExperimentalConfigure -D ExperimentalBuild -D ExperimentalSubmit
|
||||||
- set PATH=C:\Program Files (x86)\MSBuild\14.0\Bin;%PATH%
|
# Final step is to verify that installation succeeds
|
||||||
- if %PLATFORM% == Win32 cmake .
|
- cmake --build . --config Release --target install
|
||||||
- if %PLATFORM% == x64 cmake -G "Visual Studio 12 2013 Win64" .
|
|
||||||
|
|
||||||
build:
|
|
||||||
project: jsoncpp.sln # path to Visual Studio solution or project
|
|
||||||
|
|
||||||
deploy:
|
deploy:
|
||||||
provider: GitHub
|
provider: GitHub
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
# This is only for jsoncpp developers/contributors.
|
# This is only for jsoncpp developers/contributors.
|
||||||
# We use this to sign releases, generate documentation, etc.
|
# We use this to sign releases, generate documentation, etc.
|
||||||
VER?=$(shell cat version)
|
VER?=$(shell cat version.txt)
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@echo "VER=${VER}"
|
@echo "VER=${VER}"
|
||||||
@@ -12,7 +12,7 @@ jsoncpp-%.tar.gz:
|
|||||||
curl https://github.com/open-source-parsers/jsoncpp/archive/$*.tar.gz -o $@
|
curl https://github.com/open-source-parsers/jsoncpp/archive/$*.tar.gz -o $@
|
||||||
dox:
|
dox:
|
||||||
python doxybuild.py --doxygen=$$(which doxygen) --in doc/web_doxyfile.in
|
python doxybuild.py --doxygen=$$(which doxygen) --in doc/web_doxyfile.in
|
||||||
rsync -va --delete dist/doxygen/jsoncpp-api-html-${VER}/ ../jsoncpp-docs/doxygen/
|
rsync -va -c --delete dist/doxygen/jsoncpp-api-html-${VER}/ ../jsoncpp-docs/doxygen/
|
||||||
# Then 'git add -A' and 'git push' in jsoncpp-docs.
|
# Then 'git add -A' and 'git push' in jsoncpp-docs.
|
||||||
build:
|
build:
|
||||||
mkdir -p build/debug
|
mkdir -p build/debug
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
# Copyright 2010 Baptiste Lepilleur
|
# Copyright 2010 Baptiste Lepilleur and The JsonCpp Authors
|
||||||
# Distributed under MIT license, or public domain if desired and
|
# Distributed under MIT license, or public domain if desired and
|
||||||
# recognized in your jurisdiction.
|
# recognized in your jurisdiction.
|
||||||
# See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
# See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
# encoding: utf-8
|
# encoding: utf-8
|
||||||
# Copyright 2009 Baptiste Lepilleur
|
# Copyright 2009 Baptiste Lepilleur and The JsonCpp Authors
|
||||||
# Distributed under MIT license, or public domain if desired and
|
# Distributed under MIT license, or public domain if desired and
|
||||||
# recognized in your jurisdiction.
|
# recognized in your jurisdiction.
|
||||||
# See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
# See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
# Copyright 2010 Baptiste Lepilleur
|
# Copyright 2010 Baptiste Lepilleur and The JsonCpp Authors
|
||||||
# Distributed under MIT license, or public domain if desired and
|
# Distributed under MIT license, or public domain if desired and
|
||||||
# recognized in your jurisdiction.
|
# recognized in your jurisdiction.
|
||||||
# See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
# See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
||||||
|
@@ -6,7 +6,7 @@ from __future__ import print_function
|
|||||||
# and ends with the first blank line.
|
# and ends with the first blank line.
|
||||||
LICENSE_BEGIN = "// Copyright "
|
LICENSE_BEGIN = "// Copyright "
|
||||||
|
|
||||||
BRIEF_LICENSE = LICENSE_BEGIN + """2007-2010 Baptiste Lepilleur
|
BRIEF_LICENSE = LICENSE_BEGIN + """2007-2010 Baptiste Lepilleur and The JsonCpp Authors
|
||||||
// Distributed under MIT license, or public domain if desired and
|
// Distributed under MIT license, or public domain if desired and
|
||||||
// recognized in your jurisdiction.
|
// recognized in your jurisdiction.
|
||||||
// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
# Copyright 2010 Baptiste Lepilleur
|
# Copyright 2010 Baptiste Lepilleur and The JsonCpp Authors
|
||||||
# Distributed under MIT license, or public domain if desired and
|
# Distributed under MIT license, or public domain if desired and
|
||||||
# recognized in your jurisdiction.
|
# recognized in your jurisdiction.
|
||||||
# See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
# See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
||||||
|
@@ -271,7 +271,7 @@ OPTIMIZE_OUTPUT_VHDL = NO
|
|||||||
# parses. With this tag you can assign which parser to use for a given
|
# parses. With this tag you can assign which parser to use for a given
|
||||||
# extension. Doxygen has a built-in mapping, but you can override or extend it
|
# extension. Doxygen has a built-in mapping, but you can override or extend it
|
||||||
# using this tag. The format is ext=language, where ext is a file extension, and
|
# using this tag. The format is ext=language, where ext is a file extension, and
|
||||||
# language is one of the parsers supported by doxygen: IDL, Java, Javascript,
|
# language is one of the parsers supported by doxygen: IDL, Java, JavaScript,
|
||||||
# C#, C, C++, D, PHP, Objective-C, Python, Fortran, VHDL. For instance to make
|
# C#, C, C++, D, PHP, Objective-C, Python, Fortran, VHDL. For instance to make
|
||||||
# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C
|
# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C
|
||||||
# (default is Fortran), use: inc=Fortran f=C.
|
# (default is Fortran), use: inc=Fortran f=C.
|
||||||
@@ -984,7 +984,8 @@ VERBATIM_HEADERS = YES
|
|||||||
# classes, structs, unions or interfaces.
|
# classes, structs, unions or interfaces.
|
||||||
# The default value is: YES.
|
# The default value is: YES.
|
||||||
|
|
||||||
ALPHABETICAL_INDEX = NO
|
ALPHABETICAL_INDEX = YES
|
||||||
|
TOC_INCLUDE_HEADINGS = 2
|
||||||
|
|
||||||
# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
|
# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
|
||||||
# which the alphabetical index list will be split.
|
# which the alphabetical index list will be split.
|
||||||
@@ -1071,7 +1072,7 @@ HTML_STYLESHEET =
|
|||||||
# defined cascading style sheet that is included after the standard style sheets
|
# defined cascading style sheet that is included after the standard style sheets
|
||||||
# created by doxygen. Using this option one can overrule certain style aspects.
|
# created by doxygen. Using this option one can overrule certain style aspects.
|
||||||
# This is preferred over using HTML_STYLESHEET since it does not replace the
|
# This is preferred over using HTML_STYLESHEET since it does not replace the
|
||||||
# standard style sheet and is therefor more robust against future updates.
|
# standard style sheet and is therefore more robust against future updates.
|
||||||
# Doxygen will copy the style sheet file to the output directory. For an example
|
# Doxygen will copy the style sheet file to the output directory. For an example
|
||||||
# see the documentation.
|
# see the documentation.
|
||||||
# This tag requires that the tag GENERATE_HTML is set to YES.
|
# This tag requires that the tag GENERATE_HTML is set to YES.
|
||||||
@@ -1407,7 +1408,7 @@ FORMULA_FONTSIZE = 10
|
|||||||
FORMULA_TRANSPARENT = YES
|
FORMULA_TRANSPARENT = YES
|
||||||
|
|
||||||
# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
|
# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
|
||||||
# http://www.mathjax.org) which uses client side Javascript for the rendering
|
# http://www.mathjax.org) which uses client side JavaScript for the rendering
|
||||||
# instead of using prerendered bitmaps. Use this if you do not have LaTeX
|
# instead of using prerendered bitmaps. Use this if you do not have LaTeX
|
||||||
# installed or if you want to formulas look prettier in the HTML output. When
|
# installed or if you want to formulas look prettier in the HTML output. When
|
||||||
# enabled you may also need to install MathJax separately and configure the path
|
# enabled you may also need to install MathJax separately and configure the path
|
||||||
@@ -1477,7 +1478,7 @@ MATHJAX_CODEFILE =
|
|||||||
SEARCHENGINE = NO
|
SEARCHENGINE = NO
|
||||||
|
|
||||||
# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
|
# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
|
||||||
# implemented using a web server instead of a web client using Javascript. There
|
# implemented using a web server instead of a web client using JavaScript. There
|
||||||
# are two flavours of web server based searching depending on the
|
# are two flavours of web server based searching depending on the
|
||||||
# EXTERNAL_SEARCH setting. When disabled, doxygen will generate a PHP script for
|
# EXTERNAL_SEARCH setting. When disabled, doxygen will generate a PHP script for
|
||||||
# searching and an index file used by the script. When EXTERNAL_SEARCH is
|
# searching and an index file used by the script. When EXTERNAL_SEARCH is
|
||||||
@@ -1943,7 +1944,7 @@ INCLUDE_FILE_PATTERNS = *.h
|
|||||||
# recursively expanded use the := operator instead of the = operator.
|
# recursively expanded use the := operator instead of the = operator.
|
||||||
# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
|
# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
|
||||||
|
|
||||||
PREDEFINED = "_MSC_VER=1400" \
|
PREDEFINED = "_MSC_VER=1800" \
|
||||||
_CPPRTTI \
|
_CPPRTTI \
|
||||||
_WIN32 \
|
_WIN32 \
|
||||||
JSONCPP_DOC_EXCLUDE_IMPLEMENTATION
|
JSONCPP_DOC_EXCLUDE_IMPLEMENTATION
|
||||||
@@ -1958,7 +1959,7 @@ PREDEFINED = "_MSC_VER=1400" \
|
|||||||
EXPAND_AS_DEFINED =
|
EXPAND_AS_DEFINED =
|
||||||
|
|
||||||
# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
|
# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
|
||||||
# remove all refrences to function-like macros that are alone on a line, have an
|
# remove all references to function-like macros that are alone on a line, have an
|
||||||
# all uppercase name, and do not end with a semicolon. Such function macros are
|
# all uppercase name, and do not end with a semicolon. Such function macros are
|
||||||
# typically used for boiler-plate code, and will confuse the parser if not
|
# typically used for boiler-plate code, and will confuse the parser if not
|
||||||
# removed.
|
# removed.
|
||||||
|
@@ -1,3 +1,21 @@
|
|||||||
<hr>
|
<!-- HTML footer for doxygen 1.8.13-->
|
||||||
</body>
|
<!-- start footer part -->
|
||||||
|
<!--BEGIN GENERATE_TREEVIEW-->
|
||||||
|
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
|
||||||
|
<ul>
|
||||||
|
$navpath
|
||||||
|
<li class="footer">$generatedby
|
||||||
|
<a href="http://www.doxygen.org/index.html">
|
||||||
|
<img class="footer" src="$relpath^doxygen.png" alt="doxygen"/></a> $doxygenversion </li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<!--END GENERATE_TREEVIEW-->
|
||||||
|
<!--BEGIN !GENERATE_TREEVIEW-->
|
||||||
|
<hr class="footer"/><address class="footer"><small>
|
||||||
|
$generatedby  <a href="http://www.doxygen.org/index.html">
|
||||||
|
<img class="footer" src="$relpath^doxygen.png" alt="doxygen"/>
|
||||||
|
</a> $doxygenversion
|
||||||
|
</small></address>
|
||||||
|
<!--END !GENERATE_TREEVIEW-->
|
||||||
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
@@ -1,24 +1,64 @@
|
|||||||
<html>
|
<!-- HTML header for doxygen 1.8.13-->
|
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<head>
|
<head>
|
||||||
<title>
|
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
||||||
JsonCpp - JSON data format manipulation library
|
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
|
||||||
</title>
|
<meta name="generator" content="Doxygen $doxygenversion"/>
|
||||||
<link href="doxygen.css" rel="stylesheet" type="text/css">
|
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
||||||
<link href="tabs.css" rel="stylesheet" type="text/css">
|
<link href="$relpath^tabs.css" rel="stylesheet" type="text/css"/>
|
||||||
|
<script type="text/javascript" src="$relpath^jquery.js"></script>
|
||||||
|
<script type="text/javascript" src="$relpath^dynsections.js"></script>
|
||||||
|
$treeview
|
||||||
|
$search
|
||||||
|
$mathjax
|
||||||
|
<link href="$relpath^$stylesheet" rel="stylesheet" type="text/css" />
|
||||||
|
$extrastylesheet
|
||||||
</head>
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
|
||||||
|
|
||||||
<body bgcolor="#ffffff">
|
<!--BEGIN TITLEAREA-->
|
||||||
|
<div id="titlearea">
|
||||||
|
<table cellspacing="0" cellpadding="0">
|
||||||
|
<tbody>
|
||||||
|
<tr style="height: 56px;">
|
||||||
|
<!--BEGIN PROJECT_LOGO-->
|
||||||
|
<td id="projectlogo"><img alt="Logo" src="$relpath^$projectlogo"/></td>
|
||||||
|
<!--END PROJECT_LOGO-->
|
||||||
|
<!--BEGIN DISABLE_INDEX-->
|
||||||
|
<!--BEGIN SEARCHENGINE-->
|
||||||
|
<td>$searchbox</td>
|
||||||
|
<!--END SEARCHENGINE-->
|
||||||
|
<!--END DISABLE_INDEX-->
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<!--END TITLEAREA-->
|
||||||
|
<body bgcolor="#ffffff">
|
||||||
<table width="100%">
|
<table width="100%">
|
||||||
<tr>
|
<tr>
|
||||||
<td width="40%" align="left" valign="center">
|
<td width="30%" align="left" valign="center">
|
||||||
<a href="https://github.com/open-source-parsers/jsoncpp">
|
<a href="https://github.com/open-source-parsers/jsoncpp">
|
||||||
JsonCpp project page
|
JsonCpp project page
|
||||||
</a>
|
</a>
|
||||||
</td>
|
</td>
|
||||||
<td width="40%" align="right" valign="center">
|
<td width="20%" align="center" valign="center">
|
||||||
|
<a href="hierarchy.html">
|
||||||
|
Classes
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
<td width="20%" align="center" valign="center">
|
||||||
|
<a href="namespace_json.html">
|
||||||
|
Namespace
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
<td width="30%" align="right" valign="center">
|
||||||
<a href="http://open-source-parsers.github.io/jsoncpp-docs/doxygen/">JsonCpp home page</a>
|
<a href="http://open-source-parsers.github.io/jsoncpp-docs/doxygen/">JsonCpp home page</a>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
<hr>
|
<hr>
|
||||||
|
<!-- end header part -->
|
||||||
|
@@ -44,7 +44,7 @@ PROJECT_NUMBER = %JSONCPP_VERSION%
|
|||||||
# for a project that appears at the top of each page and should give viewer a
|
# for a project that appears at the top of each page and should give viewer a
|
||||||
# quick idea about the purpose of the project. Keep the description short.
|
# quick idea about the purpose of the project. Keep the description short.
|
||||||
|
|
||||||
PROJECT_BRIEF =
|
PROJECT_BRIEF = "JSON data format manipulation library"
|
||||||
|
|
||||||
# With the PROJECT_LOGO tag one can specify an logo or icon that is included in
|
# With the PROJECT_LOGO tag one can specify an logo or icon that is included in
|
||||||
# the documentation. The maximum height of the logo should not exceed 55 pixels
|
# the documentation. The maximum height of the logo should not exceed 55 pixels
|
||||||
@@ -271,7 +271,7 @@ OPTIMIZE_OUTPUT_VHDL = NO
|
|||||||
# parses. With this tag you can assign which parser to use for a given
|
# parses. With this tag you can assign which parser to use for a given
|
||||||
# extension. Doxygen has a built-in mapping, but you can override or extend it
|
# extension. Doxygen has a built-in mapping, but you can override or extend it
|
||||||
# using this tag. The format is ext=language, where ext is a file extension, and
|
# using this tag. The format is ext=language, where ext is a file extension, and
|
||||||
# language is one of the parsers supported by doxygen: IDL, Java, Javascript,
|
# language is one of the parsers supported by doxygen: IDL, Java, JavaScript,
|
||||||
# C#, C, C++, D, PHP, Objective-C, Python, Fortran, VHDL. For instance to make
|
# C#, C, C++, D, PHP, Objective-C, Python, Fortran, VHDL. For instance to make
|
||||||
# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C
|
# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C
|
||||||
# (default is Fortran), use: inc=Fortran f=C.
|
# (default is Fortran), use: inc=Fortran f=C.
|
||||||
@@ -984,7 +984,8 @@ VERBATIM_HEADERS = NO
|
|||||||
# classes, structs, unions or interfaces.
|
# classes, structs, unions or interfaces.
|
||||||
# The default value is: YES.
|
# The default value is: YES.
|
||||||
|
|
||||||
ALPHABETICAL_INDEX = NO
|
ALPHABETICAL_INDEX = YES
|
||||||
|
TOC_INCLUDE_HEADINGS = 2
|
||||||
|
|
||||||
# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
|
# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
|
||||||
# which the alphabetical index list will be split.
|
# which the alphabetical index list will be split.
|
||||||
@@ -1071,7 +1072,7 @@ HTML_STYLESHEET =
|
|||||||
# defined cascading style sheet that is included after the standard style sheets
|
# defined cascading style sheet that is included after the standard style sheets
|
||||||
# created by doxygen. Using this option one can overrule certain style aspects.
|
# created by doxygen. Using this option one can overrule certain style aspects.
|
||||||
# This is preferred over using HTML_STYLESHEET since it does not replace the
|
# This is preferred over using HTML_STYLESHEET since it does not replace the
|
||||||
# standard style sheet and is therefor more robust against future updates.
|
# standard style sheet and is therefore more robust against future updates.
|
||||||
# Doxygen will copy the style sheet file to the output directory. For an example
|
# Doxygen will copy the style sheet file to the output directory. For an example
|
||||||
# see the documentation.
|
# see the documentation.
|
||||||
# This tag requires that the tag GENERATE_HTML is set to YES.
|
# This tag requires that the tag GENERATE_HTML is set to YES.
|
||||||
@@ -1124,7 +1125,7 @@ HTML_COLORSTYLE_GAMMA = 80
|
|||||||
# The default value is: YES.
|
# The default value is: YES.
|
||||||
# This tag requires that the tag GENERATE_HTML is set to YES.
|
# This tag requires that the tag GENERATE_HTML is set to YES.
|
||||||
|
|
||||||
HTML_TIMESTAMP = YES
|
HTML_TIMESTAMP = NO
|
||||||
|
|
||||||
# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
|
# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
|
||||||
# documentation will contain sections that can be hidden and shown after the
|
# documentation will contain sections that can be hidden and shown after the
|
||||||
@@ -1360,7 +1361,7 @@ DISABLE_INDEX = NO
|
|||||||
# The default value is: NO.
|
# The default value is: NO.
|
||||||
# This tag requires that the tag GENERATE_HTML is set to YES.
|
# This tag requires that the tag GENERATE_HTML is set to YES.
|
||||||
|
|
||||||
GENERATE_TREEVIEW = NO
|
GENERATE_TREEVIEW = YES
|
||||||
|
|
||||||
# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
|
# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
|
||||||
# doxygen will group on one line in the generated HTML documentation.
|
# doxygen will group on one line in the generated HTML documentation.
|
||||||
@@ -1407,7 +1408,7 @@ FORMULA_FONTSIZE = 10
|
|||||||
FORMULA_TRANSPARENT = YES
|
FORMULA_TRANSPARENT = YES
|
||||||
|
|
||||||
# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
|
# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
|
||||||
# http://www.mathjax.org) which uses client side Javascript for the rendering
|
# http://www.mathjax.org) which uses client side JavaScript for the rendering
|
||||||
# instead of using prerendered bitmaps. Use this if you do not have LaTeX
|
# instead of using prerendered bitmaps. Use this if you do not have LaTeX
|
||||||
# installed or if you want to formulas look prettier in the HTML output. When
|
# installed or if you want to formulas look prettier in the HTML output. When
|
||||||
# enabled you may also need to install MathJax separately and configure the path
|
# enabled you may also need to install MathJax separately and configure the path
|
||||||
@@ -1477,7 +1478,7 @@ MATHJAX_CODEFILE =
|
|||||||
SEARCHENGINE = NO
|
SEARCHENGINE = NO
|
||||||
|
|
||||||
# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
|
# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
|
||||||
# implemented using a web server instead of a web client using Javascript. There
|
# implemented using a web server instead of a web client using JavaScript. There
|
||||||
# are two flavours of web server based searching depending on the
|
# are two flavours of web server based searching depending on the
|
||||||
# EXTERNAL_SEARCH setting. When disabled, doxygen will generate a PHP script for
|
# EXTERNAL_SEARCH setting. When disabled, doxygen will generate a PHP script for
|
||||||
# searching and an index file used by the script. When EXTERNAL_SEARCH is
|
# searching and an index file used by the script. When EXTERNAL_SEARCH is
|
||||||
@@ -1797,18 +1798,6 @@ GENERATE_XML = NO
|
|||||||
|
|
||||||
XML_OUTPUT = xml
|
XML_OUTPUT = xml
|
||||||
|
|
||||||
# The XML_SCHEMA tag can be used to specify a XML schema, which can be used by a
|
|
||||||
# validating XML parser to check the syntax of the XML files.
|
|
||||||
# This tag requires that the tag GENERATE_XML is set to YES.
|
|
||||||
|
|
||||||
XML_SCHEMA =
|
|
||||||
|
|
||||||
# The XML_DTD tag can be used to specify a XML DTD, which can be used by a
|
|
||||||
# validating XML parser to check the syntax of the XML files.
|
|
||||||
# This tag requires that the tag GENERATE_XML is set to YES.
|
|
||||||
|
|
||||||
XML_DTD =
|
|
||||||
|
|
||||||
# If the XML_PROGRAMLISTING tag is set to YES doxygen will dump the program
|
# If the XML_PROGRAMLISTING tag is set to YES doxygen will dump the program
|
||||||
# listings (including syntax highlighting and cross-referencing information) to
|
# listings (including syntax highlighting and cross-referencing information) to
|
||||||
# the XML output. Note that enabling this will significantly increase the size
|
# the XML output. Note that enabling this will significantly increase the size
|
||||||
@@ -1943,7 +1932,7 @@ INCLUDE_FILE_PATTERNS = *.h
|
|||||||
# recursively expanded use the := operator instead of the = operator.
|
# recursively expanded use the := operator instead of the = operator.
|
||||||
# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
|
# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
|
||||||
|
|
||||||
PREDEFINED = "_MSC_VER=1400" \
|
PREDEFINED = "_MSC_VER=1800" \
|
||||||
_CPPRTTI \
|
_CPPRTTI \
|
||||||
_WIN32 \
|
_WIN32 \
|
||||||
JSONCPP_DOC_EXCLUDE_IMPLEMENTATION
|
JSONCPP_DOC_EXCLUDE_IMPLEMENTATION
|
||||||
@@ -1958,7 +1947,7 @@ PREDEFINED = "_MSC_VER=1400" \
|
|||||||
EXPAND_AS_DEFINED =
|
EXPAND_AS_DEFINED =
|
||||||
|
|
||||||
# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
|
# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
|
||||||
# remove all refrences to function-like macros that are alone on a line, have an
|
# remove all references to function-like macros that are alone on a line, have an
|
||||||
# all uppercase name, and do not end with a semicolon. Such function macros are
|
# all uppercase name, and do not end with a semicolon. Such function macros are
|
||||||
# typically used for boiler-plate code, and will confuse the parser if not
|
# typically used for boiler-plate code, and will confuse the parser if not
|
||||||
# removed.
|
# removed.
|
||||||
|
@@ -156,7 +156,7 @@ def build_doc(options, make_release=False):
|
|||||||
def main():
|
def main():
|
||||||
usage = """%prog
|
usage = """%prog
|
||||||
Generates doxygen documentation in build/doxygen.
|
Generates doxygen documentation in build/doxygen.
|
||||||
Optionaly makes a tarball of the documentation to dist/.
|
Optionally makes a tarball of the documentation to dist/.
|
||||||
|
|
||||||
Must be started in the project top directory.
|
Must be started in the project top directory.
|
||||||
"""
|
"""
|
||||||
|
@@ -1,2 +1,6 @@
|
|||||||
FILE(GLOB INCLUDE_FILES "json/*.h")
|
file(GLOB INCLUDE_FILES "json/*.h")
|
||||||
INSTALL(FILES ${INCLUDE_FILES} DESTINATION ${INCLUDE_INSTALL_DIR}/json)
|
install(FILES
|
||||||
|
${INCLUDE_FILES}
|
||||||
|
${PROJECT_BINARY_DIR}/include/json/version.h
|
||||||
|
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/json)
|
||||||
|
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2007-2010 Baptiste Lepilleur
|
// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors
|
||||||
// Distributed under MIT license, or public domain if desired and
|
// Distributed under MIT license, or public domain if desired and
|
||||||
// recognized in your jurisdiction.
|
// recognized in your jurisdiction.
|
||||||
// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
||||||
@@ -9,86 +9,81 @@
|
|||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
|
#pragma pack(push, 8)
|
||||||
|
|
||||||
namespace Json {
|
namespace Json {
|
||||||
template<typename T>
|
template <typename T> class SecureAllocator {
|
||||||
class SecureAllocator {
|
public:
|
||||||
public:
|
// Type definitions
|
||||||
// Type definitions
|
using value_type = T;
|
||||||
using value_type = T;
|
using pointer = T*;
|
||||||
using pointer = T*;
|
using const_pointer = const T*;
|
||||||
using const_pointer = const T*;
|
using reference = T&;
|
||||||
using reference = T&;
|
using const_reference = const T&;
|
||||||
using const_reference = const T&;
|
using size_type = std::size_t;
|
||||||
using size_type = std::size_t;
|
using difference_type = std::ptrdiff_t;
|
||||||
using difference_type = std::ptrdiff_t;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Allocate memory for N items using the standard allocator.
|
* Allocate memory for N items using the standard allocator.
|
||||||
*/
|
*/
|
||||||
pointer allocate(size_type n) {
|
pointer allocate(size_type n) {
|
||||||
// allocate using "global operator new"
|
// allocate using "global operator new"
|
||||||
return static_cast<pointer>(::operator new(n * sizeof(T)));
|
return static_cast<pointer>(::operator new(n * sizeof(T)));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Release memory which was allocated for N items at pointer P.
|
* Release memory which was allocated for N items at pointer P.
|
||||||
*
|
*
|
||||||
* The memory block is filled with zeroes before being released.
|
* The memory block is filled with zeroes before being released.
|
||||||
* The pointer argument is tagged as "volatile" to prevent the
|
* The pointer argument is tagged as "volatile" to prevent the
|
||||||
* compiler optimizing out this critical step.
|
* compiler optimizing out this critical step.
|
||||||
*/
|
*/
|
||||||
void deallocate(volatile pointer p, size_type n) {
|
void deallocate(volatile pointer p, size_type n) {
|
||||||
std::memset(p, 0, n * sizeof(T));
|
std::memset(p, 0, n * sizeof(T));
|
||||||
// free using "global operator delete"
|
// free using "global operator delete"
|
||||||
::operator delete(p);
|
::operator delete(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Construct an item in-place at pointer P.
|
* Construct an item in-place at pointer P.
|
||||||
*/
|
*/
|
||||||
template<typename... Args>
|
template <typename... Args> void construct(pointer p, Args&&... args) {
|
||||||
void construct(pointer p, Args&&... args) {
|
// construct using "placement new" and "perfect forwarding"
|
||||||
// construct using "placement new" and "perfect forwarding"
|
::new (static_cast<void*>(p)) T(std::forward<Args>(args)...);
|
||||||
::new (static_cast<void*>(p)) T(std::forward<Args>(args)...);
|
}
|
||||||
}
|
|
||||||
|
|
||||||
size_type max_size() const {
|
size_type max_size() const { return size_t(-1) / sizeof(T); }
|
||||||
return size_t(-1) / sizeof(T);
|
|
||||||
}
|
|
||||||
|
|
||||||
pointer address( reference x ) const {
|
pointer address(reference x) const { return std::addressof(x); }
|
||||||
return std::addressof(x);
|
|
||||||
}
|
|
||||||
|
|
||||||
const_pointer address( const_reference x ) const {
|
const_pointer address(const_reference x) const { return std::addressof(x); }
|
||||||
return std::addressof(x);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Destroy an item in-place at pointer P.
|
* Destroy an item in-place at pointer P.
|
||||||
*/
|
*/
|
||||||
void destroy(pointer p) {
|
void destroy(pointer p) {
|
||||||
// destroy using "explicit destructor"
|
// destroy using "explicit destructor"
|
||||||
p->~T();
|
p->~T();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Boilerplate
|
// Boilerplate
|
||||||
SecureAllocator() {}
|
SecureAllocator() {}
|
||||||
template<typename U> SecureAllocator(const SecureAllocator<U>&) {}
|
template <typename U> SecureAllocator(const SecureAllocator<U>&) {}
|
||||||
template<typename U> struct rebind { using other = SecureAllocator<U>; };
|
template <typename U> struct rebind { using other = SecureAllocator<U>; };
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template <typename T, typename U>
|
||||||
template<typename T, typename U>
|
|
||||||
bool operator==(const SecureAllocator<T>&, const SecureAllocator<U>&) {
|
bool operator==(const SecureAllocator<T>&, const SecureAllocator<U>&) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T, typename U>
|
template <typename T, typename U>
|
||||||
bool operator!=(const SecureAllocator<T>&, const SecureAllocator<U>&) {
|
bool operator!=(const SecureAllocator<T>&, const SecureAllocator<U>&) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
} //namespace Json
|
} // namespace Json
|
||||||
|
|
||||||
|
#pragma pack(pop)
|
||||||
|
|
||||||
#endif // CPPTL_JSON_ALLOCATOR_H_INCLUDED
|
#endif // CPPTL_JSON_ALLOCATOR_H_INCLUDED
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2007-2010 Baptiste Lepilleur
|
// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors
|
||||||
// Distributed under MIT license, or public domain if desired and
|
// Distributed under MIT license, or public domain if desired and
|
||||||
// recognized in your jurisdiction.
|
// recognized in your jurisdiction.
|
||||||
// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
||||||
@@ -6,7 +6,7 @@
|
|||||||
#ifndef CPPTL_JSON_ASSERTIONS_H_INCLUDED
|
#ifndef CPPTL_JSON_ASSERTIONS_H_INCLUDED
|
||||||
#define CPPTL_JSON_ASSERTIONS_H_INCLUDED
|
#define CPPTL_JSON_ASSERTIONS_H_INCLUDED
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <cstdlib>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
|
||||||
#if !defined(JSON_IS_AMALGAMATION)
|
#if !defined(JSON_IS_AMALGAMATION)
|
||||||
@@ -20,30 +20,35 @@
|
|||||||
#if JSON_USE_EXCEPTION
|
#if JSON_USE_EXCEPTION
|
||||||
|
|
||||||
// @todo <= add detail about condition in exception
|
// @todo <= add detail about condition in exception
|
||||||
# define JSON_ASSERT(condition) \
|
#define JSON_ASSERT(condition) \
|
||||||
{if (!(condition)) {Json::throwLogicError( "assert json failed" );}}
|
|
||||||
|
|
||||||
# define JSON_FAIL_MESSAGE(message) \
|
|
||||||
{ \
|
{ \
|
||||||
JSONCPP_OSTRINGSTREAM oss; oss << message; \
|
if (!(condition)) { \
|
||||||
|
Json::throwLogicError("assert json failed"); \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define JSON_FAIL_MESSAGE(message) \
|
||||||
|
{ \
|
||||||
|
OStringStream oss; \
|
||||||
|
oss << message; \
|
||||||
Json::throwLogicError(oss.str()); \
|
Json::throwLogicError(oss.str()); \
|
||||||
abort(); \
|
abort(); \
|
||||||
}
|
}
|
||||||
|
|
||||||
#else // JSON_USE_EXCEPTION
|
#else // JSON_USE_EXCEPTION
|
||||||
|
|
||||||
# define JSON_ASSERT(condition) assert(condition)
|
#define JSON_ASSERT(condition) assert(condition)
|
||||||
|
|
||||||
// The call to assert() will show the failure message in debug builds. In
|
// The call to assert() will show the failure message in debug builds. In
|
||||||
// release builds we abort, for a core-dump or debugger.
|
// release builds we abort, for a core-dump or debugger.
|
||||||
# define JSON_FAIL_MESSAGE(message) \
|
#define JSON_FAIL_MESSAGE(message) \
|
||||||
{ \
|
{ \
|
||||||
JSONCPP_OSTRINGSTREAM oss; oss << message; \
|
OStringStream oss; \
|
||||||
|
oss << message; \
|
||||||
assert(false && oss.str().c_str()); \
|
assert(false && oss.str().c_str()); \
|
||||||
abort(); \
|
abort(); \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define JSON_ASSERT_MESSAGE(condition, message) \
|
#define JSON_ASSERT_MESSAGE(condition, message) \
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2007-2010 Baptiste Lepilleur
|
// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors
|
||||||
// Distributed under MIT license, or public domain if desired and
|
// Distributed under MIT license, or public domain if desired and
|
||||||
// recognized in your jurisdiction.
|
// recognized in your jurisdiction.
|
||||||
// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
||||||
|
@@ -1,12 +1,18 @@
|
|||||||
// Copyright 2007-2010 Baptiste Lepilleur
|
// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors
|
||||||
// Distributed under MIT license, or public domain if desired and
|
// Distributed under MIT license, or public domain if desired and
|
||||||
// recognized in your jurisdiction.
|
// recognized in your jurisdiction.
|
||||||
// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
||||||
|
|
||||||
#ifndef JSON_CONFIG_H_INCLUDED
|
#ifndef JSON_CONFIG_H_INCLUDED
|
||||||
#define JSON_CONFIG_H_INCLUDED
|
#define JSON_CONFIG_H_INCLUDED
|
||||||
#include <stddef.h>
|
#include <cstddef>
|
||||||
#include <string> //typdef String
|
#include <cstdint>
|
||||||
|
#include <istream>
|
||||||
|
#include <memory>
|
||||||
|
#include <ostream>
|
||||||
|
#include <sstream>
|
||||||
|
#include <string>
|
||||||
|
#include <type_traits>
|
||||||
|
|
||||||
/// If defined, indicates that json library is embedded in CppTL library.
|
/// If defined, indicates that json library is embedded in CppTL library.
|
||||||
//# define JSON_IN_CPPTL 1
|
//# define JSON_IN_CPPTL 1
|
||||||
@@ -24,9 +30,14 @@
|
|||||||
#define JSON_USE_EXCEPTION 1
|
#define JSON_USE_EXCEPTION 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/// If defined, indicates that the source file is amalgated
|
// Temporary, tracked for removal with issue #982.
|
||||||
|
#ifndef JSON_USE_NULLREF
|
||||||
|
#define JSON_USE_NULLREF 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/// If defined, indicates that the source file is amalgamated
|
||||||
/// to prevent private header inclusion.
|
/// to prevent private header inclusion.
|
||||||
/// Remarks: it is automatically defined in the generated amalgated header.
|
/// Remarks: it is automatically defined in the generated amalgamated header.
|
||||||
// #define JSON_IS_AMALGAMATION
|
// #define JSON_IS_AMALGAMATION
|
||||||
|
|
||||||
#ifdef JSON_IN_CPPTL
|
#ifdef JSON_IN_CPPTL
|
||||||
@@ -42,6 +53,8 @@
|
|||||||
#if defined(_MSC_VER) || defined(__MINGW32__)
|
#if defined(_MSC_VER) || defined(__MINGW32__)
|
||||||
#define JSON_API __declspec(dllexport)
|
#define JSON_API __declspec(dllexport)
|
||||||
#define JSONCPP_DISABLE_DLL_INTERFACE_WARNING
|
#define JSONCPP_DISABLE_DLL_INTERFACE_WARNING
|
||||||
|
#elif defined(__GNUC__) || defined(__clang__)
|
||||||
|
#define JSON_API __attribute__((visibility("default")))
|
||||||
#endif // if defined(_MSC_VER)
|
#endif // if defined(_MSC_VER)
|
||||||
#elif defined(JSON_DLL)
|
#elif defined(JSON_DLL)
|
||||||
#if defined(_MSC_VER) || defined(__MINGW32__)
|
#if defined(_MSC_VER) || defined(__MINGW32__)
|
||||||
@@ -53,89 +66,71 @@
|
|||||||
#define JSON_API
|
#define JSON_API
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(_MSC_VER) && _MSC_VER < 1800
|
||||||
|
#error \
|
||||||
|
"ERROR: Visual Studio 12 (2013) with _MSC_VER=1800 is the oldest supported compiler with sufficient C++11 capabilities"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(_MSC_VER) && _MSC_VER < 1900
|
||||||
|
// As recommended at
|
||||||
|
// https://stackoverflow.com/questions/2915672/snprintf-and-visual-studio-2010
|
||||||
|
extern JSON_API int
|
||||||
|
msvc_pre1900_c99_snprintf(char* outBuf, size_t size, const char* format, ...);
|
||||||
|
#define jsoncpp_snprintf msvc_pre1900_c99_snprintf
|
||||||
|
#else
|
||||||
|
#define jsoncpp_snprintf std::snprintf
|
||||||
|
#endif
|
||||||
|
|
||||||
// If JSON_NO_INT64 is defined, then Json only support C++ "int" type for
|
// If JSON_NO_INT64 is defined, then Json only support C++ "int" type for
|
||||||
// integer
|
// integer
|
||||||
// Storages, and 64 bits integer support is disabled.
|
// Storages, and 64 bits integer support is disabled.
|
||||||
// #define JSON_NO_INT64 1
|
// #define JSON_NO_INT64 1
|
||||||
|
|
||||||
#if defined(_MSC_VER) // MSVC
|
// JSONCPP_OVERRIDE is maintained for backwards compatibility of external tools.
|
||||||
# if _MSC_VER <= 1200 // MSVC 6
|
// C++11 should be used directly in JSONCPP.
|
||||||
// Microsoft Visual Studio 6 only support conversion from __int64 to double
|
#define JSONCPP_OVERRIDE override
|
||||||
// (no conversion from unsigned __int64).
|
|
||||||
# define JSON_USE_INT64_DOUBLE_CONVERSION 1
|
|
||||||
// Disable warning 4786 for VS6 caused by STL (identifier was truncated to '255'
|
|
||||||
// characters in the debug information)
|
|
||||||
// All projects I've ever seen with VS6 were using this globally (not bothering
|
|
||||||
// with pragma push/pop).
|
|
||||||
# pragma warning(disable : 4786)
|
|
||||||
# endif // MSVC 6
|
|
||||||
|
|
||||||
# if _MSC_VER >= 1500 // MSVC 2008
|
|
||||||
/// Indicates that the following function is deprecated.
|
|
||||||
# define JSONCPP_DEPRECATED(message) __declspec(deprecated(message))
|
|
||||||
# endif
|
|
||||||
|
|
||||||
#endif // defined(_MSC_VER)
|
|
||||||
|
|
||||||
// In c++11 the override keyword allows you to explicity define that a function
|
|
||||||
// is intended to override the base-class version. This makes the code more
|
|
||||||
// managable and fixes a set of common hard-to-find bugs.
|
|
||||||
#if __cplusplus >= 201103L
|
#if __cplusplus >= 201103L
|
||||||
# define JSONCPP_OVERRIDE override
|
#define JSONCPP_NOEXCEPT noexcept
|
||||||
#elif defined(_MSC_VER) && _MSC_VER > 1600
|
#define JSONCPP_OP_EXPLICIT explicit
|
||||||
# define JSONCPP_OVERRIDE override
|
#elif defined(_MSC_VER) && _MSC_VER < 1900
|
||||||
|
#define JSONCPP_NOEXCEPT throw()
|
||||||
|
#define JSONCPP_OP_EXPLICIT explicit
|
||||||
|
#elif defined(_MSC_VER) && _MSC_VER >= 1900
|
||||||
|
#define JSONCPP_NOEXCEPT noexcept
|
||||||
|
#define JSONCPP_OP_EXPLICIT explicit
|
||||||
#else
|
#else
|
||||||
# define JSONCPP_OVERRIDE
|
#define JSONCPP_NOEXCEPT throw()
|
||||||
#endif
|
#define JSONCPP_OP_EXPLICIT
|
||||||
|
|
||||||
#ifndef JSON_HAS_RVALUE_REFERENCES
|
|
||||||
|
|
||||||
#if defined(_MSC_VER) && _MSC_VER >= 1600 // MSVC >= 2010
|
|
||||||
#define JSON_HAS_RVALUE_REFERENCES 1
|
|
||||||
#endif // MSVC >= 2010
|
|
||||||
|
|
||||||
#ifdef __clang__
|
|
||||||
#if __has_feature(cxx_rvalue_references)
|
|
||||||
#define JSON_HAS_RVALUE_REFERENCES 1
|
|
||||||
#endif // has_feature
|
|
||||||
|
|
||||||
#elif defined __GNUC__ // not clang (gcc comes later since clang emulates gcc)
|
|
||||||
#if defined(__GXX_EXPERIMENTAL_CXX0X__) || (__cplusplus >= 201103L)
|
|
||||||
#define JSON_HAS_RVALUE_REFERENCES 1
|
|
||||||
#endif // GXX_EXPERIMENTAL
|
|
||||||
|
|
||||||
#endif // __clang__ || __GNUC__
|
|
||||||
|
|
||||||
#endif // not defined JSON_HAS_RVALUE_REFERENCES
|
|
||||||
|
|
||||||
#ifndef JSON_HAS_RVALUE_REFERENCES
|
|
||||||
#define JSON_HAS_RVALUE_REFERENCES 0
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __clang__
|
#ifdef __clang__
|
||||||
|
#if __has_extension(attribute_deprecated_with_message)
|
||||||
|
#define JSONCPP_DEPRECATED(message) __attribute__((deprecated(message)))
|
||||||
|
#endif
|
||||||
#elif defined __GNUC__ // not clang (gcc comes later since clang emulates gcc)
|
#elif defined __GNUC__ // not clang (gcc comes later since clang emulates gcc)
|
||||||
# if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5))
|
#if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5))
|
||||||
# define JSONCPP_DEPRECATED(message) __attribute__ ((deprecated(message)))
|
#define JSONCPP_DEPRECATED(message) __attribute__((deprecated(message)))
|
||||||
# elif (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1))
|
#elif (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1))
|
||||||
# define JSONCPP_DEPRECATED(message) __attribute__((__deprecated__))
|
#define JSONCPP_DEPRECATED(message) __attribute__((__deprecated__))
|
||||||
# endif // GNUC version
|
#endif // GNUC version
|
||||||
#endif // __clang__ || __GNUC__
|
#elif defined(_MSC_VER) // MSVC (after clang because clang on Windows emulates
|
||||||
|
// MSVC)
|
||||||
|
#define JSONCPP_DEPRECATED(message) __declspec(deprecated(message))
|
||||||
|
#endif // __clang__ || __GNUC__ || _MSC_VER
|
||||||
|
|
||||||
#if !defined(JSONCPP_DEPRECATED)
|
#if !defined(JSONCPP_DEPRECATED)
|
||||||
#define JSONCPP_DEPRECATED(message)
|
#define JSONCPP_DEPRECATED(message)
|
||||||
#endif // if !defined(JSONCPP_DEPRECATED)
|
#endif // if !defined(JSONCPP_DEPRECATED)
|
||||||
|
|
||||||
#if __GNUC__ >= 6
|
#if __GNUC__ >= 6
|
||||||
# define JSON_USE_INT64_DOUBLE_CONVERSION 1
|
#define JSON_USE_INT64_DOUBLE_CONVERSION 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined(JSON_IS_AMALGAMATION)
|
#if !defined(JSON_IS_AMALGAMATION)
|
||||||
|
|
||||||
# include "version.h"
|
#include "allocator.h"
|
||||||
|
#include "version.h"
|
||||||
# if JSONCPP_USING_SECURE_MEMORY
|
|
||||||
# include "allocator.h" //typedef Allocator
|
|
||||||
# endif
|
|
||||||
|
|
||||||
#endif // if !defined(JSON_IS_AMALGAMATION)
|
#endif // if !defined(JSON_IS_AMALGAMATION)
|
||||||
|
|
||||||
@@ -154,24 +149,32 @@ typedef unsigned __int64 UInt64;
|
|||||||
#else // if defined(_MSC_VER) // Other platforms, use long long
|
#else // if defined(_MSC_VER) // Other platforms, use long long
|
||||||
typedef int64_t Int64;
|
typedef int64_t Int64;
|
||||||
typedef uint64_t UInt64;
|
typedef uint64_t UInt64;
|
||||||
#endif // if defined(_MSC_VER)
|
#endif // if defined(_MSC_VER)
|
||||||
typedef Int64 LargestInt;
|
typedef Int64 LargestInt;
|
||||||
typedef UInt64 LargestUInt;
|
typedef UInt64 LargestUInt;
|
||||||
#define JSON_HAS_INT64
|
#define JSON_HAS_INT64
|
||||||
#endif // if defined(JSON_NO_INT64)
|
#endif // if defined(JSON_NO_INT64)
|
||||||
#if JSONCPP_USING_SECURE_MEMORY
|
|
||||||
#define JSONCPP_STRING std::basic_string<char, std::char_traits<char>, Json::SecureAllocator<char> >
|
template <typename T>
|
||||||
#define JSONCPP_OSTRINGSTREAM std::basic_ostringstream<char, std::char_traits<char>, Json::SecureAllocator<char> >
|
using Allocator = typename std::conditional<JSONCPP_USING_SECURE_MEMORY,
|
||||||
#define JSONCPP_OSTREAM std::basic_ostream<char, std::char_traits<char>>
|
SecureAllocator<T>,
|
||||||
#define JSONCPP_ISTRINGSTREAM std::basic_istringstream<char, std::char_traits<char>, Json::SecureAllocator<char> >
|
std::allocator<T>>::type;
|
||||||
#define JSONCPP_ISTREAM std::istream
|
using String = std::basic_string<char, std::char_traits<char>, Allocator<char>>;
|
||||||
#else
|
using IStringStream = std::basic_istringstream<String::value_type,
|
||||||
#define JSONCPP_STRING std::string
|
String::traits_type,
|
||||||
#define JSONCPP_OSTRINGSTREAM std::ostringstream
|
String::allocator_type>;
|
||||||
#define JSONCPP_OSTREAM std::ostream
|
using OStringStream = std::basic_ostringstream<String::value_type,
|
||||||
#define JSONCPP_ISTRINGSTREAM std::istringstream
|
String::traits_type,
|
||||||
#define JSONCPP_ISTREAM std::istream
|
String::allocator_type>;
|
||||||
#endif // if JSONCPP_USING_SECURE_MEMORY
|
using IStream = std::istream;
|
||||||
} // end namespace Json
|
using OStream = std::ostream;
|
||||||
|
} // namespace Json
|
||||||
|
|
||||||
|
// Legacy names (formerly macros).
|
||||||
|
using JSONCPP_STRING = Json::String;
|
||||||
|
using JSONCPP_ISTRINGSTREAM = Json::IStringStream;
|
||||||
|
using JSONCPP_OSTRINGSTREAM = Json::OStringStream;
|
||||||
|
using JSONCPP_ISTREAM = Json::IStream;
|
||||||
|
using JSONCPP_OSTREAM = Json::OStream;
|
||||||
|
|
||||||
#endif // JSON_CONFIG_H_INCLUDED
|
#endif // JSON_CONFIG_H_INCLUDED
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2007-2010 Baptiste Lepilleur
|
// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors
|
||||||
// Distributed under MIT license, or public domain if desired and
|
// Distributed under MIT license, or public domain if desired and
|
||||||
// recognized in your jurisdiction.
|
// recognized in your jurisdiction.
|
||||||
// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
||||||
@@ -10,6 +10,8 @@
|
|||||||
#include "forwards.h"
|
#include "forwards.h"
|
||||||
#endif // if !defined(JSON_IS_AMALGAMATION)
|
#endif // if !defined(JSON_IS_AMALGAMATION)
|
||||||
|
|
||||||
|
#pragma pack(push, 8)
|
||||||
|
|
||||||
namespace Json {
|
namespace Json {
|
||||||
|
|
||||||
/** \brief Configuration passed to reader and writer.
|
/** \brief Configuration passed to reader and writer.
|
||||||
@@ -39,19 +41,21 @@ public:
|
|||||||
Features();
|
Features();
|
||||||
|
|
||||||
/// \c true if comments are allowed. Default: \c true.
|
/// \c true if comments are allowed. Default: \c true.
|
||||||
bool allowComments_;
|
bool allowComments_{true};
|
||||||
|
|
||||||
/// \c true if root must be either an array or an object value. Default: \c
|
/// \c true if root must be either an array or an object value. Default: \c
|
||||||
/// false.
|
/// false.
|
||||||
bool strictRoot_;
|
bool strictRoot_{false};
|
||||||
|
|
||||||
/// \c true if dropped null placeholders are allowed. Default: \c false.
|
/// \c true if dropped null placeholders are allowed. Default: \c false.
|
||||||
bool allowDroppedNullPlaceholders_;
|
bool allowDroppedNullPlaceholders_{false};
|
||||||
|
|
||||||
/// \c true if numeric object key are allowed. Default: \c false.
|
/// \c true if numeric object key are allowed. Default: \c false.
|
||||||
bool allowNumericKeys_;
|
bool allowNumericKeys_{false};
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Json
|
} // namespace Json
|
||||||
|
|
||||||
|
#pragma pack(pop)
|
||||||
|
|
||||||
#endif // CPPTL_JSON_FEATURES_H_INCLUDED
|
#endif // CPPTL_JSON_FEATURES_H_INCLUDED
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2007-2010 Baptiste Lepilleur
|
// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors
|
||||||
// Distributed under MIT license, or public domain if desired and
|
// Distributed under MIT license, or public domain if desired and
|
||||||
// recognized in your jurisdiction.
|
// recognized in your jurisdiction.
|
||||||
// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
||||||
@@ -13,11 +13,17 @@
|
|||||||
namespace Json {
|
namespace Json {
|
||||||
|
|
||||||
// writer.h
|
// writer.h
|
||||||
|
class StreamWriter;
|
||||||
|
class StreamWriterBuilder;
|
||||||
|
class Writer;
|
||||||
class FastWriter;
|
class FastWriter;
|
||||||
class StyledWriter;
|
class StyledWriter;
|
||||||
|
class StyledStreamWriter;
|
||||||
|
|
||||||
// reader.h
|
// reader.h
|
||||||
class Reader;
|
class Reader;
|
||||||
|
class CharReader;
|
||||||
|
class CharReaderBuilder;
|
||||||
|
|
||||||
// features.h
|
// features.h
|
||||||
class Features;
|
class Features;
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2007-2010 Baptiste Lepilleur
|
// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors
|
||||||
// Distributed under MIT license, or public domain if desired and
|
// Distributed under MIT license, or public domain if desired and
|
||||||
// recognized in your jurisdiction.
|
// recognized in your jurisdiction.
|
||||||
// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
||||||
@@ -7,9 +7,9 @@
|
|||||||
#define JSON_JSON_H_INCLUDED
|
#define JSON_JSON_H_INCLUDED
|
||||||
|
|
||||||
#include "autolink.h"
|
#include "autolink.h"
|
||||||
#include "value.h"
|
|
||||||
#include "reader.h"
|
|
||||||
#include "writer.h"
|
|
||||||
#include "features.h"
|
#include "features.h"
|
||||||
|
#include "reader.h"
|
||||||
|
#include "value.h"
|
||||||
|
#include "writer.h"
|
||||||
|
|
||||||
#endif // JSON_JSON_H_INCLUDED
|
#endif // JSON_JSON_H_INCLUDED
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2007-2010 Baptiste Lepilleur
|
// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors
|
||||||
// Distributed under MIT license, or public domain if desired and
|
// Distributed under MIT license, or public domain if desired and
|
||||||
// recognized in your jurisdiction.
|
// recognized in your jurisdiction.
|
||||||
// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
||||||
@@ -12,9 +12,9 @@
|
|||||||
#endif // if !defined(JSON_IS_AMALGAMATION)
|
#endif // if !defined(JSON_IS_AMALGAMATION)
|
||||||
#include <deque>
|
#include <deque>
|
||||||
#include <iosfwd>
|
#include <iosfwd>
|
||||||
|
#include <istream>
|
||||||
#include <stack>
|
#include <stack>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <istream>
|
|
||||||
|
|
||||||
// Disable warning C4251: <data member>: <type> needs to have dll-interface to
|
// Disable warning C4251: <data member>: <type> needs to have dll-interface to
|
||||||
// be used by...
|
// be used by...
|
||||||
@@ -23,6 +23,8 @@
|
|||||||
#pragma warning(disable : 4251)
|
#pragma warning(disable : 4251)
|
||||||
#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
|
#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
|
||||||
|
|
||||||
|
#pragma pack(push, 8)
|
||||||
|
|
||||||
namespace Json {
|
namespace Json {
|
||||||
|
|
||||||
/** \brief Unserialize a <a HREF="http://www.json.org">JSON</a> document into a
|
/** \brief Unserialize a <a HREF="http://www.json.org">JSON</a> document into a
|
||||||
@@ -44,17 +46,19 @@ public:
|
|||||||
struct StructuredError {
|
struct StructuredError {
|
||||||
ptrdiff_t offset_start;
|
ptrdiff_t offset_start;
|
||||||
ptrdiff_t offset_limit;
|
ptrdiff_t offset_limit;
|
||||||
JSONCPP_STRING message;
|
String message;
|
||||||
};
|
};
|
||||||
|
|
||||||
/** \brief Constructs a Reader allowing all features
|
/** \brief Constructs a Reader allowing all features
|
||||||
* for parsing.
|
* for parsing.
|
||||||
*/
|
*/
|
||||||
|
JSONCPP_DEPRECATED("Use CharReader and CharReaderBuilder instead")
|
||||||
Reader();
|
Reader();
|
||||||
|
|
||||||
/** \brief Constructs a Reader allowing the specified feature set
|
/** \brief Constructs a Reader allowing the specified feature set
|
||||||
* for parsing.
|
* for parsing.
|
||||||
*/
|
*/
|
||||||
|
JSONCPP_DEPRECATED("Use CharReader and CharReaderBuilder instead")
|
||||||
Reader(const Features& features);
|
Reader(const Features& features);
|
||||||
|
|
||||||
/** \brief Read a Value from a <a HREF="http://www.json.org">JSON</a>
|
/** \brief Read a Value from a <a HREF="http://www.json.org">JSON</a>
|
||||||
@@ -99,7 +103,7 @@ public:
|
|||||||
|
|
||||||
/// \brief Parse from input stream.
|
/// \brief Parse from input stream.
|
||||||
/// \see Json::operator>>(std::istream&, Json::Value&).
|
/// \see Json::operator>>(std::istream&, Json::Value&).
|
||||||
bool parse(JSONCPP_ISTREAM& is, Value& root, bool collectComments = true);
|
bool parse(IStream& is, Value& root, bool collectComments = true);
|
||||||
|
|
||||||
/** \brief Returns a user friendly string that list errors in the parsed
|
/** \brief Returns a user friendly string that list errors in the parsed
|
||||||
* document.
|
* document.
|
||||||
@@ -111,7 +115,7 @@ public:
|
|||||||
* \deprecated Use getFormattedErrorMessages() instead (typo fix).
|
* \deprecated Use getFormattedErrorMessages() instead (typo fix).
|
||||||
*/
|
*/
|
||||||
JSONCPP_DEPRECATED("Use getFormattedErrorMessages() instead.")
|
JSONCPP_DEPRECATED("Use getFormattedErrorMessages() instead.")
|
||||||
JSONCPP_STRING getFormatedErrorMessages() const;
|
String getFormatedErrorMessages() const;
|
||||||
|
|
||||||
/** \brief Returns a user friendly string that list errors in the parsed
|
/** \brief Returns a user friendly string that list errors in the parsed
|
||||||
* document.
|
* document.
|
||||||
@@ -121,7 +125,7 @@ public:
|
|||||||
* occurred
|
* occurred
|
||||||
* during parsing.
|
* during parsing.
|
||||||
*/
|
*/
|
||||||
JSONCPP_STRING getFormattedErrorMessages() const;
|
String getFormattedErrorMessages() const;
|
||||||
|
|
||||||
/** \brief Returns a vector of structured erros encounted while parsing.
|
/** \brief Returns a vector of structured erros encounted while parsing.
|
||||||
* \return A (possibly empty) vector of StructuredError objects. Currently
|
* \return A (possibly empty) vector of StructuredError objects. Currently
|
||||||
@@ -138,7 +142,7 @@ public:
|
|||||||
* \return \c true if the error was successfully added, \c false if the
|
* \return \c true if the error was successfully added, \c false if the
|
||||||
* Value offset exceeds the document size.
|
* Value offset exceeds the document size.
|
||||||
*/
|
*/
|
||||||
bool pushError(const Value& value, const JSONCPP_STRING& message);
|
bool pushError(const Value& value, const String& message);
|
||||||
|
|
||||||
/** \brief Add a semantic error message with extra context.
|
/** \brief Add a semantic error message with extra context.
|
||||||
* \param value JSON Value location associated with the error
|
* \param value JSON Value location associated with the error
|
||||||
@@ -147,7 +151,7 @@ public:
|
|||||||
* \return \c true if the error was successfully added, \c false if either
|
* \return \c true if the error was successfully added, \c false if either
|
||||||
* Value offset exceeds the document size.
|
* Value offset exceeds the document size.
|
||||||
*/
|
*/
|
||||||
bool pushError(const Value& value, const JSONCPP_STRING& message, const Value& extra);
|
bool pushError(const Value& value, const String& message, const Value& extra);
|
||||||
|
|
||||||
/** \brief Return whether there are any errors.
|
/** \brief Return whether there are any errors.
|
||||||
* \return \c true if there are no errors to report \c false if
|
* \return \c true if there are no errors to report \c false if
|
||||||
@@ -183,7 +187,7 @@ private:
|
|||||||
class ErrorInfo {
|
class ErrorInfo {
|
||||||
public:
|
public:
|
||||||
Token token_;
|
Token token_;
|
||||||
JSONCPP_STRING message_;
|
String message_;
|
||||||
Location extra_;
|
Location extra_;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -203,7 +207,7 @@ private:
|
|||||||
bool decodeNumber(Token& token);
|
bool decodeNumber(Token& token);
|
||||||
bool decodeNumber(Token& token, Value& decoded);
|
bool decodeNumber(Token& token, Value& decoded);
|
||||||
bool decodeString(Token& token);
|
bool decodeString(Token& token);
|
||||||
bool decodeString(Token& token, JSONCPP_STRING& decoded);
|
bool decodeString(Token& token, String& decoded);
|
||||||
bool decodeDouble(Token& token);
|
bool decodeDouble(Token& token);
|
||||||
bool decodeDouble(Token& token, Value& decoded);
|
bool decodeDouble(Token& token, Value& decoded);
|
||||||
bool decodeUnicodeCodePoint(Token& token,
|
bool decodeUnicodeCodePoint(Token& token,
|
||||||
@@ -214,9 +218,9 @@ private:
|
|||||||
Location& current,
|
Location& current,
|
||||||
Location end,
|
Location end,
|
||||||
unsigned int& unicode);
|
unsigned int& unicode);
|
||||||
bool addError(const JSONCPP_STRING& message, Token& token, Location extra = 0);
|
bool addError(const String& message, Token& token, Location extra = nullptr);
|
||||||
bool recoverFromError(TokenType skipUntilToken);
|
bool recoverFromError(TokenType skipUntilToken);
|
||||||
bool addErrorAndRecover(const JSONCPP_STRING& message,
|
bool addErrorAndRecover(const String& message,
|
||||||
Token& token,
|
Token& token,
|
||||||
TokenType skipUntilToken);
|
TokenType skipUntilToken);
|
||||||
void skipUntilSpace();
|
void skipUntilSpace();
|
||||||
@@ -224,32 +228,36 @@ private:
|
|||||||
Char getNextChar();
|
Char getNextChar();
|
||||||
void
|
void
|
||||||
getLocationLineAndColumn(Location location, int& line, int& column) const;
|
getLocationLineAndColumn(Location location, int& line, int& column) const;
|
||||||
JSONCPP_STRING getLocationLineAndColumn(Location location) const;
|
String getLocationLineAndColumn(Location location) const;
|
||||||
void addComment(Location begin, Location end, CommentPlacement placement);
|
void addComment(Location begin, Location end, CommentPlacement placement);
|
||||||
void skipCommentTokens(Token& token);
|
void skipCommentTokens(Token& token);
|
||||||
|
|
||||||
|
static bool containsNewLine(Location begin, Location end);
|
||||||
|
static String normalizeEOL(Location begin, Location end);
|
||||||
|
|
||||||
typedef std::stack<Value*> Nodes;
|
typedef std::stack<Value*> Nodes;
|
||||||
Nodes nodes_;
|
Nodes nodes_;
|
||||||
Errors errors_;
|
Errors errors_;
|
||||||
JSONCPP_STRING document_;
|
String document_;
|
||||||
Location begin_;
|
Location begin_{};
|
||||||
Location end_;
|
Location end_{};
|
||||||
Location current_;
|
Location current_{};
|
||||||
Location lastValueEnd_;
|
Location lastValueEnd_{};
|
||||||
Value* lastValue_;
|
Value* lastValue_{};
|
||||||
JSONCPP_STRING commentsBefore_;
|
String commentsBefore_;
|
||||||
Features features_;
|
Features features_;
|
||||||
bool collectComments_;
|
bool collectComments_{};
|
||||||
}; // Reader
|
}; // Reader
|
||||||
|
|
||||||
/** Interface for reading JSON from a char array.
|
/** Interface for reading JSON from a char array.
|
||||||
*/
|
*/
|
||||||
class JSON_API CharReader {
|
class JSON_API CharReader {
|
||||||
public:
|
public:
|
||||||
virtual ~CharReader() {}
|
virtual ~CharReader() = default;
|
||||||
/** \brief Read a Value from a <a HREF="http://www.json.org">JSON</a>
|
/** \brief Read a Value from a <a HREF="http://www.json.org">JSON</a>
|
||||||
document.
|
document.
|
||||||
* The document must be a UTF-8 encoded string containing the document to read.
|
* The document must be a UTF-8 encoded string containing the document to
|
||||||
|
read.
|
||||||
*
|
*
|
||||||
* \param beginDoc Pointer on the beginning of the UTF-8 encoded string of the
|
* \param beginDoc Pointer on the beginning of the UTF-8 encoded string of the
|
||||||
document to read.
|
document to read.
|
||||||
@@ -264,19 +272,20 @@ public:
|
|||||||
* \return \c true if the document was successfully parsed, \c false if an
|
* \return \c true if the document was successfully parsed, \c false if an
|
||||||
error occurred.
|
error occurred.
|
||||||
*/
|
*/
|
||||||
virtual bool parse(
|
virtual bool parse(char const* beginDoc,
|
||||||
char const* beginDoc, char const* endDoc,
|
char const* endDoc,
|
||||||
Value* root, JSONCPP_STRING* errs) = 0;
|
Value* root,
|
||||||
|
String* errs) = 0;
|
||||||
|
|
||||||
class JSON_API Factory {
|
class JSON_API Factory {
|
||||||
public:
|
public:
|
||||||
virtual ~Factory() {}
|
virtual ~Factory() = default;
|
||||||
/** \brief Allocate a CharReader via operator new().
|
/** \brief Allocate a CharReader via operator new().
|
||||||
* \throw std::exception if something goes wrong (e.g. invalid settings)
|
* \throw std::exception if something goes wrong (e.g. invalid settings)
|
||||||
*/
|
*/
|
||||||
virtual CharReader* newCharReader() const = 0;
|
virtual CharReader* newCharReader() const = 0;
|
||||||
}; // Factory
|
}; // Factory
|
||||||
}; // CharReader
|
}; // CharReader
|
||||||
|
|
||||||
/** \brief Build a CharReader implementation.
|
/** \brief Build a CharReader implementation.
|
||||||
|
|
||||||
@@ -286,7 +295,7 @@ Usage:
|
|||||||
CharReaderBuilder builder;
|
CharReaderBuilder builder;
|
||||||
builder["collectComments"] = false;
|
builder["collectComments"] = false;
|
||||||
Value value;
|
Value value;
|
||||||
JSONCPP_STRING errs;
|
String errs;
|
||||||
bool ok = parseFromStream(builder, std::cin, &value, &errs);
|
bool ok = parseFromStream(builder, std::cin, &value, &errs);
|
||||||
\endcode
|
\endcode
|
||||||
*/
|
*/
|
||||||
@@ -306,7 +315,8 @@ public:
|
|||||||
- `"strictRoot": false or true`
|
- `"strictRoot": false or true`
|
||||||
- true if root must be either an array or an object value
|
- true if root must be either an array or an object value
|
||||||
- `"allowDroppedNullPlaceholders": false or true`
|
- `"allowDroppedNullPlaceholders": false or true`
|
||||||
- true if dropped null placeholders are allowed. (See StreamWriterBuilder.)
|
- true if dropped null placeholders are allowed. (See
|
||||||
|
StreamWriterBuilder.)
|
||||||
- `"allowNumericKeys": false or true`
|
- `"allowNumericKeys": false or true`
|
||||||
- true if numeric object keys are allowed.
|
- true if numeric object keys are allowed.
|
||||||
- `"allowSingleQuotes": false or true`
|
- `"allowSingleQuotes": false or true`
|
||||||
@@ -320,9 +330,10 @@ public:
|
|||||||
- If true, `parse()` returns false when extra non-whitespace trails
|
- If true, `parse()` returns false when extra non-whitespace trails
|
||||||
the JSON value in the input string.
|
the JSON value in the input string.
|
||||||
- `"rejectDupKeys": false or true`
|
- `"rejectDupKeys": false or true`
|
||||||
- If true, `parse()` returns false when a key is duplicated within an object.
|
- If true, `parse()` returns false when a key is duplicated within an
|
||||||
|
object.
|
||||||
- `"allowSpecialFloats": false or true`
|
- `"allowSpecialFloats": false or true`
|
||||||
- If true, special float values (NaNs and infinities) are allowed
|
- If true, special float values (NaNs and infinities) are allowed
|
||||||
and their values are lossfree restorable.
|
and their values are lossfree restorable.
|
||||||
|
|
||||||
You can examine 'settings_` yourself
|
You can examine 'settings_` yourself
|
||||||
@@ -333,9 +344,9 @@ public:
|
|||||||
Json::Value settings_;
|
Json::Value settings_;
|
||||||
|
|
||||||
CharReaderBuilder();
|
CharReaderBuilder();
|
||||||
~CharReaderBuilder() JSONCPP_OVERRIDE;
|
~CharReaderBuilder() override;
|
||||||
|
|
||||||
CharReader* newCharReader() const JSONCPP_OVERRIDE;
|
CharReader* newCharReader() const override;
|
||||||
|
|
||||||
/** \return true if 'settings' are legal and consistent;
|
/** \return true if 'settings' are legal and consistent;
|
||||||
* otherwise, indicate bad settings via 'invalid'.
|
* otherwise, indicate bad settings via 'invalid'.
|
||||||
@@ -344,7 +355,7 @@ public:
|
|||||||
|
|
||||||
/** A simple way to update a specific setting.
|
/** A simple way to update a specific setting.
|
||||||
*/
|
*/
|
||||||
Value& operator[](JSONCPP_STRING key);
|
Value& operator[](const String& key);
|
||||||
|
|
||||||
/** Called by ctor, but you can use this to reset settings_.
|
/** Called by ctor, but you can use this to reset settings_.
|
||||||
* \pre 'settings' != NULL (but Json::null is fine)
|
* \pre 'settings' != NULL (but Json::null is fine)
|
||||||
@@ -361,13 +372,13 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
/** Consume entire stream and use its begin/end.
|
/** Consume entire stream and use its begin/end.
|
||||||
* Someday we might have a real StreamReader, but for now this
|
* Someday we might have a real StreamReader, but for now this
|
||||||
* is convenient.
|
* is convenient.
|
||||||
*/
|
*/
|
||||||
bool JSON_API parseFromStream(
|
bool JSON_API parseFromStream(CharReader::Factory const&,
|
||||||
CharReader::Factory const&,
|
IStream&,
|
||||||
JSONCPP_ISTREAM&,
|
Value* root,
|
||||||
Value* root, std::string* errs);
|
String* errs);
|
||||||
|
|
||||||
/** \brief Read from 'sin' into 'root'.
|
/** \brief Read from 'sin' into 'root'.
|
||||||
|
|
||||||
@@ -393,10 +404,12 @@ bool JSON_API parseFromStream(
|
|||||||
\throw std::exception on parse error.
|
\throw std::exception on parse error.
|
||||||
\see Json::operator<<()
|
\see Json::operator<<()
|
||||||
*/
|
*/
|
||||||
JSON_API JSONCPP_ISTREAM& operator>>(JSONCPP_ISTREAM&, Value&);
|
JSON_API IStream& operator>>(IStream&, Value&);
|
||||||
|
|
||||||
} // namespace Json
|
} // namespace Json
|
||||||
|
|
||||||
|
#pragma pack(pop)
|
||||||
|
|
||||||
#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
|
#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
|
||||||
#pragma warning(pop)
|
#pragma warning(pop)
|
||||||
#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
|
#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2007-2010 Baptiste Lepilleur
|
// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors
|
||||||
// Distributed under MIT license, or public domain if desired and
|
// Distributed under MIT license, or public domain if desired and
|
||||||
// recognized in your jurisdiction.
|
// recognized in your jurisdiction.
|
||||||
// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
||||||
@@ -9,9 +9,11 @@
|
|||||||
#if !defined(JSON_IS_AMALGAMATION)
|
#if !defined(JSON_IS_AMALGAMATION)
|
||||||
#include "forwards.h"
|
#include "forwards.h"
|
||||||
#endif // if !defined(JSON_IS_AMALGAMATION)
|
#endif // if !defined(JSON_IS_AMALGAMATION)
|
||||||
|
#include <array>
|
||||||
|
#include <exception>
|
||||||
|
#include <memory>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <exception>
|
|
||||||
|
|
||||||
#ifndef JSON_USE_CPPTL_SMALLMAP
|
#ifndef JSON_USE_CPPTL_SMALLMAP
|
||||||
#include <map>
|
#include <map>
|
||||||
@@ -22,19 +24,6 @@
|
|||||||
#include <cpptl/forwards.h>
|
#include <cpptl/forwards.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//Conditional NORETURN attribute on the throw functions would:
|
|
||||||
// a) suppress false positives from static code analysis
|
|
||||||
// b) possibly improve optimization opportunities.
|
|
||||||
#if !defined(JSONCPP_NORETURN)
|
|
||||||
# if defined(_MSC_VER)
|
|
||||||
# define JSONCPP_NORETURN __declspec(noreturn)
|
|
||||||
# elif defined(__GNUC__)
|
|
||||||
# define JSONCPP_NORETURN __attribute__ ((__noreturn__))
|
|
||||||
# else
|
|
||||||
# define JSONCPP_NORETURN
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Disable warning C4251: <data member>: <type> needs to have dll-interface to
|
// Disable warning C4251: <data member>: <type> needs to have dll-interface to
|
||||||
// be used by...
|
// be used by...
|
||||||
#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
|
#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
|
||||||
@@ -42,49 +31,54 @@
|
|||||||
#pragma warning(disable : 4251)
|
#pragma warning(disable : 4251)
|
||||||
#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
|
#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
|
||||||
|
|
||||||
|
#pragma pack(push, 8)
|
||||||
|
|
||||||
/** \brief JSON (JavaScript Object Notation).
|
/** \brief JSON (JavaScript Object Notation).
|
||||||
*/
|
*/
|
||||||
namespace Json {
|
namespace Json {
|
||||||
|
|
||||||
|
#if JSON_USE_EXCEPTION
|
||||||
/** Base class for all exceptions we throw.
|
/** Base class for all exceptions we throw.
|
||||||
*
|
*
|
||||||
* We use nothing but these internally. Of course, STL can throw others.
|
* We use nothing but these internally. Of course, STL can throw others.
|
||||||
*/
|
*/
|
||||||
class JSON_API Exception : public std::exception {
|
class JSON_API Exception : public std::exception {
|
||||||
public:
|
public:
|
||||||
Exception(JSONCPP_STRING const& msg);
|
Exception(String msg);
|
||||||
~Exception() throw() JSONCPP_OVERRIDE;
|
~Exception() JSONCPP_NOEXCEPT override;
|
||||||
char const* what() const throw() JSONCPP_OVERRIDE;
|
char const* what() const JSONCPP_NOEXCEPT override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
JSONCPP_STRING msg_;
|
String msg_;
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Exceptions which the user cannot easily avoid.
|
/** Exceptions which the user cannot easily avoid.
|
||||||
*
|
*
|
||||||
* E.g. out-of-memory (when we use malloc), stack-overflow, malicious input
|
* E.g. out-of-memory (when we use malloc), stack-overflow, malicious input
|
||||||
*
|
*
|
||||||
* \remark derived from Json::Exception
|
* \remark derived from Json::Exception
|
||||||
*/
|
*/
|
||||||
class JSON_API RuntimeError : public Exception {
|
class JSON_API RuntimeError : public Exception {
|
||||||
public:
|
public:
|
||||||
RuntimeError(JSONCPP_STRING const& msg);
|
RuntimeError(String const& msg);
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Exceptions thrown by JSON_ASSERT/JSON_FAIL macros.
|
/** Exceptions thrown by JSON_ASSERT/JSON_FAIL macros.
|
||||||
*
|
*
|
||||||
* These are precondition-violations (user bugs) and internal errors (our bugs).
|
* These are precondition-violations (user bugs) and internal errors (our bugs).
|
||||||
*
|
*
|
||||||
* \remark derived from Json::Exception
|
* \remark derived from Json::Exception
|
||||||
*/
|
*/
|
||||||
class JSON_API LogicError : public Exception {
|
class JSON_API LogicError : public Exception {
|
||||||
public:
|
public:
|
||||||
LogicError(JSONCPP_STRING const& msg);
|
LogicError(String const& msg);
|
||||||
};
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
/// used internally
|
/// used internally
|
||||||
JSONCPP_NORETURN void throwRuntimeError(JSONCPP_STRING const& msg);
|
[[noreturn]] void throwRuntimeError(String const& msg);
|
||||||
/// used internally
|
/// used internally
|
||||||
JSONCPP_NORETURN void throwLogicError(JSONCPP_STRING const& msg);
|
[[noreturn]] void throwLogicError(String const& msg);
|
||||||
|
|
||||||
/** \brief Type of the value held by a Value object.
|
/** \brief Type of the value held by a Value object.
|
||||||
*/
|
*/
|
||||||
@@ -107,6 +101,13 @@ enum CommentPlacement {
|
|||||||
numberOfCommentPlacement
|
numberOfCommentPlacement
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/** \brief Type of precision for formatting of real values.
|
||||||
|
*/
|
||||||
|
enum PrecisionType {
|
||||||
|
significantDigits = 0, ///< we set max number of significant digits in string
|
||||||
|
decimalPlaces ///< we set max number of digits after "." in string
|
||||||
|
};
|
||||||
|
|
||||||
//# ifdef JSON_USE_CPPTL
|
//# ifdef JSON_USE_CPPTL
|
||||||
// typedef CppTL::AnyEnumerator<const char *> EnumMemberNames;
|
// typedef CppTL::AnyEnumerator<const char *> EnumMemberNames;
|
||||||
// typedef CppTL::AnyEnumerator<const Value &> EnumValues;
|
// typedef CppTL::AnyEnumerator<const Value &> EnumValues;
|
||||||
@@ -114,7 +115,7 @@ enum CommentPlacement {
|
|||||||
|
|
||||||
/** \brief Lightweight wrapper to tag static string.
|
/** \brief Lightweight wrapper to tag static string.
|
||||||
*
|
*
|
||||||
* Value constructor and objectValue member assignement takes advantage of the
|
* Value constructor and objectValue member assignment takes advantage of the
|
||||||
* StaticString and avoid the cost of string duplication when storing the
|
* StaticString and avoid the cost of string duplication when storing the
|
||||||
* string or the member name.
|
* string or the member name.
|
||||||
*
|
*
|
||||||
@@ -163,7 +164,7 @@ private:
|
|||||||
* The get() methods can be used to obtain default value in the case the
|
* The get() methods can be used to obtain default value in the case the
|
||||||
* required element does not exist.
|
* required element does not exist.
|
||||||
*
|
*
|
||||||
* It is possible to iterate over the list of a #objectValue values using
|
* It is possible to iterate over the list of member keys of an object using
|
||||||
* the getMemberNames() method.
|
* the getMemberNames() method.
|
||||||
*
|
*
|
||||||
* \note #Value string-length fit in size_t, but keys must be < 2^30.
|
* \note #Value string-length fit in size_t, but keys must be < 2^30.
|
||||||
@@ -174,8 +175,9 @@ private:
|
|||||||
*/
|
*/
|
||||||
class JSON_API Value {
|
class JSON_API Value {
|
||||||
friend class ValueIteratorBase;
|
friend class ValueIteratorBase;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
typedef std::vector<JSONCPP_STRING> Members;
|
typedef std::vector<String> Members;
|
||||||
typedef ValueIterator iterator;
|
typedef ValueIterator iterator;
|
||||||
typedef ValueConstIterator const_iterator;
|
typedef ValueConstIterator const_iterator;
|
||||||
typedef Json::UInt UInt;
|
typedef Json::UInt UInt;
|
||||||
@@ -188,9 +190,17 @@ public:
|
|||||||
typedef Json::LargestUInt LargestUInt;
|
typedef Json::LargestUInt LargestUInt;
|
||||||
typedef Json::ArrayIndex ArrayIndex;
|
typedef Json::ArrayIndex ArrayIndex;
|
||||||
|
|
||||||
static const Value& null; ///< We regret this reference to a global instance; prefer the simpler Value().
|
// Required for boost integration, e. g. BOOST_TEST
|
||||||
static const Value& nullRef; ///< just a kludge for binary-compatibility; same as null
|
typedef std::string value_type;
|
||||||
static Value const& nullSingleton(); ///< Prefer this to null or nullRef.
|
|
||||||
|
#if JSON_USE_NULLREF
|
||||||
|
// Binary compatibility kludges, do not use.
|
||||||
|
static const Value& null;
|
||||||
|
static const Value& nullRef;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// null and nullRef are deprecated, use this instead.
|
||||||
|
static Value const& nullSingleton();
|
||||||
|
|
||||||
/// Minimum signed integer value that can be stored in a Json::Value.
|
/// Minimum signed integer value that can be stored in a Json::Value.
|
||||||
static const LargestInt minLargestInt;
|
static const LargestInt minLargestInt;
|
||||||
@@ -215,27 +225,33 @@ public:
|
|||||||
static const UInt64 maxUInt64;
|
static const UInt64 maxUInt64;
|
||||||
#endif // defined(JSON_HAS_INT64)
|
#endif // defined(JSON_HAS_INT64)
|
||||||
|
|
||||||
|
/// Default precision for real value for string representation.
|
||||||
|
static const UInt defaultRealPrecision;
|
||||||
|
|
||||||
|
// Workaround for bug in the NVIDIAs CUDA 9.1 nvcc compiler
|
||||||
|
// when using gcc and clang backend compilers. CZString
|
||||||
|
// cannot be defined as private. See issue #486
|
||||||
|
#ifdef __NVCC__
|
||||||
|
public:
|
||||||
|
#else
|
||||||
private:
|
private:
|
||||||
|
#endif
|
||||||
#ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION
|
#ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION
|
||||||
class CZString {
|
class CZString {
|
||||||
public:
|
public:
|
||||||
enum DuplicationPolicy {
|
enum DuplicationPolicy { noDuplication = 0, duplicate, duplicateOnCopy };
|
||||||
noDuplication = 0,
|
|
||||||
duplicate,
|
|
||||||
duplicateOnCopy
|
|
||||||
};
|
|
||||||
CZString(ArrayIndex index);
|
CZString(ArrayIndex index);
|
||||||
CZString(char const* str, unsigned length, DuplicationPolicy allocate);
|
CZString(char const* str, unsigned length, DuplicationPolicy allocate);
|
||||||
CZString(CZString const& other);
|
CZString(CZString const& other);
|
||||||
#if JSON_HAS_RVALUE_REFERENCES
|
|
||||||
CZString(CZString&& other);
|
CZString(CZString&& other);
|
||||||
#endif
|
|
||||||
~CZString();
|
~CZString();
|
||||||
CZString& operator=(CZString other);
|
CZString& operator=(const CZString& other);
|
||||||
|
CZString& operator=(CZString&& other);
|
||||||
|
|
||||||
bool operator<(CZString const& other) const;
|
bool operator<(CZString const& other) const;
|
||||||
bool operator==(CZString const& other) const;
|
bool operator==(CZString const& other) const;
|
||||||
ArrayIndex index() const;
|
ArrayIndex index() const;
|
||||||
//const char* c_str() const; ///< \deprecated
|
// const char* c_str() const; ///< \deprecated
|
||||||
char const* data() const;
|
char const* data() const;
|
||||||
unsigned length() const;
|
unsigned length() const;
|
||||||
bool isStaticString() const;
|
bool isStaticString() const;
|
||||||
@@ -244,11 +260,11 @@ private:
|
|||||||
void swap(CZString& other);
|
void swap(CZString& other);
|
||||||
|
|
||||||
struct StringStorage {
|
struct StringStorage {
|
||||||
unsigned policy_: 2;
|
unsigned policy_ : 2;
|
||||||
unsigned length_: 30; // 1GB max
|
unsigned length_ : 30; // 1GB max
|
||||||
};
|
};
|
||||||
|
|
||||||
char const* cstr_; // actually, a prefixed string, unless policy is noDup
|
char const* cstr_; // actually, a prefixed string, unless policy is noDup
|
||||||
union {
|
union {
|
||||||
ArrayIndex index_;
|
ArrayIndex index_;
|
||||||
StringStorage storage_;
|
StringStorage storage_;
|
||||||
@@ -305,27 +321,31 @@ Json::Value obj_value(Json::objectValue); // {}
|
|||||||
* \endcode
|
* \endcode
|
||||||
*/
|
*/
|
||||||
Value(const StaticString& value);
|
Value(const StaticString& value);
|
||||||
Value(const JSONCPP_STRING& value); ///< Copy data() til size(). Embedded zeroes too.
|
Value(const String& value); ///< Copy data() til size(). Embedded
|
||||||
|
///< zeroes too.
|
||||||
#ifdef JSON_USE_CPPTL
|
#ifdef JSON_USE_CPPTL
|
||||||
Value(const CppTL::ConstString& value);
|
Value(const CppTL::ConstString& value);
|
||||||
#endif
|
#endif
|
||||||
Value(bool value);
|
Value(bool value);
|
||||||
/// Deep copy.
|
|
||||||
Value(const Value& other);
|
Value(const Value& other);
|
||||||
#if JSON_HAS_RVALUE_REFERENCES
|
|
||||||
/// Move constructor
|
|
||||||
Value(Value&& other);
|
Value(Value&& other);
|
||||||
#endif
|
|
||||||
~Value();
|
~Value();
|
||||||
|
|
||||||
/// Deep copy, then swap(other).
|
/// \note Overwrite existing comments. To preserve comments, use
|
||||||
/// \note Over-write existing comments. To preserve comments, use #swapPayload().
|
/// #swapPayload().
|
||||||
Value& operator=(Value other);
|
Value& operator=(const Value& other);
|
||||||
|
Value& operator=(Value&& other);
|
||||||
|
|
||||||
/// Swap everything.
|
/// Swap everything.
|
||||||
void swap(Value& other);
|
void swap(Value& other);
|
||||||
/// Swap values but leave comments and source offsets in place.
|
/// Swap values but leave comments and source offsets in place.
|
||||||
void swapPayload(Value& other);
|
void swapPayload(Value& other);
|
||||||
|
|
||||||
|
/// copy everything.
|
||||||
|
void copy(const Value& other);
|
||||||
|
/// copy values but leave comments and source offsets in place.
|
||||||
|
void copyPayload(const Value& other);
|
||||||
|
|
||||||
ValueType type() const;
|
ValueType type() const;
|
||||||
|
|
||||||
/// Compare payload only, not comments etc.
|
/// Compare payload only, not comments etc.
|
||||||
@@ -339,14 +359,14 @@ Json::Value obj_value(Json::objectValue); // {}
|
|||||||
|
|
||||||
const char* asCString() const; ///< Embedded zeroes could cause you trouble!
|
const char* asCString() const; ///< Embedded zeroes could cause you trouble!
|
||||||
#if JSONCPP_USING_SECURE_MEMORY
|
#if JSONCPP_USING_SECURE_MEMORY
|
||||||
unsigned getCStringLength() const; //Allows you to understand the length of the CString
|
unsigned getCStringLength() const; // Allows you to understand the length of
|
||||||
|
// the CString
|
||||||
#endif
|
#endif
|
||||||
JSONCPP_STRING asString() const; ///< Embedded zeroes are possible.
|
String asString() const; ///< Embedded zeroes are possible.
|
||||||
/** Get raw char* of string-value.
|
/** Get raw char* of string-value.
|
||||||
* \return false if !string. (Seg-fault if str or end are NULL.)
|
* \return false if !string. (Seg-fault if str or end are NULL.)
|
||||||
*/
|
*/
|
||||||
bool getString(
|
bool getString(char const** begin, char const** end) const;
|
||||||
char const** begin, char const** end) const;
|
|
||||||
#ifdef JSON_USE_CPPTL
|
#ifdef JSON_USE_CPPTL
|
||||||
CppTL::ConstString asConstString() const;
|
CppTL::ConstString asConstString() const;
|
||||||
#endif
|
#endif
|
||||||
@@ -384,20 +404,20 @@ Json::Value obj_value(Json::objectValue); // {}
|
|||||||
/// otherwise, false.
|
/// otherwise, false.
|
||||||
bool empty() const;
|
bool empty() const;
|
||||||
|
|
||||||
/// Return isNull()
|
/// Return !isNull()
|
||||||
bool operator!() const;
|
JSONCPP_OP_EXPLICIT operator bool() const;
|
||||||
|
|
||||||
/// Remove all object members and array elements.
|
/// Remove all object members and array elements.
|
||||||
/// \pre type() is arrayValue, objectValue, or nullValue
|
/// \pre type() is arrayValue, objectValue, or nullValue
|
||||||
/// \post type() is unchanged
|
/// \post type() is unchanged
|
||||||
void clear();
|
void clear();
|
||||||
|
|
||||||
/// Resize the array to size elements.
|
/// Resize the array to newSize elements.
|
||||||
/// New elements are initialized to null.
|
/// New elements are initialized to null.
|
||||||
/// May only be called on nullValue or arrayValue.
|
/// May only be called on nullValue or arrayValue.
|
||||||
/// \pre type() is arrayValue or nullValue
|
/// \pre type() is arrayValue or nullValue
|
||||||
/// \post type() is arrayValue
|
/// \post type() is arrayValue
|
||||||
void resize(ArrayIndex size);
|
void resize(ArrayIndex newSize);
|
||||||
|
|
||||||
/// Access an array element (zero based index ).
|
/// Access an array element (zero based index ).
|
||||||
/// If the array contains less than index element, then null value are
|
/// If the array contains less than index element, then null value are
|
||||||
@@ -435,6 +455,7 @@ Json::Value obj_value(Json::objectValue); // {}
|
|||||||
///
|
///
|
||||||
/// Equivalent to jsonvalue[jsonvalue.size()] = value;
|
/// Equivalent to jsonvalue[jsonvalue.size()] = value;
|
||||||
Value& append(const Value& value);
|
Value& append(const Value& value);
|
||||||
|
Value& append(Value&& value);
|
||||||
|
|
||||||
/// Access an object value by name, create a null member if it does not exist.
|
/// Access an object value by name, create a null member if it does not exist.
|
||||||
/// \note Because of our implementation, keys are limited to 2^30 -1 chars.
|
/// \note Because of our implementation, keys are limited to 2^30 -1 chars.
|
||||||
@@ -445,15 +466,16 @@ Json::Value obj_value(Json::objectValue); // {}
|
|||||||
const Value& operator[](const char* key) const;
|
const Value& operator[](const char* key) const;
|
||||||
/// Access an object value by name, create a null member if it does not exist.
|
/// Access an object value by name, create a null member if it does not exist.
|
||||||
/// \param key may contain embedded nulls.
|
/// \param key may contain embedded nulls.
|
||||||
Value& operator[](const JSONCPP_STRING& key);
|
Value& operator[](const String& key);
|
||||||
/// Access an object value by name, returns null if there is no member with
|
/// Access an object value by name, returns null if there is no member with
|
||||||
/// that name.
|
/// that name.
|
||||||
/// \param key may contain embedded nulls.
|
/// \param key may contain embedded nulls.
|
||||||
const Value& operator[](const JSONCPP_STRING& key) const;
|
const Value& operator[](const String& key) const;
|
||||||
/** \brief Access an object value by name, create a null member if it does not
|
/** \brief Access an object value by name, create a null member if it does not
|
||||||
exist.
|
exist.
|
||||||
|
|
||||||
* If the object has no entry for that name, then the member name used to store
|
* If the object has no entry for that name, then the member name used to
|
||||||
|
store
|
||||||
* the new entry is not duplicated.
|
* the new entry is not duplicated.
|
||||||
* Example of use:
|
* Example of use:
|
||||||
* \code
|
* \code
|
||||||
@@ -476,11 +498,12 @@ Json::Value obj_value(Json::objectValue); // {}
|
|||||||
/// Return the member named key if it exist, defaultValue otherwise.
|
/// Return the member named key if it exist, defaultValue otherwise.
|
||||||
/// \note deep copy
|
/// \note deep copy
|
||||||
/// \note key may contain embedded nulls.
|
/// \note key may contain embedded nulls.
|
||||||
Value get(const char* begin, const char* end, const Value& defaultValue) const;
|
Value
|
||||||
|
get(const char* begin, const char* end, const Value& defaultValue) const;
|
||||||
/// Return the member named key if it exist, defaultValue otherwise.
|
/// Return the member named key if it exist, defaultValue otherwise.
|
||||||
/// \note deep copy
|
/// \note deep copy
|
||||||
/// \param key may contain embedded nulls.
|
/// \param key may contain embedded nulls.
|
||||||
Value get(const JSONCPP_STRING& key, const Value& defaultValue) const;
|
Value get(const String& key, const Value& defaultValue) const;
|
||||||
#ifdef JSON_USE_CPPTL
|
#ifdef JSON_USE_CPPTL
|
||||||
/// Return the member named key if it exist, defaultValue otherwise.
|
/// Return the member named key if it exist, defaultValue otherwise.
|
||||||
/// \note deep copy
|
/// \note deep copy
|
||||||
@@ -493,19 +516,16 @@ Json::Value obj_value(Json::objectValue); // {}
|
|||||||
/// Most general and efficient version of object-mutators.
|
/// Most general and efficient version of object-mutators.
|
||||||
/// \note As stated elsewhere, behavior is undefined if (end-begin) >= 2^30
|
/// \note As stated elsewhere, behavior is undefined if (end-begin) >= 2^30
|
||||||
/// \return non-zero, but JSON_ASSERT if this is neither object nor nullValue.
|
/// \return non-zero, but JSON_ASSERT if this is neither object nor nullValue.
|
||||||
Value const* demand(char const* begin, char const* end);
|
Value* demand(char const* begin, char const* end);
|
||||||
/// \brief Remove and return the named member.
|
/// \brief Remove and return the named member.
|
||||||
///
|
///
|
||||||
/// Do nothing if it did not exist.
|
/// Do nothing if it did not exist.
|
||||||
/// \return the removed Value, or null.
|
|
||||||
/// \pre type() is objectValue or nullValue
|
/// \pre type() is objectValue or nullValue
|
||||||
/// \post type() is unchanged
|
/// \post type() is unchanged
|
||||||
/// \deprecated
|
void removeMember(const char* key);
|
||||||
Value removeMember(const char* key);
|
|
||||||
/// Same as removeMember(const char*)
|
/// Same as removeMember(const char*)
|
||||||
/// \param key may contain embedded nulls.
|
/// \param key may contain embedded nulls.
|
||||||
/// \deprecated
|
void removeMember(const String& key);
|
||||||
Value removeMember(const JSONCPP_STRING& key);
|
|
||||||
/// Same as removeMember(const char* begin, const char* end, Value* removed),
|
/// Same as removeMember(const char* begin, const char* end, Value* removed),
|
||||||
/// but 'key' is null-terminated.
|
/// but 'key' is null-terminated.
|
||||||
bool removeMember(const char* key, Value* removed);
|
bool removeMember(const char* key, Value* removed);
|
||||||
@@ -515,24 +535,24 @@ Json::Value obj_value(Json::objectValue); // {}
|
|||||||
\param key may contain embedded nulls.
|
\param key may contain embedded nulls.
|
||||||
\return true iff removed (no exceptions)
|
\return true iff removed (no exceptions)
|
||||||
*/
|
*/
|
||||||
bool removeMember(JSONCPP_STRING const& key, Value* removed);
|
bool removeMember(String const& key, Value* removed);
|
||||||
/// Same as removeMember(JSONCPP_STRING const& key, Value* removed)
|
/// Same as removeMember(String const& key, Value* removed)
|
||||||
bool removeMember(const char* begin, const char* end, Value* removed);
|
bool removeMember(const char* begin, const char* end, Value* removed);
|
||||||
/** \brief Remove the indexed array element.
|
/** \brief Remove the indexed array element.
|
||||||
|
|
||||||
O(n) expensive operations.
|
O(n) expensive operations.
|
||||||
Update 'removed' iff removed.
|
Update 'removed' iff removed.
|
||||||
\return true iff removed (no exceptions)
|
\return true if removed (no exceptions)
|
||||||
*/
|
*/
|
||||||
bool removeIndex(ArrayIndex i, Value* removed);
|
bool removeIndex(ArrayIndex index, Value* removed);
|
||||||
|
|
||||||
/// Return true if the object has a member named key.
|
/// Return true if the object has a member named key.
|
||||||
/// \note 'key' must be null-terminated.
|
/// \note 'key' must be null-terminated.
|
||||||
bool isMember(const char* key) const;
|
bool isMember(const char* key) const;
|
||||||
/// Return true if the object has a member named key.
|
/// Return true if the object has a member named key.
|
||||||
/// \param key may contain embedded nulls.
|
/// \param key may contain embedded nulls.
|
||||||
bool isMember(const JSONCPP_STRING& key) const;
|
bool isMember(const String& key) const;
|
||||||
/// Same as isMember(JSONCPP_STRING const& key)const
|
/// Same as isMember(String const& key)const
|
||||||
bool isMember(const char* begin, const char* end) const;
|
bool isMember(const char* begin, const char* end) const;
|
||||||
#ifdef JSON_USE_CPPTL
|
#ifdef JSON_USE_CPPTL
|
||||||
/// Return true if the object has a member named key.
|
/// Return true if the object has a member named key.
|
||||||
@@ -552,17 +572,21 @@ Json::Value obj_value(Json::objectValue); // {}
|
|||||||
//# endif
|
//# endif
|
||||||
|
|
||||||
/// \deprecated Always pass len.
|
/// \deprecated Always pass len.
|
||||||
JSONCPP_DEPRECATED("Use setComment(JSONCPP_STRING const&) instead.")
|
JSONCPP_DEPRECATED("Use setComment(String const&) instead.")
|
||||||
void setComment(const char* comment, CommentPlacement placement);
|
void setComment(const char* comment, CommentPlacement placement) {
|
||||||
|
setComment(String(comment, strlen(comment)), placement);
|
||||||
|
}
|
||||||
/// Comments must be //... or /* ... */
|
/// Comments must be //... or /* ... */
|
||||||
void setComment(const char* comment, size_t len, CommentPlacement placement);
|
void setComment(const char* comment, size_t len, CommentPlacement placement) {
|
||||||
|
setComment(String(comment, len), placement);
|
||||||
|
}
|
||||||
/// Comments must be //... or /* ... */
|
/// Comments must be //... or /* ... */
|
||||||
void setComment(const JSONCPP_STRING& comment, CommentPlacement placement);
|
void setComment(String comment, CommentPlacement placement);
|
||||||
bool hasComment(CommentPlacement placement) const;
|
bool hasComment(CommentPlacement placement) const;
|
||||||
/// Include delimiters and embedded newlines.
|
/// Include delimiters and embedded newlines.
|
||||||
JSONCPP_STRING getComment(CommentPlacement placement) const;
|
String getComment(CommentPlacement placement) const;
|
||||||
|
|
||||||
JSONCPP_STRING toStyledString() const;
|
String toStyledString() const;
|
||||||
|
|
||||||
const_iterator begin() const;
|
const_iterator begin() const;
|
||||||
const_iterator end() const;
|
const_iterator end() const;
|
||||||
@@ -578,20 +602,20 @@ Json::Value obj_value(Json::objectValue); // {}
|
|||||||
ptrdiff_t getOffsetLimit() const;
|
ptrdiff_t getOffsetLimit() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void setType(ValueType v) {
|
||||||
|
bits_.value_type_ = static_cast<unsigned char>(v);
|
||||||
|
}
|
||||||
|
bool isAllocated() const { return bits_.allocated_; }
|
||||||
|
void setIsAllocated(bool v) { bits_.allocated_ = v; }
|
||||||
|
|
||||||
void initBasic(ValueType type, bool allocated = false);
|
void initBasic(ValueType type, bool allocated = false);
|
||||||
|
void dupPayload(const Value& other);
|
||||||
|
void releasePayload();
|
||||||
|
void dupMeta(const Value& other);
|
||||||
|
|
||||||
Value& resolveReference(const char* key);
|
Value& resolveReference(const char* key);
|
||||||
Value& resolveReference(const char* key, const char* end);
|
Value& resolveReference(const char* key, const char* end);
|
||||||
|
|
||||||
struct CommentInfo {
|
|
||||||
CommentInfo();
|
|
||||||
~CommentInfo();
|
|
||||||
|
|
||||||
void setComment(const char* text, size_t len);
|
|
||||||
|
|
||||||
char* comment_;
|
|
||||||
};
|
|
||||||
|
|
||||||
// struct MemberNamesTransform
|
// struct MemberNamesTransform
|
||||||
//{
|
//{
|
||||||
// typedef const char *result_type;
|
// typedef const char *result_type;
|
||||||
@@ -606,13 +630,33 @@ private:
|
|||||||
LargestUInt uint_;
|
LargestUInt uint_;
|
||||||
double real_;
|
double real_;
|
||||||
bool bool_;
|
bool bool_;
|
||||||
char* string_; // actually ptr to unsigned, followed by str, unless !allocated_
|
char* string_; // if allocated_, ptr to { unsigned, char[] }.
|
||||||
ObjectValues* map_;
|
ObjectValues* map_;
|
||||||
} value_;
|
} value_;
|
||||||
ValueType type_ : 8;
|
|
||||||
unsigned int allocated_ : 1; // Notes: if declared as bool, bitfield is useless.
|
struct {
|
||||||
// If not allocated_, string_ must be null-terminated.
|
// Really a ValueType, but types should agree for bitfield packing.
|
||||||
CommentInfo* comments_;
|
unsigned int value_type_ : 8;
|
||||||
|
// Unless allocated_, string_ must be null-terminated.
|
||||||
|
unsigned int allocated_ : 1;
|
||||||
|
} bits_;
|
||||||
|
|
||||||
|
class Comments {
|
||||||
|
public:
|
||||||
|
Comments() = default;
|
||||||
|
Comments(const Comments& that);
|
||||||
|
Comments(Comments&& that);
|
||||||
|
Comments& operator=(const Comments& that);
|
||||||
|
Comments& operator=(Comments&& that);
|
||||||
|
bool has(CommentPlacement slot) const;
|
||||||
|
String get(CommentPlacement slot) const;
|
||||||
|
void set(CommentPlacement slot, String s);
|
||||||
|
|
||||||
|
private:
|
||||||
|
using Array = std::array<String, numberOfCommentPlacement>;
|
||||||
|
std::unique_ptr<Array> ptr_;
|
||||||
|
};
|
||||||
|
Comments comments_;
|
||||||
|
|
||||||
// [start, limit) byte offsets in the source JSON text from which this Value
|
// [start, limit) byte offsets in the source JSON text from which this Value
|
||||||
// was extracted.
|
// was extracted.
|
||||||
@@ -630,17 +674,13 @@ public:
|
|||||||
PathArgument();
|
PathArgument();
|
||||||
PathArgument(ArrayIndex index);
|
PathArgument(ArrayIndex index);
|
||||||
PathArgument(const char* key);
|
PathArgument(const char* key);
|
||||||
PathArgument(const JSONCPP_STRING& key);
|
PathArgument(const String& key);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
enum Kind {
|
enum Kind { kindNone = 0, kindIndex, kindKey };
|
||||||
kindNone = 0,
|
String key_;
|
||||||
kindIndex,
|
ArrayIndex index_{};
|
||||||
kindKey
|
Kind kind_{kindNone};
|
||||||
};
|
|
||||||
JSONCPP_STRING key_;
|
|
||||||
ArrayIndex index_;
|
|
||||||
Kind kind_;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/** \brief Experimental and untested: represents a "path" to access a node.
|
/** \brief Experimental and untested: represents a "path" to access a node.
|
||||||
@@ -656,7 +696,7 @@ private:
|
|||||||
*/
|
*/
|
||||||
class JSON_API Path {
|
class JSON_API Path {
|
||||||
public:
|
public:
|
||||||
Path(const JSONCPP_STRING& path,
|
Path(const String& path,
|
||||||
const PathArgument& a1 = PathArgument(),
|
const PathArgument& a1 = PathArgument(),
|
||||||
const PathArgument& a2 = PathArgument(),
|
const PathArgument& a2 = PathArgument(),
|
||||||
const PathArgument& a3 = PathArgument(),
|
const PathArgument& a3 = PathArgument(),
|
||||||
@@ -673,12 +713,12 @@ private:
|
|||||||
typedef std::vector<const PathArgument*> InArgs;
|
typedef std::vector<const PathArgument*> InArgs;
|
||||||
typedef std::vector<PathArgument> Args;
|
typedef std::vector<PathArgument> Args;
|
||||||
|
|
||||||
void makePath(const JSONCPP_STRING& path, const InArgs& in);
|
void makePath(const String& path, const InArgs& in);
|
||||||
void addPathInArg(const JSONCPP_STRING& path,
|
void addPathInArg(const String& path,
|
||||||
const InArgs& in,
|
const InArgs& in,
|
||||||
InArgs::const_iterator& itInArg,
|
InArgs::const_iterator& itInArg,
|
||||||
PathArgument::Kind kind);
|
PathArgument::Kind kind);
|
||||||
void invalidPath(const JSONCPP_STRING& path, int location);
|
static void invalidPath(const String& path, int location);
|
||||||
|
|
||||||
Args args_;
|
Args args_;
|
||||||
};
|
};
|
||||||
@@ -705,17 +745,19 @@ public:
|
|||||||
/// Value.
|
/// Value.
|
||||||
Value key() const;
|
Value key() const;
|
||||||
|
|
||||||
/// Return the index of the referenced Value, or -1 if it is not an arrayValue.
|
/// Return the index of the referenced Value, or -1 if it is not an
|
||||||
|
/// arrayValue.
|
||||||
UInt index() const;
|
UInt index() const;
|
||||||
|
|
||||||
/// Return the member name of the referenced Value, or "" if it is not an
|
/// Return the member name of the referenced Value, or "" if it is not an
|
||||||
/// objectValue.
|
/// objectValue.
|
||||||
/// \note Avoid `c_str()` on result, as embedded zeroes are possible.
|
/// \note Avoid `c_str()` on result, as embedded zeroes are possible.
|
||||||
JSONCPP_STRING name() const;
|
String name() const;
|
||||||
|
|
||||||
/// Return the member name of the referenced Value. "" if it is not an
|
/// Return the member name of the referenced Value. "" if it is not an
|
||||||
/// objectValue.
|
/// objectValue.
|
||||||
/// \deprecated This cannot be used for UTF-8 strings, since there can be embedded nulls.
|
/// \deprecated This cannot be used for UTF-8 strings, since there can be
|
||||||
|
/// embedded nulls.
|
||||||
JSONCPP_DEPRECATED("Use `key = name();` instead.")
|
JSONCPP_DEPRECATED("Use `key = name();` instead.")
|
||||||
char const* memberName() const;
|
char const* memberName() const;
|
||||||
/// Return the member name of the referenced Value, or NULL if it is not an
|
/// Return the member name of the referenced Value, or NULL if it is not an
|
||||||
@@ -739,7 +781,7 @@ protected:
|
|||||||
private:
|
private:
|
||||||
Value::ObjectValues::iterator current_;
|
Value::ObjectValues::iterator current_;
|
||||||
// Indicates that iterator is for a null value.
|
// Indicates that iterator is for a null value.
|
||||||
bool isNull_;
|
bool isNull_{true};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
// For some reason, BORLAND needs these at the end, rather
|
// For some reason, BORLAND needs these at the end, rather
|
||||||
@@ -756,8 +798,8 @@ class JSON_API ValueConstIterator : public ValueIteratorBase {
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
typedef const Value value_type;
|
typedef const Value value_type;
|
||||||
//typedef unsigned int size_t;
|
// typedef unsigned int size_t;
|
||||||
//typedef int difference_type;
|
// typedef int difference_type;
|
||||||
typedef const Value& reference;
|
typedef const Value& reference;
|
||||||
typedef const Value* pointer;
|
typedef const Value* pointer;
|
||||||
typedef ValueConstIterator SelfType;
|
typedef ValueConstIterator SelfType;
|
||||||
@@ -766,9 +808,10 @@ public:
|
|||||||
ValueConstIterator(ValueIterator const& other);
|
ValueConstIterator(ValueIterator const& other);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/*! \internal Use by Value to create an iterator.
|
/*! \internal Use by Value to create an iterator.
|
||||||
*/
|
*/
|
||||||
explicit ValueConstIterator(const Value::ObjectValues::iterator& current);
|
explicit ValueConstIterator(const Value::ObjectValues::iterator& current);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
SelfType& operator=(const ValueIteratorBase& other);
|
SelfType& operator=(const ValueIteratorBase& other);
|
||||||
|
|
||||||
@@ -817,9 +860,10 @@ public:
|
|||||||
ValueIterator(const ValueIterator& other);
|
ValueIterator(const ValueIterator& other);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/*! \internal Use by Value to create an iterator.
|
/*! \internal Use by Value to create an iterator.
|
||||||
*/
|
*/
|
||||||
explicit ValueIterator(const Value::ObjectValues::iterator& current);
|
explicit ValueIterator(const Value::ObjectValues::iterator& current);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
SelfType& operator=(const SelfType& other);
|
SelfType& operator=(const SelfType& other);
|
||||||
|
|
||||||
@@ -850,15 +894,11 @@ public:
|
|||||||
pointer operator->() const { return &deref(); }
|
pointer operator->() const { return &deref(); }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
inline void swap(Value& a, Value& b) { a.swap(b); }
|
||||||
|
|
||||||
} // namespace Json
|
} // namespace Json
|
||||||
|
|
||||||
|
#pragma pack(pop)
|
||||||
namespace std {
|
|
||||||
/// Specialize std::swap() for Json::Value.
|
|
||||||
template<>
|
|
||||||
inline void swap(Json::Value& a, Json::Value& b) { a.swap(b); }
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
|
#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
|
||||||
#pragma warning(pop)
|
#pragma warning(pop)
|
||||||
|
@@ -1,20 +0,0 @@
|
|||||||
// DO NOT EDIT. This file (and "version") is generated by CMake.
|
|
||||||
// Run CMake configure step to update it.
|
|
||||||
#ifndef JSON_VERSION_H_INCLUDED
|
|
||||||
# define JSON_VERSION_H_INCLUDED
|
|
||||||
|
|
||||||
# define JSONCPP_VERSION_STRING "1.7.5"
|
|
||||||
# define JSONCPP_VERSION_MAJOR 1
|
|
||||||
# define JSONCPP_VERSION_MINOR 7
|
|
||||||
# define JSONCPP_VERSION_PATCH 5
|
|
||||||
# define JSONCPP_VERSION_QUALIFIER
|
|
||||||
# define JSONCPP_VERSION_HEXA ((JSONCPP_VERSION_MAJOR << 24) | (JSONCPP_VERSION_MINOR << 16) | (JSONCPP_VERSION_PATCH << 8))
|
|
||||||
|
|
||||||
#ifdef JSONCPP_USING_SECURE_MEMORY
|
|
||||||
#undef JSONCPP_USING_SECURE_MEMORY
|
|
||||||
#endif
|
|
||||||
#define JSONCPP_USING_SECURE_MEMORY 0
|
|
||||||
// If non-zero, the library zeroes any memory that it has allocated before
|
|
||||||
// it frees its memory.
|
|
||||||
|
|
||||||
#endif // JSON_VERSION_H_INCLUDED
|
|
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2007-2010 Baptiste Lepilleur
|
// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors
|
||||||
// Distributed under MIT license, or public domain if desired and
|
// Distributed under MIT license, or public domain if desired and
|
||||||
// recognized in your jurisdiction.
|
// recognized in your jurisdiction.
|
||||||
// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
||||||
@@ -9,17 +9,19 @@
|
|||||||
#if !defined(JSON_IS_AMALGAMATION)
|
#if !defined(JSON_IS_AMALGAMATION)
|
||||||
#include "value.h"
|
#include "value.h"
|
||||||
#endif // if !defined(JSON_IS_AMALGAMATION)
|
#endif // if !defined(JSON_IS_AMALGAMATION)
|
||||||
#include <vector>
|
|
||||||
#include <string>
|
|
||||||
#include <ostream>
|
#include <ostream>
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
// Disable warning C4251: <data member>: <type> needs to have dll-interface to
|
// Disable warning C4251: <data member>: <type> needs to have dll-interface to
|
||||||
// be used by...
|
// be used by...
|
||||||
#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
|
#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) && defined(_MSC_VER)
|
||||||
#pragma warning(push)
|
#pragma warning(push)
|
||||||
#pragma warning(disable : 4251)
|
#pragma warning(disable : 4251)
|
||||||
#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
|
#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
|
||||||
|
|
||||||
|
#pragma pack(push, 8)
|
||||||
|
|
||||||
namespace Json {
|
namespace Json {
|
||||||
|
|
||||||
class Value;
|
class Value;
|
||||||
@@ -39,17 +41,17 @@ Usage:
|
|||||||
*/
|
*/
|
||||||
class JSON_API StreamWriter {
|
class JSON_API StreamWriter {
|
||||||
protected:
|
protected:
|
||||||
JSONCPP_OSTREAM* sout_; // not owned; will not delete
|
OStream* sout_; // not owned; will not delete
|
||||||
public:
|
public:
|
||||||
StreamWriter();
|
StreamWriter();
|
||||||
virtual ~StreamWriter();
|
virtual ~StreamWriter();
|
||||||
/** Write Value into document as configured in sub-class.
|
/** Write Value into document as configured in sub-class.
|
||||||
Do not take ownership of sout, but maintain a reference during function.
|
Do not take ownership of sout, but maintain a reference during function.
|
||||||
\pre sout != NULL
|
\pre sout != NULL
|
||||||
\return zero on success (For now, we always return zero, so check the stream instead.)
|
\return zero on success (For now, we always return zero, so check the
|
||||||
\throw std::exception possibly, depending on configuration
|
stream instead.) \throw std::exception possibly, depending on configuration
|
||||||
*/
|
*/
|
||||||
virtual int write(Value const& root, JSONCPP_OSTREAM* sout) = 0;
|
virtual int write(Value const& root, OStream* sout) = 0;
|
||||||
|
|
||||||
/** \brief A simple abstract factory.
|
/** \brief A simple abstract factory.
|
||||||
*/
|
*/
|
||||||
@@ -60,14 +62,14 @@ public:
|
|||||||
* \throw std::exception if something goes wrong (e.g. invalid settings)
|
* \throw std::exception if something goes wrong (e.g. invalid settings)
|
||||||
*/
|
*/
|
||||||
virtual StreamWriter* newStreamWriter() const = 0;
|
virtual StreamWriter* newStreamWriter() const = 0;
|
||||||
}; // Factory
|
}; // Factory
|
||||||
}; // StreamWriter
|
}; // StreamWriter
|
||||||
|
|
||||||
/** \brief Write into stringstream, then return string, for convenience.
|
/** \brief Write into stringstream, then return string, for convenience.
|
||||||
* A StreamWriter will be created from the factory, used, and then deleted.
|
* A StreamWriter will be created from the factory, used, and then deleted.
|
||||||
*/
|
*/
|
||||||
JSONCPP_STRING JSON_API writeString(StreamWriter::Factory const& factory, Value const& root);
|
String JSON_API writeString(StreamWriter::Factory const& factory,
|
||||||
|
Value const& root);
|
||||||
|
|
||||||
/** \brief Build a StreamWriter implementation.
|
/** \brief Build a StreamWriter implementation.
|
||||||
|
|
||||||
@@ -91,18 +93,23 @@ public:
|
|||||||
/** Configuration of this builder.
|
/** Configuration of this builder.
|
||||||
Available settings (case-sensitive):
|
Available settings (case-sensitive):
|
||||||
- "commentStyle": "None" or "All"
|
- "commentStyle": "None" or "All"
|
||||||
- "indentation": "<anything>"
|
- "indentation": "<anything>".
|
||||||
|
- Setting this to an empty string also omits newline characters.
|
||||||
- "enableYAMLCompatibility": false or true
|
- "enableYAMLCompatibility": false or true
|
||||||
- slightly change the whitespace around colons
|
- slightly change the whitespace around colons
|
||||||
- "dropNullPlaceholders": false or true
|
- "dropNullPlaceholders": false or true
|
||||||
- Drop the "null" string from the writer's output for nullValues.
|
- Drop the "null" string from the writer's output for nullValues.
|
||||||
Strictly speaking, this is not valid JSON. But when the output is being
|
Strictly speaking, this is not valid JSON. But when the output is being
|
||||||
fed to a browser's Javascript, it makes for smaller output and the
|
fed to a browser's JavaScript, it makes for smaller output and the
|
||||||
browser can handle the output just fine.
|
browser can handle the output just fine.
|
||||||
- "useSpecialFloats": false or true
|
- "useSpecialFloats": false or true
|
||||||
- If true, outputs non-finite floating point values in the following way:
|
- If true, outputs non-finite floating point values in the following way:
|
||||||
NaN values as "NaN", positive infinity as "Infinity", and negative infinity
|
NaN values as "NaN", positive infinity as "Infinity", and negative
|
||||||
as "-Infinity".
|
infinity as "-Infinity".
|
||||||
|
- "precision": int
|
||||||
|
- Number of precision digits for formatting of real values.
|
||||||
|
- "precisionType": "significant"(default) or "decimal"
|
||||||
|
- Type of precision for formatting of real values.
|
||||||
|
|
||||||
You can examine 'settings_` yourself
|
You can examine 'settings_` yourself
|
||||||
to see the defaults. You can also write and read them just like any
|
to see the defaults. You can also write and read them just like any
|
||||||
@@ -112,12 +119,12 @@ public:
|
|||||||
Json::Value settings_;
|
Json::Value settings_;
|
||||||
|
|
||||||
StreamWriterBuilder();
|
StreamWriterBuilder();
|
||||||
~StreamWriterBuilder() JSONCPP_OVERRIDE;
|
~StreamWriterBuilder() override;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \throw std::exception if something goes wrong (e.g. invalid settings)
|
* \throw std::exception if something goes wrong (e.g. invalid settings)
|
||||||
*/
|
*/
|
||||||
StreamWriter* newStreamWriter() const JSONCPP_OVERRIDE;
|
StreamWriter* newStreamWriter() const override;
|
||||||
|
|
||||||
/** \return true if 'settings' are legal and consistent;
|
/** \return true if 'settings' are legal and consistent;
|
||||||
* otherwise, indicate bad settings via 'invalid'.
|
* otherwise, indicate bad settings via 'invalid'.
|
||||||
@@ -125,7 +132,7 @@ public:
|
|||||||
bool validate(Json::Value* invalid) const;
|
bool validate(Json::Value* invalid) const;
|
||||||
/** A simple way to update a specific setting.
|
/** A simple way to update a specific setting.
|
||||||
*/
|
*/
|
||||||
Value& operator[](JSONCPP_STRING key);
|
Value& operator[](const String& key);
|
||||||
|
|
||||||
/** Called by ctor, but you can use this to reset settings_.
|
/** Called by ctor, but you can use this to reset settings_.
|
||||||
* \pre 'settings' != NULL (but Json::null is fine)
|
* \pre 'settings' != NULL (but Json::null is fine)
|
||||||
@@ -138,11 +145,11 @@ public:
|
|||||||
/** \brief Abstract class for writers.
|
/** \brief Abstract class for writers.
|
||||||
* \deprecated Use StreamWriter. (And really, this is an implementation detail.)
|
* \deprecated Use StreamWriter. (And really, this is an implementation detail.)
|
||||||
*/
|
*/
|
||||||
class JSON_API Writer {
|
class JSONCPP_DEPRECATED("Use StreamWriter instead") JSON_API Writer {
|
||||||
public:
|
public:
|
||||||
virtual ~Writer();
|
virtual ~Writer();
|
||||||
|
|
||||||
virtual JSONCPP_STRING write(const Value& root) = 0;
|
virtual String write(const Value& root) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
/** \brief Outputs a Value in <a HREF="http://www.json.org">JSON</a> format
|
/** \brief Outputs a Value in <a HREF="http://www.json.org">JSON</a> format
|
||||||
@@ -150,21 +157,25 @@ public:
|
|||||||
*
|
*
|
||||||
* The JSON document is written in a single line. It is not intended for 'human'
|
* The JSON document is written in a single line. It is not intended for 'human'
|
||||||
*consumption,
|
*consumption,
|
||||||
* but may be usefull to support feature such as RPC where bandwith is limited.
|
* but may be useful to support feature such as RPC where bandwidth is limited.
|
||||||
* \sa Reader, Value
|
* \sa Reader, Value
|
||||||
* \deprecated Use StreamWriterBuilder.
|
* \deprecated Use StreamWriterBuilder.
|
||||||
*/
|
*/
|
||||||
class JSON_API FastWriter : public Writer {
|
#if defined(_MSC_VER)
|
||||||
|
#pragma warning(push)
|
||||||
|
#pragma warning(disable : 4996) // Deriving from deprecated class
|
||||||
|
#endif
|
||||||
|
class JSONCPP_DEPRECATED("Use StreamWriterBuilder instead") JSON_API FastWriter
|
||||||
|
: public Writer {
|
||||||
public:
|
public:
|
||||||
FastWriter();
|
FastWriter();
|
||||||
~FastWriter() JSONCPP_OVERRIDE {}
|
~FastWriter() override = default;
|
||||||
|
|
||||||
void enableYAMLCompatibility();
|
void enableYAMLCompatibility();
|
||||||
|
|
||||||
/** \brief Drop the "null" string from the writer's output for nullValues.
|
/** \brief Drop the "null" string from the writer's output for nullValues.
|
||||||
* Strictly speaking, this is not valid JSON. But when the output is being
|
* Strictly speaking, this is not valid JSON. But when the output is being
|
||||||
* fed to a browser's Javascript, it makes for smaller output and the
|
* fed to a browser's JavaScript, it makes for smaller output and the
|
||||||
* browser can handle the output just fine.
|
* browser can handle the output just fine.
|
||||||
*/
|
*/
|
||||||
void dropNullPlaceholders();
|
void dropNullPlaceholders();
|
||||||
@@ -172,16 +183,19 @@ public:
|
|||||||
void omitEndingLineFeed();
|
void omitEndingLineFeed();
|
||||||
|
|
||||||
public: // overridden from Writer
|
public: // overridden from Writer
|
||||||
JSONCPP_STRING write(const Value& root) JSONCPP_OVERRIDE;
|
String write(const Value& root) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void writeValue(const Value& value);
|
void writeValue(const Value& value);
|
||||||
|
|
||||||
JSONCPP_STRING document_;
|
String document_;
|
||||||
bool yamlCompatiblityEnabled_;
|
bool yamlCompatibilityEnabled_{false};
|
||||||
bool dropNullPlaceholders_;
|
bool dropNullPlaceholders_{false};
|
||||||
bool omitEndingLineFeed_;
|
bool omitEndingLineFeed_{false};
|
||||||
};
|
};
|
||||||
|
#if defined(_MSC_VER)
|
||||||
|
#pragma warning(pop)
|
||||||
|
#endif
|
||||||
|
|
||||||
/** \brief Writes a Value in <a HREF="http://www.json.org">JSON</a> format in a
|
/** \brief Writes a Value in <a HREF="http://www.json.org">JSON</a> format in a
|
||||||
*human friendly way.
|
*human friendly way.
|
||||||
@@ -207,41 +221,49 @@ private:
|
|||||||
* \sa Reader, Value, Value::setComment()
|
* \sa Reader, Value, Value::setComment()
|
||||||
* \deprecated Use StreamWriterBuilder.
|
* \deprecated Use StreamWriterBuilder.
|
||||||
*/
|
*/
|
||||||
class JSON_API StyledWriter : public Writer {
|
#if defined(_MSC_VER)
|
||||||
|
#pragma warning(push)
|
||||||
|
#pragma warning(disable : 4996) // Deriving from deprecated class
|
||||||
|
#endif
|
||||||
|
class JSONCPP_DEPRECATED("Use StreamWriterBuilder instead") JSON_API
|
||||||
|
StyledWriter : public Writer {
|
||||||
public:
|
public:
|
||||||
StyledWriter();
|
StyledWriter();
|
||||||
~StyledWriter() JSONCPP_OVERRIDE {}
|
~StyledWriter() override = default;
|
||||||
|
|
||||||
public: // overridden from Writer
|
public: // overridden from Writer
|
||||||
/** \brief Serialize a Value in <a HREF="http://www.json.org">JSON</a> format.
|
/** \brief Serialize a Value in <a HREF="http://www.json.org">JSON</a> format.
|
||||||
* \param root Value to serialize.
|
* \param root Value to serialize.
|
||||||
* \return String containing the JSON document that represents the root value.
|
* \return String containing the JSON document that represents the root value.
|
||||||
*/
|
*/
|
||||||
JSONCPP_STRING write(const Value& root) JSONCPP_OVERRIDE;
|
String write(const Value& root) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void writeValue(const Value& value);
|
void writeValue(const Value& value);
|
||||||
void writeArrayValue(const Value& value);
|
void writeArrayValue(const Value& value);
|
||||||
bool isMultineArray(const Value& value);
|
bool isMultilineArray(const Value& value);
|
||||||
void pushValue(const JSONCPP_STRING& value);
|
void pushValue(const String& value);
|
||||||
void writeIndent();
|
void writeIndent();
|
||||||
void writeWithIndent(const JSONCPP_STRING& value);
|
void writeWithIndent(const String& value);
|
||||||
void indent();
|
void indent();
|
||||||
void unindent();
|
void unindent();
|
||||||
void writeCommentBeforeValue(const Value& root);
|
void writeCommentBeforeValue(const Value& root);
|
||||||
void writeCommentAfterValueOnSameLine(const Value& root);
|
void writeCommentAfterValueOnSameLine(const Value& root);
|
||||||
bool hasCommentForValue(const Value& value);
|
static bool hasCommentForValue(const Value& value);
|
||||||
static JSONCPP_STRING normalizeEOL(const JSONCPP_STRING& text);
|
static String normalizeEOL(const String& text);
|
||||||
|
|
||||||
typedef std::vector<JSONCPP_STRING> ChildValues;
|
typedef std::vector<String> ChildValues;
|
||||||
|
|
||||||
ChildValues childValues_;
|
ChildValues childValues_;
|
||||||
JSONCPP_STRING document_;
|
String document_;
|
||||||
JSONCPP_STRING indentString_;
|
String indentString_;
|
||||||
unsigned int rightMargin_;
|
unsigned int rightMargin_{74};
|
||||||
unsigned int indentSize_;
|
unsigned int indentSize_{3};
|
||||||
bool addChildValues_;
|
bool addChildValues_{false};
|
||||||
};
|
};
|
||||||
|
#if defined(_MSC_VER)
|
||||||
|
#pragma warning(pop)
|
||||||
|
#endif
|
||||||
|
|
||||||
/** \brief Writes a Value in <a HREF="http://www.json.org">JSON</a> format in a
|
/** \brief Writes a Value in <a HREF="http://www.json.org">JSON</a> format in a
|
||||||
human friendly way,
|
human friendly way,
|
||||||
@@ -265,14 +287,21 @@ private:
|
|||||||
* If the Value have comments then they are outputed according to their
|
* If the Value have comments then they are outputed according to their
|
||||||
#CommentPlacement.
|
#CommentPlacement.
|
||||||
*
|
*
|
||||||
* \param indentation Each level will be indented by this amount extra.
|
|
||||||
* \sa Reader, Value, Value::setComment()
|
* \sa Reader, Value, Value::setComment()
|
||||||
* \deprecated Use StreamWriterBuilder.
|
* \deprecated Use StreamWriterBuilder.
|
||||||
*/
|
*/
|
||||||
class JSON_API StyledStreamWriter {
|
#if defined(_MSC_VER)
|
||||||
|
#pragma warning(push)
|
||||||
|
#pragma warning(disable : 4996) // Deriving from deprecated class
|
||||||
|
#endif
|
||||||
|
class JSONCPP_DEPRECATED("Use StreamWriterBuilder instead") JSON_API
|
||||||
|
StyledStreamWriter {
|
||||||
public:
|
public:
|
||||||
StyledStreamWriter(JSONCPP_STRING indentation = "\t");
|
/**
|
||||||
~StyledStreamWriter() {}
|
* \param indentation Each level will be indented by this amount extra.
|
||||||
|
*/
|
||||||
|
StyledStreamWriter(String indentation = "\t");
|
||||||
|
~StyledStreamWriter() = default;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/** \brief Serialize a Value in <a HREF="http://www.json.org">JSON</a> format.
|
/** \brief Serialize a Value in <a HREF="http://www.json.org">JSON</a> format.
|
||||||
@@ -281,49 +310,57 @@ public:
|
|||||||
* \note There is no point in deriving from Writer, since write() should not
|
* \note There is no point in deriving from Writer, since write() should not
|
||||||
* return a value.
|
* return a value.
|
||||||
*/
|
*/
|
||||||
void write(JSONCPP_OSTREAM& out, const Value& root);
|
void write(OStream& out, const Value& root);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void writeValue(const Value& value);
|
void writeValue(const Value& value);
|
||||||
void writeArrayValue(const Value& value);
|
void writeArrayValue(const Value& value);
|
||||||
bool isMultineArray(const Value& value);
|
bool isMultilineArray(const Value& value);
|
||||||
void pushValue(const JSONCPP_STRING& value);
|
void pushValue(const String& value);
|
||||||
void writeIndent();
|
void writeIndent();
|
||||||
void writeWithIndent(const JSONCPP_STRING& value);
|
void writeWithIndent(const String& value);
|
||||||
void indent();
|
void indent();
|
||||||
void unindent();
|
void unindent();
|
||||||
void writeCommentBeforeValue(const Value& root);
|
void writeCommentBeforeValue(const Value& root);
|
||||||
void writeCommentAfterValueOnSameLine(const Value& root);
|
void writeCommentAfterValueOnSameLine(const Value& root);
|
||||||
bool hasCommentForValue(const Value& value);
|
static bool hasCommentForValue(const Value& value);
|
||||||
static JSONCPP_STRING normalizeEOL(const JSONCPP_STRING& text);
|
static String normalizeEOL(const String& text);
|
||||||
|
|
||||||
typedef std::vector<JSONCPP_STRING> ChildValues;
|
typedef std::vector<String> ChildValues;
|
||||||
|
|
||||||
ChildValues childValues_;
|
ChildValues childValues_;
|
||||||
JSONCPP_OSTREAM* document_;
|
OStream* document_;
|
||||||
JSONCPP_STRING indentString_;
|
String indentString_;
|
||||||
unsigned int rightMargin_;
|
unsigned int rightMargin_{74};
|
||||||
JSONCPP_STRING indentation_;
|
String indentation_;
|
||||||
bool addChildValues_ : 1;
|
bool addChildValues_ : 1;
|
||||||
bool indented_ : 1;
|
bool indented_ : 1;
|
||||||
};
|
};
|
||||||
|
#if defined(_MSC_VER)
|
||||||
|
#pragma warning(pop)
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(JSON_HAS_INT64)
|
#if defined(JSON_HAS_INT64)
|
||||||
JSONCPP_STRING JSON_API valueToString(Int value);
|
String JSON_API valueToString(Int value);
|
||||||
JSONCPP_STRING JSON_API valueToString(UInt value);
|
String JSON_API valueToString(UInt value);
|
||||||
#endif // if defined(JSON_HAS_INT64)
|
#endif // if defined(JSON_HAS_INT64)
|
||||||
JSONCPP_STRING JSON_API valueToString(LargestInt value);
|
String JSON_API valueToString(LargestInt value);
|
||||||
JSONCPP_STRING JSON_API valueToString(LargestUInt value);
|
String JSON_API valueToString(LargestUInt value);
|
||||||
JSONCPP_STRING JSON_API valueToString(double value);
|
String JSON_API
|
||||||
JSONCPP_STRING JSON_API valueToString(bool value);
|
valueToString(double value,
|
||||||
JSONCPP_STRING JSON_API valueToQuotedString(const char* value);
|
unsigned int precision = Value::defaultRealPrecision,
|
||||||
|
PrecisionType precisionType = PrecisionType::significantDigits);
|
||||||
|
String JSON_API valueToString(bool value);
|
||||||
|
String JSON_API valueToQuotedString(const char* value);
|
||||||
|
|
||||||
/// \brief Output using the StyledStreamWriter.
|
/// \brief Output using the StyledStreamWriter.
|
||||||
/// \see Json::operator>>()
|
/// \see Json::operator>>()
|
||||||
JSON_API JSONCPP_OSTREAM& operator<<(JSONCPP_OSTREAM&, const Value& root);
|
JSON_API OStream& operator<<(OStream&, const Value& root);
|
||||||
|
|
||||||
} // namespace Json
|
} // namespace Json
|
||||||
|
|
||||||
|
#pragma pack(pop)
|
||||||
|
|
||||||
#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
|
#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
|
||||||
#pragma warning(pop)
|
#pragma warning(pop)
|
||||||
#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
|
#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING)
|
||||||
|
@@ -1,42 +0,0 @@
|
|||||||
|
|
||||||
Microsoft Visual Studio Solution File, Format Version 11.00
|
|
||||||
# Visual Studio 2010
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lib_json", "lib_json.vcxproj", "{1E6C2C1C-6453-4129-AE3F-0EE8E6599C89}"
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "jsontest", "jsontest.vcxproj", "{25AF2DD2-D396-4668-B188-488C33B8E620}"
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_lib_json", "test_lib_json.vcxproj", "{B7A96B78-2782-40D2-8F37-A2DEF2B9C26D}"
|
|
||||||
EndProject
|
|
||||||
Global
|
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
|
||||||
Debug|Win32 = Debug|Win32
|
|
||||||
Debug|x64 = Debug|x64
|
|
||||||
Release|Win32 = Release|Win32
|
|
||||||
Release|x64 = Release|x64
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
|
||||||
{1E6C2C1C-6453-4129-AE3F-0EE8E6599C89}.Debug|Win32.ActiveCfg = Debug|Win32
|
|
||||||
{1E6C2C1C-6453-4129-AE3F-0EE8E6599C89}.Debug|Win32.Build.0 = Debug|Win32
|
|
||||||
{1E6C2C1C-6453-4129-AE3F-0EE8E6599C89}.Debug|x64.ActiveCfg = Debug|x64
|
|
||||||
{1E6C2C1C-6453-4129-AE3F-0EE8E6599C89}.Debug|x64.Build.0 = Debug|x64
|
|
||||||
{1E6C2C1C-6453-4129-AE3F-0EE8E6599C89}.Release|Win32.ActiveCfg = Release|Win32
|
|
||||||
{1E6C2C1C-6453-4129-AE3F-0EE8E6599C89}.Release|Win32.Build.0 = Release|Win32
|
|
||||||
{1E6C2C1C-6453-4129-AE3F-0EE8E6599C89}.Release|x64.ActiveCfg = Release|x64
|
|
||||||
{1E6C2C1C-6453-4129-AE3F-0EE8E6599C89}.Release|x64.Build.0 = Release|x64
|
|
||||||
{25AF2DD2-D396-4668-B188-488C33B8E620}.Debug|Win32.ActiveCfg = Debug|Win32
|
|
||||||
{25AF2DD2-D396-4668-B188-488C33B8E620}.Debug|Win32.Build.0 = Debug|Win32
|
|
||||||
{25AF2DD2-D396-4668-B188-488C33B8E620}.Debug|x64.ActiveCfg = Debug|Win32
|
|
||||||
{25AF2DD2-D396-4668-B188-488C33B8E620}.Release|Win32.ActiveCfg = Release|Win32
|
|
||||||
{25AF2DD2-D396-4668-B188-488C33B8E620}.Release|Win32.Build.0 = Release|Win32
|
|
||||||
{25AF2DD2-D396-4668-B188-488C33B8E620}.Release|x64.ActiveCfg = Release|Win32
|
|
||||||
{B7A96B78-2782-40D2-8F37-A2DEF2B9C26D}.Debug|Win32.ActiveCfg = Debug|Win32
|
|
||||||
{B7A96B78-2782-40D2-8F37-A2DEF2B9C26D}.Debug|Win32.Build.0 = Debug|Win32
|
|
||||||
{B7A96B78-2782-40D2-8F37-A2DEF2B9C26D}.Debug|x64.ActiveCfg = Debug|Win32
|
|
||||||
{B7A96B78-2782-40D2-8F37-A2DEF2B9C26D}.Release|Win32.ActiveCfg = Release|Win32
|
|
||||||
{B7A96B78-2782-40D2-8F37-A2DEF2B9C26D}.Release|Win32.Build.0 = Release|Win32
|
|
||||||
{B7A96B78-2782-40D2-8F37-A2DEF2B9C26D}.Release|x64.ActiveCfg = Release|Win32
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
|
||||||
HideSolutionNode = FALSE
|
|
||||||
EndGlobalSection
|
|
||||||
EndGlobal
|
|
@@ -1,96 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<ItemGroup Label="ProjectConfigurations">
|
|
||||||
<ProjectConfiguration Include="Debug|Win32">
|
|
||||||
<Configuration>Debug</Configuration>
|
|
||||||
<Platform>Win32</Platform>
|
|
||||||
</ProjectConfiguration>
|
|
||||||
<ProjectConfiguration Include="Release|Win32">
|
|
||||||
<Configuration>Release</Configuration>
|
|
||||||
<Platform>Win32</Platform>
|
|
||||||
</ProjectConfiguration>
|
|
||||||
</ItemGroup>
|
|
||||||
<PropertyGroup Label="Globals">
|
|
||||||
<ProjectGuid>{25AF2DD2-D396-4668-B188-488C33B8E620}</ProjectGuid>
|
|
||||||
<Keyword>Win32Proj</Keyword>
|
|
||||||
</PropertyGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
|
||||||
<ConfigurationType>Application</ConfigurationType>
|
|
||||||
<CharacterSet>MultiByte</CharacterSet>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
|
||||||
<ConfigurationType>Application</ConfigurationType>
|
|
||||||
<CharacterSet>MultiByte</CharacterSet>
|
|
||||||
</PropertyGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
|
||||||
<ImportGroup Label="ExtensionSettings">
|
|
||||||
</ImportGroup>
|
|
||||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
|
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
|
||||||
</ImportGroup>
|
|
||||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
|
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
|
||||||
</ImportGroup>
|
|
||||||
<PropertyGroup Label="UserMacros" />
|
|
||||||
<PropertyGroup>
|
|
||||||
<_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>
|
|
||||||
<OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../../build/vs71/debug/jsontest\</OutDir>
|
|
||||||
<IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../../build/vs71/debug/jsontest\</IntDir>
|
|
||||||
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
|
|
||||||
<OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../../build/vs71/release/jsontest\</OutDir>
|
|
||||||
<IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../../build/vs71/release/jsontest\</IntDir>
|
|
||||||
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
|
|
||||||
</PropertyGroup>
|
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
|
||||||
<ClCompile>
|
|
||||||
<Optimization>Disabled</Optimization>
|
|
||||||
<AdditionalIncludeDirectories>../../include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
|
||||||
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
|
||||||
<MinimalRebuild>true</MinimalRebuild>
|
|
||||||
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
|
||||||
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
|
||||||
<PrecompiledHeader>
|
|
||||||
</PrecompiledHeader>
|
|
||||||
<WarningLevel>Level3</WarningLevel>
|
|
||||||
<DebugInformationFormat>EditAndContinue</DebugInformationFormat>
|
|
||||||
</ClCompile>
|
|
||||||
<Link>
|
|
||||||
<OutputFile>$(OutDir)jsontest.exe</OutputFile>
|
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
<ProgramDatabaseFile>$(OutDir)jsontest.pdb</ProgramDatabaseFile>
|
|
||||||
<SubSystem>Console</SubSystem>
|
|
||||||
<TargetMachine>MachineX86</TargetMachine>
|
|
||||||
</Link>
|
|
||||||
</ItemDefinitionGroup>
|
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
|
||||||
<ClCompile>
|
|
||||||
<AdditionalIncludeDirectories>../../include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
|
||||||
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
|
||||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
|
||||||
<PrecompiledHeader>
|
|
||||||
</PrecompiledHeader>
|
|
||||||
<WarningLevel>Level3</WarningLevel>
|
|
||||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
|
||||||
</ClCompile>
|
|
||||||
<Link>
|
|
||||||
<OutputFile>$(OutDir)jsontest.exe</OutputFile>
|
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
<SubSystem>Console</SubSystem>
|
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
|
||||||
<TargetMachine>MachineX86</TargetMachine>
|
|
||||||
</Link>
|
|
||||||
</ItemDefinitionGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClCompile Include="..\..\src\jsontestrunner\main.cpp" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="lib_json.vcxproj">
|
|
||||||
<Project>{1e6c2c1c-6453-4129-ae3f-0ee8e6599c89}</Project>
|
|
||||||
</ProjectReference>
|
|
||||||
</ItemGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
|
||||||
<ImportGroup Label="ExtensionTargets">
|
|
||||||
</ImportGroup>
|
|
||||||
</Project>
|
|
@@ -1,13 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<ItemGroup>
|
|
||||||
<Filter Include="Source Files">
|
|
||||||
<UniqueIdentifier>{903591b3-ade3-4ce4-b1f9-1e175e62b014}</UniqueIdentifier>
|
|
||||||
</Filter>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClCompile Include="..\..\src\jsontestrunner\main.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
</ItemGroup>
|
|
||||||
</Project>
|
|
@@ -1,143 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<ItemGroup Label="ProjectConfigurations">
|
|
||||||
<ProjectConfiguration Include="Debug|Win32">
|
|
||||||
<Configuration>Debug</Configuration>
|
|
||||||
<Platform>Win32</Platform>
|
|
||||||
</ProjectConfiguration>
|
|
||||||
<ProjectConfiguration Include="Debug|x64">
|
|
||||||
<Configuration>Debug</Configuration>
|
|
||||||
<Platform>x64</Platform>
|
|
||||||
</ProjectConfiguration>
|
|
||||||
<ProjectConfiguration Include="Release|Win32">
|
|
||||||
<Configuration>Release</Configuration>
|
|
||||||
<Platform>Win32</Platform>
|
|
||||||
</ProjectConfiguration>
|
|
||||||
<ProjectConfiguration Include="Release|x64">
|
|
||||||
<Configuration>Release</Configuration>
|
|
||||||
<Platform>x64</Platform>
|
|
||||||
</ProjectConfiguration>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClCompile Include="..\..\src\lib_json\json_reader.cpp" />
|
|
||||||
<ClCompile Include="..\..\src\lib_json\json_value.cpp" />
|
|
||||||
<ClCompile Include="..\..\src\lib_json\json_writer.cpp" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClInclude Include="..\..\include\json\reader.h" />
|
|
||||||
<ClInclude Include="..\..\include\json\value.h" />
|
|
||||||
<ClInclude Include="..\..\include\json\writer.h" />
|
|
||||||
</ItemGroup>
|
|
||||||
<PropertyGroup Label="Globals">
|
|
||||||
<ProjectGuid>{1E6C2C1C-6453-4129-AE3F-0EE8E6599C89}</ProjectGuid>
|
|
||||||
<Keyword>Win32Proj</Keyword>
|
|
||||||
<RootNamespace>jsoncpp</RootNamespace>
|
|
||||||
</PropertyGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
|
||||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
|
||||||
<UseDebugLibraries>true</UseDebugLibraries>
|
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
|
||||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
|
||||||
<UseDebugLibraries>true</UseDebugLibraries>
|
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
|
||||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
|
||||||
<UseDebugLibraries>false</UseDebugLibraries>
|
|
||||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
|
||||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
|
||||||
<UseDebugLibraries>false</UseDebugLibraries>
|
|
||||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
|
||||||
</PropertyGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
|
||||||
<ImportGroup Label="ExtensionSettings">
|
|
||||||
</ImportGroup>
|
|
||||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
|
||||||
</ImportGroup>
|
|
||||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
|
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
|
||||||
</ImportGroup>
|
|
||||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
|
||||||
</ImportGroup>
|
|
||||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
|
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
|
||||||
</ImportGroup>
|
|
||||||
<PropertyGroup Label="UserMacros" />
|
|
||||||
<PropertyGroup />
|
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
|
||||||
<ClCompile>
|
|
||||||
<PrecompiledHeader>NotUsing</PrecompiledHeader>
|
|
||||||
<WarningLevel>Level3</WarningLevel>
|
|
||||||
<Optimization>Disabled</Optimization>
|
|
||||||
<PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
|
||||||
<AdditionalIncludeDirectories>../../include</AdditionalIncludeDirectories>
|
|
||||||
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
|
||||||
</ClCompile>
|
|
||||||
<Link>
|
|
||||||
<SubSystem>Windows</SubSystem>
|
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
</Link>
|
|
||||||
</ItemDefinitionGroup>
|
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
|
||||||
<ClCompile>
|
|
||||||
<PrecompiledHeader>NotUsing</PrecompiledHeader>
|
|
||||||
<WarningLevel>Level3</WarningLevel>
|
|
||||||
<Optimization>Disabled</Optimization>
|
|
||||||
<PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
|
||||||
<AdditionalIncludeDirectories>../../include</AdditionalIncludeDirectories>
|
|
||||||
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
|
||||||
</ClCompile>
|
|
||||||
<Link>
|
|
||||||
<SubSystem>Windows</SubSystem>
|
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
</Link>
|
|
||||||
</ItemDefinitionGroup>
|
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
|
||||||
<ClCompile>
|
|
||||||
<WarningLevel>Level3</WarningLevel>
|
|
||||||
<PrecompiledHeader>NotUsing</PrecompiledHeader>
|
|
||||||
<Optimization>MaxSpeed</Optimization>
|
|
||||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
|
||||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
|
||||||
<PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
|
||||||
<AdditionalIncludeDirectories>../../include</AdditionalIncludeDirectories>
|
|
||||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
|
||||||
</ClCompile>
|
|
||||||
<Link>
|
|
||||||
<SubSystem>Windows</SubSystem>
|
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
|
||||||
</Link>
|
|
||||||
</ItemDefinitionGroup>
|
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
|
||||||
<ClCompile>
|
|
||||||
<WarningLevel>Level3</WarningLevel>
|
|
||||||
<PrecompiledHeader>NotUsing</PrecompiledHeader>
|
|
||||||
<Optimization>MaxSpeed</Optimization>
|
|
||||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
|
||||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
|
||||||
<PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
|
||||||
<AdditionalIncludeDirectories>../../include</AdditionalIncludeDirectories>
|
|
||||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
|
||||||
</ClCompile>
|
|
||||||
<Link>
|
|
||||||
<SubSystem>Windows</SubSystem>
|
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
|
||||||
</Link>
|
|
||||||
</ItemDefinitionGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
|
||||||
<ImportGroup Label="ExtensionTargets">
|
|
||||||
</ImportGroup>
|
|
||||||
</Project>
|
|
@@ -1,33 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<ItemGroup>
|
|
||||||
<Filter Include="Header Files">
|
|
||||||
<UniqueIdentifier>{c110bc57-c46e-476c-97ea-84d8014f431c}</UniqueIdentifier>
|
|
||||||
</Filter>
|
|
||||||
<Filter Include="Source Files">
|
|
||||||
<UniqueIdentifier>{ed718592-5acf-47b5-8f2b-b8224590da6a}</UniqueIdentifier>
|
|
||||||
</Filter>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClCompile Include="..\..\src\lib_json\json_reader.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\..\src\lib_json\json_value.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\..\src\lib_json\json_writer.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClInclude Include="..\..\include\json\reader.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\..\include\json\value.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\..\include\json\writer.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
</ItemGroup>
|
|
||||||
</Project>
|
|
@@ -1,109 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<ItemGroup Label="ProjectConfigurations">
|
|
||||||
<ProjectConfiguration Include="Debug|Win32">
|
|
||||||
<Configuration>Debug</Configuration>
|
|
||||||
<Platform>Win32</Platform>
|
|
||||||
</ProjectConfiguration>
|
|
||||||
<ProjectConfiguration Include="Release|Win32">
|
|
||||||
<Configuration>Release</Configuration>
|
|
||||||
<Platform>Win32</Platform>
|
|
||||||
</ProjectConfiguration>
|
|
||||||
</ItemGroup>
|
|
||||||
<PropertyGroup Label="Globals">
|
|
||||||
<ProjectGuid>{B7A96B78-2782-40D2-8F37-A2DEF2B9C26D}</ProjectGuid>
|
|
||||||
<RootNamespace>test_lib_json</RootNamespace>
|
|
||||||
<Keyword>Win32Proj</Keyword>
|
|
||||||
</PropertyGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
|
||||||
<ConfigurationType>Application</ConfigurationType>
|
|
||||||
<CharacterSet>MultiByte</CharacterSet>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
|
||||||
<ConfigurationType>Application</ConfigurationType>
|
|
||||||
<CharacterSet>MultiByte</CharacterSet>
|
|
||||||
</PropertyGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
|
||||||
<ImportGroup Label="ExtensionSettings">
|
|
||||||
</ImportGroup>
|
|
||||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
|
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
|
||||||
</ImportGroup>
|
|
||||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
|
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
|
||||||
</ImportGroup>
|
|
||||||
<PropertyGroup Label="UserMacros" />
|
|
||||||
<PropertyGroup>
|
|
||||||
<_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>
|
|
||||||
<OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../../build/vs71/debug/test_lib_json\</OutDir>
|
|
||||||
<IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../../build/vs71/debug/test_lib_json\</IntDir>
|
|
||||||
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
|
|
||||||
<OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../../build/vs71/release/test_lib_json\</OutDir>
|
|
||||||
<IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../../build/vs71/release/test_lib_json\</IntDir>
|
|
||||||
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
|
|
||||||
</PropertyGroup>
|
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
|
||||||
<ClCompile>
|
|
||||||
<Optimization>Disabled</Optimization>
|
|
||||||
<AdditionalIncludeDirectories>../../include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
|
||||||
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
|
||||||
<MinimalRebuild>true</MinimalRebuild>
|
|
||||||
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
|
||||||
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
|
||||||
<PrecompiledHeader>
|
|
||||||
</PrecompiledHeader>
|
|
||||||
<WarningLevel>Level3</WarningLevel>
|
|
||||||
<DebugInformationFormat>EditAndContinue</DebugInformationFormat>
|
|
||||||
</ClCompile>
|
|
||||||
<Link>
|
|
||||||
<OutputFile>$(OutDir)test_lib_json.exe</OutputFile>
|
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
<ProgramDatabaseFile>$(OutDir)test_lib_json.pdb</ProgramDatabaseFile>
|
|
||||||
<SubSystem>Console</SubSystem>
|
|
||||||
<TargetMachine>MachineX86</TargetMachine>
|
|
||||||
</Link>
|
|
||||||
<PostBuildEvent>
|
|
||||||
<Message>Running all unit tests</Message>
|
|
||||||
<Command>$(TargetPath)</Command>
|
|
||||||
</PostBuildEvent>
|
|
||||||
</ItemDefinitionGroup>
|
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
|
||||||
<ClCompile>
|
|
||||||
<AdditionalIncludeDirectories>../../include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
|
||||||
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
|
||||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
|
||||||
<PrecompiledHeader>
|
|
||||||
</PrecompiledHeader>
|
|
||||||
<WarningLevel>Level3</WarningLevel>
|
|
||||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
|
||||||
</ClCompile>
|
|
||||||
<Link>
|
|
||||||
<OutputFile>$(OutDir)test_lib_json.exe</OutputFile>
|
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
<SubSystem>Console</SubSystem>
|
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
|
||||||
<TargetMachine>MachineX86</TargetMachine>
|
|
||||||
</Link>
|
|
||||||
<PostBuildEvent>
|
|
||||||
<Message>Running all unit tests</Message>
|
|
||||||
<Command>$(TargetPath)</Command>
|
|
||||||
</PostBuildEvent>
|
|
||||||
</ItemDefinitionGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClCompile Include="..\..\src\test_lib_json\jsontest.cpp" />
|
|
||||||
<ClCompile Include="..\..\src\test_lib_json\main.cpp" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClInclude Include="..\..\src\test_lib_json\jsontest.h" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="lib_json.vcxproj">
|
|
||||||
<Project>{1e6c2c1c-6453-4129-ae3f-0ee8e6599c89}</Project>
|
|
||||||
</ProjectReference>
|
|
||||||
</ItemGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
|
||||||
<ImportGroup Label="ExtensionTargets">
|
|
||||||
</ImportGroup>
|
|
||||||
</Project>
|
|
@@ -1,24 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<ItemGroup>
|
|
||||||
<ClCompile Include="..\..\src\test_lib_json\jsontest.cpp">
|
|
||||||
<Filter>Source Filter</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\..\src\test_lib_json\main.cpp">
|
|
||||||
<Filter>Source Filter</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<Filter Include="Source Filter">
|
|
||||||
<UniqueIdentifier>{bf40cbfc-8e98-40b4-b9f3-7e8d579cbae2}</UniqueIdentifier>
|
|
||||||
</Filter>
|
|
||||||
<Filter Include="Header Files">
|
|
||||||
<UniqueIdentifier>{5fd39074-89e6-4939-aa3f-694fefd296b1}</UniqueIdentifier>
|
|
||||||
</Filter>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClInclude Include="..\..\src\test_lib_json\jsontest.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
</ItemGroup>
|
|
||||||
</Project>
|
|
@@ -1,46 +0,0 @@
|
|||||||
Microsoft Visual Studio Solution File, Format Version 8.00
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lib_json", "lib_json.vcproj", "{B84F7231-16CE-41D8-8C08-7B523FF4225B}"
|
|
||||||
ProjectSection(ProjectDependencies) = postProject
|
|
||||||
EndProjectSection
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "jsontest", "jsontest.vcproj", "{25AF2DD2-D396-4668-B188-488C33B8E620}"
|
|
||||||
ProjectSection(ProjectDependencies) = postProject
|
|
||||||
{B84F7231-16CE-41D8-8C08-7B523FF4225B} = {B84F7231-16CE-41D8-8C08-7B523FF4225B}
|
|
||||||
EndProjectSection
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_lib_json", "test_lib_json.vcproj", "{B7A96B78-2782-40D2-8F37-A2DEF2B9C26D}"
|
|
||||||
ProjectSection(ProjectDependencies) = postProject
|
|
||||||
{B84F7231-16CE-41D8-8C08-7B523FF4225B} = {B84F7231-16CE-41D8-8C08-7B523FF4225B}
|
|
||||||
EndProjectSection
|
|
||||||
EndProject
|
|
||||||
Global
|
|
||||||
GlobalSection(SolutionConfiguration) = preSolution
|
|
||||||
Debug = Debug
|
|
||||||
dummy = dummy
|
|
||||||
Release = Release
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(ProjectConfiguration) = postSolution
|
|
||||||
{B84F7231-16CE-41D8-8C08-7B523FF4225B}.Debug.ActiveCfg = Debug|Win32
|
|
||||||
{B84F7231-16CE-41D8-8C08-7B523FF4225B}.Debug.Build.0 = Debug|Win32
|
|
||||||
{B84F7231-16CE-41D8-8C08-7B523FF4225B}.dummy.ActiveCfg = dummy|Win32
|
|
||||||
{B84F7231-16CE-41D8-8C08-7B523FF4225B}.dummy.Build.0 = dummy|Win32
|
|
||||||
{B84F7231-16CE-41D8-8C08-7B523FF4225B}.Release.ActiveCfg = Release|Win32
|
|
||||||
{B84F7231-16CE-41D8-8C08-7B523FF4225B}.Release.Build.0 = Release|Win32
|
|
||||||
{25AF2DD2-D396-4668-B188-488C33B8E620}.Debug.ActiveCfg = Debug|Win32
|
|
||||||
{25AF2DD2-D396-4668-B188-488C33B8E620}.Debug.Build.0 = Debug|Win32
|
|
||||||
{25AF2DD2-D396-4668-B188-488C33B8E620}.dummy.ActiveCfg = Debug|Win32
|
|
||||||
{25AF2DD2-D396-4668-B188-488C33B8E620}.dummy.Build.0 = Debug|Win32
|
|
||||||
{25AF2DD2-D396-4668-B188-488C33B8E620}.Release.ActiveCfg = Release|Win32
|
|
||||||
{25AF2DD2-D396-4668-B188-488C33B8E620}.Release.Build.0 = Release|Win32
|
|
||||||
{B7A96B78-2782-40D2-8F37-A2DEF2B9C26D}.Debug.ActiveCfg = Debug|Win32
|
|
||||||
{B7A96B78-2782-40D2-8F37-A2DEF2B9C26D}.Debug.Build.0 = Debug|Win32
|
|
||||||
{B7A96B78-2782-40D2-8F37-A2DEF2B9C26D}.dummy.ActiveCfg = Debug|Win32
|
|
||||||
{B7A96B78-2782-40D2-8F37-A2DEF2B9C26D}.dummy.Build.0 = Debug|Win32
|
|
||||||
{B7A96B78-2782-40D2-8F37-A2DEF2B9C26D}.Release.ActiveCfg = Release|Win32
|
|
||||||
{B7A96B78-2782-40D2-8F37-A2DEF2B9C26D}.Release.Build.0 = Release|Win32
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(ExtensibilityAddIns) = postSolution
|
|
||||||
EndGlobalSection
|
|
||||||
EndGlobal
|
|
@@ -1,119 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="Windows-1252"?>
|
|
||||||
<VisualStudioProject
|
|
||||||
ProjectType="Visual C++"
|
|
||||||
Version="7.10"
|
|
||||||
Name="jsontest"
|
|
||||||
ProjectGUID="{25AF2DD2-D396-4668-B188-488C33B8E620}"
|
|
||||||
Keyword="Win32Proj">
|
|
||||||
<Platforms>
|
|
||||||
<Platform
|
|
||||||
Name="Win32"/>
|
|
||||||
</Platforms>
|
|
||||||
<Configurations>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
OutputDirectory="../../build/vs71/debug/jsontest"
|
|
||||||
IntermediateDirectory="../../build/vs71/debug/jsontest"
|
|
||||||
ConfigurationType="1"
|
|
||||||
CharacterSet="2">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
AdditionalIncludeDirectories="../../include"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
|
|
||||||
MinimalRebuild="TRUE"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="1"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="3"
|
|
||||||
Detect64BitPortabilityProblems="TRUE"
|
|
||||||
DebugInformationFormat="4"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
OutputFile="$(OutDir)/jsontest.exe"
|
|
||||||
LinkIncremental="2"
|
|
||||||
GenerateDebugInformation="TRUE"
|
|
||||||
ProgramDatabaseFile="$(OutDir)/jsontest.pdb"
|
|
||||||
SubSystem="1"
|
|
||||||
TargetMachine="1"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedWrapperGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|Win32"
|
|
||||||
OutputDirectory="../../build/vs71/release/jsontest"
|
|
||||||
IntermediateDirectory="../../build/vs71/release/jsontest"
|
|
||||||
ConfigurationType="1"
|
|
||||||
CharacterSet="2">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories="../../include"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
|
|
||||||
RuntimeLibrary="0"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="3"
|
|
||||||
Detect64BitPortabilityProblems="TRUE"
|
|
||||||
DebugInformationFormat="3"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
OutputFile="$(OutDir)/jsontest.exe"
|
|
||||||
LinkIncremental="1"
|
|
||||||
GenerateDebugInformation="TRUE"
|
|
||||||
SubSystem="1"
|
|
||||||
OptimizeReferences="2"
|
|
||||||
EnableCOMDATFolding="2"
|
|
||||||
TargetMachine="1"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedWrapperGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
|
||||||
</Configuration>
|
|
||||||
</Configurations>
|
|
||||||
<References>
|
|
||||||
</References>
|
|
||||||
<Files>
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\src\jsontestrunner\main.cpp">
|
|
||||||
</File>
|
|
||||||
</Files>
|
|
||||||
<Globals>
|
|
||||||
</Globals>
|
|
||||||
</VisualStudioProject>
|
|
@@ -1,205 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="Windows-1252"?>
|
|
||||||
<VisualStudioProject
|
|
||||||
ProjectType="Visual C++"
|
|
||||||
Version="7.10"
|
|
||||||
Name="lib_json"
|
|
||||||
ProjectGUID="{B84F7231-16CE-41D8-8C08-7B523FF4225B}"
|
|
||||||
Keyword="Win32Proj">
|
|
||||||
<Platforms>
|
|
||||||
<Platform
|
|
||||||
Name="Win32"/>
|
|
||||||
</Platforms>
|
|
||||||
<Configurations>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
OutputDirectory="../../build/vs71/debug/lib_json"
|
|
||||||
IntermediateDirectory="../../build/vs71/debug/lib_json"
|
|
||||||
ConfigurationType="4"
|
|
||||||
CharacterSet="2">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
AdditionalIncludeDirectories="../../include"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_LIB"
|
|
||||||
StringPooling="TRUE"
|
|
||||||
MinimalRebuild="TRUE"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="1"
|
|
||||||
EnableFunctionLevelLinking="TRUE"
|
|
||||||
DisableLanguageExtensions="TRUE"
|
|
||||||
ForceConformanceInForLoopScope="FALSE"
|
|
||||||
RuntimeTypeInfo="TRUE"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="3"
|
|
||||||
Detect64BitPortabilityProblems="TRUE"
|
|
||||||
DebugInformationFormat="4"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLibrarianTool"
|
|
||||||
OutputFile="$(OutDir)/json_vc71_libmtd.lib"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedWrapperGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|Win32"
|
|
||||||
OutputDirectory="../../build/vs71/release/lib_json"
|
|
||||||
IntermediateDirectory="../../build/vs71/release/lib_json"
|
|
||||||
ConfigurationType="4"
|
|
||||||
CharacterSet="2"
|
|
||||||
WholeProgramOptimization="TRUE">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
GlobalOptimizations="TRUE"
|
|
||||||
EnableIntrinsicFunctions="TRUE"
|
|
||||||
AdditionalIncludeDirectories="../../include"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_LIB"
|
|
||||||
StringPooling="TRUE"
|
|
||||||
RuntimeLibrary="0"
|
|
||||||
EnableFunctionLevelLinking="TRUE"
|
|
||||||
DisableLanguageExtensions="TRUE"
|
|
||||||
ForceConformanceInForLoopScope="FALSE"
|
|
||||||
RuntimeTypeInfo="TRUE"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
AssemblerOutput="4"
|
|
||||||
WarningLevel="3"
|
|
||||||
Detect64BitPortabilityProblems="TRUE"
|
|
||||||
DebugInformationFormat="3"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLibrarianTool"
|
|
||||||
OutputFile="$(OutDir)/json_vc71_libmt.lib"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedWrapperGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="dummy|Win32"
|
|
||||||
OutputDirectory="$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(ConfigurationName)"
|
|
||||||
ConfigurationType="2"
|
|
||||||
CharacterSet="2"
|
|
||||||
WholeProgramOptimization="TRUE">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
GlobalOptimizations="TRUE"
|
|
||||||
EnableIntrinsicFunctions="TRUE"
|
|
||||||
AdditionalIncludeDirectories="../../include"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_LIB"
|
|
||||||
StringPooling="TRUE"
|
|
||||||
RuntimeLibrary="4"
|
|
||||||
EnableFunctionLevelLinking="TRUE"
|
|
||||||
DisableLanguageExtensions="TRUE"
|
|
||||||
ForceConformanceInForLoopScope="FALSE"
|
|
||||||
RuntimeTypeInfo="TRUE"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
AssemblerOutput="4"
|
|
||||||
WarningLevel="3"
|
|
||||||
Detect64BitPortabilityProblems="TRUE"
|
|
||||||
DebugInformationFormat="3"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
GenerateDebugInformation="TRUE"
|
|
||||||
SubSystem="2"
|
|
||||||
OptimizeReferences="2"
|
|
||||||
EnableCOMDATFolding="2"
|
|
||||||
TargetMachine="1"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedWrapperGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
|
||||||
</Configuration>
|
|
||||||
</Configurations>
|
|
||||||
<References>
|
|
||||||
</References>
|
|
||||||
<Files>
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\include\json\autolink.h">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\include\json\config.h">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\include\json\features.h">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\include\json\forwards.h">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\include\json\json.h">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\src\lib_json\json_reader.cpp">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\src\lib_json\json_value.cpp">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\src\lib_json\json_valueiterator.inl">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\src\lib_json\json_writer.cpp">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\include\json\reader.h">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\include\json\value.h">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\include\json\writer.h">
|
|
||||||
</File>
|
|
||||||
</Files>
|
|
||||||
<Globals>
|
|
||||||
</Globals>
|
|
||||||
</VisualStudioProject>
|
|
@@ -1,130 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="Windows-1252"?>
|
|
||||||
<VisualStudioProject
|
|
||||||
ProjectType="Visual C++"
|
|
||||||
Version="7.10"
|
|
||||||
Name="test_lib_json"
|
|
||||||
ProjectGUID="{B7A96B78-2782-40D2-8F37-A2DEF2B9C26D}"
|
|
||||||
RootNamespace="test_lib_json"
|
|
||||||
Keyword="Win32Proj">
|
|
||||||
<Platforms>
|
|
||||||
<Platform
|
|
||||||
Name="Win32"/>
|
|
||||||
</Platforms>
|
|
||||||
<Configurations>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
OutputDirectory="../../build/vs71/debug/test_lib_json"
|
|
||||||
IntermediateDirectory="../../build/vs71/debug/test_lib_json"
|
|
||||||
ConfigurationType="1"
|
|
||||||
CharacterSet="2">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
AdditionalIncludeDirectories="../../include"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
|
|
||||||
MinimalRebuild="TRUE"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="1"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="3"
|
|
||||||
Detect64BitPortabilityProblems="TRUE"
|
|
||||||
DebugInformationFormat="4"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
OutputFile="$(OutDir)/test_lib_json.exe"
|
|
||||||
LinkIncremental="2"
|
|
||||||
GenerateDebugInformation="TRUE"
|
|
||||||
ProgramDatabaseFile="$(OutDir)/test_lib_json.pdb"
|
|
||||||
SubSystem="1"
|
|
||||||
TargetMachine="1"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
Description="Running all unit tests"
|
|
||||||
CommandLine="$(TargetPath)"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedWrapperGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|Win32"
|
|
||||||
OutputDirectory="../../build/vs71/release/test_lib_json"
|
|
||||||
IntermediateDirectory="../../build/vs71/release/test_lib_json"
|
|
||||||
ConfigurationType="1"
|
|
||||||
CharacterSet="2">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories="../../include"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
|
|
||||||
RuntimeLibrary="0"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="3"
|
|
||||||
Detect64BitPortabilityProblems="TRUE"
|
|
||||||
DebugInformationFormat="3"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
OutputFile="$(OutDir)/test_lib_json.exe"
|
|
||||||
LinkIncremental="1"
|
|
||||||
GenerateDebugInformation="TRUE"
|
|
||||||
SubSystem="1"
|
|
||||||
OptimizeReferences="2"
|
|
||||||
EnableCOMDATFolding="2"
|
|
||||||
TargetMachine="1"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
Description="Running all unit tests"
|
|
||||||
CommandLine="$(TargetPath)"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedWrapperGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
|
||||||
</Configuration>
|
|
||||||
</Configurations>
|
|
||||||
<References>
|
|
||||||
</References>
|
|
||||||
<Files>
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\src\test_lib_json\jsontest.cpp">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\src\test_lib_json\jsontest.h">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\src\test_lib_json\main.cpp">
|
|
||||||
</File>
|
|
||||||
</Files>
|
|
||||||
<Globals>
|
|
||||||
</Globals>
|
|
||||||
</VisualStudioProject>
|
|
@@ -1,4 +1,4 @@
|
|||||||
# Copyright 2010 Baptiste Lepilleur
|
# Copyright 2010 Baptiste Lepilleur and The JsonCpp Authors
|
||||||
# Distributed under MIT license, or public domain if desired and
|
# Distributed under MIT license, or public domain if desired and
|
||||||
# recognized in your jurisdiction.
|
# recognized in your jurisdiction.
|
||||||
# See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
# See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
||||||
@@ -265,7 +265,7 @@ Performs an svn export of tag release version, and build a source tarball.
|
|||||||
|
|
||||||
Must be started in the project top directory.
|
Must be started in the project top directory.
|
||||||
|
|
||||||
Warning: --force should only be used when developping/testing the release script.
|
Warning: --force should only be used when developing/testing the release script.
|
||||||
"""
|
"""
|
||||||
from optparse import OptionParser
|
from optparse import OptionParser
|
||||||
parser = OptionParser(usage=usage)
|
parser = OptionParser(usage=usage)
|
||||||
@@ -377,7 +377,7 @@ Warning: --force should only be used when developping/testing the release script
|
|||||||
user=options.user, sftp=options.sftp)
|
user=options.user, sftp=options.sftp)
|
||||||
print('Source and doc release tarballs uploaded')
|
print('Source and doc release tarballs uploaded')
|
||||||
else:
|
else:
|
||||||
print('No upload user specified. Web site and download tarbal were not uploaded.')
|
print('No upload user specified. Web site and download tarball were not uploaded.')
|
||||||
print('Tarball can be found at:', doc_tarball_path)
|
print('Tarball can be found at:', doc_tarball_path)
|
||||||
|
|
||||||
# Set next version number and commit
|
# Set next version number and commit
|
||||||
|
116
meson.build
Normal file
116
meson.build
Normal file
@@ -0,0 +1,116 @@
|
|||||||
|
project(
|
||||||
|
'jsoncpp',
|
||||||
|
'cpp',
|
||||||
|
version : '1.9.0',
|
||||||
|
default_options : [
|
||||||
|
'buildtype=release',
|
||||||
|
'cpp_std=c++11',
|
||||||
|
'warning_level=1'],
|
||||||
|
license : 'Public Domain',
|
||||||
|
meson_version : '>= 0.50.0')
|
||||||
|
|
||||||
|
jsoncpp_ver_arr = meson.project_version().split('.')
|
||||||
|
jsoncpp_major_version = jsoncpp_ver_arr[0]
|
||||||
|
jsoncpp_minor_version = jsoncpp_ver_arr[1]
|
||||||
|
jsoncpp_patch_version = jsoncpp_ver_arr[2]
|
||||||
|
|
||||||
|
jsoncpp_cdata = configuration_data()
|
||||||
|
jsoncpp_cdata.set('JSONCPP_VERSION', meson.project_version())
|
||||||
|
jsoncpp_cdata.set('JSONCPP_VERSION_MAJOR', jsoncpp_major_version)
|
||||||
|
jsoncpp_cdata.set('JSONCPP_VERSION_MINOR', jsoncpp_minor_version)
|
||||||
|
jsoncpp_cdata.set('JSONCPP_VERSION_PATCH', jsoncpp_patch_version)
|
||||||
|
jsoncpp_cdata.set('JSONCPP_USE_SECURE_MEMORY',0)
|
||||||
|
|
||||||
|
jsoncpp_gen_sources = configure_file(
|
||||||
|
input : 'src/lib_json/version.h.in',
|
||||||
|
output : 'version.h',
|
||||||
|
configuration : jsoncpp_cdata,
|
||||||
|
install : true,
|
||||||
|
install_dir : join_paths(get_option('prefix'), get_option('includedir'), 'json')
|
||||||
|
)
|
||||||
|
|
||||||
|
jsoncpp_headers = [
|
||||||
|
'include/json/allocator.h',
|
||||||
|
'include/json/assertions.h',
|
||||||
|
'include/json/autolink.h',
|
||||||
|
'include/json/config.h',
|
||||||
|
'include/json/features.h',
|
||||||
|
'include/json/forwards.h',
|
||||||
|
'include/json/json.h',
|
||||||
|
'include/json/reader.h',
|
||||||
|
'include/json/value.h',
|
||||||
|
'include/json/writer.h']
|
||||||
|
jsoncpp_include_directories = include_directories('include')
|
||||||
|
|
||||||
|
install_headers(
|
||||||
|
jsoncpp_headers,
|
||||||
|
subdir : 'json')
|
||||||
|
|
||||||
|
if get_option('default_library') == 'shared' and meson.get_compiler('cpp').get_id() == 'msvc'
|
||||||
|
dll_export_flag = '-DJSON_DLL_BUILD'
|
||||||
|
dll_import_flag = '-DJSON_DLL'
|
||||||
|
else
|
||||||
|
dll_export_flag = []
|
||||||
|
dll_import_flag = []
|
||||||
|
endif
|
||||||
|
|
||||||
|
jsoncpp_lib = library(
|
||||||
|
'jsoncpp',
|
||||||
|
[ jsoncpp_gen_sources,
|
||||||
|
jsoncpp_headers,
|
||||||
|
'src/lib_json/json_tool.h',
|
||||||
|
'src/lib_json/json_reader.cpp',
|
||||||
|
'src/lib_json/json_value.cpp',
|
||||||
|
'src/lib_json/json_writer.cpp'],
|
||||||
|
soversion : 21,
|
||||||
|
install : true,
|
||||||
|
include_directories : jsoncpp_include_directories,
|
||||||
|
cpp_args: dll_export_flag)
|
||||||
|
|
||||||
|
import('pkgconfig').generate(
|
||||||
|
libraries : jsoncpp_lib,
|
||||||
|
version : meson.project_version(),
|
||||||
|
name : 'jsoncpp',
|
||||||
|
filebase : 'jsoncpp',
|
||||||
|
description : 'A C++ library for interacting with JSON')
|
||||||
|
|
||||||
|
# for libraries bundling jsoncpp
|
||||||
|
jsoncpp_dep = declare_dependency(
|
||||||
|
include_directories : jsoncpp_include_directories,
|
||||||
|
link_with : jsoncpp_lib,
|
||||||
|
version : meson.project_version(),
|
||||||
|
sources : jsoncpp_gen_sources)
|
||||||
|
|
||||||
|
# tests
|
||||||
|
python = import('python3').find_python()
|
||||||
|
|
||||||
|
jsoncpp_test = executable(
|
||||||
|
'jsoncpp_test',
|
||||||
|
[ 'src/test_lib_json/jsontest.cpp',
|
||||||
|
'src/test_lib_json/jsontest.h',
|
||||||
|
'src/test_lib_json/main.cpp',
|
||||||
|
'src/test_lib_json/fuzz.cpp'],
|
||||||
|
include_directories : jsoncpp_include_directories,
|
||||||
|
link_with : jsoncpp_lib,
|
||||||
|
install : false,
|
||||||
|
cpp_args: dll_import_flag)
|
||||||
|
test(
|
||||||
|
'unittest_jsoncpp_test',
|
||||||
|
jsoncpp_test)
|
||||||
|
|
||||||
|
jsontestrunner = executable(
|
||||||
|
'jsontestrunner',
|
||||||
|
'src/jsontestrunner/main.cpp',
|
||||||
|
include_directories : jsoncpp_include_directories,
|
||||||
|
link_with : jsoncpp_lib,
|
||||||
|
install : false,
|
||||||
|
cpp_args: dll_import_flag)
|
||||||
|
test(
|
||||||
|
'unittest_jsontestrunner',
|
||||||
|
python,
|
||||||
|
args : [
|
||||||
|
'-B',
|
||||||
|
join_paths(meson.current_source_dir(), 'test/runjsontests.py'),
|
||||||
|
jsontestrunner,
|
||||||
|
join_paths(meson.current_source_dir(), 'test/data')]
|
||||||
|
)
|
@@ -1,7 +1,5 @@
|
|||||||
prefix=@CMAKE_INSTALL_PREFIX@
|
libdir=@CMAKE_INSTALL_FULL_LIBDIR@
|
||||||
exec_prefix=${prefix}
|
includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@
|
||||||
libdir=${exec_prefix}/@LIBRARY_INSTALL_DIR@
|
|
||||||
includedir=${prefix}/@INCLUDE_INSTALL_DIR@
|
|
||||||
|
|
||||||
Name: jsoncpp
|
Name: jsoncpp
|
||||||
Description: A C++ library for interacting with JSON
|
Description: A C++ library for interacting with JSON
|
||||||
|
@@ -1,58 +0,0 @@
|
|||||||
# Copyright 2009 Baptiste Lepilleur
|
|
||||||
# Distributed under MIT license, or public domain if desired and
|
|
||||||
# recognized in your jurisdiction.
|
|
||||||
# See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
|
||||||
|
|
||||||
import fnmatch
|
|
||||||
import os
|
|
||||||
|
|
||||||
def generate(env):
|
|
||||||
def Glob(env, includes = None, excludes = None, dir = '.'):
|
|
||||||
"""Adds Glob(includes = Split('*'), excludes = None, dir = '.')
|
|
||||||
helper function to environment.
|
|
||||||
|
|
||||||
Glob both the file-system files.
|
|
||||||
|
|
||||||
includes: list of file name pattern included in the return list when matched.
|
|
||||||
excludes: list of file name pattern exluced from the return list.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
sources = env.Glob(("*.cpp", '*.h'), "~*.cpp", "#src")
|
|
||||||
"""
|
|
||||||
def filterFilename(path):
|
|
||||||
abs_path = os.path.join(dir, path)
|
|
||||||
if not os.path.isfile(abs_path):
|
|
||||||
return 0
|
|
||||||
fn = os.path.basename(path)
|
|
||||||
match = 0
|
|
||||||
for include in includes:
|
|
||||||
if fnmatch.fnmatchcase(fn, include):
|
|
||||||
match = 1
|
|
||||||
break
|
|
||||||
if match == 1 and not excludes is None:
|
|
||||||
for exclude in excludes:
|
|
||||||
if fnmatch.fnmatchcase(fn, exclude):
|
|
||||||
match = 0
|
|
||||||
break
|
|
||||||
return match
|
|
||||||
if includes is None:
|
|
||||||
includes = ('*',)
|
|
||||||
elif type(includes) in (type(''), type(u'')):
|
|
||||||
includes = (includes,)
|
|
||||||
if type(excludes) in (type(''), type(u'')):
|
|
||||||
excludes = (excludes,)
|
|
||||||
dir = env.Dir(dir).abspath
|
|
||||||
paths = os.listdir(dir)
|
|
||||||
def makeAbsFileNode(path):
|
|
||||||
return env.File(os.path.join(dir, path))
|
|
||||||
nodes = filter(filterFilename, paths)
|
|
||||||
return map(makeAbsFileNode, nodes)
|
|
||||||
|
|
||||||
from SCons.Script import Environment
|
|
||||||
Environment.Glob = Glob
|
|
||||||
|
|
||||||
def exists(env):
|
|
||||||
"""
|
|
||||||
Tool always exists.
|
|
||||||
"""
|
|
||||||
return True
|
|
@@ -1,183 +0,0 @@
|
|||||||
# Copyright 2007 Baptiste Lepilleur
|
|
||||||
# Distributed under MIT license, or public domain if desired and
|
|
||||||
# recognized in your jurisdiction.
|
|
||||||
# See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
|
||||||
|
|
||||||
import os
|
|
||||||
import os.path
|
|
||||||
from fnmatch import fnmatch
|
|
||||||
import targz
|
|
||||||
|
|
||||||
##def DoxyfileParse(file_contents):
|
|
||||||
## """
|
|
||||||
## Parse a Doxygen source file and return a dictionary of all the values.
|
|
||||||
## Values will be strings and lists of strings.
|
|
||||||
## """
|
|
||||||
## data = {}
|
|
||||||
##
|
|
||||||
## import shlex
|
|
||||||
## lex = shlex.shlex(instream = file_contents, posix = True)
|
|
||||||
## lex.wordchars += "*+./-:"
|
|
||||||
## lex.whitespace = lex.whitespace.replace("\n", "")
|
|
||||||
## lex.escape = ""
|
|
||||||
##
|
|
||||||
## lineno = lex.lineno
|
|
||||||
## last_backslash_lineno = lineno
|
|
||||||
## token = lex.get_token()
|
|
||||||
## key = token # the first token should be a key
|
|
||||||
## last_token = ""
|
|
||||||
## key_token = False
|
|
||||||
## next_key = False
|
|
||||||
## new_data = True
|
|
||||||
##
|
|
||||||
## def append_data(data, key, new_data, token):
|
|
||||||
## if new_data or len(data[key]) == 0:
|
|
||||||
## data[key].append(token)
|
|
||||||
## else:
|
|
||||||
## data[key][-1] += token
|
|
||||||
##
|
|
||||||
## while token:
|
|
||||||
## if token in ['\n']:
|
|
||||||
## if last_token not in ['\\']:
|
|
||||||
## key_token = True
|
|
||||||
## elif token in ['\\']:
|
|
||||||
## pass
|
|
||||||
## elif key_token:
|
|
||||||
## key = token
|
|
||||||
## key_token = False
|
|
||||||
## else:
|
|
||||||
## if token == "+=":
|
|
||||||
## if not data.has_key(key):
|
|
||||||
## data[key] = list()
|
|
||||||
## elif token == "=":
|
|
||||||
## data[key] = list()
|
|
||||||
## else:
|
|
||||||
## append_data(data, key, new_data, token)
|
|
||||||
## new_data = True
|
|
||||||
##
|
|
||||||
## last_token = token
|
|
||||||
## token = lex.get_token()
|
|
||||||
##
|
|
||||||
## if last_token == '\\' and token != '\n':
|
|
||||||
## new_data = False
|
|
||||||
## append_data(data, key, new_data, '\\')
|
|
||||||
##
|
|
||||||
## # compress lists of len 1 into single strings
|
|
||||||
## for (k, v) in data.items():
|
|
||||||
## if len(v) == 0:
|
|
||||||
## data.pop(k)
|
|
||||||
##
|
|
||||||
## # items in the following list will be kept as lists and not converted to strings
|
|
||||||
## if k in ["INPUT", "FILE_PATTERNS", "EXCLUDE_PATTERNS"]:
|
|
||||||
## continue
|
|
||||||
##
|
|
||||||
## if len(v) == 1:
|
|
||||||
## data[k] = v[0]
|
|
||||||
##
|
|
||||||
## return data
|
|
||||||
##
|
|
||||||
##def DoxySourceScan(node, env, path):
|
|
||||||
## """
|
|
||||||
## Doxygen Doxyfile source scanner. This should scan the Doxygen file and add
|
|
||||||
## any files used to generate docs to the list of source files.
|
|
||||||
## """
|
|
||||||
## default_file_patterns = [
|
|
||||||
## '*.c', '*.cc', '*.cxx', '*.cpp', '*.c++', '*.java', '*.ii', '*.ixx',
|
|
||||||
## '*.ipp', '*.i++', '*.inl', '*.h', '*.hh ', '*.hxx', '*.hpp', '*.h++',
|
|
||||||
## '*.idl', '*.odl', '*.cs', '*.php', '*.php3', '*.inc', '*.m', '*.mm',
|
|
||||||
## '*.py',
|
|
||||||
## ]
|
|
||||||
##
|
|
||||||
## default_exclude_patterns = [
|
|
||||||
## '*~',
|
|
||||||
## ]
|
|
||||||
##
|
|
||||||
## sources = []
|
|
||||||
##
|
|
||||||
## data = DoxyfileParse(node.get_contents())
|
|
||||||
##
|
|
||||||
## if data.get("RECURSIVE", "NO") == "YES":
|
|
||||||
## recursive = True
|
|
||||||
## else:
|
|
||||||
## recursive = False
|
|
||||||
##
|
|
||||||
## file_patterns = data.get("FILE_PATTERNS", default_file_patterns)
|
|
||||||
## exclude_patterns = data.get("EXCLUDE_PATTERNS", default_exclude_patterns)
|
|
||||||
##
|
|
||||||
## for node in data.get("INPUT", []):
|
|
||||||
## if os.path.isfile(node):
|
|
||||||
## sources.add(node)
|
|
||||||
## elif os.path.isdir(node):
|
|
||||||
## if recursive:
|
|
||||||
## for root, dirs, files in os.walk(node):
|
|
||||||
## for f in files:
|
|
||||||
## filename = os.path.join(root, f)
|
|
||||||
##
|
|
||||||
## pattern_check = reduce(lambda x, y: x or bool(fnmatch(filename, y)), file_patterns, False)
|
|
||||||
## exclude_check = reduce(lambda x, y: x and fnmatch(filename, y), exclude_patterns, True)
|
|
||||||
##
|
|
||||||
## if pattern_check and not exclude_check:
|
|
||||||
## sources.append(filename)
|
|
||||||
## else:
|
|
||||||
## for pattern in file_patterns:
|
|
||||||
## sources.extend(glob.glob("/".join([node, pattern])))
|
|
||||||
## sources = map(lambda path: env.File(path), sources)
|
|
||||||
## return sources
|
|
||||||
##
|
|
||||||
##
|
|
||||||
##def DoxySourceScanCheck(node, env):
|
|
||||||
## """Check if we should scan this file"""
|
|
||||||
## return os.path.isfile(node.path)
|
|
||||||
|
|
||||||
def srcDistEmitter(source, target, env):
|
|
||||||
## """Doxygen Doxyfile emitter"""
|
|
||||||
## # possible output formats and their default values and output locations
|
|
||||||
## output_formats = {
|
|
||||||
## "HTML": ("YES", "html"),
|
|
||||||
## "LATEX": ("YES", "latex"),
|
|
||||||
## "RTF": ("NO", "rtf"),
|
|
||||||
## "MAN": ("YES", "man"),
|
|
||||||
## "XML": ("NO", "xml"),
|
|
||||||
## }
|
|
||||||
##
|
|
||||||
## data = DoxyfileParse(source[0].get_contents())
|
|
||||||
##
|
|
||||||
## targets = []
|
|
||||||
## out_dir = data.get("OUTPUT_DIRECTORY", ".")
|
|
||||||
##
|
|
||||||
## # add our output locations
|
|
||||||
## for (k, v) in output_formats.items():
|
|
||||||
## if data.get("GENERATE_" + k, v[0]) == "YES":
|
|
||||||
## targets.append(env.Dir(os.path.join(out_dir, data.get(k + "_OUTPUT", v[1]))))
|
|
||||||
##
|
|
||||||
## # don't clobber targets
|
|
||||||
## for node in targets:
|
|
||||||
## env.Precious(node)
|
|
||||||
##
|
|
||||||
## # set up cleaning stuff
|
|
||||||
## for node in targets:
|
|
||||||
## env.Clean(node, node)
|
|
||||||
##
|
|
||||||
## return (targets, source)
|
|
||||||
return (target,source)
|
|
||||||
|
|
||||||
def generate(env):
|
|
||||||
"""
|
|
||||||
Add builders and construction variables for the
|
|
||||||
SrcDist tool.
|
|
||||||
"""
|
|
||||||
## doxyfile_scanner = env.Scanner(## DoxySourceScan,
|
|
||||||
## "DoxySourceScan",
|
|
||||||
## scan_check = DoxySourceScanCheck,
|
|
||||||
##)
|
|
||||||
|
|
||||||
if targz.exists(env):
|
|
||||||
srcdist_builder = targz.makeBuilder(srcDistEmitter)
|
|
||||||
|
|
||||||
env['BUILDERS']['SrcDist'] = srcdist_builder
|
|
||||||
|
|
||||||
def exists(env):
|
|
||||||
"""
|
|
||||||
Make sure srcdist exists.
|
|
||||||
"""
|
|
||||||
return targz.exists(env)
|
|
@@ -1,85 +0,0 @@
|
|||||||
# Copyright 2010 Baptiste Lepilleur
|
|
||||||
# Distributed under MIT license, or public domain if desired and
|
|
||||||
# recognized in your jurisdiction.
|
|
||||||
# See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
|
||||||
|
|
||||||
import re
|
|
||||||
from SCons.Script import * # the usual scons stuff you get in a SConscript
|
|
||||||
import collections
|
|
||||||
|
|
||||||
def generate(env):
|
|
||||||
"""
|
|
||||||
Add builders and construction variables for the
|
|
||||||
SubstInFile tool.
|
|
||||||
|
|
||||||
Adds SubstInFile builder, which substitutes the keys->values of SUBST_DICT
|
|
||||||
from the source to the target.
|
|
||||||
The values of SUBST_DICT first have any construction variables expanded
|
|
||||||
(its keys are not expanded).
|
|
||||||
If a value of SUBST_DICT is a python callable function, it is called and
|
|
||||||
the result is expanded as the value.
|
|
||||||
If there's more than one source and more than one target, each target gets
|
|
||||||
substituted from the corresponding source.
|
|
||||||
"""
|
|
||||||
def do_subst_in_file(targetfile, sourcefile, dict):
|
|
||||||
"""Replace all instances of the keys of dict with their values.
|
|
||||||
For example, if dict is {'%VERSION%': '1.2345', '%BASE%': 'MyProg'},
|
|
||||||
then all instances of %VERSION% in the file will be replaced with 1.2345 etc.
|
|
||||||
"""
|
|
||||||
try:
|
|
||||||
f = open(sourcefile, 'rb')
|
|
||||||
contents = f.read()
|
|
||||||
f.close()
|
|
||||||
except:
|
|
||||||
raise SCons.Errors.UserError("Can't read source file %s"%sourcefile)
|
|
||||||
for (k,v) in list(dict.items()):
|
|
||||||
contents = re.sub(k, v, contents)
|
|
||||||
try:
|
|
||||||
f = open(targetfile, 'wb')
|
|
||||||
f.write(contents)
|
|
||||||
f.close()
|
|
||||||
except:
|
|
||||||
raise SCons.Errors.UserError("Can't write target file %s"%targetfile)
|
|
||||||
return 0 # success
|
|
||||||
|
|
||||||
def subst_in_file(target, source, env):
|
|
||||||
if 'SUBST_DICT' not in env:
|
|
||||||
raise SCons.Errors.UserError("SubstInFile requires SUBST_DICT to be set.")
|
|
||||||
d = dict(env['SUBST_DICT']) # copy it
|
|
||||||
for (k,v) in list(d.items()):
|
|
||||||
if isinstance(v, collections.Callable):
|
|
||||||
d[k] = env.subst(v()).replace('\\','\\\\')
|
|
||||||
elif SCons.Util.is_String(v):
|
|
||||||
d[k] = env.subst(v).replace('\\','\\\\')
|
|
||||||
else:
|
|
||||||
raise SCons.Errors.UserError("SubstInFile: key %s: %s must be a string or callable"%(k, repr(v)))
|
|
||||||
for (t,s) in zip(target, source):
|
|
||||||
return do_subst_in_file(str(t), str(s), d)
|
|
||||||
|
|
||||||
def subst_in_file_string(target, source, env):
|
|
||||||
"""This is what gets printed on the console."""
|
|
||||||
return '\n'.join(['Substituting vars from %s into %s'%(str(s), str(t))
|
|
||||||
for (t,s) in zip(target, source)])
|
|
||||||
|
|
||||||
def subst_emitter(target, source, env):
|
|
||||||
"""Add dependency from substituted SUBST_DICT to target.
|
|
||||||
Returns original target, source tuple unchanged.
|
|
||||||
"""
|
|
||||||
d = env['SUBST_DICT'].copy() # copy it
|
|
||||||
for (k,v) in list(d.items()):
|
|
||||||
if isinstance(v, collections.Callable):
|
|
||||||
d[k] = env.subst(v())
|
|
||||||
elif SCons.Util.is_String(v):
|
|
||||||
d[k]=env.subst(v)
|
|
||||||
Depends(target, SCons.Node.Python.Value(d))
|
|
||||||
return target, source
|
|
||||||
|
|
||||||
## env.Append(TOOLS = 'substinfile') # this should be automaticaly done by Scons ?!?
|
|
||||||
subst_action = SCons.Action.Action(subst_in_file, subst_in_file_string)
|
|
||||||
env['BUILDERS']['SubstInFile'] = Builder(action=subst_action, emitter=subst_emitter)
|
|
||||||
|
|
||||||
def exists(env):
|
|
||||||
"""
|
|
||||||
Make sure tool exists.
|
|
||||||
"""
|
|
||||||
return True
|
|
@@ -1,87 +0,0 @@
|
|||||||
# Copyright 2007 Baptiste Lepilleur
|
|
||||||
# Distributed under MIT license, or public domain if desired and
|
|
||||||
# recognized in your jurisdiction.
|
|
||||||
# See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
|
||||||
|
|
||||||
"""tarball
|
|
||||||
|
|
||||||
Tool-specific initialization for tarball.
|
|
||||||
|
|
||||||
"""
|
|
||||||
|
|
||||||
## Commands to tackle a command based implementation:
|
|
||||||
##to unpack on the fly...
|
|
||||||
##gunzip < FILE.tar.gz | tar xvf -
|
|
||||||
##to pack on the fly...
|
|
||||||
##tar cvf - FILE-LIST | gzip -c > FILE.tar.gz
|
|
||||||
|
|
||||||
import os.path
|
|
||||||
|
|
||||||
import SCons.Builder
|
|
||||||
import SCons.Node.FS
|
|
||||||
import SCons.Util
|
|
||||||
|
|
||||||
try:
|
|
||||||
import gzip
|
|
||||||
import tarfile
|
|
||||||
internal_targz = 1
|
|
||||||
except ImportError:
|
|
||||||
internal_targz = 0
|
|
||||||
|
|
||||||
TARGZ_DEFAULT_COMPRESSION_LEVEL = 9
|
|
||||||
|
|
||||||
if internal_targz:
|
|
||||||
def targz(target, source, env):
|
|
||||||
def archive_name(path):
|
|
||||||
path = os.path.normpath(os.path.abspath(path))
|
|
||||||
common_path = os.path.commonprefix((base_dir, path))
|
|
||||||
archive_name = path[len(common_path):]
|
|
||||||
return archive_name
|
|
||||||
|
|
||||||
def visit(tar, dirname, names):
|
|
||||||
for name in names:
|
|
||||||
path = os.path.join(dirname, name)
|
|
||||||
if os.path.isfile(path):
|
|
||||||
tar.add(path, archive_name(path))
|
|
||||||
compression = env.get('TARGZ_COMPRESSION_LEVEL',TARGZ_DEFAULT_COMPRESSION_LEVEL)
|
|
||||||
base_dir = os.path.normpath(env.get('TARGZ_BASEDIR', env.Dir('.')).abspath)
|
|
||||||
target_path = str(target[0])
|
|
||||||
fileobj = gzip.GzipFile(target_path, 'wb', compression)
|
|
||||||
tar = tarfile.TarFile(os.path.splitext(target_path)[0], 'w', fileobj)
|
|
||||||
for source in source:
|
|
||||||
source_path = str(source)
|
|
||||||
if source.isdir():
|
|
||||||
os.path.walk(source_path, visit, tar)
|
|
||||||
else:
|
|
||||||
tar.add(source_path, archive_name(source_path)) # filename, arcname
|
|
||||||
tar.close()
|
|
||||||
|
|
||||||
targzAction = SCons.Action.Action(targz, varlist=['TARGZ_COMPRESSION_LEVEL','TARGZ_BASEDIR'])
|
|
||||||
|
|
||||||
def makeBuilder(emitter = None):
|
|
||||||
return SCons.Builder.Builder(action = SCons.Action.Action('$TARGZ_COM', '$TARGZ_COMSTR'),
|
|
||||||
source_factory = SCons.Node.FS.Entry,
|
|
||||||
source_scanner = SCons.Defaults.DirScanner,
|
|
||||||
suffix = '$TARGZ_SUFFIX',
|
|
||||||
multi = 1)
|
|
||||||
TarGzBuilder = makeBuilder()
|
|
||||||
|
|
||||||
def generate(env):
|
|
||||||
"""Add Builders and construction variables for zip to an Environment.
|
|
||||||
The following environnement variables may be set:
|
|
||||||
TARGZ_COMPRESSION_LEVEL: integer, [0-9]. 0: no compression, 9: best compression (same as gzip compression level).
|
|
||||||
TARGZ_BASEDIR: base-directory used to determine archive name (this allow archive name to be relative
|
|
||||||
to something other than top-dir).
|
|
||||||
"""
|
|
||||||
env['BUILDERS']['TarGz'] = TarGzBuilder
|
|
||||||
env['TARGZ_COM'] = targzAction
|
|
||||||
env['TARGZ_COMPRESSION_LEVEL'] = TARGZ_DEFAULT_COMPRESSION_LEVEL # range 0-9
|
|
||||||
env['TARGZ_SUFFIX'] = '.tar.gz'
|
|
||||||
env['TARGZ_BASEDIR'] = env.Dir('.') # Sources archive name are made relative to that directory.
|
|
||||||
else:
|
|
||||||
def generate(env):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
def exists(env):
|
|
||||||
return internal_targz
|
|
@@ -1,5 +1,5 @@
|
|||||||
ADD_SUBDIRECTORY(lib_json)
|
add_subdirectory(lib_json)
|
||||||
IF(JSONCPP_WITH_TESTS)
|
if(JSONCPP_WITH_TESTS)
|
||||||
ADD_SUBDIRECTORY(jsontestrunner)
|
add_subdirectory(jsontestrunner)
|
||||||
ADD_SUBDIRECTORY(test_lib_json)
|
add_subdirectory(test_lib_json)
|
||||||
ENDIF()
|
endif()
|
||||||
|
@@ -1,25 +1,36 @@
|
|||||||
FIND_PACKAGE(PythonInterp 2.6)
|
find_package(PythonInterp 2.6)
|
||||||
|
|
||||||
ADD_EXECUTABLE(jsontestrunner_exe
|
add_executable(jsontestrunner_exe
|
||||||
main.cpp
|
main.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
IF(BUILD_SHARED_LIBS)
|
if(BUILD_SHARED_LIBS)
|
||||||
ADD_DEFINITIONS( -DJSON_DLL )
|
add_compile_definitions( JSON_DLL )
|
||||||
TARGET_LINK_LIBRARIES(jsontestrunner_exe jsoncpp_lib)
|
endif()
|
||||||
ELSE(BUILD_SHARED_LIBS)
|
target_link_libraries(jsontestrunner_exe jsoncpp_lib)
|
||||||
TARGET_LINK_LIBRARIES(jsontestrunner_exe jsoncpp_lib_static)
|
|
||||||
ENDIF()
|
|
||||||
|
|
||||||
SET_TARGET_PROPERTIES(jsontestrunner_exe PROPERTIES OUTPUT_NAME jsontestrunner_exe)
|
set_target_properties(jsontestrunner_exe PROPERTIES OUTPUT_NAME jsontestrunner_exe)
|
||||||
|
|
||||||
IF(PYTHONINTERP_FOUND)
|
if(PYTHONINTERP_FOUND)
|
||||||
# Run end to end parser/writer tests
|
# Run end to end parser/writer tests
|
||||||
SET(TEST_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../test)
|
set(TEST_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../test)
|
||||||
SET(RUNJSONTESTS_PATH ${TEST_DIR}/runjsontests.py)
|
set(RUNJSONTESTS_PATH ${TEST_DIR}/runjsontests.py)
|
||||||
ADD_CUSTOM_TARGET(jsoncpp_readerwriter_tests
|
|
||||||
|
# Run unit tests in post-build
|
||||||
|
# (default cmake workflow hides away the test result into a file, resulting in poor dev workflow?!?)
|
||||||
|
add_custom_target(jsoncpp_readerwriter_tests
|
||||||
"${PYTHON_EXECUTABLE}" -B "${RUNJSONTESTS_PATH}" $<TARGET_FILE:jsontestrunner_exe> "${TEST_DIR}/data"
|
"${PYTHON_EXECUTABLE}" -B "${RUNJSONTESTS_PATH}" $<TARGET_FILE:jsontestrunner_exe> "${TEST_DIR}/data"
|
||||||
DEPENDS jsontestrunner_exe jsoncpp_test
|
DEPENDS jsontestrunner_exe jsoncpp_test
|
||||||
)
|
)
|
||||||
ADD_CUSTOM_TARGET(jsoncpp_check DEPENDS jsoncpp_readerwriter_tests)
|
add_custom_target(jsoncpp_check DEPENDS jsoncpp_readerwriter_tests)
|
||||||
ENDIF()
|
|
||||||
|
## Create tests for dashboard submission, allows easy review of CI results https://my.cdash.org/index.php?project=jsoncpp
|
||||||
|
add_test(NAME jsoncpp_readerwriter
|
||||||
|
COMMAND "${PYTHON_EXECUTABLE}" -B "${RUNJSONTESTS_PATH}" $<TARGET_FILE:jsontestrunner_exe> "${TEST_DIR}/data"
|
||||||
|
WORKING_DIRECTORY "${TEST_DIR}/data"
|
||||||
|
)
|
||||||
|
add_test(NAME jsoncpp_readerwriter_json_checker
|
||||||
|
COMMAND "${PYTHON_EXECUTABLE}" -B "${RUNJSONTESTS_PATH}" --with-json-checker $<TARGET_FILE:jsontestrunner_exe> "${TEST_DIR}/data"
|
||||||
|
WORKING_DIRECTORY "${TEST_DIR}/data"
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
@@ -1,49 +1,47 @@
|
|||||||
// Copyright 2007-2010 Baptiste Lepilleur
|
// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors
|
||||||
// Distributed under MIT license, or public domain if desired and
|
// Distributed under MIT license, or public domain if desired and
|
||||||
// recognized in your jurisdiction.
|
// recognized in your jurisdiction.
|
||||||
// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
||||||
|
|
||||||
|
#if defined(__GNUC__)
|
||||||
|
#pragma GCC diagnostic push
|
||||||
|
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
|
||||||
|
#elif defined(_MSC_VER)
|
||||||
|
#pragma warning(disable : 4996)
|
||||||
|
#endif
|
||||||
|
|
||||||
/* This executable is used for testing parser/writer using real JSON files.
|
/* This executable is used for testing parser/writer using real JSON files.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <json/json.h>
|
|
||||||
#include <algorithm> // sort
|
#include <algorithm> // sort
|
||||||
|
#include <cstdio>
|
||||||
|
#include <json/json.h>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#if defined(_MSC_VER) && _MSC_VER >= 1310
|
struct Options {
|
||||||
#pragma warning(disable : 4996) // disable fopen deprecation warning
|
Json::String path;
|
||||||
#endif
|
|
||||||
|
|
||||||
struct Options
|
|
||||||
{
|
|
||||||
JSONCPP_STRING path;
|
|
||||||
Json::Features features;
|
Json::Features features;
|
||||||
bool parseOnly;
|
bool parseOnly;
|
||||||
typedef JSONCPP_STRING (*writeFuncType)(Json::Value const&);
|
using writeFuncType = Json::String (*)(Json::Value const&);
|
||||||
writeFuncType write;
|
writeFuncType write;
|
||||||
};
|
};
|
||||||
|
|
||||||
static JSONCPP_STRING normalizeFloatingPointStr(double value) {
|
static Json::String normalizeFloatingPointStr(double value) {
|
||||||
char buffer[32];
|
char buffer[32];
|
||||||
#if defined(_MSC_VER) && defined(__STDC_SECURE_LIB__)
|
jsoncpp_snprintf(buffer, sizeof(buffer), "%.16g", value);
|
||||||
sprintf_s(buffer, sizeof(buffer), "%.16g", value);
|
|
||||||
#else
|
|
||||||
snprintf(buffer, sizeof(buffer), "%.16g", value);
|
|
||||||
#endif
|
|
||||||
buffer[sizeof(buffer) - 1] = 0;
|
buffer[sizeof(buffer) - 1] = 0;
|
||||||
JSONCPP_STRING s(buffer);
|
Json::String s(buffer);
|
||||||
JSONCPP_STRING::size_type index = s.find_last_of("eE");
|
Json::String::size_type index = s.find_last_of("eE");
|
||||||
if (index != JSONCPP_STRING::npos) {
|
if (index != Json::String::npos) {
|
||||||
JSONCPP_STRING::size_type hasSign =
|
Json::String::size_type hasSign =
|
||||||
(s[index + 1] == '+' || s[index + 1] == '-') ? 1 : 0;
|
(s[index + 1] == '+' || s[index + 1] == '-') ? 1 : 0;
|
||||||
JSONCPP_STRING::size_type exponentStartIndex = index + 1 + hasSign;
|
Json::String::size_type exponentStartIndex = index + 1 + hasSign;
|
||||||
JSONCPP_STRING normalized = s.substr(0, exponentStartIndex);
|
Json::String normalized = s.substr(0, exponentStartIndex);
|
||||||
JSONCPP_STRING::size_type indexDigit =
|
Json::String::size_type indexDigit =
|
||||||
s.find_first_not_of('0', exponentStartIndex);
|
s.find_first_not_of('0', exponentStartIndex);
|
||||||
JSONCPP_STRING exponent = "0";
|
Json::String exponent = "0";
|
||||||
if (indexDigit !=
|
if (indexDigit != Json::String::npos) // There is an exponent different
|
||||||
JSONCPP_STRING::npos) // There is an exponent different from 0
|
// from 0
|
||||||
{
|
{
|
||||||
exponent = s.substr(indexDigit);
|
exponent = s.substr(indexDigit);
|
||||||
}
|
}
|
||||||
@@ -52,17 +50,17 @@ static JSONCPP_STRING normalizeFloatingPointStr(double value) {
|
|||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
static JSONCPP_STRING readInputTestFile(const char* path) {
|
static Json::String readInputTestFile(const char* path) {
|
||||||
FILE* file = fopen(path, "rb");
|
FILE* file = fopen(path, "rb");
|
||||||
if (!file)
|
if (!file)
|
||||||
return JSONCPP_STRING("");
|
return "";
|
||||||
fseek(file, 0, SEEK_END);
|
fseek(file, 0, SEEK_END);
|
||||||
long const size = ftell(file);
|
long const size = ftell(file);
|
||||||
unsigned long const usize = static_cast<unsigned long>(size);
|
size_t const usize = static_cast<unsigned long>(size);
|
||||||
fseek(file, 0, SEEK_SET);
|
fseek(file, 0, SEEK_SET);
|
||||||
JSONCPP_STRING text;
|
|
||||||
char* buffer = new char[size + 1];
|
char* buffer = new char[size + 1];
|
||||||
buffer[size] = 0;
|
buffer[size] = 0;
|
||||||
|
Json::String text;
|
||||||
if (fread(buffer, 1, usize, file) == usize)
|
if (fread(buffer, 1, usize, file) == usize)
|
||||||
text = buffer;
|
text = buffer;
|
||||||
fclose(file);
|
fclose(file);
|
||||||
@@ -71,7 +69,7 @@ static JSONCPP_STRING readInputTestFile(const char* path) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
printValueTree(FILE* fout, Json::Value& value, const JSONCPP_STRING& path = ".") {
|
printValueTree(FILE* fout, Json::Value& value, const Json::String& path = ".") {
|
||||||
if (value.hasComment(Json::commentBefore)) {
|
if (value.hasComment(Json::commentBefore)) {
|
||||||
fprintf(fout, "%s\n", value.getComment(Json::commentBefore).c_str());
|
fprintf(fout, "%s\n", value.getComment(Json::commentBefore).c_str());
|
||||||
}
|
}
|
||||||
@@ -80,21 +78,15 @@ printValueTree(FILE* fout, Json::Value& value, const JSONCPP_STRING& path = ".")
|
|||||||
fprintf(fout, "%s=null\n", path.c_str());
|
fprintf(fout, "%s=null\n", path.c_str());
|
||||||
break;
|
break;
|
||||||
case Json::intValue:
|
case Json::intValue:
|
||||||
fprintf(fout,
|
fprintf(fout, "%s=%s\n", path.c_str(),
|
||||||
"%s=%s\n",
|
|
||||||
path.c_str(),
|
|
||||||
Json::valueToString(value.asLargestInt()).c_str());
|
Json::valueToString(value.asLargestInt()).c_str());
|
||||||
break;
|
break;
|
||||||
case Json::uintValue:
|
case Json::uintValue:
|
||||||
fprintf(fout,
|
fprintf(fout, "%s=%s\n", path.c_str(),
|
||||||
"%s=%s\n",
|
|
||||||
path.c_str(),
|
|
||||||
Json::valueToString(value.asLargestUInt()).c_str());
|
Json::valueToString(value.asLargestUInt()).c_str());
|
||||||
break;
|
break;
|
||||||
case Json::realValue:
|
case Json::realValue:
|
||||||
fprintf(fout,
|
fprintf(fout, "%s=%s\n", path.c_str(),
|
||||||
"%s=%s\n",
|
|
||||||
path.c_str(),
|
|
||||||
normalizeFloatingPointStr(value.asDouble()).c_str());
|
normalizeFloatingPointStr(value.asDouble()).c_str());
|
||||||
break;
|
break;
|
||||||
case Json::stringValue:
|
case Json::stringValue:
|
||||||
@@ -108,11 +100,7 @@ printValueTree(FILE* fout, Json::Value& value, const JSONCPP_STRING& path = ".")
|
|||||||
Json::ArrayIndex size = value.size();
|
Json::ArrayIndex size = value.size();
|
||||||
for (Json::ArrayIndex index = 0; index < size; ++index) {
|
for (Json::ArrayIndex index = 0; index < size; ++index) {
|
||||||
static char buffer[16];
|
static char buffer[16];
|
||||||
#if defined(_MSC_VER) && defined(__STDC_SECURE_LIB__)
|
jsoncpp_snprintf(buffer, sizeof(buffer), "[%u]", index);
|
||||||
sprintf_s(buffer, sizeof(buffer), "[%d]", index);
|
|
||||||
#else
|
|
||||||
snprintf(buffer, sizeof(buffer), "[%d]", index);
|
|
||||||
#endif
|
|
||||||
printValueTree(fout, value[index], path + buffer);
|
printValueTree(fout, value[index], path + buffer);
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
@@ -120,11 +108,8 @@ printValueTree(FILE* fout, Json::Value& value, const JSONCPP_STRING& path = ".")
|
|||||||
fprintf(fout, "%s={}\n", path.c_str());
|
fprintf(fout, "%s={}\n", path.c_str());
|
||||||
Json::Value::Members members(value.getMemberNames());
|
Json::Value::Members members(value.getMemberNames());
|
||||||
std::sort(members.begin(), members.end());
|
std::sort(members.begin(), members.end());
|
||||||
JSONCPP_STRING suffix = *(path.end() - 1) == '.' ? "" : ".";
|
Json::String suffix = *(path.end() - 1) == '.' ? "" : ".";
|
||||||
for (Json::Value::Members::iterator it = members.begin();
|
for (auto name : members) {
|
||||||
it != members.end();
|
|
||||||
++it) {
|
|
||||||
const JSONCPP_STRING name = *it;
|
|
||||||
printValueTree(fout, value[name], path + suffix + name);
|
printValueTree(fout, value[name], path + suffix + name);
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
@@ -137,18 +122,17 @@ printValueTree(FILE* fout, Json::Value& value, const JSONCPP_STRING& path = ".")
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int parseAndSaveValueTree(const JSONCPP_STRING& input,
|
static int parseAndSaveValueTree(const Json::String& input,
|
||||||
const JSONCPP_STRING& actual,
|
const Json::String& actual,
|
||||||
const JSONCPP_STRING& kind,
|
const Json::String& kind,
|
||||||
const Json::Features& features,
|
const Json::Features& features,
|
||||||
bool parseOnly,
|
bool parseOnly,
|
||||||
Json::Value* root)
|
Json::Value* root) {
|
||||||
{
|
|
||||||
Json::Reader reader(features);
|
Json::Reader reader(features);
|
||||||
bool parsingSuccessful = reader.parse(input.data(), input.data() + input.size(), *root);
|
bool parsingSuccessful =
|
||||||
|
reader.parse(input.data(), input.data() + input.size(), *root);
|
||||||
if (!parsingSuccessful) {
|
if (!parsingSuccessful) {
|
||||||
printf("Failed to parse %s file: \n%s\n",
|
printf("Failed to parse %s file: \n%s\n", kind.c_str(),
|
||||||
kind.c_str(),
|
|
||||||
reader.getFormattedErrorMessages().c_str());
|
reader.getFormattedErrorMessages().c_str());
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@@ -163,37 +147,29 @@ static int parseAndSaveValueTree(const JSONCPP_STRING& input,
|
|||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
// static JSONCPP_STRING useFastWriter(Json::Value const& root) {
|
// static Json::String useFastWriter(Json::Value const& root) {
|
||||||
// Json::FastWriter writer;
|
// Json::FastWriter writer;
|
||||||
// writer.enableYAMLCompatibility();
|
// writer.enableYAMLCompatibility();
|
||||||
// return writer.write(root);
|
// return writer.write(root);
|
||||||
// }
|
// }
|
||||||
static JSONCPP_STRING useStyledWriter(
|
static Json::String useStyledWriter(Json::Value const& root) {
|
||||||
Json::Value const& root)
|
|
||||||
{
|
|
||||||
Json::StyledWriter writer;
|
Json::StyledWriter writer;
|
||||||
return writer.write(root);
|
return writer.write(root);
|
||||||
}
|
}
|
||||||
static JSONCPP_STRING useStyledStreamWriter(
|
static Json::String useStyledStreamWriter(Json::Value const& root) {
|
||||||
Json::Value const& root)
|
|
||||||
{
|
|
||||||
Json::StyledStreamWriter writer;
|
Json::StyledStreamWriter writer;
|
||||||
JSONCPP_OSTRINGSTREAM sout;
|
Json::OStringStream sout;
|
||||||
writer.write(sout, root);
|
writer.write(sout, root);
|
||||||
return sout.str();
|
return sout.str();
|
||||||
}
|
}
|
||||||
static JSONCPP_STRING useBuiltStyledStreamWriter(
|
static Json::String useBuiltStyledStreamWriter(Json::Value const& root) {
|
||||||
Json::Value const& root)
|
|
||||||
{
|
|
||||||
Json::StreamWriterBuilder builder;
|
Json::StreamWriterBuilder builder;
|
||||||
return Json::writeString(builder, root);
|
return Json::writeString(builder, root);
|
||||||
}
|
}
|
||||||
static int rewriteValueTree(
|
static int rewriteValueTree(const Json::String& rewritePath,
|
||||||
const JSONCPP_STRING& rewritePath,
|
const Json::Value& root,
|
||||||
const Json::Value& root,
|
Options::writeFuncType write,
|
||||||
Options::writeFuncType write,
|
Json::String* rewrite) {
|
||||||
JSONCPP_STRING* rewrite)
|
|
||||||
{
|
|
||||||
*rewrite = write(root);
|
*rewrite = write(root);
|
||||||
FILE* fout = fopen(rewritePath.c_str(), "wt");
|
FILE* fout = fopen(rewritePath.c_str(), "wt");
|
||||||
if (!fout) {
|
if (!fout) {
|
||||||
@@ -205,13 +181,13 @@ static int rewriteValueTree(
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static JSONCPP_STRING removeSuffix(const JSONCPP_STRING& path,
|
static Json::String removeSuffix(const Json::String& path,
|
||||||
const JSONCPP_STRING& extension) {
|
const Json::String& extension) {
|
||||||
if (extension.length() >= path.length())
|
if (extension.length() >= path.length())
|
||||||
return JSONCPP_STRING("");
|
return Json::String("");
|
||||||
JSONCPP_STRING suffix = path.substr(path.length() - extension.length());
|
Json::String suffix = path.substr(path.length() - extension.length());
|
||||||
if (suffix != extension)
|
if (suffix != extension)
|
||||||
return JSONCPP_STRING("");
|
return Json::String("");
|
||||||
return path.substr(0, path.length() - extension.length());
|
return path.substr(0, path.length() - extension.length());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -229,27 +205,25 @@ static int printUsage(const char* argv[]) {
|
|||||||
return 3;
|
return 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int parseCommandLine(
|
static int parseCommandLine(int argc, const char* argv[], Options* opts) {
|
||||||
int argc, const char* argv[], Options* opts)
|
|
||||||
{
|
|
||||||
opts->parseOnly = false;
|
opts->parseOnly = false;
|
||||||
opts->write = &useStyledWriter;
|
opts->write = &useStyledWriter;
|
||||||
if (argc < 2) {
|
if (argc < 2) {
|
||||||
return printUsage(argv);
|
return printUsage(argv);
|
||||||
}
|
}
|
||||||
int index = 1;
|
int index = 1;
|
||||||
if (JSONCPP_STRING(argv[index]) == "--json-checker") {
|
if (Json::String(argv[index]) == "--json-checker") {
|
||||||
opts->features = Json::Features::strictMode();
|
opts->features = Json::Features::strictMode();
|
||||||
opts->parseOnly = true;
|
opts->parseOnly = true;
|
||||||
++index;
|
++index;
|
||||||
}
|
}
|
||||||
if (JSONCPP_STRING(argv[index]) == "--json-config") {
|
if (Json::String(argv[index]) == "--json-config") {
|
||||||
printConfig();
|
printConfig();
|
||||||
return 3;
|
return 3;
|
||||||
}
|
}
|
||||||
if (JSONCPP_STRING(argv[index]) == "--json-writer") {
|
if (Json::String(argv[index]) == "--json-writer") {
|
||||||
++index;
|
++index;
|
||||||
JSONCPP_STRING const writerName(argv[index++]);
|
Json::String const writerName(argv[index++]);
|
||||||
if (writerName == "StyledWriter") {
|
if (writerName == "StyledWriter") {
|
||||||
opts->write = &useStyledWriter;
|
opts->write = &useStyledWriter;
|
||||||
} else if (writerName == "StyledStreamWriter") {
|
} else if (writerName == "StyledStreamWriter") {
|
||||||
@@ -267,43 +241,40 @@ static int parseCommandLine(
|
|||||||
opts->path = argv[index];
|
opts->path = argv[index];
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
static int runTest(Options const& opts)
|
static int runTest(Options const& opts) {
|
||||||
{
|
|
||||||
int exitCode = 0;
|
int exitCode = 0;
|
||||||
|
|
||||||
JSONCPP_STRING input = readInputTestFile(opts.path.c_str());
|
Json::String input = readInputTestFile(opts.path.c_str());
|
||||||
if (input.empty()) {
|
if (input.empty()) {
|
||||||
printf("Failed to read input or empty input: %s\n", opts.path.c_str());
|
printf("Failed to read input or empty input: %s\n", opts.path.c_str());
|
||||||
return 3;
|
return 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
JSONCPP_STRING basePath = removeSuffix(opts.path, ".json");
|
Json::String basePath = removeSuffix(opts.path, ".json");
|
||||||
if (!opts.parseOnly && basePath.empty()) {
|
if (!opts.parseOnly && basePath.empty()) {
|
||||||
printf("Bad input path. Path does not end with '.expected':\n%s\n",
|
printf("Bad input path. Path does not end with '.expected':\n%s\n",
|
||||||
opts.path.c_str());
|
opts.path.c_str());
|
||||||
return 3;
|
return 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
JSONCPP_STRING const actualPath = basePath + ".actual";
|
Json::String const actualPath = basePath + ".actual";
|
||||||
JSONCPP_STRING const rewritePath = basePath + ".rewrite";
|
Json::String const rewritePath = basePath + ".rewrite";
|
||||||
JSONCPP_STRING const rewriteActualPath = basePath + ".actual-rewrite";
|
Json::String const rewriteActualPath = basePath + ".actual-rewrite";
|
||||||
|
|
||||||
Json::Value root;
|
Json::Value root;
|
||||||
exitCode = parseAndSaveValueTree(
|
exitCode = parseAndSaveValueTree(input, actualPath, "input", opts.features,
|
||||||
input, actualPath, "input",
|
opts.parseOnly, &root);
|
||||||
opts.features, opts.parseOnly, &root);
|
|
||||||
if (exitCode || opts.parseOnly) {
|
if (exitCode || opts.parseOnly) {
|
||||||
return exitCode;
|
return exitCode;
|
||||||
}
|
}
|
||||||
JSONCPP_STRING rewrite;
|
Json::String rewrite;
|
||||||
exitCode = rewriteValueTree(rewritePath, root, opts.write, &rewrite);
|
exitCode = rewriteValueTree(rewritePath, root, opts.write, &rewrite);
|
||||||
if (exitCode) {
|
if (exitCode) {
|
||||||
return exitCode;
|
return exitCode;
|
||||||
}
|
}
|
||||||
Json::Value rewriteRoot;
|
Json::Value rewriteRoot;
|
||||||
exitCode = parseAndSaveValueTree(
|
exitCode = parseAndSaveValueTree(rewrite, rewriteActualPath, "rewrite",
|
||||||
rewrite, rewriteActualPath, "rewrite",
|
opts.features, opts.parseOnly, &rewriteRoot);
|
||||||
opts.features, opts.parseOnly, &rewriteRoot);
|
|
||||||
if (exitCode) {
|
if (exitCode) {
|
||||||
return exitCode;
|
return exitCode;
|
||||||
}
|
}
|
||||||
@@ -312,15 +283,18 @@ static int runTest(Options const& opts)
|
|||||||
int main(int argc, const char* argv[]) {
|
int main(int argc, const char* argv[]) {
|
||||||
Options opts;
|
Options opts;
|
||||||
try {
|
try {
|
||||||
int exitCode = parseCommandLine(argc, argv, &opts);
|
int exitCode = parseCommandLine(argc, argv, &opts);
|
||||||
if (exitCode != 0) {
|
if (exitCode != 0) {
|
||||||
printf("Failed to parse command-line.");
|
printf("Failed to parse command-line.");
|
||||||
return exitCode;
|
return exitCode;
|
||||||
}
|
}
|
||||||
return runTest(opts);
|
return runTest(opts);
|
||||||
}
|
} catch (const std::exception& e) {
|
||||||
catch (const std::exception& e) {
|
|
||||||
printf("Unhandled exception:\n%s\n", e.what());
|
printf("Unhandled exception:\n%s\n", e.what());
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(__GNUC__)
|
||||||
|
#pragma GCC diagnostic pop
|
||||||
|
#endif
|
||||||
|
@@ -1,9 +0,0 @@
|
|||||||
Import( 'env_testing buildJSONTests' )
|
|
||||||
|
|
||||||
buildJSONTests( env_testing, Split( """
|
|
||||||
main.cpp
|
|
||||||
""" ),
|
|
||||||
'jsontestrunner' )
|
|
||||||
|
|
||||||
# For 'check' to work, 'libs' must be built first.
|
|
||||||
env_testing.Depends('jsontestrunner', '#libs')
|
|
@@ -1,17 +1,45 @@
|
|||||||
if( CMAKE_COMPILER_IS_GNUCXX )
|
if( CMAKE_COMPILER_IS_GNUCXX )
|
||||||
#Get compiler version.
|
#Get compiler version.
|
||||||
execute_process( COMMAND ${CMAKE_CXX_COMPILER} -dumpversion
|
execute_process( COMMAND ${CMAKE_CXX_COMPILER} -dumpversion
|
||||||
OUTPUT_VARIABLE GNUCXX_VERSION )
|
OUTPUT_VARIABLE GNUCXX_VERSION )
|
||||||
|
|
||||||
#-Werror=* was introduced -after- GCC 4.1.2
|
#-Werror=* was introduced -after- GCC 4.1.2
|
||||||
if( GNUCXX_VERSION VERSION_GREATER 4.1.2 )
|
if( GNUCXX_VERSION VERSION_GREATER 4.1.2 )
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror=strict-aliasing")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror=strict-aliasing")
|
||||||
endif()
|
endif()
|
||||||
endif( CMAKE_COMPILER_IS_GNUCXX )
|
endif( CMAKE_COMPILER_IS_GNUCXX )
|
||||||
|
|
||||||
SET( JSONCPP_INCLUDE_DIR ../../include )
|
include(CheckIncludeFileCXX)
|
||||||
|
include(CheckTypeSize)
|
||||||
|
include(CheckStructHasMember)
|
||||||
|
include(CheckCXXSymbolExists)
|
||||||
|
|
||||||
SET( PUBLIC_HEADERS
|
check_include_file_cxx(clocale HAVE_CLOCALE)
|
||||||
|
check_cxx_symbol_exists(localeconv clocale HAVE_LOCALECONV)
|
||||||
|
|
||||||
|
if(CMAKE_VERSION VERSION_LESS 3.0.0)
|
||||||
|
# The "LANGUAGE CXX" parameter is not supported in CMake versions below 3,
|
||||||
|
# so the C compiler and header has to be used.
|
||||||
|
check_include_file(locale.h HAVE_LOCALE_H)
|
||||||
|
set(CMAKE_EXTRA_INCLUDE_FILES locale.h)
|
||||||
|
check_type_size("struct lconv" LCONV_SIZE)
|
||||||
|
unset(CMAKE_EXTRA_INCLUDE_FILES)
|
||||||
|
check_struct_has_member("struct lconv" decimal_point locale.h HAVE_DECIMAL_POINT)
|
||||||
|
else()
|
||||||
|
set(CMAKE_EXTRA_INCLUDE_FILES clocale)
|
||||||
|
check_type_size(lconv LCONV_SIZE LANGUAGE CXX)
|
||||||
|
unset(CMAKE_EXTRA_INCLUDE_FILES)
|
||||||
|
check_struct_has_member(lconv decimal_point clocale HAVE_DECIMAL_POINT LANGUAGE CXX)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(NOT (HAVE_CLOCALE AND HAVE_LCONV_SIZE AND HAVE_DECIMAL_POINT AND HAVE_LOCALECONV))
|
||||||
|
message(WARNING "Locale functionality is not supported")
|
||||||
|
add_compile_definitions(JSONCPP_NO_LOCALE_SUPPORT)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set( JSONCPP_INCLUDE_DIR ../../include )
|
||||||
|
|
||||||
|
set( PUBLIC_HEADERS
|
||||||
${JSONCPP_INCLUDE_DIR}/json/config.h
|
${JSONCPP_INCLUDE_DIR}/json/config.h
|
||||||
${JSONCPP_INCLUDE_DIR}/json/forwards.h
|
${JSONCPP_INCLUDE_DIR}/json/forwards.h
|
||||||
${JSONCPP_INCLUDE_DIR}/json/features.h
|
${JSONCPP_INCLUDE_DIR}/json/features.h
|
||||||
@@ -19,12 +47,12 @@ SET( PUBLIC_HEADERS
|
|||||||
${JSONCPP_INCLUDE_DIR}/json/reader.h
|
${JSONCPP_INCLUDE_DIR}/json/reader.h
|
||||||
${JSONCPP_INCLUDE_DIR}/json/writer.h
|
${JSONCPP_INCLUDE_DIR}/json/writer.h
|
||||||
${JSONCPP_INCLUDE_DIR}/json/assertions.h
|
${JSONCPP_INCLUDE_DIR}/json/assertions.h
|
||||||
${JSONCPP_INCLUDE_DIR}/json/version.h
|
${PROJECT_BINARY_DIR}/include/json/version.h
|
||||||
)
|
)
|
||||||
|
|
||||||
SOURCE_GROUP( "Public API" FILES ${PUBLIC_HEADERS} )
|
source_group( "Public API" FILES ${PUBLIC_HEADERS} )
|
||||||
|
|
||||||
SET(jsoncpp_sources
|
set(jsoncpp_sources
|
||||||
json_tool.h
|
json_tool.h
|
||||||
json_reader.cpp
|
json_reader.cpp
|
||||||
json_valueiterator.inl
|
json_valueiterator.inl
|
||||||
@@ -33,48 +61,86 @@ SET(jsoncpp_sources
|
|||||||
version.h.in)
|
version.h.in)
|
||||||
|
|
||||||
# Install instructions for this target
|
# Install instructions for this target
|
||||||
IF(JSONCPP_WITH_CMAKE_PACKAGE)
|
if(JSONCPP_WITH_CMAKE_PACKAGE)
|
||||||
SET(INSTALL_EXPORT EXPORT jsoncpp)
|
set(INSTALL_EXPORT EXPORT jsoncpp)
|
||||||
ELSE(JSONCPP_WITH_CMAKE_PACKAGE)
|
else(JSONCPP_WITH_CMAKE_PACKAGE)
|
||||||
SET(INSTALL_EXPORT)
|
set(INSTALL_EXPORT)
|
||||||
ENDIF()
|
endif()
|
||||||
|
|
||||||
IF(BUILD_SHARED_LIBS)
|
if(BUILD_SHARED_LIBS)
|
||||||
ADD_DEFINITIONS( -DJSON_DLL_BUILD )
|
add_compile_definitions( JSON_DLL_BUILD )
|
||||||
ADD_LIBRARY(jsoncpp_lib SHARED ${PUBLIC_HEADERS} ${jsoncpp_sources})
|
endif()
|
||||||
SET_TARGET_PROPERTIES( jsoncpp_lib PROPERTIES VERSION ${JSONCPP_VERSION} SOVERSION ${JSONCPP_VERSION_MAJOR})
|
|
||||||
SET_TARGET_PROPERTIES( jsoncpp_lib PROPERTIES OUTPUT_NAME jsoncpp
|
|
||||||
DEBUG_OUTPUT_NAME jsoncpp${DEBUG_LIBNAME_SUFFIX} )
|
|
||||||
|
|
||||||
INSTALL( TARGETS jsoncpp_lib ${INSTALL_EXPORT}
|
|
||||||
RUNTIME DESTINATION ${RUNTIME_INSTALL_DIR}
|
|
||||||
LIBRARY DESTINATION ${LIBRARY_INSTALL_DIR}
|
|
||||||
ARCHIVE DESTINATION ${ARCHIVE_INSTALL_DIR})
|
|
||||||
|
|
||||||
IF(NOT CMAKE_VERSION VERSION_LESS 2.8.11)
|
add_library(jsoncpp_lib ${PUBLIC_HEADERS} ${jsoncpp_sources})
|
||||||
TARGET_INCLUDE_DIRECTORIES( jsoncpp_lib PUBLIC
|
set_target_properties( jsoncpp_lib PROPERTIES VERSION ${JSONCPP_VERSION} SOVERSION ${JSONCPP_SOVERSION})
|
||||||
$<INSTALL_INTERFACE:${INCLUDE_INSTALL_DIR}>
|
set_target_properties( jsoncpp_lib PROPERTIES OUTPUT_NAME jsoncpp
|
||||||
$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/${JSONCPP_INCLUDE_DIR}>)
|
DEBUG_OUTPUT_NAME jsoncpp${DEBUG_LIBNAME_SUFFIX} )
|
||||||
ENDIF()
|
set_target_properties( jsoncpp_lib PROPERTIES POSITION_INDEPENDENT_CODE ON)
|
||||||
|
|
||||||
ENDIF()
|
# Set library's runtime search path on OSX
|
||||||
|
if(APPLE)
|
||||||
|
set_target_properties( jsoncpp_lib PROPERTIES INSTALL_RPATH "@loader_path/." )
|
||||||
|
endif()
|
||||||
|
|
||||||
IF(BUILD_STATIC_LIBS)
|
# Specify compiler features required when compiling a given target.
|
||||||
ADD_LIBRARY(jsoncpp_lib_static STATIC ${PUBLIC_HEADERS} ${jsoncpp_sources})
|
# See https://cmake.org/cmake/help/v3.1/prop_gbl/CMAKE_CXX_KNOWN_FEATURES.html#prop_gbl:CMAKE_CXX_KNOWN_FEATURES
|
||||||
SET_TARGET_PROPERTIES( jsoncpp_lib_static PROPERTIES VERSION ${JSONCPP_VERSION} SOVERSION ${JSONCPP_VERSION_MAJOR})
|
# for complete list of features available
|
||||||
SET_TARGET_PROPERTIES( jsoncpp_lib_static PROPERTIES OUTPUT_NAME jsoncpp
|
target_compile_features(jsoncpp_lib PUBLIC
|
||||||
DEBUG_OUTPUT_NAME jsoncpp${DEBUG_LIBNAME_SUFFIX} )
|
cxx_std_11 # Compiler mode is aware of C++ 11.
|
||||||
|
#MSVC 1900 cxx_alignas # Alignment control alignas, as defined in N2341.
|
||||||
|
#MSVC 1900 cxx_alignof # Alignment control alignof, as defined in N2341.
|
||||||
|
#MSVC 1900 cxx_attributes # Generic attributes, as defined in N2761.
|
||||||
|
cxx_auto_type # Automatic type deduction, as defined in N1984.
|
||||||
|
#MSVC 1900 cxx_constexpr # Constant expressions, as defined in N2235.
|
||||||
|
cxx_decltype # Decltype, as defined in N2343.
|
||||||
|
cxx_default_function_template_args # Default template arguments for function templates, as defined in DR226
|
||||||
|
cxx_defaulted_functions # Defaulted functions, as defined in N2346.
|
||||||
|
#MSVC 1900 cxx_defaulted_move_initializers # Defaulted move initializers, as defined in N3053.
|
||||||
|
cxx_delegating_constructors # Delegating constructors, as defined in N1986.
|
||||||
|
#MSVC 1900 cxx_deleted_functions # Deleted functions, as defined in N2346.
|
||||||
|
cxx_enum_forward_declarations # Enum forward declarations, as defined in N2764.
|
||||||
|
cxx_explicit_conversions # Explicit conversion operators, as defined in N2437.
|
||||||
|
cxx_extended_friend_declarations # Extended friend declarations, as defined in N1791.
|
||||||
|
cxx_extern_templates # Extern templates, as defined in N1987.
|
||||||
|
cxx_final # Override control final keyword, as defined in N2928, N3206 and N3272.
|
||||||
|
#MSVC 1900 cxx_func_identifier # Predefined __func__ identifier, as defined in N2340.
|
||||||
|
#MSVC 1900 cxx_generalized_initializers # Initializer lists, as defined in N2672.
|
||||||
|
#MSVC 1900 cxx_inheriting_constructors # Inheriting constructors, as defined in N2540.
|
||||||
|
#MSVC 1900 cxx_inline_namespaces # Inline namespaces, as defined in N2535.
|
||||||
|
cxx_lambdas # Lambda functions, as defined in N2927.
|
||||||
|
#MSVC 1900 cxx_local_type_template_args # Local and unnamed types as template arguments, as defined in N2657.
|
||||||
|
cxx_long_long_type # long long type, as defined in N1811.
|
||||||
|
#MSVC 1900 cxx_noexcept # Exception specifications, as defined in N3050.
|
||||||
|
#MSVC 1900 cxx_nonstatic_member_init # Non-static data member initialization, as defined in N2756.
|
||||||
|
cxx_nullptr # Null pointer, as defined in N2431.
|
||||||
|
cxx_override # Override control override keyword, as defined in N2928, N3206 and N3272.
|
||||||
|
cxx_range_for # Range-based for, as defined in N2930.
|
||||||
|
cxx_raw_string_literals # Raw string literals, as defined in N2442.
|
||||||
|
#MSVC 1900 cxx_reference_qualified_functions # Reference qualified functions, as defined in N2439.
|
||||||
|
cxx_right_angle_brackets # Right angle bracket parsing, as defined in N1757.
|
||||||
|
cxx_rvalue_references # R-value references, as defined in N2118.
|
||||||
|
#MSVC 1900 cxx_sizeof_member # Size of non-static data members, as defined in N2253.
|
||||||
|
cxx_static_assert # Static assert, as defined in N1720.
|
||||||
|
cxx_strong_enums # Strongly typed enums, as defined in N2347.
|
||||||
|
#MSVC 1900 cxx_thread_local # Thread-local variables, as defined in N2659.
|
||||||
|
cxx_trailing_return_types # Automatic function return type, as defined in N2541.
|
||||||
|
#MSVC 1900 cxx_unicode_literals # Unicode string literals, as defined in N2442.
|
||||||
|
cxx_uniform_initialization # Uniform initialization, as defined in N2640.
|
||||||
|
#MSVC 1900 cxx_unrestricted_unions # Unrestricted unions, as defined in N2544.
|
||||||
|
#MSVC 1900 cxx_user_literals # User-defined literals, as defined in N2765.
|
||||||
|
cxx_variadic_macros # Variadic macros, as defined in N1653.
|
||||||
|
cxx_variadic_templates # Variadic templates, as defined in N2242.
|
||||||
|
)
|
||||||
|
|
||||||
INSTALL( TARGETS jsoncpp_lib_static ${INSTALL_EXPORT}
|
install( TARGETS jsoncpp_lib ${INSTALL_EXPORT}
|
||||||
RUNTIME DESTINATION ${RUNTIME_INSTALL_DIR}
|
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
||||||
LIBRARY DESTINATION ${LIBRARY_INSTALL_DIR}
|
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||||
ARCHIVE DESTINATION ${ARCHIVE_INSTALL_DIR})
|
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
||||||
|
|
||||||
IF(NOT CMAKE_VERSION VERSION_LESS 2.8.11)
|
if(NOT CMAKE_VERSION VERSION_LESS 2.8.11)
|
||||||
TARGET_INCLUDE_DIRECTORIES( jsoncpp_lib_static PUBLIC
|
target_include_directories( jsoncpp_lib PUBLIC
|
||||||
$<INSTALL_INTERFACE:${INCLUDE_INSTALL_DIR}>
|
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
|
||||||
$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/${JSONCPP_INCLUDE_DIR}>
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/${JSONCPP_INCLUDE_DIR}>
|
||||||
)
|
$<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/include/json>)
|
||||||
ENDIF()
|
endif()
|
||||||
|
|
||||||
ENDIF()
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
@@ -1,11 +1,23 @@
|
|||||||
// Copyright 2007-2010 Baptiste Lepilleur
|
// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors
|
||||||
// Distributed under MIT license, or public domain if desired and
|
// Distributed under MIT license, or public domain if desired and
|
||||||
// recognized in your jurisdiction.
|
// recognized in your jurisdiction.
|
||||||
// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
||||||
|
|
||||||
#ifndef LIB_JSONCPP_JSON_TOOL_H_INCLUDED
|
#ifndef LIB_JSONCPP_JSON_TOOL_H_INCLUDED
|
||||||
#define LIB_JSONCPP_JSON_TOOL_H_INCLUDED
|
#define LIB_JSONCPP_JSON_TOOL_H_INCLUDED
|
||||||
|
|
||||||
|
#if !defined(JSON_IS_AMALGAMATION)
|
||||||
|
#include <json/config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Also support old flag NO_LOCALE_SUPPORT
|
||||||
|
#ifdef NO_LOCALE_SUPPORT
|
||||||
|
#define JSONCPP_NO_LOCALE_SUPPORT
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef JSONCPP_NO_LOCALE_SUPPORT
|
||||||
#include <clocale>
|
#include <clocale>
|
||||||
|
#endif
|
||||||
|
|
||||||
/* This header provides common string manipulation support, such as UTF-8,
|
/* This header provides common string manipulation support, such as UTF-8,
|
||||||
* portable conversion from/to string...
|
* portable conversion from/to string...
|
||||||
@@ -14,30 +26,18 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Json {
|
namespace Json {
|
||||||
|
static inline char getDecimalPoint() {
|
||||||
/// Fallback for decimal_point on android, where the lconv is an empty struct.
|
#ifdef JSONCPP_NO_LOCALE_SUPPORT
|
||||||
template<typename Lconv, bool=(sizeof(Lconv) >= sizeof(char*))>
|
return '\0';
|
||||||
struct Locale {
|
#else
|
||||||
static char decimalPoint() {
|
struct lconv* lc = localeconv();
|
||||||
return '\0';
|
return lc ? *(lc->decimal_point) : '\0';
|
||||||
}
|
#endif
|
||||||
};
|
}
|
||||||
|
|
||||||
/// Return decimal_point for the current locale.
|
|
||||||
template<typename Lconv>
|
|
||||||
struct Locale<Lconv, true> {
|
|
||||||
static char decimalPoint() {
|
|
||||||
Lconv* lc = localeconv();
|
|
||||||
if (lc == NULL) {
|
|
||||||
return '\0';
|
|
||||||
}
|
|
||||||
return *(lc->decimal_point);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/// Converts a unicode code-point to UTF-8.
|
/// Converts a unicode code-point to UTF-8.
|
||||||
static inline JSONCPP_STRING codePointToUTF8(unsigned int cp) {
|
static inline String codePointToUTF8(unsigned int cp) {
|
||||||
JSONCPP_STRING result;
|
String result;
|
||||||
|
|
||||||
// based on description from http://en.wikipedia.org/wiki/UTF-8
|
// based on description from http://en.wikipedia.org/wiki/UTF-8
|
||||||
|
|
||||||
@@ -64,9 +64,6 @@ static inline JSONCPP_STRING codePointToUTF8(unsigned int cp) {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns true if ch is a control character (in range [1,31]).
|
|
||||||
static inline bool isControlCharacter(char ch) { return ch > 0 && ch <= 0x1F; }
|
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
/// Constant that specify the size of the buffer that must be passed to
|
/// Constant that specify the size of the buffer that must be passed to
|
||||||
/// uintToString.
|
/// uintToString.
|
||||||
@@ -77,7 +74,7 @@ enum {
|
|||||||
typedef char UIntToStringBuffer[uintToStringBufferSize];
|
typedef char UIntToStringBuffer[uintToStringBufferSize];
|
||||||
|
|
||||||
/** Converts an unsigned integer to string.
|
/** Converts an unsigned integer to string.
|
||||||
* @param value Unsigned interger to convert to string
|
* @param value Unsigned integer to convert to string
|
||||||
* @param current Input/Output string buffer.
|
* @param current Input/Output string buffer.
|
||||||
* Must have at least uintToStringBufferSize chars free.
|
* Must have at least uintToStringBufferSize chars free.
|
||||||
*/
|
*/
|
||||||
@@ -94,27 +91,44 @@ static inline void uintToString(LargestUInt value, char*& current) {
|
|||||||
* We had a sophisticated way, but it did not work in WinCE.
|
* We had a sophisticated way, but it did not work in WinCE.
|
||||||
* @see https://github.com/open-source-parsers/jsoncpp/pull/9
|
* @see https://github.com/open-source-parsers/jsoncpp/pull/9
|
||||||
*/
|
*/
|
||||||
static inline void fixNumericLocale(char* begin, char* end) {
|
template <typename Iter> Iter fixNumericLocale(Iter begin, Iter end) {
|
||||||
while (begin < end) {
|
for (; begin != end; ++begin) {
|
||||||
if (*begin == ',') {
|
if (*begin == ',') {
|
||||||
*begin = '.';
|
*begin = '.';
|
||||||
}
|
}
|
||||||
++begin;
|
|
||||||
}
|
}
|
||||||
|
return begin;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void fixNumericLocaleInput(char* begin, char* end) {
|
template <typename Iter> void fixNumericLocaleInput(Iter begin, Iter end) {
|
||||||
char decimalPoint = Locale<struct lconv>::decimalPoint();
|
char decimalPoint = getDecimalPoint();
|
||||||
if (decimalPoint != '\0' && decimalPoint != '.') {
|
if (decimalPoint == '\0' || decimalPoint == '.') {
|
||||||
while (begin < end) {
|
return;
|
||||||
if (*begin == '.') {
|
}
|
||||||
*begin = decimalPoint;
|
for (; begin != end; ++begin) {
|
||||||
}
|
if (*begin == '.') {
|
||||||
++begin;
|
*begin = decimalPoint;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace Json {
|
/**
|
||||||
|
* Return iterator that would be the new end of the range [begin,end), if we
|
||||||
|
* were to delete zeros in the end of string, but not the last zero before '.'.
|
||||||
|
*/
|
||||||
|
template <typename Iter> Iter fixZerosInTheEnd(Iter begin, Iter end) {
|
||||||
|
for (; begin != end; --end) {
|
||||||
|
if (*(end - 1) != '0') {
|
||||||
|
return end;
|
||||||
|
}
|
||||||
|
// Don't delete the last zero before the decimal point.
|
||||||
|
if (begin != (end - 1) && *(end - 2) == '.') {
|
||||||
|
return end;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return end;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace Json
|
||||||
|
|
||||||
#endif // LIB_JSONCPP_JSON_TOOL_H_INCLUDED
|
#endif // LIB_JSONCPP_JSON_TOOL_H_INCLUDED
|
||||||
|
File diff suppressed because it is too large
Load Diff
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2007-2010 Baptiste Lepilleur
|
// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors
|
||||||
// Distributed under MIT license, or public domain if desired and
|
// Distributed under MIT license, or public domain if desired and
|
||||||
// recognized in your jurisdiction.
|
// recognized in your jurisdiction.
|
||||||
// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
||||||
@@ -15,25 +15,17 @@ namespace Json {
|
|||||||
// //////////////////////////////////////////////////////////////////
|
// //////////////////////////////////////////////////////////////////
|
||||||
// //////////////////////////////////////////////////////////////////
|
// //////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
ValueIteratorBase::ValueIteratorBase()
|
ValueIteratorBase::ValueIteratorBase() : current_() {}
|
||||||
: current_(), isNull_(true) {
|
|
||||||
}
|
|
||||||
|
|
||||||
ValueIteratorBase::ValueIteratorBase(
|
ValueIteratorBase::ValueIteratorBase(
|
||||||
const Value::ObjectValues::iterator& current)
|
const Value::ObjectValues::iterator& current)
|
||||||
: current_(current), isNull_(false) {}
|
: current_(current), isNull_(false) {}
|
||||||
|
|
||||||
Value& ValueIteratorBase::deref() const {
|
Value& ValueIteratorBase::deref() const { return current_->second; }
|
||||||
return current_->second;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ValueIteratorBase::increment() {
|
void ValueIteratorBase::increment() { ++current_; }
|
||||||
++current_;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ValueIteratorBase::decrement() {
|
void ValueIteratorBase::decrement() { --current_; }
|
||||||
--current_;
|
|
||||||
}
|
|
||||||
|
|
||||||
ValueIteratorBase::difference_type
|
ValueIteratorBase::difference_type
|
||||||
ValueIteratorBase::computeDistance(const SelfType& other) const {
|
ValueIteratorBase::computeDistance(const SelfType& other) const {
|
||||||
@@ -92,12 +84,13 @@ UInt ValueIteratorBase::index() const {
|
|||||||
return Value::UInt(-1);
|
return Value::UInt(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
JSONCPP_STRING ValueIteratorBase::name() const {
|
String ValueIteratorBase::name() const {
|
||||||
char const* keey;
|
char const* keey;
|
||||||
char const* end;
|
char const* end;
|
||||||
keey = memberName(&end);
|
keey = memberName(&end);
|
||||||
if (!keey) return JSONCPP_STRING();
|
if (!keey)
|
||||||
return JSONCPP_STRING(keey, end);
|
return String();
|
||||||
|
return String(keey, end);
|
||||||
}
|
}
|
||||||
|
|
||||||
char const* ValueIteratorBase::memberName() const {
|
char const* ValueIteratorBase::memberName() const {
|
||||||
@@ -108,8 +101,8 @@ char const* ValueIteratorBase::memberName() const {
|
|||||||
char const* ValueIteratorBase::memberName(char const** end) const {
|
char const* ValueIteratorBase::memberName(char const** end) const {
|
||||||
const char* cname = (*current_).first.data();
|
const char* cname = (*current_).first.data();
|
||||||
if (!cname) {
|
if (!cname) {
|
||||||
*end = NULL;
|
*end = nullptr;
|
||||||
return NULL;
|
return nullptr;
|
||||||
}
|
}
|
||||||
*end = cname + (*current_).first.length();
|
*end = cname + (*current_).first.length();
|
||||||
return cname;
|
return cname;
|
||||||
@@ -123,7 +116,7 @@ char const* ValueIteratorBase::memberName(char const** end) const {
|
|||||||
// //////////////////////////////////////////////////////////////////
|
// //////////////////////////////////////////////////////////////////
|
||||||
// //////////////////////////////////////////////////////////////////
|
// //////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
ValueConstIterator::ValueConstIterator() {}
|
ValueConstIterator::ValueConstIterator() = default;
|
||||||
|
|
||||||
ValueConstIterator::ValueConstIterator(
|
ValueConstIterator::ValueConstIterator(
|
||||||
const Value::ObjectValues::iterator& current)
|
const Value::ObjectValues::iterator& current)
|
||||||
@@ -146,7 +139,7 @@ operator=(const ValueIteratorBase& other) {
|
|||||||
// //////////////////////////////////////////////////////////////////
|
// //////////////////////////////////////////////////////////////////
|
||||||
// //////////////////////////////////////////////////////////////////
|
// //////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
ValueIterator::ValueIterator() {}
|
ValueIterator::ValueIterator() = default;
|
||||||
|
|
||||||
ValueIterator::ValueIterator(const Value::ObjectValues::iterator& current)
|
ValueIterator::ValueIterator(const Value::ObjectValues::iterator& current)
|
||||||
: ValueIteratorBase(current) {}
|
: ValueIteratorBase(current) {}
|
||||||
@@ -156,8 +149,7 @@ ValueIterator::ValueIterator(const ValueConstIterator& other)
|
|||||||
throwRuntimeError("ConstIterator to Iterator should never be allowed.");
|
throwRuntimeError("ConstIterator to Iterator should never be allowed.");
|
||||||
}
|
}
|
||||||
|
|
||||||
ValueIterator::ValueIterator(const ValueIterator& other)
|
ValueIterator::ValueIterator(const ValueIterator& other) = default;
|
||||||
: ValueIteratorBase(other) {}
|
|
||||||
|
|
||||||
ValueIterator& ValueIterator::operator=(const SelfType& other) {
|
ValueIterator& ValueIterator::operator=(const SelfType& other) {
|
||||||
copy(other);
|
copy(other);
|
||||||
|
File diff suppressed because it is too large
Load Diff
@@ -1,8 +0,0 @@
|
|||||||
Import( 'env buildLibrary' )
|
|
||||||
|
|
||||||
buildLibrary( env, Split( """
|
|
||||||
json_reader.cpp
|
|
||||||
json_value.cpp
|
|
||||||
json_writer.cpp
|
|
||||||
""" ),
|
|
||||||
'json' )
|
|
@@ -1,14 +1,16 @@
|
|||||||
// DO NOT EDIT. This file (and "version") is generated by CMake.
|
// DO NOT EDIT. This file (and "version") is a template used by the build system
|
||||||
// Run CMake configure step to update it.
|
// (either CMake or Meson) to generate a "version.h" header file.
|
||||||
#ifndef JSON_VERSION_H_INCLUDED
|
#ifndef JSON_VERSION_H_INCLUDED
|
||||||
# define JSON_VERSION_H_INCLUDED
|
#define JSON_VERSION_H_INCLUDED
|
||||||
|
|
||||||
# define JSONCPP_VERSION_STRING "@JSONCPP_VERSION@"
|
#define JSONCPP_VERSION_STRING "@JSONCPP_VERSION@"
|
||||||
# define JSONCPP_VERSION_MAJOR @JSONCPP_VERSION_MAJOR@
|
#define JSONCPP_VERSION_MAJOR @JSONCPP_VERSION_MAJOR@
|
||||||
# define JSONCPP_VERSION_MINOR @JSONCPP_VERSION_MINOR@
|
#define JSONCPP_VERSION_MINOR @JSONCPP_VERSION_MINOR@
|
||||||
# define JSONCPP_VERSION_PATCH @JSONCPP_VERSION_PATCH@
|
#define JSONCPP_VERSION_PATCH @JSONCPP_VERSION_PATCH@
|
||||||
# define JSONCPP_VERSION_QUALIFIER
|
#define JSONCPP_VERSION_QUALIFIER
|
||||||
# define JSONCPP_VERSION_HEXA ((JSONCPP_VERSION_MAJOR << 24) | (JSONCPP_VERSION_MINOR << 16) | (JSONCPP_VERSION_PATCH << 8))
|
#define JSONCPP_VERSION_HEXA ((JSONCPP_VERSION_MAJOR << 24) \
|
||||||
|
| (JSONCPP_VERSION_MINOR << 16) \
|
||||||
|
| (JSONCPP_VERSION_PATCH << 8))
|
||||||
|
|
||||||
#ifdef JSONCPP_USING_SECURE_MEMORY
|
#ifdef JSONCPP_USING_SECURE_MEMORY
|
||||||
#undef JSONCPP_USING_SECURE_MEMORY
|
#undef JSONCPP_USING_SECURE_MEMORY
|
||||||
|
@@ -1,38 +1,42 @@
|
|||||||
# vim: et ts=4 sts=4 sw=4 tw=0
|
# vim: et ts=4 sts=4 sw=4 tw=0
|
||||||
|
|
||||||
ADD_EXECUTABLE( jsoncpp_test
|
add_executable( jsoncpp_test
|
||||||
jsontest.cpp
|
jsontest.cpp
|
||||||
jsontest.h
|
jsontest.h
|
||||||
|
fuzz.cpp
|
||||||
|
fuzz.h
|
||||||
main.cpp
|
main.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
IF(BUILD_SHARED_LIBS)
|
if(BUILD_SHARED_LIBS)
|
||||||
ADD_DEFINITIONS( -DJSON_DLL )
|
add_compile_definitions( JSON_DLL )
|
||||||
TARGET_LINK_LIBRARIES(jsoncpp_test jsoncpp_lib)
|
endif()
|
||||||
ELSE(BUILD_SHARED_LIBS)
|
target_link_libraries(jsoncpp_test jsoncpp_lib)
|
||||||
TARGET_LINK_LIBRARIES(jsoncpp_test jsoncpp_lib_static)
|
|
||||||
ENDIF()
|
|
||||||
|
|
||||||
# another way to solve issue #90
|
# another way to solve issue #90
|
||||||
#set_target_properties(jsoncpp_test PROPERTIES COMPILE_FLAGS -ffloat-store)
|
#set_target_properties(jsoncpp_test PROPERTIES COMPILE_FLAGS -ffloat-store)
|
||||||
|
|
||||||
# Run unit tests in post-build
|
# Run unit tests in post-build
|
||||||
# (default cmake workflow hides away the test result into a file, resulting in poor dev workflow?!?)
|
# (default cmake workflow hides away the test result into a file, resulting in poor dev workflow?!?)
|
||||||
IF(JSONCPP_WITH_POST_BUILD_UNITTEST)
|
if(JSONCPP_WITH_POST_BUILD_UNITTEST)
|
||||||
IF(BUILD_SHARED_LIBS)
|
if(BUILD_SHARED_LIBS)
|
||||||
# First, copy the shared lib, for Microsoft.
|
# First, copy the shared lib, for Microsoft.
|
||||||
# Then, run the test executable.
|
# Then, run the test executable.
|
||||||
ADD_CUSTOM_COMMAND( TARGET jsoncpp_test
|
add_custom_command( TARGET jsoncpp_test
|
||||||
POST_BUILD
|
POST_BUILD
|
||||||
COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:jsoncpp_lib> $<TARGET_FILE_DIR:jsoncpp_test>
|
COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:jsoncpp_lib> $<TARGET_FILE_DIR:jsoncpp_test>
|
||||||
COMMAND $<TARGET_FILE:jsoncpp_test>)
|
COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $<TARGET_FILE:jsoncpp_test>)
|
||||||
ELSE(BUILD_SHARED_LIBS)
|
else(BUILD_SHARED_LIBS)
|
||||||
# Just run the test executable.
|
# Just run the test executable.
|
||||||
ADD_CUSTOM_COMMAND( TARGET jsoncpp_test
|
add_custom_command( TARGET jsoncpp_test
|
||||||
POST_BUILD
|
POST_BUILD
|
||||||
COMMAND $<TARGET_FILE:jsoncpp_test>)
|
COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $<TARGET_FILE:jsoncpp_test>)
|
||||||
ENDIF()
|
endif()
|
||||||
ENDIF()
|
## Create tests for dashboard submission, allows easy review of CI results https://my.cdash.org/index.php?project=jsoncpp
|
||||||
|
add_test(NAME jsoncpp_test
|
||||||
|
COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $<TARGET_FILE:jsoncpp_test>
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
SET_TARGET_PROPERTIES(jsoncpp_test PROPERTIES OUTPUT_NAME jsoncpp_test)
|
set_target_properties(jsoncpp_test PROPERTIES OUTPUT_NAME jsoncpp_test)
|
||||||
|
49
src/test_lib_json/fuzz.cpp
Normal file
49
src/test_lib_json/fuzz.cpp
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
// Copyright 2007-2019 The JsonCpp Authors
|
||||||
|
// Distributed under MIT license, or public domain if desired and
|
||||||
|
// recognized in your jurisdiction.
|
||||||
|
// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
||||||
|
|
||||||
|
#include "fuzz.h"
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
#include <json/config.h>
|
||||||
|
#include <json/json.h>
|
||||||
|
#include <memory>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
namespace Json {
|
||||||
|
class Exception;
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
|
||||||
|
Json::CharReaderBuilder builder;
|
||||||
|
|
||||||
|
if (size < sizeof(uint32_t)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t hash_settings = *(const uint32_t*)data;
|
||||||
|
data += sizeof(uint32_t);
|
||||||
|
|
||||||
|
builder.settings_["failIfExtra"] = hash_settings & (1 << 0);
|
||||||
|
builder.settings_["allowComments_"] = hash_settings & (1 << 1);
|
||||||
|
builder.settings_["strictRoot_"] = hash_settings & (1 << 2);
|
||||||
|
builder.settings_["allowDroppedNullPlaceholders_"] = hash_settings & (1 << 3);
|
||||||
|
builder.settings_["allowNumericKeys_"] = hash_settings & (1 << 4);
|
||||||
|
builder.settings_["allowSingleQuotes_"] = hash_settings & (1 << 5);
|
||||||
|
builder.settings_["failIfExtra_"] = hash_settings & (1 << 6);
|
||||||
|
builder.settings_["rejectDupKeys_"] = hash_settings & (1 << 7);
|
||||||
|
builder.settings_["allowSpecialFloats_"] = hash_settings & (1 << 8);
|
||||||
|
|
||||||
|
std::unique_ptr<Json::CharReader> reader(builder.newCharReader());
|
||||||
|
|
||||||
|
Json::Value root;
|
||||||
|
const char* data_str = reinterpret_cast<const char*>(data);
|
||||||
|
try {
|
||||||
|
reader->parse(data_str, data_str + size, &root, nullptr);
|
||||||
|
} catch (Json::Exception const&) {
|
||||||
|
}
|
||||||
|
// Whether it succeeded or not doesn't matter.
|
||||||
|
return 0;
|
||||||
|
}
|
14
src/test_lib_json/fuzz.h
Normal file
14
src/test_lib_json/fuzz.h
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
// Copyright 2007-2010 The JsonCpp Authors
|
||||||
|
// Distributed under MIT license, or public domain if desired and
|
||||||
|
// recognized in your jurisdiction.
|
||||||
|
// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
||||||
|
|
||||||
|
#ifndef FUZZ_H_INCLUDED
|
||||||
|
#define FUZZ_H_INCLUDED
|
||||||
|
|
||||||
|
#include <cstddef>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size);
|
||||||
|
|
||||||
|
#endif // ifndef FUZZ_H_INCLUDED
|
@@ -1,11 +1,11 @@
|
|||||||
// Copyright 2007-2010 Baptiste Lepilleur
|
// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors
|
||||||
// Distributed under MIT license, or public domain if desired and
|
// Distributed under MIT license, or public domain if desired and
|
||||||
// recognized in your jurisdiction.
|
// recognized in your jurisdiction.
|
||||||
// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
||||||
|
|
||||||
#define _CRT_SECURE_NO_WARNINGS 1 // Prevents deprecation warning with MSVC
|
#define _CRT_SECURE_NO_WARNINGS 1 // Prevents deprecation warning with MSVC
|
||||||
#include "jsontest.h"
|
#include "jsontest.h"
|
||||||
#include <stdio.h>
|
#include <cstdio>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
#if defined(_MSC_VER)
|
#if defined(_MSC_VER)
|
||||||
@@ -73,15 +73,14 @@ namespace JsonTest {
|
|||||||
// class TestResult
|
// class TestResult
|
||||||
// //////////////////////////////////////////////////////////////////
|
// //////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
TestResult::TestResult()
|
TestResult::TestResult() {
|
||||||
: predicateId_(1), lastUsedPredicateId_(0), messageTarget_(0) {
|
|
||||||
// The root predicate has id 0
|
// The root predicate has id 0
|
||||||
rootPredicateNode_.id_ = 0;
|
rootPredicateNode_.id_ = 0;
|
||||||
rootPredicateNode_.next_ = 0;
|
rootPredicateNode_.next_ = nullptr;
|
||||||
predicateStackTail_ = &rootPredicateNode_;
|
predicateStackTail_ = &rootPredicateNode_;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TestResult::setTestName(const JSONCPP_STRING& name) { name_ = name; }
|
void TestResult::setTestName(const Json::String& name) { name_ = name; }
|
||||||
|
|
||||||
TestResult&
|
TestResult&
|
||||||
TestResult::addFailure(const char* file, unsigned int line, const char* expr) {
|
TestResult::addFailure(const char* file, unsigned int line, const char* expr) {
|
||||||
@@ -89,12 +88,12 @@ TestResult::addFailure(const char* file, unsigned int line, const char* expr) {
|
|||||||
/// added.
|
/// added.
|
||||||
unsigned int nestingLevel = 0;
|
unsigned int nestingLevel = 0;
|
||||||
PredicateContext* lastNode = rootPredicateNode_.next_;
|
PredicateContext* lastNode = rootPredicateNode_.next_;
|
||||||
for (; lastNode != 0; lastNode = lastNode->next_) {
|
for (; lastNode != nullptr; lastNode = lastNode->next_) {
|
||||||
if (lastNode->id_ > lastUsedPredicateId_) // new PredicateContext
|
if (lastNode->id_ > lastUsedPredicateId_) // new PredicateContext
|
||||||
{
|
{
|
||||||
lastUsedPredicateId_ = lastNode->id_;
|
lastUsedPredicateId_ = lastNode->id_;
|
||||||
addFailureInfo(
|
addFailureInfo(lastNode->file_, lastNode->line_, lastNode->expr_,
|
||||||
lastNode->file_, lastNode->line_, lastNode->expr_, nestingLevel);
|
nestingLevel);
|
||||||
// Link the PredicateContext to the failure for message target when
|
// Link the PredicateContext to the failure for message target when
|
||||||
// popping the PredicateContext.
|
// popping the PredicateContext.
|
||||||
lastNode->failure_ = &(failures_.back());
|
lastNode->failure_ = &(failures_.back());
|
||||||
@@ -124,32 +123,22 @@ void TestResult::addFailureInfo(const char* file,
|
|||||||
|
|
||||||
TestResult& TestResult::popPredicateContext() {
|
TestResult& TestResult::popPredicateContext() {
|
||||||
PredicateContext* lastNode = &rootPredicateNode_;
|
PredicateContext* lastNode = &rootPredicateNode_;
|
||||||
while (lastNode->next_ != 0 && lastNode->next_->next_ != 0) {
|
while (lastNode->next_ != nullptr && lastNode->next_->next_ != nullptr) {
|
||||||
lastNode = lastNode->next_;
|
lastNode = lastNode->next_;
|
||||||
}
|
}
|
||||||
// Set message target to popped failure
|
// Set message target to popped failure
|
||||||
PredicateContext* tail = lastNode->next_;
|
PredicateContext* tail = lastNode->next_;
|
||||||
if (tail != 0 && tail->failure_ != 0) {
|
if (tail != nullptr && tail->failure_ != nullptr) {
|
||||||
messageTarget_ = tail->failure_;
|
messageTarget_ = tail->failure_;
|
||||||
}
|
}
|
||||||
// Remove tail from list
|
// Remove tail from list
|
||||||
predicateStackTail_ = lastNode;
|
predicateStackTail_ = lastNode;
|
||||||
lastNode->next_ = 0;
|
lastNode->next_ = nullptr;
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TestResult::failed() const { return !failures_.empty(); }
|
bool TestResult::failed() const { return !failures_.empty(); }
|
||||||
|
|
||||||
unsigned int TestResult::getAssertionNestingLevel() const {
|
|
||||||
unsigned int level = 0;
|
|
||||||
const PredicateContext* lastNode = &rootPredicateNode_;
|
|
||||||
while (lastNode->next_ != 0) {
|
|
||||||
lastNode = lastNode->next_;
|
|
||||||
++level;
|
|
||||||
}
|
|
||||||
return level;
|
|
||||||
}
|
|
||||||
|
|
||||||
void TestResult::printFailure(bool printTestName) const {
|
void TestResult::printFailure(bool printTestName) const {
|
||||||
if (failures_.empty()) {
|
if (failures_.empty()) {
|
||||||
return;
|
return;
|
||||||
@@ -160,12 +149,10 @@ void TestResult::printFailure(bool printTestName) const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Print in reverse to display the callstack in the right order
|
// Print in reverse to display the callstack in the right order
|
||||||
Failures::const_iterator itEnd = failures_.end();
|
for (const auto& failure : failures_) {
|
||||||
for (Failures::const_iterator it = failures_.begin(); it != itEnd; ++it) {
|
Json::String indent(failure.nestingLevel_ * 2, ' ');
|
||||||
const Failure& failure = *it;
|
|
||||||
JSONCPP_STRING indent(failure.nestingLevel_ * 2, ' ');
|
|
||||||
if (failure.file_) {
|
if (failure.file_) {
|
||||||
printf("%s%s(%d): ", indent.c_str(), failure.file_, failure.line_);
|
printf("%s%s(%u): ", indent.c_str(), failure.file_, failure.line_);
|
||||||
}
|
}
|
||||||
if (!failure.expr_.empty()) {
|
if (!failure.expr_.empty()) {
|
||||||
printf("%s\n", failure.expr_.c_str());
|
printf("%s\n", failure.expr_.c_str());
|
||||||
@@ -173,19 +160,19 @@ void TestResult::printFailure(bool printTestName) const {
|
|||||||
printf("\n");
|
printf("\n");
|
||||||
}
|
}
|
||||||
if (!failure.message_.empty()) {
|
if (!failure.message_.empty()) {
|
||||||
JSONCPP_STRING reindented = indentText(failure.message_, indent + " ");
|
Json::String reindented = indentText(failure.message_, indent + " ");
|
||||||
printf("%s\n", reindented.c_str());
|
printf("%s\n", reindented.c_str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
JSONCPP_STRING TestResult::indentText(const JSONCPP_STRING& text,
|
Json::String TestResult::indentText(const Json::String& text,
|
||||||
const JSONCPP_STRING& indent) {
|
const Json::String& indent) {
|
||||||
JSONCPP_STRING reindented;
|
Json::String reindented;
|
||||||
JSONCPP_STRING::size_type lastIndex = 0;
|
Json::String::size_type lastIndex = 0;
|
||||||
while (lastIndex < text.size()) {
|
while (lastIndex < text.size()) {
|
||||||
JSONCPP_STRING::size_type nextIndex = text.find('\n', lastIndex);
|
Json::String::size_type nextIndex = text.find('\n', lastIndex);
|
||||||
if (nextIndex == JSONCPP_STRING::npos) {
|
if (nextIndex == Json::String::npos) {
|
||||||
nextIndex = text.size() - 1;
|
nextIndex = text.size() - 1;
|
||||||
}
|
}
|
||||||
reindented += indent;
|
reindented += indent;
|
||||||
@@ -195,8 +182,8 @@ JSONCPP_STRING TestResult::indentText(const JSONCPP_STRING& text,
|
|||||||
return reindented;
|
return reindented;
|
||||||
}
|
}
|
||||||
|
|
||||||
TestResult& TestResult::addToLastFailure(const JSONCPP_STRING& message) {
|
TestResult& TestResult::addToLastFailure(const Json::String& message) {
|
||||||
if (messageTarget_ != 0) {
|
if (messageTarget_ != nullptr) {
|
||||||
messageTarget_->message_ += message;
|
messageTarget_->message_ += message;
|
||||||
}
|
}
|
||||||
return *this;
|
return *this;
|
||||||
@@ -217,9 +204,9 @@ TestResult& TestResult::operator<<(bool value) {
|
|||||||
// class TestCase
|
// class TestCase
|
||||||
// //////////////////////////////////////////////////////////////////
|
// //////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
TestCase::TestCase() : result_(0) {}
|
TestCase::TestCase() = default;
|
||||||
|
|
||||||
TestCase::~TestCase() {}
|
TestCase::~TestCase() = default;
|
||||||
|
|
||||||
void TestCase::run(TestResult& result) {
|
void TestCase::run(TestResult& result) {
|
||||||
result_ = &result;
|
result_ = &result;
|
||||||
@@ -229,25 +216,23 @@ void TestCase::run(TestResult& result) {
|
|||||||
// class Runner
|
// class Runner
|
||||||
// //////////////////////////////////////////////////////////////////
|
// //////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
Runner::Runner() {}
|
Runner::Runner() = default;
|
||||||
|
|
||||||
Runner& Runner::add(TestCaseFactory factory) {
|
Runner& Runner::add(TestCaseFactory factory) {
|
||||||
tests_.push_back(factory);
|
tests_.push_back(factory);
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int Runner::testCount() const {
|
size_t Runner::testCount() const { return tests_.size(); }
|
||||||
return static_cast<unsigned int>(tests_.size());
|
|
||||||
}
|
|
||||||
|
|
||||||
JSONCPP_STRING Runner::testNameAt(unsigned int index) const {
|
Json::String Runner::testNameAt(size_t index) const {
|
||||||
TestCase* test = tests_[index]();
|
TestCase* test = tests_[index]();
|
||||||
JSONCPP_STRING name = test->testName();
|
Json::String name = test->testName();
|
||||||
delete test;
|
delete test;
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Runner::runTestAt(unsigned int index, TestResult& result) const {
|
void Runner::runTestAt(size_t index, TestResult& result) const {
|
||||||
TestCase* test = tests_[index]();
|
TestCase* test = tests_[index]();
|
||||||
result.setTestName(test->testName());
|
result.setTestName(test->testName());
|
||||||
printf("Testing %s: ", test->testName());
|
printf("Testing %s: ", test->testName());
|
||||||
@@ -257,8 +242,7 @@ void Runner::runTestAt(unsigned int index, TestResult& result) const {
|
|||||||
#endif // if JSON_USE_EXCEPTION
|
#endif // if JSON_USE_EXCEPTION
|
||||||
test->run(result);
|
test->run(result);
|
||||||
#if JSON_USE_EXCEPTION
|
#if JSON_USE_EXCEPTION
|
||||||
}
|
} catch (const std::exception& e) {
|
||||||
catch (const std::exception& e) {
|
|
||||||
result.addFailure(__FILE__, __LINE__, "Unexpected exception caught:")
|
result.addFailure(__FILE__, __LINE__, "Unexpected exception caught:")
|
||||||
<< e.what();
|
<< e.what();
|
||||||
}
|
}
|
||||||
@@ -270,9 +254,9 @@ void Runner::runTestAt(unsigned int index, TestResult& result) const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool Runner::runAllTest(bool printSummary) const {
|
bool Runner::runAllTest(bool printSummary) const {
|
||||||
unsigned int count = testCount();
|
size_t const count = testCount();
|
||||||
std::deque<TestResult> failures;
|
std::deque<TestResult> failures;
|
||||||
for (unsigned int index = 0; index < count; ++index) {
|
for (size_t index = 0; index < count; ++index) {
|
||||||
TestResult result;
|
TestResult result;
|
||||||
runTestAt(index, result);
|
runTestAt(index, result);
|
||||||
if (result.failed()) {
|
if (result.failed()) {
|
||||||
@@ -282,31 +266,27 @@ bool Runner::runAllTest(bool printSummary) const {
|
|||||||
|
|
||||||
if (failures.empty()) {
|
if (failures.empty()) {
|
||||||
if (printSummary) {
|
if (printSummary) {
|
||||||
printf("All %d tests passed\n", count);
|
printf("All %zu tests passed\n", count);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
for (unsigned int index = 0; index < failures.size(); ++index) {
|
for (auto& result : failures) {
|
||||||
TestResult& result = failures[index];
|
|
||||||
result.printFailure(count > 1);
|
result.printFailure(count > 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (printSummary) {
|
if (printSummary) {
|
||||||
unsigned int failedCount = static_cast<unsigned int>(failures.size());
|
size_t const failedCount = failures.size();
|
||||||
unsigned int passedCount = count - failedCount;
|
size_t const passedCount = count - failedCount;
|
||||||
printf("%d/%d tests passed (%d failure(s))\n",
|
printf("%zu/%zu tests passed (%zu failure(s))\n", passedCount, count,
|
||||||
passedCount,
|
|
||||||
count,
|
|
||||||
failedCount);
|
failedCount);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Runner::testIndex(const JSONCPP_STRING& testName,
|
bool Runner::testIndex(const Json::String& testName, size_t& indexOut) const {
|
||||||
unsigned int& indexOut) const {
|
const size_t count = testCount();
|
||||||
unsigned int count = testCount();
|
for (size_t index = 0; index < count; ++index) {
|
||||||
for (unsigned int index = 0; index < count; ++index) {
|
|
||||||
if (testNameAt(index) == testName) {
|
if (testNameAt(index) == testName) {
|
||||||
indexOut = index;
|
indexOut = index;
|
||||||
return true;
|
return true;
|
||||||
@@ -316,17 +296,17 @@ bool Runner::testIndex(const JSONCPP_STRING& testName,
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Runner::listTests() const {
|
void Runner::listTests() const {
|
||||||
unsigned int count = testCount();
|
const size_t count = testCount();
|
||||||
for (unsigned int index = 0; index < count; ++index) {
|
for (size_t index = 0; index < count; ++index) {
|
||||||
printf("%s\n", testNameAt(index).c_str());
|
printf("%s\n", testNameAt(index).c_str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int Runner::runCommandLine(int argc, const char* argv[]) const {
|
int Runner::runCommandLine(int argc, const char* argv[]) const {
|
||||||
// typedef std::deque<JSONCPP_STRING> TestNames;
|
// typedef std::deque<String> TestNames;
|
||||||
Runner subrunner;
|
Runner subrunner;
|
||||||
for (int index = 1; index < argc; ++index) {
|
for (int index = 1; index < argc; ++index) {
|
||||||
JSONCPP_STRING opt = argv[index];
|
Json::String opt = argv[index];
|
||||||
if (opt == "--list-tests") {
|
if (opt == "--list-tests") {
|
||||||
listTests();
|
listTests();
|
||||||
return 0;
|
return 0;
|
||||||
@@ -335,7 +315,7 @@ int Runner::runCommandLine(int argc, const char* argv[]) const {
|
|||||||
} else if (opt == "--test") {
|
} else if (opt == "--test") {
|
||||||
++index;
|
++index;
|
||||||
if (index < argc) {
|
if (index < argc) {
|
||||||
unsigned int testNameIndex;
|
size_t testNameIndex;
|
||||||
if (testIndex(argv[index], testNameIndex)) {
|
if (testIndex(argv[index], testNameIndex)) {
|
||||||
subrunner.add(tests_[testNameIndex]);
|
subrunner.add(tests_[testNameIndex]);
|
||||||
} else {
|
} else {
|
||||||
@@ -398,8 +378,8 @@ void Runner::preventDialogOnCrash() {
|
|||||||
_CrtSetReportHook(&msvcrtSilentReportHook);
|
_CrtSetReportHook(&msvcrtSilentReportHook);
|
||||||
#endif // if defined(_MSC_VER)
|
#endif // if defined(_MSC_VER)
|
||||||
|
|
||||||
// @todo investiguate this handler (for buffer overflow)
|
// @todo investigate this handler (for buffer overflow)
|
||||||
// _set_security_error_handler
|
// _set_security_error_handler
|
||||||
|
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
// Prevents the system from popping a dialog for debugging if the
|
// Prevents the system from popping a dialog for debugging if the
|
||||||
@@ -426,23 +406,21 @@ void Runner::printUsage(const char* appName) {
|
|||||||
// Assertion functions
|
// Assertion functions
|
||||||
// //////////////////////////////////////////////////////////////////
|
// //////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
JSONCPP_STRING ToJsonString(const char* toConvert) {
|
Json::String ToJsonString(const char* toConvert) {
|
||||||
return JSONCPP_STRING(toConvert);
|
return Json::String(toConvert);
|
||||||
}
|
}
|
||||||
|
|
||||||
JSONCPP_STRING ToJsonString(JSONCPP_STRING in) {
|
Json::String ToJsonString(Json::String in) { return in; }
|
||||||
return in;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if JSONCPP_USING_SECURE_MEMORY
|
#if JSONCPP_USING_SECURE_MEMORY
|
||||||
JSONCPP_STRING ToJsonString(std::string in) {
|
Json::String ToJsonString(std::string in) {
|
||||||
return JSONCPP_STRING(in.data(), in.data() + in.length());
|
return Json::String(in.data(), in.data() + in.length());
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
TestResult& checkStringEqual(TestResult& result,
|
TestResult& checkStringEqual(TestResult& result,
|
||||||
const JSONCPP_STRING& expected,
|
const Json::String& expected,
|
||||||
const JSONCPP_STRING& actual,
|
const Json::String& actual,
|
||||||
const char* file,
|
const char* file,
|
||||||
unsigned int line,
|
unsigned int line,
|
||||||
const char* expr) {
|
const char* expr) {
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
// Copyright 2007-2010 Baptiste Lepilleur
|
// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors
|
||||||
// Distributed under MIT license, or public domain if desired and
|
// Distributed under MIT license, or public domain if desired and
|
||||||
// recognized in your jurisdiction.
|
// recognized in your jurisdiction.
|
||||||
// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
||||||
@@ -6,11 +6,11 @@
|
|||||||
#ifndef JSONTEST_H_INCLUDED
|
#ifndef JSONTEST_H_INCLUDED
|
||||||
#define JSONTEST_H_INCLUDED
|
#define JSONTEST_H_INCLUDED
|
||||||
|
|
||||||
|
#include <cstdio>
|
||||||
|
#include <deque>
|
||||||
#include <json/config.h>
|
#include <json/config.h>
|
||||||
#include <json/value.h>
|
#include <json/value.h>
|
||||||
#include <json/writer.h>
|
#include <json/writer.h>
|
||||||
#include <stdio.h>
|
|
||||||
#include <deque>
|
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
@@ -32,8 +32,8 @@ class Failure {
|
|||||||
public:
|
public:
|
||||||
const char* file_;
|
const char* file_;
|
||||||
unsigned int line_;
|
unsigned int line_;
|
||||||
JSONCPP_STRING expr_;
|
Json::String expr_;
|
||||||
JSONCPP_STRING message_;
|
Json::String message_;
|
||||||
unsigned int nestingLevel_;
|
unsigned int nestingLevel_;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -60,16 +60,16 @@ public:
|
|||||||
/// Not encapsulated to prevent step into when debugging failed assertions
|
/// Not encapsulated to prevent step into when debugging failed assertions
|
||||||
/// Incremented by one on assertion predicate entry, decreased by one
|
/// Incremented by one on assertion predicate entry, decreased by one
|
||||||
/// by addPredicateContext().
|
/// by addPredicateContext().
|
||||||
PredicateContext::Id predicateId_;
|
PredicateContext::Id predicateId_{1};
|
||||||
|
|
||||||
/// \internal Implementation detail for predicate macros
|
/// \internal Implementation detail for predicate macros
|
||||||
PredicateContext* predicateStackTail_;
|
PredicateContext* predicateStackTail_;
|
||||||
|
|
||||||
void setTestName(const JSONCPP_STRING& name);
|
void setTestName(const Json::String& name);
|
||||||
|
|
||||||
/// Adds an assertion failure.
|
/// Adds an assertion failure.
|
||||||
TestResult&
|
TestResult&
|
||||||
addFailure(const char* file, unsigned int line, const char* expr = 0);
|
addFailure(const char* file, unsigned int line, const char* expr = nullptr);
|
||||||
|
|
||||||
/// Removes the last PredicateContext added to the predicate stack
|
/// Removes the last PredicateContext added to the predicate stack
|
||||||
/// chained list.
|
/// chained list.
|
||||||
@@ -82,7 +82,7 @@ public:
|
|||||||
|
|
||||||
// Generic operator that will work with anything ostream can deal with.
|
// Generic operator that will work with anything ostream can deal with.
|
||||||
template <typename T> TestResult& operator<<(const T& value) {
|
template <typename T> TestResult& operator<<(const T& value) {
|
||||||
JSONCPP_OSTRINGSTREAM oss;
|
Json::OStringStream oss;
|
||||||
oss.precision(16);
|
oss.precision(16);
|
||||||
oss.setf(std::ios_base::floatfield);
|
oss.setf(std::ios_base::floatfield);
|
||||||
oss << value;
|
oss << value;
|
||||||
@@ -96,23 +96,22 @@ public:
|
|||||||
TestResult& operator<<(Json::UInt64 value);
|
TestResult& operator<<(Json::UInt64 value);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
TestResult& addToLastFailure(const JSONCPP_STRING& message);
|
TestResult& addToLastFailure(const Json::String& message);
|
||||||
unsigned int getAssertionNestingLevel() const;
|
|
||||||
/// Adds a failure or a predicate context
|
/// Adds a failure or a predicate context
|
||||||
void addFailureInfo(const char* file,
|
void addFailureInfo(const char* file,
|
||||||
unsigned int line,
|
unsigned int line,
|
||||||
const char* expr,
|
const char* expr,
|
||||||
unsigned int nestingLevel);
|
unsigned int nestingLevel);
|
||||||
static JSONCPP_STRING indentText(const JSONCPP_STRING& text,
|
static Json::String indentText(const Json::String& text,
|
||||||
const JSONCPP_STRING& indent);
|
const Json::String& indent);
|
||||||
|
|
||||||
typedef std::deque<Failure> Failures;
|
typedef std::deque<Failure> Failures;
|
||||||
Failures failures_;
|
Failures failures_;
|
||||||
JSONCPP_STRING name_;
|
Json::String name_;
|
||||||
PredicateContext rootPredicateNode_;
|
PredicateContext rootPredicateNode_;
|
||||||
PredicateContext::Id lastUsedPredicateId_;
|
PredicateContext::Id lastUsedPredicateId_{0};
|
||||||
/// Failure which is the target of the messages added using operator <<
|
/// Failure which is the target of the messages added using operator <<
|
||||||
Failure* messageTarget_;
|
Failure* messageTarget_{nullptr};
|
||||||
};
|
};
|
||||||
|
|
||||||
class TestCase {
|
class TestCase {
|
||||||
@@ -126,7 +125,7 @@ public:
|
|||||||
virtual const char* testName() const = 0;
|
virtual const char* testName() const = 0;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
TestResult* result_;
|
TestResult* result_{nullptr};
|
||||||
|
|
||||||
private:
|
private:
|
||||||
virtual void runTestCase() = 0;
|
virtual void runTestCase() = 0;
|
||||||
@@ -152,23 +151,23 @@ public:
|
|||||||
bool runAllTest(bool printSummary) const;
|
bool runAllTest(bool printSummary) const;
|
||||||
|
|
||||||
/// Returns the number of test case in the suite
|
/// Returns the number of test case in the suite
|
||||||
unsigned int testCount() const;
|
size_t testCount() const;
|
||||||
|
|
||||||
/// Returns the name of the test case at the specified index
|
/// Returns the name of the test case at the specified index
|
||||||
JSONCPP_STRING testNameAt(unsigned int index) const;
|
Json::String testNameAt(size_t index) const;
|
||||||
|
|
||||||
/// Runs the test case at the specified index using the specified TestResult
|
/// Runs the test case at the specified index using the specified TestResult
|
||||||
void runTestAt(unsigned int index, TestResult& result) const;
|
void runTestAt(size_t index, TestResult& result) const;
|
||||||
|
|
||||||
static void printUsage(const char* appName);
|
static void printUsage(const char* appName);
|
||||||
|
|
||||||
private: // prevents copy construction and assignment
|
private: // prevents copy construction and assignment
|
||||||
Runner(const Runner& other);
|
Runner(const Runner& other) = delete;
|
||||||
Runner& operator=(const Runner& other);
|
Runner& operator=(const Runner& other) = delete;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void listTests() const;
|
void listTests() const;
|
||||||
bool testIndex(const JSONCPP_STRING& testName, unsigned int& index) const;
|
bool testIndex(const Json::String& testName, size_t& indexOut) const;
|
||||||
static void preventDialogOnCrash();
|
static void preventDialogOnCrash();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -191,15 +190,15 @@ TestResult& checkEqual(TestResult& result,
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
JSONCPP_STRING ToJsonString(const char* toConvert);
|
Json::String ToJsonString(const char* toConvert);
|
||||||
JSONCPP_STRING ToJsonString(JSONCPP_STRING in);
|
Json::String ToJsonString(Json::String in);
|
||||||
#if JSONCPP_USING_SECURE_MEMORY
|
#if JSONCPP_USING_SECURE_MEMORY
|
||||||
JSONCPP_STRING ToJsonString(std::string in);
|
Json::String ToJsonString(std::string in);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
TestResult& checkStringEqual(TestResult& result,
|
TestResult& checkStringEqual(TestResult& result,
|
||||||
const JSONCPP_STRING& expected,
|
const Json::String& expected,
|
||||||
const JSONCPP_STRING& actual,
|
const Json::String& actual,
|
||||||
const char* file,
|
const char* file,
|
||||||
unsigned int line,
|
unsigned int line,
|
||||||
const char* expr);
|
const char* expr);
|
||||||
@@ -212,7 +211,7 @@ TestResult& checkStringEqual(TestResult& result,
|
|||||||
#define JSONTEST_ASSERT(expr) \
|
#define JSONTEST_ASSERT(expr) \
|
||||||
if (expr) { \
|
if (expr) { \
|
||||||
} else \
|
} else \
|
||||||
result_->addFailure(__FILE__, __LINE__, #expr)
|
result_->addFailure(__FILE__, __LINE__, #expr)
|
||||||
|
|
||||||
/// \brief Asserts that the given predicate is true.
|
/// \brief Asserts that the given predicate is true.
|
||||||
/// The predicate may do other assertions and be a member function of the
|
/// The predicate may do other assertions and be a member function of the
|
||||||
@@ -220,8 +219,7 @@ TestResult& checkStringEqual(TestResult& result,
|
|||||||
#define JSONTEST_ASSERT_PRED(expr) \
|
#define JSONTEST_ASSERT_PRED(expr) \
|
||||||
{ \
|
{ \
|
||||||
JsonTest::PredicateContext _minitest_Context = { \
|
JsonTest::PredicateContext _minitest_Context = { \
|
||||||
result_->predicateId_, __FILE__, __LINE__, #expr, NULL, NULL \
|
result_->predicateId_, __FILE__, __LINE__, #expr, NULL, NULL}; \
|
||||||
}; \
|
|
||||||
result_->predicateStackTail_->next_ = &_minitest_Context; \
|
result_->predicateStackTail_->next_ = &_minitest_Context; \
|
||||||
result_->predicateId_ += 1; \
|
result_->predicateId_ += 1; \
|
||||||
result_->predicateStackTail_ = &_minitest_Context; \
|
result_->predicateStackTail_ = &_minitest_Context; \
|
||||||
@@ -231,21 +229,14 @@ TestResult& checkStringEqual(TestResult& result,
|
|||||||
|
|
||||||
/// \brief Asserts that two values are equals.
|
/// \brief Asserts that two values are equals.
|
||||||
#define JSONTEST_ASSERT_EQUAL(expected, actual) \
|
#define JSONTEST_ASSERT_EQUAL(expected, actual) \
|
||||||
JsonTest::checkEqual(*result_, \
|
JsonTest::checkEqual(*result_, expected, actual, __FILE__, __LINE__, \
|
||||||
expected, \
|
|
||||||
actual, \
|
|
||||||
__FILE__, \
|
|
||||||
__LINE__, \
|
|
||||||
#expected " == " #actual)
|
#expected " == " #actual)
|
||||||
|
|
||||||
/// \brief Asserts that two values are equals.
|
/// \brief Asserts that two values are equals.
|
||||||
#define JSONTEST_ASSERT_STRING_EQUAL(expected, actual) \
|
#define JSONTEST_ASSERT_STRING_EQUAL(expected, actual) \
|
||||||
JsonTest::checkStringEqual(*result_, \
|
JsonTest::checkStringEqual(*result_, JsonTest::ToJsonString(expected), \
|
||||||
JsonTest::ToJsonString(expected), \
|
JsonTest::ToJsonString(actual), __FILE__, \
|
||||||
JsonTest::ToJsonString(actual), \
|
__LINE__, #expected " == " #actual)
|
||||||
__FILE__, \
|
|
||||||
__LINE__, \
|
|
||||||
#expected " == " #actual)
|
|
||||||
|
|
||||||
/// \brief Asserts that a given expression throws an exception
|
/// \brief Asserts that a given expression throws an exception
|
||||||
#define JSONTEST_ASSERT_THROWS(expr) \
|
#define JSONTEST_ASSERT_THROWS(expr) \
|
||||||
@@ -253,13 +244,12 @@ TestResult& checkStringEqual(TestResult& result,
|
|||||||
bool _threw = false; \
|
bool _threw = false; \
|
||||||
try { \
|
try { \
|
||||||
expr; \
|
expr; \
|
||||||
} \
|
} catch (...) { \
|
||||||
catch (...) { \
|
|
||||||
_threw = true; \
|
_threw = true; \
|
||||||
} \
|
} \
|
||||||
if (!_threw) \
|
if (!_threw) \
|
||||||
result_->addFailure( \
|
result_->addFailure(__FILE__, __LINE__, \
|
||||||
__FILE__, __LINE__, "expected exception thrown: " #expr); \
|
"expected exception thrown: " #expr); \
|
||||||
}
|
}
|
||||||
|
|
||||||
/// \brief Begin a fixture test case.
|
/// \brief Begin a fixture test case.
|
||||||
@@ -270,9 +260,9 @@ TestResult& checkStringEqual(TestResult& result,
|
|||||||
return new Test##FixtureType##name(); \
|
return new Test##FixtureType##name(); \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
public: /* overidden from TestCase */ \
|
public: /* overridden from TestCase */ \
|
||||||
const char* testName() const JSONCPP_OVERRIDE { return #FixtureType "/" #name; } \
|
const char* testName() const override { return #FixtureType "/" #name; } \
|
||||||
void runTestCase() JSONCPP_OVERRIDE; \
|
void runTestCase() override; \
|
||||||
}; \
|
}; \
|
||||||
\
|
\
|
||||||
void Test##FixtureType##name::runTestCase()
|
void Test##FixtureType##name::runTestCase()
|
||||||
|
File diff suppressed because it is too large
Load Diff
@@ -1,10 +0,0 @@
|
|||||||
Import( 'env_testing buildUnitTests' )
|
|
||||||
|
|
||||||
buildUnitTests( env_testing, Split( """
|
|
||||||
main.cpp
|
|
||||||
jsontest.cpp
|
|
||||||
""" ),
|
|
||||||
'test_lib_json' )
|
|
||||||
|
|
||||||
# For 'check' to work, 'libs' must be built first.
|
|
||||||
env_testing.Depends('test_lib_json', '#libs')
|
|
@@ -1,4 +1,4 @@
|
|||||||
# Copyright 2007 Baptiste Lepilleur
|
# Copyright 2007 Baptiste Lepilleur and The JsonCpp Authors
|
||||||
# Distributed under MIT license, or public domain if desired and
|
# Distributed under MIT license, or public domain if desired and
|
||||||
# recognized in your jurisdiction.
|
# recognized in your jurisdiction.
|
||||||
# See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
# See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
||||||
|
1
test/data/fail_test_stack_limit.json
Normal file
1
test/data/fail_test_stack_limit.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]
|
@@ -1,4 +1,4 @@
|
|||||||
# Copyright 2007 Baptiste Lepilleur
|
# Copyright 2007 Baptiste Lepilleur and The JsonCpp Authors
|
||||||
# Distributed under MIT license, or public domain if desired and
|
# Distributed under MIT license, or public domain if desired and
|
||||||
# recognized in your jurisdiction.
|
# recognized in your jurisdiction.
|
||||||
# See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
# See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
# Copyright 2007 Baptiste Lepilleur
|
# Copyright 2007 Baptiste Lepilleur and The JsonCpp Authors
|
||||||
# Distributed under MIT license, or public domain if desired and
|
# Distributed under MIT license, or public domain if desired and
|
||||||
# recognized in your jurisdiction.
|
# recognized in your jurisdiction.
|
||||||
# See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
# See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
# Copyright 2007 Baptiste Lepilleur
|
# Copyright 2007 Baptiste Lepilleur and The JsonCpp Authors
|
||||||
# Distributed under MIT license, or public domain if desired and
|
# Distributed under MIT license, or public domain if desired and
|
||||||
# recognized in your jurisdiction.
|
# recognized in your jurisdiction.
|
||||||
# See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
# See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
||||||
@@ -55,7 +55,7 @@ def compareOutputs(expected, actual, message):
|
|||||||
""" % (message, diff_line,
|
""" % (message, diff_line,
|
||||||
safeGetLine(expected,diff_line),
|
safeGetLine(expected,diff_line),
|
||||||
safeGetLine(actual,diff_line))
|
safeGetLine(actual,diff_line))
|
||||||
|
|
||||||
def safeReadFile(path):
|
def safeReadFile(path):
|
||||||
try:
|
try:
|
||||||
return open(path, 'rt', encoding = 'utf-8').read()
|
return open(path, 'rt', encoding = 'utf-8').read()
|
||||||
@@ -69,7 +69,43 @@ def runAllTests(jsontest_executable_path, input_dir = None,
|
|||||||
input_dir = os.path.join(os.getcwd(), 'data')
|
input_dir = os.path.join(os.getcwd(), 'data')
|
||||||
tests = glob(os.path.join(input_dir, '*.json'))
|
tests = glob(os.path.join(input_dir, '*.json'))
|
||||||
if with_json_checker:
|
if with_json_checker:
|
||||||
test_jsonchecker = glob(os.path.join(input_dir, '../jsonchecker', '*.json'))
|
all_test_jsonchecker = glob(os.path.join(input_dir, '../jsonchecker', '*.json'))
|
||||||
|
# These tests fail with strict json support, but pass with jsoncpp extra lieniency
|
||||||
|
"""
|
||||||
|
Failure details:
|
||||||
|
* Test ../jsonchecker/fail25.json
|
||||||
|
Parsing should have failed:
|
||||||
|
[" tab character in string "]
|
||||||
|
|
||||||
|
* Test ../jsonchecker/fail13.json
|
||||||
|
Parsing should have failed:
|
||||||
|
{"Numbers cannot have leading zeroes": 013}
|
||||||
|
|
||||||
|
* Test ../jsonchecker/fail18.json
|
||||||
|
Parsing should have failed:
|
||||||
|
[[[[[[[[[[[[[[[[[[[["Too deep"]]]]]]]]]]]]]]]]]]]]
|
||||||
|
|
||||||
|
* Test ../jsonchecker/fail8.json
|
||||||
|
Parsing should have failed:
|
||||||
|
["Extra close"]]
|
||||||
|
|
||||||
|
* Test ../jsonchecker/fail7.json
|
||||||
|
Parsing should have failed:
|
||||||
|
["Comma after the close"],
|
||||||
|
|
||||||
|
* Test ../jsonchecker/fail10.json
|
||||||
|
Parsing should have failed:
|
||||||
|
{"Extra value after close": true} "misplaced quoted value"
|
||||||
|
|
||||||
|
* Test ../jsonchecker/fail27.json
|
||||||
|
Parsing should have failed:
|
||||||
|
["line
|
||||||
|
break"]
|
||||||
|
"""
|
||||||
|
known_differences_withjsonchecker = [ "fail25.json", "fail13.json", "fail18.json", "fail8.json",
|
||||||
|
"fail7.json", "fail10.json", "fail27.json" ]
|
||||||
|
test_jsonchecker = [ test for test in all_test_jsonchecker if os.path.basename(test) not in known_differences_withjsonchecker ]
|
||||||
|
|
||||||
else:
|
else:
|
||||||
test_jsonchecker = []
|
test_jsonchecker = []
|
||||||
failed_tests = []
|
failed_tests = []
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
# Copyright 2009 Baptiste Lepilleur
|
# Copyright 2009 Baptiste Lepilleur and The JsonCpp Authors
|
||||||
# Distributed under MIT license, or public domain if desired and
|
# Distributed under MIT license, or public domain if desired and
|
||||||
# recognized in your jurisdiction.
|
# recognized in your jurisdiction.
|
||||||
# See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
# See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
||||||
|
31
travis.sh
31
travis.sh
@@ -1,31 +0,0 @@
|
|||||||
#!/usr/bin/env sh
|
|
||||||
# This is called by `.travis.yml` via Travis CI.
|
|
||||||
# Travis supplies $TRAVIS_OS_NAME.
|
|
||||||
# http://docs.travis-ci.com/user/multi-os/
|
|
||||||
# Our .travis.yml also defines:
|
|
||||||
# - SHARED_LIB=ON/OFF
|
|
||||||
# - STATIC_LIB=ON/OFF
|
|
||||||
# - CMAKE_PKG=ON/OFF
|
|
||||||
# - BUILD_TYPE=release/debug
|
|
||||||
# - VERBOSE_MAKE=false/true
|
|
||||||
# - VERBOSE (set or not)
|
|
||||||
|
|
||||||
# -e: fail on error
|
|
||||||
# -v: show commands
|
|
||||||
# -x: show expanded commands
|
|
||||||
set -vex
|
|
||||||
|
|
||||||
env | sort
|
|
||||||
|
|
||||||
cmake -DJSONCPP_WITH_CMAKE_PACKAGE=$CMAKE_PKG -DBUILD_SHARED_LIBS=$SHARED_LIB -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_VERBOSE_MAKEFILE=$VERBOSE_MAKE .
|
|
||||||
make
|
|
||||||
cmake -DJSONCPP_WITH_CMAKE_PACKAGE=$CMAKE_PKG -DBUILD_SHARED_LIBS=$SHARED_LIB -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_VERBOSE_MAKEFILE=$VERBOSE_MAKE -DJSONCPP_USE_SECURE_MEMORY=1 .
|
|
||||||
make
|
|
||||||
|
|
||||||
# Python is not available in Travis for osx.
|
|
||||||
# https://github.com/travis-ci/travis-ci/issues/2320
|
|
||||||
if [ "$TRAVIS_OS_NAME" != "osx" ]
|
|
||||||
then
|
|
||||||
make jsoncpp_check
|
|
||||||
valgrind --error-exitcode=42 --leak-check=full ./src/test_lib_json/jsoncpp_test
|
|
||||||
fi
|
|
1
version.txt
Normal file
1
version.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
1.8.4
|
Reference in New Issue
Block a user