Home | History | Annotate | Line # | Download | only in stdlib
t_strtol.c revision 1.6.8.1
      1  1.6.8.1    martin /*	$NetBSD: t_strtol.c,v 1.6.8.1 2017/07/10 12:40:23 martin Exp $ */
      2      1.1    jruoho 
      3      1.1    jruoho /*-
      4      1.1    jruoho  * Copyright (c) 2011 The NetBSD Foundation, Inc.
      5      1.1    jruoho  * All rights reserved.
      6      1.1    jruoho  *
      7      1.1    jruoho  * This code is derived from software contributed to The NetBSD Foundation
      8      1.1    jruoho  * by Jukka Ruohonen.
      9      1.1    jruoho  *
     10      1.1    jruoho  * Redistribution and use in source and binary forms, with or without
     11      1.1    jruoho  * modification, are permitted provided that the following conditions
     12      1.1    jruoho  * are met:
     13      1.1    jruoho  * 1. Redistributions of source code must retain the above copyright
     14      1.1    jruoho  *    notice, this list of conditions and the following disclaimer.
     15      1.1    jruoho  * 2. Redistributions in binary form must reproduce the above copyright
     16      1.1    jruoho  *    notice, this list of conditions and the following disclaimer in the
     17      1.1    jruoho  *    documentation and/or other materials provided with the distribution.
     18      1.1    jruoho  *
     19      1.1    jruoho  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     20      1.1    jruoho  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     21      1.1    jruoho  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     22      1.1    jruoho  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     23      1.1    jruoho  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     24      1.1    jruoho  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     25      1.1    jruoho  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     26      1.1    jruoho  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     27      1.1    jruoho  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     28      1.1    jruoho  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     29      1.1    jruoho  * POSSIBILITY OF SUCH DAMAGE.
     30      1.1    jruoho  */
     31      1.1    jruoho 
     32      1.1    jruoho #include <sys/cdefs.h>
     33  1.6.8.1    martin __RCSID("$NetBSD: t_strtol.c,v 1.6.8.1 2017/07/10 12:40:23 martin Exp $");
     34      1.1    jruoho 
     35      1.1    jruoho #include <atf-c.h>
     36      1.1    jruoho #include <errno.h>
     37      1.1    jruoho #include <stdlib.h>
     38      1.1    jruoho #include <string.h>
     39      1.1    jruoho #include <limits.h>
     40      1.1    jruoho 
     41      1.1    jruoho struct test {
     42      1.1    jruoho 	const char	*str;
     43      1.4    jruoho 	int64_t		 res;
     44      1.1    jruoho 	int		 base;
     45      1.1    jruoho 	const char	*end;
     46      1.1    jruoho };
     47      1.1    jruoho 
     48      1.1    jruoho static void	check(struct test *, long int, long long int, char *);
     49      1.1    jruoho 
     50      1.1    jruoho static void
     51      1.1    jruoho check(struct test *t, long int li, long long int lli, char *end)
     52      1.1    jruoho {
     53      1.1    jruoho 
     54      1.1    jruoho 	if (li != -1 && li != t->res)
     55      1.1    jruoho 		atf_tc_fail_nonfatal("strtol(%s, &end, %d) failed "
     56      1.1    jruoho 		    "(rv = %ld)", t->str, t->base, li);
     57      1.1    jruoho 
     58      1.3    jruoho 	if (lli != -1 && lli != t->res)
     59      1.1    jruoho 		atf_tc_fail_nonfatal("strtoll(%s, NULL, %d) failed "
     60      1.1    jruoho 		    "(rv = %lld)", t->str, t->base, lli);
     61      1.1    jruoho 
     62      1.6  pgoyette 	if ((t->end != NULL && strcmp(t->end, end) != 0) ||
     63      1.6  pgoyette 	    (t->end == NULL && *end != '\0'))
     64  1.6.8.1    martin 		atf_tc_fail_nonfatal("invalid end pointer (%p) from "
     65  1.6.8.1    martin 		    "strtol(%p, &end, %d)", end, t->str, t->base);
     66      1.1    jruoho }
     67      1.1    jruoho 
     68      1.1    jruoho ATF_TC(strtol_base);
     69      1.1    jruoho ATF_TC_HEAD(strtol_base, tc)
     70      1.1    jruoho {
     71      1.1    jruoho 	atf_tc_set_md_var(tc, "descr", "Test strtol(3) with different bases");
     72      1.1    jruoho }
     73      1.1    jruoho 
     74      1.1    jruoho ATF_TC_BODY(strtol_base, tc)
     75      1.1    jruoho {
     76      1.1    jruoho 	struct test t[] = {
     77      1.1    jruoho 		{ "123456789",			 123456789,  0, NULL	},
     78      1.1    jruoho 		{ "111010110111100110100010101", 123456789,  2, NULL	},
     79      1.1    jruoho 		{ "22121022020212200",		 123456789,  3, NULL	},
     80      1.1    jruoho 		{ "13112330310111",		 123456789,  4, NULL	},
     81      1.1    jruoho 		{ "223101104124",		 123456789,  5, NULL	},
     82      1.1    jruoho 		{ "20130035113",		 123456789,  6, NULL	},
     83      1.1    jruoho 		{ "3026236221",			 123456789,  7, NULL	},
     84      1.1    jruoho 		{ "726746425",			 123456789,  8, NULL	},
     85      1.1    jruoho 		{ "277266780",			 123456789,  9, NULL	},
     86      1.1    jruoho 		{ "123456789",			 123456789, 10, NULL	},
     87      1.1    jruoho 		{ "63762A05",			 123456789, 11, NULL	},
     88      1.1    jruoho 		{ "35418A99",			 123456789, 12, NULL	},
     89      1.1    jruoho 		{ "1C767471",			 123456789, 13, NULL	},
     90      1.1    jruoho 		{ "12579781",			 123456789, 14, NULL	},
     91      1.1    jruoho 		{ "AC89BC9",			 123456789, 15, NULL	},
     92      1.1    jruoho 		{ "75BCD15",			 123456789, 16, NULL	},
     93      1.6  pgoyette 		{ "1234567",			    342391,  8, NULL	},
     94      1.6  pgoyette 		{ "01234567",			    342391,  0, NULL	},
     95      1.1    jruoho 		{ "0123456789",			 123456789, 10, NULL	},
     96  1.6.8.1    martin 		{ "0x75bcd15",			 123456789,  0, NULL	},
     97  1.6.8.1    martin 		{ " 0xX",			         0,  0, "xX"	},
     98  1.6.8.1    martin 		{ " 0xX",			         0, 16, "xX"	},
     99  1.6.8.1    martin 		{ " 0XX",			         0,  0, "XX"	},
    100  1.6.8.1    martin 		{ " 0XX",			         0, 16, "XX"	},
    101      1.1    jruoho 	};
    102      1.1    jruoho 
    103      1.1    jruoho 	long long int lli;
    104      1.1    jruoho 	long int li;
    105  1.6.8.1    martin 	long long int ulli;
    106  1.6.8.1    martin 	long int uli;
    107  1.6.8.1    martin 	char *end, *end2;
    108      1.1    jruoho 	size_t i;
    109      1.1    jruoho 
    110      1.1    jruoho 	for (i = 0; i < __arraycount(t); i++) {
    111      1.1    jruoho 
    112      1.1    jruoho 		li = strtol(t[i].str, &end, t[i].base);
    113      1.1    jruoho 		lli = strtoll(t[i].str, NULL, t[i].base);
    114      1.1    jruoho 
    115  1.6.8.1    martin 		uli = strtoul(t[i].str, &end2, t[i].base);
    116  1.6.8.1    martin 		ulli = strtoull(t[i].str, NULL, t[i].base);
    117  1.6.8.1    martin 
    118      1.1    jruoho 		check(&t[i], li, lli, end);
    119  1.6.8.1    martin 
    120  1.6.8.1    martin 		if (li != uli)
    121  1.6.8.1    martin 			atf_tc_fail_nonfatal("strtoul(%s, NULL, %d) failed "
    122  1.6.8.1    martin 			    "(rv = %lu)", t[i].str, t[i].base, uli);
    123  1.6.8.1    martin 		if (end != end2)
    124  1.6.8.1    martin 			atf_tc_fail_nonfatal("invalid end pointer ('%p') from "
    125  1.6.8.1    martin 			    "strtoul(%s, &end, %d)", end2, t[i].str, t[i].base);
    126  1.6.8.1    martin 		if (lli != ulli)
    127  1.6.8.1    martin 			atf_tc_fail_nonfatal("strtoull(%s, NULL, %d) failed "
    128  1.6.8.1    martin 			    "(rv = %llu)", t[i].str, t[i].base, ulli);
    129      1.1    jruoho 	}
    130      1.1    jruoho }
    131      1.1    jruoho 
    132      1.1    jruoho ATF_TC(strtol_case);
    133      1.1    jruoho ATF_TC_HEAD(strtol_case, tc)
    134      1.1    jruoho {
    135      1.1    jruoho 	atf_tc_set_md_var(tc, "descr", "Case insensitivity with strtol(3)");
    136      1.1    jruoho }
    137      1.1    jruoho 
    138      1.1    jruoho ATF_TC_BODY(strtol_case, tc)
    139      1.1    jruoho {
    140      1.1    jruoho 	struct test t[] = {
    141      1.1    jruoho 		{ "abcd",	0xabcd, 16, NULL	},
    142      1.1    jruoho 		{ "     dcba",	0xdcba, 16, NULL	},
    143      1.1    jruoho 		{ "abcd dcba",	0xabcd, 16, " dcba"	},
    144      1.6  pgoyette 		{ "abc0x123",	0xabc0, 16, "x123"	},
    145      1.1    jruoho 		{ "abcd\0x123",	0xabcd, 16, "\0x123"	},
    146      1.1    jruoho 		{ "ABCD",	0xabcd, 16, NULL	},
    147      1.1    jruoho 		{ "aBcD",	0xabcd, 16, NULL	},
    148      1.1    jruoho 		{ "0xABCD",	0xabcd, 16, NULL	},
    149      1.1    jruoho 		{ "0xABCDX",	0xabcd, 16, "X"		},
    150      1.1    jruoho 	};
    151      1.1    jruoho 
    152      1.1    jruoho 	long long int lli;
    153      1.1    jruoho 	long int li;
    154      1.1    jruoho 	char *end;
    155      1.1    jruoho 	size_t i;
    156      1.1    jruoho 
    157      1.1    jruoho 	for (i = 0; i < __arraycount(t); i++) {
    158      1.1    jruoho 
    159      1.1    jruoho 		li = strtol(t[i].str, &end, t[i].base);
    160      1.1    jruoho 		lli = strtoll(t[i].str, NULL, t[i].base);
    161      1.1    jruoho 
    162      1.1    jruoho 		check(&t[i], li, lli, end);
    163      1.1    jruoho 	}
    164      1.1    jruoho }
    165      1.1    jruoho 
    166      1.1    jruoho ATF_TC(strtol_range);
    167      1.1    jruoho ATF_TC_HEAD(strtol_range, tc)
    168      1.1    jruoho {
    169      1.1    jruoho 	atf_tc_set_md_var(tc, "descr", "Test ERANGE from strtol(3)");
    170      1.1    jruoho }
    171      1.1    jruoho 
    172      1.1    jruoho ATF_TC_BODY(strtol_range, tc)
    173      1.1    jruoho {
    174      1.1    jruoho 
    175      1.1    jruoho #if LONG_MAX == 0x7fffffff	/* XXX: Is this portable? */
    176      1.1    jruoho 
    177      1.1    jruoho 	struct test t[] = {
    178      1.1    jruoho 		{ "20000000000", 2147483647, 8, NULL },
    179      1.1    jruoho 		{ "2147483648",  2147483647, 10, NULL },
    180      1.1    jruoho 		{ "80000000",	 2147483647, 16, NULL },
    181      1.1    jruoho 	};
    182      1.1    jruoho #else
    183      1.1    jruoho 	struct test t[] = {
    184      1.1    jruoho 		{ "1000000000000000000000", 9223372036854775807, 8, NULL },
    185      1.1    jruoho 		{ "9223372036854775808",    9223372036854775807, 10, NULL },
    186      1.1    jruoho 		{ "8000000000000000",       9223372036854775807, 16, NULL },
    187      1.1    jruoho 	};
    188      1.1    jruoho #endif
    189      1.1    jruoho 
    190      1.1    jruoho 	long int li;
    191      1.1    jruoho 	char *end;
    192      1.1    jruoho 	size_t i;
    193      1.1    jruoho 
    194      1.1    jruoho 	for (i = 0; i < __arraycount(t); i++) {
    195      1.1    jruoho 
    196      1.1    jruoho 		errno = 0;
    197      1.1    jruoho 		li = strtol(t[i].str, &end, t[i].base);
    198      1.1    jruoho 
    199      1.1    jruoho 		if (errno != ERANGE)
    200      1.1    jruoho 			atf_tc_fail("strtol(3) did not catch ERANGE");
    201      1.1    jruoho 
    202      1.1    jruoho 		check(&t[i], li, -1, end);
    203      1.1    jruoho 	}
    204      1.1    jruoho }
    205      1.1    jruoho 
    206      1.1    jruoho ATF_TC(strtol_signed);
    207      1.1    jruoho ATF_TC_HEAD(strtol_signed, tc)
    208      1.1    jruoho {
    209      1.1    jruoho 	atf_tc_set_md_var(tc, "descr", "A basic test of strtol(3)");
    210      1.1    jruoho }
    211      1.1    jruoho 
    212      1.1    jruoho ATF_TC_BODY(strtol_signed, tc)
    213      1.1    jruoho {
    214      1.1    jruoho 	struct test t[] = {
    215      1.1    jruoho 		{ "1",		 1, 0, NULL	},
    216      1.1    jruoho 		{ " 2",		 2, 0, NULL	},
    217      1.1    jruoho 		{ "  3",	 3, 0, NULL	},
    218      1.1    jruoho 		{ " -3",	-3, 0, NULL	},
    219      1.1    jruoho 		{ "--1",	 0, 0, "--1"	},
    220      1.1    jruoho 		{ "+-2",	 0, 0, "+-2"	},
    221      1.1    jruoho 		{ "++3",	 0, 0, "++3"	},
    222      1.1    jruoho 		{ "+9",		 9, 0, NULL	},
    223      1.1    jruoho 		{ "+123",      123, 0, NULL	},
    224      1.1    jruoho 		{ "-1 3",       -1, 0, " 3"	},
    225      1.1    jruoho 		{ "-1.3",       -1, 0, ".3"	},
    226      1.1    jruoho 		{ "-  3",        0, 0, "-  3"	},
    227      1.1    jruoho 		{ "+33.",       33, 0, "."	},
    228      1.1    jruoho 		{ "30x0",       30, 0, "x0"	},
    229      1.1    jruoho 	};
    230      1.1    jruoho 
    231      1.1    jruoho 	long long int lli;
    232      1.1    jruoho 	long int li;
    233      1.1    jruoho 	char *end;
    234      1.1    jruoho 	size_t i;
    235      1.1    jruoho 
    236      1.1    jruoho 	for (i = 0; i < __arraycount(t); i++) {
    237      1.1    jruoho 
    238      1.1    jruoho 		li = strtol(t[i].str, &end, t[i].base);
    239      1.1    jruoho 		lli = strtoll(t[i].str, NULL, t[i].base);
    240      1.1    jruoho 
    241      1.1    jruoho 		check(&t[i], li, lli, end);
    242      1.1    jruoho 	}
    243      1.1    jruoho }
    244      1.1    jruoho 
    245      1.1    jruoho ATF_TP_ADD_TCS(tp)
    246      1.1    jruoho {
    247      1.1    jruoho 
    248      1.1    jruoho 	ATF_TP_ADD_TC(tp, strtol_base);
    249      1.1    jruoho 	ATF_TP_ADD_TC(tp, strtol_case);
    250      1.1    jruoho 	ATF_TP_ADD_TC(tp, strtol_range);
    251      1.1    jruoho 	ATF_TP_ADD_TC(tp, strtol_signed);
    252      1.1    jruoho 
    253      1.1    jruoho 	return atf_no_error();
    254      1.1    jruoho }
    255