📄 database.cxx
字号:
}// 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 + -