# include <stdio.h>

# include <stdlib.h>

# include <string.h>

# include <ctype.h>

# include "allocate.h"

# include "proto.h"

# include "options.h"

# include "error.h"



# define streq(a,b)	 !strcmp(a,b)


static int args_used = 0;

# ifdef UseFunctionPrototypes

static int GetArgNumber (int argc, char *argv[], char *name)
# else

static int GetArgNumber (argc, argv, name)
   int	argc;
   char	*argv [ ];
   char	*name;
# endif

{
   char	buffer [256];
   int	i;
   int  n;

   sprintf (buffer,"-%s", name);      

   n = -1;
   for (i = 1 ; i < argc ; i++) 
      if (streq (argv [i], buffer)) {
         n = i;
         break;
      }
 
   return n;
}

# ifdef UseFunctionPrototypes

static int CountArgs (int argc, char *argv[], int n)
# else

static int CountArgs (argc, argv, n)
   int	 argc;
   char	*argv [ ];
   int	 n;
# endif

{
   int	 i;
   int	 c;

   c = 0;

   for (i = n ; i < argc ; i++) 
      if (argv [i][0] == '-' && !isdigit(argv [i][1]) && argv [i][1] != '.') {
         c = i - n;
         break;
      }

   if (i == argc)
      c = argc - n;

   return c;
}

int ArgsUsed ( )
{
   return args_used;
}

int GetIntegerOption(argc, argv, name, opt)
   int	 argc;
   char	*argv [ ];
   char	*name;
   int	**opt;
{
   int		n;
   int		c;
   int		i;

   n = GetArgNumber (argc, argv, name);
   if (n == -1) 
      return 0;

   c = CountArgs(argc, argv, n+1);

   *opt = Allocate(int, c);
   if (*opt == NULL)
      Fatal("could not allocate memory for argument options");

   for (i = 0  ; i < c ; i++) 
      (*opt) [i] = atoi (argv [i + n + 1]);

   args_used = args_used + c + 1;

   return c;
}

int GetDoubleOption(argc, argv, name, opt)
   int	     argc;
   char	    *argv [ ];
   char	    *name;
   double  **opt;
{
   int		n;
   int		c;
   int		i;

   n = GetArgNumber (argc, argv, name);
   if (n == -1) 
      return 0;

   c = CountArgs(argc, argv, n+1);

   *opt = Allocate(double, c);
   if (*opt == NULL)
      Fatal("could not allocate memory for argument options");

   for (i = 0  ; i < c ; i++) 
      (*opt) [i] = atof (argv [i + n + 1]);

   args_used = args_used + c + 1;

   return c;
}

int GetFloatOption(argc, argv, name, opt)
   int	     argc;
   char	    *argv [ ];
   char	    *name;
   float   **opt;
{
   int		n;
   int		c;
   int		i;

   n = GetArgNumber (argc, argv, name);
   if (n == -1) 
      return 0;

   c = CountArgs(argc, argv, n+1);

   *opt = Allocate(float, c);
   if (*opt == NULL)
      Fatal("could not allocate memory for argument options");

   for (i = 0  ; i < c ; i++) 
      (*opt) [i] = atof (argv [i + n + 1]);

   args_used = args_used + c + 1;

   return c;
}

int GetBooleanOption(argc, argv, name, opt)
   int	 argc;
   char	*argv [ ];
   char	*name;
   int	*opt;
{
   int		n;
   int		c;

   n = GetArgNumber (argc, argv, name);
   if (n == -1) {
      *opt = 0;
      return 0;
   }

   c = CountArgs(argc, argv, n+1);
   if (c > 0)
       return -1;

   *opt = 1;

   args_used = args_used + c + 1;

   return c;
}

int GetStringOption(argc, argv, name, opt)
   int	 argc;
   char	*argv [ ];
   char	*name;
   char	***opt;
{
   int		n;
   int		c;
   int		i;
 
   n = GetArgNumber (argc, argv, name);
   if (n == -1) 
      return 0;
 
   c = CountArgs(argc, argv, n+1);

   *opt = Allocate(char *, c);
   if (*opt == NULL)
      Fatal("could not allocate memory for argument options");

   for (i = 0  ; i < c ; i++)
      (*opt) [i] = strdup (argv [i + n + 1]);

   args_used = args_used + c + 1;

   return c;
}

int GetSoloIntegerOption(argc, argv, name, opt)
   int	 argc;
   char	*argv [ ];
   char	*name;
   int	*opt;
{
   int		n;
   int		c;

   n = GetArgNumber (argc, argv, name);
   if (n == -1) 
      return 0;

   c = CountArgs(argc, argv, n+1);
   if (c != 1)
      return -1;

   *opt = atoi (argv [n + 1]);

   args_used = args_used + c + 1;

   return c;
}

int GetSoloFloatOption(argc, argv, name, opt)
   int	    argc;
   char	   *argv [ ];
   char	   *name;
   float   *opt;
{
   int		n;
   int		c;

   n = GetArgNumber (argc, argv, name);
   if (n == -1) 
      return 0;

   c = CountArgs(argc, argv, n+1);
   if (c != 1)
      return -1;

   *opt = atof (argv [n + 1]);

   args_used = args_used + c + 1;

   return c;
}

int GetSoloDoubleOption(argc, argv, name, opt)
   int	    argc;
   char	   *argv [ ];
   char	   *name;
   double  *opt;
{
   int		n;
   int		c;

   n = GetArgNumber (argc, argv, name);
   if (n == -1) 
      return 0;

   c = CountArgs(argc, argv, n+1);
   if (c != 1)
      return -1;

   *opt = atof (argv [n + 1]);

   args_used = args_used + c + 1;

   return c;
}

int GetSoloStringOption(argc, argv, name, opt)
   int	 argc;
   char	*argv [ ];
   char	*name;
   char	**opt;
{
   int		n;
   int		c;
 
   n = GetArgNumber (argc, argv, name);
   if (n == -1) 
      return 0;
 
   c = CountArgs(argc, argv, n+1);
   if (c != 1)
      return -1;

   *opt = strdup (argv [n + 1]);

   args_used = args_used + c + 1;

   return c;
}


syntax highlighted by Code2HTML, v. 0.9.1