111be35a1SLionel Sambuc // 211be35a1SLionel Sambuc // Automated Testing Framework (atf) 311be35a1SLionel Sambuc // 411be35a1SLionel Sambuc // Copyright (c) 2007 The NetBSD Foundation, Inc. 511be35a1SLionel Sambuc // All rights reserved. 611be35a1SLionel Sambuc // 711be35a1SLionel Sambuc // Redistribution and use in source and binary forms, with or without 811be35a1SLionel Sambuc // modification, are permitted provided that the following conditions 911be35a1SLionel Sambuc // are met: 1011be35a1SLionel Sambuc // 1. Redistributions of source code must retain the above copyright 1111be35a1SLionel Sambuc // notice, this list of conditions and the following disclaimer. 1211be35a1SLionel Sambuc // 2. Redistributions in binary form must reproduce the above copyright 1311be35a1SLionel Sambuc // notice, this list of conditions and the following disclaimer in the 1411be35a1SLionel Sambuc // documentation and/or other materials provided with the distribution. 1511be35a1SLionel Sambuc // 1611be35a1SLionel Sambuc // THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND 1711be35a1SLionel Sambuc // CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, 1811be35a1SLionel Sambuc // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 1911be35a1SLionel Sambuc // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 2011be35a1SLionel Sambuc // IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY 2111be35a1SLionel Sambuc // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2211be35a1SLionel Sambuc // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 2311be35a1SLionel Sambuc // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 2411be35a1SLionel Sambuc // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER 2511be35a1SLionel Sambuc // IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 2611be35a1SLionel Sambuc // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 2711be35a1SLionel Sambuc // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2811be35a1SLionel Sambuc // 2911be35a1SLionel Sambuc 3011be35a1SLionel Sambuc #if !defined(_ATF_CXX_APPLICATION_HPP_) 3111be35a1SLionel Sambuc #define _ATF_CXX_APPLICATION_HPP_ 3211be35a1SLionel Sambuc 3311be35a1SLionel Sambuc #include <ostream> 3411be35a1SLionel Sambuc #include <set> 3511be35a1SLionel Sambuc #include <stdexcept> 3611be35a1SLionel Sambuc #include <string> 3711be35a1SLionel Sambuc 3811be35a1SLionel Sambuc namespace atf { 3911be35a1SLionel Sambuc namespace application { 4011be35a1SLionel Sambuc 4111be35a1SLionel Sambuc // ------------------------------------------------------------------------ 4211be35a1SLionel Sambuc // The "usage_error" class. 4311be35a1SLionel Sambuc // ------------------------------------------------------------------------ 4411be35a1SLionel Sambuc 4511be35a1SLionel Sambuc class usage_error : public std::runtime_error { 4611be35a1SLionel Sambuc char m_text[4096]; 4711be35a1SLionel Sambuc 4811be35a1SLionel Sambuc public: 4911be35a1SLionel Sambuc usage_error(const char*, ...) throw(); 5011be35a1SLionel Sambuc ~usage_error(void) throw(); 5111be35a1SLionel Sambuc 5211be35a1SLionel Sambuc const char* what(void) const throw(); 5311be35a1SLionel Sambuc }; 5411be35a1SLionel Sambuc 5511be35a1SLionel Sambuc // ------------------------------------------------------------------------ 5611be35a1SLionel Sambuc // The "option" class. 5711be35a1SLionel Sambuc // ------------------------------------------------------------------------ 5811be35a1SLionel Sambuc 5911be35a1SLionel Sambuc class option { 6011be35a1SLionel Sambuc char m_character; 6111be35a1SLionel Sambuc std::string m_argument; 6211be35a1SLionel Sambuc std::string m_description; 6311be35a1SLionel Sambuc 6411be35a1SLionel Sambuc friend class app; 6511be35a1SLionel Sambuc 6611be35a1SLionel Sambuc public: 6711be35a1SLionel Sambuc option(char, const std::string&, const std::string&); 6811be35a1SLionel Sambuc 6911be35a1SLionel Sambuc bool operator<(const option&) const; 7011be35a1SLionel Sambuc }; 7111be35a1SLionel Sambuc 7211be35a1SLionel Sambuc // ------------------------------------------------------------------------ 7311be35a1SLionel Sambuc // The "app" class. 7411be35a1SLionel Sambuc // ------------------------------------------------------------------------ 7511be35a1SLionel Sambuc 7611be35a1SLionel Sambuc class app { 7711be35a1SLionel Sambuc void process_options(void); 7811be35a1SLionel Sambuc void usage(std::ostream&); 7911be35a1SLionel Sambuc 8011be35a1SLionel Sambuc bool inited(void); 8111be35a1SLionel Sambuc 8211be35a1SLionel Sambuc protected: 8311be35a1SLionel Sambuc typedef std::set< option > options_set; 8411be35a1SLionel Sambuc 8511be35a1SLionel Sambuc int m_argc; 8611be35a1SLionel Sambuc char* const* m_argv; 8711be35a1SLionel Sambuc 8811be35a1SLionel Sambuc const char* m_argv0; 8911be35a1SLionel Sambuc const char* m_prog_name; 9011be35a1SLionel Sambuc std::string m_description; 91*0a6a1f1dSLionel Sambuc std::string m_manpage; 9211be35a1SLionel Sambuc 9311be35a1SLionel Sambuc options_set options(void); 9411be35a1SLionel Sambuc 9511be35a1SLionel Sambuc // To be redefined. 9611be35a1SLionel Sambuc virtual std::string specific_args(void) const; 9711be35a1SLionel Sambuc virtual options_set specific_options(void) const; 9811be35a1SLionel Sambuc virtual void process_option(int, const char*); 9911be35a1SLionel Sambuc virtual int main(void) = 0; 10011be35a1SLionel Sambuc 10111be35a1SLionel Sambuc public: 102*0a6a1f1dSLionel Sambuc app(const std::string&, const std::string&); 10311be35a1SLionel Sambuc virtual ~app(void); 10411be35a1SLionel Sambuc 10511be35a1SLionel Sambuc int run(int, char* const*); 10611be35a1SLionel Sambuc }; 10711be35a1SLionel Sambuc 10811be35a1SLionel Sambuc } // namespace application 10911be35a1SLionel Sambuc } // namespace atf 11011be35a1SLionel Sambuc 11111be35a1SLionel Sambuc #endif // !defined(_ATF_CXX_APPLICATION_HPP_) 112