Commit 9a28fc52db1178258be0dc9b136a4c64194fd1ac

Authored by Georg Hopp
1 parent e090c797

added more convenience macros for classes and used them in the classes

... ... @@ -70,7 +70,7 @@ main(int argc, char * argv[])
70 70 sizeof(DYNTYPE_HASH),
71 71 data));
72 72
73   - json = toJson(packet);
  73 + toJson(packet, &json);
74 74 json_str = json_object_to_json_string(json);
75 75 length = strlen(json_str);
76 76
... ...
... ... @@ -33,41 +33,48 @@
33 33 #define ENDC(_class) } * _class; \
34 34 extern const _CCLASS const __##_class;
35 35
36   -#define INIT_CCLASS(class, jsonConst, toJson) \
37   - static const struct CCLASS _class = { \
38   - CCLASS_MAGIC, \
39   - sizeof(struct _##class), \
40   - (ctor)__construct, \
41   - (jCtor)jsonConst, \
42   - (dtor)__destruct, \
43   - (jTo)toJson \
44   - }; const _CCLASS const __##class = (const _CCLASS const)&_class
45   -
46   -
47   -
48 36 typedef void (* ctor)(void *, va_list *);
49 37 typedef void (* dtor)(void *);
50 38 typedef void (* jCtor)(void *, struct json_object *);
51   -typedef struct json_object * (* jTo)(void *);
  39 +typedef void (* jTo)(void *, struct json_object **);
52 40
53 41
54 42 typedef struct CCLASS {
55 43 const int magic;
56 44 size_t size;
57 45 void (* __construct)(void * _this, va_list * params);
58   - void (* __jsonConst)(void * _this, struct json_object * json);
59 46 void (* __destruct)(void * _this);
60   - struct json_object * (* __toJson)(void * _this);
  47 + void (* __jsonConst)(void * _this, struct json_object * json);
  48 + void (* __toJson)(void * _this, struct json_object ** json);
61 49 } * _CCLASS;
62 50 #define CCLASS_PTR_SIZE sizeof(struct CCLASS *)
63 51 #define CCLASS_SIZE sizeof(struct CCLASS)
64 52
65   -void * _new(const _CCLASS _class, ...);
66   -void * _newFromJson(const _CCLASS _class, struct json_object * json);
67   -void delete(void * _object);
68   -struct json_object * toJson(void * _object);
69   -int isObject(void * _object);
70   -int _instanceOf(const _CCLASS _class, void * _object);
  53 +#define __construct(class) static void __construct(class _this, va_list * params)
  54 +#define __destruct(class) static void __destruct(class _this)
  55 +#define __jsonConst(class) static void __jsonConst(class _this, struct json_object * json)
  56 +#define __toJson(class) static void __toJson(class _this, struct json_object ** json)
  57 +
  58 +#define INIT_CCLASS(class) \
  59 + __construct(class); \
  60 + __destruct(class); \
  61 + __jsonConst(class); \
  62 + __toJson(class); \
  63 + static const struct CCLASS _class = { \
  64 + CCLASS_MAGIC, \
  65 + sizeof(struct _##class), \
  66 + (ctor)__construct, \
  67 + (dtor)__destruct, \
  68 + (jCtor)__jsonConst, \
  69 + (jTo)__toJson \
  70 + }; const _CCLASS __##class = (const _CCLASS)&_class
  71 +
  72 +void * _new(const _CCLASS _class, ...);
  73 +void * _newFromJson(const _CCLASS _class, struct json_object * json);
  74 +void delete(void * _object);
  75 +void toJson(void * _object, struct json_object ** json);
  76 +int isObject(void * _object);
  77 +int _instanceOf(const _CCLASS _class, void * _object);
71 78
72 79 #define new(class, ...) _new((__##class), __VA_ARGS__)
73 80 #define newFromJson(class, json) _newFromJson((__##class), (json))
... ...
... ... @@ -16,17 +16,16 @@
16 16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
17 17 */
18 18 #ifndef __DYNTYPE_H__
  19 +
  20 +#ifndef __DYNTYPE_HASH_H__
  21 +#include "token/dyntype/hash.h"
  22 +#endif//__DYNTYPE_HASH_H__
  23 +
19 24 #define __DYNTYPE_H__
20 25
21 26 #include <sys/types.h>
22   -
23 27 #include "token/cclass.h"
24 28
25   -struct _DYNTYPE;
26   -
27   -#include "token/dyntype/hash.h"
28   -
29   -
30 29 enum DYNTYPE_TYPES {
31 30 DYNTYPE_TYPE_NULL = 0,
32 31 DYNTYPE_TYPE_BOOLEAN,
... ... @@ -51,6 +50,8 @@ CLASS(DYNTYPE)
51 50 } data;
52 51 ENDC(DYNTYPE)
53 52
  53 +#include "token/dyntype/hash.h"
  54 +
54 55 #endif//__DYNTYPE_H__
55 56
56 57 // vim: set et ts=4 sw=4:
... ...
... ... @@ -16,25 +16,33 @@
16 16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
17 17 */
18 18 #ifndef __DYNTYPE_HASH_H__
19   -#define __DYNTYPE_HASH_H__
20 19
21 20 #include <sys/types.h>
22   -
23 21 #include "token/cclass.h"
24   -#include "token/dyntype.h"
25 22
  23 +#ifndef __DYNTYPE_H__
  24 +
  25 +struct _DYNTYPE_HASH;
  26 +#define DYNTYPE_HASH struct _DYNTYPE_HASH *
  27 +
  28 +#else
  29 +
  30 +#undef DYNTYPE_HASH
  31 +#define __DYNTYPE_HASH_H__
26 32
27 33 CLASS(DYNTYPE_HASH)
28 34 char ** keys;
29   - struct _DYNTYPE ** values;
  35 + DYNTYPE * values;
30 36 size_t size;
31 37 size_t used;
32 38 ENDC(DYNTYPE_HASH)
33 39
34 40
35 41 void dyntype_hash_set(DYNTYPE_HASH _this, const char * key, struct _DYNTYPE * value);
36   -struct _DYNTYPE * dyntype_hash_get(DYNTYPE_HASH _this, const char * key);
37   -struct _DYNTYPE * dyntype_hash_del(DYNTYPE_HASH _this, const char * key);
  42 +DYNTYPE dyntype_hash_get(DYNTYPE_HASH _this, const char * key);
  43 +void dyntype_hash_del(DYNTYPE_HASH _this, const char * key);
  44 +
  45 +#endif
38 46
39 47 #endif//__DYNTYPE_HASH_H__
40 48
... ...
... ... @@ -22,6 +22,10 @@
22 22
23 23 #include "token/cclass.h"
24 24
  25 +#undef __construct
  26 +#undef __destruct
  27 +#undef __jsonConst
  28 +#undef __toJson
25 29
26 30 void *
27 31 _new(const _CCLASS _class, ...)
... ... @@ -70,16 +74,14 @@ delete(void * _object)
70 74 *(void**)_object = NULL;
71 75 }
72 76
73   -struct json_object *
74   -toJson(void * _object)
  77 +void
  78 +toJson(void * _object, struct json_object ** json)
75 79 {
76 80 const struct CCLASS ** class = _object;
77 81
78 82 if (_object && *class && (*class)->__toJson) {
79   - return (*class)->__toJson(_object);
  83 + (*class)->__toJson(_object, json);
80 84 }
81   -
82   - return NULL;
83 85 }
84 86
85 87 int
... ...
... ... @@ -28,9 +28,9 @@
28 28 #include "token/crypt.h"
29 29
30 30
31   -static
32   -void
33   -__construct(CRYPT _this, va_list * params)
  31 +INIT_CCLASS(CRYPT);
  32 +
  33 +__construct(CRYPT)
34 34 {
35 35 _this->algorithm = va_arg(* params, const char * const);
36 36 _this->mode = va_arg(* params, const char * const);
... ... @@ -45,9 +45,7 @@ __construct(CRYPT _this, va_list * params)
45 45 _this->keysize = mcrypt_enc_get_key_size(_this->mcrypt);
46 46 }
47 47
48   -static
49   -void
50   -__destruct(CRYPT _this)
  48 +__destruct(CRYPT)
51 49 {
52 50 if (_this->iv) {
53 51 free(_this->iv);
... ... @@ -56,7 +54,8 @@ __destruct(CRYPT _this)
56 54 mcrypt_module_close(_this->mcrypt);
57 55 }
58 56
59   -INIT_CCLASS(CRYPT, NULL, NULL);
  57 +__jsonConst(CRYPT) {}
  58 +__toJson(CRYPT) {}
60 59
61 60 void *
62 61 crypt_createIv(CRYPT _this)
... ... @@ -94,7 +93,7 @@ createKey(CRYPT _this, const char * const password)
94 93 _this->keysize,
95 94 NULL,
96 95 0,
97   - (char *)password, // @TODO: bad karma...now this might change password.
  96 + (mutils_word8 *)password, // @TODO: bad karma...this might change password.
98 97 strlen(password));
99 98
100 99 return key;
... ...
... ... @@ -24,9 +24,9 @@
24 24 #include "token/dyntype/hash.h"
25 25
26 26
27   -static
28   -void
29   -__construct(DYNTYPE _this, va_list * params)
  27 +INIT_CCLASS(DYNTYPE);
  28 +
  29 +__construct(DYNTYPE)
30 30 {
31 31 _this->type = va_arg(* params, enum DYNTYPE_TYPES);
32 32 _this->size = va_arg(* params, size_t);
... ... @@ -50,9 +50,7 @@ __construct(DYNTYPE _this, va_list * params)
50 50 }
51 51 }
52 52
53   -static
54   -void
55   -__jsonConst(DYNTYPE _this, struct json_object * json)
  53 +__jsonConst(DYNTYPE)
