ARGC_ARGV_DATA_RESULT FABRIC_CONFIGURATION_PARAMETER_LIST_from_ARGC_ARGV()

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;
}