diff options
Diffstat (limited to 'cpp/src/slice2java')
-rw-r--r-- | cpp/src/slice2java/.depend | 4 | ||||
-rw-r--r-- | cpp/src/slice2java/Gen.cpp | 60 | ||||
-rw-r--r-- | cpp/src/slice2java/Gen.h | 4 | ||||
-rw-r--r-- | cpp/src/slice2java/Main.cpp | 51 |
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; } |