diff --git a/.gitignore b/.gitignore index a01ee28..a8e2fd5 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ .*.swp +*.o + diff --git a/bigpoint_cclass.h b/bigpoint_cclass.h index 3d0b0ae..26c8518 100644 --- a/bigpoint_cclass.h +++ b/bigpoint_cclass.h @@ -5,8 +5,11 @@ #include #include -typedef void (* ctor)(void*, va_list*); -typedef void (* dtor)(void*); +typedef void (* ctor)(void *, va_list *); +typedef void (* dtor)(void *); +typedef void (* jCtor)(void *, struct json_object *); +typedef struct json_object * (* jTo)(void *); + struct BIGPOINT_CCLASS { size_t size; diff --git a/bigpoint_dyntype.c b/bigpoint_dyntype.c index 8c5ee6d..7e4e190 100644 --- a/bigpoint_dyntype.c +++ b/bigpoint_dyntype.c @@ -13,16 +13,40 @@ __construct(struct BIGPOINT_DYNTYPE * _this, va_list * params) _this->type = va_arg(* params, enum BIGPOINT_DYNTYPE_TYPES); _this->size = va_arg(* params, size_t); - _this->data = calloc(_this->size, sizeof(char)); - memcpy(_this->data, va_arg(* params, void *), _this->size); + switch(_this->type) { + case BIGPOINT_DYNTYPE_INT: + (_this->data)._int = va_arg(* params, long); + break; + + default: + (_this->data)._object = NULL; + } +} + +static +void +__jsonConst(struct BIGPOINT_DYNTYPE * _this, struct json_object * json) +{ + switch (json_object_get_type(json)) { + case json_type_int: + _this->type = BIGPOINT_DYNTYPE_INT; + _this->size = sizeof(long); + (_this->data)._int = (long)json_object_get_int(json); + break; + + default: + _this->type = BIGPOINT_DYNTYPE_NULL; + _this->size = 0; + (_this->data)._object = NULL; + } } static void __destruct(struct BIGPOINT_DYNTYPE * _this) { - if (_this && _this->data) { - free(_this->data); + if (_this && BIGPOINT_DYNTYPE_OBJECT == _this->type && (_this->data)._object) { + free((_this->data)._object); } } @@ -39,22 +63,13 @@ __toJson(struct BIGPOINT_DYNTYPE * _this) return json; } -static -void -__jsonConst(struct BIGPOINT_DYNTYPE * _this, struct json_object * json) -{ - /** - * @TODO: initialize by json.... - */ -} - static const struct BIGPOINT_CCLASS _bigpoint_dyntype = { sizeof(struct BIGPOINT_DYNTYPE), (ctor)__construct, - __jsonConst, + (jCtor)__jsonConst, (dtor)__destruct, - __toJson + (jTo)__toJson }; const struct BIGPOINT_CCLASS * const BIGPOINT_DYNTYPE = &_bigpoint_dyntype; diff --git a/bigpoint_dyntype.h b/bigpoint_dyntype.h index 440115a..18a016e 100644 --- a/bigpoint_dyntype.h +++ b/bigpoint_dyntype.h @@ -7,7 +7,8 @@ enum BIGPOINT_DYNTYPE_TYPES { - BIGPOINT_DYNTYPE_BOOLEAN = 0, + BIGPOINT_DYNTYPE_NULL = 0, + BIGPOINT_DYNTYPE_BOOLEAN, BIGPOINT_DYNTYPE_INT, BIGPOINT_DYNTYPE_FLOAT, BIGPOINT_DYNTYPE_STRING, @@ -20,7 +21,13 @@ struct BIGPOINT_DYNTYPE { const struct BIGPOINT_CCLASS * const class; enum BIGPOINT_DYNTYPE_TYPES type; size_t size; - void * data; + union _data { + unsigned char _boolean; + long _int; + double _float; + char * _string; + void * _object; + } data; }; extern const struct BIGPOINT_CCLASS * const BIGPOINT_DYNTYPE;