adding default standard types to config

This commit is contained in:
herbglitch 2025-03-20 05:34:03 -06:00
parent 22faf6a02b
commit ce9e6a1c9a
2 changed files with 333 additions and 0 deletions

View file

@ -760,3 +760,201 @@ void ARC_Config_UnloadFromFile(ARC_Config *config, ARC_String *path){
ARC_Parser_ParseFile(config->parser, path);
}
void ARC_Config_InitStdTypes(ARC_Config *config){
//ARC_Config_RegisterTypeWithCStr(config, "bool" , (ARC_ConfigType){ ARC_ConfigType_BoolCopyFn , ARC_ConfigType_BoolDestroyFn , NULL });
//ARC_Config_RegisterTypeWithCStr(config, "int8" , (ARC_ConfigType){ ARC_ConfigType_Int8CopyFn , ARC_ConfigType_Int8DestroyFn , NULL });
ARC_Config_RegisterTypeWithCStr(config, "uint8" , (ARC_ConfigType){ ARC_ConfigType_Uint8CopyFn , ARC_ConfigType_Uint8DestroyFn , NULL });
//ARC_Config_RegisterTypeWithCStr(config, "int16" , (ARC_ConfigType){ ARC_ConfigType_Int16CopyFn , ARC_ConfigType_Int16DestroyFn , NULL });
ARC_Config_RegisterTypeWithCStr(config, "uint16" , (ARC_ConfigType){ ARC_ConfigType_Uint16CopyFn, ARC_ConfigType_Uint16DestroyFn, NULL });
//ARC_Config_RegisterTypeWithCStr(config, "int32" , (ARC_ConfigType){ ARC_ConfigType_Int32CopyFn , ARC_ConfigType_Int32DestroyFn , NULL });
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, "ARC_String", (ARC_ConfigType){ ARC_ConfigType_StringCopyFn, ARC_ConfigType_StringDestroyFn, NULL });
}
void ARC_ConfigType_BoolCopyFn(void **type, ARC_ParserTagToken *parsedData, ARC_Config *config, void *userdata){
//TODO: write this
}
void ARC_ConfigType_BoolDestroyFn(void *type){
//TODO: write this
}
//private function to make checking ints much easier
void ARC_ConfigType_IntNumberHelperCopyFn(void **type, ARC_ParserTagToken *parsedData, uint64_t maxSize){
//TODO: write this
}
//private function to make checking uints much easier
void ARC_ConfigType_UintNumberHelperCopyFn(void **type, ARC_ParserTagToken *parsedData, uint64_t maxSize){
//go into the <numberSign> tag
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>");
*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");
*type = NULL;
return;
}
//check if the first tag is a minus sign and create a string starting with that if it is
childTagToken = (ARC_ParserTagToken *)ARC_Vector_Get(childTagToken->tagTokens, 0);
ARC_String *uintString;
ARC_String_Create(&uintString, NULL, 0);
//get the number as a string
ARC_ParserData_HelperRecurseStringAdd(&uintString, parsedData);
//TODO: check that this gives the right number
//get the length of the max size
uint32_t maxSizeLength = 0;
for(uint32_t size = maxSize; 0 < size; size /= 10){
maxSizeLength++;
}
//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);
*type = NULL;
ARC_String_Destroy(uintString);
return;
}
if(uintString->length == maxSize){
//the max size of a uint64 is 8,446,744,073,709,551,615 so 19 will be big enough for the size
char maxuintCStr[19];
sprintf(maxuintCStr, "%lu", maxSize);
//check that the number is less than the max
int8_t stringIndex = maxSize;
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);
*type = NULL;
ARC_String_Destroy(uintString);
return;
}
//if the number is smaller it is safe to stop checking
if(uintString->data[stringIndex] < maxuintCStr[index]){
break;
}
}
}
//copy the int value
*type = malloc(maxSizeLength);
uint64_t valueAsUint64 = ARC_String_ToUint64_t(uintString);
memcpy(*type, &valueAsUint64, maxSizeLength);
//cleanup
ARC_String_Destroy(uintString);
}
void ARC_ConfigType_Int8CopyFn(void **type, ARC_ParserTagToken *parsedData, ARC_Config *config, void *userdata){
ARC_ConfigType_IntNumberHelperCopyFn(type, parsedData, ~(uint8_t)0);
}
void ARC_ConfigType_Int8DestroyFn(void *type){
free((int8_t *)type);
}
void ARC_ConfigType_Uint8CopyFn(void **type, ARC_ParserTagToken *parsedData, ARC_Config *config, void *userdata){
ARC_ConfigType_UintNumberHelperCopyFn(type, parsedData, ~(uint8_t)0);
}
void ARC_ConfigType_Uint8DestroyFn(void *type){
free((uint8_t *)type);
}
void ARC_ConfigType_Int16CopyFn(void **type, ARC_ParserTagToken *parsedData, ARC_Config *config, void *userdata){
ARC_ConfigType_IntNumberHelperCopyFn(type, parsedData, ~(uint16_t)0);
}
void ARC_ConfigType_Int16DestroyFn(void *type){
free((int16_t *)type);
}
void ARC_ConfigType_Uint16CopyFn(void **type, ARC_ParserTagToken *parsedData, ARC_Config *config, void *userdata){
ARC_ConfigType_UintNumberHelperCopyFn(type, parsedData, ~(uint16_t)0);
}
void ARC_ConfigType_Uint16DestroyFn(void *type){
free((uint16_t *)type);
}
void ARC_ConfigType_Int32CopyFn(void **type, ARC_ParserTagToken *parsedData, ARC_Config *config, void *userdata){
ARC_ConfigType_IntNumberHelperCopyFn(type, parsedData, ~(uint32_t)0);
}
void ARC_ConfigType_Int32DestroyFn(void *type){
free((int32_t *)type);
}
void ARC_ConfigType_Uint32CopyFn(void **type, ARC_ParserTagToken *parsedData, ARC_Config *config, void *userdata){
ARC_ConfigType_UintNumberHelperCopyFn(type, parsedData, ~(uint32_t)0);
}
void ARC_ConfigType_Uint32DestroyFn(void *type){
free((uint32_t *)type);
}
void ARC_ConfigType_Int64CopyFn(void **type, ARC_ParserTagToken *parsedData, ARC_Config *config, void *userdata){
ARC_ConfigType_IntNumberHelperCopyFn(type, parsedData, ~(uint64_t)0);
}
void ARC_ConfigType_Int64DestroyFn(void *type){
free((int64_t *)type);
}
void ARC_ConfigType_Uint64CopyFn(void **type, ARC_ParserTagToken *parsedData, ARC_Config *config, void *userdata){
ARC_ConfigType_UintNumberHelperCopyFn(type, parsedData, ~(uint64_t)0);
}
void ARC_ConfigType_Uint64DestroyFn(void *type){
free((uint64_t *)type);
}
void ARC_ConfigType_FloatCopyFn(void **type, ARC_ParserTagToken *parsedData, ARC_Config *config, void *userdata){
//TODO: write this
}
void ARC_ConfigType_FloatDestroyFn(void *type){
//TODO: write this
}
void ARC_ConfigType_DoubleCopyFn(void **type, ARC_ParserTagToken *parsedData, ARC_Config *config, void *userdata){
//TODO: write this
}
void ARC_ConfigType_DoubleDestroyFn(void *type){
//TODO: write this
}
void ARC_ConfigType_StringCopyFn(void **type, ARC_ParserTagToken *parsedData, ARC_Config *config, void *userdata){
if(parsedData->id != ARC_CONFIG_STRING){
arc_errno = ARC_ERRNO_DATA;
ARC_DEBUG_LOG_ERROR("ARC_ConfigType_StringCopyFn(void **type, ARC_ParserTagToken *parsedData, ARC_Config *config, void *userdata), string was not passed in for ARC_String");
type = NULL;
return;
}
//get the string chars between the quotes
ARC_ParserTagToken *stringCharsTagToken = (ARC_ParserTagToken *)ARC_Vector_Get(parsedData->tagTokens, 1);
ARC_ParserData_HelperRecurseStringAdd((ARC_String **)type, stringCharsTagToken);
}
void ARC_ConfigType_StringDestroyFn(void *type){
ARC_String_Destroy(type);
}