application.hpp revision 275988
1// Copyright (c) 2007 The NetBSD Foundation, Inc.
2// All rights reserved.
3//
4// Redistribution and use in source and binary forms, with or without
5// modification, are permitted provided that the following conditions
6// are met:
7// 1. Redistributions of source code must retain the above copyright
8//    notice, this list of conditions and the following disclaimer.
9// 2. Redistributions in binary form must reproduce the above copyright
10//    notice, this list of conditions and the following disclaimer in the
11//    documentation and/or other materials provided with the distribution.
12//
13// THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
14// CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
15// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
16// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
17// IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY
18// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
20// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
21// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
22// IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
23// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
24// IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25
26#if !defined(ATF_CXX_DETAIL_APPLICATION_HPP)
27#define ATF_CXX_DETAIL_APPLICATION_HPP
28
29#include <ostream>
30#include <set>
31#include <stdexcept>
32#include <string>
33
34namespace atf {
35namespace application {
36
37// ------------------------------------------------------------------------
38// The "usage_error" class.
39// ------------------------------------------------------------------------
40
41class usage_error : public std::runtime_error {
42    char m_text[4096];
43
44public:
45    usage_error(const char*, ...) throw();
46    ~usage_error(void) throw();
47
48    const char* what(void) const throw();
49};
50
51// ------------------------------------------------------------------------
52// The "option" class.
53// ------------------------------------------------------------------------
54
55class option {
56    char m_character;
57    std::string m_argument;
58    std::string m_description;
59
60    friend class app;
61
62public:
63    option(char, const std::string&, const std::string&);
64
65    bool operator<(const option&) const;
66};
67
68// ------------------------------------------------------------------------
69// The "app" class.
70// ------------------------------------------------------------------------
71
72class app {
73    void process_options(void);
74    void usage(std::ostream&);
75
76    bool inited(void);
77
78protected:
79    typedef std::set< option > options_set;
80
81    int m_argc;
82    char* const* m_argv;
83
84    const char* m_argv0;
85    const char* m_prog_name;
86    std::string m_description;
87    std::string m_manpage;
88
89    options_set options(void);
90
91    // To be redefined.
92    virtual std::string specific_args(void) const;
93    virtual options_set specific_options(void) const;
94    virtual void process_option(int, const char*);
95    virtual int main(void) = 0;
96
97public:
98    app(const std::string&, const std::string&);
99    virtual ~app(void);
100
101    int run(int, char* const*);
102};
103
104} // namespace application
105} // namespace atf
106
107#endif // !defined(ATF_CXX_DETAIL_APPLICATION_HPP)
108