Start work on structs and objects
This commit is contained in:
82
src/types.c
82
src/types.c
@@ -82,8 +82,16 @@ GroundValue copyGroundValue(const GroundValue* gv) {
|
||||
break;
|
||||
}
|
||||
case FUNCTION: newGv.data.fnVal = gv->data.fnVal; break;
|
||||
case STRUCTVAL: {
|
||||
// do this later lmao
|
||||
// FIXME
|
||||
newGv.data.structVal = gv->data.structVal;
|
||||
break;
|
||||
}
|
||||
case CUSTOM:
|
||||
newGv.data.customVal = gv->data.customVal; // Shallow copy for custom
|
||||
// also do this later
|
||||
// FIXME
|
||||
newGv.data.customVal = gv->data.customVal;
|
||||
break;
|
||||
}
|
||||
return newGv;
|
||||
@@ -151,6 +159,11 @@ void freeGroundValue(GroundValue* gv) {
|
||||
list->values = NULL;
|
||||
gv->data.listVal = createList();
|
||||
}
|
||||
if (gv->type == STRUCTVAL && gv->data.structVal->fields != NULL) {
|
||||
GroundStruct* gstruct = gv->data.structVal;
|
||||
freeGroundStruct(gstruct);
|
||||
free(gstruct);
|
||||
}
|
||||
}
|
||||
|
||||
GroundArg createValueGroundArg(GroundValue value) {
|
||||
@@ -445,3 +458,70 @@ ListAccessStatus setListAt(List* list, int idx, GroundValue value) {
|
||||
return LIST_OUT_OF_BOUNDS;
|
||||
}
|
||||
}
|
||||
|
||||
GroundStruct createStruct() {
|
||||
return (GroundStruct) {
|
||||
.fields = malloc(sizeof(GroundStructField)),
|
||||
.size = 0
|
||||
};
|
||||
}
|
||||
|
||||
void addFieldToStruct(GroundStruct* gstruct, char* name, GroundValue field) {
|
||||
GroundStructField* tmpPointer = realloc(gstruct->fields, (gstruct->size + 1) * sizeof(GroundStructField));
|
||||
if (tmpPointer == NULL) {
|
||||
printf("Couldn't allocate memory for GroundStruct\n");
|
||||
exit(1);
|
||||
}
|
||||
gstruct->size++;
|
||||
gstruct->fields = tmpPointer;
|
||||
gstruct->fields[gstruct->size - 1].value = field;
|
||||
strncpy(gstruct->fields[gstruct->size - 1].id, name, sizeof(gstruct->fields->id) - 1);
|
||||
gstruct->fields[gstruct->size - 1].id[sizeof(gstruct->fields[gstruct->size - 1].id) - 1] = '\0';
|
||||
}
|
||||
|
||||
void freeGroundStruct(GroundStruct* gstruct) {
|
||||
for (size_t i = 0; i < gstruct->size; i++) {
|
||||
freeGroundValue(&gstruct->fields[i].value);
|
||||
}
|
||||
}
|
||||
|
||||
void addFieldToObject(GroundObject* object, const char *id, GroundValue data) {
|
||||
GroundObjectField* field = malloc(sizeof(GroundObjectField));
|
||||
if (field == NULL) {
|
||||
printf("Couldnt allocate stuff lmao\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
strncpy(field->id, id, sizeof(field->id) - 1);
|
||||
field->id[sizeof(field->id) - 1] = '\0';
|
||||
field->value = copyGroundValue(&data);
|
||||
|
||||
HASH_ADD_STR(object->fields, id, field);
|
||||
}
|
||||
|
||||
GroundObject createObject(GroundStruct gstruct) {
|
||||
GroundObject object;
|
||||
object.fields = NULL;
|
||||
for (size_t i = 0; i < gstruct.size; i++) {
|
||||
addFieldToObject(&object, gstruct.fields[i].id, gstruct.fields[i].value);
|
||||
}
|
||||
|
||||
return object;
|
||||
}
|
||||
|
||||
GroundObjectField* findField(GroundObject head, const char *id) {
|
||||
GroundObjectField* s;
|
||||
HASH_FIND_STR(head.fields, id, s);
|
||||
return s;
|
||||
}
|
||||
|
||||
void freeGroundObject(GroundObject* object) {
|
||||
GroundObjectField *current_field, *tmp;
|
||||
|
||||
HASH_ITER(hh, object->fields, current_field, tmp) {
|
||||
HASH_DEL(object->fields, current_field);
|
||||
freeGroundValue(¤t_field->value);
|
||||
free(current_field);
|
||||
}
|
||||
object->fields = NULL;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user