1410.4.2
by Djellel E. Difallah
removing my |
1 |
/* Copyright (C) 2002-2006 MySQL AB
|
2 |
||
3 |
This program is free software; you can redistribute it and/or modify
|
|
4 |
it under the terms of the GNU General Public License as published by
|
|
5 |
the Free Software Foundation; version 2 of the License.
|
|
6 |
||
7 |
This program is distributed in the hope that it will be useful,
|
|
8 |
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
9 |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
10 |
GNU General Public License for more details.
|
|
11 |
||
12 |
You should have received a copy of the GNU General Public License
|
|
13 |
along with this program; if not, write to the Free Software
|
|
1802.10.2
by Monty Taylor
Update all of the copyright headers to include the correct address. |
14 |
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
|
1410.4.2
by Djellel E. Difallah
removing my |
15 |
|
2173.2.1
by Monty Taylor
Fixes incorrect usage of include |
16 |
#include <config.h> |
2241.4.14
by Stewart Smith
remove some includes from my_sys.h and instead only include where needed. This helps reduce the number of files that have to be rebuilt when you change some of the more widely included header files (such as the drizzled::identifier ones) |
17 |
#include <drizzled/definitions.h> |
2281.5.1
by Muhammad Umair
Merged charset declarations of global_charset_info.h and charset_info.h into charset.h header file. |
18 |
#include <drizzled/charset.h> |
2173.2.1
by Monty Taylor
Fixes incorrect usage of include |
19 |
#include <drizzled/internal/my_sys.h> |
1410.4.2
by Djellel E. Difallah
removing my |
20 |
#include <drizzled/gettext.h> |
21 |
||
2173.2.1
by Monty Taylor
Fixes incorrect usage of include |
22 |
#include <drizzled/internal/m_string.h> |
23 |
#include <drizzled/internal/my_sys.h> |
|
24 |
#include <drizzled/error.h> |
|
25 |
#include <drizzled/option.h> |
|
26 |
#include <drizzled/typelib.h> |
|
1410.4.2
by Djellel E. Difallah
removing my |
27 |
|
28 |
#include <stdio.h> |
|
29 |
#include <stdlib.h> |
|
30 |
#include <errno.h> |
|
31 |
#include <iostream> |
|
32 |
#include <algorithm> |
|
33 |
||
34 |
using namespace std; |
|
2275.2.10
by Olaf van der Spek
Prune |
35 |
|
36 |
namespace drizzled { |
|
1410.4.2
by Djellel E. Difallah
removing my |
37 |
|
2363.1.8
by Brian Aker
--help and --version now work a bit more quickly. Also, we don't have to worry about root messing up file creation. |
38 |
static void default_reporter(enum loglevel level, const char *format, ...) |
39 |
{
|
|
40 |
va_list args; |
|
41 |
va_start(args, format); |
|
42 |
||
43 |
if (level == WARNING_LEVEL) |
|
44 |
fprintf(stderr, "%s", _("Warning: ")); |
|
45 |
else if (level == INFORMATION_LEVEL) |
|
46 |
fprintf(stderr, "%s", _("Info: ")); |
|
47 |
||
48 |
vfprintf(stderr, format, args); |
|
49 |
va_end(args); |
|
50 |
fputc('\n', stderr); |
|
51 |
fflush(stderr); |
|
52 |
}
|
|
53 |
||
54 |
/*
|
|
1410.4.2
by Djellel E. Difallah
removing my |
55 |
function: compare_strings
|
56 |
||
57 |
Works like strncmp, other than 1.) considers '-' and '_' the same.
|
|
58 |
2.) Returns -1 if strings differ, 0 if they are equal
|
|
59 |
*/
|
|
60 |
||
2363.1.8
by Brian Aker
--help and --version now work a bit more quickly. Also, we don't have to worry about root messing up file creation. |
61 |
bool getopt_compare_strings(const char *s, const char *t, uint32_t length) |
62 |
{
|
|
63 |
char const *end= s + length; |
|
64 |
for (;s != end ; s++, t++) |
|
1410.4.2
by Djellel E. Difallah
removing my |
65 |
{
|
2363.1.8
by Brian Aker
--help and --version now work a bit more quickly. Also, we don't have to worry about root messing up file creation. |
66 |
if ((*s != '-' ? *s : '_') != (*t != '-' ? *t : '_')) |
1410.4.2
by Djellel E. Difallah
removing my |
67 |
{
|
2363.1.8
by Brian Aker
--help and --version now work a bit more quickly. Also, we don't have to worry about root messing up file creation. |
68 |
return true; |
1410.4.2
by Djellel E. Difallah
removing my |
69 |
}
|
70 |
}
|
|
71 |
||
2363.1.8
by Brian Aker
--help and --version now work a bit more quickly. Also, we don't have to worry about root messing up file creation. |
72 |
return false; |
73 |
}
|
|
74 |
||
75 |
/*
|
|
1410.4.2
by Djellel E. Difallah
removing my |
76 |
function: getopt_ll_limit_value
|
77 |
||
78 |
Applies min/max/block_size to a numeric value of an option.
|
|
79 |
Returns "fixed" value.
|
|
80 |
*/
|
|
81 |
||
2363.1.8
by Brian Aker
--help and --version now work a bit more quickly. Also, we don't have to worry about root messing up file creation. |
82 |
int64_t getopt_ll_limit_value(int64_t num, const option& optp, bool *fix) |
83 |
{
|
|
84 |
int64_t old= num; |
|
85 |
bool adjusted= false; |
|
86 |
char buf1[255], buf2[255]; |
|
87 |
uint64_t block_size= optp.block_size ? optp.block_size : 1; |
|
88 |
||
89 |
if (num > 0 && ((uint64_t) num > (uint64_t) optp.max_value) && |
|
90 |
optp.max_value) /* if max value is not set -> no upper limit */ |
|
91 |
{
|
|
92 |
num= (uint64_t) optp.max_value; |
|
93 |
adjusted= true; |
|
94 |
}
|
|
95 |
||
96 |
switch ((optp.var_type & GET_TYPE_MASK)) { |
|
97 |
case GET_INT: |
|
98 |
if (num > (int64_t) INT_MAX) |
|
99 |
{
|
|
100 |
num= ((int64_t) INT_MAX); |
|
101 |
adjusted= true; |
|
102 |
}
|
|
103 |
break; |
|
104 |
case GET_LONG: |
|
105 |
if (num > (int64_t) INT32_MAX) |
|
106 |
{
|
|
107 |
num= ((int64_t) INT32_MAX); |
|
108 |
adjusted= true; |
|
109 |
}
|
|
110 |
break; |
|
111 |
default: |
|
112 |
assert((optp.var_type & GET_TYPE_MASK) == GET_LL); |
|
113 |
break; |
|
114 |
}
|
|
115 |
||
116 |
num= ((num - optp.sub_size) / block_size); |
|
117 |
num= (int64_t) (num * block_size); |
|
118 |
||
119 |
if (num < optp.min_value) |
|
120 |
{
|
|
121 |
num= optp.min_value; |
|
122 |
adjusted= true; |
|
123 |
}
|
|
124 |
||
125 |
if (fix) |
|
126 |
{
|
|
127 |
*fix= adjusted; |
|
128 |
}
|
|
129 |
else if (adjusted) |
|
130 |
{
|
|
131 |
default_reporter(WARNING_LEVEL, |
|
132 |
"option '%s': signed value %s adjusted to %s", |
|
133 |
optp.name, internal::llstr(old, buf1), internal::llstr(num, buf2)); |
|
134 |
}
|
|
135 |
return num; |
|
136 |
}
|
|
137 |
||
138 |
/*
|
|
1410.4.2
by Djellel E. Difallah
removing my |
139 |
function: getopt_ull
|
140 |
||
141 |
This is the same as getopt_ll, but is meant for uint64_t
|
|
142 |
values.
|
|
143 |
*/
|
|
144 |
||
2363.1.8
by Brian Aker
--help and --version now work a bit more quickly. Also, we don't have to worry about root messing up file creation. |
145 |
uint64_t getopt_ull_limit_value(uint64_t num, const option& optp, bool *fix) |
146 |
{
|
|
147 |
bool adjusted= false; |
|
148 |
uint64_t old= num; |
|
149 |
char buf1[255], buf2[255]; |
|
150 |
||
151 |
if ((uint64_t) num > (uint64_t) optp.max_value && |
|
152 |
optp.max_value) /* if max value is not set -> no upper limit */ |
|
153 |
{
|
|
154 |
num= (uint64_t) optp.max_value; |
|
155 |
adjusted= true; |
|
156 |
}
|
|
157 |
||
158 |
switch (optp.var_type & GET_TYPE_MASK) |
|
159 |
{
|
|
160 |
case GET_UINT: |
|
161 |
if (num > UINT_MAX) |
|
162 |
{
|
|
163 |
num= UINT_MAX; |
|
164 |
adjusted= true; |
|
165 |
}
|
|
166 |
break; |
|
167 |
case GET_UINT32: |
|
168 |
case GET_ULONG_IS_FAIL: |
|
169 |
if (num > UINT32_MAX) |
|
170 |
{
|
|
171 |
num= UINT32_MAX; |
|
172 |
adjusted= true; |
|
173 |
}
|
|
174 |
break; |
|
175 |
case GET_SIZE: |
|
176 |
if (num > SIZE_MAX) |
|
177 |
{
|
|
178 |
num= SIZE_MAX; |
|
179 |
adjusted= true; |
|
180 |
}
|
|
181 |
break; |
|
182 |
default: |
|
183 |
assert((optp.var_type & GET_TYPE_MASK) == GET_ULL || (optp.var_type & GET_TYPE_MASK) == GET_UINT64); |
|
184 |
}
|
|
185 |
||
186 |
if (optp.block_size > 1) |
|
187 |
{
|
|
188 |
num/= optp.block_size; |
|
189 |
num*= optp.block_size; |
|
190 |
}
|
|
191 |
||
192 |
if (num < (uint64_t) optp.min_value) |
|
193 |
{
|
|
194 |
num= (uint64_t) optp.min_value; |
|
195 |
adjusted= true; |
|
196 |
}
|
|
197 |
||
198 |
if (fix) |
|
199 |
*fix= adjusted; |
|
200 |
else if (adjusted) |
|
201 |
default_reporter(WARNING_LEVEL, "option '%s': unsigned value %s adjusted to %s", |
|
202 |
optp.name, internal::ullstr(old, buf1), internal::ullstr(num, buf2)); |
|
203 |
||
204 |
return num; |
|
205 |
}
|
|
206 |
||
207 |
||
208 |
/*
|
|
1410.4.2
by Djellel E. Difallah
removing my |
209 |
function: my_print_options
|
210 |
||
211 |
Print help for all options and variables.
|
|
212 |
*/
|
|
213 |
||
2363.1.8
by Brian Aker
--help and --version now work a bit more quickly. Also, we don't have to worry about root messing up file creation. |
214 |
void my_print_help(const option* options) |
215 |
{
|
|
216 |
uint32_t col, name_space= 22, comment_space= 57; |
|
217 |
const char *line_end; |
|
218 |
const struct option *optp; |
|
219 |
||
220 |
for (optp= options; optp->id; optp++) |
|
1410.4.2
by Djellel E. Difallah
removing my |
221 |
{
|
2363.1.8
by Brian Aker
--help and --version now work a bit more quickly. Also, we don't have to worry about root messing up file creation. |
222 |
if (optp->id < 256) |
223 |
{
|
|
224 |
printf(" -%c%s", optp->id, strlen(optp->name) ? ", " : " "); |
|
225 |
col= 6; |
|
226 |
}
|
|
227 |
else
|
|
228 |
{
|
|
229 |
printf(" "); |
|
230 |
col= 2; |
|
231 |
}
|
|
232 |
if (strlen(optp->name)) |
|
233 |
{
|
|
234 |
printf("--%s", optp->name); |
|
235 |
col+= 2 + (uint32_t) strlen(optp->name); |
|
236 |
if ((optp->var_type & GET_TYPE_MASK) == GET_STR || |
|
237 |
(optp->var_type & GET_TYPE_MASK) == GET_STR_ALLOC) |
|
238 |
{
|
|
239 |
printf("%s=name%s ", optp->arg_type == OPT_ARG ? "[" : "", |
|
240 |
optp->arg_type == OPT_ARG ? "]" : ""); |
|
241 |
col+= (optp->arg_type == OPT_ARG) ? 8 : 6; |
|
242 |
}
|
|
243 |
else if ((optp->var_type & GET_TYPE_MASK) == GET_NO_ARG || |
|
244 |
(optp->var_type & GET_TYPE_MASK) == GET_BOOL) |
|
245 |
{
|
|
246 |
putchar(' '); |
|
247 |
col++; |
|
1410.4.2
by Djellel E. Difallah
removing my |
248 |
}
|
249 |
else
|
|
250 |
{
|
|
2363.1.8
by Brian Aker
--help and --version now work a bit more quickly. Also, we don't have to worry about root messing up file creation. |
251 |
printf("%s=#%s ", optp->arg_type == OPT_ARG ? "[" : "", |
252 |
optp->arg_type == OPT_ARG ? "]" : ""); |
|
253 |
col+= (optp->arg_type == OPT_ARG) ? 5 : 3; |
|
254 |
}
|
|
255 |
if (col > name_space && optp->comment && *optp->comment) |
|
256 |
{
|
|
257 |
putchar('\n'); |
|
258 |
col= 0; |
|
259 |
}
|
|
260 |
}
|
|
261 |
for (; col < name_space; col++) |
|
262 |
putchar(' '); |
|
263 |
if (optp->comment && *optp->comment) |
|
264 |
{
|
|
265 |
const char *comment= _(optp->comment), *end= strchr(comment, '\0'); |
|
266 |
||
267 |
while ((uint32_t) (end - comment) > comment_space) |
|
268 |
{
|
|
269 |
for (line_end= comment + comment_space; *line_end != ' '; line_end--) |
|
270 |
{}
|
|
271 |
for (; comment != line_end; comment++) |
|
272 |
putchar(*comment); |
|
273 |
comment++; /* skip the space, as a newline will take it's place now */ |
|
274 |
putchar('\n'); |
|
275 |
for (col= 0; col < name_space; col++) |
|
1410.4.2
by Djellel E. Difallah
removing my |
276 |
putchar(' '); |
2363.1.8
by Brian Aker
--help and --version now work a bit more quickly. Also, we don't have to worry about root messing up file creation. |
277 |
}
|
278 |
printf("%s", comment); |
|
279 |
}
|
|
280 |
putchar('\n'); |
|
281 |
if ((optp->var_type & GET_TYPE_MASK) == GET_NO_ARG || |
|
282 |
(optp->var_type & GET_TYPE_MASK) == GET_BOOL) |
|
283 |
{
|
|
284 |
if (optp->def_value != 0) |
|
285 |
{
|
|
286 |
printf(_("%*s(Defaults to on; use --skip-%s to disable.)\n"), name_space, "", optp->name); |
|
1410.4.2
by Djellel E. Difallah
removing my |
287 |
}
|
288 |
}
|
|
289 |
}
|
|
2363.1.8
by Brian Aker
--help and --version now work a bit more quickly. Also, we don't have to worry about root messing up file creation. |
290 |
}
|
1410.4.2
by Djellel E. Difallah
removing my |
291 |
|
292 |
||
293 |
} /* namespace drizzled */ |