// // Configuration.h // // NAME // // reads the configuration file and manages it in memory. // // SYNOPSIS // // #include // // Configuration config; // // ConfigDefault config_defaults = { // { "verbose", "true" }, // { 0, 0 } // }; // // config.Defaults(config_defaults); // // config.Read("~/.myconfig") ; // // config.Add("sync", "false"); // // if(config["sync"]) ... // if(config.Value("rate") < 50) ... // if(config.Boolean("sync")) ... // // DESCRIPTION // // The primary purpose of the Configuration class is to parse // a configuration file and allow the application to modify the internal // data structure. All values are strings and are converted by the // appropriate accessors. For instance the Boolean method will // return numerical true (not zero) if the string either contains // a number that is different from zero or the string true. // // The ConfigDefaults type is a structure of two char pointers: // the name of the configuration attribute and it's value. The end of // the array is the first entry that contains a null pointer instead of // the attribute name. Numerical // values must be in strings. For instance: //
// ConfigDefault* config_defaults = {
//   { "wordlist_compress", "true" },
//   { "wordlist_page_size", "8192" },
//   { 0, 0 }
// };
// 
// Returns the configuration (object of type Configuration) // built if a file was found or config_defaults // provided, 0 otherwise. // The additional // fields of the ConfigDefault are purely informative. // // FILE FORMAT // // This configuration file is a plain ASCII text file. Each line in // the file is either a comment or contains an attribute. // Comment lines are blank lines or lines that start with a '#'. // Attributes consist of a variable name and an associated // value: // //
// <name>:<whitespace><value><newline>
// 
// // The <name> contains any alphanumeric character or // underline (_) The <value> can include any character // except newline. It also cannot start with spaces or tabs since // those are considered part of the whitespace after the colon. It // is important to keep in mind that any trailing spaces or tabs // will be included. // // It is possible to split the <value> across several // lines of the configuration file by ending each line with a // backslash (\). The effect on the value is that a space is // added where the line split occurs. // // A configuration file can include another file, by using the special // <name>, include. The <value> is taken as // the file name of another configuration file to be read in at // this point. If the given file name is not fully qualified, it is // taken relative to the directory in which the current configuration // file is found. Variable expansion is permitted in the file name. // Multiple include statements, and nested includes are also permitted. // //
// include: common.conf
// 
// // // END // // Part of the ht://Dig package // Copyright (c) 1999-2004 The ht://Dig Group // For copyright details, see the file COPYING in your distribution // or the GNU Library General Public License (LGPL) version 2 or later // // // $Id: Configuration.h,v 1.11 2004/05/28 13:15:20 lha Exp $ // #ifndef _Configuration_h_ #define _Configuration_h_ #include "Dictionary.h" #include "htString.h" struct ConfigDefaults { char *name; // Name of the attribute char *value; // Default value char *type; // Type of the value (string, integer, boolean) char *programs; // Whitespace separated list of programs/modules using this attribute char *block; // Configuration block this can be used in (can be blank) char *version; // Version that introduced the attribute char *category; // Attribute category (to split documentation) char *example; // Example usage of the attribute (HTML) char *description; // Long description of the attribute (HTML) }; class Configuration : public Object { public: //- // Constructor // Configuration(); #ifndef SWIG Configuration(const Configuration& config) : dcGlobalVars(config.dcGlobalVars), separators(config.separators) { allow_multiple = config.allow_multiple; } #endif /* SWIG */ //- // Destructor // ~Configuration() {} // // Adding and deleting items to and from the Configuration // #ifndef SWIG //- // Add configuration item str to the configuration. The value // associated with it is undefined. // void Add(const String& str); #endif /* SWIG */ //- // Add configuration item name to the configuration and associate // it with value. // void Add(const String& name, const String& value); void AddParsed(const String& name, const String& value); //- // Remove the name from the configuration. // int Remove(const String& name); //- // Let the Configuration know how to parse name value pairs. // Each character of string s is a valid separator between // the name and the value. // void NameValueSeparators(const String& s); //- // Read name/value configuration pairs from the file filename. // virtual int Read(const String& filename); //- // Return the value of configuration attribute name as a // String. // const String Find(const String& name) const; //- // Return 1 if the value of configuration attribute name has // been set, 0 otherwise int Exists(const String& name) const; #ifndef SWIG //- // Alias to the Find method. // const String operator[](const String& name) const; #endif /* SWIG */ //- // Return the value associated with the configuration attribute // name, converted to integer using the atoi(3) function. // If the attribute is not found in the configuration and // a default_value is provided, return it. // int Value(const String& name, int default_value = 0) const; //- // Return the value associated with the configuration attribute // name, converted to double using the atof(3) function. // If the attribute is not found in the configuration and // a default_value is provided, return it. // double Double(const String& name, double default_value = 0) const; //- // Return 1 if the value associated to name is // either 1, yes or true. // Return 0 if the value associated to name is // either 0, no or false. // int Boolean(const String& name, int default_value = 0) const; Object *Get_Object(char *name); //- // Load configuration attributes from the name and value // members of the array argument. // void Defaults(const ConfigDefaults *array); protected: Dictionary dcGlobalVars; String separators; int allow_multiple; }; #endif