int IFabricConfigurationPackage_to_ARGC_ARGV()

in src/fc_package.c [259:357]


int IFabricConfigurationPackage_to_ARGC_ARGV(IFabricConfigurationPackage* iFabricConfigurationPackage, int* argc, char*** argv)
{
    int result;
    if (
        (iFabricConfigurationPackage == NULL) ||
        (argc == NULL) ||
        (argv == NULL)
        )
    {
        LogError("invalid argument IFabricConfigurationPackage* iFabricConfigurationPackage=%p, int* argc=%p, char*** argv=%p",
            iFabricConfigurationPackage, argc, argv);
        result = MU_FAILURE;
    }
    else
    {
        *argv = malloc_2(2, sizeof(char*));
        if (*argv == NULL)
        {
            LogError("failure in malloc_2");
            result = MU_FAILURE;
        }
        else
        {
            if (((*argv)[0] = sprintf_char(CONFIGURATION_PACKAGE_NAME)) == NULL)
            {
                LogError("failure in sprintf_char");
                result = MU_FAILURE;
            }
            else
            {
                const FABRIC_CONFIGURATION_PACKAGE_DESCRIPTION* fabric_configuration_package_description = iFabricConfigurationPackage->lpVtbl->get_Description(iFabricConfigurationPackage);
                if (fabric_configuration_package_description == NULL)
                {
                    LogError("failure in get_Description");
                    result = MU_FAILURE;
                }
                else
                {
                    if (fabric_configuration_package_description->Name == NULL)
                    {
                        LogError("unexpected fabric_configuration_package_description->Name == NULL");
                        result = MU_FAILURE;
                    }
                    else
                    {
                        if (((*argv)[1] = sprintf_char("%ls", fabric_configuration_package_description->Name)) == NULL)
                        {
                            LogError("failure in sprintf_char");
                            result = MU_FAILURE;
                        }
                        else
                        {
                            *argc = 2;
                            const FABRIC_CONFIGURATION_SETTINGS* fabric_configuration_settings = iFabricConfigurationPackage->lpVtbl->get_Settings(iFabricConfigurationPackage);
                            if (fabric_configuration_settings == NULL)
                            {
                                LogError("unexpected get_Settings returning NULL");
                                result = MU_FAILURE;
                            }
                            else
                            {
                                const FABRIC_CONFIGURATION_SECTION_LIST* fabric_configuration_section_list = fabric_configuration_settings->Sections;

                                int p_argc;
                                char** p_argv;
                                if (FABRIC_CONFIGURATION_SECTION_LIST_to_ARGC_ARGV(fabric_configuration_section_list, &p_argc, &p_argv) != 0)
                                {
                                    LogError("failure in FABRIC_CONFIGURATION_SECTION_LIST_to_ARGC_ARGV");
                                    result = MU_FAILURE;
                                }
                                else
                                {
                                    if (ARGC_ARGV_concat(argc, argv, p_argc, p_argv) != 0)
                                    {
                                        ARGC_ARGV_free(p_argc, p_argv);
                                        LogError("failure in ARGC_ARGV_concat");
                                        result = MU_FAILURE;
                                    }
                                    else
                                    {
                                        result = 0;
                                        ARGC_ARGV_free(p_argc, p_argv);
                                        goto allok;
                                    }
                                }

                            }
                            free((*argv)[1]);
                        }
                    }
                }
                free((*argv)[0]);
            }
            free(*argv);
        }
    }
allok:;
    return result;
}