ReactOS 0.4.16-dev-91-g764881a
getopt.c
Go to the documentation of this file.
1/* getopt.c
2 *
3 * Copyright (c) 1992-2001 by Mike Gleason.
4 * All rights reserved.
5 *
6 */
7
8#include <stdio.h>
9#include <string.h>
10
11#include "getopt.h"
12
13int gOptErr = 1; /* if error message should be printed */
14int gOptInd = 1; /* index into parent argv vector */
15int gOptOpt; /* character checked for validity */
16const char *gOptArg; /* argument associated with option */
17const char *gOptPlace = kGetoptErrMsg; /* saved position in an arg */
18
19/* This must be called before each Getopt. */
20void
22{
23 gOptInd = 1;
25} /* GetoptReset */
26
27
28
29
30static char *
31NextOption(const char *const ostr)
32{
33 if ((gOptOpt = (int) *gOptPlace++) == (int) ':')
34 return 0;
35 return strchr(ostr, gOptOpt);
36} /* NextOption */
37
38
39
40
41int
42Getopt(int nargc, const char **const nargv, const char *const ostr)
43{
44 const char *oli; /* Option letter list index */
45
46 if (!*gOptPlace) { /* update scanning pointer */
47 if (gOptInd >= nargc || *(gOptPlace = nargv[gOptInd]) != '-')
48 return (EOF);
49 if (gOptPlace[1] && *++gOptPlace == '-') { /* found "--" */
50 ++gOptInd;
51 return (EOF);
52 }
53 } /* Option letter okay? */
54 oli = NextOption(ostr);
55 if (oli == NULL) {
56 if (!*gOptPlace)
57 ++gOptInd;
58 if (gOptErr)
59 (void) fprintf(stderr, "%s%s%c\n", *nargv, ": illegal option -- ", gOptOpt);
60 return(kGetoptBadChar);
61 }
62 if (*++oli != ':') { /* don't need argument */
63 gOptArg = NULL;
64 if (!*gOptPlace)
65 ++gOptInd;
66 } else { /* need an argument */
67 if (*gOptPlace) /* no white space */
69 else if (nargc <= ++gOptInd) { /* no arg */
71 if (gOptErr)
72 (void) fprintf(stderr, "%s%s%c\n", *nargv, ": option requires an argument -- ", gOptOpt);
73 return(kGetoptBadChar);
74 } else /* white space */
75 gOptArg = nargv[gOptInd];
77 ++gOptInd;
78 }
79 return (gOptOpt); /* dump back Option letter */
80} /* Getopt */
81
82/* eof */
char * strchr(const char *String, int ch)
Definition: utclib.c:501
#define NULL
Definition: types.h:112
#define EOF
Definition: stdio.h:24
#define stderr
Definition: stdio.h:100
_Check_return_opt_ _CRTIMP int __cdecl fprintf(_Inout_ FILE *_File, _In_z_ _Printf_format_string_ const char *_Format,...)
int gOptErr
Definition: getopt.c:13
const char * gOptArg
Definition: getopt.c:16
void GetoptReset(void)
Definition: getopt.c:21
int gOptInd
Definition: getopt.c:14
int gOptOpt
Definition: getopt.c:15
static char * NextOption(const char *const ostr)
Definition: getopt.c:31
const char * gOptPlace
Definition: getopt.c:17
int Getopt(int nargc, const char **const nargv, const char *const ostr)
Definition: getopt.c:42
#define kGetoptErrMsg
Definition: getopt.h:9
#define kGetoptBadChar
Definition: getopt.h:8