From 5159241db723c91a05dadb2827c2e63f7b124d56 Mon Sep 17 00:00:00 2001 From: Steve Reinhardt Date: Tue, 21 Oct 2003 21:24:34 -0700 Subject: New ini-file feature: += appends RHS to LHS. Added doxygen comments to inifile.hh. Updated initest. Some other minor cleanup. base/inifile.cc: Add support for '+=' append operation. Factor common code from IniFile::load() and IniFile::add() into new Section::add(). Rename ConfigTable to SectionTable (more descriptive). Fix bug in Section::dump(). base/inifile.hh: Add doxygen comments. Add support for '+=' append operation. Factor common code from IniFile::load() and IniFile::add() into new Section::add(). Rename ConfigTable to SectionTable (more descriptive). test/Makefile: initest needs cprintf.o now. test/foo.ini: Add test of '+=' operator. test/initest.cc: Bring this up-to-date. Steal main loop from main.cc so we can test multiple .ini files and command-line assignments too. --HG-- extra : convert_revision : 982521677fbf464e93aa93798ff7d9611826f17c --- test/Makefile | 2 +- test/foo.ini | 3 ++ test/initest.cc | 135 +++++++++++++++++++++++++++++++++----------------------- 3 files changed, 84 insertions(+), 56 deletions(-) (limited to 'test') diff --git a/test/Makefile b/test/Makefile index c95f8cb8d..1502bca3d 100644 --- a/test/Makefile +++ b/test/Makefile @@ -37,7 +37,7 @@ circletest: circletest.o circlebuf.o cprintftest: cprintftest.o cprintf.o $(CXX) $(LFLAGS) -o $@ $^ -initest: initest.o str.o inifile.o +initest: initest.o str.o inifile.o cprintf.o $(CXX) $(LFLAGS) -o $@ $^ lrutest: lru_test.o diff --git a/test/foo.ini b/test/foo.ini index aa4305f12..534a4e001 100644 --- a/test/foo.ini +++ b/test/foo.ini @@ -5,3 +5,6 @@ Foo2=384 [General] Test3=89 + +[Junk] +Test4+=mia diff --git a/test/initest.cc b/test/initest.cc index 51089a46b..818c64da7 100644 --- a/test/initest.cc +++ b/test/initest.cc @@ -26,92 +26,117 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include -#include -#include - +#include +#include #include #include #include "base/inifile.hh" +#include "base/cprintf.hh" + +using namespace std; char *progname; void usage() { - cout << "Usage: " << progname << " \n"; - exit(1); + cout << "Usage: " << progname << " \n"; + exit(1); } #if 0 - char *defines = getenv("CONFIG_DEFINES"); - if (defines) { - char *c = defines; - while ((c = strchr(c, ' ')) != NULL) { +char *defines = getenv("CONFIG_DEFINES"); +if (defines) { + char *c = defines; + while ((c = strchr(c, ' ')) != NULL) { *c++ = '\0'; count++; - } - count++; } + count++; +} #endif int main(int argc, char *argv[]) { - IniFile config; - - progname = argv[0]; - - int cpp_options_count = 0; - char **cpp_options = new char*[argc * 2]; - char **cur_opt = cpp_options; - - int ch; - while ((ch = getopt(argc, argv, "D:")) != -1) { - switch (ch) { - case 'D': - *cur_opt++ = "-D"; - *cur_opt++ = optarg; - cpp_options_count += 2; - break; - - default: - usage(); + IniFile simConfigDB; + + progname = argv[0]; + + vector cppArgs; + + vector cpp_options; + cpp_options.reserve(argc * 2); + + for (int i = 1; i < argc; ++i) { + char *arg_str = argv[i]; + + // if arg starts with '-', parse as option, + // else treat it as a configuration file name and load it + if (arg_str[0] == '-') { + + // switch on second char + switch (arg_str[1]) { + case 'D': + case 'U': + case 'I': + // cpp options: record & pass to cpp. Note that these + // cannot have spaces, i.e., '-Dname=val' is OK, but + // '-D name=val' is not. I don't consider this a + // problem, since even though gnu cpp accepts the + // latter, other cpp implementations do not (Tru64, + // for one). + cppArgs.push_back(arg_str); + break; + + case '-': + // command-line configuration parameter: + // '--
:=' + + if (!simConfigDB.add(arg_str + 2)) { + // parse error + ccprintf(cerr, + "Could not parse configuration argument '%s'\n" + "Expecting --
:=\n", + arg_str); + exit(0); + } + break; + + default: + usage(); + } + } + else { + // no '-', treat as config file name + + if (!simConfigDB.loadCPP(arg_str, cppArgs)) { + cprintf("Error processing file %s\n", arg_str); + exit(1); + } + } } - } - - argc -= optind; - argv += optind; - if (argc != 1) - usage(); - - string file = argv[0]; - - if (!config.loadCPP(file, cpp_options, cpp_options_count)) { - cout << "File not found!\n"; - exit(1); - } + string value; - string value; #define FIND(C, E) \ - if (config.find(C, E, value)) \ + if (simConfigDB.find(C, E, value)) \ cout << ">" << value << "<\n"; \ else \ cout << "Not Found!\n" - FIND("General", "Test2"); - FIND("Junk", "Test3"); - FIND("Junk", "Test4"); - FIND("General", "Test1"); - FIND("Junk2", "test3"); - FIND("General", "Test3"); + FIND("General", "Test2"); + FIND("Junk", "Test3"); + FIND("Junk", "Test4"); + FIND("General", "Test1"); + FIND("Junk2", "test3"); + FIND("General", "Test3"); - cout << "\n"; + cout << "\n"; - config.dump(); + simConfigDB.dump(); - return 0; + return 0; } -- cgit v1.2.3