diff options
author | Michi Henning <michi@zeroc.com> | 2006-11-22 08:35:01 +0000 |
---|---|---|
committer | Michi Henning <michi@zeroc.com> | 2006-11-22 08:35:01 +0000 |
commit | 9073302574725750291e339e0bb4a60b1475c114 (patch) | |
tree | e2cf193e77df8aa481b5f2683802e56b25113787 /cpp/src/slice2html/Main.cpp | |
parent | change .dll extension to .pyd to support Python 2.5 on Windows (diff) | |
download | ice-9073302574725750291e339e0bb4a60b1475c114.tar.bz2 ice-9073302574725750291e339e0bb4a60b1475c114.tar.xz ice-9073302574725750291e339e0bb4a60b1475c114.zip |
Intermediate check-in for slice2html.
Diffstat (limited to 'cpp/src/slice2html/Main.cpp')
-rw-r--r-- | cpp/src/slice2html/Main.cpp | 193 |
1 files changed, 193 insertions, 0 deletions
diff --git a/cpp/src/slice2html/Main.cpp b/cpp/src/slice2html/Main.cpp new file mode 100644 index 00000000000..a5f9cb83be5 --- /dev/null +++ b/cpp/src/slice2html/Main.cpp @@ -0,0 +1,193 @@ +// ********************************************************************** +// +// Copyright (c) 2003-2006 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/Options.h> +#include <Slice/Preprocessor.h> +#include <Gen.h> +#include <stdlib.h> + +using namespace std; +using namespace Slice; +using namespace IceUtil; + +void +usage(const char* n) +{ + cerr << "Usage: " << n << " [options] slice-files...\n"; + cerr << + "Options:\n" + "-h, --help Show this message.\n" + "-v, --version Display the Ice version.\n" + "-DNAME Define NAME as 1.\n" + "-DNAME=DEF Define NAME as DEF.\n" + "-UNAME Remove any definition for NAME.\n" + "-IDIR Put DIR in the include file search path.\n" + "-E Print preprocessor output on stdout.\n" + "--output-dir DIR Create files in the directory DIR.\n" + "--header FILE Use the contents of FILE as the header.\n" + "--footer FILe Use the contents of FILE as the footer.\n" + "--index NUM Generate subindex if it has more than NUM entries (-1 for no index).\n" + "-d, --debug Print debug messages.\n" + "--ice Permit `Ice' prefix (for building Ice source code only).\n" + ; +} + +int +main(int argc, char* argv[]) +{ + IceUtil::Options opts; + opts.addOpt("h", "help"); + opts.addOpt("v", "version"); + opts.addOpt("D", "", IceUtil::Options::NeedArg, "", IceUtil::Options::Repeat); + opts.addOpt("U", "", IceUtil::Options::NeedArg, "", IceUtil::Options::Repeat); + opts.addOpt("I", "", IceUtil::Options::NeedArg, "", IceUtil::Options::Repeat); + opts.addOpt("E"); + opts.addOpt("", "output-dir", IceUtil::Options::NeedArg, "."); + opts.addOpt("", "header", IceUtil::Options::NeedArg); + opts.addOpt("", "footer", IceUtil::Options::NeedArg); + opts.addOpt("", "index", IceUtil::Options::NeedArg); + opts.addOpt("d", "debug"); + opts.addOpt("", "ice"); + + vector<string> args; + try + { + args = opts.parse(argc, (const char**)argv); + } + catch(const IceUtil::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 << ICE_STRING_VERSION << endl; + return EXIT_SUCCESS; + } + + string cppArgs; + vector<string> optargs = opts.argVec("D"); + for(vector<string>::const_iterator i = optargs.begin(); i != optargs.end(); ++i) + { + cppArgs += " -D\"" + *i + "\""; + } + + optargs = opts.argVec("U"); + for(vector<string>::const_iterator i = optargs.begin(); i != optargs.end(); ++i) + { + cppArgs += " -U\"" + *i + "\""; + } + + optargs = opts.argVec("I"); + for(vector<string>::const_iterator i = optargs.begin(); i != optargs.end(); ++i) + { + cppArgs += " -I\"" + *i + "\""; + } + + bool preprocess = opts.isSet("E"); + + string output = opts.optArg("output-dir"); + + string header = opts.optArg("header"); + + string footer = opts.optArg("footer"); + + string ind = opts.optArg("index"); + unsigned indexCount; + if(!ind.empty()) + { + istringstream s(ind); + s >> indexCount; + if(!s) + { + cerr << argv[0] << ": the --index operation requires a positive integer argument" << endl; + usage(argv[0]); + return EXIT_FAILURE; + } + } + + bool debug = opts.isSet("debug"); + + bool ice = opts.isSet("ice"); + + if(args.empty()) + { + cerr << argv[0] << ": no input file" << endl; + usage(argv[0]); + return EXIT_FAILURE; + } + + UnitPtr p = Unit::createUnit(true, false, ice, false); + + int status = EXIT_SUCCESS; + + for(vector<string>::size_type idx = 0; idx < args.size(); ++idx) + { + Preprocessor icecpp(argv[0], args[idx], cppArgs); + FILE* cppHandle = icecpp.preprocess(true); + + if(cppHandle == 0) + { + p->destroy(); + return EXIT_FAILURE; + } + if(preprocess) + { + char buf[4096]; + while(fgets(buf, static_cast<int>(sizeof(buf)), cppHandle) != NULL) + { + if(fputs(buf, stdout) == EOF) + { + p->destroy(); + return EXIT_FAILURE; + } + } + } + else + { + status = p->parse(cppHandle, debug); + } + + if(!icecpp.close()) + { + p->destroy(); + return EXIT_FAILURE; + } + } + + if(status == EXIT_SUCCESS && !preprocess) + { + try + { + Slice::generate(p, output, header, footer, indexCount); + } + catch(const string& err) + { + cerr << argv[0] << ": " << err << endl; + status = EXIT_FAILURE; + } + catch(const char* err) + { + cerr << argv[0] << ": " << err << endl; + status = EXIT_FAILURE; + } + } + + p->destroy(); + + return status; +} |