www.pudn.com > socks5.zip > getopt.c


/* Copyright (c) 1987, 1993                                                  */ 
/* The Regents of the University of California.  All rights reserved.        */ 
/*                                                                           */ 
/* Redistribution and use in source and binary forms, with or without        */ 
/* modification, are permitted provided that the following conditions        */ 
/* are met:                                                                  */ 
/* 1. Redistributions of source code must retain the above copyright         */ 
/*    notice, this list of conditions and the following disclaimer.          */ 
/* 2. Redistributions in binary form must reproduce the above copyright      */ 
/*    notice, this list of conditions and the following disclaimer in the    */ 
/*    documentation and/or other materials provided with the distribution.   */ 
/* 3. All advertising materials mentioning features or use of this software  */ 
/*    must display the following acknowledgement:                            */ 
/*      This product includes software developed by the University of        */ 
/*      California, Berkeley and its contributors.                           */ 
/* 4. Neither the name of the University nor the names of its contributors   */ 
/*    may be used to endorse or promote products derived from this software  */ 
/*    without specific prior written permission.                             */ 
/*                                                                           */ 
/* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND   */ 
/* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE     */ 
/* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE*/ 
/* ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE  */ 
/* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL*/ 
/* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS   */ 
/* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)     */ 
/* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT*/ 
/* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY */ 
/* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF    */ 
/* SUCH DAMAGE.                                                              */ 
 
#ifdef SHOW_SCCSIDS 
static char sccsid[] = "@(#)getopt.c	8.1 (Berkeley) 6/4/93"; 
#endif 
 
#include "config.h" 
 
#ifndef HAVE_GETOPT 
#ifndef __STDC__ 
#define const 
#endif 
#include  
#include  
#include  
 
/* Get option letter from argument vector                                    */ 
int opterr = 1;		/* if error message should be printed                */ 
int optind = 1;		/* index into parent argv vector                     */ 
int optopt;		/* character checked for validity                    */ 
int optreset;		/* reset getopt                                      */ 
char	*optarg;	/* argument associated with option                   */ 
 
#define	BADCH	(int)'?' 
#define	BADARG	(int)':' 
#define	EMSG	"" 
 
int getopt(int nargc, char * const *nargv, const char *ostr) { 
    static char *place = EMSG;		/* option letter processing          */ 
    register char *oli;			/* option letter list index          */ 
    char *p; 
	 
    if (optreset || !*place) {		/* update scanning pointer           */ 
	optreset = 0; 
	if (optind >= nargc || *(place = nargv[optind]) != '-') { 
	    place = EMSG; 
	    return(EOF); 
	} 
	if (place[1] && *++place == '-') {	/* found "--"                */ 
	    ++optind; 
	    place = EMSG; 
	    return(EOF); 
	} 
    }					/* option letter okay?               */ 
 
    if ((optopt = (int)*place++) == (int)':' || !(oli = strchr(ostr, optopt))) { 
	/* If the user didn't specify '-' as an option, assume EOF.          */ 
	if (optopt == (int)'-') return(EOF); 
	if (!*place) ++optind; 
 
	if (opterr && *ostr != ':') { 
	    if (!(p = strrchr(*nargv, '/'))) p = *nargv; 
	    else ++p; 
 
	    fprintf(stderr, "%s: illegal option -- %c\n", p, optopt); 
	} 
 
	return(BADCH); 
    } 
 
    if (*++oli != ':') {			/* don't need argument       */ 
	optarg = NULL; 
	if (!*place) ++optind; 
    } else {					/* need an argument          */ 
	if (*place) optarg = place;		/* no white space            */ 
	else if (nargc <= ++optind) {	        /* no arg                    */ 
	    place = EMSG; 
	    if (!(p = strrchr(*nargv, '/'))) p = *nargv; 
	    else ++p; 
 
	    if (*ostr == ':') return(BADARG); 
 
	    if (opterr) fprintf(stderr, "%s: option requires an argument -- %c\n", p, optopt); 
	    return(BADCH); 
	} else optarg = nargv[optind];		/* white space               */ 
 
	place = EMSG; 
	++optind; 
    } 
 
    return(optopt);				/* dump back option letter   */ 
} 
#endif