diff options
Diffstat (limited to 'drivers/net/wireless/bcm4329/miniopt.c')
-rw-r--r-- | drivers/net/wireless/bcm4329/miniopt.c | 163 |
1 files changed, 163 insertions, 0 deletions
diff --git a/drivers/net/wireless/bcm4329/miniopt.c b/drivers/net/wireless/bcm4329/miniopt.c new file mode 100644 index 00000000000..6a184a75f06 --- /dev/null +++ b/drivers/net/wireless/bcm4329/miniopt.c | |||
@@ -0,0 +1,163 @@ | |||
1 | /* | ||
2 | * Description. | ||
3 | * | ||
4 | * Copyright (C) 1999-2010, Broadcom Corporation | ||
5 | * | ||
6 | * Unless you and Broadcom execute a separate written software license | ||
7 | * agreement governing use of this software, this software is licensed to you | ||
8 | * under the terms of the GNU General Public License version 2 (the "GPL"), | ||
9 | * available at http://www.broadcom.com/licenses/GPLv2.php, with the | ||
10 | * following added to such license: | ||
11 | * | ||
12 | * As a special exception, the copyright holders of this software give you | ||
13 | * permission to link this software with independent modules, and to copy and | ||
14 | * distribute the resulting executable under terms of your choice, provided that | ||
15 | * you also meet, for each linked independent module, the terms and conditions of | ||
16 | * the license of that module. An independent module is a module which is not | ||
17 | * derived from this software. The special exception does not apply to any | ||
18 | * modifications of the software. | ||
19 | * | ||
20 | * Notwithstanding the above, under no circumstances may you combine this | ||
21 | * software in any way with any other Broadcom software provided under a license | ||
22 | * other than the GPL, without Broadcom's express prior written consent. | ||
23 | * $Id: miniopt.c,v 1.1.6.4 2009/09/25 00:32:01 Exp $ | ||
24 | */ | ||
25 | |||
26 | /* ---- Include Files ---------------------------------------------------- */ | ||
27 | |||
28 | #include <typedefs.h> | ||
29 | #include <stdio.h> | ||
30 | #include <stdlib.h> | ||
31 | #include <string.h> | ||
32 | #include "miniopt.h" | ||
33 | |||
34 | |||
35 | /* ---- Public Variables ------------------------------------------------- */ | ||
36 | /* ---- Private Constants and Types -------------------------------------- */ | ||
37 | |||
38 | |||
39 | |||
40 | /* ---- Private Variables ------------------------------------------------ */ | ||
41 | /* ---- Private Function Prototypes -------------------------------------- */ | ||
42 | /* ---- Functions -------------------------------------------------------- */ | ||
43 | |||
44 | /* ----------------------------------------------------------------------- */ | ||
45 | void | ||
46 | miniopt_init(miniopt_t *t, const char* name, const char* flags, bool longflags) | ||
47 | { | ||
48 | static const char *null_flags = ""; | ||
49 | |||
50 | memset(t, 0, sizeof(miniopt_t)); | ||
51 | t->name = name; | ||
52 | if (flags == NULL) | ||
53 | t->flags = null_flags; | ||
54 | else | ||
55 | t->flags = flags; | ||
56 | t->longflags = longflags; | ||
57 | } | ||
58 | |||
59 | |||
60 | /* ----------------------------------------------------------------------- */ | ||
61 | int | ||
62 | miniopt(miniopt_t *t, char **argv) | ||
63 | { | ||
64 | int keylen; | ||
65 | char *p, *eq, *valstr, *endptr = NULL; | ||
66 | int err = 0; | ||
67 | |||
68 | t->consumed = 0; | ||
69 | t->positional = FALSE; | ||
70 | memset(t->key, 0, MINIOPT_MAXKEY); | ||
71 | t->opt = '\0'; | ||
72 | t->valstr = NULL; | ||
73 | t->good_int = FALSE; | ||
74 | valstr = NULL; | ||
75 | |||
76 | if (*argv == NULL) { | ||
77 | err = -1; | ||
78 | goto exit; | ||
79 | } | ||
80 | |||
81 | p = *argv++; | ||
82 | t->consumed++; | ||
83 | |||
84 | if (!t->opt_end && !strcmp(p, "--")) { | ||
85 | t->opt_end = TRUE; | ||
86 | if (*argv == NULL) { | ||
87 | err = -1; | ||
88 | goto exit; | ||
89 | } | ||
90 | p = *argv++; | ||
91 | t->consumed++; | ||
92 | } | ||
93 | |||
94 | if (t->opt_end) { | ||
95 | t->positional = TRUE; | ||
96 | valstr = p; | ||
97 | } | ||
98 | else if (!strncmp(p, "--", 2)) { | ||
99 | eq = strchr(p, '='); | ||
100 | if (eq == NULL && !t->longflags) { | ||
101 | fprintf(stderr, | ||
102 | "%s: missing \" = \" in long param \"%s\"\n", t->name, p); | ||
103 | err = 1; | ||
104 | goto exit; | ||
105 | } | ||
106 | keylen = eq ? (eq - (p + 2)) : (int)strlen(p) - 2; | ||
107 | if (keylen > 63) keylen = 63; | ||
108 | memcpy(t->key, p + 2, keylen); | ||
109 | |||
110 | if (eq) { | ||
111 | valstr = eq + 1; | ||
112 | if (*valstr == '\0') { | ||
113 | fprintf(stderr, | ||
114 | "%s: missing value after \" = \" in long param \"%s\"\n", | ||
115 | t->name, p); | ||
116 | err = 1; | ||
117 | goto exit; | ||
118 | } | ||
119 | } | ||
120 | } | ||
121 | else if (!strncmp(p, "-", 1)) { | ||
122 | t->opt = p[1]; | ||
123 | if (strlen(p) > 2) { | ||
124 | fprintf(stderr, | ||
125 | "%s: only single char options, error on param \"%s\"\n", | ||
126 | t->name, p); | ||
127 | err = 1; | ||
128 | goto exit; | ||
129 | } | ||
130 | if (strchr(t->flags, t->opt)) { | ||
131 | /* this is a flag option, no value expected */ | ||
132 | valstr = NULL; | ||
133 | } else { | ||
134 | if (*argv == NULL) { | ||
135 | fprintf(stderr, | ||
136 | "%s: missing value parameter after \"%s\"\n", t->name, p); | ||
137 | err = 1; | ||
138 | goto exit; | ||
139 | } | ||
140 | valstr = *argv; | ||
141 | argv++; | ||
142 | t->consumed++; | ||
143 | } | ||
144 | } else { | ||
145 | t->positional = TRUE; | ||
146 | valstr = p; | ||
147 | } | ||
148 | |||
149 | /* parse valstr as int just in case */ | ||
150 | if (valstr) { | ||
151 | t->uval = (uint)strtoul(valstr, &endptr, 0); | ||
152 | t->val = (int)t->uval; | ||
153 | t->good_int = (*endptr == '\0'); | ||
154 | } | ||
155 | |||
156 | t->valstr = valstr; | ||
157 | |||
158 | exit: | ||
159 | if (err == 1) | ||
160 | t->opt = '?'; | ||
161 | |||
162 | return err; | ||
163 | } | ||