- Rearrange reactos.dff according to rosapps rearrange.
[reactos.git] / rosapps / applications / net / ncftp / ncftp / getopt.c
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
13 int gOptErr = 1; /* if error message should be printed */
14 int gOptInd = 1; /* index into parent argv vector */
15 int gOptOpt; /* character checked for validity */
16 const char *gOptArg; /* argument associated with option */
17 const char *gOptPlace = kGetoptErrMsg; /* saved position in an arg */
18
19 /* This must be called before each Getopt. */
20 void
21 GetoptReset(void)
22 {
23 gOptInd = 1;
24 gOptPlace = kGetoptErrMsg;
25 } /* GetoptReset */
26
27
28
29
30 static char *
31 NextOption(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
41 int
42 Getopt(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 */
68 gOptArg = gOptPlace;
69 else if (nargc <= ++gOptInd) { /* no arg */
70 gOptPlace = kGetoptErrMsg;
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];
76 gOptPlace = kGetoptErrMsg;
77 ++gOptInd;
78 }
79 return (gOptOpt); /* dump back Option letter */
80 } /* Getopt */
81
82 /* eof */