Copy custom values and structs properly
This commit is contained in:
53
src/types.c
53
src/types.c
@@ -90,16 +90,55 @@ GroundValue copyGroundValue(const GroundValue* gv) {
|
|||||||
}
|
}
|
||||||
case FUNCTION: newGv.data.fnVal = gv->data.fnVal; break;
|
case FUNCTION: newGv.data.fnVal = gv->data.fnVal; break;
|
||||||
case STRUCTVAL: {
|
case STRUCTVAL: {
|
||||||
// do this later lmao
|
newGv.data.structVal = malloc(sizeof(GroundStruct));
|
||||||
// FIXME
|
if (newGv.data.structVal == NULL) {
|
||||||
newGv.data.structVal = gv->data.structVal;
|
printf("Couldn't allocate memory for GroundStruct copy\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
newGv.data.structVal->size = gv->data.structVal->size;
|
||||||
|
newGv.data.structVal->fields = malloc(gv->data.structVal->size * sizeof(GroundStructField));
|
||||||
|
if (newGv.data.structVal->fields == NULL && gv->data.structVal->size > 0) {
|
||||||
|
printf("Couldn't allocate memory for GroundStruct fields copy\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (size_t i = 0; i < gv->data.structVal->size; i++) {
|
||||||
|
strncpy(newGv.data.structVal->fields[i].id,
|
||||||
|
gv->data.structVal->fields[i].id,
|
||||||
|
sizeof(newGv.data.structVal->fields[i].id) - 1);
|
||||||
|
newGv.data.structVal->fields[i].id[sizeof(newGv.data.structVal->fields[i].id) - 1] = '\0';
|
||||||
|
|
||||||
|
newGv.data.structVal->fields[i].value = copyGroundValue(&gv->data.structVal->fields[i].value);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case CUSTOM:
|
case CUSTOM: {
|
||||||
// also do this later
|
newGv.customType = gv->customType;
|
||||||
// FIXME
|
newGv.data.customVal = malloc(sizeof(GroundObject));
|
||||||
newGv.data.customVal = gv->data.customVal;
|
if (newGv.data.customVal == NULL) {
|
||||||
|
printf("Couldn't allocate memory for GroundObject copy\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
newGv.data.customVal->fields = NULL;
|
||||||
|
|
||||||
|
GroundObjectField *field, *tmp;
|
||||||
|
HASH_ITER(hh, gv->data.customVal->fields, field, tmp) {
|
||||||
|
GroundObjectField* newField = malloc(sizeof(GroundObjectField));
|
||||||
|
if (newField == NULL) {
|
||||||
|
printf("Couldn't allocate memory for GroundObjectField copy\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
strncpy(newField->id, field->id, sizeof(newField->id) - 1);
|
||||||
|
newField->id[sizeof(newField->id) - 1] = '\0';
|
||||||
|
newField->value = copyGroundValue(&field->value);
|
||||||
|
|
||||||
|
HASH_ADD_STR(newGv.data.customVal->fields, id, newField);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case NONE:
|
case NONE:
|
||||||
default: {
|
default: {
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user