Jpp 21.0.0-rc.3
the software that should make you happy
Loading...
Searching...
No Matches
JPARSER::JParser< JKey_t > Class Template Reference

Utility class to parse command line options. More...

#include <JParser.hh>

Inheritance diagram for JPARSER::JParser< JKey_t >:
std::map< char, JParserElement > JEEP::JMessage< T >

Public Types

typedef JLANG::JParserException JParserException
 
typedef JKey_t key_type
 
typedef std::map< key_type, JParserElementmap_type
 
typedef map_type::iterator iterator
 
typedef map_type::const_iterator const_iterator
 

Public Member Functions

 JParser (const int debug=0)
 Default constructor.
 
 JParser (const std::string &message, const int debug=0)
 Constructor.
 
JParserjoin (const JParser &parser)
 Join parser.
 
void print (std::ostream &out) const
 Print the possible command line options.
 
virtual void terminate (const int status)
 Terminate.
 
JArgs operator() (const int argc, const char *const argv[])
 Parse the program's command line options.
 
JArgs operator() (const JArgs &args)
 Parse the program's command line options.
 
int read (const int argc, const char *const argv[])
 Parse the program's command line options.
 
int read (const JArgs &args)
 Parse the program's command line options.
 
std::ostream & write (std::ostream &out) const
 Print the current parameter values.
 

Static Public Attributes

static int debug = 0
 debug level (default is off).
 

Protected Member Functions

void check_status () const
 Check if all required options have been set.
 

Protected Attributes

std::string help
 help message
 
std::string pid
 process name
 

Friends

std::ostream & operator<< (std::ostream &out, const JParser< key_type > &parser)
 Stream output.
 

Detailed Description

template<class JKey_t = char>
class JPARSER::JParser< JKey_t >

Utility class to parse command line options.

The mapping between a parameter (of any type) and a unique option has to be defined in the user's application, e.g.

#include "Jeep/JParser.hh"
int main(int argc, char**argv)
{
int aap;
bool noot;
bool mies;
try {
zap['i'] = make_field(aap) = 123; // set default value
zap['b'] = make_field(noot); // default is false
zap['B'] = make_field(mies);
zap(argc, argv);
}
catch(const std::exception& error) {
cerr << error.what() << endl;
return 1;
}
}
Utility class to parse command line options.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition JParser.hh:2107
Utility class to parse command line options.
Definition JParser.hh:1664

The behaviour of the parser is different for parameters of type bool. By default, its value is set to false; it is set to true when the corresponding option is parsed. This implies that no data are read and that several options can be parsed in sequence without repeating the '-' symbol.

The syntax for the command line is:

program [-<option> <value> [-<option> <value>]]
program -h 

will print the usage specification including all existing options.

program --!

will terminate the parsing of options and print the actual setting of all options.

After the command line has been parsed, it is checked whether each parameter has been assigned a value by default or at run time. If not, an exception is thrown.

For a comparison between the parsing of command line options with JParser and boost, see internal note which is accessible for anyone with a KM3NeT account.

Definition at line 1661 of file JParser.hh.

Member Typedef Documentation

◆ JParserException

template<class JKey_t = char>
JLANG::JParserException JPARSER::JParser< JKey_t >::JParserException

Definition at line 1667 of file JParser.hh.

◆ key_type

template<class JKey_t = char>
JKey_t JPARSER::JParser< JKey_t >::key_type

Definition at line 1668 of file JParser.hh.

◆ map_type

template<class JKey_t = char>
std::map<key_type, JParserElement> JPARSER::JParser< JKey_t >::map_type

Definition at line 1669 of file JParser.hh.

◆ iterator

template<class JKey_t = char>
map_type::iterator JPARSER::JParser< JKey_t >::iterator

Definition at line 1671 of file JParser.hh.

◆ const_iterator

template<class JKey_t = char>
map_type::const_iterator JPARSER::JParser< JKey_t >::const_iterator

Definition at line 1672 of file JParser.hh.

Constructor & Destructor Documentation

◆ JParser() [1/2]

template<class JKey_t = char>
JPARSER::JParser< JKey_t >::JParser ( const int debug = 0)
inline

Default constructor.

Parameters
debugdebug level

Definition at line 1682 of file JParser.hh.

