summaryrefslogtreecommitdiff
path: root/cpp/src/slice2java
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src/slice2java')
-rw-r--r--cpp/src/slice2java/.depend4
-rw-r--r--cpp/src/slice2java/Gen.cpp60
-rw-r--r--cpp/src/slice2java/Gen.h4
-rw-r--r--cpp/src/slice2java/Main.cpp51
4 files changed, 104 insertions, 15 deletions
diff --git a/cpp/src/slice2java/.depend b/cpp/src/slice2java/.depend
index 08185d27e73..b8f63bc68c4 100644
--- a/cpp/src/slice2java/.depend
+++ b/cpp/src/slice2java/.depend
@@ -1,2 +1,2 @@
-Gen.o: Gen.cpp Gen.h ../../include/Slice/Parser.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/IceUtil/InputUtil.h ../../include/IceUtil/OutputUtil.h ../../include/Slice/JavaUtil.h ../../include/IceUtil/Functional.h ../../include/IceUtil/Algorithm.h ../../include/IceUtil/Iterator.h
-Main.o: Main.cpp ../../include/Slice/Preprocessor.h ../../include/IceUtil/Config.h Gen.h ../../include/Slice/Parser.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/IceUtil/InputUtil.h ../../include/IceUtil/OutputUtil.h ../../include/Slice/JavaUtil.h
+Gen.o: Gen.cpp Gen.h ../../include/Slice/Parser.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Config.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/IceUtil/InputUtil.h ../../include/Slice/JavaUtil.h ../../include/IceUtil/OutputUtil.h ../../include/Slice/Checksum.h ../../include/IceUtil/Functional.h ../../include/IceUtil/Algorithm.h ../../include/IceUtil/Iterator.h
+Main.o: Main.cpp ../../include/Slice/Preprocessor.h ../../include/IceUtil/Config.h Gen.h ../../include/Slice/Parser.h ../../include/IceUtil/Shared.h ../../include/IceUtil/Handle.h ../../include/IceUtil/Exception.h ../../include/IceUtil/InputUtil.h ../../include/Slice/JavaUtil.h ../../include/IceUtil/OutputUtil.h ../../include/Slice/Checksum.h
diff --git a/cpp/src/slice2java/Gen.cpp b/cpp/src/slice2java/Gen.cpp
index bb935500cb7..e5913aa6217 100644
--- a/cpp/src/slice2java/Gen.cpp
+++ b/cpp/src/slice2java/Gen.cpp
@@ -8,6 +8,7 @@
// **********************************************************************
#include <Gen.h>
+#include <Slice/Checksum.h>
#include <IceUtil/Functional.h>
#include <IceUtil/Algorithm.h>
#include <IceUtil/Iterator.h>
@@ -852,6 +853,65 @@ Slice::Gen::generateImplTie(const UnitPtr& p)
p->visit(&implTieVisitor);
}
+void
+Slice::Gen::writeChecksumClass(const string& checksumClass, const string& dir, const ChecksumMap& map)
+{
+ //
+ // Attempt to open the source file for the checksum class.
+ //
+ JavaOutput out;
+ if(!out.openClass(checksumClass, dir))
+ {
+ cerr << "can't open class `" << checksumClass << "' for writing: " << strerror(errno) << endl;
+ return;
+ }
+
+ //
+ // Get the class name.
+ //
+ string className;
+ string::size_type pos = checksumClass.rfind('.');
+ if(pos == string::npos)
+ {
+ className = checksumClass;
+ }
+ else
+ {
+ className = checksumClass.substr(pos + 1);
+ }
+
+ //
+ // Emit the class.
+ //
+ out << sp << nl << "public class " << className;
+ out << sb;
+
+ //
+ // Use a static initializer to populate the checksum map.
+ //
+ out << sp << nl << "public static java.util.Map checksums;";
+ out << sp << nl << "static";
+ out << sb;
+ out << nl << "java.util.Map map = new java.util.HashMap();";
+ for(ChecksumMap::const_iterator p = map.begin(); p != map.end(); ++p)
+ {
+ out << nl << "map.put(\"" << p->first << "\", \"";
+ ostringstream str;
+ str.flags(ios_base::hex);
+ str.fill('0');
+ for(vector<unsigned char>::const_iterator q = p->second.begin(); q != p->second.end(); ++q)
+ {
+ str << (int)(*q);
+ }
+ out << str.str() << "\");";
+ }
+ out << nl << "checksums = java.util.Collections.unmodifiableMap(map);";
+
+ out << eb;
+ out << eb;
+ out << nl;
+}
+
Slice::Gen::OpsVisitor::OpsVisitor(const string& dir) :
JavaVisitor(dir)
{
diff --git a/cpp/src/slice2java/Gen.h b/cpp/src/slice2java/Gen.h
index d088804064a..f811625b1c0 100644
--- a/cpp/src/slice2java/Gen.h
+++ b/cpp/src/slice2java/Gen.h
@@ -11,8 +11,8 @@
#define GEN_H
#include <Slice/Parser.h>
-#include <IceUtil/OutputUtil.h>
#include <Slice/JavaUtil.h>
+#include <Slice/Checksum.h>
namespace Slice
{
@@ -81,6 +81,8 @@ public:
void generateImpl(const UnitPtr&);
void generateImplTie(const UnitPtr&);
+ static void writeChecksumClass(const std::string&, const std::string&, const ChecksumMap&);
+
private:
std::string _base;
diff --git a/cpp/src/slice2java/Main.cpp b/cpp/src/slice2java/Main.cpp
index fbfbdcdc0ed..8676ec64a96 100644
--- a/cpp/src/slice2java/Main.cpp
+++ b/cpp/src/slice2java/Main.cpp
@@ -32,6 +32,7 @@ usage(const char* n)
"--depend Generate Makefile dependencies.\n"
"-d, --debug Print debug messages.\n"
"--ice Permit `Ice' prefix (for building Ice source code only)\n"
+ "--checksum CLASS Generate checksums for Slice definitions into CLASS.\n"
;
// Note: --case-sensitive is intentionally not shown here!
}
@@ -49,6 +50,7 @@ main(int argc, char* argv[])
bool ice = false;
bool caseSensitive = false;
bool depend = false;
+ string checksumClass;
int idx = 1;
while(idx < argc)
@@ -70,8 +72,7 @@ main(int argc, char* argv[])
}
--argc;
}
- else if(strncmp(argv[idx], "-D", 2) == 0 ||
- strncmp(argv[idx], "-U", 2) == 0)
+ else if(strncmp(argv[idx], "-D", 2) == 0 || strncmp(argv[idx], "-U", 2) == 0)
{
cppArgs += ' ';
cppArgs += argv[idx];
@@ -82,20 +83,17 @@ main(int argc, char* argv[])
}
--argc;
}
- else if(strcmp(argv[idx], "-h") == 0 ||
- strcmp(argv[idx], "--help") == 0)
+ 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)
+ 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)
+ else if(strcmp(argv[idx], "-d") == 0 || strcmp(argv[idx], "--debug") == 0)
{
debug = true;
for(int i = idx ; i + 1 < argc ; ++i)
@@ -126,8 +124,7 @@ main(int argc, char* argv[])
{
if(idx + 1 >= argc)
{
- cerr << argv[0] << ": argument expected for`" << argv[idx]
- << "'" << endl;
+ cerr << argv[0] << ": argument expected for`" << argv[idx] << "'" << endl;
usage(argv[0]);
return EXIT_FAILURE;
}
@@ -175,10 +172,25 @@ main(int argc, char* argv[])
}
--argc;
}
+ else if(strcmp(argv[idx], "--checksum") == 0)
+ {
+ if(idx + 1 >= argc)
+ {
+ cerr << argv[0] << ": argument expected for`" << argv[idx] << "'" << endl;
+ usage(argv[0]);
+ return EXIT_FAILURE;
+ }
+
+ checksumClass = 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;
+ cerr << argv[0] << ": unknown option `" << argv[idx] << "'" << endl;
usage(argv[0]);
return EXIT_FAILURE;
}
@@ -204,6 +216,8 @@ main(int argc, char* argv[])
int status = EXIT_SUCCESS;
+ ChecksumMap checksums;
+
for(idx = 1 ; idx < argc ; ++idx)
{
if(depend)
@@ -254,11 +268,24 @@ main(int argc, char* argv[])
{
gen.generateImplTie(p);
}
+ if(!checksumClass.empty())
+ {
+ //
+ // Calculate checksums for the Slice definitions in the unit.
+ //
+ ChecksumMap m = createChecksums(p);
+ copy(m.begin(), m.end(), inserter(checksums, checksums.begin()));
+ }
}
p->destroy();
}
}
+ if(!checksumClass.empty())
+ {
+ Gen::writeChecksumClass(checksumClass, output, checksums);
+ }
+
return status;
}