Skip to content

Commit d1e8f91

Browse files
committedJun 27, 2015
Initial commit
1 parent 565c875 commit d1e8f91

File tree

2 files changed

+119
-0
lines changed

2 files changed

+119
-0
lines changed
 

‎getopt.c

+110
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
/*
2+
* Copyright (c) 1987, 1993, 1994
3+
* The Regents of the University of California. All rights reserved.
4+
*
5+
* Redistribution and use in source and binary forms, with or without
6+
* modification, are permitted provided that the following conditions
7+
* are met:
8+
* 1. Redistributions of source code must retain the above copyright
9+
* notice, this list of conditions and the following disclaimer.
10+
* 2. Redistributions in binary form must reproduce the above copyright
11+
* notice, this list of conditions and the following disclaimer in the
12+
* documentation and/or other materials provided with the distribution.
13+
* 3. All advertising materials mentioning features or use of this software
14+
* must display the following acknowledgement:
15+
* This product includes software developed by the University of
16+
* California, Berkeley and its contributors.
17+
* 4. Neither the name of the University nor the names of its contributors
18+
* may be used to endorse or promote products derived from this software
19+
* without specific prior written permission.
20+
*
21+
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22+
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24+
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25+
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26+
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27+
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28+
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29+
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30+
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31+
* SUCH DAMAGE.
32+
*/
33+
34+
#include "getopt.h"
35+
#include <string.h>
36+
#include <stdio.h>
37+
38+
int opterr = 1, /* if error message should be printed */
39+
optind = 1, /* index into parent argv vector */
40+
optopt, /* character checked for validity */
41+
optreset; /* reset getopt */
42+
char *optarg; /* argument associated with option */
43+
44+
#define BADCH (int)'?'
45+
#define BADARG (int)':'
46+
#define EMSG ""
47+
48+
/*
49+
* getopt --
50+
* Parse argc/argv argument vector.
51+
*
52+
* Note: Unlike GNU getopt(), after a non-option argument, all further
53+
* arguments are considered also non-options. This is similar to
54+
* the way non-GNU Unix systems work.
55+
*/
56+
int getopt(int nargc, char * const nargv[], const char *ostr)
57+
{
58+
static char *place = EMSG; /* option letter processing */
59+
const char *oli; /* option letter list index */
60+
61+
if (optreset || !*place) { /* update scanning pointer */
62+
optreset = 0;
63+
if (optind >= nargc || *(place = nargv[optind]) != '-') {
64+
place = EMSG;
65+
return (-1);
66+
}
67+
if (place[1] && *++place == '-') { /* found "--" */
68+
++optind;
69+
place = EMSG;
70+
return (-1);
71+
}
72+
} /* option letter okay? */
73+
if ((optopt = (int)*place++) == (int)':' ||
74+
!(oli = strchr(ostr, optopt))) {
75+
/*
76+
* if the user didn't specify '-' as an option,
77+
* assume it means -1.
78+
*/
79+
if (optopt == (int)'-')
80+
return (-1);
81+
if (!*place)
82+
++optind;
83+
if (opterr && *ostr != ':')
84+
(void)printf("illegal option -- %c\n", optopt);
85+
return (BADCH);
86+
}
87+
if (*++oli != ':') { /* don't need argument */
88+
optarg = NULL;
89+
if (!*place)
90+
++optind;
91+
}
92+
else { /* need an argument */
93+
if (*place) /* no white space */
94+
optarg = place;
95+
else if (nargc <= ++optind) { /* no arg */
96+
place = EMSG;
97+
if (*ostr == ':')
98+
return (BADARG);
99+
if (opterr)
100+
(void)printf("option requires an argument -- %c\n", optopt);
101+
return (BADCH);
102+
}
103+
else /* white space */
104+
optarg = nargv[optind];
105+
place = EMSG;
106+
++optind;
107+
}
108+
return (optopt); /* dump back option letter */
109+
}
110+

‎getopt.h

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
#ifndef GETOPT_H
2+
#define GETOPT_H
3+
4+
extern char *optarg;
5+
extern int optind;
6+
7+
int getopt(int nargc, char * const nargv[], const char *ostr) ;
8+
9+
#endif

0 commit comments

Comments
 (0)
Please sign in to comment.