Beispiel #1
0
void* corto_string_deserAllocElem(void *ptr, corto_string_deser_t *data) {
    corto_collection t = corto_collection(data->allocUdata);
    corto_int32 size = corto_type_sizeof(t->elementType);
    void *result = NULL;

    if (ptr) {
        switch(t->kind) {
        case CORTO_SEQUENCE: {
            corto_objectseq *seq = ptr; /* Use random built-in sequence type */
            seq->buffer = corto_realloc(seq->buffer, (data->current + 1) * size);
            seq->length = data->current + 1;
            ptr = seq->buffer;
            memset(CORTO_OFFSET(ptr, size * data->current), 0, size);
        }
        case CORTO_ARRAY:
            result = CORTO_OFFSET(ptr, size * data->current);
            break;
        case CORTO_LIST: {
            corto_ll list = *(corto_ll*)ptr;
            if (corto_collection_requiresAlloc(t->elementType)) {
                result = corto_calloc(size);
                corto_ll_append(list, result);
            } else {
                corto_ll_append(list, NULL);
                result = corto_ll_getPtr(list, corto_ll_size(list) - 1);
            }
            break;
        default:
            break;
        }
        }
    }

    return result;
}
Beispiel #2
0
void* json_deser_allocElem(void *ptr, corto_collection t, corto_int32 i)
{
    corto_int32 size = corto_type_sizeof(t->elementType);
    void *result = NULL;

    switch(t->kind) {
    case CORTO_SEQUENCE: {
        corto_objectseq *seq = ptr; /* Use random built-in sequence type */
        seq->buffer = corto_realloc(seq->buffer, (i + 1) * size);
        seq->length = i + 1;
        ptr = seq->buffer;
        memset(CORTO_OFFSET(ptr, size * i), 0, size);
    }
    case CORTO_ARRAY:
        result = CORTO_OFFSET(ptr, size * i);
        break;
    case CORTO_LIST: {
        corto_ll list = *(corto_ll*)ptr;
        if (corto_collection_requiresAlloc(t->elementType)) {
            result = corto_calloc(size);
            corto_llAppend(list, result);
        } else {
            corto_llAppend(list, NULL);
            result = corto_llGetPtr(list, corto_llSize(list) - 1);
        }
        break;
    default:
        break;
    }
    }

    return result;
}
Beispiel #3
0
void* corto_string_deserAllocAny(void *ptr, corto_string_deser_t *data) {
    void *result = NULL;
    if (!data->current) {
        result = ptr;
    } else {
        corto_any *a = ptr;
        corto_type t = a->type;
        struct corto_string_deserIndexInfo *anyNode = data->allocUdata;
        anyNode->type = t;
        a->owner = TRUE;
        if (t->kind == CORTO_PRIMITIVE) {
            a->value = corto_calloc(corto_type_sizeof(t));
            result = a->value;
        } else {
            result = &a->value;
        }
    }
    return result;
}