diff options
author | Marc Laukien <marc@zeroc.com> | 2001-08-22 01:41:03 +0000 |
---|---|---|
committer | Marc Laukien <marc@zeroc.com> | 2001-08-22 01:41:03 +0000 |
commit | 3ab8aaaa6be9a49dbff41afe518a82eef07b7c11 (patch) | |
tree | 327f55dcefb19a3f399c6240ac130108b3ed283e /cpp/src/IcePack/Client.cpp | |
parent | fixes (diff) | |
download | ice-3ab8aaaa6be9a49dbff41afe518a82eef07b7c11.tar.bz2 ice-3ab8aaaa6be9a49dbff41afe518a82eef07b7c11.tar.xz ice-3ab8aaaa6be9a49dbff41afe518a82eef07b7c11.zip |
bison/flex for icepackadmin
Diffstat (limited to 'cpp/src/IcePack/Client.cpp')
-rw-r--r-- | cpp/src/IcePack/Client.cpp | 220 |
1 files changed, 144 insertions, 76 deletions
diff --git a/cpp/src/IcePack/Client.cpp b/cpp/src/IcePack/Client.cpp index 3f9ae3b08d4..4f27f3ad5cc 100644 --- a/cpp/src/IcePack/Client.cpp +++ b/cpp/src/IcePack/Client.cpp @@ -9,8 +9,8 @@ // ********************************************************************** #include <Ice/Ice.h> -#include <AdminI.h> -#include <Forward.h> +#include <IcePack/Parser.h> +#include <fstream> using namespace std; using namespace Ice; @@ -19,35 +19,116 @@ using namespace IcePack; void usage(const char* n) { - cerr << "Usage: " << n << " [options] add reference...|remove reference...|shutdown\n"; + cerr << "Usage: " << n << " [options] [file...]\n"; cerr << "Options:\n" "-h, --help Show this message.\n" "-v, --version Display the Ice version.\n" + "-DNAME Define NAME as 1.\n" + "-DNAME=DEF Define NAME as DEF.\n" + "-UNAME Remove any definition for NAME.\n" + "-IDIR Put DIR in the include file search path.\n" + "-e COMMANDS Execute COMMANDS.\n" + "-d, --debug Print debug messages.\n" ; } int run(int argc, char* argv[], CommunicatorPtr communicator) { + string cpp("cpp"); + string commands; + bool debug = false; - PropertiesPtr properties = communicator->getProperties(); - - string adminEndpoints = properties->getProperty("Ice.Adapter.Admin.Endpoints"); - if(adminEndpoints.length() == 0) + int idx = 1; + while (idx < argc) { - cerr << argv[0] << ": `Ice.Adapter.Admin.Endpoints' property is not set" << endl; - return EXIT_FAILURE; + if (strncmp(argv[idx], "-I", 2) == 0) + { + cpp += ' '; + cpp += argv[idx]; + + for (int i = idx ; i + 1 < argc ; ++i) + { + argv[i] = argv[i + 1]; + } + --argc; + } + else if (strncmp(argv[idx], "-D", 2) == 0 || strncmp(argv[idx], "-U", 2) == 0) + { + cpp += ' '; + cpp += argv[idx]; + + for (int i = idx ; i + 1 < argc ; ++i) + { + argv[i] = argv[i + 1]; + } + --argc; + } + else if (strcmp(argv[idx], "-h") == 0 || strcmp(argv[idx], "--help") == 0) + { + usage(argv[0]); + return EXIT_SUCCESS; + } + else if (strcmp(argv[idx], "-v") == 0 || strcmp(argv[idx], "--version") == 0) + { + cout << ICE_STRING_VERSION << endl; + return EXIT_SUCCESS; + } + else if (strcmp(argv[idx], "-e") == 0) + { + if (idx + 1 >= argc) + { + cerr << argv[0] << ": argument expected for`" << argv[idx] << "'" << endl; + usage(argv[0]); + return EXIT_FAILURE; + } + + commands += argv[idx + 1]; + commands += ';'; + + for (int i = idx ; i + 2 < argc ; ++i) + { + argv[i] = argv[i + 2]; + } + argc -= 2; + } + else if (strcmp(argv[idx], "-d") == 0 || strcmp(argv[idx], "--debug") == 0) + { + debug = true; + for (int i = idx ; i + 1 < argc ; ++i) + { + argv[i] = argv[i + 1]; + } + --argc; + } + else if (argv[idx][0] == '-') + { + cerr << argv[0] << ": unknown option `" << argv[idx] << "'" << endl; + usage(argv[0]); + return EXIT_FAILURE; + } + else + { + ++idx; + } } - if (argc < 2) + if (argc >= 2 && !commands.empty()) { - cerr << argv[0] << ": no command" << endl; + cerr << argv[0] << ": `-e' option cannot be used if input files are given" << endl; usage(argv[0]); return EXIT_FAILURE; } - string cmd = argv[1]; + PropertiesPtr properties = communicator->getProperties(); + + string adminEndpoints = properties->getProperty("Ice.Adapter.Admin.Endpoints"); + if(adminEndpoints.length() == 0) + { + cerr << argv[0] << ": `Ice.Adapter.Admin.Endpoints' property is not set" << endl; + return EXIT_FAILURE; + } Ice::ObjectPrx adminBase = communicator->stringToProxy("admin:" + adminEndpoints); AdminPrx admin = AdminPrx::checkedCast(adminBase); @@ -57,92 +138,79 @@ run(int argc, char* argv[], CommunicatorPtr communicator) return EXIT_FAILURE; } - if (cmd == "add") - { - if (argc < 3) - { - cerr << argv[0] << ": no reference" << endl; - usage(argv[0]); - return EXIT_FAILURE; - } + ParserPtr parser = Parser::createParser(communicator, admin); + int status = EXIT_SUCCESS; - for (int i = 2; i < argc; ++i) - { - ServerDescriptionPtr desc = new ServerDescription; - desc->object = communicator->stringToProxy(argv[i]); - admin->add(desc); - } - } - else if (cmd == "remove") + if (argc < 2) // No files given, let's use standard input { - if (argc < 3) + if (!commands.empty()) { - cerr << argv[0] << ": no reference" << endl; - usage(argv[0]); - return EXIT_FAILURE; + int parseStatus = parser->parse(commands, debug); + if (parseStatus == EXIT_FAILURE) + { + status = EXIT_FAILURE; + } } - - for (int i = 2; i < argc; ++i) + else { - admin->remove(communicator->stringToProxy(argv[i])); + int parseStatus = parser->parse(stdin, debug); + if (parseStatus == EXIT_FAILURE) + { + status = EXIT_FAILURE; + } } } - else if (cmd == "shutdown") + else // Process files given on the command line { - if (argc > 2) + for (idx = 1 ; idx < argc ; ++idx) { - usage(argv[0]); - return EXIT_FAILURE; + ifstream test(argv[idx]); + if (!test) + { + cerr << argv[0] << ": can't open `" << argv[idx] << "' for reading: " << strerror(errno) << endl; + return EXIT_FAILURE; + } + test.close(); + + string cmd = cpp + " " + argv[idx]; +#ifdef WIN32 + FILE* cppHandle = _popen(cmd.c_str(), "r"); +#else + FILE* cppHandle = popen(cmd.c_str(), "r"); +#endif + if (cppHandle == NULL) + { + cerr << argv[0] << ": can't run C++ preprocessor: " << strerror(errno) << endl; + return EXIT_FAILURE; + } + + int parseStatus = parser->parse(cppHandle, debug); + +#ifdef WIN32 + _pclose(cppHandle); +#else + pclose(cppHandle); +#endif + + if (parseStatus == EXIT_FAILURE) + { + status = EXIT_FAILURE; + } } - - admin->shutdown(); - } - else - { - cerr << argv[0] << ": invalid command `" << cmd << "'" << endl; - usage(argv[0]); - return EXIT_FAILURE; } - return EXIT_SUCCESS; + return status; } int main(int argc, char* argv[]) { - PropertiesPtr properties = getDefaultProperties(argc, argv); - - int idx = 1; - while (idx < argc) - { - if (strcmp(argv[idx], "-h") == 0 || strcmp(argv[idx], "--help") == 0) - { - usage(argv[0]); - return EXIT_SUCCESS; - } - else if (strcmp(argv[idx], "-v") == 0 || strcmp(argv[idx], "--version") == 0) - { - cout << ICE_STRING_VERSION << endl; - return EXIT_SUCCESS; - } - else if (argv[idx][0] == '-') - { - cerr << argv[0] << ": unknown option `" << argv[idx] << "'" << endl; - usage(argv[0]); - return EXIT_FAILURE; - } - else - { - ++idx; - } - } - int status; CommunicatorPtr communicator; try { - communicator = initializeWithProperties(properties); + communicator = initialize(argc, argv); status = run(argc, argv, communicator); } catch(const LocalException& ex) |