56 54 {
57 55 switch (json_object_get_type(json)) {
58 56 case json_type_int:
... ... @@ -86,9 +84,7 @@ __jsonConst(DYNTYPE _this, struct json_object * json)
86 84 }
87 85 }
88 86
89   -static
90   -void
91   -__destruct(DYNTYPE _this)
  87 +__destruct(DYNTYPE)
92 88 {
93 89 if (_this) {
94 90 switch(_this->type) {
... ... @@ -106,32 +102,24 @@ __destruct(DYNTYPE _this)
106 102 }
107 103 }
108 104
109   -static
110   -struct json_object *
111   -__toJson(DYNTYPE _this)
  105 +__toJson(DYNTYPE)
112 106 {
113   - struct json_object * json = NULL;
114   -
115 107 switch(_this->type) {
116 108 case DYNTYPE_TYPE_INT:
117   - json = json_object_new_int((_this->data)._int);
  109 + *json = json_object_new_int((_this->data)._int);
118 110 break;
119 111
120 112 case DYNTYPE_TYPE_STRING:
121   - json = json_object_new_string((_this->data)._string);
  113 + *json = json_object_new_string((_this->data)._string);
122 114 break;
123 115
124 116 case DYNTYPE_TYPE_HASH:
125   - json = toJson((_this->data)._hash);
  117 + toJson((_this->data)._hash, json);
126 118 break;
127 119
128 120 default:
129   - json = NULL;
  121 + *json = NULL;
130 122 }
131   -
132   - return json;
133 123 }
134 124
135   -INIT_CCLASS(DYNTYPE, __jsonConst, __toJson);
136   -
137 125 // vim: set et ts=4 sw=4:
... ...
... ... @@ -29,18 +29,17 @@
29 29
30 30 static void _updateHashSize(DYNTYPE_HASH _this);
31 31
32   -static
33   -void
34   -__construct(DYNTYPE_HASH _this, va_list * params)
  32 +INIT_CCLASS(DYNTYPE_HASH);
  33 +
  34 +__construct(DYNTYPE_HASH)
35 35 {
36 36 _this->size = 0;
37 37 _this->used = 0;
38 38 _updateHashSize(_this);
39 39 }
  40 +#undef __construct
40 41
41   -static
42   -void
43   -__jsonConst(DYNTYPE_HASH _this, struct json_object * json)
  42 +__jsonConst(DYNTYPE_HASH)
44 43 {
45 44 __construct(_this, NULL);
46 45
... ... @@ -53,9 +52,7 @@ __jsonConst(DYNTYPE_HASH _this, struct json_object * json)
53 52 }
54 53 }
55 54
56   -static
57   -void
58   -__destruct(DYNTYPE_HASH _this)
  55 +__destruct(DYNTYPE_HASH)
