All checks were successful
		
		
	
	continuous-integration/drone/push Build is passing
				
			changed multiple open functions to accept hawk_errinfo_t* instead of hawk_errnum_t*
		
			
				
	
	
		
			339 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			339 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|     Copyright (c) 2006-2020 Chung, Hyung-Hwan. All rights reserved.
 | |
| 
 | |
|     Redistribution and use in source and binary forms, with or without
 | |
|     modification, are permitted provided that the following conditions
 | |
|     are met:
 | |
|     1. Redistributions of source code must retain the above copyright
 | |
|        notice, this list of conditions and the following disclaimer.
 | |
|     2. Redistributions in binary form must reproduce the above copyright
 | |
|        notice, this list of conditions and the following disclaimer in the
 | |
|        documentation and/or other materials provided with the distribution.
 | |
| 
 | |
|     THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
 | |
|     IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 | |
|     OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 | |
|     IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 | |
|     INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 | |
|     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | |
|     DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | |
|     THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | |
|     (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 | |
|     THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | |
|  */
 | |
| 
 | |
| #ifndef _HAWK_JSON_H_
 | |
| #define _HAWK_JSON_H_
 | |
| 
 | |
| #include <hawk-cmn.h>
 | |
| #include <hawk-gem.h>
 | |
| 
 | |
| /**
 | |
|  * The hawk_json_t type defines a simple json parser.
 | |
|  */
 | |
| typedef struct hawk_json_t hawk_json_t;
 | |
| 
 | |
| #define HAWK_JSON_HDR \
 | |
| 	hawk_oow_t _instsize; \
 | |
| 	hawk_gem_t _gem
 | |
| 
 | |
| typedef struct hawk_json_alt_t hawk_json_alt_t;
 | |
| struct hawk_json_alt_t
 | |
| {
 | |
| 	/* ensure that hawk_json_t matches the beginning part of hawk_json_t */
 | |
| 	HAWK_JSON_HDR;
 | |
| };
 | |
| 
 | |
| enum hawk_json_option_t
 | |
| {
 | |
| 	HAWK_JSON_TRAIT
 | |
| };
 | |
| typedef enum hawk_json_option_t hawk_json_option_t;
 | |
| 
 | |
| enum hawk_json_trait_t
 | |
| {
 | |
| 	/* no trait defined at this moment. XXXX is just a placeholder */
 | |
| 	HAWK_JSON_XXXX  = (1 << 0)
 | |
| };
 | |
| typedef enum hawk_json_trait_t hawk_json_trait_t;
 | |
| 
 | |
| /* ========================================================================= */
 | |
| 
 | |
| enum hawk_json_state_t
 | |
| {
 | |
| 	HAWK_JSON_STATE_START,
 | |
| 	HAWK_JSON_STATE_IN_ARRAY,
 | |
| 	HAWK_JSON_STATE_IN_DIC,
 | |
| 
 | |
| 	HAWK_JSON_STATE_IN_WORD_VALUE,
 | |
| 	HAWK_JSON_STATE_IN_NUMERIC_VALUE,
 | |
| 	HAWK_JSON_STATE_IN_STRING_VALUE,
 | |
| 	HAWK_JSON_STATE_IN_CHARACTER_VALUE
 | |
| };
 | |
| typedef enum hawk_json_state_t hawk_json_state_t;
 | |
| 
 | |
| 
 | |
| /* ========================================================================= */
 | |
| enum hawk_json_inst_t
 | |
| {
 | |
| 	HAWK_JSON_INST_START_ARRAY,
 | |
| 	HAWK_JSON_INST_END_ARRAY,
 | |
| 	HAWK_JSON_INST_START_DIC,
 | |
| 	HAWK_JSON_INST_END_DIC,
 | |
| 
 | |
| 	HAWK_JSON_INST_KEY,
 | |
| 
 | |
| 	HAWK_JSON_INST_CHARACTER, /* there is no such element as character in real JSON */
 | |
| 	HAWK_JSON_INST_STRING,
 | |
| 	HAWK_JSON_INST_NUMBER,
 | |
| 	HAWK_JSON_INST_NIL,
 | |
| 	HAWK_JSON_INST_TRUE,
 | |
| 	HAWK_JSON_INST_FALSE,
 | |
| };
 | |
| typedef enum hawk_json_inst_t hawk_json_inst_t;
 | |
| 
 | |
| typedef int (*hawk_json_instcb_t) (
 | |
| 	hawk_json_t*           json,
 | |
| 	hawk_json_inst_t       inst,
 | |
| 	const hawk_oocs_t*     str
 | |
| );
 | |
| 
 | |
| struct hawk_json_prim_t
 | |
| {
 | |
| 	hawk_json_instcb_t        instcb;
 | |
| };
 | |
| typedef struct hawk_json_prim_t hawk_json_prim_t;
 | |
| 
 | |
| /* ========================================================================= */
 | |
| 
 | |
| #if defined(__cplusplus)
 | |
| extern "C" {
 | |
| #endif
 | |
| 
 | |
| HAWK_EXPORT hawk_json_t* hawk_json_open (
 | |
| 	hawk_mmgr_t*          mmgr,
 | |
| 	hawk_oow_t            xtnsize,
 | |
| 	hawk_cmgr_t*          cmgr,
 | |
| 	hawk_json_prim_t*     prim,
 | |
| 	hawk_errinf_t*        errinf
 | |
| );
 | |
| 
 | |
| HAWK_EXPORT void hawk_json_close (
 | |
| 	hawk_json_t* json
 | |
| );
 | |
| 
 | |
| HAWK_EXPORT void hawk_json_reset (
 | |
| 	hawk_json_t* json
 | |
| );
 | |
| 
 | |
| HAWK_EXPORT int hawk_json_feedbchars (
 | |
| 	hawk_json_t*      json,
 | |
| 	const hawk_bch_t* ptr,
 | |
| 	hawk_oow_t        len,
 | |
| 	hawk_oow_t*       xlen
 | |
| );
 | |
| 
 | |
| HAWK_EXPORT int hawk_json_feeduchars (
 | |
| 	hawk_json_t*      json,
 | |
| 	const hawk_uch_t* ptr,
 | |
| 	hawk_oow_t        len,
 | |
| 	hawk_oow_t*       xlen
 | |
| );
 | |
| 
 | |
| #if defined(HAWK_OOCH_IS_UCH)
 | |
| #	define hawk_json_feed hawk_json_feeduchars
 | |
| #else
 | |
| #	define hawk_json_feed hawk_json_feedbchars
 | |
| #endif
 | |
| 
 | |
| HAWK_EXPORT hawk_json_state_t hawk_json_getstate (
 | |
| 	hawk_json_t* json
 | |
| );
 | |
| 
 | |
| HAWK_EXPORT int hawk_json_setoption (
 | |
| 	hawk_json_t*         json,
 | |
| 	hawk_json_option_t   id,
 | |
| 	const void*          value
 | |
| );
 | |
| 
 | |
| HAWK_EXPORT int hawk_json_getoption (
 | |
| 	hawk_json_t*         json,
 | |
| 	hawk_json_option_t   id,
 | |
| 	void*                value
 | |
| );
 | |
| 
 | |
| /* ------------------------------------------------------------------------- */
 | |
| 
 | |
| #if defined(HAWK_HAVE_INLINE)
 | |
| /**
 | |
|  * The hawk_json_getxtn() function returns the pointer to the extension area
 | |
|  * placed behind the actual json object.
 | |
|  */
 | |
| static HAWK_INLINE void* hawk_json_getxtn (hawk_json_t* json) { return (void*)((hawk_uint8_t*)json + ((hawk_json_alt_t*)json)->_instsize); }
 | |
| 
 | |
| /**
 | |
|  * The hawk_json_getgem() function gets the pointer to the gem structure of the
 | |
|  * json object.
 | |
|  */
 | |
| static HAWK_INLINE hawk_gem_t* hawk_json_getgem (hawk_json_t* json) { return &((hawk_json_alt_t*)json)->_gem; }
 | |
| 
 | |
| /**
 | |
|  * The hawk_json_getmmgr() function gets the memory manager ujson in
 | |
|  * hawk_json_open().
 | |
|  */
 | |
| static HAWK_INLINE hawk_mmgr_t* hawk_json_getmmgr (hawk_json_t* json) { return ((hawk_json_alt_t*)json)->_gem.mmgr; }
 | |
| static HAWK_INLINE hawk_cmgr_t* hawk_json_getcmgr (hawk_json_t* json) { return ((hawk_json_alt_t*)json)->_gem.cmgr; }
 | |
| static HAWK_INLINE void hawk_json_setcmgr (hawk_json_t* json, hawk_cmgr_t* cmgr) { ((hawk_json_alt_t*)json)->_gem.cmgr = cmgr; }
 | |
| #else
 | |
| #define hawk_json_getxtn(json) ((void*)((hawk_uint8_t*)json + ((hawk_json_alt_t*)json)->_instsize))
 | |
| #define hawk_json_getgem(json) (&((hawk_json_alt_t*)(json))->_gem)
 | |
| #define hawk_json_getmmgr(json) (((hawk_json_alt_t*)(json))->_gem.mmgr)
 | |
| #define hawk_json_getcmgr(json) (((hawk_json_alt_t*)(json))->_gem.cmgr)
 | |
| #define hawk_json_setcmgr(json,_cmgr) (((hawk_json_alt_t*)(json))->_gem.cmgr = (_cmgr))
 | |
| #endif /* HAWK_HAVE_INLINE */
 | |
| 
 | |
| /**
 | |
|  * The hawk_json_geterrnum() function returns the number of the last error
 | |
|  * occurred.
 | |
|  * \return error number
 | |
|  */
 | |
| 
 | |
| /**
 | |
|  * The hawk_json_geterror() function gets an error number, an error location,
 | |
|  * and an error message. The information is set to the memory area pointed
 | |
|  * to by each parameter.
 | |
|  */
 | |
| #if defined(HAWK_HAVE_INLINE)
 | |
| static HAWK_INLINE hawk_errnum_t hawk_json_geterrnum (hawk_json_t* json) { return hawk_gem_geterrnum(hawk_json_getgem(json)); }
 | |
| static HAWK_INLINE const hawk_loc_t* hawk_json_geterrloc (hawk_json_t* json) { return hawk_gem_geterrloc(hawk_json_getgem(json)); }
 | |
| static HAWK_INLINE const hawk_bch_t* hawk_json_geterrbmsg (hawk_json_t* json) { return hawk_gem_geterrbmsg(hawk_json_getgem(json)); }
 | |
| static HAWK_INLINE const hawk_uch_t* hawk_json_geterrumsg (hawk_json_t* json) { return hawk_gem_geterrumsg(hawk_json_getgem(json)); }
 | |
| static HAWK_INLINE void hawk_json_geterrbinf (hawk_json_t* json, hawk_errbinf_t* errinf) { return hawk_gem_geterrbinf(hawk_json_getgem(json), errinf); }
 | |
| static HAWK_INLINE void hawk_json_geterruinf (hawk_json_t* json, hawk_erruinf_t* errinf) { return hawk_gem_geterruinf(hawk_json_getgem(json), errinf); }
 | |
| static HAWK_INLINE void hawk_json_geterror (hawk_json_t* json, hawk_errnum_t* errnum, const hawk_ooch_t** errmsg, hawk_loc_t* errloc) { return hawk_gem_geterror(hawk_json_getgem(json), errnum, errmsg, errloc); }
 | |
| #else
 | |
| #define hawk_json_geterrnum(json) hawk_gem_geterrnum(hawk_json_getgem(json))
 | |
| #define hawk_json_geterrloc(json) hawk_gem_geterrloc(hawk_json_getgem(json))
 | |
| #define hawk_json_geterrbmsg(json) hawk_gem_geterrbmsg(hawk_json_getgem(json))
 | |
| #define hawk_json_geterrumsg(json) hawk_gem_geterrumsg(hawk_json_getgem(json))
 | |
| #define hawk_json_geterrbinf(json, errinf) (hawk_gem_geterrbinf(hawk_json_getgem(json), errinf))
 | |
| #define hawk_json_geterruinf(json, errinf) (hawk_gem_geterruinf(hawk_json_getgem(json), errinf))
 | |
| #define hawk_json_geterror(json, errnum, errmsg, errloc) (hawk_gem_geterror(hawk_json_getgem(json), errnum, errmsg, errloc))
 | |
| #endif
 | |
| 
 | |
| #if defined(HAWK_OOCH_IS_UCH)
 | |
| #	define hawk_json_geterrmsg hawk_json_geterrumsg
 | |
| #	define hawk_json_geterrinf hawk_json_geterruinf
 | |
| #else
 | |
| #	define hawk_json_geterrmsg hawk_json_geterrbmsg
 | |
| #	define hawk_json_geterrinf hawk_json_geterrbinf
 | |
| #endif
 | |
| 
 | |
| 
 | |
| /**
 | |
|  * The hawk_json_seterrnum() function sets the error information omitting
 | |
|  * error location. You must pass a non-NULL for \a errarg if the specified
 | |
|  * error number \a errnum requires one or more arguments to format an
 | |
|  * error message.
 | |
|  */
 | |
| #if defined(HAWK_HAVE_INLINE)
 | |
| static HAWK_INLINE void hawk_json_seterrnum (hawk_json_t* json, const hawk_loc_t* errloc, hawk_errnum_t errnum) { hawk_gem_seterrnum (hawk_json_getgem(json), errloc, errnum); }
 | |
| static HAWK_INLINE void hawk_json_seterrinf (hawk_json_t* json, const hawk_errinf_t* errinf) { hawk_gem_seterrinf (hawk_json_getgem(json), errinf); }
 | |
| static HAWK_INLINE void hawk_json_seterror (hawk_json_t* json, const hawk_loc_t*  errloc, hawk_errnum_t errnum, const hawk_oocs_t* errarg) { hawk_gem_seterror(hawk_json_getgem(json), errloc, errnum, errarg); }
 | |
| static HAWK_INLINE const hawk_ooch_t* hawk_json_backuperrmsg (hawk_json_t* json) { return hawk_gem_backuperrmsg(hawk_json_getgem(json)); }
 | |
| #else
 | |
| #define hawk_json_seterrnum(json, errloc, errnum) hawk_gem_seterrnum(hawk_json_getgem(json), errloc, errnum)
 | |
| #define hawk_json_seterrinf(json, errinf) hawk_gem_seterrinf(hawk_json_getgem(json), errinf)
 | |
| #define hawk_json_seterror(json, errloc, errnum, errarg) hawk_gem_seterror(hawk_json_getgem(json), errloc, errnum, errarg)
 | |
| #define hawk_json_backuperrmsg(json) hawk_gem_backuperrmsg(hawk_json_getgem(json))
 | |
| #endif
 | |
| 
 | |
| HAWK_EXPORT void hawk_json_seterrbfmt (
 | |
| 	hawk_json_t*       json,
 | |
| 	const hawk_loc_t* errloc,
 | |
| 	hawk_errnum_t     errnum,
 | |
| 	const hawk_bch_t* fmt,
 | |
| 	...
 | |
| );
 | |
| 
 | |
| HAWK_EXPORT void hawk_json_seterrufmt (
 | |
| 	hawk_json_t*       json,
 | |
| 	const hawk_loc_t* errloc,
 | |
| 	hawk_errnum_t     errnum,
 | |
| 	const hawk_uch_t* fmt,
 | |
| 	...
 | |
| );
 | |
| 
 | |
| 
 | |
| HAWK_EXPORT void hawk_json_seterrbvfmt (
 | |
| 	hawk_json_t*         json,
 | |
| 	const hawk_loc_t*   errloc,
 | |
| 	hawk_errnum_t       errnum,
 | |
| 	const hawk_bch_t*   errfmt,
 | |
| 	va_list             ap
 | |
| );
 | |
| 
 | |
| HAWK_EXPORT void hawk_json_seterruvfmt (
 | |
| 	hawk_json_t*         json,
 | |
| 	const hawk_loc_t*   errloc,
 | |
| 	hawk_errnum_t       errnum,
 | |
| 	const hawk_uch_t*   errfmt,
 | |
| 	va_list             ap
 | |
| );
 | |
| 
 | |
| /* ------------------------------------------------------------------------- */
 | |
| 
 | |
| HAWK_EXPORT void* hawk_json_allocmem (
 | |
| 	hawk_json_t* json,
 | |
| 	hawk_oow_t   size
 | |
| );
 | |
| 
 | |
| HAWK_EXPORT void* hawk_json_callocmem (
 | |
| 	hawk_json_t* json,
 | |
| 	hawk_oow_t   size
 | |
| );
 | |
| 
 | |
| HAWK_EXPORT void* hawk_json_reallocmem (
 | |
| 	hawk_json_t*  json,
 | |
| 	void*         ptr,
 | |
| 	hawk_oow_t    size
 | |
| );
 | |
| 
 | |
| HAWK_EXPORT void hawk_json_freemem (
 | |
| 	hawk_json_t* json,
 | |
| 	void*        ptr
 | |
| );
 | |
| 
 | |
| /* ------------------------------------------------------------------------- */
 | |
| 
 | |
| /**
 | |
|  * The hawk_json_openstd() function creates a stream editor with the default
 | |
|  * memory manager and initializes it.
 | |
|  * \return pointer to a stream editor on success, #HAWK_NULL on failure.
 | |
|  */
 | |
| HAWK_EXPORT hawk_json_t* hawk_json_openstd (
 | |
| 	hawk_oow_t        xtnsize,  /**< extension size in bytes */
 | |
| 	hawk_json_prim_t* prim,
 | |
| 	hawk_errinf_t*    errinf
 | |
| );
 | |
| 
 | |
| /**
 | |
|  * The hawk_json_openstdwithmmgr() function creates a stream editor with a
 | |
|  * user-defined memory manager. It is equivalent to hawk_json_openstd(),
 | |
|  * except that you can specify your own memory manager.
 | |
|  * \return pointer to a stream editor on success, #HAWK_NULL on failure.
 | |
|  */
 | |
| HAWK_EXPORT hawk_json_t* hawk_json_openstdwithmmgr (
 | |
| 	hawk_mmgr_t*      mmgr,     /**< memory manager */
 | |
| 	hawk_oow_t        xtnsize,  /**< extension size in bytes */
 | |
| 	hawk_cmgr_t*      cmgr,
 | |
| 	hawk_json_prim_t* prim,
 | |
| 	hawk_errinf_t*    errinf
 | |
| );
 | |
| 
 | |
| #if defined(__cplusplus)
 | |
| }
 | |
| #endif
 | |
| 
 | |
| #endif
 |