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; }
static corto_equalityKind corto_collection_compareListWithList(corto_collection t, corto_ll list1, corto_ll list2) { corto_equalityKind result = CORTO_EQ; corto_iter iter1, iter2; void *e1, *e2; corto_type elementType = t->elementType; iter1 = corto_ll_iter(list1); iter2 = corto_ll_iter(list2); while(corto_iter_hasNext(&iter1) && corto_iter_hasNext(&iter2)) { if (corto_collection_requiresAlloc(elementType)) { e1 = corto_iter_next(&iter1); e2 = corto_iter_next(&iter2); } else { e1 = corto_iter_nextPtr(&iter1); e2 = corto_iter_nextPtr(&iter2); } result = corto_ptr_compare(e1, elementType, e2); if (result != CORTO_EQ) { break; } } return result; }
static corto_equalityKind corto_collection_compareArrayWithList(corto_collection t, void *array, corto_uint32 elementSize, corto_ll list) { corto_equalityKind result = CORTO_EQ; corto_uint32 i=0; corto_iter iter; void *e1, *e2; corto_type elementType = t->elementType; iter = corto_ll_iter(list); while(corto_iter_hasNext(&iter)) { if (corto_collection_requiresAlloc(elementType)) { e1 = corto_iter_next(&iter); } else { e1 = corto_iter_nextPtr(&iter); } e2 = CORTO_OFFSET(array, elementSize * i); result = corto_ptr_compare(e2, elementType, e1); if (result != CORTO_EQ) { break; } i++; } return result; }