dyntype.c 4.18 KB
/**
 * dyntype.c: structur to hold values of different type and retrieve them again
 * Copyright (C) 2011  Georg Hopp
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <json/json.h>

#include "token/dyntype.h"
#include "token/dyntype/hash.h"

static
size_t _dyntype_sizes[] = {
    0,
    sizeof(unsigned char),
    sizeof(int),
    sizeof(double),
    sizeof(char *),
    sizeof(DYNTYPE *),
    sizeof(DYNTYPE_HASH)
};

INIT_CCLASS(DYNTYPE);

__construct(DYNTYPE)
{
    _this->type = va_arg(* params, enum DYNTYPE_TYPES);

    switch(_this->type) {
        case DYNTYPE_TYPE_INT:
            (_this->data)._int = va_arg(* params, int);
            break;

        case DYNTYPE_TYPE_STRING:
            {
                const char * string = va_arg(* params, const char *);
                const size_t length = strlen(string);

                (_this->data)._string = calloc(length + 1, sizeof(char));
                memcpy((_this->data)._string, string, length);
            }
            break;

        case DYNTYPE_TYPE_HASH:
            (_this->data)._hash = va_arg(* params, DYNTYPE_HASH);
            break;

        default:
            (_this->data)._hash = NULL;
    }
}

__jsonConst(DYNTYPE)
{
    switch (json_object_get_type(json)) {
        case json_type_int:
            _this->type = DYNTYPE_TYPE_INT;
            (_this->data)._int = (int)json_object_get_int(json);
            break;

        case json_type_string:
            {
                const char * string = json_object_get_string(json);
                const size_t length = strlen(string);

                _this->type = DYNTYPE_TYPE_STRING;
                (_this->data)._string = calloc(length + 1, sizeof(char));
                memcpy((_this->data)._string, string, length);
                // the json object handles the memory for string....
            }
            break;

        case json_type_object:
            _this->type = DYNTYPE_TYPE_HASH;
            (_this->data)._hash = newFromJson(DYNTYPE_HASH, json);
            break;

        default:
            _this->type = DYNTYPE_TYPE_NULL;
            (_this->data)._hash = NULL;
    }
}

__clear(DYNTYPE) {}

__destruct(DYNTYPE)
{
    if (_this) {
        switch(_this->type) {
            case DYNTYPE_TYPE_STRING:
                free((_this->data)._string);
                break;

            case DYNTYPE_TYPE_HASH:
                delete(&((_this->data)._hash));
                break;

            default:
                break;
        }
    }
}

__toJson(DYNTYPE)
{
    switch(_this->type) {
        case DYNTYPE_TYPE_INT:
            *json = json_object_new_int((_this->data)._int);
            break;

        case DYNTYPE_TYPE_STRING:
            *json = json_object_new_string((_this->data)._string);
            break;

        case DYNTYPE_TYPE_HASH:
            toJson((_this->data)._hash, json);
            break;

        default:
            *json = NULL;
    }
}

enum DYNTYPE_TYPES
dyntype_getType(DYNTYPE _this)
{
    return _this->type;
}

size_t
dyntype_getSize(DYNTYPE _this)
{
    return _dyntype_sizes[_this->type];
}

unsigned char
dyntype_getBoolean(DYNTYPE _this)
{
    return (_this->data)._boolean;
}

int
dyntype_getInt(DYNTYPE _this)
{
    return (_this->data)._int;
}

double
dyntype_getDouble(DYNTYPE _this)
{
    return (_this->data)._double;
}

char *
dyntype_getString(DYNTYPE _this)
{
    return (_this->data)._string;
}

DYNTYPE *
dyntype_getArray(DYNTYPE _this)
{
    return (_this->data)._array;
}

DYNTYPE_HASH
dyntype_getHash(DYNTYPE _this)
{
    return (_this->data)._hash;
}


// vim: set et ts=4 sw=4: