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

📄 database.cxx

📁 eCos1.31版
💻 CXX
📖 第 1 页 / 共 5 页
字号:
    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 + -