1 /*
2 * Disktest
3 * Copyright (c) International Business Machines Corp., 2001
4 *
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19 *
20 * Please send e-mail to yardleyb@us.ibm.com if you have
21 * questions or comments.
22 *
23 * Project Website: TBD
24 *
25 *
26 * $Id: Getopt.c,v 1.5 2008/02/14 08:22:22 subrata_modak Exp $
27 * $Log: Getopt.c,v $
28 * Revision 1.5 2008/02/14 08:22:22 subrata_modak
29 * Disktest application update to version 1.4.2, by, Brent Yardley <yardleyb@us.ibm.com>
30 *
31 * Revision 1.4 2002/03/30 01:32:14 yardleyb
32 * Major Changes:
33 *
34 * Added Dumping routines for
35 * data miscompares,
36 *
37 * Updated performance output
38 * based on command line. Gave
39 * one decimal in MB/s output.
40 *
41 * Rewrote -pL IO routine to show
42 * correct stats. Now show pass count
43 * when using -C.
44 *
45 * Minor Changes:
46 *
47 * Code cleanup to remove the plethera
48 * if #ifdef for windows/unix functional
49 * differences.
50 *
51 * Revision 1.3 2002/02/21 21:32:19 yardleyb
52 * Added more unix compatability
53 * ifdef'd function out when
54 * compiling for unix env. that
55 * have getopt
56 *
57 * Revision 1.2 2002/02/04 20:35:38 yardleyb
58 * Changed max. number of threads to 64k.
59 * Check for max threads in parsing.
60 * Fixed windows getopt to return correctly
61 * when a bad option is given.
62 * Update time output to be in the format:
63 * YEAR/MONTH/DAY-HOUR:MIN:SEC
64 * instead of epoch time.
65 *
66 * Revision 1.1 2001/12/04 18:57:36 yardleyb
67 * This source add for windows compatability only.
68 *
69 */
70
71 #ifdef WINDOWS
72
73 #include <stdio.h>
74 #include <stddef.h>
75 #include <ctype.h>
76 #include <string.h>
77 #include "getopt.h"
78
79 /*
80 *
81 * FUNCTION: getopt()
82 *
83 * Get next command line option and parameter
84 * source gathered from MS examples and modified
85 * to conform with unix like getopt.
86 *
87 */
88
89 /* Global Exportable */
90 int optind;
91 char *optarg;
92
getopt(int argc,char ** argv,char * pszValidOpts)93 int getopt(int argc, char **argv, char *pszValidOpts)
94 {
95 char chOpt;
96 char *psz = NULL;
97 char *pszParam = NULL;
98 static int iArg = 1;
99
100 if (iArg < argc) {
101 psz = &(argv[iArg][0]);
102 if (*psz == '-' || *psz == '/') {
103 /* we have an option specifier */
104 chOpt = argv[iArg][1];
105 if (isalnum(chOpt) || ispunct(chOpt)) {
106 /* we have an option character */
107 psz = strchr(pszValidOpts, chOpt);
108 if (psz != NULL) {
109 /* option is valid, we want to return chOpt */
110 if (psz[1] == ':') {
111 /* option can have a parameter */
112 psz = &(argv[iArg][2]);
113 if (*psz == '\0') {
114 /* must look at next argv for param */
115 if (iArg + 1 < argc) {
116 psz =
117 &(argv
118 [iArg +
119 1][0]);
120 if (*psz == '-'
121 || *psz ==
122 '/') {
123 /* next argv is a new option, so param
124 * not given for current option
125 */
126 fprintf
127 (stderr,
128 "-%c option requires an argument.\n",
129 chOpt);
130 chOpt =
131 '?';
132 pszParam
133 =
134 NULL;
135 } else {
136 /* next argv is the param */
137 iArg++;
138 pszParam
139 =
140 psz;
141 }
142 } else {
143 /* reached end of args looking for param */
144 }
145 } else {
146 /* param is attached to option */
147 pszParam = psz;
148 }
149 } else {
150 /* option is alone, has no parameter */
151 }
152 } else {
153 /* option specified is not in list of valid options */
154 fprintf(stderr,
155 "Invalid option -- %c\n",
156 chOpt);
157 chOpt = '?';
158 pszParam = NULL;
159 }
160 } else {
161 /* though option specifier was given, option character
162 * is not alpha or was was not specified
163 */
164 chOpt = 0;
165 pszParam = &(argv[iArg][0]);
166 }
167 } else {
168 /* standalone arg given with no option specifier */
169 chOpt = -1;
170 pszParam = &(argv[iArg][0]);
171 }
172 } else {
173 /* end of argument list */
174 chOpt = -1;
175 }
176
177 optind = iArg++;
178 optarg = pszParam;
179 return (chOpt);
180 }
181
182 #endif /* defined WINDOWS */
183