summaryrefslogtreecommitdiff
path: root/cpp/src/slice2wsdl/Main.cpp
diff options
context:
space:
mode:
authorMatthew Newhook <matthew@zeroc.com>2002-01-25 14:48:39 +0000
committerMatthew Newhook <matthew@zeroc.com>2002-01-25 14:48:39 +0000
commit8d2ec3bcb23c04c3899a2516cb05a699b0db393a (patch)
tree133eba1ae126c1f405f9627cceadbcacf05ce59f /cpp/src/slice2wsdl/Main.cpp
parentfixes (diff)
downloadice-8d2ec3bcb23c04c3899a2516cb05a699b0db393a.tar.bz2
ice-8d2ec3bcb23c04c3899a2516cb05a699b0db393a.tar.xz
ice-8d2ec3bcb23c04c3899a2516cb05a699b0db393a.zip
Initial version of slice2wsdl.
Diffstat (limited to 'cpp/src/slice2wsdl/Main.cpp')
-rw-r--r--cpp/src/slice2wsdl/Main.cpp222
1 files changed, 222 insertions, 0 deletions
diff --git a/cpp/src/slice2wsdl/Main.cpp b/cpp/src/slice2wsdl/Main.cpp
new file mode 100644
index 00000000000..2efe434b590
--- /dev/null
+++ b/cpp/src/slice2wsdl/Main.cpp
@@ -0,0 +1,222 @@
+// **********************************************************************
+//
+// Copyright (c) 2001
+// MutableRealms, Inc.
+// Huntsville, AL, USA
+//
+// All Rights Reserved
+//
+// **********************************************************************
+
+#include <Gen.h>
+#include <fstream>
+
+using namespace std;
+using namespace Slice;
+
+void
+usage(const char* n)
+{
+ cerr << "Usage: " << n << " [options] slice-file type-id\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"
+ "-d, --debug Print debug messages.\n"
+ ;
+}
+
+int
+main(int argc, char* argv[])
+{
+ string cpp("cpp -C");
+ bool debug = false;
+ string include;
+ string output;
+ vector<string> includePaths;
+
+ int idx = 1;
+ while (idx < argc)
+ {
+ if (strncmp(argv[idx], "-I", 2) == 0)
+ {
+ cpp += ' ';
+ cpp += argv[idx];
+
+ string path = argv[idx] + 2;
+ if (path.length())
+ {
+ includePaths.push_back(path);
+ }
+
+ 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], "-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 (strcmp(argv[idx], "--include-dir") == 0)
+ {
+ if (idx + 1 >= argc)
+ {
+ cerr << argv[0] << ": argument expected for`" << argv[idx] << "'" << endl;
+ usage(argv[0]);
+ return EXIT_FAILURE;
+ }
+
+ include = argv[idx + 1];
+ for (int i = idx ; i + 2 < argc ; ++i)
+ {
+ argv[i] = argv[i + 2];
+ }
+ argc -= 2;
+ }
+ else if (strcmp(argv[idx], "--output-dir") == 0)
+ {
+ if (idx + 1 >= argc)
+ {
+ cerr << argv[0] << ": argument expected for`" << argv[idx] << "'" << endl;
+ usage(argv[0]);
+ return EXIT_FAILURE;
+ }
+
+ output = argv[idx + 1];
+ for (int i = idx ; i + 2 < argc ; ++i)
+ {
+ argv[i] = argv[i + 2];
+ }
+ argc -= 2;
+ }
+ else if (argv[idx][0] == '-')
+ {
+ cerr << argv[0] << ": unknown option `" << argv[idx] << "'" << endl;
+ usage(argv[0]);
+ return EXIT_FAILURE;
+ }
+ else
+ {
+ ++idx;
+ }
+ }
+
+ if (argc != 3)
+ {
+ usage(argv[0]);
+ return EXIT_FAILURE;
+ }
+
+ string sourceFile = argv[1];
+ string typeId = argv[2];
+
+ int status = EXIT_SUCCESS;
+
+ string base(sourceFile);
+ string suffix;
+ string::size_type pos = base.rfind('.');
+ if (pos != string::npos)
+ {
+ suffix = base.substr(pos);
+ transform(suffix.begin(), suffix.end(), suffix.begin(), tolower);
+ }
+ if (suffix != ".ice")
+ {
+ cerr << argv[0] << ": input files must end with `.ice'" << endl;
+ unit->destroy();
+ return EXIT_FAILURE;
+ }
+ base.erase(pos);
+
+ ifstream test(sourceFile.c_str());
+ if (!test)
+ {
+ cerr << argv[0] << ": can't open `" << sourceFile << "' for reading: " << strerror(errno) << endl;
+ return EXIT_FAILURE;
+ }
+ test.close();
+
+ string cmd = cpp + " " + sourceFile;
+#ifdef WIN32
+ FILE* cppHandle = _popen(cmd.c_str(), "r");
+#else
+ FILE* cppHandle = popen(cmd.c_str(), "r");
+#endif
+ if (cppHandle == 0)
+ {
+ cerr << argv[0] << ": can't run C++ preprocessor: " << strerror(errno) << endl;
+ unit->destroy();
+ return EXIT_FAILURE;
+ }
+
+ UnitPtr unit = Unit::createUnit(false, false);
+ int parseStatus = unit->parse(cppHandle, debug);
+
+#ifdef WIN32
+ _pclose(cppHandle);
+#else
+ pclose(cppHandle);
+#endif
+
+ if (parseStatus == EXIT_FAILURE)
+ {
+ status = EXIT_FAILURE;
+ }
+ else
+ {
+ ContainedList contained = unit->findContents(typeId);
+ if (contained.empty() || contained.front()->containedType() != Contained::ContainedTypeClass)
+ {
+ cerr << argv[0] << ": invalid type: " << typeId << endl;
+ status = EXIT_FAILURE;
+ }
+ else
+ {
+ ClassDefPtr p = ClassDefPtr::dynamicCast(contained.front());
+ assert(p);
+ Gen gen(argv[0], base, include, includePaths, output, p);
+ if (!gen)
+ {
+ unit->destroy();
+ return EXIT_FAILURE;
+ }
+ gen.generate(unit);
+ }
+ }
+
+ unit->destroy();
+
+ return status;
+}