FC_PACKAGE_HANDLE fc_package_create()

in src/fc_package.c [24:108]


FC_PACKAGE_HANDLE fc_package_create(int argc, char** argv, int* argc_consumed)
{
    FC_PACKAGE_HANDLE result;
    if (
        (argc < 2) ||
        (argv == NULL) ||
        (argc_consumed == NULL)
        )
    {
        LogError("invalid argument int argc=%d, char** argv=%p, int* argc_consumed=%p", argc, argv, argc_consumed);
        result = NULL;
    }
    else
    {
        /*consumed greedy until cannot parse anymore*/
        if (strcmp(argv[0], CONFIGURATION_PACKAGE_NAME) != 0)
        {
            LogVerbose("cannot parse because first argument is %s and it was expected to be " CONFIGURATION_PACKAGE_NAME "", argv[0]);
            *argc_consumed = 0;
            result = NULL;
        }
        else
        {
            result = malloc(sizeof(struct FC_PACKAGE_TAG));
            if (result == NULL)
            {
                LogError("Failure in malloc");
                /*return as is*/
            }
            else
            {
                result->fabric_configuration_package_description.Name = mbs_to_wcs(argv[1]);
                if (result->fabric_configuration_package_description.Name == NULL)
                {
                    LogError("failure in mbs_to_wcs(argv[1]=%s);", argv[1]);
                }
                else
                {
                    *argc_consumed = 2;
                    result->fabric_configuration_package_description.Reserved = NULL;
                    result->fabric_configuration_package_description.ServiceManifestName = FC_NOT_IMPLEMENTED_STRING;
                    result->fabric_configuration_package_description.ServiceManifestVersion = FC_NOT_IMPLEMENTED_STRING;
                    result->fabric_configuration_package_description.Version = FC_NOT_IMPLEMENTED_STRING;

                    result->fabric_configuration_settings.Reserved = NULL;
                    
                    result->fabric_configuration_settings.Sections = malloc(sizeof(FABRIC_CONFIGURATION_SECTION_LIST));
                    if (result->fabric_configuration_settings.Sections == NULL)
                    {
                        LogError("failure in malloc");
                    }
                    else
                    {
                        int c_argc;
                        ARGC_ARGV_DATA_RESULT r;
                        r = FABRIC_CONFIGURATION_SECTION_LIST_from_ARGC_ARGV(argc - *argc_consumed, argv + *argc_consumed, (FABRIC_CONFIGURATION_SECTION_LIST*)result->fabric_configuration_settings.Sections, &c_argc);

                        switch (r)
                        {
                            case ARGC_ARGV_DATA_OK:
                            {
                                *argc_consumed += c_argc;
                                goto allok;
                                break;
                            }
                            case ARGC_ARGV_DATA_INVALID:
                            case ARGC_ARGV_DATA_ERROR:
                            default:
                            {
                                LogError("error, FABRIC_CONFIGURATION_SECTION_LIST_from_ARGC_ARGV returned %" PRI_MU_ENUM "", MU_ENUM_VALUE(ARGC_ARGV_DATA_RESULT, r));
                                break;
                            }
                        }
                        free((void*)result->fabric_configuration_settings.Sections);
                    }
                    free((void*)result->fabric_configuration_package_description.Name);
                }
                free(result); 
                result = NULL;
            }
        }
    }
allok:;
    return result;
}