1 /* vi: set sw=4 ts=4: */
5 * Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org>
7 * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
13 int safe_strtod(const char *arg, double* value)
16 int errno_save = errno;
20 *value = strtod(arg, &endptr);
21 if (errno != 0 || *endptr != '\0' || endptr == arg) {
28 int safe_strtoull(const char *arg, unsigned long long* value)
31 int errno_save = errno;
34 if (!isdigit(arg[0])) /* strtouXX takes minus signs w/o error! :( */
37 *value = strtoull(arg, &endptr, 0);
38 if (errno != 0 || *endptr != '\0' || endptr == arg) {
45 int safe_strtoll(const char *arg, long long* value)
48 int errno_save = errno;
52 *value = strtoll(arg, &endptr, 0);
53 if (errno != 0 || *endptr != '\0' || endptr == arg) {
60 int safe_strtoul(const char *arg, unsigned long* value)
63 int errno_save = errno;
66 if (!isdigit(arg[0])) /* strtouXX takes minus signs w/o error! :( */
69 *value = strtoul(arg, &endptr, 0);
70 if (errno != 0 || *endptr != '\0' || endptr == arg) {
77 int safe_strtol(const char *arg, long* value)
80 int errno_save = errno;
84 *value = strtol(arg, &endptr, 0);
85 if (errno != 0 || *endptr != '\0' || endptr == arg) {
92 /* TODO: This is what uclibc is doing. Try to do the same? */
95 #if defined __HAVE_ELF__
97 # define strong_alias(name, aliasname) _strong_alias(name, aliasname)
98 # define _strong_alias(name, aliasname) \
99 extern __typeof (name) aliasname __attribute__ ((alias (#name)));
101 #else /* !defined __HAVE_ELF__ */
103 # define strong_alias(name, aliasname) _strong_alias (name, aliasname)
104 # define _strong_alias(name, aliasname) \
105 __asm__(".global " __C_SYMBOL_PREFIX__ #aliasname "\n" \
106 ".set " __C_SYMBOL_PREFIX__ #aliasname "," __C_SYMBOL_PREFIX__ #name);
111 int safe_strtoi(const char *arg, int* value)
113 if (sizeof(long) == sizeof(int)) {
114 return safe_strtol(arg, (long*)value);
117 long lvalue = *value;
118 error = safe_strtol(arg, &lvalue);
119 if (lvalue < INT_MIN || lvalue > INT_MAX)
121 *value = (int) lvalue;
126 int safe_strtou(const char *arg, unsigned* value)
128 if (sizeof(unsigned long) == sizeof(unsigned)) {
129 return safe_strtoul(arg, (unsigned long*)value);
132 unsigned long lvalue = *value;
133 error = safe_strtoul(arg, &lvalue);
134 if (lvalue > UINT_MAX)
136 *value = (unsigned) lvalue;
141 int BUG_safe_strtou32_unimplemented(void);
142 int safe_strtou32(const char *arg, uint32_t* value)
144 if (sizeof(uint32_t) == sizeof(unsigned))
145 return safe_strtou(arg, (unsigned*)value);
146 if (sizeof(uint32_t) == sizeof(unsigned long))
147 return safe_strtoul(arg, (unsigned long*)value);
148 return BUG_safe_strtou32_unimplemented();