// -*- mode: c++; indent-tabs-mode: nil; -*- // // Copyright 2009 Illumina, Inc. // // This software is covered by the "Illumina Genome Analyzer Software // License Agreement" and the "Illumina Source Code License Agreement", // and certain third party copyright/licenses, and any user of this // source file is bound by the terms therein (see accompanying files // Illumina_Genome_Analyzer_Software_License_Agreement.pdf and // Illumina_Source_Code_License_Agreement.pdf and third party // copyright/license notices). // // /// \file /// /// \author Chris Saunders /// #include "blt_common/blt_arg_parse.hh" arg_data:: arg_data(int init_argc,char* init_argv[],const prog_info& init_pinfo) : argc(init_argc), argv(init_argv), argmark(argc,false), argstr(argc), pinfo(init_pinfo) { for(int i(0);i0) argmark[0]=true; for(int i(0);i 0.) or (is_allow_zero and (val >= 0.))) and (is_no_max_check or (val <= 1.))); } static void set_xrange_val(const prog_info& pinfo, const char* arg_label, const char* arg, double& val, bool is_allow_zero, bool is_no_max_check){ bool is_val_invalid(false); try { val=boost::lexical_cast(arg); } catch(boost::bad_lexical_cast&) { is_val_invalid=true; } is_val_invalid = (is_val_invalid or (not is_valid_xrange(val,is_allow_zero,is_no_max_check))); if(is_val_invalid) { std::ostringstream oss; oss << "argument after flag " << arg_label << " (" << arg << ") is not valid"; pinfo.usage(oss.str().c_str()); } } void set_xrange_arg(int& argi, arg_data& ad, bool& is_val_set, double& val, bool is_allow_zero, bool is_no_max_check){ const char* arg_label(ad.argstr[argi].c_str()); ad.argmark[argi] = true; if(++argi>=static_cast(ad.argstr.size())) { ad.pinfo.usage((std::string("no value following ")+arg_label).c_str()); } if(is_val_set) { ad.pinfo.usage((std::string("multiple ")+arg_label+" arguments").c_str()); } set_xrange_val(ad.pinfo,arg_label,ad.argstr[argi].c_str(),val,is_allow_zero,is_no_max_check); is_val_set=true; } void set_filename_arg(int& argi, arg_data& ad, bool& is_val_set, std::string& file){ const char* arg_label(ad.argstr[argi].c_str()); ad.argmark[argi] = true; if(++argi>=static_cast(ad.argstr.size())) { ad.pinfo.usage((std::string("no value following: ")+arg_label).c_str()); } if(is_val_set) { ad.pinfo.usage((std::string("multiple ")+arg_label+" arguments").c_str()); } file=ad.argstr[argi]; if(file.empty()) { ad.pinfo.usage((std::string("empty filename following: ")+arg_label).c_str()); } is_val_set=true; } void set_win_arg(int& argi, arg_data& ad, bool& is_val_set, int& val1, unsigned& val2){ const char* arg_label(ad.argstr[argi].c_str()); ad.argmark[argi] = true; if(++argi>=static_cast(ad.argstr.size())) { ad.pinfo.usage((std::string("two arguments must follow ")+arg_label).c_str()); } if(is_val_set) { ad.pinfo.usage((std::string("multiple ")+arg_label+" arguments").c_str()); } set_val(ad.pinfo,arg_label,ad.argstr[argi].c_str(),val1); ad.argmark[argi] = true; if(++argi>=static_cast(ad.argstr.size())) { ad.pinfo.usage((std::string("two arguments must follow ")+arg_label).c_str()); } int val2_tmp; set_val(ad.pinfo,arg_label,ad.argstr[argi].c_str(),val2_tmp); if(val2_tmp<0){ ad.pinfo.usage((std::string("second argument following: ")+arg_label+" must be non-negative\n").c_str()); } val2=val2_tmp; is_val_set=true; } void set_nploid_arg(int& argi, arg_data& ad, bool& is_val_set, int& val1, double& val2){ const char* arg_label(ad.argstr[argi].c_str()); ad.argmark[argi] = true; if(++argi>=static_cast(ad.argstr.size())) { ad.pinfo.usage((std::string("two arguments must follow ")+arg_label).c_str()); } if(is_val_set) { ad.pinfo.usage((std::string("multiple ")+arg_label+" arguments").c_str()); } set_val(ad.pinfo,arg_label,ad.argstr[argi].c_str(),val1); ad.argmark[argi] = true; if(++argi>=static_cast(ad.argstr.size())) { ad.pinfo.usage((std::string("two arguments must follow ")+arg_label).c_str()); } const bool is_allow_zero(false); const bool is_no_max_check(false); set_xrange_val(ad.pinfo,arg_label,ad.argstr[argi].c_str(),val2,is_allow_zero,is_no_max_check); is_val_set=true; } void set_xrange_win_arg(int& argi, arg_data& ad, bool& is_val_set, double& val1, unsigned& val2){ const char* arg_label(ad.argstr[argi].c_str()); ad.argmark[argi] = true; if(++argi>=static_cast(ad.argstr.size())) { ad.pinfo.usage((std::string("two arguments must follow ")+arg_label).c_str()); } if(is_val_set) { ad.pinfo.usage((std::string("multiple ")+arg_label+" arguments").c_str()); } const bool is_allow_zero(false); const bool is_no_max_check(false); set_xrange_val(ad.pinfo,arg_label,ad.argstr[argi].c_str(),val1,is_allow_zero,is_no_max_check); ad.argmark[argi] = true; if(++argi>=static_cast(ad.argstr.size())) { ad.pinfo.usage((std::string("two arguments must follow ")+arg_label).c_str()); } int val2_tmp; set_val(ad.pinfo,arg_label,ad.argstr[argi].c_str(),val2_tmp); if(val2_tmp<0){ ad.pinfo.usage((std::string("second argument following: ")+arg_label+" must be non-negative\n").c_str()); } val2=val2_tmp; is_val_set=true; }