git-svn-id: svn://openib.tc.cornell.edu/gen1/branches/WOF2-0@1528 ad392aa1-c5ef-ae45...
[mirror/winof/.git] / etc / user / getopt.c
1 /*
2  * Copyright (c) 2005 Mellanox Technologies.  All rights reserved.
3  * Copyright (c) 1996-2003 Intel Corporation. All rights reserved. 
4  *
5  * This software is available to you under the OpenIB.org BSD license
6  * below:
7  *
8  *     Redistribution and use in source and binary forms, with or
9  *     without modification, are permitted provided that the following
10  *     conditions are met:
11  *
12  *      - Redistributions of source code must retain the above
13  *        copyright notice, this list of conditions and the following
14  *        disclaimer.
15  *
16  *      - Redistributions in binary form must reproduce the above
17  *        copyright notice, this list of conditions and the following
18  *        disclaimer in the documentation and/or other materials
19  *        provided with the distribution.
20  *
21  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
24  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
25  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
26  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
27  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
28  * SOFTWARE.
29  */
30
31 #include <stdio.h>
32 #include <stdlib.h>
33 #include <string.h>
34
35 #include "getopt.h"
36
37 char *optarg;
38 int optind = 1;
39 int opterr = 1;
40 int optopt = '?';
41
42 int getopt(int argc, char **argv, char *opts)
43 {
44         char *loc;
45
46         optarg = NULL;
47
48         if (optind == argc) {
49                 return EOF;
50         }
51
52         if (argv[optind][0] != '-') {
53                 return EOF;
54         }
55
56         if (!strcmp(argv[optind], "--")) {
57                 optind++;
58                 return EOF;
59         }
60
61         optopt = argv[optind][1];
62
63         loc = strchr(opts, optopt);
64         if (loc == NULL) {
65                 return EOF;
66         }
67
68         if (loc[1] != ':') {
69                 goto out;
70         }
71
72         if (argv[optind][2] != '\0') {
73                 optarg = &argv[optind][2];
74                 goto out;
75         }
76
77         if ((optind + 1 == argc) || (argv[optind + 1][0] == '-')) {
78                 if (loc[2] != ':') {
79                         return EOF; 
80                 }
81         } else {
82                 optarg = argv[++optind];
83         }
84
85 out:
86         optind++;
87         return optopt;
88 }
89
90 int getopt_long(int argc, char **argv, char *opts,
91                                 struct option *longopts, int *longindex)
92 {
93         char arg[256];
94         char *str;
95         int i;
96
97         if (optind == argc) {
98                 return EOF;
99         }
100
101         if (argv[optind][0] != '-') {
102                 return EOF;
103         }
104
105         if (!strcmp(argv[optind], "--")) {
106                 optind++;
107                 return EOF;
108         }
109
110         if (argv[optind][1] != '-') {
111                 return getopt(argc, argv, opts);
112         }
113
114         strcpy(arg, &argv[optind][2]);
115         str = strtok(arg, "=");
116
117         for (i = 0; longopts[i].name; i++) {
118
119                 if (strcmp(str, longopts[i].name)) {
120                         continue;
121                 }
122
123                 if (longindex != NULL) {
124                         *longindex = i;
125                 }
126
127                 if (longopts[i].flag != NULL) {
128                         *(longopts[i].flag) = longopts[i].val;
129                 }
130
131                 switch (longopts[i].has_arg) {
132                 case required_argument:
133                         optarg = strtok(NULL, "=");
134                         if (optarg != NULL) {
135                                 break;
136                         }
137
138                         if (++optind == argc || argv[optind][0] == '-') {
139                                 return '?';
140                         }
141
142                         optarg = argv[optind];
143                         break;
144                 case optional_argument:
145                         optarg = strtok(NULL, "=");
146                         if (optarg != NULL) {
147                                 break;
148                         }
149
150                         if (optind + 1 == argc || argv[optind + 1][0] == '-') {
151                                 break;
152                         }
153
154                         optarg = argv[++optind];
155                         break;
156                 default:
157                         break;
158                 }
159
160                 optind++;
161                 if (longopts[i].flag == 0) {
162                         return (longopts[i].val);
163                 } else {
164                         return 0;
165                 }
166         }
167         return '?';
168 }