- initial import of revision 374 from cnc
[apt.git] / apt-pkg / contrib / cmndline.h
1 // -*- mode: cpp; mode: fold -*-
2 // Description                                                          /*{{{*/
3 // $Id: cmndline.h,v 1.1 2002/07/23 17:54:51 niemeyer Exp $
4 /* ######################################################################
5
6    Command Line Class - Sophisticated command line parser
7    
8    This class provides a unified command line parser/option handliner/
9    configuration mechanism. It allows the caller to specify the option
10    set and map the option set into the configuration class or other
11    special functioning.
12    
13    Filenames are stripped from the option stream and put into their
14    own array.
15    
16    The argument descriptor array can be initialized as:
17    
18  CommandLine::Args Args[] = 
19  {{'q',"quiet","apt::get::quiet",CommandLine::IntLevel},
20   {0,0,0,0}};
21    
22    The flags mean,
23      HasArg - Means the argument has a value
24      IntLevel - Means the argument is an integer level indication, the
25                 following -qqqq (+3) -q5 (=5) -q=5 (=5) are valid
26      Boolean  - Means it is true/false or yes/no. 
27                 -d (true) --no-d (false) --yes-d (true)
28                 --long (true) --no-long (false) --yes-long (true)
29                 -d=yes (true) -d=no (false) Words like enable, disable,
30                 true false, yes no and on off are recognized in logical 
31                 places.
32      InvBoolean - Same as boolean but the case with no specified sense
33                   (first case) is set to false.
34      ConfigFile - Means this flag should be interprited as the name of 
35                   a config file to read in at this point in option processing.
36                   Implies HasArg.
37      ArbItem    - Means the item is an arbitary configuration string of
38                   the form item=value, where item is passed directly
39                   to the configuration class.
40    The default, if the flags are 0 is to use Boolean
41    
42    ##################################################################### */
43                                                                         /*}}}*/
44 #ifndef PKGLIB_CMNDLINE_H
45 #define PKGLIB_CMNDLINE_H
46
47 #ifdef __GNUG__
48 #pragma interface "apt-pkg/cmndline.h"
49 #endif 
50
51 #include <apt-pkg/configuration.h>
52
53 class CommandLine
54 {
55    public:
56    struct Args;
57    struct Dispatch;
58    
59    protected:
60    
61    Args *ArgList;
62    Configuration *Conf;
63    bool HandleOpt(int &I,int argc,const char *argv[],
64                   const char *&Opt,Args *A,bool PreceedeMatch = false);
65
66    public:
67    
68    enum AFlags 
69    {
70       HasArg = (1 << 0),
71       IntLevel = (1 << 1),
72       Boolean = (1 << 2),
73       InvBoolean = (1 << 3),
74       ConfigFile = (1 << 4) | HasArg,
75       ArbItem = (1 << 5) | HasArg
76    };
77
78    const char **FileList;
79    
80    bool Parse(int argc,const char **argv);
81    void ShowHelp();
82    unsigned int FileSize() const;
83    bool DispatchArg(Dispatch *List,bool NoMatch = true);
84       
85    CommandLine(Args *AList,Configuration *Conf);
86    ~CommandLine();
87 };
88
89 struct CommandLine::Args
90 {
91    char ShortOpt;
92    const char *LongOpt;
93    const char *ConfName;
94    unsigned long Flags;
95    
96    inline bool end() {return ShortOpt == 0 && LongOpt == 0;};
97    inline bool IsBoolean() {return Flags == 0 || (Flags & (Boolean|InvBoolean)) != 0;};
98 };
99
100 struct CommandLine::Dispatch
101 {
102    const char *Match;
103    bool (*Handler)(CommandLine &);
104 };
105
106 #endif