Home | History | Annotate | Line # | Download | only in testsuite
      1  1.1  christos /* Test program for strtol family of funtions,
      2  1.8  christos    Copyright (C) 2014-2024 Free Software Foundation, Inc.
      3  1.1  christos    Written by Yury Gribov <y.gribov (at) samsung.com>
      4  1.1  christos 
      5  1.1  christos    This file is part of the libiberty library, which is part of GCC.
      6  1.1  christos 
      7  1.1  christos    This file is free software; you can redistribute it and/or modify
      8  1.1  christos    it under the terms of the GNU General Public License as published by
      9  1.1  christos    the Free Software Foundation; either version 2 of the License, or
     10  1.1  christos    (at your option) any later version.
     11  1.1  christos 
     12  1.1  christos    In addition to the permissions in the GNU General Public License, the
     13  1.1  christos    Free Software Foundation gives you unlimited permission to link the
     14  1.1  christos    compiled version of this file into combinations with other programs,
     15  1.1  christos    and to distribute those combinations without any restriction coming
     16  1.1  christos    from the use of this file.  (The General Public License restrictions
     17  1.1  christos    do apply in other respects; for example, they cover modification of
     18  1.1  christos    the file, and distribution when not linked into a combined
     19  1.1  christos    executable.)
     20  1.1  christos 
     21  1.1  christos    This program is distributed in the hope that it will be useful,
     22  1.1  christos    but WITHOUT ANY WARRANTY; without even the implied warranty of
     23  1.1  christos    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     24  1.1  christos    GNU General Public License for more details.
     25  1.1  christos 
     26  1.1  christos    You should have received a copy of the GNU General Public License
     27  1.1  christos    along with this program; if not, write to the Free Software
     28  1.1  christos    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
     29  1.1  christos */
     30  1.1  christos 
     31  1.1  christos #ifdef HAVE_CONFIG_H
     32  1.1  christos #include "config.h"
     33  1.1  christos #endif
     34  1.1  christos #include "libiberty.h"
     35  1.1  christos #include <stdio.h>
     36  1.1  christos #include <errno.h>
     37  1.1  christos #ifdef HAVE_STDLIB_H
     38  1.1  christos #include <stdlib.h>
     39  1.1  christos #endif
     40  1.1  christos #ifdef HAVE_STRING_H
     41  1.1  christos #include <string.h>
     42  1.1  christos #endif
     43  1.1  christos #ifdef HAVE_UNISTD_H
     44  1.1  christos #include <unistd.h>
     45  1.1  christos #endif
     46  1.1  christos 
     47  1.1  christos #ifndef EXIT_SUCCESS
     48  1.1  christos #define EXIT_SUCCESS 0
     49  1.1  christos #endif
     50  1.1  christos 
     51  1.1  christos #ifndef EXIT_FAILURE
     52  1.1  christos #define EXIT_FAILURE 1
     53  1.1  christos #endif
     54  1.1  christos 
     55  1.1  christos 
     56  1.1  christos /* Test input data. */
     57  1.1  christos 
     58  1.1  christos enum conversion_fun
     59  1.1  christos {
     60  1.1  christos   STRTOL,
     61  1.1  christos   STRTOLL,
     62  1.1  christos   STRTOUL,
     63  1.1  christos   STRTOULL,
     64  1.1  christos };
     65  1.1  christos 
     66  1.1  christos #ifdef HAVE_LONG_LONG
     67  1.1  christos typedef unsigned long long integer_type;
     68  1.1  christos #else
     69  1.1  christos typedef unsigned long integer_type;
     70  1.1  christos #endif
     71  1.1  christos 
     72  1.1  christos struct test_data_t
     73  1.1  christos {
     74  1.1  christos   enum conversion_fun fun;
     75  1.1  christos   const char *nptr;
     76  1.1  christos   int base;
     77  1.1  christos   integer_type res;
     78  1.1  christos   int errnum;
     79  1.1  christos };
     80  1.1  christos 
     81  1.1  christos const struct test_data_t test_data[] = {
     82  1.1  christos   { STRTOL,  "0x123",       0, 0x123L,        0      },
     83  1.1  christos   { STRTOL,  "123",         0, 123L,          0      },
     84  1.1  christos   { STRTOL,  "0123",        0, 0123L,         0      },
     85  1.1  christos   { STRTOL,  "0x7FFFFFFF",  0, 0x7fffffffL,   0      },
     86  1.1  christos   { STRTOL,  "-0x80000000", 0, -0x80000000L,  0      },
     87  1.1  christos   { STRTOUL, "0x123",       0, 0x123UL,       0      },
     88  1.1  christos   { STRTOUL, "123",         0, 123UL,         0      },
     89  1.1  christos   { STRTOUL, "0123",        0, 0123UL,        0      },
     90  1.1  christos   { STRTOUL, "0xFFFFFFFF",  0, 0xffffffffUL,  0      },
     91  1.1  christos #if SIZEOF_LONG == 4
     92  1.1  christos   { STRTOL,  "0x80000000",  0, 0x7fffffffL,   ERANGE },
     93  1.1  christos   { STRTOL,  "-0x80000001", 0, -0x80000000L,  ERANGE },
     94  1.1  christos   { STRTOUL, "0x100000000", 0, 0xffffffffUL,  ERANGE },
     95  1.1  christos #endif
     96  1.1  christos #ifdef HAVE_LONG_LONG
     97  1.1  christos   { STRTOLL,  "0x123",               0, 0x123LL,               0      },
     98  1.1  christos   { STRTOLL,  "123",                 0, 123LL,                 0      },
     99  1.1  christos   { STRTOLL,  "0123",                0, 0123LL,                0      },
    100  1.1  christos   { STRTOLL,  "0x7FFFFFFFFFFFFFFF",  0, 0x7fffffffffffffffLL,  0      },
    101  1.1  christos   { STRTOLL,  "-0x8000000000000000", 0, -0x8000000000000000LL, 0      },
    102  1.1  christos   { STRTOULL, "0x123",               0, 0x123ULL,              0      },
    103  1.1  christos   { STRTOULL, "123",                 0, 123ULL,                0      },
    104  1.1  christos   { STRTOULL, "0123",                0, 0123ULL,               0      },
    105  1.1  christos   { STRTOULL, "0xFFFFFFFFFFFFFFFF",  0, 0xffffffffffffffffULL, 0      },
    106  1.1  christos #if SIZEOF_LONG_LONG == 8
    107  1.1  christos   { STRTOLL,  "0x8000000000000000",  0, 0x7fffffffffffffffLL,  ERANGE },
    108  1.1  christos   { STRTOLL,  "-0x8000000000000001", 0, -0x8000000000000000LL, ERANGE },
    109  1.1  christos   { STRTOULL, "0x10000000000000000", 0, 0xffffffffffffffffULL, ERANGE },
    110  1.1  christos #endif
    111  1.1  christos #endif
    112  1.1  christos };
    113  1.1  christos 
    114  1.1  christos /* run_tests:
    115  1.1  christos     Run conversion function
    116  1.1  christos     Compare results
    117  1.1  christos     Return number of fails */
    118  1.1  christos 
    119  1.1  christos int
    120  1.1  christos run_tests (const struct test_data_t *test_data, size_t ntests)
    121  1.1  christos {
    122  1.1  christos   int fails = 0, failed;
    123  1.1  christos   size_t i;
    124  1.1  christos 
    125  1.1  christos   for (i = 0; i < ntests; ++i)
    126  1.1  christos     {
    127  1.1  christos       integer_type res;
    128  1.1  christos       int saved_errno;
    129  1.1  christos 
    130  1.1  christos       errno = 0;
    131  1.1  christos 
    132  1.1  christos       switch (test_data[i].fun)
    133  1.1  christos 	{
    134  1.1  christos 	case STRTOL:
    135  1.1  christos 	  res = (unsigned long) strtol (test_data[i].nptr,
    136  1.1  christos 					0, test_data[i].base);
    137  1.1  christos 	  break;
    138  1.1  christos 	case STRTOUL:
    139  1.1  christos 	  res = strtoul (test_data[i].nptr, 0, test_data[i].base);
    140  1.1  christos 	  break;
    141  1.1  christos #ifdef HAVE_LONG_LONG
    142  1.1  christos 	case STRTOLL:
    143  1.1  christos 	  res = strtoll (test_data[i].nptr, 0, test_data[i].base);
    144  1.1  christos 	  break;
    145  1.1  christos 	case STRTOULL:
    146  1.1  christos 	  res = strtoull (test_data[i].nptr, 0, test_data[i].base);
    147  1.1  christos 	  break;
    148  1.1  christos #endif
    149  1.1  christos 	}
    150  1.1  christos 
    151  1.1  christos       saved_errno = errno;
    152  1.1  christos 
    153  1.1  christos       failed = 0;
    154  1.1  christos 
    155  1.1  christos       /* Compare result */
    156  1.1  christos       if (res != test_data[i].res)
    157  1.1  christos         {
    158  1.1  christos           printf ("FAIL: test-strtol-%zd. Results don't match.\n", i);
    159  1.1  christos 	  failed++;
    160  1.1  christos         }
    161  1.1  christos 
    162  1.1  christos       /* Compare errno */
    163  1.1  christos       if (saved_errno != test_data[i].errnum)
    164  1.1  christos         {
    165  1.1  christos           printf ("FAIL: test-strtol-%zd. Errnos don't match.\n", i);
    166  1.1  christos 	  failed++;
    167  1.1  christos         }
    168  1.1  christos 
    169  1.1  christos       if (!failed)
    170  1.1  christos         printf ("PASS: test-strtol-%zd.\n", i);
    171  1.1  christos       else
    172  1.1  christos         fails++;
    173  1.1  christos     }
    174  1.1  christos 
    175  1.1  christos   return fails;
    176  1.1  christos }
    177  1.1  christos 
    178  1.1  christos int
    179  1.1  christos main(int argc, char **argv)
    180  1.1  christos {
    181  1.1  christos   int fails;
    182  1.1  christos   fails = run_tests (test_data, sizeof (test_data) / sizeof (test_data[0]));
    183  1.1  christos   exit (fails ? EXIT_FAILURE : EXIT_SUCCESS);
    184  1.1  christos }
    185  1.1  christos 
    186