Blame compat/getopt_long.c

Packit 6bd9ab
/*
Packit 6bd9ab
   getopt_long.c - implementation of getopt_long() for systems that lack it
Packit 6bd9ab
Packit 6bd9ab
   Copyright (C) 2001, 2002, 2008, 2012 Arthur de Jong
Packit 6bd9ab
Packit 6bd9ab
   This library is free software; you can redistribute it and/or
Packit 6bd9ab
   modify it under the terms of the GNU Lesser General Public
Packit 6bd9ab
   License as published by the Free Software Foundation; either
Packit 6bd9ab
   version 2.1 of the License, or (at your option) any later version.
Packit 6bd9ab
Packit 6bd9ab
   This library is distributed in the hope that it will be useful,
Packit 6bd9ab
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 6bd9ab
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 6bd9ab
   Lesser General Public License for more details.
Packit 6bd9ab
Packit 6bd9ab
   You should have received a copy of the GNU Lesser General Public
Packit 6bd9ab
   License along with this library; if not, write to the Free Software
Packit 6bd9ab
   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
Packit 6bd9ab
   02110-1301 USA
Packit 6bd9ab
*/
Packit 6bd9ab
Packit 6bd9ab
#include <stdlib.h>
Packit 6bd9ab
#include <unistd.h>
Packit 6bd9ab
#include <string.h>
Packit 6bd9ab
Packit 6bd9ab
#include "getopt_long.h"
Packit 6bd9ab
Packit 6bd9ab
/* this is a (poor) getopt_long() replacement for systems that don't have it
Packit 6bd9ab
   (getopt_long() is generaly a GNU extention)
Packit 6bd9ab
   this implementation is by no meens flawless, especialy the optional arguments
Packit 6bd9ab
   to options and options following filenames is not quite right, allso
Packit 6bd9ab
   minimal error checking is provided
Packit 6bd9ab
   */
Packit 6bd9ab
int getopt_long(int argc, char *const argv[],
Packit 6bd9ab
                const char *optstring,
Packit 6bd9ab
                const struct option *longopts, int *longindex)
Packit 6bd9ab
{
Packit 6bd9ab
  int i, l;
Packit 6bd9ab
  /* first check if there realy is a -- option */
Packit 6bd9ab
  if ((optind > 0) && (optind < argc) &&
Packit 6bd9ab
      (strncmp(argv[optind], "--", 2) == 0) &&
Packit 6bd9ab
      (argv[optind][2] != '\0'))
Packit 6bd9ab
  {
Packit 6bd9ab
    /* check the longopts list for a valid option */
Packit 6bd9ab
    for (i = 0; longopts[i].name != NULL; i++)
Packit 6bd9ab
    {
Packit 6bd9ab
      /* save the length for later */
Packit 6bd9ab
      l = strlen(longopts[i].name);
Packit 6bd9ab
      if (strncmp(argv[optind] + 2, longopts[i].name, l) == 0)
Packit 6bd9ab
      {
Packit 6bd9ab
        /* we have a match */
Packit 6bd9ab
        if ((longopts[i].has_arg == no_argument) &&
Packit 6bd9ab
            (argv[optind][2 + l] == '\0'))
Packit 6bd9ab
        {
Packit 6bd9ab
          optind++;
Packit 6bd9ab
          return longopts[i].val;
Packit 6bd9ab
        }
Packit 6bd9ab
        else if ((longopts[i].has_arg == required_argument) &&
Packit 6bd9ab
                 (argv[optind][2 + l] == '='))
Packit 6bd9ab
        {
Packit 6bd9ab
          optarg = argv[optind] + 3 + l;
Packit 6bd9ab
          optind++;
Packit 6bd9ab
          return longopts[i].val;
Packit 6bd9ab
        }
Packit 6bd9ab
        else if ((longopts[i].has_arg == required_argument) &&
Packit 6bd9ab
                 (argv[optind][2 + l] == '\0'))
Packit 6bd9ab
        {
Packit 6bd9ab
          optarg = argv[optind + 1];
Packit 6bd9ab
          optind += 2;
Packit 6bd9ab
          return longopts[i].val;
Packit 6bd9ab
        }
Packit 6bd9ab
        else if ((longopts[i].has_arg == optional_argument) &&
Packit 6bd9ab
                 (argv[optind][2 + l] == '='))
Packit 6bd9ab
        {
Packit 6bd9ab
          optarg = argv[optind] + 3 + l;
Packit 6bd9ab
          optind++;
Packit 6bd9ab
          return longopts[i].val;
Packit 6bd9ab
        }
Packit 6bd9ab
        else if ((longopts[i].has_arg == optional_argument) &&
Packit 6bd9ab
                 (argv[optind][2 + l] == '\0'))
Packit 6bd9ab
        {
Packit 6bd9ab
          optind++;
Packit 6bd9ab
          return longopts[i].val;
Packit 6bd9ab
        }
Packit 6bd9ab
      }
Packit 6bd9ab
    }
Packit 6bd9ab
  }
Packit 6bd9ab
  /* if all else fails use plain getopt() */
Packit 6bd9ab
  return getopt(argc, argv, optstring);
Packit 6bd9ab
}