summaryrefslogblamecommitdiffstatshomepage
path: root/src/lib/netlist/plib/poptions.h
blob: 491ac0b4d91bfd27156c559cc9435d6760494fca (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12











                               

                    
                  
 
                



                                                                            
              
 
                 

       












                                                                  
                        
 









                                                                    
                          










                                                                                                
                  


                                                                 

                                               
                                                       










                                                       
        

                        
                            
                         

  
                                

       

                                                                                                

          


                                               
                                                            
 



                      
                                      

       
                                                                                                                     
                                                                  
                                           
         
         
 
                                               
                                                               
 


                                                            

                      
                                     

  
                                 

       

                                                                                 

          


                                            
                                                            
 



                   
                                   

       

                                                                                                  

          


                                              
                                                            
 



                     






                                                                                              


                                            

                                                            



                   






                                                                                


                                                            
                                                            
 



                                   
             


       
                  
                                      


                   
                                               


                                                        
                                                                   
 


                                       

                                                                                      
 

                                          
 
                                          


                      
 

                        
// license:GPL-2.0+
// copyright-holders:Couriersud
/*
 * poptions.h
 *
 */

#pragma once

#ifndef POPTIONS_H_
#define POPTIONS_H_

#include "pstring.h"
#include "plists.h"
#include "putil.h"

namespace plib {
/***************************************************************************
    Options
***************************************************************************/

class options;

class option_base
{
public:
	option_base(options &parent, pstring help);
	virtual ~option_base();

	pstring help() { return m_help; }
private:
	pstring m_help;
};

class option_group : public option_base
{
public:
	option_group(options &parent, pstring group, pstring help)
	: option_base(parent, help), m_group(group) { }
	~option_group();

	pstring group() { return m_group; }
private:
	pstring m_group;
};

class option_example : public option_base
{
public:
	option_example(options &parent, pstring group, pstring help)
	: option_base(parent, help), m_example(group) { }
	~option_example();

	pstring example() { return m_example; }
private:
	pstring m_example;
};


class option : public option_base
{
public:
	option(options &parent, pstring ashort, pstring along, pstring help, bool has_argument);
	~option();

	/* no_argument options will be called with "" argument */

	pstring short_opt() { return m_short; }
	pstring long_opt() { return m_long; }
	bool has_argument() { return m_has_argument ; }
	bool was_specified() { return m_specified; }

	int do_parse(const pstring &argument)
	{
		m_specified = true;
		return parse(argument);
	}

protected:
	virtual int parse(const pstring &argument) = 0;

private:
	pstring m_short;
	pstring m_long;
	bool m_has_argument;
	bool m_specified;
};

class option_str : public option
{
public:
	option_str(options &parent, pstring ashort, pstring along, pstring defval, pstring help)
	: option(parent, ashort, along, help, true), m_val(defval)
	{}

	pstring operator ()() { return m_val; }

protected:
	virtual int parse(const pstring &argument) override;

private:
	pstring m_val;
};

class option_str_limit : public option
{
public:
	option_str_limit(options &parent, pstring ashort, pstring along, pstring defval, pstring limit, pstring help)
	: option(parent, ashort, along, help, true), m_val(defval)
	, m_limit(plib::psplit(limit, ":"))
	{
	}

	pstring operator ()() { return m_val; }
	const std::vector<pstring> &limit() { return m_limit; }

protected:
	virtual int parse(const pstring &argument) override;

private:
	pstring m_val;
	std::vector<pstring> m_limit;
};

class option_bool : public option
{
public:
	option_bool(options &parent, pstring ashort, pstring along, pstring help)
	: option(parent, ashort, along, help, false), m_val(false)
	{}

	bool operator ()() { return m_val; }

protected:
	virtual int parse(const pstring &argument) override;

private:
	bool m_val;
};

class option_double : public option
{
public:
	option_double(options &parent, pstring ashort, pstring along, double defval, pstring help)
	: option(parent, ashort, along, help, true), m_val(defval)
	{}

	double operator ()() { return m_val; }

protected:
	virtual int parse(const pstring &argument) override;

private:
	double m_val;
};

class option_long : public option
{
public:
	option_long(options &parent, pstring ashort, pstring along, long defval, pstring help)
	: option(parent, ashort, along, help, true), m_val(defval)
	{}

	long operator ()() { return m_val; }

protected:
	virtual int parse(const pstring &argument) override;

private:
	long m_val;
};

class option_vec : public option
{
public:
	option_vec(options &parent, pstring ashort, pstring along, pstring help)
	: option(parent, ashort, along, help, true)
	{}

	std::vector<pstring> operator ()() { return m_val; }

protected:
	virtual int parse(const pstring &argument) override;

private:
	std::vector<pstring> m_val;
};

class options
{
public:

	options();
	explicit options(option *o[]);

	~options();

	void register_option(option_base *opt);
	int parse(int argc, char *argv[]);

	pstring help(pstring description, pstring usage,
			unsigned width = 72, unsigned indent = 20);

	pstring app() { return m_app; }

private:
	static pstring split_paragraphs(pstring text, unsigned width, unsigned indent,
			unsigned firstline_indent);

	option *getopt_short(pstring arg);
	option *getopt_long(pstring arg);

	std::vector<option_base *> m_opts;
	pstring m_app;
};

}

#endif /* POPTIONS_H_ */