summaryrefslogtreecommitdiff
path: root/cpp/src/IcePack/Client.cpp
diff options
context:
space:
mode:
authorMarc Laukien <marc@zeroc.com>2001-08-22 01:41:03 +0000
committerMarc Laukien <marc@zeroc.com>2001-08-22 01:41:03 +0000
commit3ab8aaaa6be9a49dbff41afe518a82eef07b7c11 (patch)
tree327f55dcefb19a3f399c6240ac130108b3ed283e /cpp/src/IcePack/Client.cpp
parentfixes (diff)
downloadice-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.cpp220
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)