Skip to content
Snippets Groups Projects
Select Git revision
  • a8e38bdf161ecd67cecc30c255775ad261aaae9f
  • master default protected
  • hpke
  • ppc-chacha-4core
  • delete-internal-name-mangling
  • master-updates
  • ppc-gcm
  • ppc-chacha-2core
  • refactor-ecc-mod
  • ppc-chacha-core
  • use-mpn_cnd-functions
  • optimize-ecc-invert
  • default-m4-quote-char
  • power-asm-wip
  • test-fat
  • chacha-3core-neon
  • x86_64-salsa20-2core
  • salsa20-2core-neon
  • bcrypt
  • arm-salsa20-chacha-vsra
  • test-shlib-dir
  • nettle_3.6_release_20200429
  • nettle_3.6rc3
  • nettle_3.6rc2
  • nettle_3.6rc1
  • nettle_3.5.1_release_20190627
  • nettle_3.5_release_20190626
  • nettle_3.5rc1
  • nettle_3.4.1_release_20181204
  • nettle_3.4.1rc1
  • nettle_3.4_release_20171119
  • nettle_3.4rc2
  • nettle_3.4rc1
  • nettle_3.3_release_20161001
  • nettle_3.2_release_20160128
  • nettle_3.1.1_release_20150424
  • nettle_3.1_release_20150407
  • nettle_3.1rc3
  • nettle_3.1rc2
  • nettle_3.1rc1
  • nettle_3.0_release_20140607
41 results

getopt.c

