⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 config.cxx

📁 移植到WLIT项目的redboot源代码
💻 CXX
📖 第 1 页 / 共 5 页
字号:
    CYG_REPORT_FUNCARG2XV(this, transaction);    CYG_PRECONDITION_THISC();    CYG_PRECONDITION_CLASSC(transaction);    // Minimal consistency check before attempting anything complicated.    if (!database->is_known_target(target_name)) {        throw CdlInputOutputException("Unknown target " + target_name);    }    CdlInterpreter interp = this->get_interpreter();    CdlInterpreterBody::DiagSupport    diag_support(interp, error_fn, warn_fn);    CdlInterpreterBody::ContextSupport context_support(interp, "Hardware selection");        CdlConfiguration_CommitCancelHardwareName* rename_op = new CdlConfiguration_CommitCancelHardwareName(current_hardware);    try {        transaction->add_commit_cancel_op(rename_op);        const std::vector<CdlLoadable>& loadables = this->get_loadables();        int i;        for (i = (int) loadables.size() - 1; i >= 0; i--) {            CdlPackage package = dynamic_cast<CdlPackage>(loadables[i]);            if ((0 != package) && package->belongs_to_hardware()) {                this->unload_package(transaction, package, limbo);            }        }        current_hardware = "";        if ("" != target_name) {                        const std::vector<std::string>& packages = database->get_target_packages(target_name);            std::vector<std::string>::const_iterator    name_i;            for (name_i = packages.begin(); name_i != packages.end(); name_i++) {                // Target specifications may refer to packages that are not                // installed. This is useful in e.g. an anoncvs environment.                if (database->is_known_package(*name_i)) {                    // It is possible for a hardware package to have been                    // loaded separately, in which case there is no point in                    // loading it again.                    if (0 == this->lookup(*name_i)) {                        this->load_package(transaction, *name_i, "",                                           error_fn, warn_fn, limbo);                        CdlPackage package = dynamic_cast<CdlPackage>(this->lookup(*name_i));                        CYG_LOOP_INVARIANT_CLASSC(package);                        package->loaded_for_hardware = true;                    }                } else {                    CdlParse::report_warning(interp, "",                                             std::string("The target specification lists a package `") + *name_i +                                             "' which is not present in the component repository.");                }            }        }        current_hardware = target_name;            } catch(...) {        // Cancel all operations up to and including the rename_op        CdlTransactionCommitCancelOp* cancel_op = 0;        do {            cancel_op = transaction->get_last_commit_cancel_op();            CYG_LOOP_INVARIANTC(0 != cancel_op);            transaction->cancel_last_commit_cancel_op();        } while(cancel_op != rename_op);        throw;    }    // There may have been enables/disables and value data for that target    // FIXME: any problems get ignored quietly. There should at least    // be some warnings.    if ("" != target_name) {        const std::vector<std::string>& enables  = database->get_target_enables(target_name);        const std::vector<std::string>& disables = database->get_target_disables(target_name);        const std::vector<std::pair<std::string, std::string> >& set_values = database->get_target_set_values(target_name);                if ((0 != enables.size()) || (0 != disables.size()) || (0 != set_values.size())) {            std::vector<std::string>::const_iterator opt_i;            CdlNode     node;            CdlValuable valuable;            CdlValueFlavor flavor;                        for (opt_i = enables.begin(); opt_i != enables.end(); opt_i++) {                valuable = 0;                node     = this->lookup(*opt_i);                if (0 != node) {                    valuable = dynamic_cast<CdlValuable>(node);                    if (0 != valuable) {                    }                }                if (0 != valuable) {                    flavor = valuable->get_flavor();                    if ((CdlValueFlavor_Bool == flavor) || (CdlValueFlavor_BoolData == flavor)) {                        valuable->enable(transaction, CdlValueSource_User);                    } else {                        CdlParse::report_warning(interp, std::string("target `") + target_name + "'",                                                 std::string("The option `") + *opt_i +                                                 "' is supposed to be enabled for this target.\n" +                                                 "However the option does not have a bool or booldata flavors.");                    }                } else {                    CdlParse::report_warning(interp, std::string("target `") + target_name + "'",                                             std::string("The option `") + *opt_i +                                             "' is supposed to be enabled for this target.\n" +                                             "However this option is not in the current configuration.");                }            }            for (opt_i = disables.begin(); opt_i != disables.end(); opt_i++) {                valuable = 0;                node = this->lookup(*opt_i);                if (0 != node) {                    valuable = dynamic_cast<CdlValuable>(node);                }                if (0 != valuable) {                    flavor = valuable->get_flavor();                    if ((CdlValueFlavor_Bool == flavor) || (CdlValueFlavor_BoolData == flavor)) {                        valuable->disable(transaction, CdlValueSource_User);                    } else {                        CdlParse::report_warning(interp, std::string("target `") + target_name + "'",                                                 std::string("The option `") + *opt_i +                                                 "' is supposed to be disabled for this target.\n" +                                                 "However the option does not have a bool or booldata flavors.");                    }                } else {                    CdlParse::report_warning(interp, std::string("target `") + target_name + "'",                                             std::string("The option `") + *opt_i +                                             "' is supposed to be disabled for this target.\n" +                                             "However this option is not in the current configuration.");                }            }            std::vector<std::pair<std::string,std::string> >::const_iterator value_i;            for (value_i = set_values.begin(); value_i != set_values.end(); value_i++) {                valuable = 0;                node = this->lookup(value_i->first);                if (0 != node) {                    valuable = dynamic_cast<CdlValuable>(node);                }                if (0 != valuable) {                    flavor = valuable->get_flavor();                    if ((CdlValueFlavor_BoolData == flavor) || (CdlValueFlavor_Data == flavor)) {                        valuable->set_value(transaction, value_i->second, CdlValueSource_User);                    } else {                        CdlParse::report_warning(interp, std::string("target `") + target_name + "'",                                                 std::string("The option `") + *opt_i +                                                 "' is supposed to be given the value `" + value_i->second +                                                 "' for this target.\n" +                                                 "However the option does not have a data or booldata flavor.");                    }                } else {                    CdlParse::report_warning(interp, std::string("target `") + target_name + "'",                                             std::string("The option `") + *opt_i +                                             "' is supposed to be given the value `" + value_i->second +                                             "' for this target.\n" +                                             "However this option is not in the current configuration.");                }            }        }    }    CYG_REPORT_RETURN();}voidCdlConfigurationBody::unload_hardware(CdlTransaction transaction, bool limbo){    CYG_REPORT_FUNCNAME("CdlConfiguration::unload_hardware");    CYG_REPORT_FUNCARG3XV(this, transaction, limbo);    CYG_PRECONDITION_THISC();    CdlConfiguration_CommitCancelHardwareName* rename_op = new CdlConfiguration_CommitCancelHardwareName(current_hardware);    try {        transaction->add_commit_cancel_op(rename_op);    } catch(...) {        delete rename_op;        throw;    }    current_hardware = "";    try {        const std::vector<CdlLoadable>& loadables = this->get_loadables();        for (int i = (int) loadables.size() - 1; i >= 0; i--) {            CdlPackage package = dynamic_cast<CdlPackage>(loadables[i]);            if ((0 != package) && package->belongs_to_hardware()) {                this->unload_package(transaction, package, limbo);            }        }    } catch(...) {        CdlTransactionCommitCancelOp* cancel_op = 0;        do {            cancel_op = transaction->get_last_commit_cancel_op();            CYG_LOOP_INVARIANTC(0 != cancel_op);            transaction->cancel_last_commit_cancel_op();        } while(cancel_op != rename_op);        throw;    }    CYG_REPORT_RETURN();}//}}}//{{{  CdlConfiguration::set_template() etc             // ----------------------------------------------------------------------------voidCdlConfigurationBody::set_template_file(CdlTransaction transaction, std::string filename,                                        CdlDiagnosticFnPtr error_fn, CdlDiagnosticFnPtr warn_fn, bool limbo){    CYG_REPORT_FUNCNAME("CdlConfiguration::set_template_file");    CYG_REPORT_FUNCARG3XV(this, transaction, limbo);    CYG_PRECONDITION_THISC();    int i;    CdlConfiguration_CommitCancelTemplateName* rename_op = new CdlConfiguration_CommitCancelTemplateName(current_template);    // The hard work is done by add(), which loads in a partial savefile.    // This can have undesirable side effects: changing the name,    // description, or hardware settings. It must be possible to undo    // these.    std::string saved_name        = this->get_name();    std::string saved_description = this->get_description();    std::string saved_hardware    = this->get_hardware();    // New packages will end up at the end of the loadables vector.    // Each new package needs to be registered as a template one.    // NOTE: this may break if we start doing more interesting things    // with savefiles.    const std::vector<CdlLoadable>& loadables = this->get_loadables();    unsigned int load_i = loadables.size();        try {        transaction->add_commit_cancel_op(rename_op);        const std::vector<CdlLoadable>& loadables = this->get_loadables();        for (i = (int) loadables.size() - 1; i >= 0; i--) {            CdlPackage package = dynamic_cast<CdlPackage>(loadables[i]);            if ((0 != package) && package->belongs_to_template()) {                this->unload_package(transaction, package, limbo);            }        }        current_template = "";        this->add(transaction, filename, error_fn, warn_fn);        this->current_template = filename;        this->set_name(saved_name);        this->description = saved_description;        this->current_hardware = saved_hardware;        for ( ; load_i < loadables.size(); load_i++) {            CdlPackage pkg = dynamic_cast<CdlPackage>(loadables[load_i]);            CYG_ASSERT_CLASSC(pkg);            pkg->loaded_for_template = true;        }            } catch(...) {                this->set_name(saved_name);        this->description = saved_description;        this->current_hardware = saved_hardware;                // Cancel all operations up to and including the rename_op        CdlTransactionCommitCancelOp* cancel_op = 0;        do {            cancel_op = transaction->get_last_commit_cancel_op();            CYG_LOOP_INVARIANTC(0 != cancel_op);            transaction->cancel_last_commit_cancel_op();        } while(cancel_op != rename_op);        throw;    }        CYG_REPORT_RETURN();}voidCdlConfigurationBody::unload_template(CdlTransaction transaction, bool limbo){    CYG_REPORT_FUNCNAME("CdlConfiguration::unload_template");    CYG_REPORT_FUNCARG2XV(this, transaction);    CYG_PRECONDITION_THISC();    CYG_PRECONDITION_CLASSC(transaction);    CdlConfiguration_CommitCancelTemplateName* rename_op = new CdlConfiguration_CommitCancelTemplateName(current_template);    try {        transaction->add_commit_cancel_op(rename_op);    } catch(...) {        delete rename_op;        throw;    }    current_template = "";    try {        const std::vector<CdlLoadable>& loadables = this->get_loadables();        for (int i = (int) loadables.size() - 1; i >= 0; i--) {            CdlPackage package = dynamic_cast<CdlPackage>(loadables[i]);            if ((0 != package) && package->belongs_to_template()) {                this->unload_package(transaction, package, limbo);            }        }    } catch(...) {        CdlTransactionCommitCancelOp* cancel_op = 0;        do {            cancel_op = transaction->get_last_commit_cancel_op();            CYG_LOOP_INVARIANTC(0 != cancel_op);            transaction->cancel_last_commit_cancel_op();        } while(cancel_op != rename_op);        throw;    }        CYG_REPORT_RETURN();}//}}}//{{{  Persistence support                              //{{{  initialize_savefile_support()                    // ----------------------------------------------------------------------------// Initialization. The purpose of this code is to determine all the// commands that can end up in a particular savefile. This includes// the cdl_configuration command, commands relevant to packages,// options, and components, the generic library commands, and// application-specific commands.//// This is a virtual function, it may get invoked indirectly from// e.g. CdlToplevel::add_savefile_command().voidCdlConfigurationBody::initialize_savefile_support(){    CYG_REPORT_FUNCNAME("CdlConfiguration::initialize_savefile_support");    CYG_REPORT_FUNCARG1XV(this);    CYG_PRECONDITION_THISC();        // Start with the generic stuff such as cdl_savefile_version and    // cdl_command.    this->CdlToplevelBody::initialize_savefile_support();    // Now add in the cdl_configuration command and its subcommands.    this->add_savefile_command("cdl_configuration", 0, &savefile_configuration_command);    this->add_savefile_subcommand("cdl_configuration", "description", 0, &savefile_description_command);    this->add_savefile_subcommand("cdl_configuration", "hardware",    0, &savefile_hardware_command);    this->add_savefile_subcommand("cdl_configuration", "template",    0, &savefile_template_command);    this->add_savefile_subcommand("cdl_configuration", "package",     0, &savefile_package_command);    CdlPackageBody::initialize_savefile_support(this);    CdlComponentBody::initialize_savefile_support(this);    CdlOptionBody::initialize_savefile_support(this);    CdlInterfaceBody::initialize_savefile_support(this);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -