diff options
Diffstat (limited to 'libparc/parc/algol/parc_JSONParser.h')
-rwxr-xr-x | libparc/parc/algol/parc_JSONParser.h | 309 |
1 files changed, 309 insertions, 0 deletions
diff --git a/libparc/parc/algol/parc_JSONParser.h b/libparc/parc/algol/parc_JSONParser.h new file mode 100755 index 00000000..18ee9d1a --- /dev/null +++ b/libparc/parc/algol/parc_JSONParser.h @@ -0,0 +1,309 @@ +/* + * Copyright (c) 2017 Cisco and/or its affiliates. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @file parc_JSONParser.h + * @brief A JSON parser + * @ingroup inputoutput + * + */ +#ifndef PARC_Library_parc_JSONParser_h +#define PARC_Library_parc_JSONParser_h + +struct parc_buffer_parser; +typedef struct parc_buffer_parser PARCJSONParser; + +#include <parc/algol/parc_Buffer.h> + +/** + * @def parcJSONValue_OptionalAssertValid + * Optional validation of the given instance. + * + * Define `PARCLibrary_DISABLE_VALIDATION` to nullify validation. + */ +#ifdef PARCLibrary_DISABLE_VALIDATION +# define parcJSONParser_OptionalAssertValid(_instance_) +#else +# define parcJSONParser_OptionalAssertValid(_instance_) parcJSONParser_AssertValid(_instance_) +#endif + + +/** + * Create a new `PARCJSONParser`. + * + * @param [in] buffer A pointer to a {@link PARCBuffer} containing the data to parse. + * + * @return non-NULL A pointer to a valid `PARCJSONParser`. + * + * Example: + * @code + * { + * PARCBuffer *buffer = parcBuffer_WrapCString(" { \"name\" : 123 }"); + * + * PARCJSONParser *parser = parcJSONParser_Create(buffer); + * + * parcJSONParser_Release(&parser); + * parcBuffer_Release(&buffer); + * } + * @endcode + */ +PARCJSONParser *parcJSONParser_Create(PARCBuffer *buffer); + +/** + * Assert that an instance of `PARCJSONParser` is valid. + * + * If the instance is not valid, terminate via {@link trapIllegalValue()} + * + * Valid means the internal state of the type is consistent with its required current or future behaviour. + * This may include the validation of internal instances of types. + * + * @param [in] parser A pointer to a `PARCJSONParser` instance. + */ +void parcJSONParser_AssertValid(const PARCJSONParser *parser); + +/** + * Increase the number of references to a `PARCJSONParser`. + * + * Note that new `PARCJSONParser` is not created, + * only that the given `PARCJSONParser` reference count is incremented. + * Discard the reference by invoking {@link parcJSONParser_Release}. + * + * @param parser A pointer to the original instance. + * @return The value of the input parameter @p parser. + * + * Example: + * @code + * { + * PARCBuffer *buffer = parcBuffer_WrapCString(" { \"name\" : 123 }"); + * + * PARCJSONParser *parser = parcJSONParser_Create(buffer); + * PARCJSONParser *x2 = parcJSONParser_Acquire(parser); + * + * parcJSONParser_Release(&parser); + * parcJSONParser_Release(&x2); + * } + * @endcode + * + * @see parcJSONParser_Release + */ +PARCJSONParser *parcJSONParser_Acquire(const PARCJSONParser *parser); + +/** + * Release a previously acquired reference to the specified instance, + * decrementing the reference count for the instance. + * + * The pointer to the instance is set to NULL as a side-effect of this function. + * + * If the invocation causes the last reference to the instance to be released, + * the instance is deallocated and the instance's implementation will perform + * additional cleanup and release other privately held references. + * + * The contents of the dealloced memory used for the PARC object are undefined. + * Do not reference the object after the last release. + * + * @param [in,out] parserPtr A pointer to a pointer to the instance of `PARCJSONParser` to release. + * + * Example: + * @code + * { + * PARCBuffer *buffer = parcBuffer_WrapCString(" { \"name\" : 123 }"); + * + * PARCJSONParser *parser = parcJSONParser_Create(buffer); + * + * parcJSONParser_Release(&parser); + * } + * @endcode + */ +void parcJSONParser_Release(PARCJSONParser **parserPtr); + +/** + * Advance the parser, skipping any ignored characters. + * + * Ignored characters are space, tab and new-line. + * + * @param [in] parser A pointer to a `PARCJSONParser` instance. + * + * Example: + * @code + * { + * PARCBuffer *buffer = parcBuffer_WrapCString(" { \"name\" : 123 }"); + * + * PARCJSONParser *parser = parcJSONParser_Create(buffer); + * parcJSONParser_SkipIgnored(parser); + * + * parcJSONParser_Release(&parser); + * } + * @endcode + */ +void parcJSONParser_SkipIgnored(PARCJSONParser *parser); + +/** + * Get the next character from the parser. + * + * @param [in] parser A pointer to a `PARCJSONParser` instance. + * + * @return The next character + * + * Example: + * @code + * { + * PARCBuffer *buffer = parcBuffer_WrapCString(" { \"name\" : 123 }"); + * + * PARCJSONParser *parser = parcJSONParser_Create(buffer); + * char c = parcJSONParser_NextChar(parser); + * + * parcJSONParser_Release(&parser); + * } + * @endcode + */ +char parcJSONParser_NextChar(PARCJSONParser *parser); + +/** + * Get the next character from the parser, returning true or false if successful. + * + * @param [in] parser A pointer to a `PARCJSONParser` instance. + * @param [out] value A pointer to a `char` to contain the value if successful. + * + * @return true If successful + * @return false If unsuccessful + * + * Example: + * @code + * { + * PARCBuffer *buffer = parcBuffer_WrapCString(" { \"name\" : 123 }"); + * + * PARCJSONParser *parser = parcJSONParser_Create(buffer); + * bool success = parcJSONParser_Next(parser, &c); + * + * parcJSONParser_Release(&parser); + * } + * @endcode + */ +bool parcJSONParser_Next(PARCJSONParser *parser, char *value); + +/** + * Get the next character that the parser will process, but do not process it nor advance the parser. + * + * @param [in] parser A pointer to a `PARCJSONParser` instance. + * + * @return The next character that the parser will process. + * + * Example: + * @code + * { + * PARCBuffer *buffer = parcBuffer_WrapCString(" { \"name\" : 123 }"); + * + * PARCJSONParser *parser = parcJSONParser_Create(buffer); + * char c = parcJSONParser_PeekNextChar(parser); + * + * parcJSONParser_Release(&parser); + * } + * @endcode + */ +char parcJSONParser_PeekNextChar(PARCJSONParser *parser); + +/** + * Advance the position of the parser forward or backward by the given number of bytes. + * + * To advance forward, bytes is a positive value. + * To advance backwards, bytes is a negative value. + * + * @param [in] parser A pointer to a valid `PARCJSONParser`. + * @param [in] bytes The number of bytes to move forward or backward. + * + * Example: + * @code + * { + * PARCBuffer *buffer = parcBuffer_WrapCString("abcdef"); + * + * PARCJSONParser *parser = parcJSONParser_Create(buffer); + * parcJSONParser_Advance(parser, 2); + * + * parcJSONParser_Release(&parser); + * } + * @endcode + */ +void parcJSONParser_Advance(PARCJSONParser *parser, long bytes); + +/** + * Get the number of characters remaining to be parsed. + * + * @param [in] parser A pointer to a valid `PARCJSONParser` instance + * + * @return The number of characters remaining to be parsed. + * + * Example: + * @code + * { + * PARCBuffer *buffer = parcBuffer_WrapCString("true); + * + * PARCJSONParser *parser = parcJSONParser_Create(buffer); + * size_t remaining = parcJSONParser_Remaining(parser); + * + * parcJSONParser_Release(&parser); + * } + * @endcode + */ +size_t parcJSONParser_Remaining(const PARCJSONParser *parser); + +/** + * Require the fixed string to appear in the current position of the parser. + * + * @param [in] parser A pointer to a `PARCJSONParser` instance. + * @param [in] string A pointer to a null-terminated C-string that must appear at the current position of the parser. + * + * @return true If the string appears. + * @return false If the string does not appear + * + * Example: + * @code + * { + * PARCBuffer *buffer = parcBuffer_WrapCString("true"); + * + * PARCJSONParser *parser = parcJSONParser_Create(buffer); + * bool result = parcJSONParser_RequireString(parser, "true"); + * + * parcJSONParser_Release(&parser); + * parcBuffer_Release(&buffer); + * } + * @endcode + */ +bool parcJSONParser_RequireString(PARCJSONParser *parser, const char *string); + +/** + * Parse a JSON string returning a {@link PARCBuffer} containing the parsed string. + * + * A JSON string begins and ends with a non-escaped double-quote character. + * + * @param [in] parser A pointer to a `PARCJSONParser` instance. + * + * @return non-NULL A pointer to a valid `PARCBuffer`. + * @return NULL An error occurred. + * + * Example: + * @code + * { + * PARCBuffer *buffer = parcBuffer_WrapCString("\"name\" : 123"); + * + * PARCJSONParser *parser = parcJSONParser_Create(buffer); + * PARCBuffer *theName = parcJSONParser_ParseString(parser); + * + * parcJSONParser_Release(&parser); + * } + * @endcode + */ +PARCBuffer *parcJSONParser_ParseString(PARCJSONParser *parser); + +#endif |