// ---------------------------------------------------------------------------
// - Main.cpp -
// - afnix cross librarian main program -
// ---------------------------------------------------------------------------
// - This program is free software; you can redistribute it and/or modify -
// - it provided that this copyright notice is kept intact. -
// - -
// - This program is distributed in the hope that it will be useful, but -
// - without any warranty; without even the implied warranty of -
// - merchantability or fitness for a particular purpose. In no event shall -
// - the copyright holder be liable for any direct, indirect, incidental or -
// - special damages arising in any way out of the use of this software. -
// ---------------------------------------------------------------------------
// - copyright (c) 1999-2007 amaury darsch -
// ---------------------------------------------------------------------------
#include "System.hpp"
#include "Options.hpp"
#include "Librarian.hpp"
#include "Exception.hpp"
#include "OutputFile.hpp"
#include "OutputTerm.hpp"
namespace afnix {
// -------------------------------------------------------------------------
// - private section -
// -------------------------------------------------------------------------
// the options messages
static const String U_CLS_MSG = "axl [options] [f name] files";
static const String H_OPT_MSG = " [h] \t print this help message";
static const String V_OPT_MSG = " [v] \t print system version";
static const String C_OPT_MSG = " [c] \t create a new librarian";
static const String X_OPT_MSG = " [x] \t extract from librarian";
static const String S_OPT_MSG = " [s] \t short librarian list";
static const String T_OPT_MSG = " [t] \t print librarian list";
static const String F_OPT_MSG = " [f name] \t set librarian file name";
// this procedure returns the libarian option object
static Options* get_options (Output& os,const long argc,const char** argv) {
// create the option class
Options* opts = new Options (U_CLS_MSG);
// add the string options
opts->add (Options::SOPT, 'f', F_OPT_MSG);
// add the uniq options
opts->add (Options::UNIQ, 't', T_OPT_MSG);
opts->add (Options::UNIQ, 's', S_OPT_MSG);
opts->add (Options::UNIQ, 'x', X_OPT_MSG);
opts->add (Options::UNIQ, 'c', C_OPT_MSG);
opts->add (Options::UNIQ, 'v', V_OPT_MSG);
opts->add (Options::UNIQ, 'h', H_OPT_MSG);
// parse the options
try {
opts->parse (argc, argv);
// check for verbose and version
if (opts->getoflg ('h') == true) {
opts->usage (os);
delete opts;
System::exit (0);
}
if (opts->getoflg ('v') == true) {
os << "afnix cross librarian, " << System::osname ();
os << ", revision " << System::version () << eolc;
delete opts;
System::exit (0);
}
// make sure the librarian file is set
if (opts->getoflg ('f') == false) {
opts->usage (os);
os << "fatal: missing librarian name" << eolc;
System::exit (1);
}
// make sure that not both extract and create are set
if ((opts->getoflg ('c') == true) && (opts->getoflg ('x') == true)) {
os << "fatal: both create and extract flags are set" << eolc;
System::exit (1);
}
} catch (...) {
opts->usage (os);
delete opts;
System::exit (1);
}
return opts;
}
// this procedure does a librarian report
static void axl_report (const Librarian& axl, bool tflg, bool sflg) {
// do nothing without report mode
if (tflg == false) return;
// create output stream and report
OutputTerm tout;
if (sflg == true) {
Strvec flst = axl.getlist ();
long llen = flst.length ();
for (long i = 0; i < llen; i++) tout.writeln (flst.get (i));
} else {
axl.format (tout);
}
}
// this procedure extract a file from the librarian
static void axl_extract (const Librarian& axl, const String& name) {
Input* is = axl.extract (name);
if (is == nilp) return;
OutputFile os (name);
while (is->iseof () == false) os.write (is->read ());
}
// this procedure process the options
static void run_options (Options* opts) {
// get the options value
bool cflg = opts->getoflg ('c');
bool xflg = opts->getoflg ('x');
bool sflg = opts->getoflg ('s');
bool tflg = opts->getoflg ('t') || sflg;
String name = opts->getopts ('f');
Strvec args = opts->getargs ();
// process the create flag
if (cflg == true) {
// create a librarian
Librarian axl;
// loop in the vector
long argc = args.length ();
for (long i = 0; i < argc; i++) axl.add (args.get (i));
// write the librarian
axl.write (name);
// check for report
axl_report (axl, tflg, sflg);
} else if (xflg == true) {
// open the librarian
Librarian axl (name);
// check if we extract eveything
long argc = args.length ();
if (argc == 0) {
Strvec flst = axl.getlist ();
long llen = flst.length ();
for (long i = 0; i < llen; i++) {
String name = flst.get (i);
axl_extract (axl, name);
}
} else {
for (long i = 0; i < argc; i++) {
String name = args.get (i);
axl_extract (axl, name);
}
}
// check for report
axl_report (axl, tflg, sflg);
} else {
// open the librarian
Librarian axl (name);
// check for report
axl_report (axl, tflg, sflg);
}
}
}
// ---------------------------------------------------------------------------
// - main process section -
// ---------------------------------------------------------------------------
int main (int argc, const char** argv) {
using namespace afnix;
OutputTerm terr (OutputTerm::ERROR);
// main processing loop
try {
// register the program name
System::initialize (argv[0]);
// get the options
Options* opts = get_options (terr, argc, argv);
// process the options
run_options (opts);
// clean everything
delete opts;
} catch (const Exception& e) {
terr.errorln (e);
return 1;
} catch (...) {
terr << "fatal: unknown exception trapped\n";
return 2;
}
// so far, so good
return 0;
}
syntax highlighted by Code2HTML, v. 0.9.1