pike.git / lib / modules / Arg.pmod

version» Context lines:

pike.git/lib/modules/Arg.pmod:1:   //   // Argument parser   // By Martin Nilsson - // $Id: Arg.pmod,v 1.5 2008/05/03 17:14:50 nilsson Exp $ + // $Id: Arg.pmod,v 1.6 2008/06/28 16:36:52 nilsson Exp $   //      #pike __REAL_VERSION__      class OptLibrary   {       //! Base class for parsing an argument. Inherit this class to create    //! custom made option types.    class Opt    {    constant is_opt = 1; -  static Opt next; +  protected Opt next;       //! Should return 1 for set options or a string containing the    //! value of the option. Returning 0 means the option was not set    //! (or matched). To properly chain arguments parsers, return    //! @expr{::get_value(argv, env)@} instead of @expr{0@}, unless    //! you want to explicitly stop the chain and not set this option.    int(0..1)|string get_value(array(string) argv, mapping(string:string) env)    {    if(next) return next->get_value(argv, env);    return 0;
pike.git/lib/modules/Arg.pmod:29:       //! Should return a list of options that are parsed. To properly    //! chain argument parsers, return @expr{your_opts +    //! ::get_opts()@}.    array(string) get_opts()    {    if(!next) return ({});    return next->get_opts();    }    -  static this_program `|(mixed thing) +  protected this_program `|(mixed thing)    {    if( !objectp(thing) || !thing->is_opt )    error("Can only or %O with another %O.\n",    this, this_program);       if( next )    {    next = next | thing;    return this;    }       next = thing;    return this;    }       //! This function will be called by @expr{_sprintf@}, which    //! handles formatting of chaining between objects. -  static string __sprintf() +  protected string __sprintf()    {    return sprintf("%O()", this_program);    }    -  static string _sprintf(int t) +  protected string _sprintf(int t)    {    if( t!='O' ) return UNDEFINED;    if( !next )    return __sprintf();    else    return sprintf("%s|%O", __sprintf(), next);    }    }       //! Parses an option without parameter, such as --help, -x or "x"    //! from -axb.    //!    //! @example    //! Opt verbose = NoOpt("-v")|NoOpt("--verbose");    class NoOpt    {    inherit Opt; -  static string opt; -  static int double; +  protected string opt; +  protected int double;    -  static void create(string _opt) +  protected void create(string _opt)    {    if( sizeof(_opt)>2 && has_prefix(_opt, "--") )    double = 1;    else if( sizeof(_opt)!=2 || _opt[0]!='-' || _opt=="--" )    error("%O not a valid option.\n", _opt);    opt = _opt;    }       int(0..1)|string get_value(array(string) argv, mapping(string:string) env)    {
pike.git/lib/modules/Arg.pmod:116:    }       return ::get_value(argv, env);    }       array(string) get_opts()    {    return ({ opt }) + ::get_opts();    }    -  static string __sprintf() +  protected string __sprintf()    {    return sprintf("Arg.NoOpt(%O)", opt);    }    }       //! Environment fallback for an option. Can of course be used as    //! only Opt source.    //!    //! @example    //! Opt debug = NoOpt("--debug")|Env("MY_DEBUG");    class Env    {    inherit Opt; -  static string name; +  protected string name;    -  static void create(string _name) +  protected void create(string _name)    {    name = _name;    }       int(0..1)|string get_value(array(string) argv, mapping(string:string) env)    {    if( env[name] ) return env[name];    return ::get_value(argv, env);    }    -  static string __sprintf() +  protected string __sprintf()    {    return sprintf("Arg.Env(%O)", name);    }    }       //! Default value for a setting.    //!    //! @example    //! Opt output = HasOpt("-o")|Default("a.out");    class Default    {    inherit Opt; -  static string value; +  protected string value;    -  static void create(string _value) +  protected void create(string _value)    {    value = _value;    }       string get_value(array(string) argv, mapping(string:string) env)    {    return value;    }    -  static string __sprintf() +  protected string __sprintf()    {    return sprintf("Arg.Default(%O)", value);    }    }       //! Parses an option that may have a parameter. @tt{--foo@},    //! @tt{-x@} and x in a sequence like @tt{-axb@} will set the    //! variable to @expr{1@}. @tt{--foo=bar@}, @tt{-x bar@} and    //! @tt{-x=bar@} will set the variable to @expr{bar@}.    //!
pike.git/lib/modules/Arg.pmod:240:    argv[0] = parts[0];    return parts[1..]*"=";    }       return ::get_value(argv, env);    }       return ::get_value(argv, env);    }    -  static string __sprintf() +  protected string __sprintf()    {    return sprintf("Arg.MaybeOpt(%O)", opt);    }    }       //! Parses an option that has a parameter. @tt{--foo=bar@}, @tt{-x    //! bar@} and @tt{-x=bar@} will set the variable to @expr{bar@}.    //!    //! @example    //! Opt user = HasOpt("--user")|HasOpt("-u");
pike.git/lib/modules/Arg.pmod:322:    else    argv[0] = parts[0];    return parts[1..]*"=";    }    }    }       return ::get_value(argv, env);    }    -  static string __sprintf() +  protected string __sprintf()    {    return sprintf("Arg.HasOpt(%O)", opt);    }    }      } // -- OptLibrary      object REST = class { -  static string _sprintf(int t) +  protected string _sprintf(int t)    {    return "Arg.REST";    }    }();      // FIXME: Support for rc files? ( Opt x = Opt("--x")|INIFile(path, name); )   // FIXME: Support for type casts? ( Opt level = Integer(Opt("--level"));      class LowOptions   { -  static inherit OptLibrary; +  protected inherit OptLibrary;    -  static mapping(string:Opt) opts = ([]); -  static mapping(string:int(1..1)|string) values = ([]); -  static array(string) argv; -  static string application; +  protected mapping(string:Opt) opts = ([]); +  protected mapping(string:int(1..1)|string) values = ([]); +  protected array(string) argv; +  protected string application;    -  static void create(array(string) _argv, void|mapping(string:string) env) +  protected void create(array(string) _argv, void|mapping(string:string) env)    {    if(!env)    env = getenv();       // Make a list of all the arguments we can parse.    foreach(::_indices(2), string index)    {    mixed val = ::`[](index, 2);    if(objectp(val) && val->is_opt) opts[index]=val;    }
pike.git/lib/modules/Arg.pmod:407:    if(value)    {    m_delete(unset, index);    values[index] = value;    }    }    }       }    -  static int(0..1) unhandled_argument(array(string) argv, +  protected int(0..1) unhandled_argument(array(string) argv,    mapping(string:string) env)    {    return 0;    }    -  static mixed cast(string to) +  protected mixed cast(string to)    {    switch( to )    {    case "mapping":    return values + ([ REST : argv ]);    case "array":    return argv;    }    return UNDEFINED;    }   }      //! The option parser class that contains all the argument objects.   //!   class Options   {    inherit LowOptions;    -  static string|int `[](string id) +  protected string|int `[](string id)    {    return values[id];    } -  static string|int `->(string id) +  protected string|int `->(string id)    {    return values[id];    }    -  static int(0..1)|string unhandled_argument(array(string) argv, +  protected int(0..1)|string unhandled_argument(array(string) argv,    mapping(string:string) env)    {    if( !sizeof(argv) || argv[0]!="--help" ) return 0;       string s = index("help_pre");    if( s )    write( s+"\n" );       foreach(opts; string i; Opt opt)    {
pike.git/lib/modules/Arg.pmod:463:    s = index(i+"_help");    if( s )    write( s ); // FIXME: Format    }       s = index("help_post");    if( s )    write( "\n"+s );    }    -  static string index(string i) +  protected string index(string i)    {    string s = ::`[](i, 2);    if( !s ) return 0;    if( !stringp(s) ) error("%O is not a string.\n", i);    if( sizeof(s) )    {    if( s[-1]!='\n' )    s += "\n";    return s;    }