diff options
Diffstat (limited to 'nuttx/lib/lib_strtol.c')
-rw-r--r-- | nuttx/lib/lib_strtol.c | 131 |
1 files changed, 28 insertions, 103 deletions
diff --git a/nuttx/lib/lib_strtol.c b/nuttx/lib/lib_strtol.c index 8e2d26f3f..dcd376523 100644 --- a/nuttx/lib/lib_strtol.c +++ b/nuttx/lib/lib_strtol.c @@ -1,4 +1,4 @@ -/************************************************************ +/**************************************************************************** * lib_strtol.c * * Copyright (C) 2007 Gregory Nutt. All rights reserved. @@ -14,7 +14,7 @@ * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. - * 3. Neither the name Gregory Nutt nor the names of its contributors may be + * 3. Neither the name NuttX nor the names of its contributors may be * used to endorse or promote products derived from this software * without specific prior written permission. * @@ -31,80 +31,41 @@ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * - ************************************************************/ + ****************************************************************************/ -/************************************************************ +/**************************************************************************** * Included Files - ************************************************************/ + ****************************************************************************/ #include <nuttx/config.h> #include <sys/types.h> -#include <string.h> -#include <ctype.h> +#include <stdlib.h> +#include "lib_internal.h" -/************************************************************ +/**************************************************************************** * Private Functions - ************************************************************/ + ****************************************************************************/ -/* Skip leading spaces */ - -static void lib_skipspace(const char **nptr) -{ - register const char *tmp = *nptr; - while (isspace(*tmp)) tmp++; - *nptr = tmp; -} - -static int lib_isbasedigit(int c, int base, int *value) -{ - int tmp = 0; - int ret = 0; - - if (base <= 10) - { - if (c >= '0' && c <= base + '0' - 1) - { - tmp = c - '0'; - ret = 1; - } - } - else if (base <= 36) - { - if (c >= '0' && c <= '9') - { - tmp = c - '0'; - ret = 1; - } - else if (c >= 'a' && c <= 'a' + base - 11) - { - tmp = c - 'a' + 10; - ret = 1; - } - else if (c >= 'A' && c <= 'A' + base - 11) - { - tmp = c - 'A' + 10; - ret = 1; - } - } - - if (value) - { - *value = tmp; - } - return ret; -} - -/************************************************************ +/**************************************************************************** * Public Functions - ************************************************************/ - -/* Limited to base 1-36 */ + ****************************************************************************/ +/**************************************************************************** + * Name: strtol + * + * Description: + * The strtol() function converts the initial part of the string in + * nptr to a long integer value according to the given base, which must be + * between 2 and 36 inclusive, or be the special value 0. + * + * Warning: does not check for integer overflow! + * + ****************************************************************************/ + long strtol(const char *nptr, char **endptr, int base) { unsigned long accum = 0; - int value; - int negate = 0; + boolean negate = FALSE; if (nptr) { @@ -116,51 +77,19 @@ long strtol(const char *nptr, char **endptr, int base) if (*nptr == '-') { - negate = 1; + negate = TRUE; nptr++; - lib_skipspace(&nptr); } else if (*nptr == '+') { nptr++; - lib_skipspace(&nptr); } - /* Check for unspecified base */ + /* Get the unsigned value */ - if (!base) - { - base = 10; - if (*nptr == '0') - { - base = 8; - nptr++; - if ((*nptr == 'X' || *nptr == 'x') && - lib_isbasedigit(nptr[1], 16, NULL)) - { - base = 16; - nptr++; - } - } - } - else if (base == 16) - { - if (nptr[0] == '0' && (nptr[1] == 'X' || nptr[1] == 'x')) - { - nptr += 2; - } - } + accum = strtoul(nptr, endptr, base); - while (lib_isbasedigit(*nptr, base, &value)) - { - accum = accum*base + value; - nptr++; - } - - if (endptr) - { - *endptr = (char *)nptr; - } + /* Correct the sign of the result */ if (negate) { @@ -170,7 +99,3 @@ long strtol(const char *nptr, char **endptr, int base) return (long)accum; } -unsigned long strtoul(const char *nptr, char **endptr, int base) -{ - return (unsigned long)strtol(nptr, endptr, base); -} |