eco2d/code/vendors/cwpack/cwpack.h

181 lines
6.2 KiB
C

/* CWPack - cwpack.h */
/*
The MIT License (MIT)
Copyright (c) 2017 Claes Wihlborg
Permission is hereby granted, free of charge, to any person obtaining a copy of this
software and associated documentation files (the "Software"), to deal in the Software
without restriction, including without limitation the rights to use, copy, modify,
merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit
persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or
substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#ifndef CWPack_H__
#define CWPack_H__
#include <stdint.h>
#include <stdbool.h>
#include <time.h>
/******************************* Return Codes *****************************/
#define CWP_RC_OK 0
#define CWP_RC_END_OF_INPUT -1
#define CWP_RC_BUFFER_OVERFLOW -2
#define CWP_RC_BUFFER_UNDERFLOW -3
#define CWP_RC_MALFORMED_INPUT -4
#define CWP_RC_WRONG_BYTE_ORDER -5
#define CWP_RC_ERROR_IN_HANDLER -6
#define CWP_RC_ILLEGAL_CALL -7
#define CWP_RC_MALLOC_ERROR -8
#define CWP_RC_STOPPED -9
#define CWP_RC_TYPE_ERROR -10
#define CWP_RC_VALUE_ERROR -11
#define CWP_RC_WRONG_TIMESTAMP_LENGTH -12
/******************************* P A C K **********************************/
struct cw_pack_context;
typedef int (*pack_overflow_handler)(struct cw_pack_context*, unsigned long);
typedef int (*pack_flush_handler)(struct cw_pack_context*);
typedef struct cw_pack_context {
uint8_t* current;
uint8_t* start;
uint8_t* end;
bool be_compatible;
int return_code;
int err_no; /* handlers can save error here */
pack_overflow_handler handle_pack_overflow;
pack_flush_handler handle_flush;
} cw_pack_context;
int cw_pack_context_init (cw_pack_context* pack_context, void* data, unsigned long length, pack_overflow_handler hpo);
void cw_pack_set_compatibility (cw_pack_context* pack_context, bool be_compatible);
void cw_pack_set_flush_handler (cw_pack_context* pack_context, pack_flush_handler handle_flush);
void cw_pack_flush (cw_pack_context* pack_context);
void cw_pack_nil (cw_pack_context* pack_context);
void cw_pack_true (cw_pack_context* pack_context);
void cw_pack_false (cw_pack_context* pack_context);
void cw_pack_boolean (cw_pack_context* pack_context, bool b);
void cw_pack_signed (cw_pack_context* pack_context, int64_t i);
void cw_pack_unsigned (cw_pack_context* pack_context, uint64_t i);
void cw_pack_float (cw_pack_context* pack_context, float f);
void cw_pack_double (cw_pack_context* pack_context, double d);
/* void cw_pack_real (cw_pack_context* pack_context, double d); moved to cwpack_utils */
void cw_pack_array_size (cw_pack_context* pack_context, uint32_t n);
void cw_pack_map_size (cw_pack_context* pack_context, uint32_t n);
void cw_pack_str (cw_pack_context* pack_context, const char* v, uint32_t l);
void cw_pack_bin (cw_pack_context* pack_context, const void* v, uint32_t l);
void cw_pack_ext (cw_pack_context* pack_context, int8_t type, const void* v, uint32_t l);
void cw_pack_time (cw_pack_context* pack_context, int64_t sec, uint32_t nsec);
void cw_pack_insert (cw_pack_context* pack_context, const void* v, uint32_t l);
/***************************** U N P A C K ********************************/
typedef enum
{
CWP_ITEM_MIN_RESERVED_EXT = -128,
CWP_ITEM_TIMESTAMP = -1,
CWP_ITEM_MAX_RESERVED_EXT = -1,
CWP_ITEM_MIN_USER_EXT = 0,
CWP_ITEM_MAX_USER_EXT = 127,
CWP_ITEM_NIL = 300,
CWP_ITEM_BOOLEAN = 301,
CWP_ITEM_POSITIVE_INTEGER = 302,
CWP_ITEM_NEGATIVE_INTEGER = 303,
CWP_ITEM_FLOAT = 304,
CWP_ITEM_DOUBLE = 305,
CWP_ITEM_STR = 306,
CWP_ITEM_BIN = 307,
CWP_ITEM_ARRAY = 308,
CWP_ITEM_MAP = 309,
CWP_ITEM_EXT = 310,
CWP_NOT_AN_ITEM = 999,
} cwpack_item_types;
typedef struct {
const void* start;
uint32_t length;
} cwpack_blob;
typedef struct {
uint32_t size;
} cwpack_container;
typedef struct {
int64_t tv_sec;
uint32_t tv_nsec;
} cwpack_timespec;
typedef struct {
cwpack_item_types type;
union
{
bool boolean;
uint64_t u64;
int64_t i64;
float real;
double long_real;
cwpack_container array;
cwpack_container map;
cwpack_blob str;
cwpack_blob bin;
cwpack_blob ext;
cwpack_timespec time;
} as;
} cwpack_item;
struct cw_unpack_context;
typedef int (*unpack_underflow_handler)(struct cw_unpack_context*, unsigned long);
typedef struct cw_unpack_context {
cwpack_item item;
uint8_t* start;
uint8_t* current;
uint8_t* end; /* logical end of buffer */
int return_code;
int err_no; /* handlers can save error here */
unpack_underflow_handler handle_unpack_underflow;
} cw_unpack_context;
int cw_unpack_context_init (cw_unpack_context* unpack_context, const void* data, unsigned long length, unpack_underflow_handler huu);
void cw_unpack_next (cw_unpack_context* unpack_context);
void cw_skip_items (cw_unpack_context* unpack_context, long item_count);
#endif /* CWPack_H__ */