59 56 {
60 57 size_t index;
61 58
... ... @@ -67,24 +64,19 @@ __destruct(DYNTYPE_HASH _this)
67 64 free(_this->values);
68 65 }
69 66
70   -static
71   -struct json_object *
72   -__toJson(DYNTYPE_HASH _this)
  67 +__toJson(DYNTYPE_HASH)
73 68 {
74 69 size_t index;
75   - struct json_object * json = json_object_new_object();
  70 + *json = json_object_new_object();
76 71
77 72 for (index = 0; index < _this->used; index ++) {
78   - json_object_object_add(
79   - json,
80   - _this->keys[index],
81   - toJson(_this->values[index]));
82   - }
  73 + struct json_object * values;
83 74
84   - return json;
85   -}
  75 + toJson(_this->values[index], &values);
86 76
87   -INIT_CCLASS(DYNTYPE_HASH, __jsonConst, __toJson);
  77 + json_object_object_add(*json, _this->keys[index], values);
  78 + }
  79 +}
88 80
89 81 static
90 82 void
... ... @@ -137,7 +129,8 @@ dyntype_hash_set(DYNTYPE_HASH _this, const char * key, DYNTYPE value)
137 129 _updateHashSize(_this);
138 130 }
139 131
140   -DYNTYPE dyntype_hash_get(DYNTYPE_HASH _this, const char * key)
  132 +DYNTYPE
  133 +dyntype_hash_get(DYNTYPE_HASH _this, const char * key)
