summaryrefslogtreecommitdiff
path: root/nuttx/lib/lib_strtol.c
diff options
context:
space:
mode:
Diffstat (limited to 'nuttx/lib/lib_strtol.c')
-rw-r--r--nuttx/lib/lib_strtol.c131
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);
-}