aboutsummaryrefslogtreecommitdiff
path: root/libiberty/testsuite/test-strtol.c
diff options
context:
space:
mode:
authorYury Gribov <y.gribov@samsung.com>2014-10-28 09:43:20 +0000
committerYury Gribov <ygribov@gcc.gnu.org>2014-10-28 09:43:20 +0000
commitea41822adfb3ea39ba43e033acd1f745abd79083 (patch)
treededbff4ce1f502ec222e9433c1109ec7759babf3 /libiberty/testsuite/test-strtol.c
parent5b595d80ce5f3f74415e91532542a58c1be6a9c4 (diff)
downloadgcc-ea41822adfb3ea39ba43e033acd1f745abd79083.zip
gcc-ea41822adfb3ea39ba43e033acd1f745abd79083.tar.gz
gcc-ea41822adfb3ea39ba43e033acd1f745abd79083.tar.bz2
Add strtoll and strtoull to libiberty.
2014-10-28 Yury Gribov <y.gribov@samsung.com> include/ * libiberty.h (strtol, strtoul, strtoll, strtoull): New prototypes. libiberty/ * strtoll.c: New file. * strtoull.c: New file. * configure.ac: Add long long checks. Add harness for strtoll and strtoull. Check decls for strtol, strtoul, strtoll, strtoull. * Makefile.in (CFILES, CONFIGURED_OFILES): Add strtoll and strtoull. * config.in: Regenerate. * configure: Regenerate. * functions.texi: Regenerate. * testsuite/Makefile.in (check-strtol): New rule. (test-strtol): Likewise. (mostlyclean): Clean up strtol test. * testsuite/test-strtol.c: New test. From-SVN: r216772
Diffstat (limited to 'libiberty/testsuite/test-strtol.c')
-rw-r--r--libiberty/testsuite/test-strtol.c184
1 files changed, 184 insertions, 0 deletions
diff --git a/libiberty/testsuite/test-strtol.c b/libiberty/testsuite/test-strtol.c
new file mode 100644
index 0000000..96d6871
--- /dev/null
+++ b/libiberty/testsuite/test-strtol.c
@@ -0,0 +1,184 @@
+/* Test program for strtol family of funtions,
+ Copyright (C) 2014 Free Software Foundation, Inc.
+ Written by Yury Gribov <y.gribov@samsung.com>
+
+ This file is part of the libiberty library, which is part of GCC.
+
+ This file is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ In addition to the permissions in the GNU General Public License, the
+ Free Software Foundation gives you unlimited permission to link the
+ compiled version of this file into combinations with other programs,
+ and to distribute those combinations without any restriction coming
+ from the use of this file. (The General Public License restrictions
+ do apply in other respects; for example, they cover modification of
+ the file, and distribution when not linked into a combined
+ executable.)
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+#include "libiberty.h"
+#include <stdio.h>
+#include <errno.h>
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#ifndef EXIT_SUCCESS
+#define EXIT_SUCCESS 0
+#endif
+
+#ifndef EXIT_FAILURE
+#define EXIT_FAILURE 1
+#endif
+
+
+/* Test input data. */
+
+enum conversion_fun
+{
+ STRTOL,
+ STRTOLL,
+ STRTOUL,
+ STRTOULL,
+};
+
+#ifdef HAVE_LONG_LONG
+typedef unsigned long long integer_type;
+#else
+typedef unsigned long integer_type;
+#endif
+
+struct test_data_t
+{
+ enum conversion_fun fun;
+ const char *nptr;
+ int base;
+ integer_type res;
+ int errnum;
+};
+
+const struct test_data_t test_data[] = {
+ { STRTOL, "0x123", 0, 0x123L, 0 },
+ { STRTOL, "123", 0, 123L, 0 },
+ { STRTOL, "0123", 0, 0123L, 0 },
+ { STRTOL, "0x7FFFFFFF", 0, 0x7fffffffL, 0 },
+ { STRTOL, "-0x80000000", 0, -0x80000000L, 0 },
+ { STRTOUL, "0x123", 0, 0x123UL, 0 },
+ { STRTOUL, "123", 0, 123UL, 0 },
+ { STRTOUL, "0123", 0, 0123UL, 0 },
+ { STRTOUL, "0xFFFFFFFF", 0, 0xffffffffUL, 0 },
+#if SIZEOF_LONG == 4
+ { STRTOL, "0x80000000", 0, 0x7fffffffL, ERANGE },
+ { STRTOL, "-0x80000001", 0, -0x80000000L, ERANGE },
+ { STRTOUL, "0x100000000", 0, 0xffffffffUL, ERANGE },
+#endif
+#ifdef HAVE_LONG_LONG
+ { STRTOLL, "0x123", 0, 0x123LL, 0 },
+ { STRTOLL, "123", 0, 123LL, 0 },
+ { STRTOLL, "0123", 0, 0123LL, 0 },
+ { STRTOLL, "0x7FFFFFFFFFFFFFFF", 0, 0x7fffffffffffffffLL, 0 },
+ { STRTOLL, "-0x8000000000000000", 0, -0x8000000000000000LL, 0 },
+ { STRTOULL, "0x123", 0, 0x123ULL, 0 },
+ { STRTOULL, "123", 0, 123ULL, 0 },
+ { STRTOULL, "0123", 0, 0123ULL, 0 },
+ { STRTOULL, "0xFFFFFFFFFFFFFFFF", 0, 0xffffffffffffffffULL, 0 },
+#if SIZEOF_LONG_LONG == 8
+ { STRTOLL, "0x8000000000000000", 0, 0x7fffffffffffffffLL, ERANGE },
+ { STRTOLL, "-0x8000000000000001", 0, -0x8000000000000000LL, ERANGE },
+ { STRTOULL, "0x10000000000000000", 0, 0xffffffffffffffffULL, ERANGE },
+#endif
+#endif
+};
+
+/* run_tests:
+ Run conversion function
+ Compare results
+ Return number of fails */
+
+int
+run_tests (const struct test_data_t *test_data, size_t ntests)
+{
+ int fails = 0, failed;
+ size_t i;
+
+ for (i = 0; i < ntests; ++i)
+ {
+ integer_type res;
+ int saved_errno;
+
+ errno = 0;
+
+ switch (test_data[i].fun)
+ {
+ case STRTOL:
+ res = strtol (test_data[i].nptr, 0, test_data[i].base);
+ break;
+ case STRTOUL:
+ res = strtoul (test_data[i].nptr, 0, test_data[i].base);
+ break;
+#ifdef HAVE_LONG_LONG
+ case STRTOLL:
+ res = strtoll (test_data[i].nptr, 0, test_data[i].base);
+ break;
+ case STRTOULL:
+ res = strtoull (test_data[i].nptr, 0, test_data[i].base);
+ break;
+#endif
+ }
+
+ saved_errno = errno;
+
+ failed = 0;
+
+ /* Compare result */
+ if (res != test_data[i].res)
+ {
+ printf ("FAIL: test-strtol-%zd. Results don't match.\n", i);
+ failed++;
+ }
+
+ /* Compare errno */
+ if (saved_errno != test_data[i].errnum)
+ {
+ printf ("FAIL: test-strtol-%zd. Errnos don't match.\n", i);
+ failed++;
+ }
+
+ if (!failed)
+ printf ("PASS: test-strtol-%zd.\n", i);
+ else
+ fails++;
+ }
+
+ return fails;
+}
+
+int
+main(int argc, char **argv)
+{
+ int fails;
+ fails = run_tests (test_data, sizeof (test_data) / sizeof (test_data[0]));
+ exit (fails ? EXIT_FAILURE : EXIT_SUCCESS);
+}
+