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

📄 database.cxx

📁 移植到WLIT项目的redboot源代码
💻 CXX
📖 第 1 页 / 共 5 页
字号:
}// Syntax: directory <path>// The path is of course relative to the component repository.intCdlDbParser::package_directory(CdlInterpreter interp, int argc, char** argv){    CYG_REPORT_FUNCNAMETYPE("CdlDbParser::package_directory", "result %d");    CYG_REPORT_FUNCARG1XV(argc);    CYG_PRECONDITION_CLASSC(interp);    std::string name = interp->get_variable(dbparser_pkgname);    CYG_ASSERTC("" != name);    CdlPackagesDatabaseBody::package_data* package =        static_cast<CdlPackagesDatabaseBody::package_data*>(interp->get_assoc_data(dbparser_pkgdata));    // There should be exactly one argument, and the directory command    // should be used only once.    if (2 != argc) {        CdlParse::report_error(interp, diag_package + name, "Only one directory can be specified.");    } else if ("" != package->directory) {        CdlParse::report_warning(interp, diag_package + name, "A package can be located in only one directory.");    } else {        package->directory = argv[1];    }    CYG_REPORT_RETVAL(TCL_OK);    return TCL_OK;}// Syntax: hardware// There are no arguments.intCdlDbParser::package_hardware(CdlInterpreter interp, int argc, char** argv){    CYG_REPORT_FUNCNAMETYPE("CdlDbParser::package_hardware", "result %d");    CYG_REPORT_FUNCARG1XV(argc);    CYG_PRECONDITION_CLASSC(interp);    std::string name = interp->get_variable(dbparser_pkgname);    CYG_ASSERTC("" != name);    CdlPackagesDatabaseBody::package_data* package =        static_cast<CdlPackagesDatabaseBody::package_data*>(interp->get_assoc_data(dbparser_pkgdata));    if (1 != argc) {        CdlParse::report_error(interp, diag_package + name, "There should be no further data after hardware.");    } else if (package->hardware) {        CdlParse::report_warning(interp, diag_package + name, "The hardware property should be specified only once");    } else {        package->hardware    = true;    }        CYG_REPORT_RETVAL(TCL_OK);    return TCL_OK;}// Syntax: script <filename>intCdlDbParser::package_script(CdlInterpreter interp, int argc, char** argv){    CYG_REPORT_FUNCNAMETYPE("CdlDbParser::package_script", "result %d");    CYG_REPORT_FUNCARG1XV(argc);    CYG_PRECONDITION_CLASSC(interp);    std::string name = interp->get_variable(dbparser_pkgname);    CYG_ASSERTC("" != name);    CdlPackagesDatabaseBody::package_data* package =        static_cast<CdlPackagesDatabaseBody::package_data*>(interp->get_assoc_data(dbparser_pkgdata));    // There should be exactly one argument, and the script command    // should be used only once    if (2 != argc) {        CdlParse::report_error(interp, diag_package + name, "Only one CDL script can be specified.");    } else if ("" != package->script) {        CdlParse::report_warning(interp, diag_package + name, "A package can have only one starting CDL script.");    } else {        package->script = argv[1];    }    CYG_REPORT_RETVAL(TCL_OK);    return TCL_OK;}//}}}//{{{  CdlDbParser::target-related                      // ----------------------------------------------------------------------------// target <name> <body>intCdlDbParser::new_target(CdlInterpreter interp, int argc, char** argv){    CYG_REPORT_FUNCNAMETYPE("CdlDbParser::new_target", "result %d");    CYG_REPORT_FUNCARG1XV(argc);    CYG_PRECONDITION_CLASSC(interp);    CdlPackagesDatabase db      = static_cast<CdlPackagesDatabase>(interp->get_assoc_data(dbparser_database_key));    CYG_INVARIANT_CLASSC(CdlPackagesDatabaseBody, db);        if (3 != argc) {        if (argc < 2) {            CdlParse::report_error(interp, "", "Invalid target command, missing name and contents.");        } else if (argc == 2) {            CdlParse::report_error(interp, diag_target + argv[1], "Invalid target command, missing body.");        } else {            CdlParse::report_error(interp, diag_target + argv[1], "Invalid target command, expecting just name and body.");        }        CYG_REPORT_RETVAL(TCL_OK);        return TCL_OK;    }        std::string target_name     = argv[1];    // Better make sure that this is not a duplicate definition.    if (std::find(db->target_names.begin(), db->target_names.end(), target_name) != db->target_names.end()) {        CdlParse::report_warning(interp, diag_target + target_name,                                 "Duplicate target entry, ignoring second occurence.");        CYG_REPORT_RETVAL(TCL_OK);        return TCL_OK;    }    // The target data is constructed locally. It only gets added to the    // database in the absence of errors.    bool target_ok = true;    int old_error_count = CdlParse::get_error_count(interp);    CdlPackagesDatabaseBody::target_data target;    target.description = "";    // aliases, packages and compiler_flags are vectors and will take care of themselves    // Sort out the commands, then invoke the script in argv[2]. There is    // no need to worry about error recovery here, any errors will be    // fatal anyway.    CdlInterpreterCommandEntry commands[] = {        CdlInterpreterCommandEntry("description",    &CdlDbParser::target_description    ),        CdlInterpreterCommandEntry("alias",          &CdlDbParser::target_alias          ),        CdlInterpreterCommandEntry("packages",       &CdlDbParser::target_packages       ),        CdlInterpreterCommandEntry("enable",         &CdlDbParser::target_enable         ),        CdlInterpreterCommandEntry("disable",        &CdlDbParser::target_disable        ),        CdlInterpreterCommandEntry("set_value",      &CdlDbParser::target_set_value      ),        CdlInterpreterCommandEntry("",               0                                   )    };    CdlInterpreterBody::CommandSupport  interp_cmds(interp, commands);    CdlInterpreterBody::VariableSupport interp_name(interp, dbparser_targetname, target_name);    CdlInterpreterBody::AssocSupport    interp_data(interp, dbparser_targetdata, static_cast<ClientData>(&target));    int result = interp->eval(argv[2]);    if (TCL_OK == result) {                if (0 == target.aliases.size()) {            CdlParse::report_error(interp, diag_target + target_name, "At least one alias should be supplied.");        }                // There is no check for > 0 hardware packages. This is an unlikely        // scenario but should be allowed for.        // Add this target to the list.    }    if (target_ok && (old_error_count == CdlParse::get_error_count(interp))) {        db->target_names.push_back(target_name);        db->targets[target_name] = target;    }        CYG_REPORT_RETVAL(result);    return result;}// Syntax: description <text>intCdlDbParser::target_description(CdlInterpreter interp, int argc, char** argv){    CYG_REPORT_FUNCNAMETYPE("CdlDbParser::target_description", "result %d");    CYG_REPORT_FUNCARG1XV(argc);    CYG_PRECONDITION_CLASSC(interp);    std::string name = interp->get_variable(dbparser_targetname);    CYG_ASSERTC("" != name);    CdlPackagesDatabaseBody::target_data* target =        static_cast<CdlPackagesDatabaseBody::target_data*>(interp->get_assoc_data(dbparser_targetdata));    if (2 != argc) {        CdlParse::report_error(interp, diag_target + name, "The target description should be a single string.");    } else if ("" != target->description) {        CdlParse::report_warning(interp, diag_target + name, "A target should have only one description.");    } else {        target->description = argv[1];    }        CYG_REPORT_RETVAL(TCL_OK);    return TCL_OK;}// Syntax: alias <list>// For example: alias { "This is an alias" another_alias dummy_name }intCdlDbParser::target_alias(CdlInterpreter interp, int argc, char** argv){    CYG_REPORT_FUNCNAMETYPE("CdlDbParser::target_alias", "result %d");    CYG_REPORT_FUNCARG1XV(argc);    CYG_PRECONDITION_CLASSC(interp);    std::string name = interp->get_variable(dbparser_targetname);    CYG_ASSERTC("" != name);    CdlPackagesDatabaseBody::target_data* target =        static_cast<CdlPackagesDatabaseBody::target_data*>(interp->get_assoc_data(dbparser_targetdata));    // There should be one argument, a list of valid aliases    // The alias command should be used only once    if (2 != argc) {        CdlParse::report_error(interp, diag_target + name, "The alias command should be followed by a list of known aliases");    } else if (0 < target->aliases.size()) {        CdlParse::report_warning(interp, diag_target + name, "There should be only one list of aliases.");    } else {        int         list_count      = 0;        char**      list_entries    = 0;        Tcl_Interp* tcl_interp      = interp->get_tcl_interpreter();        if (TCL_OK != Tcl_SplitList(tcl_interp, argv[1], &list_count, &list_entries)) {            CdlParse::report_error(interp, diag_target + name, Tcl_GetStringResult(tcl_interp));        } else {            if (0 == list_count) {                CdlParse::report_error(interp, diag_target + name, "At least one alias should be supplied.");            } else {                for (int i = 0; i < list_count; i++) {                    target->aliases.push_back(list_entries[i]);                }            }            Tcl_Free((char*)list_entries);        }    }        CYG_REPORT_RETVAL(TCL_OK);    return TCL_OK;}// Syntax: packages <list> ...// For example: packages { CYGPKG_HAL_XXX CYGPKG_HAL_YYY }intCdlDbParser::target_packages(CdlInterpreter interp, int argc, char** argv){    CYG_REPORT_FUNCNAMETYPE("CdlDbParser::target_packages", "result %d");    CYG_REPORT_FUNCARG1XV(argc);    CYG_PRECONDITION_CLASSC(interp);    std::string name = interp->get_variable(dbparser_targetname);    CYG_ASSERTC("" != name);    CdlPackagesDatabaseBody::target_data* target =        static_cast<CdlPackagesDatabaseBody::target_data*>(interp->get_assoc_data(dbparser_targetdata));    // There should be one argument, a list of valid packages.    // The packages command should be used only once    if (2 != argc) {        CdlParse::report_error(interp, diag_target + name, "`packages' should be followed by a list of known packages.");    } else if (0 < target->packages.size()) {        CdlParse::report_warning(interp, diag_target + name, "There should be only one list of packages.");    } else {        int         list_count      = 0;        char**      list_entries    = 0;        Tcl_Interp* tcl_interp      = interp->get_tcl_interpreter();        if (TCL_OK != Tcl_SplitList(tcl_interp, argv[1], &list_count, &list_entries)) {            CdlParse::report_error(interp, diag_target + name, Tcl_GetStringResult(tcl_interp));        } else {            // Allow for a dummy target spec, just in case it proves useful.            if (0 != list_count) {                for (int i = 0; i < list_count; i++) {                    target->packages.push_back(list_entries[i]);                }            }            Tcl_Free((char*)list_entries);        }    }        CYG_REPORT_RETVAL(TCL_OK);    return TCL_OK;}// Syntax: enable { opt1 opt2 ... }// For example: enable { CYGPKG_HAL_ARM_CL7xxx_7211 }intCdlDbParser::target_enable(CdlInterpreter interp, int argc, char** argv){    CYG_REPORT_FUNCNAMETYPE("CdlDbParser::target_enable", "result %d");    CYG_REPORT_FUNCARG1XV(argc);    CYG_PRECONDITION_CLASSC(interp);    std::string name = interp->get_variable(dbparser_targetname);    CYG_ASSERTC("" != name);    CdlPackagesDatabaseBody::target_data* target =        static_cast<CdlPackagesDatabaseBody::target_data*>(interp->get_assoc_data(dbparser_targetdata));    // There should be one argument, a list of valid flags.    if (2 != argc) {        CdlParse::report_error(interp, diag_target + name, "`enable' should be followed by a list of CDL options.");    } else {        int         list_count      = 0;        char**      list_entries    = 0;        Tcl_Interp* tcl_interp      = interp->get_tcl_interpreter();        if (TCL_OK != Tcl_SplitList(tcl_interp, argv[1], &list_count, &list_entries)) {            CdlParse::report_error(interp, diag_target + name, Tcl_GetStringResult(tcl_interp));        } else {            for (int i = 0; i < list_count; i++) {                target->enable.push_back(list_entries[i]);            }            Tcl_Free((char *) list_entries);        }    }    CYG_REPORT_RETVAL(TCL_OK);    return TCL_OK;}                           // Syntax: disable { opt1 opt2 ... }// For example: disable { CYGPKG_HAL_ARM_CL7xxx_7111 }intCdlDbParser::target_disable(CdlInterpreter interp, int argc, char** argv){    CYG_REPORT_FUNCNAMETYPE("CdlDbParser::target_disable", "result %d");    CYG_REPORT_FUNCARG1XV(argc);    CYG_PRECONDITION_CLASSC(interp);    std::string name = interp->get_variable(dbparser_targetname);    CYG_ASSERTC("" != name);    CdlPackagesDatabaseBody::target_data* target =        static_cast<CdlPackagesDatabaseBody::target_data*>(interp->get_assoc_data(dbparser_targetdata));

⌨️ 快捷键说明

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