|
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 |
}
|