1682 :
1683 help ()
1684 {
1685 this->debug = debug;
1686 }
std::string help
help message
Definition JParser.hh:2029
static int debug
debug level (default is off).
Definition JMessage.hh:45

◆ JParser() [2/2]

template<class JKey_t = char>
JPARSER::JParser< JKey_t >::JParser ( const std::string & message,
const int debug = 0 )
inline

Constructor.

Parameters
messagemessage printed with option -h
debugdebug level

Definition at line 1695 of file JParser.hh.

1696 :
1697 help (message)
1698 {
1699 this->debug = debug;
1700 }

Member Function Documentation

◆ join()

template<class JKey_t = char>
JParser & JPARSER::JParser< JKey_t >::join ( const JParser< JKey_t > & parser)
inline

Join parser.

Parameters
parserparser
Returns
this parser

Definition at line 1709 of file JParser.hh.

1710 {
1711 this->insert(parser.begin(), parser.end());
1712
1713 return *this;
1714 }

◆ print()

template<class JKey_t = char>
void JPARSER::JParser< JKey_t >::print ( std::ostream & out) const
inline

Print the possible command line options.

Parameters
outoutput stream

Definition at line 1722 of file JParser.hh.

1723 {
1724 using namespace std;
1725 using namespace JPP;
1726
1727 if (help != "") {
1728 out << help << endl;
1729 }
1730
1731 out << "usage: " << getFilename(pid) << endl;
1732
1733 out << ' ' << START_OF_OPTION << HELP_OPTION << ' ' << " \"help\"" << endl;
1734 out << ' ' << START_OF_OPTION << HELP_OPTION << PRINT_OPTION << " \"help with print of default and possible values\"" << endl;
1735 out << ' ' << START_OF_OPTION << REVISION_OPTION << ' ' << " \"print revision\"" << endl;
1736 out << ' ' << START_OF_OPTION << END_OF_OPTIONS << ' ' << " \"end of options; remainder will be discarded\"" << endl;
1737 out << ' ' << START_OF_OPTION << END_OF_OPTIONS << PRINT_OPTION << " \"end of options with print of actual values\"" << endl;
1738
1739 for (const_iterator i = this->begin(); i != this->end(); ++i) {
1740
1741 out << ' ' << START_OF_OPTION << i->first << " ";
1742
1743 i->second.print(out);
1744
1745 out << endl;
1746 }
1747
1748 if (getURL() != "") {
1749 out << endl << "See also: " << getURL() << '#' << getFilename(pid) << endl;
1750 }
1751 }
std::string pid
process name
Definition JParser.hh:2030
map_type::const_iterator const_iterator
Definition JParser.hh:1672
std::string getURL()
Get URL of document pages.
static char END_OF_OPTIONS
end of all options
Definition JParser.hh:79
static char REVISION_OPTION
revision option
Definition JParser.hh:81
static char START_OF_OPTION
Parser options.
Definition JParser.hh:78
static char HELP_OPTION
help option
Definition JParser.hh:80
static char PRINT_OPTION
print option
Definition JParser.hh:82
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).

◆ terminate()

template<class JKey_t = char>
virtual void JPARSER::JParser< JKey_t >::terminate ( const int status)
inlinevirtual

Terminate.

Parameters
statusexit status

Definition at line 1759 of file JParser.hh.

1760 {
1761 exit(status);
1762 }

◆ operator()() [1/2]

template<class JKey_t = char>
JArgs JPARSER::JParser< JKey_t >::operator() ( const int argc,
const char *const argv[] )
inline

Parse the program's command line options.

Parameters
argcnumber of arguments
argvargument list
Returns
argument list

Definition at line 1772 of file JParser.hh.

1773 {
1774 return (*this)(JArgs(argc, argv));
1775 }
Data structure to store command line arguments.
Definition JArgs.hh:26

◆ operator()() [2/2]

template<class JKey_t = char>
JArgs JPARSER::JParser< JKey_t >::operator() ( const JArgs & args)
inline

Parse the program's command line options.

Parameters
argsargument list
Returns
argument list

Definition at line 1784 of file JParser.hh.

