int gopt()

in src/common/gopt.c [79:226]


int gopt (char **argv, struct option *options)
{
  unsigned int operand_count = 1;
  unsigned int doubledash    = 0;
  unsigned int expecting     = 0;
  unsigned int option_index  = 0;
  unsigned int i, j;

  for (i = 0; !(options[i].flags & GOPT_LAST); i++)
  {
    options[i].argument = NULL;
    options[i].count    = 0;
  }

  options[i].short_name = 0;
  options[i].long_name  = NULL;
  options[i].argument   = NULL;
  options[i].count      = 0;

  for (i = 1; argv[i]; i++)
  {
    if (doubledash)
    {
      argv[operand_count] = argv[i];
      operand_count++;
      continue;
    }

    if (expecting)
    {
      if ((argv[i][0] != '-') || !argv[i][1] || !(options[option_index].flags & GOPT_ARGUMENT_NO_HYPHEN))
      {
        options[option_index].flags    |= expecting;
        options[option_index].argument  = argv[i];
        expecting = 0;
        continue;
      }
      else
      {
        options[option_index].flags    |= (expecting >> 1); /* change _WITH to _WITHOUT */
        options[option_index].argument  =  NULL;
        expecting = 0;
      }
    }

    if ((argv[i][0] == '-') && (argv[i][1] == '-') && (argv[i][2] == 0))
    {
      doubledash = 1;
      continue;
    }

    if ((argv[i][0] == '-') && (argv[i][1] == '-'))
    {
      char *eq = strchr (&argv[i][2], '=');

      option_index = long_option_get_index (&argv[i][2], options);

      options[option_index].count++;

      if ((options[option_index].flags & GOPT_LAST) && !options[option_index].long_name)
      {
        options[option_index].long_name = &argv[i][2];
      }

      if (eq)
      {
        options[option_index].argument  = (eq + 1);
        options[option_index].flags    |= GOPT_SEEN_LONG_WITH;
      }
      else if (options[option_index].flags & GOPT_ARGUMENT_REQUIRED)
      {
        expecting = GOPT_SEEN_LONG_WITH;
      }
      else
      {
        options[option_index].argument  = NULL;
        options[option_index].flags    |= GOPT_SEEN_LONG_WITHOUT;
      }
    }
    else if ((argv[i][0] == '-') && argv[i][1])
    {
      for (j = 1; argv[i][j]; j++)
      {
        option_index = short_option_get_index (argv[i][j], options);

        options[option_index].count++;

        if (options[option_index].flags & GOPT_LAST)
        {
          if (!options[option_index].short_name)
          {
            options[option_index].short_name = argv[i][j];
          }

          if (argv[i][j+1])
          {
            options[option_index].argument  = &argv[i][j+1];
            options[option_index].flags    |= GOPT_SEEN_SHORT_WITH;
          }
          else
          {
            options[option_index].argument  = NULL;
            options[option_index].flags    |= GOPT_SEEN_SHORT_WITHOUT;
          }
          break;
        }

        if (options[option_index].flags & GOPT_ARGUMENT_FORBIDDEN)
        {
          options[option_index].argument  = NULL;
          options[option_index].flags    |= GOPT_SEEN_SHORT_WITHOUT;
        }

        else if (argv[i][j+1])
        {
          options[option_index].argument  = &argv[i][j+1];
          options[option_index].flags    |= GOPT_SEEN_SHORT_WITH;
          break;
        }

        else if (options[option_index].flags & GOPT_ARGUMENT_REQUIRED)
        {
          expecting = GOPT_SEEN_SHORT_WITH;
        }

        else
        {
          options[option_index].argument  = NULL;
          options[option_index].flags    |= GOPT_SEEN_SHORT_WITHOUT;
        }
      }
    }
    else
    {
      argv[operand_count] = argv[i];
      operand_count++;
    }
  }

  if (expecting)
  {
    options[option_index].flags    |= (expecting >> 1); /* change _WITH to _WITHOUT */
    options[option_index].argument  =  NULL;
  }

  argv[operand_count] = NULL;
  return operand_count;
}