164 lines
4.0 KiB
C
164 lines
4.0 KiB
C
/*
|
|
* Description.
|
|
*
|
|
* Copyright (C) 1999-2010, Broadcom Corporation
|
|
*
|
|
* Unless you and Broadcom execute a separate written software license
|
|
* agreement governing use of this software, this software is licensed to you
|
|
* under the terms of the GNU General Public License version 2 (the "GPL"),
|
|
* available at http://www.broadcom.com/licenses/GPLv2.php, with the
|
|
* following added to such license:
|
|
*
|
|
* As a special exception, the copyright holders of this software give you
|
|
* permission to link this software with independent modules, and to copy and
|
|
* distribute the resulting executable under terms of your choice, provided that
|
|
* you also meet, for each linked independent module, the terms and conditions of
|
|
* the license of that module. An independent module is a module which is not
|
|
* derived from this software. The special exception does not apply to any
|
|
* modifications of the software.
|
|
*
|
|
* Notwithstanding the above, under no circumstances may you combine this
|
|
* software in any way with any other Broadcom software provided under a license
|
|
* other than the GPL, without Broadcom's express prior written consent.
|
|
* $Id: miniopt.c,v 1.1.6.4 2009/09/25 00:32:01 Exp $
|
|
*/
|
|
|
|
/* ---- Include Files ---------------------------------------------------- */
|
|
|
|
#include <typedefs.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include "miniopt.h"
|
|
|
|
|
|
/* ---- Public Variables ------------------------------------------------- */
|
|
/* ---- Private Constants and Types -------------------------------------- */
|
|
|
|
|
|
|
|
/* ---- Private Variables ------------------------------------------------ */
|
|
/* ---- Private Function Prototypes -------------------------------------- */
|
|
/* ---- Functions -------------------------------------------------------- */
|
|
|
|
/* ----------------------------------------------------------------------- */
|
|
void
|
|
miniopt_init(miniopt_t *t, const char* name, const char* flags, bool longflags)
|
|
{
|
|
static const char *null_flags = "";
|
|
|
|
memset(t, 0, sizeof(miniopt_t));
|
|
t->name = name;
|
|
if (flags == NULL)
|
|
t->flags = null_flags;
|
|
else
|
|
t->flags = flags;
|
|
t->longflags = longflags;
|
|
}
|
|
|
|
|
|
/* ----------------------------------------------------------------------- */
|
|
int
|
|
miniopt(miniopt_t *t, char **argv)
|
|
{
|
|
int keylen;
|
|
char *p, *eq, *valstr, *endptr = NULL;
|
|
int err = 0;
|
|
|
|
t->consumed = 0;
|
|
t->positional = FALSE;
|
|
memset(t->key, 0, MINIOPT_MAXKEY);
|
|
t->opt = '\0';
|
|
t->valstr = NULL;
|
|
t->good_int = FALSE;
|
|
valstr = NULL;
|
|
|
|
if (*argv == NULL) {
|
|
err = -1;
|
|
goto exit;
|
|
}
|
|
|
|
p = *argv++;
|
|
t->consumed++;
|
|
|
|
if (!t->opt_end && !strcmp(p, "--")) {
|
|
t->opt_end = TRUE;
|
|
if (*argv == NULL) {
|
|
err = -1;
|
|
goto exit;
|
|
}
|
|
p = *argv++;
|
|
t->consumed++;
|
|
}
|
|
|
|
if (t->opt_end) {
|
|
t->positional = TRUE;
|
|
valstr = p;
|
|
}
|
|
else if (!strncmp(p, "--", 2)) {
|
|
eq = strchr(p, '=');
|
|
if (eq == NULL && !t->longflags) {
|
|
fprintf(stderr,
|
|
"%s: missing \" = \" in long param \"%s\"\n", t->name, p);
|
|
err = 1;
|
|
goto exit;
|
|
}
|
|
keylen = eq ? (eq - (p + 2)) : (int)strlen(p) - 2;
|
|
if (keylen > 63) keylen = 63;
|
|
memcpy(t->key, p + 2, keylen);
|
|
|
|
if (eq) {
|
|
valstr = eq + 1;
|
|
if (*valstr == '\0') {
|
|
fprintf(stderr,
|
|
"%s: missing value after \" = \" in long param \"%s\"\n",
|
|
t->name, p);
|
|
err = 1;
|
|
goto exit;
|
|
}
|
|
}
|
|
}
|
|
else if (!strncmp(p, "-", 1)) {
|
|
t->opt = p[1];
|
|
if (strlen(p) > 2) {
|
|
fprintf(stderr,
|
|
"%s: only single char options, error on param \"%s\"\n",
|
|
t->name, p);
|
|
err = 1;
|
|
goto exit;
|
|
}
|
|
if (strchr(t->flags, t->opt)) {
|
|
/* this is a flag option, no value expected */
|
|
valstr = NULL;
|
|
} else {
|
|
if (*argv == NULL) {
|
|
fprintf(stderr,
|
|
"%s: missing value parameter after \"%s\"\n", t->name, p);
|
|
err = 1;
|
|
goto exit;
|
|
}
|
|
valstr = *argv;
|
|
argv++;
|
|
t->consumed++;
|
|
}
|
|
} else {
|
|
t->positional = TRUE;
|
|
valstr = p;
|
|
}
|
|
|
|
/* parse valstr as int just in case */
|
|
if (valstr) {
|
|
t->uval = (uint)strtoul(valstr, &endptr, 0);
|
|
t->val = (int)t->uval;
|
|
t->good_int = (*endptr == '\0');
|
|
}
|
|
|
|
t->valstr = valstr;
|
|
|
|
exit:
|
|
if (err == 1)
|
|
t->opt = '?';
|
|
|
|
return err;
|
|
}
|