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; }
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; }
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; }