141 134 {
142 135 size_t index = _getHashIdx(_this, key);
143 136
... ... @@ -148,9 +141,9 @@ DYNTYPE dyntype_hash_get(DYNTYPE_HASH _this, const char * key)
148 141 return _this->values[index];
149 142 }
150 143
151   -DYNTYPE dyntype_hash_del(DYNTYPE_HASH _this, const char * key)
  144 +void
  145 +dyntype_hash_del(DYNTYPE_HASH _this, const char * key)
152 146 {
153   - DYNTYPE found = NULL;
154 147 size_t index = _getHashIdx(_this, key);
155 148
156 149 if (index == _this->used) {
... ...
... ... @@ -20,16 +20,14 @@
20 20 #include "token/packet.h"
21 21
22 22
23   -static
24   -void
25   -__construct(PACKET _this, va_list * params)
  23 +INIT_CCLASS(PACKET);
  24 +
  25 +__construct(PACKET)
26 26 {
27 27 packet_set_default_content(_this);
28 28 }
29 29
30   -static
31   -void
32   -__jsonConst(PACKET _this, struct json_object * json)
  30 +__jsonConst(PACKET)
33 31 {
34 32 struct json_object * header = NULL;
35 33 struct json_object * data = NULL;
... ... @@ -51,25 +49,20 @@ __jsonConst(PACKET _this, struct json_object * json)
51 49 packet_setData(_this, newFromJson(DYNTYPE, data));
52 50 }
53 51
54   -static
55   -void
56   -__destruct(PACKET _this)
57   -{
58   -}
  52 +__destruct(PACKET) {}
59 53
60   -static
61   -struct json_object *
62   -__toJson(PACKET _this)
  54 +__toJson(PACKET)
63 55 {
64   - struct json_object * json = json_object_new_array();
  56 + struct json_object * value;
65 57
66   - json_object_array_add(json, toJson(packet_getHeader(_this)));
67   - json_object_array_add(json, toJson(packet_getData(_this)));
  58 + *json = json_object_new_array();
68 59
69   - return json;
70   -}
  60 + toJson(packet_getHeader(_this), &value);
  61 + json_object_array_add(*json, value);
71 62
72   -INIT_CCLASS(PACKET, __jsonConst, __toJson);
  63 + toJson(packet_getData(_this), &value);
  64 + json_object_array_add(*json, value);
  65 +}
73 66
74 67 DYNTYPE packet_getHeader(PACKET _this)
75 68 {
... ...
... ... @@ -88,7 +88,7 @@ testToJson(void)
88 88 int value;
89 89
90 90 _reset();
91   - json = toJson(mock);
  91 + toJson(mock, &json);
92 92
93 93 ASSERT_NOT_NULL(json);
94 94
... ...
... ... @@ -6,24 +6,15 @@
6 6
7 7 char _called;
8 8
9   -void
10   -inline
11   -_reset()
12   -{
13   - _called = 0;
14   -}
  9 +INIT_CCLASS(MOCK_CLASS);
15 10
16   -static
17   -void
18   -__construct(MOCK_CLASS _this, va_list * params)
  11 +__construct(MOCK_CLASS)
19 12 {
20 13 _called = 1;
21 14 _this->value = va_arg(* params, int);
22 15 }
23 16
24   -static
25   -void
26   -__jsonConst(MOCK_CLASS _this, json_object * json)
  17 +__jsonConst(MOCK_CLASS)
27 18 {
28 19 _called = 1;
29 20 assert(json_type_int == json_object_get_type(json));
... ... @@ -31,25 +22,17 @@ __jsonConst(MOCK_CLASS _this, json_object * json)
31 22 _this->value = json_object_get_int(json);
32 23 }
33 24
34   -static
35   -void
36   -__destruct(MOCK_CLASS _this)
  25 +__destruct(MOCK_CLASS)
37 26 {
38 27 _called = 1;
39 28 }
40 29
41   -static
42   -struct json_object *
43   -__toJson(MOCK_CLASS _this)
  30 +__toJson(MOCK_CLASS)
44 31 {
45   - struct json_object * json = json_object_new_int(_this->value);
46   -
  32 + *json = json_object_new_int(_this->value);
47 33 _called = 1;
48   - return json;
49 34 }
50 35
51   -INIT_CCLASS(MOCK_CLASS, __jsonConst, __toJson);
52   -
53 36 /**
54 37 * ~~~ method implementations ~~~~~~~~
55 38 */
... ...
... ... @@ -3,10 +3,18 @@
3 3
4 4 #include "token/cclass.h"
5 5
6   -
7 6 extern char _called;
8 7
9   -extern void inline _reset();
  8 +#ifndef _RESET
  9 +#define _RESET
  10 +void
  11 +inline
  12 +_reset()
  13 +{
  14 + _called = 0;
  15 +}
  16 +#endif//_RESET
  17 +
10 18
11 19 CLASS(MOCK_CLASS)
12 20 int value;
... ...
... ... @@ -5,7 +5,7 @@
5 5
6 6
7 7 const char testname[] = "packetTest";
8   -struct PACKET * packet = NULL;
  8 +PACKET packet = NULL;
9 9
10 10
11 11 static
... ...
... ... @@ -55,7 +55,7 @@ main(int argc, char * argv[])
55 55 printf("running tests for %s\n", testname);
56 56
57 57 for (index=0; index<count; index++) {
58   - int result, _setUp = 0; // initialize setup to false
  58 + int result = TEST_ERROR, _setUp = 0; // initialize setup to false
59 59
60 60 if (NULL != setUp) {
61 61 if (TEST_OK == (result = setUp())) {
... ...
Please register or login to post a comment