- initial import of revision 374 from cnc
[apt.git] / apt-pkg / contrib / configuration.h
1 // -*- mode: cpp; mode: fold -*-
2 // Description                                                          /*{{{*/
3 // $Id: configuration.h,v 1.2 2003/01/29 18:43:48 niemeyer Exp $
4 /* ######################################################################
5
6    Configuration Class
7    
8    This class provides a configuration file and command line parser
9    for a tree-oriented configuration environment. All runtime configuration
10    is stored in here.
11    
12    Each configuration name is given as a fully scoped string such as
13      Foo::Bar
14    And has associated with it a text string. The Configuration class only
15    provides storage and lookup for this tree, other classes provide
16    configuration file formats (and parsers/emitters if needed).
17
18    Most things can get by quite happily with,
19      cout << _config->Find("Foo::Bar") << endl;
20
21    A special extension, support for ordered lists is provided by using the
22    special syntax, "block::list::" the trailing :: designates the 
23    item as a list. To access the list you must use the tree function on
24    "block::list".
25    
26    ##################################################################### */
27                                                                         /*}}}*/
28 #ifndef PKGLIB_CONFIGURATION_H
29 #define PKGLIB_CONFIGURATION_H
30
31 #ifdef __GNUG__
32 #pragma interface "apt-pkg/configuration.h"
33 #endif 
34
35 #include <string>
36 #include <iostream>
37
38 using std::string;
39
40 class Configuration
41 {
42    public:
43    
44    struct Item
45    {
46       string Value;
47       string Tag;
48       Item *Parent;
49       Item *Child;
50       Item *Next;
51       
52       string FullTag(const Item *Stop = 0) const;
53       
54       Item() : Parent(0), Child(0), Next(0) {};
55    };
56    
57    private:
58    
59    Item *Root;
60    bool ToFree;
61    
62    Item *Lookup(Item *Head,const char *S,unsigned long Len,bool Create);
63    Item *Lookup(const char *Name,bool Create);   
64    inline const Item *Lookup(const char *Name) const
65    {
66       return ((Configuration *)this)->Lookup(Name,false);
67    }  
68
69    // CNC:2003-02-23 - Helper for copy constructor.
70    void CopyChildren(Item *From, Item *To);
71    
72    public:
73
74    string Find(const char *Name,const char *Default = 0) const;
75    string Find(string Name,const char *Default = 0) const {return Find(Name.c_str(),Default);};
76    string FindFile(const char *Name,const char *Default = 0) const;
77    string FindDir(const char *Name,const char *Default = 0) const;
78    int FindI(const char *Name,int Default = 0) const;
79    int FindI(string Name,int Default = 0) const {return FindI(Name.c_str(),Default);};
80    bool FindB(const char *Name,bool Default = false) const;
81    bool FindB(string Name,bool Default = false) const {return FindB(Name.c_str(),Default);};
82    string FindAny(const char *Name,const char *Default = 0) const;
83               
84    inline void Set(string Name,string Value) {Set(Name.c_str(),Value);};
85    void CndSet(const char *Name,string Value);
86    void Set(const char *Name,string Value);
87    void Set(const char *Name,int Value);   
88    
89    inline bool Exists(string Name) const {return Exists(Name.c_str());};
90    bool Exists(const char *Name) const;
91    bool ExistsAny(const char *Name) const;
92
93    void Clear(string Name);
94    
95    inline const Item *Tree(const char *Name) const {return Lookup(Name);};
96
97    inline void Dump() { Dump(std::clog); };
98    void Dump(std::ostream& str);
99
100    // CNC:2003-02-23 - Copy constructor.
101    Configuration(Configuration &Conf);
102
103    Configuration(const Item *Root);
104    Configuration();
105    ~Configuration();
106 };
107
108 extern Configuration *_config;
109
110 bool ReadConfigFile(Configuration &Conf,string FName,bool AsSectional = false,
111                     unsigned Depth = 0);
112
113 bool ReadConfigDir(Configuration &Conf,string Dir,bool AsSectional = false,
114                     unsigned Depth = 0);
115
116 #ifdef SWIG
117    struct Configuration::Item
118    {
119       string Value;
120       string Tag;
121       Item *Parent;
122       Item *Child;
123       Item *Next;
124       
125       string FullTag(const Item *Stop = 0) const;
126       
127       Item() : Parent(0), Child(0), Next(0) {};
128    };
129 #endif
130
131 #endif