// --------------------------------------------------------------------------- // - Main.cpp - // - the afnix cross compiler 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 "Interp.hpp" #include "Exception.hpp" #include "InputFile.hpp" #include "OutputFile.hpp" namespace afnix { // ------------------------------------------------------------------------- // - private section - // ------------------------------------------------------------------------- // the options messages static const String U_CLS_MSG = "axc [options] 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 I_OPT_MSG = " [i path] \t add a resolver path"; static const String E_OPT_MSG = " [e mode] \t force the encoding mode"; // this procedure returns the compiler 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, 'e', E_OPT_MSG); opts->add (Options::VOPT, 'i', I_OPT_MSG); // add the uniq options 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 compiler, " << System::osname (); os << ", revision " << System::version () << eolc; delete opts; System::exit (0); } } catch (...) { opts->usage (os); delete opts; System::exit (1); } return opts; } // this procedure compile a file by name static void compile_file (Interp* interp, const String& name) { // get the output file name String oname = System::xname (System::rmext (name)) + ".axc"; try { // try to open the output file OutputFile os (oname); // compile the module interp->compile (name, os); } catch (const Exception& e) { if (System::isfile (oname) == true) System::rmfile (oname); throw; } } // this procedure process the options static void run_options (Options* opts) { // create a new interpreter Interp* interp = new Interp; // set the interpreter options interp->setpath (opts->getoptv ('i')); if (opts->getoflg ('e') == true) { interp->setemod (opts->getopts ('e')); } // get the argument file vector Strvec args = opts->getargs (); long argc = args.length (); // compile one by one for (long i = 0; i < argc; i++) { compile_file (interp, args.get (i)); } } } // --------------------------------------------------------------------------- // - 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; }