int compile(int argc, char* argv[]) { IceUtilInternal::Options opts; opts.addOpt("h", "help"); opts.addOpt("v", "version"); 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("", "output-dir", IceUtilInternal::Options::NeedArg); opts.addOpt("", "depend"); opts.addOpt("d", "debug"); opts.addOpt("", "ice"); opts.addOpt("", "underscore"); opts.addOpt("", "all"); opts.addOpt("", "checksum"); opts.addOpt("n", "namespace"); vector<string> args; try { args = opts.parse(argc, (const char**)argv); } catch(const IceUtilInternal::BadOptException& e) { getErrorStream() << argv[0] << ": error: " << e.reason << endl; 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; } vector<string> cppArgs; vector<string> optargs = opts.argVec("D"); vector<string>::const_iterator i; for(i = optargs.begin(); i != optargs.end(); ++i) { cppArgs.push_back("-D" + *i); } optargs = opts.argVec("U"); for(i = optargs.begin(); i != optargs.end(); ++i) { cppArgs.push_back("-U" + *i); } vector<string> includePaths = opts.argVec("I"); for(i = includePaths.begin(); i != includePaths.end(); ++i) { cppArgs.push_back("-I" + Preprocessor::normalizeIncludePath(*i)); } bool preprocess = opts.isSet("E"); string output = opts.optArg("output-dir"); bool depend = opts.isSet("depend"); bool debug = opts.isSet("debug"); bool ice = opts.isSet("ice"); bool underscore = opts.isSet("underscore"); bool all = opts.isSet("all"); bool checksum = opts.isSet("checksum"); bool ns = opts.isSet("namespace"); if(args.empty()) { getErrorStream() << argv[0] << ": error: no input file" << endl; usage(argv[0]); return EXIT_FAILURE; } int status = EXIT_SUCCESS; IceUtil::CtrlCHandler ctrlCHandler; ctrlCHandler.setCallback(interruptedCallback); for(i = args.begin(); i != args.end(); ++i) { // // Ignore duplicates. // vector<string>::iterator p = find(args.begin(), args.end(), *i); if(p != i) { continue; } if(depend) { PreprocessorPtr icecpp = Preprocessor::create(argv[0], *i, cppArgs); FILE* cppHandle = icecpp->preprocess(false); if(cppHandle == 0) { return EXIT_FAILURE; } UnitPtr u = Unit::createUnit(false, false, ice, underscore); int parseStatus = u->parse(*i, cppHandle, debug); u->destroy(); if(parseStatus == EXIT_FAILURE) { return EXIT_FAILURE; } if(!icecpp->printMakefileDependencies(Preprocessor::PHP, includePaths)) { return EXIT_FAILURE; } if(!icecpp->close()) { return EXIT_FAILURE; } } else { PreprocessorPtr icecpp = Preprocessor::create(argv[0], *i, cppArgs); FILE* cppHandle = icecpp->preprocess(false); if(cppHandle == 0) { return EXIT_FAILURE; } if(preprocess) { char buf[4096]; while(fgets(buf, static_cast<int>(sizeof(buf)), cppHandle) != NULL) { if(fputs(buf, stdout) == EOF) { return EXIT_FAILURE; } } if(!icecpp->close()) { return EXIT_FAILURE; } } else { UnitPtr u = Unit::createUnit(false, all, ice, underscore); int parseStatus = u->parse(*i, cppHandle, debug); if(!icecpp->close()) { u->destroy(); return EXIT_FAILURE; } if(parseStatus == EXIT_FAILURE) { status = EXIT_FAILURE; } else { string base = icecpp->getBaseName(); string::size_type pos = base.find_last_of("/\\"); if(pos != string::npos) { base.erase(0, pos + 1); } string file = base + ".php"; if(!output.empty()) { file = output + '/' + file; } try { IceUtilInternal::Output out; out.open(file.c_str()); if(!out) { ostringstream os; os << "cannot open`" << file << "': " << strerror(errno); throw FileException(__FILE__, __LINE__, os.str()); } FileTracker::instance()->addFile(file); out << "<?php\n"; printHeader(out); printGeneratedHeader(out, base + ".ice"); // // Generate the PHP mapping. // generate(u, all, checksum, ns, includePaths, out); out << "?>\n"; out.close(); } 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(const string& err) { FileTracker::instance()->cleanup(); getErrorStream() << argv[0] << ": error: " << err << endl; status = EXIT_FAILURE; } } u->destroy(); } } { IceUtilInternal::MutexPtrLock<IceUtil::Mutex> sync(mutex); if(interrupted) { FileTracker::instance()->cleanup(); return EXIT_FAILURE; } } } return status; }
int compile(int argc, char* argv[]) { IceUtilInternal::Options opts; opts.addOpt("h", "help"); opts.addOpt("v", "version"); 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("", "output-dir", IceUtilInternal::Options::NeedArg); opts.addOpt("", "tie"); opts.addOpt("", "impl"); opts.addOpt("", "impl-tie"); opts.addOpt("", "depend"); opts.addOpt("", "depend-xml"); opts.addOpt("", "list-generated"); opts.addOpt("d", "debug"); opts.addOpt("", "ice"); opts.addOpt("", "underscore"); opts.addOpt("", "checksum", IceUtilInternal::Options::NeedArg); opts.addOpt("", "stream"); opts.addOpt("", "meta", IceUtilInternal::Options::NeedArg, "", IceUtilInternal::Options::Repeat); vector<string>args; try { args = opts.parse(argc, (const char**)argv); } catch(const IceUtilInternal::BadOptException& e) { getErrorStream() << argv[0] << ": error: " << e.reason << endl; 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; } vector<string> cppArgs; vector<string> optargs = opts.argVec("D"); vector<string>::const_iterator i; for(i = optargs.begin(); i != optargs.end(); ++i) { cppArgs.push_back("-D" + *i); } optargs = opts.argVec("U"); for(i = optargs.begin(); i != optargs.end(); ++i) { cppArgs.push_back("-U" + *i); } vector<string> includePaths = opts.argVec("I"); for(i = includePaths.begin(); i != includePaths.end(); ++i) { cppArgs.push_back("-I" + Preprocessor::normalizeIncludePath(*i)); } bool preprocess = opts.isSet("E"); string output = opts.optArg("output-dir"); bool tie = opts.isSet("tie"); bool impl = opts.isSet("impl"); bool implTie = opts.isSet("impl-tie"); bool depend = opts.isSet("depend"); bool dependxml = opts.isSet("depend-xml"); bool debug = opts.isSet("debug"); bool ice = opts.isSet("ice"); bool underscore = opts.isSet("underscore"); string checksumClass = opts.optArg("checksum"); bool stream = opts.isSet("stream"); bool listGenerated = opts.isSet("list-generated"); StringList globalMetadata; vector<string> v = opts.argVec("meta"); copy(v.begin(), v.end(), back_inserter(globalMetadata)); if(args.empty()) { getErrorStream() << argv[0] << ": error: no input file" << endl; usage(argv[0]); return EXIT_FAILURE; } if(impl && implTie) { getErrorStream() << argv[0] << ": error: cannot specify both --impl and --impl-tie" << endl; usage(argv[0]); return EXIT_FAILURE; } int status = EXIT_SUCCESS; ChecksumMap checksums; IceUtil::CtrlCHandler ctrlCHandler; ctrlCHandler.setCallback(interruptedCallback); if(dependxml) { cout << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<dependencies>" << endl; } for(i = args.begin(); i != args.end(); ++i) { // // Ignore duplicates. // vector<string>::iterator p = find(args.begin(), args.end(), *i); if(p != i) { continue; } if(depend || dependxml) { PreprocessorPtr icecpp = Preprocessor::create(argv[0], *i, cppArgs); FILE* cppHandle = icecpp->preprocess(false); if(cppHandle == 0) { return EXIT_FAILURE; } UnitPtr u = Unit::createUnit(false, false, ice, underscore); int parseStatus = u->parse(*i, cppHandle, debug); u->destroy(); if(parseStatus == EXIT_FAILURE) { return EXIT_FAILURE; } if(!icecpp->printMakefileDependencies(depend ? Preprocessor::Java : Preprocessor::JavaXML, includePaths)) { return EXIT_FAILURE; } if(!icecpp->close()) { return EXIT_FAILURE; } } else { ostringstream os; if(listGenerated) { Slice::setErrorStream(os); } FileTracker::instance()->setSource(*i); PreprocessorPtr icecpp = Preprocessor::create(argv[0], *i, cppArgs); FILE* cppHandle = icecpp->preprocess(true); if(cppHandle == 0) { if(listGenerated) { FileTracker::instance()->setOutput(os.str(), true); } status = EXIT_FAILURE; break; } if(preprocess) { char buf[4096]; while(fgets(buf, static_cast<int>(sizeof(buf)), cppHandle) != NULL) { if(fputs(buf, stdout) == EOF) { return EXIT_FAILURE; } } if(!icecpp->close()) { return EXIT_FAILURE; } } else { UnitPtr p = Unit::createUnit(false, false, ice, underscore, globalMetadata); int parseStatus = p->parse(*i, cppHandle, debug, Ice); if(!icecpp->close()) { p->destroy(); return EXIT_FAILURE; } if(parseStatus == EXIT_FAILURE) { p->destroy(); if(listGenerated) { FileTracker::instance()->setOutput(os.str(), true); } status = EXIT_FAILURE; } else { try { Gen gen(argv[0], icecpp->getBaseName(), includePaths, output); gen.generate(p, stream); if(tie) { gen.generateTie(p); } if(impl) { gen.generateImpl(p); } if(implTie) { 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())); } if(listGenerated) { FileTracker::instance()->setOutput(os.str(), false); } } catch(const Slice::FileException& ex) { // // If a file could not be created then cleanup any files we've already created. // FileTracker::instance()->cleanup(); p->destroy(); getErrorStream() << argv[0] << ": error: " << ex.reason() << endl; if(listGenerated) { FileTracker::instance()->setOutput(os.str(), true); } status = EXIT_FAILURE; break; } } p->destroy(); } } { IceUtilInternal::MutexPtrLock<IceUtil::Mutex> sync(mutex); if(interrupted) { // // If the translator was interrupted then cleanup any files we've already created. // FileTracker::instance()->cleanup(); return EXIT_FAILURE; } } } if(dependxml) { cout << "</dependencies>\n"; } if(status == EXIT_SUCCESS && !checksumClass.empty()) { try { Gen::writeChecksumClass(checksumClass, output, checksums); } catch(const Slice::FileException& ex) { // If a file could not be created, then // cleanup any created files. FileTracker::instance()->cleanup(); getErrorStream() << argv[0] << ": error: " << ex.reason() << endl; return EXIT_FAILURE; } } if(listGenerated) { FileTracker::instance()->dumpxml(); } return status; }
int Client::main(StringSeq& args) { int status = EXIT_SUCCESS; try { _appName = args[0]; InitializationData id; id.properties = createProperties(args); id.properties->setProperty("Ice.Warn.Endpoints", "0"); _communicator = initialize(id); { IceUtilInternal::MutexPtrLock<IceUtil::Mutex> sync(_staticMutex); _globalClient = this; } _ctrlCHandler.setCallback(interruptCallback); try { status = run(args); } catch(const CommunicatorDestroyedException&) { // Expected if the client is interrupted during the initialization. } } catch(const IceUtil::Exception& ex) { cerr << _appName << ": " << ex << endl; status = EXIT_FAILURE; } catch(const std::exception& ex) { cerr << _appName << ": std::exception: " << ex.what() << endl; status = EXIT_FAILURE; } catch(const std::string& msg) { cerr << _appName << ": " << msg << endl; status = EXIT_FAILURE; } catch(const char* msg) { cerr << _appName << ": " << msg << endl; status = EXIT_FAILURE; } catch(...) { cerr << _appName << ": unknown exception" << endl; status = EXIT_FAILURE; } if(_communicator) { try { _communicator->destroy(); } catch(const CommunicatorDestroyedException&) { } catch(const Exception& ex) { cerr << ex << endl; status = EXIT_FAILURE; } } _ctrlCHandler.setCallback(0); { IceUtilInternal::MutexPtrLock<IceUtil::Mutex> sync(_staticMutex); _globalClient = 0; } return status; }
int main(int argc, char* argv[]) { IceUtilInternal::Options opts; opts.addOpt("h", "help"); opts.addOpt("v", "version"); 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("", "output-dir", IceUtilInternal::Options::NeedArg); opts.addOpt("", "dll-export", IceUtilInternal::Options::NeedArg); opts.addOpt("", "impl"); opts.addOpt("", "depend"); opts.addOpt("d", "debug"); opts.addOpt("", "ice"); opts.addOpt("", "case-sensitive"); vector<string> args; try { args = opts.parse(argc, (const char**)argv); } catch(const IceUtilInternal::BadOptException& e) { cerr << argv[0] << ": " << e.reason << endl; usage(argv[0]); return EXIT_FAILURE; } if(opts.isSet("help")) { usage(argv[0]); return EXIT_SUCCESS; } if(opts.isSet("version")) { cout << ICEE_STRING_VERSION << endl; return EXIT_SUCCESS; } string headerExtension = opts.optArg("header-ext"); string sourceExtension = opts.optArg("source-ext"); vector<string>extraHeaders = opts.argVec("add-header"); vector<string> cppArgs; vector<string> optargs = opts.argVec("D"); vector<string>::const_iterator i; for(i = optargs.begin(); i != optargs.end(); ++i) { cppArgs.push_back("-D" + *i); } optargs = opts.argVec("U"); for(i = optargs.begin(); i != optargs.end(); ++i) { cppArgs.push_back("-U" + *i); } vector<string> includePaths = opts.argVec("I"); for(i = includePaths.begin(); i != includePaths.end(); ++i) { cppArgs.push_back("-I" + Preprocessor::normalizeIncludePath(*i)); } bool preprocess = opts.isSet("E"); string include = opts.optArg("include-dir"); string output = opts.optArg("output-dir"); string dllExport = opts.optArg("dll-export"); bool impl = opts.isSet("impl"); bool depend = opts.isSet("depend"); bool debug = opts.isSet("debug"); bool ice = opts.isSet("ice"); bool caseSensitive = opts.isSet("case-sensitive"); if(args.empty()) { cerr << argv[0] << ": no input file" << endl; usage(argv[0]); return EXIT_FAILURE; } int status = EXIT_SUCCESS; IceUtil::CtrlCHandler ctrlCHandler; ctrlCHandler.setCallback(interruptedCallback); for(i = args.begin(); i != args.end(); ++i) { if(depend) { Preprocessor icecpp(argv[0], *i, cppArgs); icecpp.printMakefileDependencies(Preprocessor::CPlusPlus, includePaths); } else { Preprocessor icecpp(argv[0], *i, cppArgs); FILE* cppHandle = icecpp.preprocess(false); if(cppHandle == 0) { return EXIT_FAILURE; } if(preprocess) { char buf[4096]; while(fgets(buf, static_cast<int>(sizeof(buf)), cppHandle) != NULL) { if(fputs(buf, stdout) == EOF) { return EXIT_FAILURE; } } if(!icecpp.close()) { return EXIT_FAILURE; } } else { UnitPtr u = Unit::createUnit(false, false, ice, caseSensitive); int parseStatus = u->parse(*i, cppHandle, debug, Slice::IceE); if(!icecpp.close()) { u->destroy(); return EXIT_FAILURE; } if(parseStatus == EXIT_FAILURE) { status = EXIT_FAILURE; } else { Gen gen(argv[0], icecpp.getBaseName(), headerExtension, sourceExtension, extraHeaders, include, includePaths, dllExport, output, impl, ice); if(!gen) { u->destroy(); return EXIT_FAILURE; } gen.generate(u); } u->destroy(); } } { IceUtil::StaticMutex::Lock lock(_mutex); if(_interrupted) { return EXIT_FAILURE; } } } return status; }
int compile(int argc, char* argv[]) { IceUtilInternal::Options opts; opts.addOpt("h", "help"); opts.addOpt("v", "version"); 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("", "output-dir", IceUtilInternal::Options::NeedArg); opts.addOpt("", "depend"); opts.addOpt("d", "debug"); opts.addOpt("", "ice"); opts.addOpt("", "underscore"); opts.addOpt("", "all"); opts.addOpt("", "no-package"); opts.addOpt("", "checksum"); opts.addOpt("", "prefix", IceUtilInternal::Options::NeedArg); vector<string> args; try { args = opts.parse(argc, (const char**)argv); } catch(const IceUtilInternal::BadOptException& e) { getErrorStream() << argv[0] << ": error: " << e.reason << endl; 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; } vector<string> cppArgs; 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)); } bool preprocess = opts.isSet("E"); string output = opts.optArg("output-dir"); bool depend = opts.isSet("depend"); bool debug = opts.isSet("debug"); bool ice = opts.isSet("ice"); bool underscore = opts.isSet("underscore"); bool all = opts.isSet("all"); bool noPackage = opts.isSet("no-package"); bool checksum = opts.isSet("checksum"); string prefix = opts.optArg("prefix"); if(args.empty()) { getErrorStream() << argv[0] << ": error: no input file" << endl; usage(argv[0]); return EXIT_FAILURE; } int status = EXIT_SUCCESS; IceUtil::CtrlCHandler ctrlCHandler; ctrlCHandler.setCallback(interruptedCallback); bool keepComments = true; for(vector<string>::const_iterator i = args.begin(); i != args.end(); ++i) { // // Ignore duplicates. // vector<string>::iterator p = find(args.begin(), args.end(), *i); if(p != i) { continue; } if(depend) { PreprocessorPtr icecpp = Preprocessor::create(argv[0], *i, cppArgs); FILE* cppHandle = icecpp->preprocess(false, "-D__SLICE2PY__"); if(cppHandle == 0) { return EXIT_FAILURE; } UnitPtr u = Unit::createUnit(false, false, ice, underscore); int parseStatus = u->parse(*i, cppHandle, debug); u->destroy(); if(parseStatus == EXIT_FAILURE) { return EXIT_FAILURE; } if(!icecpp->printMakefileDependencies(Preprocessor::Python, includePaths, "-D__SLICE2PY__", "", prefix)) { return EXIT_FAILURE; } if(!icecpp->close()) { return EXIT_FAILURE; } } else { PreprocessorPtr icecpp = Preprocessor::create(argv[0], *i, cppArgs); FILE* cppHandle = icecpp->preprocess(keepComments, "-D__SLICE2PY__"); if(cppHandle == 0) { return EXIT_FAILURE; } if(preprocess) { char buf[4096]; while(fgets(buf, static_cast<int>(sizeof(buf)), cppHandle) != NULL) { if(fputs(buf, stdout) == EOF) { return EXIT_FAILURE; } } if(!icecpp->close()) { return EXIT_FAILURE; } } else { UnitPtr u = Unit::createUnit(false, all, ice, underscore); int parseStatus = u->parse(*i, cppHandle, debug); if(!icecpp->close()) { u->destroy(); return EXIT_FAILURE; } if(parseStatus == EXIT_FAILURE) { status = EXIT_FAILURE; } else { string base = icecpp->getBaseName(); string::size_type pos = base.find_last_of("/\\"); if(pos != string::npos) { base.erase(0, pos + 1); } // // Append the suffix "_ice" to the filename in order to avoid any conflicts // with Slice module names. For example, if the file Test.ice defines a // Slice module named "Test", then we couldn't create a Python package named // "Test" and also call the generated file "Test.py". // string file = prefix + base + "_ice.py"; if(!output.empty()) { file = output + '/' + file; } try { IceUtilInternal::Output out; out.open(file.c_str()); if(!out) { ostringstream os; os << "cannot open`" << file << "': " << strerror(errno); throw FileException(__FILE__, __LINE__, os.str()); } FileTracker::instance()->addFile(file); printHeader(out); printGeneratedHeader(out, base + ".ice", "#"); // // Generate the Python mapping. // generate(u, all, checksum, includePaths, out); out.close(); // // Create or update the Python package hierarchy. // if(!noPackage) { PackageVisitor::createModules(u, prefix + base + "_ice", output); } } 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(const string& err) { FileTracker::instance()->cleanup(); getErrorStream() << argv[0] << ": error: " << err << endl; status = EXIT_FAILURE; } } u->destroy(); } } { IceUtilInternal::MutexPtrLock<IceUtil::Mutex> sync(globalMutex); if(interrupted) { FileTracker::instance()->cleanup(); return EXIT_FAILURE; } } } return status; }
int compile(int argc, char* argv[]) { IceUtilInternal::Options opts; opts.addOpt("h", "help"); opts.addOpt("v", "version"); 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("", "output-dir", IceUtilInternal::Options::NeedArg); opts.addOpt("", "dll-export", IceUtilInternal::Options::NeedArg); opts.addOpt("", "impl"); opts.addOpt("", "depend"); opts.addOpt("d", "debug"); opts.addOpt("", "ice"); opts.addOpt("", "underscore"); opts.addOpt("", "checksum"); opts.addOpt("", "stream"); vector<string> args; try { args = opts.parse(argc, (const char**)argv); } catch(const IceUtilInternal::BadOptException& e) { getErrorStream() << argv[0] << ": " << e.reason << endl; 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> extraHeaders = opts.argVec("add-header"); vector<string> cppArgs; vector<string> optargs = opts.argVec("D"); vector<string>::const_iterator i; for(i = optargs.begin(); i != optargs.end(); ++i) { cppArgs.push_back("-D" + *i); } optargs = opts.argVec("U"); for(i = optargs.begin(); i != optargs.end(); ++i) { cppArgs.push_back("-U" + *i); } vector<string> includePaths; includePaths = opts.argVec("I"); for(i = includePaths.begin(); i != includePaths.end(); ++i) { cppArgs.push_back("-I" + Preprocessor::normalizeIncludePath(*i)); } bool preprocess = opts.isSet("E"); string include = opts.optArg("include-dir"); string output = opts.optArg("output-dir"); string dllExport = opts.optArg("dll-export"); bool impl = opts.isSet("impl"); bool depend = opts.isSet("depend"); bool debug = opts.isSet("debug"); bool ice = opts.isSet("ice"); bool underscore = opts.isSet("underscore"); bool checksum = opts.isSet("checksum"); bool stream = opts.isSet("stream"); if(args.empty()) { getErrorStream() << argv[0] << ": error: no input file" << endl; usage(argv[0]); return EXIT_FAILURE; } int status = EXIT_SUCCESS; IceUtil::CtrlCHandler ctrlCHandler; ctrlCHandler.setCallback(interruptedCallback); for(i = args.begin(); i != args.end(); ++i) { // // Ignore duplicates. // vector<string>::iterator p = find(args.begin(), args.end(), *i); if(p != i) { continue; } if(depend) { PreprocessorPtr icecpp = Preprocessor::create(argv[0], *i, cppArgs); FILE* cppHandle = icecpp->preprocess(false); if(cppHandle == 0) { return EXIT_FAILURE; } UnitPtr u = Unit::createUnit(false, false, ice, underscore); int parseStatus = u->parse(*i, cppHandle, debug); u->destroy(); if(parseStatus == EXIT_FAILURE) { return EXIT_FAILURE; } if(!icecpp->printMakefileDependencies(Preprocessor::CPlusPlus, includePaths, sourceExtension)) { return EXIT_FAILURE; } if(!icecpp->close()) { return EXIT_FAILURE; } } else { PreprocessorPtr icecpp = Preprocessor::create(argv[0], *i, cppArgs); FILE* cppHandle = icecpp->preprocess(false); if(cppHandle == 0) { return EXIT_FAILURE; } if(preprocess) { char buf[4096]; while(fgets(buf, static_cast<int>(sizeof(buf)), cppHandle) != NULL) { if(fputs(buf, stdout) == EOF) { return EXIT_FAILURE; } } if(!icecpp->close()) { return EXIT_FAILURE; } } else { UnitPtr u = Unit::createUnit(false, false, ice, underscore); int parseStatus = u->parse(*i, cppHandle, debug); if(!icecpp->close()) { u->destroy(); return EXIT_FAILURE; } if(parseStatus == EXIT_FAILURE) { status = EXIT_FAILURE; } else { try { Gen gen(icecpp->getBaseName(), headerExtension, sourceExtension, extraHeaders, include, includePaths, dllExport, output, impl, checksum, stream, ice); gen.generate(u); } 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; } } u->destroy(); } } { IceUtilInternal::MutexPtrLock<IceUtil::Mutex> sync(mutex); if(interrupted) { FileTracker::instance()->cleanup(); return EXIT_FAILURE; } } } return status; }
int compile(const vector<string>& argv) { IceUtilInternal::Options opts; opts.addOpt("h", "help"); opts.addOpt("v", "version"); opts.addOpt("", "validate"); 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("", "stdout"); opts.addOpt("", "output-dir", IceUtilInternal::Options::NeedArg); opts.addOpt("", "depend"); opts.addOpt("", "depend-json"); opts.addOpt("", "depend-xml"); opts.addOpt("", "depend-file", IceUtilInternal::Options::NeedArg, ""); opts.addOpt("d", "debug"); opts.addOpt("", "ice"); opts.addOpt("", "underscore"); bool validate = find(argv.begin(), argv.end(), "--validate") != argv.end(); vector<string> args; try { args = opts.parse(argv); } catch(const IceUtilInternal::BadOptException& e) { consoleErr << 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")) { consoleErr << ICE_STRING_VERSION << endl; return EXIT_SUCCESS; } vector<string> cppArgs; 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)); } bool preprocess = opts.isSet("E"); bool useStdout = opts.isSet("stdout"); string output = opts.optArg("output-dir"); bool depend = opts.isSet("depend"); bool dependJSON = opts.isSet("depend-json"); 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(args.empty()) { consoleErr << argv[0] << ": error: no input file" << endl; if(!validate) { usage(argv[0]); } return EXIT_FAILURE; } if(depend && dependJSON) { consoleErr << argv[0] << ": error: cannot specify both --depend and --depend-json" << endl; if(!validate) { usage(argv[0]); } return EXIT_FAILURE; } if(depend && dependxml) { consoleErr << argv[0] << ": error: cannot specify both --depend and --depend-xml" << endl; if(!validate) { usage(argv[0]); } return EXIT_FAILURE; } if(dependxml && dependJSON) { consoleErr << argv[0] << ": error: cannot specify both --depend-xml and --depend-json" << endl; if(!validate) { usage(argv[0]); } return EXIT_FAILURE; } if(validate) { return EXIT_SUCCESS; } int status = EXIT_SUCCESS; IceUtil::CtrlCHandler ctrlCHandler; ctrlCHandler.setCallback(interruptedCallback); ostringstream os; if(dependJSON) { os << "{" << endl; } else if(dependxml) { os << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<dependencies>" << endl; } // // Create a copy of args without the duplicates. // vector<string> sources; for(vector<string>::const_iterator i = args.begin(); i != args.end(); ++i) { vector<string>::iterator p = find(sources.begin(), sources.end(), *i); if(p == sources.end()) { sources.push_back(*i); } } for(vector<string>::const_iterator i = sources.begin(); i != sources.end();) { if(depend || dependJSON || dependxml) { PreprocessorPtr icecpp = Preprocessor::create(argv[0], *i, cppArgs); FILE* cppHandle = icecpp->preprocess(false, "-D__SLICE2JS__"); if(cppHandle == 0) { return EXIT_FAILURE; } UnitPtr u = Unit::createUnit(false, false, ice, underscore); int parseStatus = u->parse(*i, cppHandle, debug); u->destroy(); if(parseStatus == EXIT_FAILURE) { return EXIT_FAILURE; } bool last = (++i == sources.end()); if(!icecpp->printMakefileDependencies(os, depend ? Preprocessor::JavaScript : (dependJSON ? Preprocessor::JavaScriptJSON : Preprocessor::SliceXML), includePaths, "-D__SLICE2JS__")) { return EXIT_FAILURE; } if(!icecpp->close()) { return EXIT_FAILURE; } if(dependJSON) { if(!last) { os << ","; } os << "\n"; } } else { PreprocessorPtr icecpp = Preprocessor::create(argv[0], *i, cppArgs); FILE* cppHandle = icecpp->preprocess(true, "-D__SLICE2JS__"); if(cppHandle == 0) { return EXIT_FAILURE; } if(preprocess) { char buf[4096]; while(fgets(buf, static_cast<int>(sizeof(buf)), cppHandle) != ICE_NULLPTR) { if(fputs(buf, stdout) == EOF) { return EXIT_FAILURE; } } if(!icecpp->close()) { return EXIT_FAILURE; } } else { UnitPtr p = Unit::createUnit(false, false, ice, underscore); int parseStatus = p->parse(*i, cppHandle, debug); if(!icecpp->close()) { p->destroy(); return EXIT_FAILURE; } if(parseStatus == EXIT_FAILURE) { status = EXIT_FAILURE; } else { try { if(useStdout) { Gen gen(icecpp->getBaseName(), includePaths, output, cout); gen.generate(p); } else { Gen gen(icecpp->getBaseName(), includePaths, output); gen.generate(p); } } catch(const Slice::FileException& ex) { // // If a file could not be created, then clean up any created files. // FileTracker::instance()->cleanup(); p->destroy(); consoleErr << argv[0] << ": error: " << ex.reason() << endl; return EXIT_FAILURE; } } p->destroy(); } ++i; } { IceUtilInternal::MutexPtrLock<IceUtil::Mutex> sync(globalMutex); if(interrupted) { FileTracker::instance()->cleanup(); return EXIT_FAILURE; } } } if(dependJSON) { os << "}\n"; } else if(dependxml) { os << "</dependencies>\n"; } if(depend || dependJSON || dependxml) { writeDependencies(os.str(), dependFile); } return status; }
int compile(int argc, char* argv[]) { IceUtilInternal::Options opts; opts.addOpt("h", "help"); opts.addOpt("v", "version"); opts.addOpt("", "validate"); 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("", "output-dir", IceUtilInternal::Options::NeedArg); opts.addOpt("", "tie"); opts.addOpt("", "impl"); opts.addOpt("", "impl-tie"); opts.addOpt("", "depend"); opts.addOpt("", "depend-xml"); opts.addOpt("", "depend-file", IceUtilInternal::Options::NeedArg, ""); opts.addOpt("d", "debug"); opts.addOpt("", "ice"); opts.addOpt("", "underscore"); opts.addOpt("", "checksum"); 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; } vector<string> cppArgs; 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)); } bool preprocess = opts.isSet("E"); string output = opts.optArg("output-dir"); bool tie = opts.isSet("tie"); bool impl = opts.isSet("impl"); bool implTie = opts.isSet("impl-tie"); 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"); bool checksum = opts.isSet("checksum"); if(args.empty()) { getErrorStream() << argv[0] << ": error: no input file" << endl; if(!validate) { usage(argv[0]); } return EXIT_FAILURE; } if(impl && implTie) { getErrorStream() << argv[0] << ": error: cannot specify both --impl and --impl-tie" << 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; } 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>::const_iterator i = args.begin(); i != args.end(); ++i) { // // Ignore duplicates. // vector<string>::iterator p = find(args.begin(), args.end(), *i); if(p != i) { continue; } if(depend || dependxml) { PreprocessorPtr icecpp = Preprocessor::create(argv[0], *i, cppArgs); FILE* cppHandle = icecpp->preprocess(false, "-D__SLICE2CS__"); if(cppHandle == 0) { out.cleanup(); return EXIT_FAILURE; } UnitPtr u = Unit::createUnit(false, false, ice, underscore); int parseStatus = u->parse(*i, cppHandle, debug); u->destroy(); if(parseStatus == EXIT_FAILURE) { out.cleanup(); return EXIT_FAILURE; } if(!icecpp->printMakefileDependencies(out.os(), depend ? Preprocessor::CSharp : Preprocessor::SliceXML, includePaths, "-D__SLICE2CS__")) { out.cleanup(); return EXIT_FAILURE; } if(!icecpp->close()) { out.cleanup(); return EXIT_FAILURE; } } else { PreprocessorPtr icecpp = Preprocessor::create(argv[0], *i, cppArgs); FILE* cppHandle = icecpp->preprocess(true, "-D__SLICE2CS__"); if(cppHandle == 0) { return EXIT_FAILURE; } if(preprocess) { char buf[4096]; while(fgets(buf, static_cast<int>(sizeof(buf)), cppHandle) != NULL) { if(fputs(buf, stdout) == EOF) { return EXIT_FAILURE; } } if(!icecpp->close()) { return EXIT_FAILURE; } } else { UnitPtr p = Unit::createUnit(false, false, ice, underscore); int parseStatus = p->parse(*i, cppHandle, debug); if(!icecpp->close()) { p->destroy(); return EXIT_FAILURE; } if(parseStatus == EXIT_FAILURE) { status = EXIT_FAILURE; } else { try { Gen gen(icecpp->getBaseName(), includePaths, output, impl, implTie); gen.generate(p); if(tie) { gen.generateTie(p); } if(impl) { gen.generateImpl(p); } if(implTie) { gen.generateImplTie(p); } if(checksum) { gen.generateChecksums(p); } } catch(const Slice::FileException& ex) { // If a file could not be created, then // cleanup any created files. FileTracker::instance()->cleanup(); p->destroy(); getErrorStream() << argv[0] << ": error: " << ex.reason() << endl; return EXIT_FAILURE; } } p->destroy(); } } { IceUtilInternal::MutexPtrLock<IceUtil::Mutex> sync(globalMutex); if(interrupted) { out.cleanup(); FileTracker::instance()->cleanup(); return EXIT_FAILURE; } } } if(dependxml) { out.os() << "</dependencies>\n"; } return status; }