Logo Search packages:      
Sourcecode: jam version File versions  Download package

option.c

/*
 * Copyright 1993, 1995 Christopher Seiwald.
 *
 * This file is part of Jam - see jam.c for Copyright information.
 */

/*
 * option.c - command line option processing
 *
 * {o >o
 *  <>) "Process command line options as defined in <option.h>.
 *            Return the number of argv[] elements used up by options,
 *            or -1 if an invalid option flag was given or an argument
 *            was supplied for an option that does not require one."
 *
 * 11/04/02 (seiwald) - const-ing for string literals
 */

# include "jam.h"
# include "option.h"

int
getoptions(
    int argc,
    char **argv,
    const char *opts,
    option *optv )
{
    int i;
    int optc = N_OPTS;

    memset( (char *)optv, '\0', sizeof( *optv ) * N_OPTS );

    for( i = 0; i < argc; i++ )
    {
      char *arg;

      if( argv[i][0] != '-' || !isalpha( argv[i][1] ) )
          break;

      if( !optc-- )
      {
          printf( "too many options (%d max)\n", N_OPTS );
          return -1;
      }

      for( arg = &argv[i][1]; *arg; arg++ )
      {
          const char *f;

          for( f = opts; *f; f++ )
            if( *f == *arg )
                break;

          if( !*f )
          {
            printf( "Invalid option: -%c\n", *arg );
            return -1;
          }

          optv->flag = *f;

          if( f[1] != ':' )
          {
            optv++->val = "true";
          }
          else if( arg[1] )
          {
            optv++->val = &arg[1];
            break;
          }
          else if( ++i < argc )
          {
            optv++->val = argv[i];
            break;
          }
          else
          {
            printf( "option: -%c needs argument\n", *f );
            return -1;
          }
      }
    }

    return i;
}

/*
 * Name: getoptval() - find an option given its character
 */

const char *
getoptval( 
      option *optv,
      char opt,
      int subopt )
{
      int i;

      for( i = 0; i < N_OPTS; i++, optv++ )
          if( optv->flag == opt && !subopt-- )
            return optv->val;

      return 0;
}

Generated by  Doxygen 1.6.0   Back to index