Initial commit, save progress so far
This commit is contained in:
93
src/lexer/SolsType.c
Normal file
93
src/lexer/SolsType.c
Normal file
@@ -0,0 +1,93 @@
|
||||
#include "lexer.h"
|
||||
#include "../include/error.h"
|
||||
#include "../include/estr.h"
|
||||
|
||||
ResultType(SolsType, charptr) createSolsType(SolsTypeType in) {
|
||||
SolsTypeField* ptr = malloc(sizeof(SolsTypeField) * 32);
|
||||
if (ptr == NULL) {
|
||||
return Error(SolsType, charptr, "Couldn't allocate memory (in createSolsType() function)");
|
||||
}
|
||||
SolsType type = { .type = in, .children.capacity = 32, .children.at = ptr };
|
||||
return Success(SolsType, charptr, type);
|
||||
}
|
||||
|
||||
ResultType(SolsType, charptr) copySolsType(SolsType* type) {
|
||||
SolsType ret = { .type = type->type, .children.count = type->children.count, .children.capacity = type->children.capacity};
|
||||
|
||||
// Allocate memory
|
||||
SolsTypeField* ptr = malloc(sizeof(SolsTypeField) * type->children.capacity);
|
||||
if (ptr == NULL) {
|
||||
return Error(SolsType, charptr, "Couldn't allocate memory (in copySolsType() function)");
|
||||
}
|
||||
ret.children.at = ptr;
|
||||
|
||||
// Deep copy values
|
||||
for (size_t i = 0; i < type->children.count; i++) {
|
||||
// Copy the SolsType value
|
||||
ResultType(SolsType, charptr) copied = copySolsType(&type->children.at[i].type);
|
||||
if (copied.error) {
|
||||
Estr err = CREATE_ESTR(copied.as.error);
|
||||
APPEND_ESTR(err, " (in addChildToSolsType() function)");
|
||||
return Error(SolsType, charptr, err.str);
|
||||
}
|
||||
ret.children.at[i].type = copied.as.success;
|
||||
|
||||
// Copy the name
|
||||
if (type->children.at[i].name == NULL) {
|
||||
ret.children.at[i].name = NULL;
|
||||
} else {
|
||||
ret.children.at[i].name = malloc(strlen(type->children.at[i].name) + 1);
|
||||
if (ret.children.at[i].name == NULL) {
|
||||
return Error(SolsType, charptr, "Couldn't allocate memory (in copySolsType() function)");
|
||||
}
|
||||
strcpy(ret.children.at[i].name, type->children.at[i].name);
|
||||
}
|
||||
}
|
||||
return Success(SolsType, charptr, ret);
|
||||
}
|
||||
|
||||
ResultType(voidptr, charptr) addChildToSolsType(SolsType* type, SolsType child, const char* name) {
|
||||
if (type->children.capacity < type->children.count + 1) {
|
||||
type->children.capacity *= 2;
|
||||
SolsTypeField* ptr = realloc(type->children.at, sizeof(SolsTypeField) * type->children.capacity);
|
||||
if (ptr == NULL) {
|
||||
return Error(voidptr, charptr, "Couldn't allocate memory (in addChildToSolsType() function)");
|
||||
}
|
||||
type->children.at = ptr;
|
||||
}
|
||||
ResultType(SolsType, charptr) copied = copySolsType(&child);
|
||||
if (copied.error) {
|
||||
Estr err = CREATE_ESTR(copied.as.error);
|
||||
APPEND_ESTR(err, " (in addChildToSolsType() function)");
|
||||
return Error(voidptr, charptr, err.str);
|
||||
}
|
||||
type->children.at[type->children.count].type = copied.as.success;
|
||||
if (name == NULL) {
|
||||
type->children.at[type->children.count].name = NULL;
|
||||
} else {
|
||||
type->children.at[type->children.count].name = malloc(strlen(name) + 1);
|
||||
strcpy(type->children.at[type->children.count].name, name);
|
||||
}
|
||||
type->children.count++;
|
||||
|
||||
return Success(voidptr, charptr, NULL);
|
||||
}
|
||||
|
||||
void freeSolsType(SolsType* type) {
|
||||
for (size_t i = 0; i < type->children.count; i++) {
|
||||
// Free the name
|
||||
if (type->children.at[i].name != NULL) {
|
||||
free(type->children.at[i].name);
|
||||
}
|
||||
|
||||
// Free the child SolsTypes
|
||||
freeSolsType(&type->children.at[i].type);
|
||||
}
|
||||
// Free the field itself
|
||||
free(type->children.at);
|
||||
type->children.at = NULL;
|
||||
|
||||
// Set count and capacity to zero
|
||||
type->children.count = 0;
|
||||
type->children.capacity = 0;
|
||||
}
|
||||
Reference in New Issue
Block a user