added add and remove to config

This commit is contained in:
herbglitch 2025-03-25 03:30:32 -06:00
parent ef1888ae71
commit da2be7780b
2 changed files with 326 additions and 39 deletions

View file

@ -67,6 +67,58 @@ void ARC_Config_RegisterType(ARC_Config *config, ARC_String *typeName, ARC_Confi
*/
void ARC_Config_RegisterTypeWithCStr(ARC_Config *config, const char *typeNameCStr, ARC_ConfigType type);
/**
* @brief add a value with a given keyname
*
* @note name should be prefaced with <group>:: to specify group, or just the name if it is in the default group
* @note not specifying the group will use the current group
* @note this function uses ARC_Config_AddWithCStr so it shares error messages with that function
* @note value will be freed on cleanup or remove
*
* @param[in] config ARC_Config to add value to
* @param[in] type the type of a variable to add to specified group
* @param[in] name name of a variable to add to specified group
* @param[in] value the value of the variable to add, will be freed
*/
void ARC_Config_Add(ARC_Config *config, ARC_String *type, ARC_String *name, void *value);
/**
* @brief add a value with a given keyname
*
* @note name should be prefaced with <group>:: to specify group, or just the name if it is in the default group
* @note not specifying the group will use the current group
* @note value will be freed on cleanup or remove
*
* @param[in] config ARC_Config to add value to
* @param[in] type the type of a variable to add to specified group
* @param[in] name name of a variable to add to specified group
* @param[in] value the value of the variable to add, will be freed
*/
void ARC_Config_AddWithCStr(ARC_Config *config, const char *type, const char *name, void *value);
/**
* @brief remove a value with a given keyname
*
* @note name should be prefaced with <group>:: to specify group, or just the name if it is in the default group
* @note not specifying the group will use the current group
* @note this function uses ARC_Config_RemoveWithCStr so it shares error messages with that function
*
* @param[in] config ARC_Config to remove value from
* @param[in] name name of a variable to remove to specified group
*/
void ARC_Config_Remove(ARC_Config *config, ARC_String *name);
/**
* @brief remove a value with a given keyname
*
* @note name should be prefaced with <group>:: to specify group, or just the name if it is in the default group
* @note not specifying the group will use the current group
*
* @param[in] config ARC_Config to remove value from
* @param[in] name name of a variable to remove to specified group
*/
void ARC_Config_RemoveWithCStr(ARC_Config *config, const char *name);
/**
* @brief sets current group in config
*
@ -75,7 +127,7 @@ void ARC_Config_RegisterTypeWithCStr(ARC_Config *config, const char *typeNameCSt
*
* @param[in] config ARC_Config we are setting current group in
* @param[in] groupname name of group that will be set
*/
*/
void ARC_Config_SetGroup(ARC_Config *config, ARC_String *groupName);
/**
@ -85,32 +137,32 @@ void ARC_Config_SetGroup(ARC_Config *config, ARC_String *groupName);
*
* @param[in] config ARC_Config we are setting current group in
* @param[in] groupname name of group that will be set
*/
*/
void ARC_Config_SetGroupWithCStr(ARC_Config *config, const char *groupName);
/**
* @brief get a value from a given name
*
* @note name should be prefaced with <group>:: to specify group
* @note name should be prefaced with <group>:: to specify group, or just the name if it is in the default group
*
* @param[in] config ARC_Config to get value from
* @param[in] name name of a variable that has been read in
*
* @return the stored element on success, or NULL on failure
*/
*/
void *ARC_Config_Get(ARC_Config *config, ARC_String *name);
/**
* @brief get a value from a given keyname
*
* @note name should be prefaced with <group>:: to specify group
* @note name should be prefaced with <group>:: to specify group, or just the name if it is in the default group
* @note this function uses ARC_Config_Get so it shares error messages with that function
*
* @param[in] config ARC_Config to get value from
* @param[in] name name of a variable that has been read in
*
* @return the stored element on success, or NULL on failure
*/
*/
void *ARC_Config_GetWithCStr(ARC_Config *config, const char *name);
/**
@ -205,15 +257,16 @@ void ARC_Config_UnloadFromFile(ARC_Config *config, ARC_String *data);
#define ARC_CONFIG_STRING_CHARS 0x37
#define ARC_CONFIG_STRING_CHAR 0x38
#define ARC_CONFIG_ESCAPE_CHAR 0x39
#define ARC_CONFIG_NUMBER_SIGN 0x3A
#define ARC_CONFIG_NUMBER_TAG 0x3B
#define ARC_CONFIG_WHITESPACE 0x3C
#define ARC_CONFIG_COMMENT 0x3D
#define ARC_CONFIG_LINE_COMMENT 0x3E
#define ARC_CONFIG_MULTI_LINE_COMMENT 0x3F
#define ARC_CONFIG_LINE_CHARS 0x40
#define ARC_CONFIG_MULTI_LINE_CHARS 0x41
#define ARC_CONFIG_COMMENT_CHAR 0x42
#define ARC_CONFIG_FLOAT 0x3A
#define ARC_CONFIG_NUMBER_SIGN 0x3B
#define ARC_CONFIG_NUMBER_TAG 0x3C
#define ARC_CONFIG_WHITESPACE 0x3D
#define ARC_CONFIG_COMMENT 0x3E
#define ARC_CONFIG_LINE_COMMENT 0x3F
#define ARC_CONFIG_MULTI_LINE_COMMENT 0x40
#define ARC_CONFIG_LINE_CHARS 0x41
#define ARC_CONFIG_MULTI_LINE_CHARS 0x42
#define ARC_CONFIG_COMMENT_CHAR 0x43
/**
* @brief TODO: write this

View file

@ -256,6 +256,9 @@ uint32_t ARC_Config_GetStringIdFn(ARC_String *string){
if(ARC_String_EqualsCStringWithStrlen(string, "<escapeChar>")){
return ARC_CONFIG_ESCAPE_CHAR;
}
if(ARC_String_EqualsCStringWithStrlen(string, "<float>")){
return ARC_CONFIG_FLOAT;
}
if(ARC_String_EqualsCStringWithStrlen(string, "<numberSign>")){
return ARC_CONFIG_NUMBER_SIGN;
}
@ -666,7 +669,7 @@ void ARC_Config_Create(ARC_Config **config){
"<allowSpace> -> SPACE <allowSpace> | TAB <allowSpace> | LAMBDA\n"
"<type> -> <variable> | <variable> <whitespace> <array>\n"
"<value> -> <variable> | <numberSign> | <string> | <nestedValue>\n"
"<value> -> <variable> | <float> | <numberSign> | <string> | <nestedValue>\n"
"<nestedValue> -> OPEN_CURLY_BRACE <whitespace> <valueArgs> <whitespace> CLOSE_CURLY_BRACE\n"
"<valueArgs> -> <value> <whitespace> COMMA <whitespace> <valueArgs> | <value>\n"
@ -680,6 +683,7 @@ void ARC_Config_Create(ARC_Config **config){
"<stringChar> -> TAB | SPACE | BANG | HASH | DOLLAR | PERCENT | AMPERSAND | SINGLE_QUOTE | OPEN_PAREN | CLOSE_PAREN | ASTERISK | PLUS | COMMA | MINUS | PERIOD | SLASH | NUMBER | COLON | SEMICOLON | LESS_THAN | GREATER_THAN | EQUAL | QUESTION_MARK | AT | ALPHA_UPPER_CHAR | OPEN_BRACKET | CLOSE_BRACKET | CARET | UNDERSCORE | GRAVE | ALPHA_LOWER_CHAR | OPEN_CURLY_BRACE | VERTICAL_LINE | CLOSE_CURLY_BRACE | TILDE\n"
"<escapeChar> -> BACKSLASH BACKSLASH | BACKSLASH QUOTE | BACKSLASH ALPHA_UPPER_CHAR | BACKSLASH ALPHA_LOWER_CHAR\n"
"<float> -> <number> PERIOD <number> | <number> PERIOD | PERIOD <number>\n"
"<numberSign> -> MINUS <number> | <number>\n"
"<number> -> NUMBER <number> | NUMBER\n"
@ -764,6 +768,156 @@ void ARC_Config_RegisterTypeWithCStr(ARC_Config *config, const char *typeNameCSt
ARC_Hashtable_Add(config->types, typeNameCopy, typeCopy);
}
void ARC_Config_Add(ARC_Config *config, ARC_String *type, ARC_String *name, void *value){
//check if type exists in the types hashtable
ARC_ConfigType *typeValue = (ARC_ConfigType *)ARC_Hashtable_Get(config->types, name->data);
if(type == NULL){
//throw an error and return
arc_errno = ARC_ERRNO_DATA;
ARC_DEBUG_LOG_ERROR_WITH_VARIABLES("ARC_Config_Add(config, type, name, value), type \"%s\" was not registered to config", type->data);
return;
}
//check if the group separator exists
uint64_t startSeparatorIndex = ARC_String_FindCStringWithStrlen(name, ARC_CONFIG_GROUP_SEPARATOR);
if(startSeparatorIndex == ~(uint64_t)0){
//check to see if the current variable is already in the current group hashtable
ARC_ConfigTypeData *typeData = (ARC_ConfigTypeData *)ARC_Hashtable_Get(config->currentGroup, name->data);
if(typeData != NULL){
//there is already a value so throw an error and return
arc_errno = ARC_ERRNO_DATA;
ARC_DEBUG_LOG_ERROR_WITH_VARIABLES("ARC_ConfigData_RunVariableLineTag(tagToken, config), variable \"%s\" already registered to the current group", name->data);
return;
}
//create where to store either the type data
typeData = (ARC_ConfigTypeData *)malloc(sizeof(ARC_ConfigTypeData));
typeData->destroyFn = typeValue->destroyFn;
typeData->data = value;
//copy the name into a cstring that will be stored in the hashtable
char *nameVariableCStr = malloc(sizeof(char) * (name->length + 1));
strncpy(nameVariableCStr, name->data, name->length);
nameVariableCStr[name->length] = '\0';
//add to the current group hashtable
ARC_Hashtable_Add(config->currentGroup, (void *)nameVariableCStr, (void *)typeData);
return;
}
//reset the group the the default group
config->currentGroup = ARC_Hashtable_Get(config->groups, (void *)ARC_CONFIG_DEFAULT_GROUP);
if(startSeparatorIndex != 0){
//get the group
startSeparatorIndex--;
ARC_String *groupString;
ARC_String_CopySubstring(&groupString, name, 0, startSeparatorIndex);
//set the group
config->currentGroup = ARC_Hashtable_Get(config->groups, (void *)groupString->data);
//cleanup
ARC_String_Destroy(groupString);
}
//get the name
ARC_String *nameString;
startSeparatorIndex += strlen(ARC_CONFIG_GROUP_SEPARATOR);
ARC_String_CopySubstring(&nameString, name, startSeparatorIndex, name->length - startSeparatorIndex);
//check to see if the current variable is already in the current group hashtable
ARC_ConfigTypeData *typeData = (ARC_ConfigTypeData *)ARC_Hashtable_Get(config->currentGroup, nameString->data);
if(typeData != NULL){
//there is already a value so throw an error and return
arc_errno = ARC_ERRNO_DATA;
ARC_DEBUG_LOG_ERROR_WITH_VARIABLES("ARC_ConfigData_RunVariableLineTag(tagToken, config), variable \"%s\" already registered to the current group", name->data);
return;
}
//create where to store either the type data
typeData = (ARC_ConfigTypeData *)malloc(sizeof(ARC_ConfigTypeData));
typeData->destroyFn = typeValue->destroyFn;
typeData->data = value;
//copy the name into a cstring that will be stored in the hashtable
char *nameVariableCStr = malloc(sizeof(char) * (name->length + 1));
strncpy(nameVariableCStr, name->data, name->length);
nameVariableCStr[name->length] = '\0';
//add to the current group hashtable
ARC_Hashtable_Add(config->currentGroup, (void *)nameVariableCStr, (void *)typeData);
}
void ARC_Config_AddWithCStr(ARC_Config *config, const char *type, const char *name, void *value){
//create and copy strings
ARC_String *typeString;
ARC_String *nameString;
ARC_String_CreateWithStrlen(&typeString, (char *)type);
ARC_String_CreateWithStrlen(&nameString, (char *)name);
//add as an ARC_String
ARC_Config_Add(config, typeString, nameString, value);
//cleanup
ARC_String_Destroy(nameString);
ARC_String_Destroy(typeString);
}
void ARC_Config_Remove(ARC_Config *config, ARC_String *name){
//check if the group separator exists
uint64_t startSeparatorIndex = ARC_String_FindCStringWithStrlen(name, ARC_CONFIG_GROUP_SEPARATOR);
if(startSeparatorIndex == ~(uint64_t)0){
//remove the value from the hashtable if it exists
ARC_ConfigTypeData *typeData = (ARC_ConfigTypeData *)ARC_Hashtable_Get(config->currentGroup, (void *)name->data);
if(typeData != NULL){
ARC_Hashtable_Remove(config->currentGroup, (void *)name->data);
}
return;
}
//reset the group the the default group
config->currentGroup = ARC_Hashtable_Get(config->groups, (void *)ARC_CONFIG_DEFAULT_GROUP);
if(startSeparatorIndex != 0){
//get the group
startSeparatorIndex--;
ARC_String *groupString;
ARC_String_CopySubstring(&groupString, name, 0, startSeparatorIndex);
//set the group
config->currentGroup = ARC_Hashtable_Get(config->groups, (void *)groupString->data);
//cleanup
ARC_String_Destroy(groupString);
}
//get the name
ARC_String *nameString;
startSeparatorIndex += strlen(ARC_CONFIG_GROUP_SEPARATOR);
ARC_String_CopySubstring(&nameString, name, startSeparatorIndex, name->length - startSeparatorIndex);
//remove the value from the hashtable if it exists
ARC_ConfigTypeData *typeData = (ARC_ConfigTypeData *)ARC_Hashtable_Get(config->currentGroup, (void *)name->data);
if(typeData != NULL){
ARC_Hashtable_Remove(config->currentGroup, (void *)name->data);
}
ARC_String_Destroy(nameString);
}
void ARC_Config_RemoveWithCStr(ARC_Config *config, const char *name){
//create and copy strings
ARC_String *nameString;
ARC_String_CreateWithStrlen(&nameString, (char *)name);
//add as an ARC_String
ARC_Config_Remove(config, nameString);
//cleanup
ARC_String_Destroy(nameString);
}
void ARC_Config_SetGroup(ARC_Config *config, ARC_String *groupName){
ARC_Config_SetGroupWithCStr(config, groupName->data);
}
@ -799,6 +953,10 @@ void *ARC_Config_Get(ARC_Config *config, ARC_String *name){
return typeData->data;
}
//reset the group the the default group
config->currentGroup = ARC_Hashtable_Get(config->groups, (void *)ARC_CONFIG_DEFAULT_GROUP);
if(startSeparatorIndex != 0){
//get the group
startSeparatorIndex--;
ARC_String *groupString;
@ -809,6 +967,7 @@ void *ARC_Config_Get(ARC_Config *config, ARC_String *name){
//cleanup
ARC_String_Destroy(groupString);
}
//get the name
ARC_String *nameString;
@ -880,8 +1039,8 @@ void ARC_Config_InitStd(ARC_Config *config){
ARC_Config_RegisterTypeWithCStr(config, "uint32" , (ARC_ConfigType){ ARC_ConfigType_Uint32CopyFn, ARC_ConfigType_Uint32DestroyFn, NULL });
ARC_Config_RegisterTypeWithCStr(config, "int64" , (ARC_ConfigType){ ARC_ConfigType_Int64CopyFn , ARC_ConfigType_Int64DestroyFn , NULL });
ARC_Config_RegisterTypeWithCStr(config, "uint64" , (ARC_ConfigType){ ARC_ConfigType_Uint64CopyFn, ARC_ConfigType_Uint64DestroyFn, NULL });
//ARC_Config_RegisterTypeWithCStr(config, "float" , (ARC_ConfigType){ ARC_ConfigType_FloatCopyFn , ARC_ConfigType_FloatDestroyFn , NULL });
//ARC_Config_RegisterTypeWithCStr(config, "double" , (ARC_ConfigType){ ARC_ConfigType_DoubleCopyFn, ARC_ConfigType_DoubleDestroyFn, NULL });
ARC_Config_RegisterTypeWithCStr(config, "float" , (ARC_ConfigType){ ARC_ConfigType_FloatCopyFn , ARC_ConfigType_FloatDestroyFn , NULL });
ARC_Config_RegisterTypeWithCStr(config, "double" , (ARC_ConfigType){ ARC_ConfigType_DoubleCopyFn, ARC_ConfigType_DoubleDestroyFn, NULL });
ARC_Config_RegisterTypeWithCStr(config, "ARC_String", (ARC_ConfigType){ ARC_ConfigType_StringCopyFn, ARC_ConfigType_StringDestroyFn, NULL });
}
@ -890,7 +1049,7 @@ void ARC_ConfigType_BoolCopyFn(void **type, ARC_ParserTagToken *parsedData, ARC_
ARC_ParserTagToken *childTagToken = (ARC_ParserTagToken *)ARC_Vector_Get(parsedData->tagTokens, 0);
if(childTagToken->id != ARC_CONFIG_VARIABLE){
arc_errno = ARC_ERRNO_DATA;
ARC_DEBUG_LOG_ERROR("ARC_ConfigType_BoolNumberHelperCopyFn(type, parsedData, config), parsed data was not a <numberSign>");
ARC_DEBUG_LOG_ERROR("ARC_ConfigType_BoolNumberHelperCopyFn(type, parsedData, config, userdata), parsed data was not a <numberSign>");
*type = NULL;
return;
}
@ -920,7 +1079,7 @@ void ARC_ConfigType_BoolCopyFn(void **type, ARC_ParserTagToken *parsedData, ARC_
//error if true or false was not passed in
arc_errno = ARC_ERRNO_DATA;
ARC_DEBUG_LOG_ERROR_WITH_VARIABLES("ARC_ConfigType_BoolNumberHelperCopyFn(type, parsedData, config), bool can only be \"true\" or \"false\" but was given \"%s\"", value->data);
ARC_DEBUG_LOG_ERROR_WITH_VARIABLES("ARC_ConfigType_BoolNumberHelperCopyFn(type, parsedData, config, userdata), bool can only be \"true\" or \"false\" but was given \"%s\"", value->data);
ARC_String_Destroy(value);
*type = NULL;
}
@ -935,7 +1094,7 @@ void ARC_ConfigType_IntNumberHelperCopyFn(void **type, ARC_ParserTagToken *parse
ARC_ParserTagToken *childTagToken = (ARC_ParserTagToken *)ARC_Vector_Get(parsedData->tagTokens, 0);
if(childTagToken->id != ARC_CONFIG_NUMBER_SIGN){
arc_errno = ARC_ERRNO_DATA;
ARC_DEBUG_LOG_ERROR("ARC_ConfigType_IntNumberHelperCopyFn(type, parsedData, config), parsed data was not a <numberSign>");
ARC_DEBUG_LOG_ERROR("ARC_ConfigType_IntNumberHelperCopyFn(type, parsedData, maxSize), parsed data was not a <numberSign>");
*type = NULL;
return;
}
@ -972,7 +1131,7 @@ void ARC_ConfigType_IntNumberHelperCopyFn(void **type, ARC_ParserTagToken *parse
//if the string is bigger than the possible size return NULL and error
if(intString->length > maxSizeLength){
arc_errno = ARC_ERRNO_DATA;
ARC_DEBUG_LOG_ERROR_WITH_VARIABLES("ARC_ConfigType_IntNumberHelperCopyFn(type, parsedData, config), size \"%s\" was bigger or smaller than than the max %lu or min %lu", intString->data, maxPositiveSize, (maxPositiveSize * -1) - 1);
ARC_DEBUG_LOG_ERROR_WITH_VARIABLES("ARC_ConfigType_IntNumberHelperCopyFn(type, parsedData, maxSize), size \"%s\" was bigger or smaller than than the max %lu or min %lu", intString->data, maxPositiveSize, (maxPositiveSize * -1) - 1);
*type = NULL;
ARC_String_Destroy(intString);
return;
@ -989,7 +1148,7 @@ void ARC_ConfigType_IntNumberHelperCopyFn(void **type, ARC_ParserTagToken *parse
for(int8_t index = maxSize + 1; index >= 0; index--, stringIndex--){
if(intString->data[stringIndex] > maxintCStr[index]){
arc_errno = ARC_ERRNO_DATA;
ARC_DEBUG_LOG_ERROR_WITH_VARIABLES("ARC_ConfigType_IntNumberHelperCopyFn(type, parsedData, config), size \"%s\" was bigger than the max of the signed value %lu", intString->data, maxSize);
ARC_DEBUG_LOG_ERROR_WITH_VARIABLES("ARC_ConfigType_IntNumberHelperCopyFn(type, parsedData, maxSize), size \"%s\" was bigger than the max of the signed value %lu", intString->data, maxSize);
*type = NULL;
ARC_String_Destroy(intString);
return;
@ -1017,14 +1176,14 @@ void ARC_ConfigType_UintNumberHelperCopyFn(void **type, ARC_ParserTagToken *pars
ARC_ParserTagToken *childTagToken = (ARC_ParserTagToken *)ARC_Vector_Get(parsedData->tagTokens, 0);
if(childTagToken->id != ARC_CONFIG_NUMBER_SIGN){
arc_errno = ARC_ERRNO_DATA;
ARC_DEBUG_LOG_ERROR("ARC_ConfigType_UintNumberHelperCopyFn(type, parsedData, config), parsed data was not a <numberSign>");
ARC_DEBUG_LOG_ERROR("ARC_ConfigType_UintNumberHelperCopyFn(type, parsedData, maxSize), parsed data was not a <numberSign>");
*type = NULL;
return;
}
if(childTagToken->id == ARC_CONFIG_MINUS){
arc_errno = ARC_ERRNO_DATA;
ARC_DEBUG_LOG_ERROR("ARC_ConfigType_UintNumberHelperCopyFn(type, parsedData, config), parsed data had a minus sign, uint numbers must be positive");
ARC_DEBUG_LOG_ERROR("ARC_ConfigType_UintNumberHelperCopyFn(type, parsedData, maxSize), parsed data had a minus sign, uint numbers must be positive");
*type = NULL;
return;
}
@ -1047,7 +1206,7 @@ void ARC_ConfigType_UintNumberHelperCopyFn(void **type, ARC_ParserTagToken *pars
//if the string is bigger than the possible size return NULL and error
if(uintString->length > maxSizeLength){
arc_errno = ARC_ERRNO_DATA;
ARC_DEBUG_LOG_ERROR_WITH_VARIABLES("ARC_ConfigType_UintNumberHelperCopyFn(type, parsedData, config), size \"%s\" was bigger than the max %lu", uintString->data, maxSize);
ARC_DEBUG_LOG_ERROR_WITH_VARIABLES("ARC_ConfigType_UintNumberHelperCopyFn(type, parsedData, maxSize), size \"%s\" was bigger than the max %lu", uintString->data, maxSize);
*type = NULL;
ARC_String_Destroy(uintString);
return;
@ -1063,7 +1222,7 @@ void ARC_ConfigType_UintNumberHelperCopyFn(void **type, ARC_ParserTagToken *pars
for(int8_t index = maxSize + 1; index >= 0; index--, stringIndex--){
if(uintString->data[stringIndex] > maxuintCStr[index]){
arc_errno = ARC_ERRNO_DATA;
ARC_DEBUG_LOG_ERROR_WITH_VARIABLES("ARC_ConfigType_UintNumberHelperCopyFn(type, parsedData, config), size \"%s\" was bigger than the max %lu", uintString->data, maxSize);
ARC_DEBUG_LOG_ERROR_WITH_VARIABLES("ARC_ConfigType_UintNumberHelperCopyFn(type, parsedData, maxSize), size \"%s\" was bigger than the max %lu", uintString->data, maxSize);
*type = NULL;
ARC_String_Destroy(uintString);
return;
@ -1150,19 +1309,94 @@ void ARC_ConfigType_Uint64DestroyFn(void *type){
}
void ARC_ConfigType_FloatCopyFn(void **type, ARC_ParserTagToken *parsedData, ARC_Config *config, void *userdata){
//TODO: write this
//go into the <float> tag
ARC_ParserTagToken *childTagToken = (ARC_ParserTagToken *)ARC_Vector_Get(parsedData->tagTokens, 0);
if(childTagToken->id != ARC_CONFIG_FLOAT && childTagToken->id != ARC_CONFIG_NUMBER_SIGN){
arc_errno = ARC_ERRNO_DATA;
ARC_DEBUG_LOG_ERROR("ARC_ConfigType_FloatCopyFn(type, parsedData, config, userdata), parsed data was not a <float> or <numberSign>");
*type = NULL;
return;
}
//get the float as a string
ARC_String *floatString;
ARC_String_Create(&floatString, NULL, 0);
ARC_ParserData_HelperRecurseStringAdd(&floatString, parsedData);
//get the value as a float
char *endptr;
float value = strtof(floatString->data, &endptr);
//error check
if(floatString->data == endptr){
arc_errno = ARC_ERRNO_DATA;
ARC_DEBUG_LOG_ERROR_WITH_VARIABLES("ARC_ConfigType_FloatCopyFn(type, parsedData, config, userdata), parsed data \"%s\" was not a <float> or <numberSign>", floatString->data);
//cleanup
ARC_String_Destroy(floatString);
//set the type to NULL
*type = NULL;
return;
}
//cleanup
ARC_String_Destroy(floatString);
//copy the value into a new double, then pass it out through type
float *valuePointer = malloc(sizeof(float));
*valuePointer = value;
*type = valuePointer;
}
void ARC_ConfigType_FloatDestroyFn(void *type){
//TODO: write this
free((float *)type);
}
void ARC_ConfigType_DoubleCopyFn(void **type, ARC_ParserTagToken *parsedData, ARC_Config *config, void *userdata){
//TODO: write this
//go into the <float> tag
//note the float tag means floating point number in this context, and a double does have a flating point
ARC_ParserTagToken *childTagToken = (ARC_ParserTagToken *)ARC_Vector_Get(parsedData->tagTokens, 0);
if(childTagToken->id != ARC_CONFIG_FLOAT && childTagToken->id != ARC_CONFIG_NUMBER_SIGN){
arc_errno = ARC_ERRNO_DATA;
ARC_DEBUG_LOG_ERROR("ARC_ConfigType_FloatCopyFn(type, parsedData, config, userdata), parsed data was not a <float> or <numberSign>");
*type = NULL;
return;
}
//get the double as a string
ARC_String *doubleString;
ARC_String_Create(&doubleString, NULL, 0);
ARC_ParserData_HelperRecurseStringAdd(&doubleString, parsedData);
//get the value as a double
char *endptr;
double value = strtod(doubleString->data, &endptr);
//error check
if(doubleString->data == endptr){
arc_errno = ARC_ERRNO_DATA;
ARC_DEBUG_LOG_ERROR_WITH_VARIABLES("ARC_ConfigType_FloatCopyFn(type, parsedData, config, userdata), parsed data \"%s\" was not a <float> or <numberSign>", doubleString->data);
//cleanup
ARC_String_Destroy(doubleString);
//set the type to NULL
*type = NULL;
return;
}
//cleanup
ARC_String_Destroy(doubleString);
//copy the value into a new double, then pass it out through type
double *valuePointer = malloc(sizeof(double));
*valuePointer = value;
*type = valuePointer;
}
void ARC_ConfigType_DoubleDestroyFn(void *type){
//TODO: write this
free((double *)type);
}
void ARC_ConfigType_StringCopyFn(void **type, ARC_ParserTagToken *parsedData, ARC_Config *config, void *userdata){