/* Copyright 2009-2012 Andreas Biegert, Christof Angermueller This file is part of the CS-BLAST package. The CS-BLAST package is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The CS-BLAST package 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. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include "cs.h" #include "application.h" #include "getopt_pp.h" using std::string; namespace cs { Application* Application::instance_; const char* Application::kVersionNumber = "2.2.26"; const char* Application::kCopyright = "Copyright (c) 2010-2012 Andreas Biegert, Christof Angermueller, Johannes Soeding, and LMU Munich"; Application::Application() : log_level_(Log::to_string(Log::from_int(LOG_MAX_LEVEL))), log_fp_(stderr) { // Register the application instance if (instance_) throw Exception("Second instance of Application is prohibited"); instance_ = this; } Application::~Application() { if (log_fp_ && log_fp_ != stderr) fclose(log_fp_); } int Application::main(int argc, char* argv[], FILE* fout, const string& name) { // save original arg parameters for e.g. mpi argc_ = argc; argv_ = argv; int status = 0; out_ = fout; app_name_ = name; log_file_ = "stderr"; // Prepare command line parsing GetOpt_pp options(argc, argv, Include_Environment); options.exceptions_all(); try{ try { // Print usage? if (argc < 2 || argv[1][0] == '?' || options >> OptionPresent(' ', std::string("help"))) { PrintHelp(); return 0; } #ifdef LOGGING // Process logging options options >> Option(' ', "loglevel", log_level_, log_level_); Log::reporting_level() = Log::from_string(log_level_); options >> Option(' ', "logfile", log_file_, log_file_); if (log_file_.empty() || log_file_ == "stderr") log_fp_ = stderr; else log_fp_ = fopen(log_file_.c_str(), "w"); Log::stream() = log_fp_; #endif // Let subclasses parse the command line options ParseOptions(options); // Run application status = Run(); } catch(const OptionNotFoundEx& e) { throw Exception("Missing command line option!"); } catch(const ArgumentNotFoundEx& e) { throw Exception("Missing argument for command line option!"); } catch(const TooManyOptionsEx& e) { throw Exception("Invalid command line option!"); } catch(const TooManyArgumentsEx& e) { throw Exception("Too many arguments for command line option!"); } catch(const GetOptEx& e) { throw Exception("Error parsing command line options!"); } } catch(const std::exception& e) { LOG(ERROR) << e.what(); fprintf(stderr, "\nERROR: %s\n", e.what()); return 1; } return status; } void Application::PrintHelp() const { fprintf(out_, "%s version %s\n", app_name_.c_str(), kVersionNumber); PrintBanner(); fprintf(out_, "%s\n\n", kCopyright); PrintUsage(); fputs("\nOptions:\n", out_); PrintOptions(); #ifdef LOGGING fprintf(out_, " %-30s %s (def=%s)\n", " --loglevel ", "Maximal reporting level for logging", log_level_.c_str()); fprintf(out_, " %-30s %s (def=%s)\n", " --logfile ", "Output file for logging", log_file_.c_str()); #endif } } // namespace cs