Changeset 705 for trunk/lib


Ignore:
Timestamp:
Nov 26, 2008, 12:33:26 AM (13 years ago)
Author:
Peter Johansson
Message:

importing classes for commandline parsing from yat. This fixes #349 and #265

Location:
trunk/lib
Files:
11 added
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/lib/Makefile.am

    r696 r705  
    2929
    3030noinst_HEADERS = AddStats.h Alias.h BlameStats.h ClassicStats.h ColumnStream.h \
    31   Commitment.h Configuration.h css.h\
    32   Date.h Directory.h File.h first_page.h Functor.h Gnuplot.h GnuplotFE.h \
     31  CommandLine.h Commitment.h Configuration.h css.h\
     32  Date.h Directory.h Exception.h File.h first_page.h Functor.h \
     33  Gnuplot.h GnuplotFE.h \
    3334  HtmlBuf.h HtmlStream.h html_utility.h LineTypeParser.h \
    34   Node.h Option.h rmdirhier.h \
     35  Node.h Option.h OptionArg.h OptionHelp.h OptionSwitch.h \
     36  OptionVersion.h rmdirhier.h \
    3537  Stats.h StatsCollection.h subversion_info.h SVN.h SVNblame.h  \
    3638  SVNinfo.h SVNlog.h SVNproperty.h Trac.h utility.h
     
    3840libsvndigest_a_SOURCES = AddStats.cc Alias.cc BlameStats.cc \
    3941  ClassicStats.cc ColumnStream.cc \
    40   Commitment.cc Configuration.cc \
    41   css.cc Date.cc Directory.cc File.cc first_page.cc\
     42  CommandLine.cc Commitment.cc Configuration.cc \
     43  css.cc Date.cc Directory.cc File.cc FileUtil.cc first_page.cc\
    4244  Functor.cc Gnuplot.cc GnuplotFE.cc  HtmlBuf.cc HtmlStream.cc \
    4345  html_utility.cc LineTypeParser.cc Node.cc \
     46  Option.cc OptionHelp.cc OptionSwitch.cc OptionVersion.cc \
    4447  rmdirhier.cc Stats.cc StatsCollection.cc subversion_info.cc SVN.cc \
    4548  SVNblame.cc SVNinfo.cc SVNlog.cc SVNproperty.cc Trac.cc utility.cc
  • trunk/lib/Option.h

    r693 r705  
    55
    66/*
     7  Copyright (C) 2007 Jari Häkkinen, Peter Johansson
    78  Copyright (C) 2008 Peter Johansson
    89
     
    2324*/
    2425
     26#include <iostream>
    2527#include <string>
     28#include <vector>
    2629
    27 namespace theplu{
    28 namespace svndigest{
     30namespace theplu {
     31namespace svndigest {
    2932
     33  class CommandLine;
    3034  ///
    31   /// Class taking care of cmd options in Parameter
     35  /// @brief Container of variables for an option. @see CommandLine
    3236  ///
    33   template<typename T>
    3437  class Option
    3538  {
    3639  public:
    37     Option(T value): default_(value), value_(value) {}
    38     inline const T& default_value(void) const { return default_; }
    39     inline void reset(void) { value_=default_; }
    40     inline T& value(void) { return value_; }
    41     inline const T& value(void) const { return value_; }
     40    /**
     41       @brief Constructor
     42       
     43       \param cmd Commandline to be hooked up with.
     44       @param name string such as "help" for --help, "h" for -h or
     45       "h,help" for having both short and long option name
     46       @param desc string used in help display
     47    */
     48    Option(CommandLine& cmd, std::string name, std::string desc);
     49
     50    /**
     51       @brief destructor
     52    */
     53    virtual ~Option(void);
     54   
     55    /**
     56       @return description
     57    */
     58    std::string description(void) const;
     59
     60    /**
     61       \return long name e.g. 'help' for --help option.
     62    */
     63    std::string long_name(void) const;
     64
     65    /**
     66       \brief parsing the commandline
     67     */
     68    void parse(std::vector<std::string>::iterator&,
     69               const std::vector<std::string>::iterator&);
     70
     71    /**
     72       @brief Get if option was found in cmd.
     73       
     74       @return true if option has been detected in parsing
     75    */
     76    bool present(void) const;
     77
     78    /**
     79       \brief print help output
     80
     81       This function calls the four virtual private functions print1,
     82       print2, print3, and print4. This allows an inherited class to
     83       implement one (or several) of these functions and keep the
     84       default output of the others. The default behavior is that:
     85
     86       - print1 prints the short name, '-h', as short_name(void) const
     87       - print2 prints the long name, '--help', as long_name(void) const
     88       - print3 is empty
     89       - print4 prints the description as description(void) const.
     90     */
     91    std::string print(void);
     92
     93    /**
     94       \brief sets present to false
     95    */
     96    void reset(void);
     97
     98    /**
     99       \return short name e.g. 'h' for -h option.
     100    */
     101    char short_name(void) const;
     102
     103    /**
     104       \brief Validate the Option
     105
     106       This function is called after commandline is parsed.
     107     */
     108    void validate(void);
     109
     110  protected:
     111    /**
     112       \return const reference to CommandLine Option belongs to.
     113     */
     114    const CommandLine& cmd(void) const;
    42115
    43116  private:
    44     const T default_;
    45     T value_;
     117    virtual void do_parse(std::vector<std::string>::iterator&,
     118                          const std::vector<std::string>::iterator&)=0;
    46119
     120    /**
     121     */
     122    virtual std::string print1(void) const;
     123
     124    /**
     125     */
     126    virtual std::string print2(void) const;
     127
     128    /**
     129     */
     130    virtual std::string print3(void) const;
     131
     132    /**
     133     */
     134    virtual std::string print4(void) const;
     135
     136    /**
     137     */
     138    virtual void do_validate(void) const=0;
     139
     140
     141    const CommandLine& cmd_;
     142    std::string description_;
     143    std::string long_name_;
     144    bool present_;
     145    char short_name_;
     146
     147    // copy not allowed
     148    Option(const Option&);
     149    Option& operator=(const Option&);
    47150  };
    48151
    49 }} // end of namespace svndigest end of namespace theplu
     152}} // of namespace svndigest, and theplu
    50153
    51 #endif 
     154#endif
  • trunk/lib/utility.cc

    r693 r705  
    3333#include <string>
    3434#include <sys/param.h>
     35#include <sys/stat.h>
    3536#include <unistd.h>
    3637
     
    6364
    6465
     66  std::string concatenate_path(std::string dir, std::string base)
     67  {
     68    if (dir.empty())
     69      return base;
     70    if (dir[dir.size()-1]!='/')
     71      dir.append("/");
     72    return dir+base;
     73  }
     74
     75
    6576  void copy_file(const std::string& source, const std::string& target)
    6677  {
     
    8596  {
    8697    size_t pos = path.find_last_of("/");
     98    if (pos==std::string::npos)
     99      return ".";
    87100    if (pos==path.size()-1)
    88101      return directory_name(path.substr(0,path.size()-2));
  • trunk/lib/utility.h

    r693 r705  
    2727#include <functional>
    2828#include <iosfwd>
     29#include <sstream>
    2930#include <string>
     31#include <stdexcept>
    3032#include <utility>
    3133#include <vector>
     
    5355
    5456  /**
     57     \return dir+base if dir ends with '/', else dir+'/'+base
     58   */
     59  std::string concatenate_path(std::string dir, std::string base);
     60
     61  /**
     62     \brief convert string to (numerical) type
     63
     64     \throw runtime_error if conversion fails
     65   */
     66  template<typename T>
     67  T convert(const std::string& s);
     68
     69  /**
    5570     @brief Copy file \a source to \a target.
    5671
     
    103118  std::string htrim(std::string str);
    104119
     120  /**
     121     @return true if string \a s fulfills regular expression \verbatim
     122     ^\w* \endverbatim \a other \verbatim \w*$ \endverbatim (case
     123     insensitive)
     124  */
     125  bool is_equal(std::string s, std::string other);
     126
    105127  ///
    106128  /// @return true if \a str is an integer
    107129  ///
    108130  bool is_int(std::string str);
     131
     132  ///
     133  /// @return true if string is "nan" (case-insensitive)
     134  ///
     135  bool is_nan(const std::string& s);
    109136
    110137  ///
     
    221248                    std::string);
    222249
     250  // template implementations
     251  template<typename T>
     252  T convert(const std::string& s)
     253  {
     254    if (is_nan(s))
     255      return std::numeric_limits<T>::quiet_NaN();
     256    if (is_equal(s, "inf"))
     257      return std::numeric_limits<T>::infinity();
     258    if (is_equal(s, "-inf"))
     259      if (std::numeric_limits<T>::is_signed)
     260        return -std::numeric_limits<T>::infinity();
     261      else
     262        throw std::runtime_error(std::string("convert(\"")+s+
     263                                 std::string("\"): type is unsigned") );
     264    std::stringstream ss(s);
     265    T a;
     266    ss >> a;
     267    bool ok = true;
     268    if(ss.fail())
     269      ok = false;
     270    // Check that nothing is left on stream
     271    std::string b;
     272    ss >> b;
     273    if (!b.empty() || !ok)
     274      throw std::runtime_error(std::string("convert(\"")+s+std::string("\")"));
     275    return a;
     276  }
     277
    223278}} // end of namespace svndigest end of namespace theplu
    224279
Note: See TracChangeset for help on using the changeset viewer.