Branch: Tag:

2013-06-03

2013-06-03 16:53:50 by Martin Nilsson <nilsson@opera.com>

Support -x -x style arguments.

18:    //! 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) +  //! @expr{::get_value(argv, env, previous)@} instead of @expr{0@}, +  //! unless you want to explicitly stop the chain and not set this +  //! option. +  mixed get_value(array(string) argv, mapping(string:string) env, +  int|string previous)    { -  if(next) return next->get_value(argv, env); +  if(next) return next->get_value(argv, env, previous);    return 0;    }   
88:    opt = _opt;    }    -  int(0..1)|string get_value(array(string) argv, mapping(string:string) env) +  mixed get_value(array(string) argv, mapping(string:string) env, mixed previous)    { -  if( !sizeof(argv) ) return ::get_value(argv, env); +  if( !sizeof(argv) ) return previous || ::get_value(argv, env, previous);       if( double )    {    if( argv[0]==opt )    {    argv[0] = 0; -  return 1; +  return (int)previous+1;    } -  return ::get_value(argv, env); +  return previous || ::get_value(argv, env, previous);    }       if( sizeof(argv[0])>1 && argv[0][0]=='-' && argv[0][1]!='-' )
110:    parts[0] -= opt[1..1];    argv[0] = parts*"=";    if(argv[0]=="-") argv[0] = 0; -  return 1; +  return (int)previous+1;    }    }    -  return ::get_value(argv, env); +  return previous || ::get_value(argv, env, previous);    }       array(string) get_opts()
143:    name = _name;    }    -  int(0..1)|string get_value(array(string) argv, mapping(string:string) env) +  mixed get_value(array(string) argv, mapping(string:string) env, mixed previous)    {    if( env[name] ) return env[name]; -  return ::get_value(argv, env); +  return ::get_value(argv, env, previous);    }       protected string __sprintf()
169:    value = _value;    }    -  string get_value(array(string) argv, mapping(string:string) env) +  string get_value(array(string) argv, mapping(string:string) env, mixed previous)    {    return value;    }
191:    {    inherit NoOpt;    -  int(0..1)|string get_value(array(string) argv, mapping(string:string) env) +  mixed get_value(array(string) argv, mapping(string:string) env, mixed previous)    { -  if( !sizeof(argv) ) return ::get_value(argv, env); +  if( !sizeof(argv) ) return previous || ::get_value(argv, env, previous);       if( double )    {
201:    if( argv[0]==opt )    {    argv[0] = 0; -  return 1; +  return (int)previous+1;    }       // --foo=bar    if( sscanf(argv[0], opt+"=%s", string ret)==1 )    {    argv[0] = 0; -  +  // FIXME: Make an array if previous is set?    return ret;    }    -  return ::get_value(argv, env); +  return previous || ::get_value(argv, env, previous);    }       // -x
227:    parts[0] -= opt[1..1];    argv[0] = parts*"=";    if(argv[0]=="-") argv[0] = 0; -  return 1; +  return (int)previous+1;    }    else if( sizeof(parts)>1 && parts[0][-1]==opt[1] )    {
240:    return parts[1..]*"=";    }    -  return ::get_value(argv, env); +  return previous || ::get_value(argv, env, previous);    }    -  return ::get_value(argv, env); +  return previous || ::get_value(argv, env, previous);    }       protected string __sprintf()
261:    {    inherit NoOpt;    -  int(0..1)|string get_value(array(string) argv, mapping(string:string) env) +  mixed get_value(array(string) argv, mapping(string:string) env, mixed previous)    { -  if( !sizeof(argv) ) return ::get_value(argv, env); +  if( !sizeof(argv) ) return previous || ::get_value(argv, env, previous);       if( double )    {
286:    argv[0] = 0;    return ret;    } -  return ::get_value(argv, env); +  return previous || ::get_value(argv, env, previous);    }       if( sizeof(argv[0])>1 && argv[0][0]=='-' && argv[0][1]!='-' )
310:    }       // Fail. "-y" without any more elements in argv. -  return ::get_value(argv, env); +  return previous || ::get_value(argv, env, previous);    }    else    {
325:    }    }    -  return ::get_value(argv, env); +  return previous || ::get_value(argv, env, previous);    }       protected string __sprintf()
371:    argv = _argv[1..];    mapping(string:Opt) unset = opts+([]);    -  while(1) +  while(sizeof(argv))    { -  if(!sizeof(argv)) break; -  -  int(0..1)|string value; -  foreach(unset; string index; Opt arg) +  array(string) pre = argv+({}); +  foreach(opts; string index; Opt arg)    { -  value = arg->get_value(argv, env); +  int(0..1)|string value = arg->get_value(argv, env, values[index]);    if(value)    {    m_delete(unset, index);    values[index] = value; -  break; +  argv -= ({ 0 });    }    } -  +  argv -= ({ 0 });    -  if(!value) -  value = unhandled_argument(argv, env); -  -  if(!value) +  if(equal(pre, argv)) +  { +  unhandled_argument(argv, env); +  if(equal(pre, argv))    break; -  else -  while( sizeof(argv) && argv[0] == 0 ) -  argv = argv[1..]; +     } -  +  }       if( sizeof(unset) )    {    int(0..1)|string value;    foreach(unset; string index; Opt arg)    { -  value = arg->get_value(({}), env); +  value = arg->get_value(({}), env, values[index]);    if(value) -  { -  m_delete(unset, index); +     values[index] = value;    }    } -  } +        }   
502:    {    sscanf( arg, "--%s=%s", name, value ) || sscanf( arg, "--%s", name );    if(!name) return 0; // arg == "--" -  values[name] = value||1; +  if( value ) +  values[name] = value; +  else +  values[name]++;    argv[0]=0;    return 1;    }
510:    sscanf( arg, "-%s=%s", name, value ) || sscanf( arg, "-%s", name );    if( !name || !sizeof(name) ) return 0;    foreach( name/1; int pos; string c ) -  if( pos == sizeof(name)-1 ) -  values[c] = value||1; +  { +  if( value && pos == sizeof(name)-1 ) +  values[c] = value;    else -  values[c] = 1; +  values[c]++; +  }    argv[0]=0;    return 1;    }
525:   // -bar -> "b":1,"a":1,"r":1   // -bar=foo -> "b":1,"a":1,"r":"foo" (?)   // --foo --bar -> "foo":1,"bar":1 - // --foo - --bar -> "foo":1 - // --foo x --bar -> "foo":1 (?) + // --foo - --bar -> "foo":1 + // --foo x --bar -> "foo":1 (?) + // -foo -> "f":1,"o":2 + // -x -x -x -> "x":3   //   // void main(int n, array argv)   // {