summaryrefslogtreecommitdiffstats
path: root/cpukit/libmisc/stringto/stringto_template.h
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/stringto_template.h
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/stringto_template.h')
-rw-r--r--cpukit/libmisc/stringto/stringto_template.h107
1 files changed, 107 insertions, 0 deletions
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;
+}
+