164 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			164 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * Description.
 | 
						|
 *
 | 
						|
 * Copyright (C) 1999-2009, 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;
 | 
						|
}
 |