• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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