summaryrefslogtreecommitdiff
path: root/cpp/src/slice2freeze/Main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src/slice2freeze/Main.cpp')
-rw-r--r--cpp/src/slice2freeze/Main.cpp2142
1 files changed, 0 insertions, 2142 deletions
diff --git a/cpp/src/slice2freeze/Main.cpp b/cpp/src/slice2freeze/Main.cpp
deleted file mode 100644
index 487707d2e6d..00000000000
--- a/cpp/src/slice2freeze/Main.cpp
+++ /dev/null
@@ -1,2142 +0,0 @@
-// **********************************************************************
-//
-// Copyright (c) 2003-2015 ZeroC, Inc. All rights reserved.
-//
-// This copy of Ice is licensed to you under the terms described in the
-// ICE_LICENSE file included in this distribution.
-//
-// **********************************************************************
-
-#include <IceUtil/DisableWarnings.h>
-#include <IceUtil/Options.h>
-#include <IceUtil/CtrlCHandler.h>
-#include <IceUtil/Mutex.h>
-#include <IceUtil/MutexPtrLock.h>
-#include <Slice/Preprocessor.h>
-#include <Slice/CPlusPlusUtil.h>
-#include <Slice/FileTracker.h>
-#include <Slice/Util.h>
-#include <IceUtil/OutputUtil.h>
-#include <IceUtil/StringUtil.h>
-#include <cstring>
-
-using namespace std;
-using namespace IceUtil;
-using namespace IceUtilInternal;
-using namespace Slice;
-
-namespace
-{
-
-IceUtil::Mutex* globalMutex = 0;
-bool interrupted = false;
-
-class Init
-{
-public:
-
- Init()
- {
- globalMutex = new IceUtil::Mutex;
- }
-
- ~Init()
- {
- delete globalMutex;
- globalMutex = 0;
- }
-};
-
-Init init;
-
-string ICE_ENCODING_COMPARE = "Freeze::IceEncodingCompare";
-
-}
-
-void
-interruptedCallback(int /*signal*/)
-{
- IceUtilInternal::MutexPtrLock<IceUtil::Mutex> sync(globalMutex);
-
- interrupted = true;
-}
-
-class MetaDataVisitor : public ParserVisitor
-{
-public:
-
- MetaDataVisitor() :
- _useWstring(false)
- {
- }
-
- virtual bool visitModuleStart(const ModulePtr& p)
- {
- setUseWstring(p);
- return true;
- }
-
- virtual void visitModuleEnd(const ModulePtr&)
- {
- resetUseWstring();
- }
-
- virtual bool visitClassDefStart(const ClassDefPtr& p)
- {
- setUseWstring(p);
- checkMetaData(p->dataMembers());
- resetUseWstring();
- return true;
- }
-
- virtual bool visitStructStart(const StructPtr& p)
- {
- setUseWstring(p);
- checkMetaData(p->dataMembers());
- resetUseWstring();
- return true;
- }
-
-private:
-
- void checkMetaData(const DataMemberList& dataMembers)
- {
- for(DataMemberList::const_iterator p = dataMembers.begin(); p != dataMembers.end(); ++p)
- {
- BuiltinPtr builtin = BuiltinPtr::dynamicCast((*p)->type());
- if(builtin && builtin->kind() == Builtin::KindString)
- {
- StringList metaData = (*p)->getMetaData();
- for(StringList::const_iterator q = metaData.begin(); q != metaData.end(); ++q)
- {
- if(*q == "cpp:type:string" || *q == "cpp:type:wstring")
- {
- continue;
- }
- }
- metaData.push_back(_useWstring ? "cpp:type:wstring" : "cpp:type:string");
- (*p)->setMetaData(metaData);
- }
- }
- }
-
- void setUseWstring(ContainedPtr p)
- {
- _useWstringHist.push_back(_useWstring);
- StringList metaData = p->getMetaData();
- if(find(metaData.begin(), metaData.end(), "cpp:type:wstring") != metaData.end())
- {
- _useWstring = true;
- }
- else if(find(metaData.begin(), metaData.end(), "cpp:type:string") != metaData.end())
- {
- _useWstring = false;
- }
- }
-
- void resetUseWstring()
- {
- _useWstring = _useWstringHist.back();
- _useWstringHist.pop_back();
- }
-
- bool _useWstring;
- std::list<bool> _useWstringHist;
-};
-
-struct DictIndex
-{
- string member;
- bool caseSensitive;
- bool sort;
- string userCompare;
-
- bool operator==(const DictIndex& rhs) const
- {
- return member == rhs.member;
- }
-
- bool operator!=(const DictIndex& rhs) const
- {
- return member != rhs.member;
- }
-};
-
-struct Dict
-{
- string name;
- string key;
- StringList keyMetaData;
- string value;
- StringList valueMetaData;
- bool sort;
- string userCompare;
-
- vector<DictIndex> indices;
-};
-
-struct Index
-{
- string name;
- string type;
- string member;
- bool caseSensitive;
-};
-
-struct IndexType
-{
- TypePtr type;
- StringList metaData;
-};
-
-void
-usage(const char* n)
-{
- getErrorStream() << "Usage: " << n << " [options] file-base [slice-files...]\n";
- getErrorStream() <<
- "Options:\n"
- "-h, --help Show this message.\n"
- "-v, --version Display the Ice version.\n"
- "--validate Validate command line options.\n"
- "--header-ext EXT Use EXT instead of the default `h' extension.\n"
- "--source-ext EXT Use EXT instead of the default `cpp' extension.\n"
- "--add-header HDR[,GUARD]\n"
- " Add #include for HDR (with guard GUARD) to\n"
- " generated source file.\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 Print preprocessor output on stdout.\n"
- "--include-dir DIR Use DIR as the header include directory in\n"
- " source files.\n"
- "--dll-export SYMBOL Use SYMBOL for DLL exports.\n"
- "--dict NAME,KEY,VALUE[,sort[,COMPARE]]\n"
- " Create a Freeze dictionary with the name NAME,\n"
- " using KEY as key, and VALUE as value. This\n"
- " option may be specified multiple times for\n"
- " different names. NAME may be a scoped name.\n"
- " By default, keys are sorted using their binary\n"
- " Ice-encoding representation. Use 'sort' to sort\n"
- " with the COMPARE functor class. COMPARE's default\n"
- " value is std::less<KEY>\n"
- "--index NAME,TYPE,MEMBER[,{case-sensitive|case-insensitive}]\n"
- " Create a Freeze evictor index with the name\n"
- " NAME for member MEMBER of class TYPE. This\n"
- " option may be specified multiple times for\n"
- " different names. NAME may be a scoped name.\n"
- " When member is a string, the case can be\n"
- " sensitive or insensitive (default is sensitive).\n"
- "--dict-index DICT[,MEMBER][,{case-sensitive|case-insensitive}]\n"
- " [,sort[,COMPARE]]\n"
- " Add an index to dictionary DICT. If MEMBER is \n"
- " specified, then DICT's VALUE must be a class or\n"
- " a struct, and MEMBER must designate a member of\n"
- " VALUE. Otherwise, the entire VALUE is used for \n"
- " indexing. When the secondary key is a string, \n"
- " the case can be sensitive or insensitive (default\n"
- " is sensitive).\n"
- " By default, keys are sorted using their binary\n"
- " Ice-encoding representation. Use 'sort' to sort\n"
- " with the COMPARE functor class. COMPARE's default\n"
- " value is std::less<secondary key type>.\n"
- "--output-dir DIR Create files in the directory DIR.\n"
- "--depend Generate dependencies for input Slice files.\n"
- "--depend-xml Generate dependencies in XML format.\n"
- "--depend-file FILE Write dependencies to FILE instead of standard output.\n"
- "-d, --debug Print debug messages.\n"
- "--ice Allow reserved Ice prefix in Slice identifiers.\n"
- "--underscore Allow underscores in Slice identifiers.\n"
- ;
-}
-
-void
-checkIdentifier(string t, string s)
-{
- if(s.empty() || (!IceUtilInternal::isAlpha(s[0]) && s[0] != '_'))
- {
- ostringstream os;
- os << t << "' is not a valid type name";
- throw os.str();
- }
-
- for(unsigned int i = 1; i < s.size(); ++i)
- {
- if(!isalnum(static_cast<unsigned char>(s[i])) && s[i] != '_')
- {
- ostringstream os;
- os << t << "' is not a valid type name";
- throw os.str();
- }
- }
-}
-
-void
-printFreezeTypes(Output& out, const vector<Dict>& dicts, const vector<Index>& indices)
-{
- out << '\n';
- out << "\n// Freeze types in this file:";
- for(vector<Dict>::const_iterator p = dicts.begin(); p != dicts.end(); ++p)
- {
- out << "\n// name=\"" << p->name << "\", key=\""
- << p->key << "\", value=\"" << p->value << "\"";
- }
-
- for(vector<Index>::const_iterator q = indices.begin(); q != indices.end(); ++q)
- {
- out << "\n// name=\"" << q->name << "\", type=\"" << q->type
- << "\", member=\"" << q->member << "\"";
- if(q->caseSensitive == false)
- {
- out << " (case insensitive)";
- }
- }
- out << '\n';
-}
-
-template<class T>
-inline string
-getCompare(const T& t, const string& keyType)
-{
- if(t.sort)
- {
- if(t.userCompare == "")
- {
- return "std::less< " + keyType + ">";
- }
- else
- {
- return t.userCompare;
- }
- }
- else
- {
- return ICE_ENCODING_COMPARE;
- }
-}
-
-string
-getTypeId(const TypePtr& type, const StringList& metaData)
-{
- string typeId = type->typeId();
- BuiltinPtr builtInType = BuiltinPtr::dynamicCast(type);
- if(builtInType && builtInType->kind() == Builtin::KindString && metaData.size() != 0 &&
- metaData.front() == "cpp:type:wstring")
- {
- typeId = "wstring";
- }
- return typeId;
-}
-
-void
-writeDictH(const string& name, const Dict& dict, const vector<IndexType> indexTypes, const TypePtr& keyType,
- const StringList& keyMetaData, const TypePtr& valueType, const StringList& valueMetaData, Output& H,
- const string& dllExport)
-{
- const string keyTypeS = typeToString(keyType, keyMetaData);
- const string valueTypeS = typeToString(valueType, valueMetaData);
- const string compare = getCompare(dict, keyTypeS);
- const string keyCodec = string("::Freeze::MapKeyCodec< ") + keyTypeS + " >";
- const string valueCodec =
- string(valueType->usesClasses() ? "::Freeze::MapObjectValueCodec" : "::Freeze::MapValueCodec") +
- "< " + valueTypeS + " >";
-
- const string templateParams = string("< ") + keyTypeS + ", " + valueTypeS + ", " + keyCodec + ", " + valueCodec +
- ", " + compare + " >";
-
- const string keyCompareParams = string("< ") + keyTypeS + ", " + keyCodec + ", " + compare + " >";
-
- vector<string> capitalizedMembers;
-
- for(size_t i = 0; i < dict.indices.size(); ++i)
- {
- const string& member = dict.indices[i].member;
- if(!member.empty())
- {
- string capitalizedMember = member;
- capitalizedMember[0] = toupper(static_cast<unsigned char>(capitalizedMember[0]));
- capitalizedMembers.push_back(capitalizedMember);
- }
- else
- {
- capitalizedMembers.push_back("Value");
- }
- }
-
- H << sp << nl << "class " << dllExport << name
- << " : public Freeze::Map" << templateParams;
- H << sb;
- H.dec();
- H << sp << nl << "public:";
- H << sp;
- H.inc();
-
- //
- // Typedefs
- //
- /*
- H << nl << "typedef std::pair<const " << keyTypeS << ", const " << valueTypeS << " > value_type;";
-
- H << nl << "typedef Freeze::Iterator" << templateParams << " iterator;";
- H << nl << "typedef Freeze::ConstIterator" << templateParams << " const_iterator;";
- H << nl << "typedef size_t size_type;";
- H << nl << "typedef ptrdiff_t difference_type;";
- */
-
- //
- // Nested index classes
- //
-
- for(size_t i = 0; i < capitalizedMembers.size(); ++i)
- {
- string className = capitalizedMembers[i] + "Index";
-
- string indexCompare = getCompare(dict.indices[i], typeToString(indexTypes[i].type, indexTypes[i].metaData));
-
- string indexCompareParams = string("< ") + typeToString(indexTypes[i].type, indexTypes[i].metaData) + ", "
- + className + ", " + indexCompare + " >";
-
- H << sp << nl << "class " << dllExport << className
- << " : public Freeze::MapIndex" << indexCompareParams;
- H << sb;
-
- H.dec();
- H << sp << nl << "public:";
- H << sp;
- H.inc();
- H << nl << capitalizedMembers[i] << "Index(const std::string&, const "
- << indexCompare << "& = " << indexCompare << "());";
-
- H << sp;
-
- //
- // Codec
- //
- H << nl << "static void write(" << inputTypeToString(indexTypes[i].type, 0, indexTypes[i].metaData)
- << ", Freeze::Key&, const Ice::CommunicatorPtr&, const Ice::EncodingVersion&);";
-
- H << nl << "static void read("
- << typeToString(indexTypes[i].type, indexTypes[i].metaData)
- << "&, const Freeze::Key&, const ::Ice::CommunicatorPtr&, const Ice::EncodingVersion&);";
-
- H.dec();
- H << sp << nl << "protected:";
- H << sp;
- H.inc();
-
- H << nl << "virtual void marshalKey(const Freeze::Value&, Freeze::Key&) const;";
-
- H << eb << ';';
- }
-
- //
- // Constructors
- //
- H << sp;
- H << nl << name << "(const Freeze::ConnectionPtr&, const std::string&, "
- << "bool = true, const " << compare << "& = " << compare << "());";
- H << sp;
- H << nl << "template <class _InputIterator>"
- << nl << name << "(const Freeze::ConnectionPtr& __connection, "
- << "const std::string& __dbName, bool __createDb, _InputIterator __first, _InputIterator __last, "
- << "const " << compare << "& __compare = " << compare << "())";
- H.inc();
- if(capitalizedMembers.empty())
- {
- H << nl << ": Freeze::Map" << templateParams <<"(__connection, __dbName, keyTypeId(), valueTypeId(), "
- << "__createDb, __first, __last, __compare)";
- H.dec();
- H << sb;
- H << eb;
- }
- else
- {
- H << nl << ": Freeze::Map" << templateParams <<"(__connection->getCommunicator(), __connection->getEncoding())";
- H.dec();
- H << sb;
- H << nl << "Freeze::KeyCompareBasePtr __keyCompare = "
- << "new Freeze::KeyCompare" << keyCompareParams << "(__compare, this->_communicator, this->_encoding);";
- H << nl << "std::vector<Freeze::MapIndexBasePtr> __indices;";
- for(size_t i = 0; i < capitalizedMembers.size(); ++i)
- {
- string indexName = dict.indices[i].member;
- if(indexName.empty())
- {
- indexName = "index";
- }
- indexName = string("\"") + indexName + "\"";
-
- H << nl << "__indices.push_back(new " << capitalizedMembers[i] << "Index(" << indexName << "));";
- }
- H << nl << "this->_helper.reset(Freeze::MapHelper::create(__connection, __dbName, keyTypeId(), valueTypeId(), "
- << "__keyCompare, __indices, __createDb));";
- H << nl << "while(__first != __last)";
- H << sb;
- H << nl << "put(*__first);";
- H << nl << "++__first;";
- H << eb;
- H << eb;
-
- //
- // Recreate
- //
- H << sp << nl << "static void recreate(const Freeze::ConnectionPtr&, const std::string&, "
- << "const " << compare << "& = " << compare << "());";
- }
-
- H << sp;
- H << nl << "static std::string keyTypeId();";
- H << nl << "static std::string valueTypeId();";
-
- //
- // Find, begin, lowerBound, upperBound, equalRange and count functions
- //
- for(size_t i = 0; i < capitalizedMembers.size(); ++i)
- {
- H << sp;
- H << nl << "iterator findBy" << capitalizedMembers[i]
- << "(" << inputTypeToString(indexTypes[i].type, false, indexTypes[i].metaData) << ", bool = true);";
- H << nl << "const_iterator findBy" << capitalizedMembers[i]
- << "(" << inputTypeToString(indexTypes[i].type, false, indexTypes[i].metaData) << ", bool = true) const;";
-
- H << nl << "iterator beginFor" << capitalizedMembers[i] << "();";
- H << nl << "const_iterator beginFor" << capitalizedMembers[i] << "() const;";
-
- H << nl << "iterator endFor" << capitalizedMembers[i] << "();";
- H << nl << "const_iterator endFor" << capitalizedMembers[i] << "() const;";
-
- H << nl << "iterator lowerBoundFor" << capitalizedMembers[i]
- << "(" << inputTypeToString(indexTypes[i].type, false, indexTypes[i].metaData) << ");";
- H << nl << "const_iterator lowerBoundFor" << capitalizedMembers[i]
- << "(" << inputTypeToString(indexTypes[i].type, false, indexTypes[i].metaData) << ") const;";
-
- H << nl << "iterator upperBoundFor" << capitalizedMembers[i]
- << "(" << inputTypeToString(indexTypes[i].type, false, indexTypes[i].metaData) << ");";
- H << nl << "const_iterator upperBoundFor" << capitalizedMembers[i]
- << "(" << inputTypeToString(indexTypes[i].type, false, indexTypes[i].metaData) << ") const;";
-
- H << nl << "std::pair<iterator, iterator> equalRangeFor"
- << capitalizedMembers[i] << "(" << inputTypeToString(indexTypes[i].type, false, indexTypes[i].metaData)
- << ");";
-
- H << nl << "std::pair<const_iterator, const_iterator> equalRangeFor"
- << capitalizedMembers[i] << "(" << inputTypeToString(indexTypes[i].type, false, indexTypes[i].metaData)
- << ") const;";
-
- string countFunction = dict.indices[i].member.empty() ? string("valueCount")
- : dict.indices[i].member + "Count";
-
- H << nl << "int " << countFunction
- << "(" << inputTypeToString(indexTypes[i].type, false, indexTypes[i].metaData) << ") const;";
-
- }
-
- H << eb << ';';
-}
-
-void
-writeDictC(const string& name, const string& absolute, const Dict& dict, const vector<IndexType> indexTypes,
- const TypePtr& keyType, const StringList& keyMetaData, const TypePtr& valueType,
- const StringList& valueMetaData, Output& C)
-{
- const string keyTypeS = typeToString(keyType, keyMetaData);
- const string valueTypeS = typeToString(valueType, valueMetaData);
- const string compare = getCompare(dict, keyTypeS);
- const string keyCodec = string("::Freeze::MapKeyCodec< ") + keyTypeS + " >";
- const string valueCodec =
- string(valueType->usesClasses() ? "::Freeze::MapObjectValueCodec" : "::Freeze::MapValueCodec") +
- "< " + valueTypeS + " >";
-
- const string templateParams = string("< ") + keyTypeS + ", " + valueTypeS + ", " + keyCodec + ", " + valueCodec +
- ", " + compare + " >";
-
- const string keyCompareParams = string("< ") + keyTypeS + ", " + keyCodec + ", " + compare + " >";
-
- vector<string> capitalizedMembers;
-
- for(size_t i = 0; i < dict.indices.size(); ++i)
- {
- const string& member = dict.indices[i].member;
- if(!member.empty())
- {
- string capitalizedMember = member;
- capitalizedMember[0] = toupper(static_cast<unsigned char>(capitalizedMember[0]));
- capitalizedMembers.push_back(capitalizedMember);
- }
- else
- {
- capitalizedMembers.push_back("Value");
- }
- }
-
- //
- // Nested index classes
- //
- for(size_t i = 0; i < capitalizedMembers.size(); ++i)
- {
- string className = capitalizedMembers[i] + "Index";
-
- string indexCompare = getCompare(dict.indices[i], typeToString(indexTypes[i].type, indexTypes[i].metaData));
-
- string indexCompareParams = string("< ") + typeToString(indexTypes[i].type, indexTypes[i].metaData) + ", "
- + className + ", " + indexCompare + " >";
-
- C << sp << nl << absolute << "::" << className << "::" << className
- << "(const std::string& __name, "
- << "const " << indexCompare << "& __compare)";
-
- C.inc();
- C << nl << ": Freeze::MapIndex" << indexCompareParams << "(__name, __compare)";
- C.dec();
- C << sb;
- C << eb;
-
- C << sp << nl << "void"
- << nl << absolute << "::" << className << "::"
- << "marshalKey(const Freeze::Value& __v, Freeze::Key& __k) const";
- C << sb;
-
- bool optimize = false;
-
- if(dict.indices[i].member.empty() && dict.indices[i].caseSensitive)
- {
- optimize = true;
- C << nl << "__k = __v;";
- }
- else
- {
- //
- // Can't optimize
- //
- C << nl << valueTypeS << " __x;";
- C << nl << valueCodec << "::read(__x, __v, _communicator, _encoding);";
- string param = "__x";
-
- if(!dict.indices[i].member.empty())
- {
- if(ClassDeclPtr::dynamicCast(valueType) != 0)
- {
- param += "->" + dict.indices[i].member;
- }
- else
- {
- param += "." + dict.indices[i].member;
- }
- }
- C << nl << "write(" << param << ", __k, _communicator, _encoding);";
- }
- C << eb;
-
- C << sp << nl << "void"
- << nl << absolute << "::" << className << "::"
- << "write(" << inputTypeToString(indexTypes[i].type, false, indexTypes[i].metaData)
- << " __index, Freeze::Key& __bytes, const Ice::CommunicatorPtr& __communicator, "
- << "const Ice::EncodingVersion& __encoding)";
- C << sb;
-
- if(optimize)
- {
- C << nl << valueCodec << "::write(__index, __bytes, __communicator, __encoding);";
- }
- else
- {
- assert(!indexTypes[i].type->usesClasses());
-
- C << nl << "IceInternal::InstancePtr __instance = IceInternal::getInstance(__communicator);";
- C << nl << "IceInternal::BasicStream __stream(__instance.get(), __encoding);";
-
- string valueS;
- if(dict.indices[i].caseSensitive)
- {
- valueS = "__index";
- }
- else
- {
- C << nl << typeToString(indexTypes[i].type, indexTypes[i].metaData)
- << " __lowerCaseIndex = IceUtilInternal::toLower(__index);";
- valueS = "__lowerCaseIndex";
- }
-
- writeMarshalUnmarshalCode(C, indexTypes[i].type, false, 0, valueS, true, indexTypes[i].metaData, 0,
- "__stream", false);
- C << nl << "::std::vector<Ice::Byte>(__stream.b.begin(), __stream.b.end()).swap(__bytes);";
- }
- C << eb;
-
- C << sp << nl << "void"
- << nl << absolute << "::" << className << "::"
- << "read(" << typeToString(indexTypes[i].type, indexTypes[i].metaData)
- << "& __index, const Freeze::Key& __bytes, const Ice::CommunicatorPtr& __communicator, "
- << "const Ice::EncodingVersion& __encoding)";
- C << sb;
-
- if(optimize)
- {
- C << nl << valueCodec << "::read(__index, __bytes, __communicator, __encoding);";
- }
- else
- {
- C << nl << "IceInternal::InstancePtr __instance = IceInternal::getInstance(__communicator);";
- C << nl << "IceInternal::BasicStream __stream(__instance.get(), __encoding, ";
- C << "&__bytes[0], &__bytes[0] + __bytes.size());";
-
- writeMarshalUnmarshalCode(C, indexTypes[i].type, false, 0, "__index", false, indexTypes[i].metaData, 0,
- "__stream", false);
- }
- C << eb;
- }
-
- //
- // Constructor
- //
- C << sp << nl << absolute << "::" << name
- << "(const Freeze::ConnectionPtr& __connection, const std::string& __dbName ,"
- << "bool __createDb, const " << compare << "& __compare)";
- if(capitalizedMembers.empty())
- {
- C.inc();
- C << nl << ": Freeze::Map" << templateParams
- <<"(__connection, __dbName, keyTypeId(), valueTypeId(), __createDb, __compare)";
- C.dec();
- C << sb;
- C << eb;
- }
- else
- {
- C.inc();
- C << nl << ": Freeze::Map" << templateParams <<"(__connection->getCommunicator(), __connection->getEncoding())";
- C.dec();
- C << sb;
- C << nl << "Freeze::KeyCompareBasePtr __keyCompare = "
- << "new Freeze::KeyCompare" << keyCompareParams << "(__compare, _communicator, _encoding);";
- C << nl << "std::vector<Freeze::MapIndexBasePtr> __indices;";
- for(size_t i = 0; i < capitalizedMembers.size(); ++i)
- {
- string indexName = dict.indices[i].member;
- if(indexName.empty())
- {
- indexName = "index";
- }
- indexName = string("\"") + indexName + "\"";
-
- C << nl << "__indices.push_back(new " << capitalizedMembers[i] << "Index(" << indexName << "));";
- }
- C << nl << "_helper.reset(Freeze::MapHelper::create(__connection, __dbName, keyTypeId(), valueTypeId(), "
- << "__keyCompare, __indices, __createDb));";
- C << eb;
-
- //
- // Recreate
- //
- C << sp << nl << "void"
- << nl << absolute
- << "::recreate(const Freeze::ConnectionPtr& __connection, const std::string& __dbName ,"
- << " const " << compare << "& __compare)";
- C << sb;
- C << nl << "Freeze::KeyCompareBasePtr __keyCompare = "
- << "new Freeze::KeyCompare" << keyCompareParams << "(__compare, __connection->getCommunicator()"
- <<", __connection->getEncoding());";
- C << nl << "std::vector<Freeze::MapIndexBasePtr> __indices;";
- for(size_t i = 0; i < capitalizedMembers.size(); ++i)
- {
- string indexName = dict.indices[i].member;
- if(indexName.empty())
- {
- indexName = "index";
- }
- indexName = string("\"") + indexName + "\"";
-
- C << nl << "__indices.push_back(new " << capitalizedMembers[i] << "Index(" << indexName << "));";
- }
- C << nl << "Freeze::MapHelper::recreate(__connection, __dbName, keyTypeId(), valueTypeId(), __keyCompare, "
- << "__indices);";
- C << eb;
- }
-
- C << sp << nl << "std::string"
- << nl << absolute << "::keyTypeId()";
- C << sb;
- C << nl << "return \"" << getTypeId(keyType, keyMetaData) << "\";";
- C << eb;
- C << sp << nl << "std::string"
- << nl << absolute << "::valueTypeId()";
- C << sb;
- C << nl << "return \"" << getTypeId(valueType, valueMetaData) << "\";";
- C << eb;
-
- //
- // Find and count functions
- //
- for(size_t i = 0; i < capitalizedMembers.size(); ++i)
- {
- string indexClassName = capitalizedMembers[i] + "Index";
-
- string indexName = dict.indices[i].member;
- if(indexName.empty())
- {
- indexName = "index";
- }
- indexName = string("\"") + indexName + "\"";
-
- C << sp << nl << absolute << "::iterator"
- << nl << absolute << "::" << "findBy" << capitalizedMembers[i]
- << "(" << inputTypeToString(indexTypes[i].type, false, indexTypes[i].metaData)
- << " __index, bool __onlyDups)";
- C << sb;
- C << nl << "Freeze::Key __bytes;";
- C << nl << indexClassName << "::" << "write(__index, __bytes, _communicator, _encoding);";
- C << nl << "return iterator(_helper->index(" << indexName
- << ")->untypedFind(__bytes, false, __onlyDups), _communicator, _encoding);";
- C << eb;
-
- C << sp << nl << absolute << "::const_iterator"
- << nl << absolute << "::" << "findBy" << capitalizedMembers[i]
- << "(" << inputTypeToString(indexTypes[i].type, false, indexTypes[i].metaData)
- << " __index, bool __onlyDups) const";
- C << sb;
- C << nl << "Freeze::Key __bytes;";
- C << nl << indexClassName << "::" << "write(__index, __bytes, _communicator, _encoding);";
- C << nl << "return const_iterator(_helper->index(" << indexName
- << ")->untypedFind(__bytes, true, __onlyDups), _communicator, _encoding);";
- C << eb;
-
- C << sp << nl << absolute << "::iterator"
- << nl << absolute << "::" << "beginFor" << capitalizedMembers[i] << "()";
- C << sb;
- C << nl << "return iterator(_helper->index(" << indexName << ")->begin(false), _communicator, _encoding);";
- C << eb;
-
- C << sp << nl << absolute << "::const_iterator"
- << nl << absolute << "::" << "beginFor" << capitalizedMembers[i] << "() const";
- C << sb;
- C << nl << "return const_iterator(_helper->index(" << indexName << ")->begin(true), _communicator, _encoding);";
- C << eb;
-
- C << sp << nl << absolute << "::iterator"
- << nl << absolute << "::" << "endFor" << capitalizedMembers[i] << "()";
- C << sb;
- C << nl << "return iterator();";
- C << eb;
-
- C << sp << nl << absolute << "::const_iterator"
- << nl << absolute << "::" << "endFor" << capitalizedMembers[i] << "() const";
- C << sb;
- C << nl << "return const_iterator();";
- C << eb;
-
- C << sp << nl << absolute << "::iterator"
- << nl << absolute << "::" << "lowerBoundFor" << capitalizedMembers[i]
- << "(" << inputTypeToString(indexTypes[i].type, false, indexTypes[i].metaData) << " __index)";
- C << sb;
- C << nl << "Freeze::Key __bytes;";
- C << nl << indexClassName << "::" << "write(__index, __bytes, _communicator, _encoding);";
- C << nl << "return iterator(_helper->index(" << indexName
- << ")->untypedLowerBound(__bytes, false), _communicator, _encoding);";
- C << eb;
-
- C << sp << nl << absolute << "::const_iterator"
- << nl << absolute << "::" << "lowerBoundFor" << capitalizedMembers[i]
- << "(" << inputTypeToString(indexTypes[i].type, false, indexTypes[i].metaData) << " __index) const";
- C << sb;
- C << nl << "Freeze::Key __bytes;";
- C << nl << indexClassName << "::" << "write(__index, __bytes, _communicator, _encoding);";
- C << nl << "return const_iterator(_helper->index(" << indexName
- << ")->untypedLowerBound(__bytes, true), _communicator, _encoding);";
- C << eb;
-
- C << sp << nl << absolute << "::iterator"
- << nl << absolute << "::" << "upperBoundFor" << capitalizedMembers[i]
- << "(" << inputTypeToString(indexTypes[i].type, false, indexTypes[i].metaData) << " __index)";
- C << sb;
- C << nl << "Freeze::Key __bytes;";
- C << nl << indexClassName << "::" << "write(__index, __bytes, _communicator, _encoding);";
- C << nl << "return iterator(_helper->index(" << indexName
- << ")->untypedUpperBound(__bytes, false), _communicator, _encoding);";
- C << eb;
-
- C << sp << nl << absolute << "::const_iterator"
- << nl << absolute << "::" << "upperBoundFor" << capitalizedMembers[i]
- << "(" << inputTypeToString(indexTypes[i].type, false, indexTypes[i].metaData) << " __index) const";
- C << sb;
- C << nl << "Freeze::Key __bytes;";
- C << nl << indexClassName << "::" << "write(__index, __bytes, _communicator, _encoding);";
- C << nl << "return const_iterator(_helper->index(" << indexName
- << ")->untypedUpperBound(__bytes, true), _communicator, _encoding);";
- C << eb;
-
- C << sp << nl << "std::pair<" << absolute << "::iterator, "
- << absolute << "::iterator>"
- << nl << absolute << "::" << "equalRangeFor" << capitalizedMembers[i]
- << "(" << inputTypeToString(indexTypes[i].type, false, indexTypes[i].metaData) << " __index)";
- C << sb;
- C << nl << "return std::make_pair(lowerBoundFor" << capitalizedMembers[i]
- << "(__index), upperBoundFor" << capitalizedMembers[i] << "(__index));";
- C << eb;
-
- C << sp << nl << "std::pair<" << absolute << "::const_iterator, "
- << absolute << "::const_iterator>"
- << nl << absolute << "::" << "equalRangeFor" << capitalizedMembers[i]
- << "(" << inputTypeToString(indexTypes[i].type, false, indexTypes[i].metaData) << " __index) const";
- C << sb;
- C << nl << "return std::make_pair(lowerBoundFor" << capitalizedMembers[i]
- << "(__index), upperBoundFor" << capitalizedMembers[i] << "(__index));";
- C << eb;
-
- string countFunction = dict.indices[i].member.empty() ? string("valueCount")
- : dict.indices[i].member + "Count";
-
- C << sp << nl << "int"
- << nl << absolute << "::" << countFunction
- << "(" << inputTypeToString(indexTypes[i].type, false, indexTypes[i].metaData) << " __index) const";
- C << sb;
- C << nl << "Freeze::Key __bytes;";
- C << nl << indexClassName << "::" << "write(__index, __bytes, _communicator, _encoding);";
- C << nl << "return _helper->index(" << indexName
- << ")->untypedCount(__bytes);";
- C << eb;
- }
-}
-
-void
-writeDict(const string& n, const UnitPtr& u, const Dict& dict, Output& H, Output& C, const string& dllExport)
-{
- string absolute = dict.name;
- if(absolute.find("::") == 0)
- {
- absolute.erase(0, 2);
- }
- string name = absolute;
- vector<string> scope;
- string::size_type pos;
- while((pos = name.find("::")) != string::npos)
- {
- string s = name.substr(0, pos);
- name.erase(0, pos + 2);
-
- checkIdentifier(absolute, s);
-
- scope.push_back(s);
- }
-
- checkIdentifier(absolute, name);
-
- TypeList keyTypes = u->lookupType(dict.key, false);
- if(keyTypes.empty())
- {
- ostringstream os;
- os << "`" << dict.key << "' is not a valid type";
- throw os.str();
- }
- TypePtr keyType = keyTypes.front();
-
- TypeList valueTypes = u->lookupType(dict.value, false);
- if(valueTypes.empty())
- {
- ostringstream os;
- os << "`" << dict.value << "' is not a valid type";
- throw os.str();
- }
- TypePtr valueType = valueTypes.front();
-
- for(vector<string>::const_iterator q = scope.begin(); q != scope.end(); ++q)
- {
- H << sp;
- H << nl << "namespace " << *q << nl << '{';
- }
-
- vector<IndexType> indexTypes;
-
- for(vector<DictIndex>::const_iterator p = dict.indices.begin(); p != dict.indices.end(); ++p)
- {
- const DictIndex& index = *p;
- if(index.member.empty())
- {
- if(dict.indices.size() > 1)
- {
- ostringstream os;
- os << "bad index for dictionary `" << dict.name << "'";
- throw os.str();
- }
-
- bool containsSequence = false;
- if(!Dictionary::legalKeyType(valueType, containsSequence))
- {
- ostringstream os;
- os << "`" << dict.value << "' is not a valid index type";
- throw os.str();
- }
- if(containsSequence)
- {
- getErrorStream() << n << ": warning: use of sequences in dictionary keys has been deprecated";
- }
-
- if(index.caseSensitive == false)
- {
- //
- // Let's check value is a string
- //
-
- BuiltinPtr builtInType = BuiltinPtr::dynamicCast(valueType);
-
- if(builtInType == 0 || builtInType->kind() != Builtin::KindString)
- {
- ostringstream os;
- os << "VALUE is a `" << dict.value << "', not a string";
- throw os.str();
- }
- }
- IndexType iType;
- iType.type = valueType;
- iType.metaData = dict.valueMetaData;
- indexTypes.push_back(iType);
- }
- else
- {
- DataMemberPtr dataMember = 0;
- DataMemberList dataMembers;
-
- ClassDeclPtr classDecl = ClassDeclPtr::dynamicCast(valueType);
- if(classDecl != 0)
- {
- dataMembers = classDecl->definition()->allDataMembers();
- }
- else
- {
- StructPtr structDecl = StructPtr::dynamicCast(valueType);
- if(structDecl == 0)
- {
- ostringstream os;
- os << "`" << dict.value << "' is neither a class nor a struct.";
- throw os.str();
- }
- dataMembers = structDecl->dataMembers();
- }
- DataMemberList::const_iterator d = dataMembers.begin();
- while(d != dataMembers.end() && dataMember == 0)
- {
- if((*d)->name() == index.member)
- {
- dataMember = *d;
- }
- else
- {
- ++d;
- }
- }
-
- if(dataMember == 0)
- {
- ostringstream os;
- os << "The value of `" << dict.name
- << "' has no data member named `" << index.member << "'";
- throw os.str();
- }
-
- TypePtr dataMemberType = dataMember->type();
-
- bool containsSequence = false;
- if(!Dictionary::legalKeyType(dataMemberType, containsSequence))
- {
- ostringstream os;
- os << "`" << index.member << "' cannot be used as an index";
- throw os.str();
- }
- if(containsSequence)
- {
- getErrorStream() << n << ": warning: use of sequences in dictionary keys has been deprecated";
- }
-
- if(index.caseSensitive == false)
- {
- //
- // Let's check member is a string
- //
- BuiltinPtr memberType = BuiltinPtr::dynamicCast(dataMemberType);
- if(memberType == 0 || memberType->kind() != Builtin::KindString)
- {
- ostringstream os;
- os << "`" << index.member << "' is not a string ";
- throw os.str();
- }
- }
- IndexType iType;
- iType.type = dataMemberType;
- iType.metaData = dataMember->getMetaData();
- indexTypes.push_back(iType);
- }
- }
-
- writeDictH(name, dict, indexTypes, keyType, dict.keyMetaData, valueType, dict.valueMetaData, H, dllExport);
-
- for(vector<string>::const_iterator q = scope.begin(); q != scope.end(); ++q)
- {
- H << sp;
- H << nl << '}';
- }
-
- writeDictC(name, absolute, dict, indexTypes, keyType, dict.keyMetaData, valueType, dict.valueMetaData, C);
-}
-
-void
-writeIndexH(const string& memberTypeString, const string& name, Output& H, const string& dllExport)
-{
- H << sp << nl << "class " << dllExport << name
- << " : public Freeze::Index";
- H << sb;
- H.dec();
- H << sp << nl << "public:";
- H << sp;
- H.inc();
-
- H << nl << name << "(const std::string&, const std::string& = \"\");";
- H << sp << nl << "std::vector<Ice::Identity>";
- H << nl << "findFirst(" << memberTypeString << ", Ice::Int) const;";
-
- H << sp << nl << "std::vector<Ice::Identity>";
- H << nl << "find(" << memberTypeString << ") const;";
-
- H << sp << nl << "Ice::Int";
- H << nl << "count(" << memberTypeString << ") const;";
- H.dec();
- H << sp << nl << "private:";
- H << sp;
- H.inc();
-
- H << nl << "virtual bool";
- H << nl << "marshalKey(const Ice::ObjectPtr&, Freeze::Key&) const;";
-
- H << sp << nl << "void";
- H << nl << "marshalKey(" << memberTypeString << ", Freeze::Key&) const;";
-
- H << eb << ';';
- H << sp;
- H << nl << "typedef IceUtil::Handle<" << name << "> " << name << "Ptr;";
-}
-
-void
-writeIndexC(const TypePtr& type, const TypePtr& memberType, const string& memberName,
- bool caseSensitive, const string& fullName, const string& name, Output& C)
-{
- string inputType = inputTypeToString(memberType, false);
-
- C << sp << nl << fullName << "::" << name
- << "(const ::std::string& __name, const ::std::string& __facet)";
- C.inc();
- C << nl << ": Freeze::Index(__name, __facet)";
- C.dec();
- C << sb;
- C << eb;
-
- C << sp << nl << "std::vector<Ice::Identity>";
- C << nl << fullName << "::" << "findFirst(" << inputType << " __index, ::Ice::Int __firstN) const";
- C << sb;
- C << nl << "Freeze::Key __bytes;";
- C << nl << "marshalKey(__index, __bytes);";
- C << nl << "return untypedFindFirst(__bytes, __firstN);";
- C << eb;
-
- C << sp << nl << "std::vector<Ice::Identity>";
- C << nl << fullName << "::" << "find(" << inputType << " __index) const";
- C << sb;
- C << nl << "Freeze::Key __bytes;";
- C << nl << "marshalKey(__index, __bytes);";
- C << nl << "return untypedFind(__bytes);";
- C << eb;
-
- C << sp << nl << "Ice::Int";
- C << nl << fullName << "::" << "count(" << inputType << " __index) const";
- C << sb;
- C << nl << "Freeze::Key __bytes;";
- C << nl << "marshalKey(__index, __bytes);";
- C << nl << "return untypedCount(__bytes);";
- C << eb;
-
- string typeString = typeToString(type);
-
- C << sp << nl << "bool";
- C << nl << fullName << "::" << "marshalKey(const Ice::ObjectPtr& __servant, Freeze::Key& __bytes) const";
- C << sb;
- C << nl << typeString << " __s = " << typeString << "::dynamicCast(__servant);";
- C << nl << "if(__s != 0)";
- C << sb;
- C << nl << "marshalKey(__s->" << memberName << ", __bytes);";
- C << nl << "return true;";
- C << eb;
- C << nl << "else";
- C << sb;
- C << nl << "return false;";
- C << eb;
- C << eb;
-
- C << sp << nl << "void";
- C << nl << fullName << "::" << "marshalKey(" << inputType << " __index, Freeze::Key& __bytes) const";
- C << sb;
- C << nl << "IceInternal::InstancePtr __instance = IceInternal::getInstance(_communicator);";
- C << nl << "IceInternal::BasicStream __stream(__instance.get(), _encoding);";
-
- string valueS;
- if(caseSensitive)
- {
- valueS = "__index";
- }
- else
- {
- C << nl << typeToString(memberType) << " __lowerCaseIndex = IceUtilInternal::toLower(__index);";
- valueS = "__lowerCaseIndex";
- }
-
- writeMarshalUnmarshalCode(C, memberType, false, 0, valueS, true, StringList(), 0, "__stream", false);
- if(memberType->usesClasses())
- {
- C << nl << "__stream.writePendingObjects();";
- }
- C << nl << "::std::vector<Ice::Byte>(__stream.b.begin(), __stream.b.end()).swap(__bytes);";
- C << eb;
-}
-
-void
-writeIndex(const string& /*n*/, const UnitPtr& u, const Index& index, Output& H, Output& C, const string& dllExport)
-{
- string absolute = index.name;
- if(absolute.find("::") == 0)
- {
- absolute.erase(0, 2);
- }
- string name = absolute;
- vector<string> scope;
- string::size_type pos;
- while((pos = name.find("::")) != string::npos)
- {
- string s = name.substr(0, pos);
- name.erase(0, pos + 2);
-
- checkIdentifier(absolute, s);
-
- scope.push_back(s);
- }
-
- checkIdentifier(absolute, name);
-
- TypeList types = u->lookupType(index.type, false);
- if(types.empty())
- {
- ostringstream os;
- os << "`" << index.type << "' is not a valid type";
- throw os.str();
- }
- TypePtr type = types.front();
-
- ClassDeclPtr classDecl = ClassDeclPtr::dynamicCast(type);
- if(classDecl == 0)
- {
- ostringstream os;
- os << "`" << index.type << "' is not a class";
- throw os.str();
- }
-
- DataMemberList dataMembers = classDecl->definition()->allDataMembers();
- DataMemberPtr dataMember = 0;
- DataMemberList::const_iterator p = dataMembers.begin();
- while(p != dataMembers.end() && dataMember == 0)
- {
- if((*p)->name() == index.member)
- {
- dataMember = *p;
- }
- else
- {
- ++p;
- }
- }
-
- if(dataMember == 0)
- {
- ostringstream os;
- os << "`" << index.type << "' has no data member named `" << index.member << "'";
- throw os.str();
- }
-
- if(index.caseSensitive == false)
- {
- //
- // Let's check member is a string
- //
- BuiltinPtr memberType = BuiltinPtr::dynamicCast(dataMember->type());
- if(memberType == 0 || memberType->kind() != Builtin::KindString)
- {
- ostringstream os;
- os << "`" << index.member << "'is not a string";
- throw os.str();
- }
- }
-
- for(vector<string>::const_iterator q = scope.begin(); q != scope.end(); ++q)
- {
- H << sp;
- H << nl << "namespace " << *q << nl << '{';
- }
-
- writeIndexH(inputTypeToString(dataMember->type(), false), name, H, dllExport);
-
- for(vector<string>::const_iterator q = scope.begin(); q != scope.end(); ++q)
- {
- H << sp;
- H << nl << '}';
- }
-
- writeIndexC(type, dataMember->type(), index.member, index.caseSensitive, absolute, name, C);
-}
-
-void
-gen(const string& name, const UnitPtr& u, const vector<string>& includePaths, const vector<string>& extraHeaders,
- const vector<Dict>& dicts, const vector<Index>& indices, const string& include, const string& headerExtension,
- const string& sourceExtension, string dllExport, const StringList& includes, const vector<string>& args,
- const string& output)
-{
- string fileH = args[0];
- fileH += "." + headerExtension;
- string includeH = fileH;
- string fileC = args[0];
- fileC += "." + sourceExtension;
-
- if(!output.empty())
- {
- fileH = output + '/' + fileH;
- fileC = output + '/' + fileC;
- }
-
- u->mergeModules();
- u->sort();
-
- IceUtilInternal::Output H;
- H.open(fileH.c_str());
- if(!H)
- {
- ostringstream os;
- os << "cannot open `" << fileH << "': " << strerror(errno);
- throw FileException(__FILE__, __LINE__, os.str());
- }
-
- FileTracker::instance()->addFile(fileH);
-
- printHeader(H);
- printGeneratedHeader(H, string(args[0]) + ".ice");
-
-
- printFreezeTypes(H, dicts, indices);
-
- IceUtilInternal::Output CPP;
- CPP.open(fileC.c_str());
- if(!CPP)
- {
- ostringstream os;
- os << "cannot open `" << fileC << "': " << strerror(errno);
- throw FileException(__FILE__, __LINE__, os.str());
- }
- FileTracker::instance()->addFile(fileC);
-
- printHeader(CPP);
- printGeneratedHeader(CPP, string(args[0]) + ".ice");
-
- printFreezeTypes(CPP, dicts, indices);
-
- for(vector<string>::const_iterator i = extraHeaders.begin(); i != extraHeaders.end(); ++i)
- {
- string hdr = *i;
- string guard;
- string::size_type pos = hdr.rfind(',');
- if(pos != string::npos)
- {
- hdr = i->substr(0, pos);
- guard = i->substr(pos + 1);
- }
- if(!guard.empty())
- {
- CPP << "\n#ifndef " << guard;
- CPP << "\n#define " << guard;
- }
- CPP << "\n#include <";
- if(!include.empty())
- {
- CPP << include << '/';
- }
- CPP << hdr << '>';
- if(!guard.empty())
- {
- CPP << "\n#endif";
- }
- }
-
- string s = fileH;
- transform(s.begin(), s.end(), s.begin(), ToIfdef());
- H << "\n#ifndef __" << s << "__";
- H << "\n#define __" << s << "__";
- H << '\n';
-
- H << "\n#include <IceUtil/PushDisableWarnings.h>";
-
- if(dicts.size() > 0)
- {
- H << "\n#include <Freeze/Map.h>";
- }
-
- if(indices.size() > 0)
- {
- H << "\n#include <Freeze/Index.h>";
- }
-
- for(StringList::const_iterator p = includes.begin(); p != includes.end(); ++p)
- {
- H << "\n#include <" << changeInclude(*p, includePaths) << "." + headerExtension + ">";
- }
-
-
- CPP << "\n#include <IceUtil/PushDisableWarnings.h>";
- CPP << "\n#include <Ice/BasicStream.h>";
- CPP << "\n#include <IceUtil/StringUtil.h>";
- CPP << "\n#include <IceUtil/PopDisableWarnings.h>";
- CPP << "\n#include <";
- if(include.size())
- {
- CPP << include << '/';
- }
- CPP << includeH << '>';
-
- printVersionCheck(H);
- printVersionCheck(CPP);
-
- printDllExportStuff(H, dllExport);
- if(dllExport.size())
- {
- dllExport += " ";
- }
-
- for(vector<Dict>::const_iterator p = dicts.begin(); p != dicts.end(); ++p)
- {
- writeDict(name, u, *p, H, CPP, dllExport);
- }
-
- for(vector<Index>::const_iterator q = indices.begin(); q != indices.end(); ++q)
- {
- writeIndex(name, u, *q, H, CPP, dllExport);
- }
-
- H << "\n\n#include <IceUtil/PopDisableWarnings.h>";
- H << "\n#endif\n";
- CPP << '\n';
-
- H.close();
- CPP.close();
-}
-
-int
-compile(int argc, char* argv[])
-{
- IceUtilInternal::Options opts;
- opts.addOpt("h", "help");
- opts.addOpt("v", "version");
- opts.addOpt("", "validate");
- opts.addOpt("", "header-ext", IceUtilInternal::Options::NeedArg, "h");
- opts.addOpt("", "source-ext", IceUtilInternal::Options::NeedArg, "cpp");
- opts.addOpt("", "add-header", IceUtilInternal::Options::NeedArg, "", IceUtilInternal::Options::Repeat);
- opts.addOpt("D", "", IceUtilInternal::Options::NeedArg, "", IceUtilInternal::Options::Repeat);
- opts.addOpt("U", "", IceUtilInternal::Options::NeedArg, "", IceUtilInternal::Options::Repeat);
- opts.addOpt("I", "", IceUtilInternal::Options::NeedArg, "", IceUtilInternal::Options::Repeat);
- opts.addOpt("E");
- opts.addOpt("", "include-dir", IceUtilInternal::Options::NeedArg);
- opts.addOpt("", "dll-export", IceUtilInternal::Options::NeedArg);
- opts.addOpt("", "dict", IceUtilInternal::Options::NeedArg, "", IceUtilInternal::Options::Repeat);
- opts.addOpt("", "index", IceUtilInternal::Options::NeedArg, "", IceUtilInternal::Options::Repeat);
- opts.addOpt("", "dict-index", IceUtilInternal::Options::NeedArg, "", IceUtilInternal::Options::Repeat);
- opts.addOpt("", "output-dir", IceUtilInternal::Options::NeedArg);
- opts.addOpt("", "depend");
- opts.addOpt("", "depend-xml");
- opts.addOpt("", "depend-file", IceUtilInternal::Options::NeedArg, "");
- opts.addOpt("d", "debug");
- opts.addOpt("", "ice");
- opts.addOpt("", "underscore");
-
- bool validate = false;
- for(int i = 0; i < argc; ++i)
- {
- if(string(argv[i]) == "--validate")
- {
- validate = true;
- break;
- }
- }
-
- vector<string> args;
- try
- {
- args = opts.parse(argc, const_cast<const char**>(argv));
- }
- catch(const IceUtilInternal::BadOptException& e)
- {
- getErrorStream() << argv[0] << ": error: " << e.reason << endl;
- if(!validate)
- {
- usage(argv[0]);
- }
- return EXIT_FAILURE;
- }
-
- if(opts.isSet("help"))
- {
- usage(argv[0]);
- return EXIT_SUCCESS;
- }
-
- if(opts.isSet("version"))
- {
- getErrorStream() << ICE_STRING_VERSION << endl;
- return EXIT_SUCCESS;
- }
-
- string headerExtension = opts.optArg("header-ext");
- string sourceExtension = opts.optArg("source-ext");
-
- vector<string> cppArgs;
- vector<string> extraHeaders = opts.argVec("add-header");
- vector<string> optargs = opts.argVec("D");
-
- for(vector<string>::const_iterator i = optargs.begin(); i != optargs.end(); ++i)
- {
- cppArgs.push_back("-D" + *i);
- }
-
- optargs = opts.argVec("U");
- for(vector<string>::const_iterator i = optargs.begin(); i != optargs.end(); ++i)
- {
- cppArgs.push_back("-U" + *i);
- }
-
- vector<string> includePaths = opts.argVec("I");
- for(vector<string>::const_iterator i = includePaths.begin(); i != includePaths.end(); ++i)
- {
- cppArgs.push_back("-I" + Preprocessor::normalizeIncludePath(*i));
- }
-
- // Convert include paths to full paths.
- for(vector<string>::iterator p = includePaths.begin(); p != includePaths.end(); ++p)
- {
- *p = fullPath(*p);
- }
-
- bool preprocess= opts.isSet("E");
-
- string include = opts.optArg("include-dir");
-
- string dllExport = opts.optArg("dll-export");
-
- vector<Dict> dicts;
- optargs = opts.argVec("dict");
- for(vector<string>::const_iterator i = optargs.begin(); i != optargs.end(); ++i)
- {
- string s = IceUtilInternal::removeWhitespace(*i);
-
- Dict dict;
-
- string::size_type pos;
- pos = s.find(',');
- if(pos != string::npos)
- {
- dict.name = s.substr(0, pos);
- s.erase(0, pos + 1);
- }
- pos = s.find(',');
- if(pos != string::npos)
- {
- if(s.find("[\"") == 0)
- {
- string::size_type end = s.find("\"]");
- if(end != string::npos && end < pos)
- {
- dict.key = s.substr(end + 2, pos - end - 2);
- dict.keyMetaData.push_back(s.substr(2, end - 2));
- }
- else
- {
- dict.key = s.substr(0, pos);
- }
- }
- else
- {
- dict.key = s.substr(0, pos);
- }
- s.erase(0, pos + 1);
- }
- pos = s.find(',');
- if(pos == string::npos)
- {
- if(s.find("[\"") == 0)
- {
- string::size_type end = s.find("\"]");
- if(end != string::npos)
- {
- dict.value = s.substr(end + 2);
- dict.valueMetaData.push_back(s.substr(2, end - 2));
- }
- else
- {
- dict.value = s;
- }
- }
- else
- {
- dict.value = s;
- }
- dict.sort = false;
- }
- else
- {
- if(s.find("[\"") == 0)
- {
- string::size_type end = s.find("\"]");
- if(end != string::npos && end < pos)
- {
- dict.value = s.substr(end + 2, pos - end - 2);
- dict.valueMetaData.push_back(s.substr(2, end - 2));
- }
- else
- {
- dict.value = s.substr(0, pos);
- }
- }
- else
- {
- dict.value = s.substr(0, pos);
- }
- s.erase(0, pos + 1);
-
- pos = s.find(',');
- if(pos == string::npos)
- {
- if(s != "sort")
- {
- getErrorStream() << argv[0] << ": error: " << *i << ": nothing or ',sort' expected after value-type"
- << endl;
- if(!validate)
- {
- usage(argv[0]);
- }
- return EXIT_FAILURE;
- }
- dict.sort = true;
- }
- else
- {
- string sort = s.substr(0, pos);
- s.erase(0, pos + 1);
- if(sort != "sort")
- {
- getErrorStream() << argv[0] << ": error: " << *i << ": nothing or ',sort' expected after value-type"
- << endl;
- if(!validate)
- {
- usage(argv[0]);
- }
- return EXIT_FAILURE;
- }
- dict.sort = true;
- dict.userCompare = s;
- }
- }
-
- if(dict.name.empty())
- {
- getErrorStream() << argv[0] << ": error: " << *i << ": no name specified" << endl;
- if(!validate)
- {
- usage(argv[0]);
- }
- return EXIT_FAILURE;
- }
-
- if(dict.key.empty())
- {
- getErrorStream() << argv[0] << ": error: " << *i << ": no key specified" << endl;
- if(!validate)
- {
- usage(argv[0]);
- }
- return EXIT_FAILURE;
- }
-
- if(dict.value.empty())
- {
- getErrorStream() << argv[0] << ": error: " << *i << ": no value specified" << endl;
- if(!validate)
- {
- usage(argv[0]);
- }
- return EXIT_FAILURE;
- }
-
- dicts.push_back(dict);
- }
-
- vector<Index> indices;
- optargs = opts.argVec("index");
- for(vector<string>::const_iterator i = optargs.begin(); i != optargs.end(); ++i)
- {
- string s = IceUtilInternal::removeWhitespace(*i);
-
- Index index;
-
- string::size_type pos;
- pos = s.find(',');
- if(pos != string::npos)
- {
- index.name = s.substr(0, pos);
- s.erase(0, pos + 1);
- }
- pos = s.find(',');
- if(pos != string::npos)
- {
- index.type = s.substr(0, pos);
- s.erase(0, pos + 1);
- }
- pos = s.find(',');
- string caseString;
- if(pos != string::npos)
- {
- index.member = s.substr(0, pos);
- s.erase(0, pos + 1);
- caseString = s;
- }
- else
- {
- index.member = s;
- caseString = "case-sensitive";
- }
-
- if(index.name.empty())
- {
- getErrorStream() << argv[0] << ": error: " << *i << ": no name specified" << endl;
- if(!validate)
- {
- usage(argv[0]);
- }
- return EXIT_FAILURE;
- }
-
- if(index.type.empty())
- {
- getErrorStream() << argv[0] << ": error: " << *i << ": no type specified" << endl;
- if(!validate)
- {
- usage(argv[0]);
- }
- return EXIT_FAILURE;
- }
-
- if(index.member.empty())
- {
- getErrorStream() << argv[0] << ": error: " << *i << ": no member specified" << endl;
- if(!validate)
- {
- usage(argv[0]);
- }
- return EXIT_FAILURE;
- }
-
- if(caseString != "case-sensitive" && caseString != "case-insensitive")
- {
- getErrorStream() << argv[0] << ": error: " << *i << ": the case can be `case-sensitive' or "
- << "`case-insensitive'" << endl;
- if(!validate)
- {
- usage(argv[0]);
- }
- return EXIT_FAILURE;
- }
- index.caseSensitive = (caseString == "case-sensitive");
-
- indices.push_back(index);
- }
-
- optargs = opts.argVec("dict-index");
- for(vector<string>::const_iterator i = optargs.begin(); i != optargs.end(); ++i)
- {
- string s = IceUtilInternal::removeWhitespace(*i);
-
- string dictName;
- DictIndex index;
- index.sort = false;
- index.caseSensitive = true;
-
- string::size_type pos = s.find(',');
- if(pos == string::npos)
- {
- dictName = s;
- }
- else
- {
- dictName = s.substr(0, pos);
- s.erase(0, pos + 1);
-
- bool done = false;
- while(!done)
- {
- pos = s.find(',');
- if(pos == string::npos)
- {
- if(s == "sort")
- {
- index.sort = true;
- }
- else if(s == "case-sensitive")
- {
- index.caseSensitive = true;
- }
- else if(s == "case-insensitive")
- {
- index.caseSensitive = false;
- }
- else if(index.member.empty())
- {
- if(s == "\\sort")
- {
- index.member = "sort";
- }
- else
- {
- index.member = s;
- }
- }
- else
- {
- getErrorStream() << argv[0] << ": error: " << *i << ": syntax error" << endl;
- if(!validate)
- {
- usage(argv[0]);
- }
- return EXIT_FAILURE;
- }
- done = true;
- }
- else
- {
- string subs = s.substr(0, pos);
- s.erase(0, pos + 1);
-
- if(subs == "sort")
- {
- index.sort = true;
- index.userCompare = s;
- done = true;
- }
- else if(subs == "case-sensitive")
- {
- index.caseSensitive = true;
- }
- else if(subs == "case-insensitive")
- {
- index.caseSensitive = false;
- }
- else if(index.member.empty())
- {
- if(subs == "\\sort")
- {
- index.member = "sort";
- }
- else
- {
- index.member = subs;
- }
- }
- else
- {
- getErrorStream() << argv[0] << ": error: " << *i << ": syntax error" << endl;
- if(!validate)
- {
- usage(argv[0]);
- }
- return EXIT_FAILURE;
- }
- }
- }
- }
-
- if(dictName.empty())
- {
- getErrorStream() << argv[0] << ": error: " << *i << ": no dictionary specified" << endl;
- if(!validate)
- {
- usage(argv[0]);
- }
- return EXIT_FAILURE;
- }
-
- bool found = false;
- for(vector<Dict>::iterator p = dicts.begin(); p != dicts.end(); ++p)
- {
- if(p->name == dictName)
- {
- if(find(p->indices.begin(), p->indices.end(), index) != p->indices.end())
- {
- getErrorStream() << argv[0] << ": error: --dict-index " << *i
- << ": this dict-index is defined twice" << endl;
- return EXIT_FAILURE;
- }
- p->indices.push_back(index);
- found = true;
- break;
- }
- }
- if(!found)
- {
- getErrorStream() << argv[0] << ": error: " << *i << ": unknown dictionary" << endl;
- if(!validate)
- {
- usage(argv[0]);
- }
- return EXIT_FAILURE;
- }
- }
-
- string output = opts.optArg("output-dir");
-
- bool depend = opts.isSet("depend");
- bool dependxml = opts.isSet("depend-xml");
-
- string dependFile = opts.optArg("depend-file");
-
- bool debug = opts.isSet("debug");
-
- bool ice = opts.isSet("ice");
-
- bool underscore = opts.isSet("underscore");
-
- if(dicts.empty() && indices.empty() && !(depend || dependxml))
- {
- getErrorStream() << argv[0] << ": error: no Freeze types specified" << endl;
- if(!validate)
- {
- usage(argv[0]);
- }
- return EXIT_FAILURE;
- }
-
- if(args.empty())
- {
- getErrorStream() << argv[0] << ": error: no file name base specified" << endl;
- if(!validate)
- {
- usage(argv[0]);
- }
- return EXIT_FAILURE;
- }
-
- if(depend && dependxml)
- {
- getErrorStream() << argv[0] << ": error: cannot specify both --depend and --depend-xml" << endl;
- if(!validate)
- {
- usage(argv[0]);
- }
- return EXIT_FAILURE;
- }
-
- if(validate)
- {
- return EXIT_SUCCESS;
- }
-
- UnitPtr u = Unit::createUnit(true, false, ice, underscore);
-
- StringList includes;
-
- int status = EXIT_SUCCESS;
-
- IceUtil::CtrlCHandler ctrlCHandler;
- ctrlCHandler.setCallback(interruptedCallback);
-
- DependOutputUtil out(dependFile);
- if(dependxml)
- {
- out.os() << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<dependencies>" << endl;
- }
-
- for(vector<string>::size_type idx = 1; idx < args.size(); ++idx)
- {
- if(depend || dependxml)
- {
- PreprocessorPtr icecpp = Preprocessor::create(argv[0], args[idx], cppArgs);
- FILE* cppHandle = icecpp->preprocess(false, "-D__SLICE2FREEZE__");
-
- if(cppHandle == 0)
- {
- out.cleanup();
- u->destroy();
- return EXIT_FAILURE;
- }
-
- status = u->parse(args[idx], cppHandle, debug);
-
- if(status == EXIT_FAILURE)
- {
- out.cleanup();
- u->destroy();
- return EXIT_FAILURE;
- }
-
- if(!icecpp->printMakefileDependencies(out.os(), depend ? Preprocessor::CPlusPlus : Preprocessor::SliceXML, includePaths,
- "-D__SLICE2FREEZE__", sourceExtension, headerExtension))
- {
- out.cleanup();
- u->destroy();
- return EXIT_FAILURE;
- }
-
- if(!icecpp->close())
- {
- out.cleanup();
- u->destroy();
- return EXIT_FAILURE;
- }
- }
- else
- {
- PreprocessorPtr icecpp = Preprocessor::create(argv[0], args[idx], cppArgs);
-
- //
- // Add an include file for each Slice file. Note that the .h extension
- // is replaced with headerExtension later.
- //
- includes.push_back(icecpp->getBaseName() + ".h");
-
- FILE* cppHandle = icecpp->preprocess(false, "-D__SLICE2FREEZE__");
-
- if(cppHandle == 0)
- {
- u->destroy();
- return EXIT_FAILURE;
- }
-
- if(preprocess)
- {
- char buf[4096];
- while(fgets(buf, static_cast<int>(sizeof(buf)), cppHandle) != NULL)
- {
- if(fputs(buf, stdout) == EOF)
- {
- u->destroy();
- return EXIT_FAILURE;
- }
- }
- }
- else
- {
- status = u->parse(args[idx], cppHandle, debug);
-
- MetaDataVisitor visitor;
- u->visit(&visitor, false);
- }
-
- if(!icecpp->close())
- {
- u->destroy();
- return EXIT_FAILURE;
- }
- }
-
- {
- IceUtilInternal::MutexPtrLock<IceUtil::Mutex> sync(globalMutex);
-
- if(interrupted)
- {
- return EXIT_FAILURE;
- }
- }
- }
-
- if(dependxml)
- {
- out.os() << "</dependencies>\n";
- }
-
- if(depend || dependxml)
- {
- u->destroy();
- return EXIT_SUCCESS;
- }
-
- if(status == EXIT_SUCCESS && !preprocess)
- {
- try
- {
- gen(argv[0], u, includePaths, extraHeaders, dicts, indices, include, headerExtension,
- sourceExtension, dllExport, includes, args, output);
- }
- catch(const string& ex)
- {
- // If a file could not be created, then cleanup any
- // created files.
- FileTracker::instance()->cleanup();
- u->destroy();
- getErrorStream() << argv[0] << ": error: " << ex << endl;
- return EXIT_FAILURE;
- }
- catch(const Slice::FileException& ex)
- {
- // If a file could not be created, then cleanup any
- // created files.
- FileTracker::instance()->cleanup();
- u->destroy();
- getErrorStream() << argv[0] << ": error: " << ex.reason() << endl;
- return EXIT_FAILURE;
- }
- catch(...)
- {
- getErrorStream() << argv[0] << ": error: unknown exception" << endl;
- FileTracker::instance()->cleanup();
- u->destroy();
- return EXIT_FAILURE;
- }
- }
-
- u->destroy();
-
- {
- IceUtilInternal::MutexPtrLock<IceUtil::Mutex> sync(globalMutex);
-
- if(interrupted)
- {
- FileTracker::instance()->cleanup();
- return EXIT_FAILURE;
- }
- }
-
- return status;
-}
-
-int
-main(int argc, char* argv[])
-{
- try
- {
- return compile(argc, argv);
- }
- catch(const std::exception& ex)
- {
- getErrorStream() << argv[0] << ": error:" << ex.what() << endl;
- return EXIT_FAILURE;
- }
- catch(const std::string& msg)
- {
- getErrorStream() << argv[0] << ": error:" << msg << endl;
- return EXIT_FAILURE;
- }
- catch(const char* msg)
- {
- getErrorStream() << argv[0] << ": error:" << msg << endl;
- return EXIT_FAILURE;
- }
- catch(...)
- {
- getErrorStream() << argv[0] << ": error:" << "unknown exception" << endl;
- return EXIT_FAILURE;
- }
-}