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