1785 {
1786 using namespace std;
1787 using namespace JLANG;
1788 using namespace JEEP;
1789
1790 pid = args.PID;
1791
1792 istringstream is;
1793
1794 // argument passing
1795
1796 for (JArgs::const_iterator i = args.begin(); i != args.end(); ++i) {
1797
1798 DEBUG("Processing option <" << *i << ">" << endl);
1799
1800 is.clear();
1801 is.str(*i);
1802
1803 for (int c; (c = is.get()) != EOF; ) {
1804
1805 if (c == START_OF_OPTION) {
1806
1807 if (is.peek() == EOF) { // end-of-file
1808
1809 THROW(JParserException, "stray " << START_OF_OPTION << " in <" << is.str() << "> at " << JArgs("", i, args.end()));
1810
1811 } else if (isspace(is.peek())) { // white space
1812
1813 THROW(JParserException, "stray " << START_OF_OPTION << " in <" << is.str() << "> at " << JArgs("", i, args.end()));;
1814 }
1815
1816 while (is.peek() != EOF) { // read option(s)
1817
1818 if (is.peek() == HELP_OPTION) { // help
1819
1820 is.get();
1821
1822 setPrintOption(cout, SHORT_PRINT);
1823
1824 if (is.peek() != EOF) {
1825
1826 if (is.get() == PRINT_OPTION) {
1827
1828 setPrintOption(cout, LONG_PRINT);
1829
1830 } else {
1831
1832 THROW(JParserException, "invalid option at <" << is.str() << ">");
1833 }
1834 }
1835
1836 print(cout);
1837
1839
1840 return JArgs();
1841
1842 } else if (is.peek() == REVISION_OPTION) { // revision
1843
1844 cout << "source: " << getSource() << endl;
1845 cout << "version: " << getGITVersion() << endl;
1846 cout << "commit: " << getGITCommit() << endl;
1847 cout << "date: " << getGITDate() << endl;
1848 cout << "namespace: " << getNamespace() << endl;
1849
1851
1852 return JArgs();
1853
1854 } else if (is.peek() == END_OF_OPTIONS) { // end of options
1855
1856 is.get();
1857
1858 if (is.peek() != EOF) {
1859
1860 c = is.get();
1861
1862 if (c == PRINT_OPTION) {
1863
1864 setPrintOption(cout, MEDIUM_PRINT);
1865
1866 print(cout);
1867
1868 } else if (c == PID_OPTION) {
1869
1870 if (is.peek() == EOF && i + 1 != args.end()) {
1871 is.clear();
1872 is.str(*++i);
1873 }
1874
1875 string file_name;
1876
1877 getline(is, file_name);
1878
1879 ofstream out(file_name.c_str());
1880
1881 out << getpid() << endl;
1882
1883 if (!out) {
1884 THROW(JParserException, "invalid option at <" << is.str() << ">");
1885 }
1886
1887 out.close();
1888
1889 } else {
1890
1891 THROW(JParserException, "invalid option at <" << is.str() << ">");
1892 }
1893 }
1894
1895 check_status();
1896
1897 return JArgs(pid, ++i, args.end());
1898
1899 } else {
1900
1901 key_type option;
1902
1903 is >> option;
1904
1905 iterator p = this->find(option);
1906
1907 DEBUG("Processing option <" << option << "> " << (p != this->end()) << endl);
1908
1909 if (p != this->end()) {
1910
1911 if (p->second->gcount()) {
1912
1913 if (is.peek() == EOF && i + 1 != args.end()) {
1914 is.clear();
1915 is.str(*++i);
1916 }
1917 }
1918
1919 try {
1920 is >> p->second;
1921 }
1922 catch(const exception& error) {
1923 THROW(JParserException, "read error " << error.what() << " at <" << is.str() << ">");
1924 }
1925
1926 if (fail(is)) {
1927 THROW(JParserException, "read error at <" << is.str() << ">");
1928 }
1929
1930 } else {
1931
1932 THROW(JParserException, "unknown option <" << is.str() << "> at " << JArgs("", i, args.end()));
1933 }
1934 }
1935 }
1936
1937 } else {
1938
1939 THROW(JParserException, "illegal character <" << (char) c << "> at " << JArgs("", i, args.end()));
1940 }
1941 }
1942 }
1943
1944 check_status();
1945
1946 return JArgs();
1947 }
#define THROW(JException_t, A)
Marco for throwing exception with std::ostream compatible message.
void setPrintOption(std::ostream &out, const int option)
Set print option.
Definition JManip.hh:63
#define DEBUG(A)
Message macros.
Definition JMessage.hh:62
Exception when parsing a value.
virtual void terminate(const int status)
Terminate.
Definition JParser.hh:1759
void print(std::ostream &out) const
Print the possible command line options.
Definition JParser.hh:1722
void check_status() const
Check if all required options have been set.
Definition JParser.hh:2015
General puprpose classes and methods.
std::string getGITVersion(const std::string &tag)
Get GIT version for given GIT tag.
Auxiliary classes and methods for language specific functionality.
std::istream & getline(std::istream &in, JString &object)
Read string from input stream until end of line.
Definition JString.hh:478
const char * getGITDate()
Get GIT date.
Definition Jpp.cc:39
const char * getSource()
Get source.
Definition Jpp.hh:89
const char * getGITCommit()
Get GIT commit.
Definition Jpp.cc:24
bool fail(std::istream &in)
Check for stream state.
Definition JParser.hh:96
static int NORMAL_EXIT_CODE
exit code of normal end
Definition JParser.hh:84
static char PID_OPTION
print PID to file
Definition JParser.hh:83

