| /* Test program for strtol family of funtions, | |
| Copyright (C) 2014-2023 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 = (unsigned long) 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); | |
| } | |