Blame
  • Forked from Nettle / nettle
    Source project has a limited visibility.
    • Niels Möller's avatar
      65f4dcd4
      Moved files here. · 65f4dcd4
      Niels Möller authored
      Linked into the directories that need them by ./.bootstrap.
      
      Rev: misc/getopt.c:1.1
      Rev: misc/getopt.h:1.1
      Rev: misc/getopt1.c:1.1
      65f4dcd4
      History
      Moved files here.
      Niels Möller authored
      Linked into the directories that need them by ./.bootstrap.
      
      Rev: misc/getopt.c:1.1
      Rev: misc/getopt.h:1.1
      Rev: misc/getopt1.c:1.1
    module_support.c 5.55 KiB
    #include "global.h"
    #include "module_support.h"
    #include "interpret.h"
    #include "svalue.h"
    #include "stralloc.h"
    #include "pike_types.h"
    #include "error.h"
    
    RCSID("$Id: module_support.c,v 1.11 1998/04/12 12:20:12 grubba Exp $");
    
    /* Checks that args_to_check arguments are OK.
     * Returns 1 if everything worked ok, zero otherwise.
     * If something went wrong, 'exepect_result' tells you what went wrong.
     * Make sure to finish the argument list with a zero.
     */
    static int va_check_args(struct svalue *s,
    			 int args_to_check,
    			 struct expect_result *res,
    			 va_list arglist)
    {
      res->error_type = ERR_NONE;
      res->expected = 0;
      
      for (res->argno=0; res->argno < args_to_check; res->argno++)
      {
        if(!(res->expected & BIT_MANY))
        {
          res->expected = va_arg(arglist, unsigned int);
          if(!res->expected)
          {
    	res->error_type = ERR_TOO_MANY;
    	return 0;
          }
        }
    
        if (!((1UL << s[res->argno].type) & res->expected))
        {
          res->got=s[res->argno].type;
          res->error_type = ERR_BAD_ARG;
          return 0;
        }
      }
    
      if(!(res->expected & BIT_MANY))
      {
        res->expected = va_arg(arglist, unsigned int);
      }
    
      if(!res->expected || (res->expected & BIT_VOID)) return 1;
      res->error_type = ERR_TOO_FEW;
      return 0;
    }
    
    /* Returns the number of the first bad argument,
     * -X if there were too few arguments
     * or 0 if all arguments were OK.
     */
    int check_args(int args, ...)
    {
      va_list arglist;
      struct expect_result tmp;
      
      va_start(arglist, args);
      va_check_args(sp - args, args, &tmp, arglist);
      va_end(arglist);
    
      if(tmp.error_type == ERR_NONE) return 0;
      return tmp.argno+1;
    }
    
    /* This function generates errors if any of the minargs first arguments
     * is not OK.
     */
    void check_all_args(const char *fnname, int args, ... )
    {
      va_list arglist;
      struct expect_result tmp;
      int argno;
    
      va_start(arglist, args);
      va_check_args(sp - args, args, &tmp, arglist);
      va_end(arglist);
    
      switch(tmp.error_type)
      {
      case ERR_NONE: return;
      case ERR_TOO_FEW:
        new_error(fnname, "Too few arguments.\n", sp, args, NULL, 0);
      case ERR_TOO_MANY:
        new_error(fnname, "Too many arguments.\n", sp, args, NULL, 0);
    
      case ERR_BAD_ARG:
      {
        char buf[1000];
        int e,d;
        buf[0]=0;
        for(e=0;e<16;e++)
        {
          if(tmp.expected & (1<<e))
          {
    	if(buf[0])
    	{
    	  if(tmp.expected & 0xffff & (0xffff << e))
    	    strcat(buf,", ");
    	  else
    	    strcat(buf," or ");
    	}
    	strcat(buf, get_name_of_type(e));
          }
        }
    	
        error("Bad argument %d to %s(), (expecting %s, got %s)\n", 
    	  tmp.argno+1,
    	  fnname,
    	  buf,
    	  get_name_of_type(tmp.got));
      }
      }
    }
    
    /* This function does NOT generate errors, it simply returns how
     * many arguments were actually matched.
     * usage: get_args(sp-args, args, "%i",&an_int)
     * format specifiers:
     *   %i: INT32
     *   %s: char *
     *   %S: struct pike_string *
     *   %a: struct array *
     *   %f: float
     *   %m: struct mapping *
     *   %M: struct multiset *
     *   %o: struct object *
     *   %p: struct program *
     *   %*: struct svalue *
     */
    
    int va_get_args(struct svalue *s,
    		INT32 num_args,
    		char *fmt,
    		va_list ap)
    {
      int ret=0;
      while(*fmt)
      {
        if(*fmt != '%')
          fatal("Error in format for get_args.\n");
    
        if(ret == num_args) return ret;
    
        switch(*++fmt)
        {
        case 'd':
          if(s->type != T_INT) return ret;
          *va_arg(ap, int *)=s->u.integer;
          break;
        case 'i':
          if(s->type != T_INT) return ret;
          *va_arg(ap, INT32 *)=s->u.integer; break;
        case 's':
          if(s->type != T_STRING) return ret;
          *va_arg(ap, char **)=s->u.string->str;
          break;
        case 'S':
          if(s->type != T_STRING) return ret;
          *va_arg(ap, struct pike_string **)=s->u.string;
          break;
        case 'a':
          if(s->type != T_ARRAY) return ret;
          *va_arg(ap, struct array **)=s->u.array;
          break;
        case 'f':
          if(s->type != T_FLOAT) return ret;
          *va_arg(ap, float *)=s->u.float_number;
          break;
        case 'm':
          if(s->type != T_MAPPING) return ret;
          *va_arg(ap, struct mapping **)=s->u.mapping;
          break;
        case 'M':
          if(s->type != T_MULTISET) return ret;
          *va_arg(ap, struct multiset **)=s->u.multiset;
          break;
        case 'o':
          if(s->type != T_OBJECT) return ret;
          *va_arg(ap, struct object **)=s->u.object;
          break;
        case 'p':
          if(s->type != T_PROGRAM) return ret;
          *va_arg(ap, struct program **)=s->u.program;
          break;
        case '*':
          *va_arg(ap, struct svalue **)=s;
          break;
          
        default:
          fatal("Unknown format character in get_args.\n");
        }
        ret++;
        s++;
        fmt++;
      }
      return ret;
    }
    
    int get_args(struct svalue *s,
    	     INT32 num_args,
    	     char *fmt, ...)
    {
      va_list ptr;
      int ret;
      va_start(ptr, fmt);
      ret=va_get_args(s, num_args, fmt, ptr);
      va_end(fmt);
      return ret;
    }
    
    void get_all_args(char *fname, INT32 args, char *format,  ... )
    {
      va_list ptr;
      int ret;
      va_start(ptr, format);
      ret=va_get_args(sp-args, args, format, ptr);
      va_end(ptr);
      if((long)ret*2 != (long)strlen(format)) {
        char *expected_type;
        switch(format[ret*2+1]) {
        case 'd': case 'i': expected_type = "int"; break;
        case 's': case 'S': expected_type = "string"; break;
        case 'a': expected_type = "array"; break;
        case 'f': expected_type = "float"; break;
        case 'm': expected_type = "mapping"; break;
        case 'M': expected_type = "multiset"; break;
        case 'o': expected_type = "object"; break;
        case 'p': expected_type = "program"; break;
        case '*': expected_type = "mixed"; break;
        default: expected_type = "Unknown"; break;
        }
        error("Bad argument %d to %s(). Expected %s\n", ret+1, fname,
    	  expected_type);
      }
    }