in src/fc_parameter_list_argc_argv.c [81:152]
ARGC_ARGV_DATA_RESULT FABRIC_CONFIGURATION_PARAMETER_LIST_from_ARGC_ARGV(int argc, char** argv, FABRIC_CONFIGURATION_PARAMETER_LIST* fabric_configuration_parameter_list, int* argc_consumed)
{
ARGC_ARGV_DATA_RESULT result;
/*scan parameteres until either: argc is consumed, or parameter scan fails*/
fabric_configuration_parameter_list->Count = 0;
fabric_configuration_parameter_list->Items = NULL;
bool error = false;
bool done_scanning = false;
*argc_consumed = 0;
while (!error && !done_scanning && argc > 0)
{
FABRIC_CONFIGURATION_PARAMETER temp;
int consumed = 0;
ARGC_ARGV_DATA_RESULT r = FABRIC_CONFIGURATION_PARAMETER_from_ARGC_ARGV(argc, argv, &temp, &consumed);
switch (r)
{
case ARGC_ARGV_DATA_OK:
{
fabric_configuration_parameter_list->Count++;
FABRIC_CONFIGURATION_PARAMETER* re = realloc_2((void*)fabric_configuration_parameter_list->Items, fabric_configuration_parameter_list->Count, sizeof(FABRIC_CONFIGURATION_PARAMETER));
if (re == NULL)
{
LogError("failure in realloc_2");
fabric_configuration_parameter_list->Count--;
error = true;
}
else
{
fabric_configuration_parameter_list->Items = re;
/*cast the const away*/
*(FABRIC_CONFIGURATION_PARAMETER*)&(fabric_configuration_parameter_list->Items[fabric_configuration_parameter_list->Count - 1]) = temp;
argc -= consumed;
argv += consumed;
*argc_consumed += consumed;
}
break;
}
case ARGC_ARGV_DATA_INVALID:
{
/*not an error, likely the section ended somehow*/
LogVerbose("done scanning");
done_scanning = true;
break;
}
case ARGC_ARGV_DATA_ERROR:
default:
{
LogError("failure in FABRIC_CONFIGURATION_PARAMETER_from_ARGC_ARGV");
error = true;
break;
}
}
}
if (done_scanning || argc == 0)
{
result = ARGC_ARGV_DATA_OK; /*(note: this function doesn't really return "invalid" because 0 size list is still valid*/
}
else
{
/*attempt cleanup*/
for (unsigned int i = 0; i < fabric_configuration_parameter_list->Count; i++)
{
FABRIC_CONFIGURATION_PARAMETER_free((FABRIC_CONFIGURATION_PARAMETER*)fabric_configuration_parameter_list->Items + fabric_configuration_parameter_list->Count);
free((void*)fabric_configuration_parameter_list->Items);
}
result = ARGC_ARGV_DATA_ERROR;
}
return result;
}