📄 database.cxx
字号:
CYG_PRECONDITION_CLASSC(interp); CdlPackagesDatabase db = static_cast<CdlPackagesDatabaseBody*>(interp->get_assoc_data(dbparser_database_key)); CYG_INVARIANT_CLASSC(CdlPackagesDatabaseBody, db); std::string name = interp->get_variable(dbparser_current_package); CYG_ASSERTC("" != name); CYG_ASSERTC(db->packages.find(name) != db->packages.end()); CdlPackagesDatabaseBody::package_data& package = db->packages[name]; std::string msg = "Package " + name + ": "; // The directory command should be used only once if ("" != package.directory) { interp->set_result(msg + "a package can be located in only one directory"); CYG_REPORT_RETVAL(TCL_ERROR); return TCL_ERROR; } // And there should be exactly one argument. if (2 != argc) { interp->set_result(msg + "only one directory can be specified"); CYG_REPORT_RETVAL(TCL_ERROR); return TCL_ERROR; } 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); CdlPackagesDatabase db = static_cast<CdlPackagesDatabaseBody*>(interp->get_assoc_data(dbparser_database_key)); CYG_INVARIANT_CLASSC(CdlPackagesDatabaseBody, db); std::string name = interp->get_variable(dbparser_current_package); CYG_ASSERTC("" != name); CYG_ASSERTC(db->packages.find(name) != db->packages.end()); CdlPackagesDatabaseBody::package_data& package = db->packages[name]; std::string msg = "Package " + name + ": "; if (1 != argc) { interp->set_result(msg + "there should be no further data after hardware"); CYG_REPORT_RETVAL(TCL_ERROR); return TCL_ERROR; } if (package.hardware) { interp->set_result(msg + "the hardware property should be specified only once"); CYG_REPORT_RETVAL(TCL_ERROR); return TCL_ERROR; } 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); CdlPackagesDatabase db = static_cast<CdlPackagesDatabaseBody*>(interp->get_assoc_data(dbparser_database_key)); CYG_INVARIANT_CLASSC(CdlPackagesDatabaseBody, db); std::string name = interp->get_variable(dbparser_current_package); CYG_ASSERTC("" != name); CYG_ASSERTC(db->packages.find(name) != db->packages.end()); CdlPackagesDatabaseBody::package_data& package = db->packages[name]; std::string msg = "Package " + name + ": "; // The script command should be used only once if ("" != package.script) { interp->set_result(msg + "a package can have only one starting CDL script"); CYG_REPORT_RETVAL(TCL_ERROR); return TCL_ERROR; } // And there should be exactly one argument. if (2 != argc) { interp->set_result(msg + "only one CDL script can be specified"); CYG_REPORT_RETVAL(TCL_ERROR); return TCL_ERROR; } 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) { interp->set_result("A target definition should include name and contents"); CYG_REPORT_RETVAL(TCL_ERROR); return TCL_ERROR; } std::string target_name = argv[1]; std::string msg = std::string("Target ") + target_name + ": "; // 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()) { interp->set_result(msg + "a target can only be defined once"); CYG_REPORT_RETVAL(TCL_ERROR); return TCL_ERROR; } // Add this target to the list. db->target_names.push_back(target_name); // Also create a new target structure. This requires a default structure, // which cannot be filled in until the body is executed. CdlPackagesDatabaseBody::target_data tmp_struct; db->targets[target_name] = tmp_struct; CdlPackagesDatabaseBody::target_data& target = db->targets[target_name]; // aliases, packages and compiler_flags are vectors and will take care of themselves target.description = ""; target.command_prefix = ""; // 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("command_prefix", &CdlDbParser::target_command_prefix ), CdlInterpreterCommandEntry("cflags", &CdlDbParser::target_cflags ), CdlInterpreterCommandEntry("enable", &CdlDbParser::target_enable ), CdlInterpreterCommandEntry("disable", &CdlDbParser::target_disable ), CdlInterpreterCommandEntry("set_value", &CdlDbParser::target_set_value ), CdlInterpreterCommandEntry("", 0 ) }; int i; std::vector<CdlInterpreterCommandEntry> new_commands; for (i = 0; 0 != commands[i].command; i++) { new_commands.push_back(commands[i]); } std::vector<CdlInterpreterCommandEntry>* old_commands = interp->push_commands(new_commands); interp->set_variable(dbparser_current_target, target_name); std::string str_result; if (TCL_OK != interp->eval(argv[2], str_result)) { interp->set_result(msg + str_result); CYG_REPORT_RETVAL(TCL_ERROR); return TCL_ERROR; } interp->pop_commands(old_commands); interp->unset_variable(dbparser_current_target); // Some of the fields are compulsory. if (0 == target.aliases.size()) { interp->set_result(msg + "at least one alias should be supplied"); CYG_REPORT_RETVAL(TCL_ERROR); return TCL_ERROR; }#if 0 // command_prefix is now handled in the configuration data. if ("" == target.command_prefix) { interp->set_result(msg + "missing command prefix specification"); CYG_REPORT_RETVAL(TCL_ERROR); return TCL_ERROR; }#endif // There is no check for > 0 hardware packages. This is an unlikely // scenario but should be allowed for. CYG_REPORT_RETVAL(TCL_OK); return TCL_OK;}// 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); CdlPackagesDatabase db = static_cast<CdlPackagesDatabase>(interp->get_assoc_data(dbparser_database_key)); CYG_INVARIANT_CLASSC(CdlPackagesDatabaseBody, db); std::string name = interp->get_variable(dbparser_current_target); CYG_ASSERTC("" != name); CYG_ASSERTC(db->targets.find(name) != db->targets.end()); CdlPackagesDatabaseBody::target_data& target = db->targets[name]; std::string msg = "Target " + name + ": "; if (2 != argc) { interp->set_result(msg + "the target description should be a single string"); CYG_REPORT_RETVAL(TCL_ERROR); return TCL_ERROR; } if ("" != target.description) { interp->set_result(msg + "a target can have only one description"); CYG_REPORT_RETVAL(TCL_ERROR); return TCL_ERROR; } 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); CdlPackagesDatabase db = static_cast<CdlPackagesDatabase>(interp->get_assoc_data(dbparser_database_key)); CYG_INVARIANT_CLASSC(CdlPackagesDatabaseBody, db); std::string name = interp->get_variable(dbparser_current_target); CYG_ASSERTC("" != name); CYG_ASSERTC(db->targets.find(name) != db->targets.end()); CdlPackagesDatabaseBody::target_data& target = db->targets[name]; std::string msg = "Target " + name + ": "; // The alias command should be used only once if (0 < target.aliases.size()) { interp->set_result(msg + "there should be only one list of aliases"); CYG_REPORT_RETVAL(TCL_ERROR); return TCL_ERROR; } // There should be one argument, a list of valid aliases if (2 != argc) { interp->set_result(msg + "alias should be followed by a list of known aliases"); CYG_REPORT_RETVAL(TCL_ERROR); return TCL_ERROR; } 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)) { interp->set_result(msg + Tcl_GetStringResult(tcl_interp)); CYG_REPORT_RETVAL(TCL_ERROR); return TCL_ERROR; } if (0 == list_count) { interp->set_result(msg + "at least one alias should be supplied"); CYG_REPORT_RETVAL(TCL_ERROR); return TCL_ERROR; } 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); CdlPackagesDatabase db = static_cast<CdlPackagesDatabase>(interp->get_assoc_data(dbparser_database_key)); CYG_INVARIANT_CLASSC(CdlPackagesDatabaseBody, db); std::string name = interp->get_variable(dbparser_current_target); CYG_ASSERTC("" != name); CYG_ASSERTC(db->targets.find(name) != db->targets.end()); CdlPackagesDatabaseBody::target_data& target = db->targets[name]; std::string msg = "Target " + name + ": "; // The packages command should be used only once if (0 < target.packages.size()) { interp->set_result(msg + "there should be only one list of packages"); CYG_REPORT_RETVAL(TCL_ERROR); return TCL_ERROR; } // There should be one argument, a list of valid packages. if (2 != argc) { interp->set_result(msg + "packages should be followed by a list of known packages"); CYG_REPORT_RETVAL(TCL_ERROR); return TCL_ERROR; } 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)) { interp->set_result(msg + Tcl_GetStringResult(tcl_interp)); CYG_REPORT_RETVAL(TCL_ERROR); return TCL_ERROR; } if (0 == list_count) { interp->set_result(msg + "at least one package should be supplied"); CYG_REPORT_RETVAL(TCL_ERROR); return TCL_ERROR; } 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: command_prefix <string>intCdlDbParser::target_command_prefix(CdlInterpreter interp, int argc, char** argv){ CYG_REPORT_FUNCNAMETYPE("CdlDbParser::target_command_prefix", "result %d"); CYG_REPORT_FUNCARG1XV(argc); CYG_PRECONDITION_CLASSC(interp);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -