summaryrefslogtreecommitdiff
path: root/src/config.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/config.h')
-rw-r--r--src/config.h609
1 files changed, 53 insertions, 556 deletions
diff --git a/src/config.h b/src/config.h
index 344e007..e86e950 100644
--- a/src/config.h
+++ b/src/config.h
@@ -1,13 +1,10 @@
/******************************************************************************
*
- *
- *
- *
* Copyright (C) 1997-2015 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
@@ -19,558 +16,58 @@
#ifndef CONFIG_H
#define CONFIG_H
-#include <qstrlist.h>
-#include <qdict.h>
-#include <qlist.h>
-#include <qregexp.h>
-#include "ftextstream.h"
-
-
-/** Abstract base class for any configuration option.
- */
-class ConfigOption
-{
- friend class Config;
-
- public:
-
- /*! The type of option */
- enum OptionType
- {
- O_Info, //<! A section header
- O_List, //<! A list of items
- O_Enum, //<! A fixed set of items
- O_String, //<! A single item
- O_Int, //<! An integer value
- O_Bool, //<! A boolean value
- O_Obsolete, //<! An obsolete option
- O_Disabled //<! Disabled compile time option
- };
- enum
- {
- /*! Maximum length of an option in the config file. Used for
- * alignment purposes.
- */
- MAX_OPTION_LENGTH = 23
- };
- ConfigOption(OptionType t) : m_kind(t)
- {
- m_spaces.fill(' ',40);
- }
- virtual ~ConfigOption()
- {
- }
-
- /*! returns the kind of option this is. */
- OptionType kind() const { return m_kind; }
- QCString name() const { return m_name; }
- QCString docs() const { return m_doc; }
-
- QCString dependsOn() const { return m_dependency; }
- void addDependency(const char *dep) { m_dependency = dep; }
- void setEncoding(const QCString &e) { m_encoding = e; }
- void setUserComment(const QCString &u) { m_userComment += u; }
-
- protected:
- virtual void writeTemplate(FTextStream &t,bool sl,bool upd) = 0;
- virtual void convertStrToVal() {}
- virtual void substEnvVars() = 0;
- virtual void init() {}
-
- void writeBoolValue(FTextStream &t,bool v);
- void writeIntValue(FTextStream &t,int i);
- void writeStringValue(FTextStream &t,QCString &s);
- void writeStringList(FTextStream &t,QStrList &l);
-
- QCString m_spaces;
- QCString m_name;
- QCString m_doc;
- QCString m_dependency;
- QCString m_encoding;
- QCString m_userComment;
- OptionType m_kind;
-};
-
-/** Section marker for grouping the configuration options.
- */
-class ConfigInfo : public ConfigOption
-{
- public:
- ConfigInfo(const char *name,const char *doc)
- : ConfigOption(O_Info)
- {
- m_name = name;
- m_doc = doc;
- }
- void writeTemplate(FTextStream &t, bool sl,bool);
- void substEnvVars() {}
-};
-
-/** Class respresenting a list type option.
- */
-class ConfigList : public ConfigOption
-{
- public:
- enum WidgetType { String, File, Dir, FileAndDir };
- ConfigList(const char *name,const char *doc)
- : ConfigOption(O_List)
- {
- m_name = name;
- m_doc = doc;
- m_widgetType = String;
- }
- void addValue(const char *v) { m_value.append(v); }
- void setWidgetType(WidgetType w) { m_widgetType = w; }
- WidgetType widgetType() const { return m_widgetType; }
- QStrList *valueRef() { return &m_value; }
- void writeTemplate(FTextStream &t,bool sl,bool);
- void substEnvVars();
- void init() { m_value.clear(); }
- private:
- QStrList m_value;
- WidgetType m_widgetType;
-};
-
-/** Class representing an enum type option.
- */
-class ConfigEnum : public ConfigOption
-{
- public:
- ConfigEnum(const char *name,const char *doc,const char *defVal)
- : ConfigOption(O_Enum)
- {
- m_name = name;
- m_doc = doc;
- m_value = defVal;
- m_defValue = defVal;
- }
- void addValue(const char *v) { m_valueRange.append(v); }
- QStrListIterator iterator()
- {
- return QStrListIterator(m_valueRange);
- }
- QCString *valueRef() { return &m_value; }
- void substEnvVars();
- void writeTemplate(FTextStream &t,bool sl,bool);
- void init() { m_value = m_defValue.copy(); }
-
- private:
- QStrList m_valueRange;
- QCString m_value;
- QCString m_defValue;
-};
-
-/** Class representing a string type option.
- */
-class ConfigString : public ConfigOption
-{
- public:
- enum WidgetType { String, File, Dir, Image };
- ConfigString(const char *name,const char *doc)
- : ConfigOption(O_String)
- {
- m_name = name;
- m_doc = doc;
- m_widgetType = String;
- }
- ~ConfigString()
- {
- }
- void setWidgetType(WidgetType w) { m_widgetType = w; }
- WidgetType widgetType() const { return m_widgetType; }
- void setDefaultValue(const char *v) { m_defValue = v; }
- QCString *valueRef() { return &m_value; }
- void writeTemplate(FTextStream &t,bool sl,bool);
- void substEnvVars();
- void init() { m_value = m_defValue.copy(); }
-
- private:
- QCString m_value;
- QCString m_defValue;
- WidgetType m_widgetType;
-};
-
-/** Class representing an integer type option.
- */
-class ConfigInt : public ConfigOption
-{
- public:
- ConfigInt(const char *name,const char *doc,int minVal,int maxVal,int defVal)
- : ConfigOption(O_Int)
- {
- m_name = name;
- m_doc = doc;
- m_value = defVal;
- m_defValue = defVal;
- m_minVal = minVal;
- m_maxVal = maxVal;
- }
- QCString *valueStringRef() { return &m_valueString; }
- int *valueRef() { return &m_value; }
- int minVal() const { return m_minVal; }
- int maxVal() const { return m_maxVal; }
- void convertStrToVal();
- void substEnvVars();
- void writeTemplate(FTextStream &t,bool sl,bool upd);
- void init() { m_value = m_defValue; }
- private:
- int m_value;
- int m_defValue;
- int m_minVal;
- int m_maxVal;
- QCString m_valueString;
-};
-
-/** Class representing a Boolean type option.
- */
-class ConfigBool : public ConfigOption
-{
- public:
- ConfigBool(const char *name,const char *doc,bool defVal)
- : ConfigOption(O_Bool)
- {
- m_name = name;
- m_doc = doc;
- m_value = defVal;
- m_defValue = defVal;
- }
- QCString *valueStringRef() { return &m_valueString; }
- bool *valueRef() { return &m_value; }
- void convertStrToVal();
- void substEnvVars();
- void setValueString(const QCString &v) { m_valueString = v; }
- void writeTemplate(FTextStream &t,bool sl,bool upd);
- void init() { m_value = m_defValue; }
- private:
- bool m_value;
- bool m_defValue;
- QCString m_valueString;
-};
-
-/** Section marker for obsolete options
- */
-class ConfigObsolete : public ConfigOption
-{
- public:
- ConfigObsolete(const char *name) : ConfigOption(O_Obsolete)
- { m_name = name; }
- void writeTemplate(FTextStream &,bool,bool);
- void substEnvVars() {}
-};
-
-/** Section marker for compile time optional options
- */
-class ConfigDisabled : public ConfigOption
-{
- public:
- ConfigDisabled(const char *name) : ConfigOption(O_Disabled)
- { m_name = name; }
- void writeTemplate(FTextStream &,bool,bool);
- void substEnvVars() {}
-};
-
-
-// some convenience macros for access the config options
-#define Config_getString(val) Config::instance()->getString(__FILE__,__LINE__,val)
-#define Config_getInt(val) Config::instance()->getInt(__FILE__,__LINE__,val)
-#define Config_getList(val) Config::instance()->getList(__FILE__,__LINE__,val)
-#define Config_getEnum(val) Config::instance()->getEnum(__FILE__,__LINE__,val)
-#define Config_getBool(val) Config::instance()->getBool(__FILE__,__LINE__,val)
+class FTextStream;
+
+// note: this header file is generated from config.xml
+#include "configvalues.h"
+
+//! @{
+//! some convenience macros for accessing the config options
+//! mainly done like this for backward compatibility
+#if DYNAMIC_LOOKUP // for debug purposes
+#define Config_getString(val) (ConfigValues::instance().*((ConfigValues::InfoString*)ConfigValues::instance().get(#val))->item)
+#define Config_getBool(val) (ConfigValues::instance().*((ConfigValues::InfoBool*)ConfigValues::instance().get(#val))->item)
+#define Config_getInt(val) (ConfigValues::instance().*((ConfigValues::InfoInt*)ConfigValues::instance().get(#val))->item)
+#define Config_getEnum(val) (ConfigValues::instance().*((ConfigValues::InfoString*)ConfigValues::instance().get(#val))->item)
+#define Config_getList(val) (ConfigValues::instance().*((ConfigValues::InfoList*)ConfigValues::instance().get(#val))->item)
+#else // direct access
+#define Config_getString(val) (ConfigValues::instance().val)
+#define Config_getBool(val) (ConfigValues::instance().val)
+#define Config_getInt(val) (ConfigValues::instance().val)
+#define Config_getEnum(val) (ConfigValues::instance().val)
+#define Config_getList(val) (ConfigValues::instance().val)
+#endif
+//! @}
-/** Singleton for configuration variables.
- *
- * This object holds the global static variables
- * read from a user-supplied configuration file.
- * The static member instance() can be used to get
- * a pointer to the one and only instance.
- *
- * Set all variables to their default values by
- * calling Config::instance()->init()
- *
- */
-class Config
+/** \brief Public function to deal with the configuration file. */
+namespace Config
{
- public:
- /////////////////////////////
- // public API
- /////////////////////////////
-
- /*! Returns the one and only instance of this class */
- static Config *instance()
- {
- if (m_instance==0) m_instance = new Config;
- return m_instance;
- }
- /*! Delete the instance */
- static void deleteInstance()
- {
- delete m_instance;
- m_instance=0;
- }
-
- /*! Returns an iterator that can by used to iterate over the
- * configuration options.
- */
- QListIterator<ConfigOption> iterator()
- {
- return QListIterator<ConfigOption>(*m_options);
- }
-
- /*!
- * @name Getting configuration values.
- * @{
- */
-
- /*! Returns the value of the string option with name \a fileName.
- * The arguments \a num and \a name are for debugging purposes only.
- * There is a convenience function Config_getString() for this.
- */
- QCString &getString(const char *fileName,int num,const char *name) const;
-
- /*! Returns the value of the list option with name \a fileName.
- * The arguments \a num and \a name are for debugging purposes only.
- * There is a convenience function Config_getList() for this.
- */
- QStrList &getList(const char *fileName,int num,const char *name) const;
-
- /*! Returns the value of the enum option with name \a fileName.
- * The arguments \a num and \a name are for debugging purposes only.
- * There is a convenience function Config_getEnum() for this.
- */
- QCString &getEnum(const char *fileName,int num,const char *name) const;
-
- /*! Returns the value of the integer option with name \a fileName.
- * The arguments \a num and \a name are for debugging purposes only.
- * There is a convenience function Config_getInt() for this.
- */
- int &getInt(const char *fileName,int num,const char *name) const;
-
- /*! Returns the value of the boolean option with name \a fileName.
- * The arguments \a num and \a name are for debugging purposes only.
- * There is a convenience function Config_getBool() for this.
- */
- bool &getBool(const char *fileName,int num,const char *name) const;
-
- /*! Returns the ConfigOption corresponding with \a name or 0 if
- * the option is not supported.
- */
- ConfigOption *get(const char *name) const
- {
- return m_dict->find(name);
- }
- /* @} */
-
- /*!
- * @name Adding configuration options.
- * @{
- */
-
- /*! Starts a new configuration section with \a name and description \a doc.
- * \returns An object representing the option.
- */
- ConfigInfo *addInfo(const char *name,const char *doc)
- {
- ConfigInfo *result = new ConfigInfo(name,doc);
- m_options->append(result);
- return result;
- }
-
- /*! Adds a new string option with \a name and documentation \a doc.
- * \returns An object representing the option.
- */
- ConfigString *addString(const char *name,
- const char *doc)
- {
- ConfigString *result = new ConfigString(name,doc);
- m_options->append(result);
- m_dict->insert(name,result);
- return result;
- }
-
- /*! Adds a new enumeration option with \a name and documentation \a doc
- * and initial value \a defVal.
- * \returns An object representing the option.
- */
- ConfigEnum *addEnum(const char *name,
- const char *doc,
- const char *defVal)
- {
- ConfigEnum *result = new ConfigEnum(name,doc,defVal);
- m_options->append(result);
- m_dict->insert(name,result);
- return result;
- }
-
- /*! Adds a new string option with \a name and documentation \a doc.
- * \returns An object representing the option.
- */
- ConfigList *addList(const char *name,
- const char *doc)
- {
- ConfigList *result = new ConfigList(name,doc);
- m_options->append(result);
- m_dict->insert(name,result);
- return result;
- }
-
- /*! Adds a new integer option with \a name and documentation \a doc.
- * The integer has a range between \a minVal and \a maxVal and a
- * default value of \a defVal.
- * \returns An object representing the option.
- */
- ConfigInt *addInt(const char *name,
- const char *doc,
- int minVal,int maxVal,int defVal)
- {
- ConfigInt *result = new ConfigInt(name,doc,minVal,maxVal,defVal);
- m_options->append(result);
- m_dict->insert(name,result);
- return result;
- }
-
- /*! Adds a new boolean option with \a name and documentation \a doc.
- * The boolean has a default value of \a defVal.
- * \returns An object representing the option.
- */
- ConfigBool *addBool(const char *name,
- const char *doc,
- bool defVal)
- {
- ConfigBool *result = new ConfigBool(name,doc,defVal);
- m_options->append(result);
- m_dict->insert(name,result);
- return result;
- }
- /*! Adds an option that has become obsolete. */
- ConfigOption *addObsolete(const char *name)
- {
- ConfigObsolete *option = new ConfigObsolete(name);
- m_dict->insert(name,option);
- m_obsolete->append(option);
- return option;
- }
- /*! Adds an option that has been disabled at compile time. */
- ConfigOption *addDisabled(const char *name)
- {
- ConfigDisabled *option = new ConfigDisabled(name);
- m_dict->insert(name,option);
- m_disabled->append(option);
- return option;
- }
- /*! @} */
-
- /*! Writes a template configuration to stream \a t. If \a shortIndex
- * is \c TRUE the description of each configuration option will
- * be omitted.
- */
- void writeTemplate(FTextStream &t,bool shortIndex,bool updateOnly);
-
- void setHeader(const char *header) { m_header = header; }
-
- /////////////////////////////
- // internal API
- /////////////////////////////
-
- /*! Converts the string values read from the configuration file
- * to real values for non-string type options (like int, and bools)
- */
- void convertStrToVal();
-
- /*! Replaces references to environment variable by the actual value
- * of the environment variable.
- */
- void substituteEnvironmentVars();
-
- /*! Checks if the values of the variable are correct, adjusts them
- * if needed, and report any errors.
- */
- void check();
-
- /*! Initialize config variables to their default value */
- void init();
-
- /*! Parse a configuration data in string \a str.
- * \returns TRUE if successful, or FALSE if the string could not be
- * parsed.
- */
- //bool parseString(const char *fn,const char *str);
- bool parseString(const char *fn,const char *str,bool upd = FALSE);
-
- /*! Parse a configuration file with name \a fn.
- * \returns TRUE if successful, FALSE if the file could not be
- * opened or read.
- */
- bool parse(const char *fn,bool upd = FALSE);
-
- /*! Called from the constructor, will add doxygen's default options
- * to the configuration object
- */
- void create();
-
- /*! Append user start comment
- */
- void appendStartComment(const QCString &u)
- {
- m_startComment += u;
- }
- /*! Append user comment
- */
- void appendUserComment(const QCString &u)
- {
- m_userComment += u;
- }
- /*! Take the user start comment and reset it internally
- * \returns user start comment
- */
- QCString takeStartComment()
- {
- QCString result=m_startComment;
- m_startComment.resize(0);
- return result.replace(QRegExp("\r"),"");
- }
- /*! Take the user comment and reset it internally
- * \returns user comment
- */
- QCString takeUserComment()
- {
- QCString result=m_userComment;
- m_userComment.resize(0);
- return result.replace(QRegExp("\r"),"");
- }
-
- protected:
-
- Config()
- {
- m_options = new QList<ConfigOption>;
- m_obsolete = new QList<ConfigOption>;
- m_disabled = new QList<ConfigOption>;
- m_dict = new QDict<ConfigOption>(257);
- m_options->setAutoDelete(TRUE);
- m_obsolete->setAutoDelete(TRUE);
- m_disabled->setAutoDelete(TRUE);
- m_initialized = FALSE;
- create();
- }
- ~Config()
- {
- delete m_options;
- delete m_obsolete;
- delete m_disabled;
- delete m_dict;
- }
-
- private:
- void checkFileName(const char *);
- QList<ConfigOption> *m_options;
- QList<ConfigOption> *m_obsolete;
- QList<ConfigOption> *m_disabled;
- QDict<ConfigOption> *m_dict;
- static Config *m_instance;
- QCString m_startComment;
- QCString m_userComment;
- bool m_initialized;
- QCString m_header;
-};
+ /*! Initialize configuration variables to their default value */
+ void init();
+
+ /*! Writes a template configuration to stream \a t. If \a shortList
+ * is \c TRUE the description of each configuration option will
+ * be omitted.
+ */
+ void writeTemplate(FTextStream &t,bool shortList,bool updateOnly=FALSE);
+
+ /*! Parses a configuration file with name \a fn.
+ * \returns TRUE if successful, FALSE if the file could not be
+ * opened or read.
+ */
+ bool parse(const char *fileName,bool update=FALSE);
+
+ /*! Post processed the parsed data. Replaces raw string values by the actual values.
+ * and replaces environment variables.
+ * \param clearHeaderAndFooter set to TRUE when writing header and footer templates.
+ */
+ void postProcess(bool clearHeaderAndFooter);
+
+ /*! Check the validity of the parsed options and correct or warn the user where needed. */
+ void checkAndCorrect();
+
+ /*! Clean up any data */
+ void deinit();
+}
#endif