1 /*
2  * MessagePack for C dynamic typing routine
3  *
4  * Copyright (C) 2008-2009 FURUHASHI Sadayuki
5  *
6  *    Distributed under the Boost Software License, Version 1.0.
7  *    (See accompanying file LICENSE_1_0.txt or copy at
8  *    http://www.boost.org/LICENSE_1_0.txt)
9  */
10 #ifndef MSGPACK_OBJECT_H
11 #define MSGPACK_OBJECT_H
12 
13 #include "zone.h"
14 #include <stdio.h>
15 
16 #ifdef __cplusplus
17 extern "C" {
18 #endif
19 
20 
21 /**
22  * @defgroup msgpack_object Dynamically typed object
23  * @ingroup msgpack
24  * @{
25  */
26 
27 typedef enum {
28     MSGPACK_OBJECT_NIL                  = 0x00,
29     MSGPACK_OBJECT_BOOLEAN              = 0x01,
30     MSGPACK_OBJECT_POSITIVE_INTEGER     = 0x02,
31     MSGPACK_OBJECT_NEGATIVE_INTEGER     = 0x03,
32     MSGPACK_OBJECT_FLOAT32              = 0x0a,
33     MSGPACK_OBJECT_FLOAT64              = 0x04,
34     MSGPACK_OBJECT_FLOAT                = 0x04,
35 #if defined(MSGPACK_USE_LEGACY_NAME_AS_FLOAT)
36     MSGPACK_OBJECT_DOUBLE               = MSGPACK_OBJECT_FLOAT, /* obsolete */
37 #endif /* MSGPACK_USE_LEGACY_NAME_AS_FLOAT */
38     MSGPACK_OBJECT_STR                  = 0x05,
39     MSGPACK_OBJECT_ARRAY                = 0x06,
40     MSGPACK_OBJECT_MAP                  = 0x07,
41     MSGPACK_OBJECT_BIN                  = 0x08,
42     MSGPACK_OBJECT_EXT                  = 0x09
43 } msgpack_object_type;
44 
45 
46 struct msgpack_object;
47 struct msgpack_object_kv;
48 
49 typedef struct {
50     uint32_t size;
51     struct msgpack_object* ptr;
52 } msgpack_object_array;
53 
54 typedef struct {
55     uint32_t size;
56     struct msgpack_object_kv* ptr;
57 } msgpack_object_map;
58 
59 typedef struct {
60     uint32_t size;
61     const char* ptr;
62 } msgpack_object_str;
63 
64 typedef struct {
65     uint32_t size;
66     const char* ptr;
67 } msgpack_object_bin;
68 
69 typedef struct {
70     int8_t type;
71     uint32_t size;
72     const char* ptr;
73 } msgpack_object_ext;
74 
75 typedef union {
76     bool boolean;
77     uint64_t u64;
78     int64_t  i64;
79 #if defined(MSGPACK_USE_LEGACY_NAME_AS_FLOAT)
80     double   dec; /* obsolete*/
81 #endif /* MSGPACK_USE_LEGACY_NAME_AS_FLOAT */
82     double   f64;
83     msgpack_object_array array;
84     msgpack_object_map map;
85     msgpack_object_str str;
86     msgpack_object_bin bin;
87     msgpack_object_ext ext;
88 } msgpack_object_union;
89 
90 typedef struct msgpack_object {
91     msgpack_object_type type;
92     msgpack_object_union via;
93 } msgpack_object;
94 
95 typedef struct msgpack_object_kv {
96     msgpack_object key;
97     msgpack_object val;
98 } msgpack_object_kv;
99 
100 MSGPACK_DLLEXPORT
101 void msgpack_object_print(FILE* out, msgpack_object o);
102 
103 MSGPACK_DLLEXPORT
104 int msgpack_object_print_buffer(char *buffer, size_t buffer_size, msgpack_object o);
105 
106 MSGPACK_DLLEXPORT
107 bool msgpack_object_equal(const msgpack_object x, const msgpack_object y);
108 
109 /** @} */
110 
111 
112 #ifdef __cplusplus
113 }
114 #endif
115 
116 #endif /* msgpack/object.h */
117