2  *    This program is free software; you can redistribute it and/or modify
 
   3  *    it under the terms of the GNU General Public License as published by
 
   4  *    the Free Software Foundation; either version 2 of the License, or
 
   5  *    (at your option) any later version.
 
   7  *    This program is distributed in the hope that it will be useful,
 
   8  *    but WITHOUT ANY WARRANTY; without even the implied warranty of
 
   9  *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
  10  *    GNU General Public License for more details.
 
  12  *    You should have received a copy of the GNU General Public License
 
  13  *    along with this program; if not, write to the Free Software
 
  14  *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
  18  *    Author : Maxim Mamontov <faust@stargazer.dp.ua>
 
  21 #ifndef __STG_SGCONF_ACTIONS_H__
 
  22 #define __STG_SGCONF_ACTIONS_H__
 
  26 #include "parser_state.h"
 
  28 #include "stg/common.h"
 
  29 #include "stg/resetable.h"
 
  38 typedef void (* FUNC0)();
 
  41 class FUNC0_ACTION : public ACTION
 
  44         FUNC0_ACTION(const F & func) : m_func(func) {}
 
  46         virtual ACTION * Clone() const { return new FUNC0_ACTION<F>(*this); }
 
  48         virtual std::string ParamDescription() const { return ""; }
 
  49         virtual std::string DefaultDescription() const { return ""; }
 
  50         virtual OPTION_BLOCK & Suboptions() { return m_suboptions; }
 
  51         virtual PARSER_STATE Parse(int argc, char ** argv, void * /*data*/)
 
  54         return PARSER_STATE(true, argc, argv);
 
  59         OPTION_BLOCK m_suboptions;
 
  64 FUNC0_ACTION<F> * MakeFunc0Action(F func)
 
  66 return new FUNC0_ACTION<F>(func);
 
  70 class PARAM_ACTION : public ACTION
 
  73         PARAM_ACTION(RESETABLE<T> & param,
 
  74                      const T & defaultValue,
 
  75                      const std::string & paramDescription)
 
  77               m_defaltValue(defaultValue),
 
  78               m_description(paramDescription),
 
  81         PARAM_ACTION(RESETABLE<T> & param)
 
  85         PARAM_ACTION(RESETABLE<T> & param,
 
  86                      const std::string & paramDescription)
 
  88               m_description(paramDescription),
 
  92         virtual ACTION * Clone() const { return new PARAM_ACTION<T>(*this); }
 
  94         virtual std::string ParamDescription() const { return m_description; }
 
  95         virtual std::string DefaultDescription() const;
 
  96         virtual OPTION_BLOCK & Suboptions() { return m_suboptions; }
 
  97         virtual PARSER_STATE Parse(int argc, char ** argv, void * /*data*/);
 
  98         virtual void ParseValue(const std::string & value);
 
 101         RESETABLE<T> & m_param;
 
 103         std::string m_description;
 
 105         OPTION_BLOCK m_suboptions;
 
 108 template <typename T>
 
 110 std::string PARAM_ACTION<T>::DefaultDescription() const
 
 112 return m_hasDefault ? " (default: '" + x2str(m_defaltValue) + "')"
 
 118 std::string PARAM_ACTION<std::string>::DefaultDescription() const
 
 120 return m_hasDefault ? " (default: '" + m_defaltValue + "')"
 
 124 template <typename T>
 
 126 PARSER_STATE PARAM_ACTION<T>::Parse(int argc, char ** argv, void * /*data*/)
 
 131     throw ERROR("Missing argument.");
 
 133 if (str2x(*argv, value))
 
 134     throw ERROR(std::string("Bad argument: '") + *argv + "'");
 
 136 return PARSER_STATE(false, --argc, ++argv);
 
 141 PARSER_STATE PARAM_ACTION<bool>::Parse(int argc, char ** argv, void * /*data*/)
 
 144 return PARSER_STATE(false, argc, argv);
 
 147 template <typename T>
 
 149 void PARAM_ACTION<T>::ParseValue(const std::string & stringValue)
 
 151 if (stringValue.empty())
 
 152     throw ERROR("Missing value.");
 
 154 if (str2x(stringValue, value))
 
 155     throw ERROR(std::string("Bad value: '") + stringValue + "'");
 
 161 void PARAM_ACTION<std::string>::ParseValue(const std::string & stringValue)
 
 163 m_param = stringValue;
 
 168 PARSER_STATE PARAM_ACTION<std::string>::Parse(int argc, char ** argv, void * /*data*/)
 
 173     throw ERROR("Missing argument.");
 
 175 return PARSER_STATE(false, --argc, ++argv);
 
 178 template <typename T>
 
 180 PARAM_ACTION<T> * MakeParamAction(RESETABLE<T> & param,
 
 181                                   const T & defaultValue,
 
 182                                   const std::string & paramDescription)
 
 184 return new PARAM_ACTION<T>(param, defaultValue, paramDescription);
 
 187 template <typename T>
 
 189 PARAM_ACTION<T> * MakeParamAction(RESETABLE<T> & param)
 
 191 return new PARAM_ACTION<T>(param);
 
 194 template <typename T>
 
 196 PARAM_ACTION<T> * MakeParamAction(RESETABLE<T> & param,
 
 197                                   const std::string & paramDescription)
 
 199 return new PARAM_ACTION<T>(param, paramDescription);
 
 202 class KV_ACTION : public ACTION
 
 205         KV_ACTION(const std::string & name,
 
 206                   const std::string & paramDescription)
 
 208               m_description(paramDescription)
 
 211         virtual ACTION * Clone() const { return new KV_ACTION(*this); }
 
 213         virtual std::string ParamDescription() const { return m_description; }
 
 214         virtual std::string DefaultDescription() const { return ""; }
 
 215         virtual OPTION_BLOCK & Suboptions() { return m_suboptions; }
 
 216         virtual PARSER_STATE Parse(int argc, char ** argv, void * data);
 
 220         std::string m_description;
 
 221         OPTION_BLOCK m_suboptions;
 
 225 PARSER_STATE KV_ACTION::Parse(int argc, char ** argv, void * data)
 
 230     throw ERROR("Missing argument.");
 
 231 assert(data != NULL && "Expecting container pointer.");
 
 232 std::map<std::string, std::string> & kvs = *static_cast<std::map<std::string, std::string>*>(data);
 
 234 return PARSER_STATE(false, --argc, ++argv);
 
 238 KV_ACTION * MakeKVAction(const std::string & name,
 
 239                          const std::string & paramDescription)
 
 241 return new KV_ACTION(name, paramDescription);
 
 244 } // namespace SGCONF