大理水控初始版本
diff --git a/msgpack/cwpack.h b/msgpack/cwpack.h
new file mode 100644
index 0000000..c297d56
--- /dev/null
+++ b/msgpack/cwpack.h
@@ -0,0 +1,166 @@
+/* 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>
+
+//zzq add
+#include "stdint.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
+
+
+
+/******************************* P A C K **********************************/
+
+
+struct cw_pack_context;
+
+typedef int (*pack_overflow_handler)(struct cw_pack_context*, unsigned long);
+
+typedef struct cw_pack_context {
+ uint8_t* start;
+ uint8_t* current;
+ uint8_t* end;
+ bool be_compatible;
+ int return_code;
+ int err_no; /* handlers can save error here */
+ pack_overflow_handler handle_pack_overflow;
+} 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_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); /* Pack as float if precision isn't destroyed */
+
+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_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_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 {
+ 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;
+ } 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, 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__ */