summaryrefslogtreecommitdiffstats
path: root/cpukit/libmisc/stringto
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>2009-07-22 14:26:25 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>2009-07-22 14:26:25 +0000
commite8d59ca6af8991e23309bddd9b200f06c0e9d4a7 (patch)
treebb62e4d5839ba93747af34afc2ae28cce03c48f2 /cpukit/libmisc/stringto
parent2009-07-22 Joel Sherrill <joel.sherrill@oarcorp.com> (diff)
downloadrtems-e8d59ca6af8991e23309bddd9b200f06c0e9d4a7.tar.bz2
2009-07-22 Joel Sherrill <joel.sherrill@oarcorp.com>
* Makefile.am, preinstall.am, libmisc/Makefile.am, wrapup/Makefile.am: Add the stringto family of string to number converters. These are error checking wrappers for the strtoXXX methods and do their best to return false if the conversion failed. The error checking required for this is tedious and error prone. Hence better to have in a family of helper routines. * libmisc/stringto/stringto.h, libmisc/stringto/stringto_template.h, libmisc/stringto/stringtodouble.c, libmisc/stringto/stringtofloat.c, libmisc/stringto/stringtoint.c, libmisc/stringto/stringtolong.c, libmisc/stringto/stringtolonglong.c, libmisc/stringto/stringtounsignedchar.c, libmisc/stringto/stringtounsignedint.c, libmisc/stringto/stringtounsignedlong.c, libmisc/stringto/stringtounsignedlonglong.c: New files.
Diffstat (limited to 'cpukit/libmisc/stringto')
-rw-r--r--cpukit/libmisc/stringto/stringto.h176
-rw-r--r--cpukit/libmisc/stringto/stringto_template.h107
-rw-r--r--cpukit/libmisc/stringto/stringtodouble.c21
-rw-r--r--cpukit/libmisc/stringto/stringtofloat.c20
-rw-r--r--cpukit/libmisc/stringto/stringtoint.c20
-rw-r--r--cpukit/libmisc/stringto/stringtolong.c21
-rw-r--r--cpukit/libmisc/stringto/stringtolonglong.c21
-rw-r--r--cpukit/libmisc/stringto/stringtounsignedchar.c20
-rw-r--r--cpukit/libmisc/stringto/stringtounsignedint.c20
-rw-r--r--cpukit/libmisc/stringto/stringtounsignedlong.c20
-rw-r--r--cpukit/libmisc/stringto/stringtounsignedlonglong.c20
11 files changed, 466 insertions, 0 deletions
diff --git a/cpukit/libmisc/stringto/stringto.h b/cpukit/libmisc/stringto/stringto.h
new file mode 100644
index 0000000000..2e7fe151c6
--- /dev/null
+++ b/cpukit/libmisc/stringto/stringto.h
@@ -0,0 +1,176 @@
+/*
+ * COPYRIGHT (c) 2009.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id$
+ */
+
+#ifndef __STRING_TO_A_TYPE_h__
+#define __STRING_TO_A_TYPE_h__
+
+/**
+ * @brief Convert String to Unsigned Character (with validation)
+ *
+ * This method converts a string to an unsigned character with
+ * range validation.
+ *
+ * @param[in] s is the string to convert
+ * @param[in] n points to the variable to place the converted output in
+ * @param[in] endptr is used to keep track of the position in the string
+ * @param[in] base is the expected base of the number
+ *
+ * @return This method returns true on successful conversion and *n is
+ * filled in.
+ */
+bool rtems_string_to_unsigned_char(
+ const char *s,
+ unsigned char *n,
+ char **endptr,
+ int base
+);
+
+/**
+ * @brief Convert String to Int (with validation)
+ *
+ * This method converts a string to an int with range validation.
+ *
+ * @param[in] s is the string to convert
+ * @param[in] n points to the variable to place the converted output in
+ * @param[in] endptr is used to keep track of the position in the string
+ * @param[in] base is the expected base of the number
+ *
+ * @return This method returns true on successful conversion and *n is
+ * filled in.
+ */
+bool rtems_string_to_int(
+ const char *s,
+ int *n,
+ char **endptr,
+ int base
+);
+
+/**
+ * @brief Convert String to Long (with validation)
+ *
+ * This method converts a string to a long with
+ * range validation.
+ *
+ * @param[in] s is the string to convert
+ * @param[in] n points to the variable to place the converted output in
+ * @param[in] endptr is used to keep track of the position in the string
+ * @param[in] base is the expected base of the number
+ *
+ * @return This method returns true on successful conversion and *n is
+ * filled in.
+ */
+bool rtems_string_to_long(
+ const char *s,
+ long *n,
+ char **endptr,
+ int base
+);
+
+/**
+ * @brief Convert String to Unsigned Long (with validation)
+ *
+ * This method converts a string to an unsigned long with
+ * range validation.
+ *
+ * @param[in] s is the string to convert
+ * @param[in] n points to the variable to place the converted output in
+ * @param[in] endptr is used to keep track of the position in the string
+ * @param[in] base is the expected base of the number
+ *
+ * @return This method returns true on successful conversion and *n is
+ * filled in.
+ */
+bool rtems_string_to_unsigned_long(
+ const char *s,
+ unsigned long *n,
+ char **endptr,
+ int base
+);
+
+/**
+ * @brief Convert String to Long Long (with validation)
+ *
+ * This method converts a string to a long long with
+ * range validation.
+ *
+ * @param[in] s is the string to convert
+ * @param[in] n points to the variable to place the converted output in
+ * @param[in] endptr is used to keep track of the position in the string
+ * @param[in] base is the expected base of the number
+ *
+ * @return This method returns true on successful conversion and *n is
+ * filled in.
+ */
+bool rtems_string_to_long_long(
+ const char *s,
+ long long *n,
+ char **endptr,
+ int base
+);
+
+/**
+ * @brief Convert String to Unsigned Long Long (with validation)
+ *
+ * This method converts a string to an unsigned character with
+ * range validation.
+ *
+ * @param[in] s is the string to convert
+ * @param[in] n points to the variable to place the converted output in
+ * @param[in] endptr is used to keep track of the position in the string
+ * @param[in] base is the expected base of the number
+ *
+ * @return This method returns true on successful conversion and *n is
+ * filled in.
+ */
+bool rtems_string_to_unsigned_long_long(
+ const char *s,
+ unsigned long long *n,
+ char **endptr,
+ int base
+);
+
+/**
+ * @brief Convert String to Float (with validation)
+ *
+ * This method converts a string to a float with range validation.
+ *
+ * @param[in] s is the string to convert
+ * @param[in] n points to the variable to place the converted output in
+ * @param[in] endptr is used to keep track of the position in the string
+ *
+ * @return This method returns true on successful conversion and *n is
+ * filled in.
+ */
+bool rtems_string_to_float(
+ const char *s,
+ float *n,
+ char **endptr
+);
+
+/**
+ * @brief Convert String to Double (with validation)
+ *
+ * This method converts a string to a double with range validation.
+ *
+ * @param[in] s is the string to convert
+ * @param[in] n points to the variable to place the converted output in
+ * @param[in] endptr is used to keep track of the position in the string
+ *
+ * @return This method returns true on successful conversion and *n is
+ * filled in.
+ */
+bool rtems_string_to_double(
+ const char *s,
+ double *n,
+ char **endptr
+);
+
+#endif
diff --git a/cpukit/libmisc/stringto/stringto_template.h b/cpukit/libmisc/stringto/stringto_template.h
new file mode 100644
index 0000000000..b1890e81d0
--- /dev/null
+++ b/cpukit/libmisc/stringto/stringto_template.h
@@ -0,0 +1,107 @@
+/*
+ * COPYRIGHT (c) 2009.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id$
+ */
+
+#include <errno.h>
+#include <stdlib.h>
+#include <limits.h>
+#include <stdbool.h>
+
+#include <math.h>
+
+/*
+ * This file is designed to be included multiple times to instantiate
+ * it and should NOT be protected against multiple inclusions.
+ */
+
+#if !defined(STRING_TO_FLOAT) && !defined(STRING_TO_INTEGER)
+ #error "Neither STRING_TO_FLOAT nor STRING_TO_INTEGER defined"
+#endif
+
+#if defined(STRING_TO_FLOAT) && defined(STRING_TO_INTEGER)
+ #error "Both STRING_TO_FLOAT nor STRING_TO_INTEGER defined"
+#endif
+
+#ifndef STRING_TO_TYPE
+ #error "STRING_TO_TYPE not defined"
+#endif
+
+#ifndef STRING_TO_NAME
+ #error "STRING_TO_NAME not defined"
+#endif
+
+#ifndef STRING_TO_METHOD
+ #error "STRING_TO_METHOD not defined"
+#endif
+
+#ifndef STRING_TO_MAX
+ #error "STRING_TO_MAX not defined"
+#endif
+
+#undef ZERO
+#ifdef STRING_TO_FLOAT
+ #define ZERO 0.0
+#elif defined(STRING_TO_INTEGER)
+ #define ZERO 0
+#endif
+
+bool STRING_TO_NAME (
+ const char *s,
+ STRING_TO_TYPE *n,
+ char **endptr
+ #if defined(STRING_TO_INTEGER)
+ ,
+ int base
+ #endif
+)
+{
+ STRING_TO_TYPE result;
+ char *end;
+
+ if ( !n )
+ return false;
+
+ errno = 0;
+ *n = 0;
+
+ #ifdef STRING_TO_FLOAT
+ result = STRING_TO_METHOD( s, &end );
+ #elif defined(STRING_TO_INTEGER)
+ result = STRING_TO_METHOD( s, &end, base );
+ #endif
+
+ /* If the user wants the end pointer back, then return it. */
+ if ( endptr )
+ *endptr = end;
+
+ /* nothing was converted */
+ if ( end == s )
+ return false;
+
+ /* there was a conversion error */
+ if ( (result == ZERO) && errno )
+ return false;
+
+ #ifdef STRING_TO_MAX
+ /* there was an overflow */
+ if ( (result == STRING_TO_MAX) && (errno == ERANGE))
+ return false;
+ #endif
+
+ #ifdef STRING_TO_MIN
+ /* there was an underflow */
+ if ( (result == STRING_TO_MIN) && (errno == ERANGE))
+ return false;
+ #endif
+
+ *n = result;
+ return true;
+}
+
diff --git a/cpukit/libmisc/stringto/stringtodouble.c b/cpukit/libmisc/stringto/stringtodouble.c
new file mode 100644
index 0000000000..080b53c60d
--- /dev/null
+++ b/cpukit/libmisc/stringto/stringtodouble.c
@@ -0,0 +1,21 @@
+/*
+ * COPYRIGHT (c) 2009.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id$
+ */
+
+/*
+ * Instantiate an error checking wrapper for strtod (double)
+ */
+#define STRING_TO_FLOAT
+#define STRING_TO_TYPE double
+#define STRING_TO_NAME rtems_string_to_double
+#define STRING_TO_METHOD strtod
+#define STRING_TO_MAX HUGE_VAL
+#include "stringto_template.h"
+
diff --git a/cpukit/libmisc/stringto/stringtofloat.c b/cpukit/libmisc/stringto/stringtofloat.c
new file mode 100644
index 0000000000..2de118278f
--- /dev/null
+++ b/cpukit/libmisc/stringto/stringtofloat.c
@@ -0,0 +1,20 @@
+/*
+ * COPYRIGHT (c) 2009.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id$
+ */
+
+/*
+ * Instantiate an error checking wrapper for strtof (float)
+ */
+#define STRING_TO_FLOAT
+#define STRING_TO_TYPE float
+#define STRING_TO_NAME rtems_string_to_float
+#define STRING_TO_METHOD strtof
+#define STRING_TO_MAX HUGE_VALF
+#include "stringto_template.h"
diff --git a/cpukit/libmisc/stringto/stringtoint.c b/cpukit/libmisc/stringto/stringtoint.c
new file mode 100644
index 0000000000..0e87a3357b
--- /dev/null
+++ b/cpukit/libmisc/stringto/stringtoint.c
@@ -0,0 +1,20 @@
+/*
+ * COPYRIGHT (c) 2009.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id$
+ */
+
+/*
+ * Instantiate an error checking wrapper for strtol (int)
+ */
+#define STRING_TO_INTEGER
+#define STRING_TO_TYPE int
+#define STRING_TO_NAME rtems_string_to_int
+#define STRING_TO_METHOD strtol
+#define STRING_TO_MAX LONG_MAX
+#include "stringto_template.h"
diff --git a/cpukit/libmisc/stringto/stringtolong.c b/cpukit/libmisc/stringto/stringtolong.c
new file mode 100644
index 0000000000..fd8234e431
--- /dev/null
+++ b/cpukit/libmisc/stringto/stringtolong.c
@@ -0,0 +1,21 @@
+/*
+ * COPYRIGHT (c) 2009.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id$
+ */
+
+/*
+ * Instantiate an error checking wrapper for strtol (long)
+ */
+#define STRING_TO_INTEGER
+#define STRING_TO_TYPE long int
+#define STRING_TO_NAME rtems_string_to_long
+#define STRING_TO_METHOD strtol
+#define STRING_TO_MIN LONG_MIN
+#define STRING_TO_MAX LONG_MAX
+#include "stringto_template.h"
diff --git a/cpukit/libmisc/stringto/stringtolonglong.c b/cpukit/libmisc/stringto/stringtolonglong.c
new file mode 100644
index 0000000000..390612e211
--- /dev/null
+++ b/cpukit/libmisc/stringto/stringtolonglong.c
@@ -0,0 +1,21 @@
+/*
+ * COPYRIGHT (c) 2009.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id$
+ */
+
+/*
+ * Instantiate an error checking wrapper for strtoll (long long)
+ */
+#define STRING_TO_INTEGER
+#define STRING_TO_TYPE long long
+#define STRING_TO_NAME rtems_string_to_long_long
+#define STRING_TO_METHOD strtoll
+#define STRING_TO_MIN LONG_LONG_MIN
+#define STRING_TO_MAX LONG_LONG_MAX
+#include "stringto_template.h"
diff --git a/cpukit/libmisc/stringto/stringtounsignedchar.c b/cpukit/libmisc/stringto/stringtounsignedchar.c
new file mode 100644
index 0000000000..b9a3e983bd
--- /dev/null
+++ b/cpukit/libmisc/stringto/stringtounsignedchar.c
@@ -0,0 +1,20 @@
+/*
+ * COPYRIGHT (c) 2009.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id$
+ */
+
+/*
+ * Instantiate an error checking wrapper for strtol (unsigned char)
+ */
+#define STRING_TO_INTEGER
+#define STRING_TO_TYPE unsigned char
+#define STRING_TO_NAME rtems_string_to_unsigned_char
+#define STRING_TO_METHOD strtoul
+#define STRING_TO_MAX ULONG_MAX
+#include "stringto_template.h"
diff --git a/cpukit/libmisc/stringto/stringtounsignedint.c b/cpukit/libmisc/stringto/stringtounsignedint.c
new file mode 100644
index 0000000000..82f45abe5d
--- /dev/null
+++ b/cpukit/libmisc/stringto/stringtounsignedint.c
@@ -0,0 +1,20 @@
+/*
+ * COPYRIGHT (c) 2009.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id$
+ */
+
+/*
+ * Instantiate an error checking wrapper for strtoul (unsigned int)
+ */
+#define STRING_TO_INTEGER
+#define STRING_TO_TYPE unsigned int
+#define STRING_TO_NAME rtems_string_to_unsigned_int
+#define STRING_TO_METHOD strtoul
+#define STRING_TO_MAX ULONG_MAX
+#include "stringto_template.h"
diff --git a/cpukit/libmisc/stringto/stringtounsignedlong.c b/cpukit/libmisc/stringto/stringtounsignedlong.c
new file mode 100644
index 0000000000..0a66e88ee4
--- /dev/null
+++ b/cpukit/libmisc/stringto/stringtounsignedlong.c
@@ -0,0 +1,20 @@
+/*
+ * COPYRIGHT (c) 2009.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id$
+ */
+
+/*
+ * Instantiate an error checking wrapper for strtoul (unsigned long)
+ */
+#define STRING_TO_INTEGER
+#define STRING_TO_TYPE unsigned long int
+#define STRING_TO_NAME rtems_string_to_unsigned_long
+#define STRING_TO_METHOD strtoul
+#define STRING_TO_MAX ULONG_MAX
+#include "stringto_template.h"
diff --git a/cpukit/libmisc/stringto/stringtounsignedlonglong.c b/cpukit/libmisc/stringto/stringtounsignedlonglong.c
new file mode 100644
index 0000000000..6f79c3d874
--- /dev/null
+++ b/cpukit/libmisc/stringto/stringtounsignedlonglong.c
@@ -0,0 +1,20 @@
+/*
+ * COPYRIGHT (c) 2009.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id$
+ */
+
+/*
+ * Instantiate an error checking wrapper for strtoull (unsigned long long)
+ */
+#define STRING_TO_INTEGER
+#define STRING_TO_TYPE unsigned long long
+#define STRING_TO_NAME rtems_string_to_unsigned_long_long
+#define STRING_TO_METHOD strtoull
+#define STRING_TO_MAX ULONG_LONG_MAX
+#include "stringto_template.h"