◆ read() [1/2]

template<class JKey_t = char>
int JPARSER::JParser< JKey_t >::read ( const int argc,
const char *const argv[] )
inline

Parse the program's command line options.


This method is maintained for backward compatibility and will be deprecated.

Parameters
argcnumber of arguments
argvargument list
Returns
0

Definition at line 1958 of file JParser.hh.

1959 {
1960 (*this)(argc, argv);
1961
1962 return 0;
1963 }

◆ read() [2/2]

template<class JKey_t = char>
int JPARSER::JParser< JKey_t >::read ( const JArgs & args)
inline

Parse the program's command line options.


This method is maintained for backward compatibility and will be deprecated.

Parameters
argsargument list
Returns
0

Definition at line 1973 of file JParser.hh.

1974 {
1975 (*this)(args);
1976
1977 return 0;
1978 }

◆ write()

template<class JKey_t = char>
std::ostream & JPARSER::JParser< JKey_t >::write ( std::ostream & out) const
inline

Print the current parameter values.

Parameters
outoutput stream
Returns
output stream

Definition at line 1987 of file JParser.hh.

1988 {
1989 for (const_iterator i = this->begin(); i != this->end(); ++i) {
1990 out << i->second->getName() << '=' << i->second << std::endl;
1991 }
1992
1993 return out;
1994 }

◆ check_status()

template<class JKey_t = char>
void JPARSER::JParser< JKey_t >::check_status ( ) const
inlineprotected

Check if all required options have been set.


This method throws an exception in case of a non-compliance.

Definition at line 2015 of file JParser.hh.

2016 {
2017 for (const_iterator p = this->begin(); p != this->end(); ++p) {
2018
2019 if (!p->second->getInitialisationStatus()) {
2020 THROW(JParserException, pid << " option: " << START_OF_OPTION << p->first << " <" << p->second->getName() << ">" << " has no value");
2021 }
2022
2023 if (!p->second->getStatus()) {
2024 THROW(JParserException, pid << " option: " << START_OF_OPTION << p->first << " <" << p->second->getName() << ">" << " has illegal value");
2025 }
2026 }
2027 }
JLANG::JParserException JParserException
Definition JParser.hh:1667

Friends And Related Symbol Documentation

◆ operator<<

template<class JKey_t = char>
std::ostream & operator<< ( std::ostream & out,
const JParser< key_type > & parser )
friend

Stream output.

Parameters
outoutput stream
parserparser
Returns
output stream

Definition at line 2004 of file JParser.hh.

2005 {
2006 return parser.write(out);
2007 }
std::ostream & write(std::ostream &out) const
Print the current parameter values.
Definition JParser.hh:1987

Member Data Documentation

◆ help

template<class JKey_t = char>
std::string JPARSER::JParser< JKey_t >::help
protected

help message

Definition at line 2029 of file JParser.hh.

◆ pid

template<class JKey_t = char>
std::string JPARSER::JParser< JKey_t >::pid
protected

process name

Definition at line 2030 of file JParser.hh.

◆ debug

template<class T >
int JEEP::JMessage< T >::debug = 0
staticinherited

debug level (default is off).

Definition at line 45 of file JMessage.hh.


The documentation for this class was generated from the following file: