1272343Sngie/* $NetBSD: t_strtol.c,v 1.5 2011/06/14 02:45:58 jruoho Exp $ */ 2272343Sngie 3272343Sngie/*- 4272343Sngie * Copyright (c) 2011 The NetBSD Foundation, Inc. 5272343Sngie * All rights reserved. 6272343Sngie * 7272343Sngie * This code is derived from software contributed to The NetBSD Foundation 8272343Sngie * by Jukka Ruohonen. 9272343Sngie * 10272343Sngie * Redistribution and use in source and binary forms, with or without 11272343Sngie * modification, are permitted provided that the following conditions 12272343Sngie * are met: 13272343Sngie * 1. Redistributions of source code must retain the above copyright 14272343Sngie * notice, this list of conditions and the following disclaimer. 15272343Sngie * 2. Redistributions in binary form must reproduce the above copyright 16272343Sngie * notice, this list of conditions and the following disclaimer in the 17272343Sngie * documentation and/or other materials provided with the distribution. 18272343Sngie * 19272343Sngie * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20272343Sngie * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21272343Sngie * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22272343Sngie * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23272343Sngie * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24272343Sngie * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25272343Sngie * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26272343Sngie * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27272343Sngie * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28272343Sngie * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29272343Sngie * POSSIBILITY OF SUCH DAMAGE. 30272343Sngie */ 31272343Sngie 32272343Sngie#include <sys/cdefs.h> 33272343Sngie__RCSID("$NetBSD: t_strtol.c,v 1.5 2011/06/14 02:45:58 jruoho Exp $"); 34272343Sngie 35272343Sngie#include <atf-c.h> 36272343Sngie#include <errno.h> 37272343Sngie#include <stdlib.h> 38272343Sngie#include <string.h> 39272343Sngie#include <limits.h> 40272343Sngie 41272343Sngiestruct test { 42272343Sngie const char *str; 43272343Sngie int64_t res; 44272343Sngie int base; 45272343Sngie const char *end; 46272343Sngie}; 47272343Sngie 48272343Sngiestatic void check(struct test *, long int, long long int, char *); 49272343Sngie 50272343Sngiestatic void 51272343Sngiecheck(struct test *t, long int li, long long int lli, char *end) 52272343Sngie{ 53272343Sngie 54272343Sngie if (li != -1 && li != t->res) 55272343Sngie atf_tc_fail_nonfatal("strtol(%s, &end, %d) failed " 56272343Sngie "(rv = %ld)", t->str, t->base, li); 57272343Sngie 58272343Sngie if (lli != -1 && lli != t->res) 59272343Sngie atf_tc_fail_nonfatal("strtoll(%s, NULL, %d) failed " 60272343Sngie "(rv = %lld)", t->str, t->base, lli); 61272343Sngie 62272343Sngie if (t->end != NULL && strcmp(t->end, end) != 0) 63272343Sngie atf_tc_fail_nonfatal("invalid end pointer ('%s') from " 64272343Sngie "strtol(%s, &end, %d)", end, t->str, t->base); 65272343Sngie} 66272343Sngie 67272343SngieATF_TC(strtol_base); 68272343SngieATF_TC_HEAD(strtol_base, tc) 69272343Sngie{ 70272343Sngie atf_tc_set_md_var(tc, "descr", "Test strtol(3) with different bases"); 71272343Sngie} 72272343Sngie 73272343SngieATF_TC_BODY(strtol_base, tc) 74272343Sngie{ 75272343Sngie struct test t[] = { 76272343Sngie { "123456789", 123456789, 0, NULL }, 77272343Sngie { "111010110111100110100010101", 123456789, 2, NULL }, 78272343Sngie { "22121022020212200", 123456789, 3, NULL }, 79272343Sngie { "13112330310111", 123456789, 4, NULL }, 80272343Sngie { "223101104124", 123456789, 5, NULL }, 81272343Sngie { "20130035113", 123456789, 6, NULL }, 82272343Sngie { "3026236221", 123456789, 7, NULL }, 83272343Sngie { "726746425", 123456789, 8, NULL }, 84272343Sngie { "277266780", 123456789, 9, NULL }, 85272343Sngie { "123456789", 123456789, 10, NULL }, 86272343Sngie { "63762A05", 123456789, 11, NULL }, 87272343Sngie { "35418A99", 123456789, 12, NULL }, 88272343Sngie { "1C767471", 123456789, 13, NULL }, 89272343Sngie { "12579781", 123456789, 14, NULL }, 90272343Sngie { "AC89BC9", 123456789, 15, NULL }, 91272343Sngie { "75BCD15", 123456789, 16, NULL }, 92272343Sngie { "123456789", 342391, 8, NULL }, 93272343Sngie { "0123456789", 342391, 0, NULL }, 94272343Sngie { "0123456789", 123456789, 10, NULL }, 95272343Sngie { "0x75bcd15", 123456789, 0, NULL }, 96272343Sngie }; 97272343Sngie 98272343Sngie long long int lli; 99272343Sngie long int li; 100272343Sngie char *end; 101272343Sngie size_t i; 102272343Sngie 103272343Sngie for (i = 0; i < __arraycount(t); i++) { 104272343Sngie 105272343Sngie li = strtol(t[i].str, &end, t[i].base); 106272343Sngie lli = strtoll(t[i].str, NULL, t[i].base); 107272343Sngie 108272343Sngie check(&t[i], li, lli, end); 109272343Sngie } 110272343Sngie} 111272343Sngie 112272343SngieATF_TC(strtol_case); 113272343SngieATF_TC_HEAD(strtol_case, tc) 114272343Sngie{ 115272343Sngie atf_tc_set_md_var(tc, "descr", "Case insensitivity with strtol(3)"); 116272343Sngie} 117272343Sngie 118272343SngieATF_TC_BODY(strtol_case, tc) 119272343Sngie{ 120272343Sngie struct test t[] = { 121272343Sngie { "abcd", 0xabcd, 16, NULL }, 122272343Sngie { " dcba", 0xdcba, 16, NULL }, 123272343Sngie { "abcd dcba", 0xabcd, 16, " dcba" }, 124272343Sngie { "abc0x123", 0xabc0, 16, NULL }, 125272343Sngie { "abcd\0x123", 0xabcd, 16, "\0x123" }, 126272343Sngie { "ABCD", 0xabcd, 16, NULL }, 127272343Sngie { "aBcD", 0xabcd, 16, NULL }, 128272343Sngie { "0xABCD", 0xabcd, 16, NULL }, 129272343Sngie { "0xABCDX", 0xabcd, 16, "X" }, 130272343Sngie }; 131272343Sngie 132272343Sngie long long int lli; 133272343Sngie long int li; 134272343Sngie char *end; 135272343Sngie size_t i; 136272343Sngie 137272343Sngie for (i = 0; i < __arraycount(t); i++) { 138272343Sngie 139272343Sngie li = strtol(t[i].str, &end, t[i].base); 140272343Sngie lli = strtoll(t[i].str, NULL, t[i].base); 141272343Sngie 142272343Sngie check(&t[i], li, lli, end); 143272343Sngie } 144272343Sngie} 145272343Sngie 146272343SngieATF_TC(strtol_range); 147272343SngieATF_TC_HEAD(strtol_range, tc) 148272343Sngie{ 149272343Sngie atf_tc_set_md_var(tc, "descr", "Test ERANGE from strtol(3)"); 150272343Sngie} 151272343Sngie 152272343SngieATF_TC_BODY(strtol_range, tc) 153272343Sngie{ 154272343Sngie 155272343Sngie#if LONG_MAX == 0x7fffffff /* XXX: Is this portable? */ 156272343Sngie 157272343Sngie struct test t[] = { 158272343Sngie { "20000000000", 2147483647, 8, NULL }, 159272343Sngie { "2147483648", 2147483647, 10, NULL }, 160272343Sngie { "80000000", 2147483647, 16, NULL }, 161272343Sngie }; 162272343Sngie#else 163272343Sngie struct test t[] = { 164272343Sngie { "1000000000000000000000", 9223372036854775807, 8, NULL }, 165272343Sngie { "9223372036854775808", 9223372036854775807, 10, NULL }, 166272343Sngie { "8000000000000000", 9223372036854775807, 16, NULL }, 167272343Sngie }; 168272343Sngie#endif 169272343Sngie 170272343Sngie long int li; 171272343Sngie char *end; 172272343Sngie size_t i; 173272343Sngie 174272343Sngie for (i = 0; i < __arraycount(t); i++) { 175272343Sngie 176272343Sngie errno = 0; 177272343Sngie li = strtol(t[i].str, &end, t[i].base); 178272343Sngie 179272343Sngie if (errno != ERANGE) 180272343Sngie atf_tc_fail("strtol(3) did not catch ERANGE"); 181272343Sngie 182272343Sngie check(&t[i], li, -1, end); 183272343Sngie } 184272343Sngie} 185272343Sngie 186272343SngieATF_TC(strtol_signed); 187272343SngieATF_TC_HEAD(strtol_signed, tc) 188272343Sngie{ 189272343Sngie atf_tc_set_md_var(tc, "descr", "A basic test of strtol(3)"); 190272343Sngie} 191272343Sngie 192272343SngieATF_TC_BODY(strtol_signed, tc) 193272343Sngie{ 194272343Sngie struct test t[] = { 195272343Sngie { "1", 1, 0, NULL }, 196272343Sngie { " 2", 2, 0, NULL }, 197272343Sngie { " 3", 3, 0, NULL }, 198272343Sngie { " -3", -3, 0, NULL }, 199272343Sngie { "--1", 0, 0, "--1" }, 200272343Sngie { "+-2", 0, 0, "+-2" }, 201272343Sngie { "++3", 0, 0, "++3" }, 202272343Sngie { "+9", 9, 0, NULL }, 203272343Sngie { "+123", 123, 0, NULL }, 204272343Sngie { "-1 3", -1, 0, " 3" }, 205272343Sngie { "-1.3", -1, 0, ".3" }, 206272343Sngie { "- 3", 0, 0, "- 3" }, 207272343Sngie { "+33.", 33, 0, "." }, 208272343Sngie { "30x0", 30, 0, "x0" }, 209272343Sngie }; 210272343Sngie 211272343Sngie long long int lli; 212272343Sngie long int li; 213272343Sngie char *end; 214272343Sngie size_t i; 215272343Sngie 216272343Sngie for (i = 0; i < __arraycount(t); i++) { 217272343Sngie 218272343Sngie li = strtol(t[i].str, &end, t[i].base); 219272343Sngie lli = strtoll(t[i].str, NULL, t[i].base); 220272343Sngie 221272343Sngie check(&t[i], li, lli, end); 222272343Sngie } 223272343Sngie} 224272343Sngie 225272343SngieATF_TP_ADD_TCS(tp) 226272343Sngie{ 227272343Sngie 228272343Sngie ATF_TP_ADD_TC(tp, strtol_base); 229272343Sngie ATF_TP_ADD_TC(tp, strtol_case); 230272343Sngie ATF_TP_ADD_TC(tp, strtol_range); 231272343Sngie ATF_TP_ADD_TC(tp, strtol_signed); 232272343Sngie 233272343Sngie return atf_no_error(); 234272343Sngie} 235