Niels Lohmann
aba8b58492
🔨 approach to un-break the changes for #462
2017-08-16 20:11:05 +02:00
Niels Lohmann
22b59693f1
💥 CBOR/MessagePack input must end with EOF #505
...
The CBOR and MessagePack parsers now expect the input to be read until the end. Unless the new parameter "strict" is set to false (it is true by default), an exception is raised if the parser ends prematurely. This is a breaking change as the parsers ignored unread input so far.
Furthermore, the offset/startIndex paramter introduced in #462 was removed as this behavior can be mimicked with an iterator range. For instance, instead of calling "from_cbor(vec, 5);", you can write "from_cbor({vec.begin()+5, vec.end()});".
2017-08-16 14:48:23 +02:00
Niels Lohmann
72afe53fa0
📝 updated documentation for update() function #661
2017-08-15 21:42:50 +02:00
Niels Lohmann
e523312fa2
✅ improved test coverage
2017-08-03 17:47:42 +02:00
Niels Lohmann
d2c3592908
✅ added test cases for update #661
2017-08-02 22:44:58 +02:00
Niels Lohmann
aad55219f8
Merge branch 'develop' into move-construction
2017-07-30 19:49:24 +02:00
Niels Lohmann
5851daa576
✨ binary formats can be stored in std::string, std::ofstreams or std::ostringstream #477
2017-07-28 00:21:55 +02:00
Niels Lohmann
7d51214045
✨ implemented exception-free parser #458 #582
...
You can now pass a boolean "allow_exceptions" to the parse functions. If it is false, no exceptions are thrown in case of a parse error. Instead, parsing is stopped at the first error and a JSON value of type "discarded" (check with is_discarded()) is returned.
2017-07-27 20:33:11 +02:00
Niels Lohmann
3d589fd032
🔨 fixed compilation error
2017-07-26 23:59:56 +02:00
Nikita Ofitserov
0f4978e503
Fix an actually invalid test
...
C++ overload resolution/list initialization rules are hard.
2017-07-24 01:08:33 +03:00
Niels Lohmann
4414f94cd5
🔨 using input/output adapters for CBOR and MessagePack
...
- You can now pass a reference to a vector to the to_cbor and to_msgpack functions. The output will be written (appended) to the vector. #476
- You can now pass an output stream with uint8_t character type to the to_cbor and to_msgpack functions. #477
- You can now read from uint8_t */size in the to_cbor and to_msgpack functions. An input adapter will be created from this pair, so you need to use braces. #478
2017-07-23 23:02:24 +02:00
Nikita Ofitserov
f5cae64e52
Update tests while fixing possible UB
...
std::initializer_list does not own the temporaries created in
its initialization. Therefore, storing it in an independent
stack variable is unsafe.
2017-07-23 23:59:34 +03:00
Nikita Ofitserov
7b3cbfff23
Add some tests for std::move from std::initializer_list
2017-07-23 23:47:15 +03:00
Niels Lohmann
9b1c058810
🔨 reorganized interfaces for parse/accept functions #623
...
We now rely on implicit conversions to an input_adapter object in the parse/accept functions.
2017-07-23 18:11:34 +02:00
Niels Lohmann
d53ef95067
🔨 fixed some warnings
2017-07-22 15:33:31 +02:00
Niels Lohmann
c7a69ae03e
⚡ started working on parser with provded result reference #418
...
Internally, the parser now writes its result into a JSON value provided as a reference. To be usable, the public interfaces need to be extended.
2017-07-22 15:18:38 +02:00
Niels Lohmann
f513c46749
🔨 further cleanup
2017-07-22 13:35:04 +02:00
Niels Lohmann
21d23982ca
🐛 fix for #656
...
A complete rewrite of the string escape function. It now provides codepoint-to-\uxxxx escaping. Invalid UTF-8 byte sequences are not escaped, but copied as-is. I haven’t spent much time optimizing the code - but the library now agrees with Python on every single Unicode character’s escaping (see file test/data/json_nlohmann_tests/all_unicode_ascii.json).
Other minor changes: replaced "size_t" by "std::size_t"
2017-07-17 07:53:02 +02:00
Ryan Mulder
71597be294
add ensure_ascii parameter to dump. #330
2017-07-11 13:48:08 -04:00
Théo DELRIEU
acff23efb2
move binary_{reader,writer} outside of basic_json
2017-07-09 21:30:33 +02:00
Théo DELRIEU
15625ca4a7
move input adapters outside of basic_json
2017-07-09 21:21:12 +02:00
Oleg Endo
f0ca96d462
include <iosfwd> instead of <iostream>
...
avoid bloat caused by <iostream> and std::cout and friends in apps where
iostream are not used.
2017-07-09 15:04:49 +09:00
Niels Lohmann
87bccbc335
🔨 removed exception parse_error.111
...
It makes no sense to have this special exception. Instead of throwing when an input adapter is created, it is better to detect a parse error in later usage when an EOF is "read" unexpectedly.
2017-07-08 21:35:13 +02:00
Niels Lohmann
015c88783e
🔨 fixed a pedantic warning
2017-07-08 12:03:12 +02:00
Niels Lohmann
63ecbfd36b
✅ re-added test
...
I have no idea why this test has been removed in the first place.
2017-07-07 23:38:04 +02:00
Niels Lohmann
8b123107c0
🔨 fixed some pedantic GCC warnings
2017-07-07 22:41:22 +02:00
Niels Lohmann
e99b783def
🔨 simplifying scanner
2017-06-22 16:40:15 +02:00
Niels Lohmann
4b5433578a
✅ added progress output for Unicode tests
...
Travis aborts tests if they do not produce output for 10 minutes. This commit shall fix this.
2017-06-21 18:50:11 +02:00
Niels Lohmann
6f3bebff5c
🔨 removed unexpect function
2017-06-21 07:26:50 +02:00
Niels Lohmann
e7695306f1
🔨 fixed a warning
2017-06-20 22:58:02 +02:00
Niels Lohmann
84f2e64a7c
✅ improved coverage
2017-06-20 22:35:31 +02:00
Niels Lohmann
2f007ca092
✅ improved coverage
2017-06-20 22:03:36 +02:00
Niels Lohmann
7c2a187258
✅ improved test coverage
2017-06-20 21:09:26 +02:00
Niels Lohmann
e191dd833f
🔨 fixed warning about pointer members
2017-06-20 21:09:05 +02:00
Niels Lohmann
82b95ca664
🔨 simplified error handling in parser
2017-06-20 20:14:18 +02:00
Niels Lohmann
4e6f548c0b
Merge pull request #624 from theodelrieu/feature/pair_tuple_conversions
...
add pair/tuple conversions
2017-06-19 17:31:10 +02:00
Théo DELRIEU
08d781058c
add from_json support for std::array
2017-06-19 12:03:38 +02:00
Théo DELRIEU
6e4910d5c5
add pair/tuple conversions
2017-06-19 10:16:37 +02:00
Niels Lohmann
112a6f4e53
🔨 replaced lexer's error message by const char*
2017-06-18 13:03:14 +02:00
Niels Lohmann
1fbb82de89
🔨 using std::array to buffer input
2017-06-17 20:47:53 +02:00
Niels Lohmann
889006f006
✅ regression test for #600
2017-06-17 13:37:04 +02:00
Niels Lohmann
b27d2adcbe
✨ accept functions to check if input is valid JSON #458
2017-06-16 19:23:55 +02:00
Théo DELRIEU
c98364834f
remove std::pair support
2017-06-13 11:11:29 +02:00
Niels Lohmann
afb959a083
🔨 removed nonportable code
2017-06-12 19:02:08 +02:00
Niels Lohmann
ac793e957f
🔨 trying to fix #367
...
Code from https://stackoverflow.com/a/44503794/266378 which is hopefully working with MSVC.
2017-06-12 18:58:58 +02:00
HenryLee
e12c2ee6a8
Merge branch 'develop' into iterator_arithmetic
2017-06-09 20:47:42 +10:00
Niels Lohmann
52f934cbbf
Merge pull request #609 from theodelrieu/develop
...
Add pair support, fix CompatibleObject conversions (fixes #600 )
2017-06-07 16:38:23 +02:00
Théo DELRIEU
cea39dfaa8
fix #600
...
Instead of calling CompatibleObjectType iterator-range constructor,
first convert json::value_type to CompatibleObjectType::value_type
2017-06-07 10:24:59 +02:00
HenryLee
6661ec755b
Merge branch 'develop' into iterator_arithmetic
2017-06-07 18:01:46 +10:00
HenryLee
0f065edff6
Revert a change in reverse iterator to pass the test cases
2017-06-07 18:01:01 +10:00
Niels Lohmann
92ef19696a
✏️ cleanup after #598
2017-06-06 20:48:11 +02:00
Théo DELRIEU
85de93ba93
add std::pair<CompatibleStringType, T> support
2017-06-06 13:56:16 +02:00
HenryLee
fb91aa81da
Merge branch 'develop' into iterator_arithmetic
2017-06-05 20:24:21 +10:00
HenryLee
2ba554e442
Merge branch 'develop' into issue550
2017-06-05 20:24:08 +10:00
Niels Lohmann
d19c5ced4b
🐛 skipping BOM for iterators #602
...
I totally forgot about byte order marks in this scenario.
2017-06-02 12:38:32 +02:00
Niels Lohmann
c043ba6978
🔥 removed failing test #529
2017-06-01 07:32:39 +02:00
HenryLee
f2e1643039
Add test cases for iterator to const iterator assignment
2017-05-31 00:50:40 +10:00
HenryLee
c09a4cbbd7
Add test cases for iterator to const iterator conversion
2017-05-31 00:31:16 +10:00
HenryLee
0c2ed00ebe
Add missing test cases for n + it arithmetic in iterators
2017-05-29 22:39:27 +10:00
HenryLee
5b245dae06
Comment out the exception message check in operator[] of reverse iterator
2017-05-29 22:19:10 +10:00
HenryLee
a3bf0131c4
Fix some more reverse iterator arithmetic test codes
2017-05-29 19:43:45 +10:00
HenryLee
adc73d6d5f
Fix the arithmetic mistakes in reverse iterator
2017-05-29 18:52:53 +10:00
HenryLee
ed62129f8e
Override n + iterator operator in the iterator
2017-05-27 13:44:14 +10:00
Niels Lohmann
52adf3fd5b
🔨 fixed compilation
2017-05-22 22:59:57 +02:00
Niels Lohmann
9a576fe1d9
✅ added test for #367
2017-05-22 22:49:39 +02:00
Niels Lohmann
9e507dfad5
✅ tests and fix for #367
...
operator>> now works as expected.
2017-05-21 16:36:51 +02:00
Niels Lohmann
0c3ffe12cd
⏪ reverting first/second experiment #350
2017-05-15 21:07:58 +02:00
Niels Lohmann
723c875604
💬 replaced "backspace" with "backslash" #509
2017-05-13 19:56:38 +02:00
Jay Sistar
d6c78dacd8
Fixing assignement for iterator wrapper second, and adding unit test
2017-05-10 17:53:27 +00:00
Niels Lohmann
2afbd33472
🔨 working on #367
...
Test cases succeed as expected, but the example in #367 is not fully
realized yet.
2017-05-10 12:06:24 +02:00
Niels Lohmann
962da00171
✨ implemented an indentation character #520
...
An optional parameter for dump() allows to set the character to use for
indentation (default: space). In case a JSON value is serialized to an
output stream, its fill character is used (and can be set with
std::setfill).
2017-05-07 19:27:40 +02:00
Niels Lohmann
fba1bcdd0b
🐛 fixing #575
...
I forgot to consider the offset.
2017-05-07 13:41:48 +02:00
Niels Lohmann
8b9f51179e
✨ started working on #458
...
a simple acceptor function
2017-04-24 17:46:21 +02:00
Niels Lohmann
cfc2e8391c
🔨 removed too long running tests
2017-04-24 15:07:43 +02:00
Niels Lohmann
6d2c0a7928
✅ added more Unicode test cases
2017-04-23 22:54:21 +02:00
Niels Lohmann
734297ff45
🔨 cleanup
2017-04-23 20:32:05 +02:00
Niels Lohmann
01e05d89e9
🔨 fixed a compiler warning
...
Default arguments are forbidden in lambdas.
2017-04-23 18:40:17 +02:00
Niels Lohmann
b686cc6ad9
🔨 removed #ifdefs
2017-04-23 18:34:14 +02:00
Niels Lohmann
5febd04a26
🐛 fixed test suite
2017-04-23 18:22:35 +02:00
Niels Lohmann
4aedae400e
✅ added exhaustive UTF-8 tests
...
Creates all well-formed sequences of bytes up to length 4. Furthermore,
creates ill-formed sequences by removing required trailing bytes or
changing bytes. As the tests can take a lot of time, preprocessor
symbols are introduced.
2017-04-23 15:12:50 +02:00
Niels Lohmann
2a21146160
Merge branch 'develop' into feature/manual_lexer
2017-04-22 11:35:58 +02:00
Niels Lohmann
db9bf953f3
🔨 improved diagnostic output
2017-04-15 10:40:10 +02:00
Niels Lohmann
717106eced
🔨 templated output_adapter and used in class serializer
2017-04-14 19:49:05 +02:00
Niels Lohmann
186a9fd44d
🔨 simplified interface for parser, lexer, and binary_reader
...
These classes are now constructed with an interface adapter. This moves
complexity from various places into the interface adapter class, or to
some factories which now implement the different flavors of input.
Furthermore, input adapters are kept in std::shared_ptr to avoid the
need of manual deletion.
2017-04-09 19:28:15 +02:00
Niels Lohmann
6f99d5b2e9
🔨 fixed test case
...
One test case for CBOR and MessagePack assumed little endianess.
2017-04-08 23:39:17 +02:00
Niels Lohmann
97a25de938
✨ proposal for #428
...
This implementation forwards the iterators to std::map::insert.
2017-04-07 18:29:09 +02:00
Niels Lohmann
d62d48fc48
🔀 merge branch 'develop' into feature/manual_lexer
2017-04-07 17:19:52 +02:00
Niels Lohmann
90273e930c
🐛 fix for #512
...
We totally forgot to implement the comparison operators other than ==
and != for scalar types. Consequently, comparing a JSON value with a
scalar type led to compile errors.
2017-04-07 15:44:41 +02:00
Niels Lohmann
b15fc13dd1
🔨 implemented MessagePack in binary_reader
2017-04-04 16:59:19 +02:00
Niels Lohmann
3a34f2d82c
Merge branch 'develop' into feature/manual_lexer
2017-04-04 15:55:40 +02:00
Niels Lohmann
89efe627fe
🔨 a lot of restructuring
...
- removed uncached input stream adapter; it was too slow anyway
- implemented a class binary_read which parses CBOR based on input
adapters
- in the CBOR parser, numbers are created via memcpy to avoid undefined
behavior
2017-04-02 18:46:21 +02:00
Théo DELRIEU
af9b21151c
add enum class default conversions
2017-04-02 13:10:15 +02:00
Niels Lohmann
3a5cf9bd0a
🔨 improved code coverage
2017-04-01 08:34:58 +02:00
Niels Lohmann
50ee0a62f5
🔨 replaced lookup-tables by switches
2017-03-31 23:24:33 +02:00
Niels Lohmann
60057a4728
🔨 fixed bugs introduced by merging from develop
2017-03-29 07:54:26 +02:00
Niels Lohmann
a690a9f2d2
Merge branch 'develop' into feature/manual_lexer
2017-03-29 00:57:09 +02:00
Niels Lohmann
c2e80a72d7
🔨 deprecated j << istream / j >> ostream functions #367
...
The implementation is non-standard. Deprecation allows a simpler API in
the future without removing any features.
2017-03-29 00:39:47 +02:00
Niels Lohmann
9578c0f700
Merge branch 'develop' into feature/manual_lexer
2017-03-28 23:47:17 +02:00
Niels Lohmann
b4dbebffcd
✅ added regression test for #464
2017-03-28 23:28:54 +02:00
Niels Lohmann
d37ca2eba8
🔨 fixed test case
2017-03-28 20:29:27 +02:00
Niels Lohmann
50e251f5f6
🔨 adjusted test case to new signature of token_type_name()
2017-03-28 20:17:00 +02:00
Niels Lohmann
bbb6bd9de5
🔨 fixing last failing test cases
2017-03-28 17:00:03 +02:00
Niels Lohmann
06e2a291b1
🔨 fixed number parsing
2017-03-26 17:26:41 +02:00
Niels Lohmann
3b069b4b4c
🔨 adjusted more expected exceptions
2017-03-26 16:19:07 +02:00
Niels Lohmann
99e0d8b339
🔨 fixed \uxxxx parsing
2017-03-26 15:29:08 +02:00
Niels Lohmann
f47cf152a8
Merge branch 'develop' into feature/manual_lexer
2017-03-26 13:14:14 +02:00
Niels Lohmann
53b501a785
🔨 cleanup
2017-03-25 23:31:03 +01:00
Niels Lohmann
cf7786887c
🔨 fixed check for is_nothrow_copy_constructible
...
We now only demand our exceptions to be is_nothrow_copy_constructible
if std::runtime_exception is.
2017-03-25 17:35:57 +01:00
Niels Lohmann
cc36c65a89
🚑 made exceptions nothrow-copy-constructible #531
...
To have nothrow-copy-constructible exceptions, we inherit from
std::runtime_error which can cope with arbitrary-length error messages.
Intermediate strings are built with static functions and then passed to
the actual constructor.
2017-03-25 16:22:52 +01:00
Niels Lohmann
40160f482a
🚧 manual lexer
...
This commit removed the re2c lexer and replaced it by a manual version.
Its integration is not yet complete: number parsing does not respect
locales or overflows. Furthermore, parsing does not need to end with
EOF. Therefore, a lot of test cases fail. The idea is to push this
branch forward so we can conduct performance comparisons. So far, a
nice side effect are better diagnosis messages in case of parse errors.
2017-03-24 19:49:02 +01:00
Niels Lohmann
31a6c0910e
🚑 fix for #519
...
Added catch branch for out_of_range exception that can occur if input
file contains a number overflow.
2017-03-17 22:18:48 +01:00
Niels Lohmann
f547679de5
🚑 fix for #516 and #518
...
We should compare the binary serializations rather than the JSON values
themselves. This fix was already done for CBOR and apparently forgotten
for MessagePack.
2017-03-17 22:18:05 +01:00
Niels Lohmann
cd43600e6f
💄 cleanup after #508
2017-03-16 19:02:05 +01:00
Niels Lohmann
773b33e016
Merge pull request #508 from theodelrieu/feature/c_array_conversion
...
add to_json method for C arrays
2017-03-16 19:00:58 +01:00
Niels Lohmann
c5711f3072
🚧 a lot of minor changes
...
- Removed unused headers.
- Added override where needed.
- Added description for parse_error.113 exception.
- Fixed some conversion warnings.
- Integrated cbor_expect_string function for CBOR maps.
- Added documentation on the supported CBOR/MessagePack features.
- Added test to check all initial bytes for CBOR input.
2017-03-16 18:39:33 +01:00
Théo DELRIEU
dbebf8de47
add to_json method for C arrays
...
If the array can be converted to basic_json::string_t, the overload
in this commit is not chosen.
2017-03-16 15:20:39 +01:00
Niels Lohmann
1de80e8af4
🔨 added user-defined exception #493
...
Replaced old std::invalid_argument exception by parse_error.111 to have
unified exceptions in case of input stream errors.
2017-03-14 21:31:36 +01:00
Niels Lohmann
63c2c62f19
🔨 changed call from "not good()" to "fail()" #493
...
Also merged develop into this feature branch.
2017-03-14 21:24:53 +01:00
Niels Lohmann
b026591e9e
🚑 added special case to fuzzers to fix #504
...
Since #329 , NaN and inf numbers do not yield an exception, but are
stored internally and are dumped as “null”. This commit adjusts the
fuzz testers to deal with this special case.
2017-03-14 21:05:38 +01:00
Niels Lohmann
bfe4788e32
🚑 fix for #500
...
Removed a check that already failed in MSVC.
2017-03-14 16:14:05 +01:00
Niels Lohmann
84072fbd6d
💄 fixed indentation
2017-03-14 16:07:28 +01:00
Niels Lohmann
c5cf32e34d
🔨 added user-defined exception 406
2017-03-12 20:59:33 +01:00
Niels Lohmann
855cdcf05c
🔀 merge branch 'develop' into feature/exceptions_3.0.0
2017-03-12 20:22:30 +01:00
Niels Lohmann
8feaf8dc94
💥 implemented new handling of NaN and INF #70 #329 #388
...
- If an overflow occurs during parsing a number from a JSON text, an
exception (std::out_of_range for the moment, to be replaced by a
user-defined exception #244 ) is thrown so that the overflow is detected
early and roundtripping is guaranteed.
- NaN and INF floating-point values can be stored in a JSON value and
are not replaced by null. That is, the basic_json class behaves like
double in this regard (no exception occurs). However, NaN and INF are
serialized to “null”.
- Adjusted test cases appropriately.
2017-03-12 18:38:05 +01:00
Niels Lohmann
87eafd8d6a
✅ added regression tests for #473
...
These tests currently pass without any adjustments to the source code.
2017-03-12 15:20:17 +01:00
Niels Lohmann
89f6068385
Merge branch 'develop' into feature/exceptions_3.0.0
2017-03-12 11:51:24 +01:00
Niels Lohmann
4d7c29923e
🚑 fix for #486
...
Implemented std::less<value_t> to allow using value_t as std::map key
in MSVC.
2017-03-12 10:40:36 +01:00
Niels Lohmann
4e49829851
🚑 fix for #493
...
Added a test to check if the input stream is good() before executing
getline on it. Also added two test cases that set the failbit and
badbit before calling file_line_buffer.
2017-03-11 19:26:12 +01:00
Niels Lohmann
ff0b18d10c
Merge branch 'feature/vector_bool' into develop
2017-03-11 17:22:14 +01:00
Niels Lohmann
c7afb34e57
🎨 cleanup after #496
...
Ran “make pretty” and added a note to the README file.
2017-03-11 16:01:26 +01:00
Niels Lohmann
f4126e4dd8
✨ added overload for std::less<value_t> #486
...
MSVC needs this overload to compile code containing a std::map that
uses nlohmann::detail::operator as key.
2017-03-11 15:44:14 +01:00
Niels Lohmann
f5f6dac800
✨ added overload for std::vector<bool> #494
...
Adds a to_json function for std::vector<bool> to allow implicit
conversion from bit vectors to basic_json.
2017-03-11 15:32:44 +01:00
Ted Lyngmo
9cfb777b65
Fix -Weffc++ warnings (GNU 6.3.1)
2017-03-11 13:56:38 +01:00
Niels Lohmann
758c4addc1
🚑 fix for #492
...
The original test case relied on an invalidated iterator. This error
did not occur before, but only with GCC with -D_GLIBCXX_DEBUG. This
commit fixes the test case. The library is unaffected by this change.
2017-03-09 18:20:26 +01:00
Niels Lohmann
9374eaa013
🔨 added user-defined exception 501
2017-03-08 19:16:53 +01:00
Niels Lohmann
c8a6ce79ea
🚑 fixing fuzzers to work with new exceptions
2017-03-08 18:37:03 +01:00
Niels Lohmann
fc9b528ec9
🔨 changed an exception
2017-03-08 18:07:21 +01:00
Niels Lohmann
8fcd01631f
✅ improved test coverage
...
Tests for parse_error.109 were missing.
2017-03-08 16:39:17 +01:00
Niels Lohmann
625cf7e3f7
🔨 added user-defined exception 112
2017-03-07 20:05:34 +01:00
Niels Lohmann
5407333224
🔨 added user-defined exception 111
2017-03-06 22:37:46 +01:00
Niels Lohmann
21ec0e7806
🔨 added user-defined exception 110
2017-03-06 21:00:13 +01:00
Niels Lohmann
a186106bde
🔨 user-defined exception 302
...
Also moved all exception classes into the detail namespace and
introduced them via “using” into basic_json.
2017-03-06 19:34:44 +01:00
Niels Lohmann
38c2e20ce8
added user-defined exceptions 404-405
2017-03-05 23:25:22 +01:00
Niels Lohmann
30331fa21f
🔨 added user-defined exception 403
2017-03-05 23:16:17 +01:00
Niels Lohmann
60da36aee2
🔨 added user-defined exceptions 401-402
2017-03-05 22:56:39 +01:00
Niels Lohmann
491c9780a7
🔨 added user-defined exception 311
2017-03-05 22:39:21 +01:00
Niels Lohmann
6751d650be
🔨 added user-defined exception 311
2017-03-05 22:31:08 +01:00
Niels Lohmann
9e560ca40c
🔨 added user-defined exceptions 313-315
2017-03-05 19:58:26 +01:00
Niels Lohmann
144cf6a4c7
🔨 added user-defined exceptions 310
2017-03-05 19:48:11 +01:00
Niels Lohmann
5cca44c161
🔨 added user-defined exceptions 309
2017-03-05 19:42:05 +01:00