Skip to content
Snippets Groups Projects
Select Git revision
  • 9.0
  • master default protected
  • 8.0
  • rosuav/latex-markdown-renderer
  • rxnpatch/rxnpatch
  • marcus/gobject-introspection
  • rxnpatch/8.0
  • rosuav/pre-listening-ports
  • 7.8
  • nt-tools
  • 7.6
  • 7.4
  • 7.2
  • 7.0
  • rosuav/async-annotations
  • rosuav/pgsql-ssl
  • rxnpatch/rxnpatch-broken/2023-10-06T094250
  • grubba/fdlib
  • grubba/wip/sakura/8.0
  • grubba/wip/sakura/master
  • v8.0.1992
  • v8.0.1990
  • v8.0.1988
  • v8.0.1986
  • rxnpatch/clusters/8.0/2025-04-29T124414
  • rxnpatch/2025-04-29T124414
  • v8.0.1984
  • v8.0.1982
  • v8.0.1980
  • v8.0.1978
  • v8.0.1976
  • v8.0.1974
  • v8.0.1972
  • v8.0.1970
  • v8.0.1968
  • v8.0.1966
  • v8.0.1964
  • v8.0.1962
  • v8.0.1960
  • v8.0.1956
40 results

Getopt.pmod

Blame
  • Getopt.pmod 4.98 KiB
    //  startpid = (int)find_arg(argv, "s", ({ "start-script-pid" }),
    // 			     ({ "ROXEN_START_SCRIPT_PID"}));
    
    //  configuration_dir = find_arg(argv, "d", ({ "config-dir",
    //					     "configurations",
    //					     "configuration-directory" }),
    //			          ({ "ROXEN_CONFIGDIR", "CONFIGURATIONS" }),
    //			           "../configurations");
    
    
    string|int find_option(array argv,
    		       array|string shortform,
    		       array|string|void longform,
    		       array|string|void envvars,
    		       mixed|void def)
    {
      mixed value;
      int i,hasarg;
    
      hasarg=query_num_arg() > 4;
      if(!arrayp(longform)) longform=({longform});
      if(!arrayp(shortform)) shortform=({shortform});
      if(!arrayp(envvars)) envvars=({envvars});
    
      for(i=1; i<sizeof(argv); i++)
      {
        if(argv[i] && strlen(argv[i]) > 1)
        {
          if(argv[i][0] == '-')
          {
    	if(argv[i][1] == '-')
    	{
    	  string tmp;
    	  int nf;
    
    	  if(argv[i]=="--") break;
    
    	  sscanf(tmp=argv[i], "%s=%s", tmp, value);
    	  
    	  if(search(longform, tmp[2..]) != -1)
    	  {
    	    argv[i]=0;
    	    if(hasarg)
    	    {
    	      if(!value)
    	      {
    		if(i == sizeof(argv)-1)
    		{
    		  werror("No argument to option "+tmp+".\n");
    		  exit(1);
    		}
    		value=argv[i+1];
    		argv[i+1]=0;
    	      }
    	      return value;
    	    } else {
    	      return value || 1;
    	    }
    	  }
    	} else {
    	  int j;
    	  for(j=1;j<strlen(argv[i]);j++)
    	  {
                string opt;
                int pos;
    	    if(search(shortform, opt=argv[i][j..j]) != -1)
    	    {
                  string arg;
                  arg=argv[i][j+1..];
    
    	      if(hasarg)
    	      {
    		if(arg=="")
    		{
    		  if(i == sizeof(argv)-1)
                      {
                        werror("No argument to option -"+argv[i][j..j]+".\n");
                        exit(1);
                      }
    
                      value=argv[i+1];
    		  argv[i+1] = 0;
    		} else {
    		  value=arg;
                      arg="";
    		}
    	      } else {
    		value=1;
    	      }
    
    	      argv[i]=argv[i][..j-1]+arg;
    	      if(argv[i]=="-") argv[i]=0;
    	      return value;
    	    }
    	  }
    	}
          }
        }
      }
    
      if(arrayp(envvars))
        foreach(envvars, value)
          if(value && (value=getenv(value)))
    	return value;
      
      return def;
    }
    
    /*
     * ({ "name", type, ({aliases}), env_var, default })
     */
    
    constant HAS_ARG=1;
    constant NO_ARG=2;
    constant MAY_HAVE_ARG=3;
    
    #define NAME 0
    #define TYPE 1
    #define ALIASES 2
    #define ENV 3
    #define DEF 4
    
    mixed *find_all_options(string *argv, mixed *options, void|int posix_me_harder)
    {
      mapping quick=([]);
      foreach(options, mixed opt)
        {
          mixed aliases=opt[ALIASES];
          if(!arrayp(aliases)) aliases=({aliases});
          foreach(aliases, mixed optname)
    	{
    	  if(optname[0..1]=="--")
    	  {
    	    quick[optname]=opt;
    	  }else{
    	    foreach(optname[1..]/"",string optletter)
    	      {
    		quick["-"+optletter]=opt;
    	      }
    	  }
    	}
        }
    
      mixed *ret=({});
      for(int e=1;e<sizeof(argv);e++)
      {
        if(!argv[e]) continue;
    
        if(strlen(argv[e]) && argv[e][0]=='-')
        {
          if(strlen(argv[e])>1 && argv[e][1]=='-')
          {
    	string opt=argv[e];
    	if(opt=="--") break;
    
    	string arg;
    	sscanf(opt,"%s=%s",opt, arg);
    	if(mixed *option=quick[opt])
    	{
    	  argv[e]=0;
    	  if(!arg && option[TYPE]==HAS_ARG)
    	  {
    	    if(e==sizeof(argv)-1)
    	    {
    	      werror("No argument to option "+opt+".\n");
    	      exit(1);
    	    }
    	    arg=argv[e+1];
    	    argv[e+1]=0;
    	  }
    	  ret+=({ ({ option[0], arg || 1 }) });
    	}
          }else{
    	string *foo=argv[e]/"";
    	for(int j=1;j<strlen(foo);j++)
    	{
    	  string opt="-"+foo[j];
    	  if(mixed *option=quick[opt])
    	  {
    	    foo[j]=0;
    	    string arg;
    	    if(option[TYPE]!=NO_ARG)
    	    {
    	      arg=argv[e][j+1..];
    	      
    	      if(option[TYPE]==HAS_ARG && arg=="")
    	      {
    		if(e==sizeof(argv)-1)
    		{
    		  werror("No argument to option "+opt+".\n");
    		  exit(1);
    		}
    		arg=argv[e+1];
    		argv[e+1]=0;
    	      }else{
    		foo=foo[..j];
    	      }
    	    }
    
    	    ret+=({ ({ option[0], arg || 1 }) });
    	  }
    	}
    	argv[e]=foo*"";
    	if(argv[e]=="-") argv[e]=0;
          }
        }else{
          if(posix_me_harder || getenv("POSIX_ME_HARDER"))
    	break;
        }
      }
    
      multiset done=mkmultiset(column(ret, 0));
      foreach(options, string *option)
        {
          string name=option[NAME];
          if(done[name]) continue;
          if(sizeof(option) > ENV)
          {
    	mixed foo=option[ENV];
    	if(!foo) continue;
    	if(stringp(foo)) foo=({foo});
    	foreach(foo, foo)
    	  {
    	    if(foo=getenv(foo))
    	    {
    	      ret+=({ ({name, foo}) });
    	      done[name]=1;
    	      break;
    	    }
    	  }
    
    	if(!done && sizeof(option)>3 && option[3])
    	{
    	  ret+=({ ({name, option[3]}) });
    	  done[name]=1;
    	}
          }
        }
      return ret;
    }
    
    
    string *get_args(string *argv, void|int posix_me_harder)
    {
      int i;
      for(i=1;i<sizeof(argv);i++)
      {
        if(argv[i] && strlen(argv[i])>1 && argv[i][0]=='-')
        {
          if(argv[i][1]=='-')
          {
    	if(argv[i]=="--")
    	{
    	  argv[i]=0;
    	  break;
    	}else{
    	  werror("Unknown option "+argv[i]+".\n");
    	  exit(1);
    	}
          }else{
    	if(strlen(argv[i]) == 2)
    	  werror("Unknown option "+argv[i]+".\n");
    	else
    	  werror("Unknown options "+argv[i]+".\n");
    	exit(1);
          }
        }else{
          if(posix_me_harder || getenv("POSIX_ME_HARDER"))
    	break;
        }
      }
    
      argv-=({0,1});
    
      return argv;
    }