1640235e2SEnji Cooper /* $NetBSD: t_strtol.c,v 1.6 2016/06/01 01:12:02 pgoyette Exp $ */
257718be8SEnji Cooper
357718be8SEnji Cooper /*-
457718be8SEnji Cooper * Copyright (c) 2011 The NetBSD Foundation, Inc.
557718be8SEnji Cooper * All rights reserved.
657718be8SEnji Cooper *
757718be8SEnji Cooper * This code is derived from software contributed to The NetBSD Foundation
857718be8SEnji Cooper * by Jukka Ruohonen.
957718be8SEnji Cooper *
1057718be8SEnji Cooper * Redistribution and use in source and binary forms, with or without
1157718be8SEnji Cooper * modification, are permitted provided that the following conditions
1257718be8SEnji Cooper * are met:
1357718be8SEnji Cooper * 1. Redistributions of source code must retain the above copyright
1457718be8SEnji Cooper * notice, this list of conditions and the following disclaimer.
1557718be8SEnji Cooper * 2. Redistributions in binary form must reproduce the above copyright
1657718be8SEnji Cooper * notice, this list of conditions and the following disclaimer in the
1757718be8SEnji Cooper * documentation and/or other materials provided with the distribution.
1857718be8SEnji Cooper *
1957718be8SEnji Cooper * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
2057718be8SEnji Cooper * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
2157718be8SEnji Cooper * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
2257718be8SEnji Cooper * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
2357718be8SEnji Cooper * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2457718be8SEnji Cooper * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2557718be8SEnji Cooper * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2657718be8SEnji Cooper * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2757718be8SEnji Cooper * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2857718be8SEnji Cooper * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2957718be8SEnji Cooper * POSSIBILITY OF SUCH DAMAGE.
3057718be8SEnji Cooper */
3157718be8SEnji Cooper
3257718be8SEnji Cooper #include <sys/cdefs.h>
33640235e2SEnji Cooper __RCSID("$NetBSD: t_strtol.c,v 1.6 2016/06/01 01:12:02 pgoyette Exp $");
3457718be8SEnji Cooper
3557718be8SEnji Cooper #include <atf-c.h>
3657718be8SEnji Cooper #include <errno.h>
3757718be8SEnji Cooper #include <stdlib.h>
3857718be8SEnji Cooper #include <string.h>
3957718be8SEnji Cooper #include <limits.h>
4057718be8SEnji Cooper
4157718be8SEnji Cooper struct test {
4257718be8SEnji Cooper const char *str;
4357718be8SEnji Cooper int64_t res;
4457718be8SEnji Cooper int base;
4557718be8SEnji Cooper const char *end;
4657718be8SEnji Cooper };
4757718be8SEnji Cooper
4857718be8SEnji Cooper static void check(struct test *, long int, long long int, char *);
4957718be8SEnji Cooper
5057718be8SEnji Cooper static void
check(struct test * t,long int li,long long int lli,char * end)5157718be8SEnji Cooper check(struct test *t, long int li, long long int lli, char *end)
5257718be8SEnji Cooper {
5357718be8SEnji Cooper
5457718be8SEnji Cooper if (li != -1 && li != t->res)
5557718be8SEnji Cooper atf_tc_fail_nonfatal("strtol(%s, &end, %d) failed "
5657718be8SEnji Cooper "(rv = %ld)", t->str, t->base, li);
5757718be8SEnji Cooper
5857718be8SEnji Cooper if (lli != -1 && lli != t->res)
5957718be8SEnji Cooper atf_tc_fail_nonfatal("strtoll(%s, NULL, %d) failed "
6057718be8SEnji Cooper "(rv = %lld)", t->str, t->base, lli);
6157718be8SEnji Cooper
62640235e2SEnji Cooper if ((t->end != NULL && strcmp(t->end, end) != 0) ||
63640235e2SEnji Cooper (t->end == NULL && *end != '\0'))
6457718be8SEnji Cooper atf_tc_fail_nonfatal("invalid end pointer ('%s') from "
6557718be8SEnji Cooper "strtol(%s, &end, %d)", end, t->str, t->base);
6657718be8SEnji Cooper }
6757718be8SEnji Cooper
6857718be8SEnji Cooper ATF_TC(strtol_base);
ATF_TC_HEAD(strtol_base,tc)6957718be8SEnji Cooper ATF_TC_HEAD(strtol_base, tc)
7057718be8SEnji Cooper {
7157718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test strtol(3) with different bases");
7257718be8SEnji Cooper }
7357718be8SEnji Cooper
ATF_TC_BODY(strtol_base,tc)7457718be8SEnji Cooper ATF_TC_BODY(strtol_base, tc)
7557718be8SEnji Cooper {
7657718be8SEnji Cooper struct test t[] = {
7757718be8SEnji Cooper { "123456789", 123456789, 0, NULL },
7857718be8SEnji Cooper { "111010110111100110100010101", 123456789, 2, NULL },
7957718be8SEnji Cooper { "22121022020212200", 123456789, 3, NULL },
8057718be8SEnji Cooper { "13112330310111", 123456789, 4, NULL },
8157718be8SEnji Cooper { "223101104124", 123456789, 5, NULL },
8257718be8SEnji Cooper { "20130035113", 123456789, 6, NULL },
8357718be8SEnji Cooper { "3026236221", 123456789, 7, NULL },
8457718be8SEnji Cooper { "726746425", 123456789, 8, NULL },
8557718be8SEnji Cooper { "277266780", 123456789, 9, NULL },
8657718be8SEnji Cooper { "123456789", 123456789, 10, NULL },
8757718be8SEnji Cooper { "63762A05", 123456789, 11, NULL },
8857718be8SEnji Cooper { "35418A99", 123456789, 12, NULL },
8957718be8SEnji Cooper { "1C767471", 123456789, 13, NULL },
9057718be8SEnji Cooper { "12579781", 123456789, 14, NULL },
9157718be8SEnji Cooper { "AC89BC9", 123456789, 15, NULL },
9257718be8SEnji Cooper { "75BCD15", 123456789, 16, NULL },
93640235e2SEnji Cooper { "1234567", 342391, 8, NULL },
94640235e2SEnji Cooper { "01234567", 342391, 0, NULL },
9557718be8SEnji Cooper { "0123456789", 123456789, 10, NULL },
9657718be8SEnji Cooper { "0x75bcd15", 123456789, 0, NULL },
97*b9385720SDag-Erling Smørgrav #ifdef __FreeBSD__
98*b9385720SDag-Erling Smørgrav { "0x", 0, 0, "x" },
99*b9385720SDag-Erling Smørgrav { "0b111010110111100110100010101", 123456789, 0, NULL },
100*b9385720SDag-Erling Smørgrav { "0b0123", 1, 0, "23" },
101*b9385720SDag-Erling Smørgrav { "0b", 0, 0, "b" },
102*b9385720SDag-Erling Smørgrav #endif
10357718be8SEnji Cooper };
10457718be8SEnji Cooper
10557718be8SEnji Cooper long long int lli;
10657718be8SEnji Cooper long int li;
10757718be8SEnji Cooper char *end;
10857718be8SEnji Cooper size_t i;
10957718be8SEnji Cooper
11057718be8SEnji Cooper for (i = 0; i < __arraycount(t); i++) {
11157718be8SEnji Cooper
11257718be8SEnji Cooper li = strtol(t[i].str, &end, t[i].base);
11357718be8SEnji Cooper lli = strtoll(t[i].str, NULL, t[i].base);
11457718be8SEnji Cooper
11557718be8SEnji Cooper check(&t[i], li, lli, end);
11657718be8SEnji Cooper }
11757718be8SEnji Cooper }
11857718be8SEnji Cooper
11957718be8SEnji Cooper ATF_TC(strtol_case);
ATF_TC_HEAD(strtol_case,tc)12057718be8SEnji Cooper ATF_TC_HEAD(strtol_case, tc)
12157718be8SEnji Cooper {
12257718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Case insensitivity with strtol(3)");
12357718be8SEnji Cooper }
12457718be8SEnji Cooper
ATF_TC_BODY(strtol_case,tc)12557718be8SEnji Cooper ATF_TC_BODY(strtol_case, tc)
12657718be8SEnji Cooper {
12757718be8SEnji Cooper struct test t[] = {
12857718be8SEnji Cooper { "abcd", 0xabcd, 16, NULL },
12957718be8SEnji Cooper { " dcba", 0xdcba, 16, NULL },
13057718be8SEnji Cooper { "abcd dcba", 0xabcd, 16, " dcba" },
131640235e2SEnji Cooper { "abc0x123", 0xabc0, 16, "x123" },
13257718be8SEnji Cooper { "abcd\0x123", 0xabcd, 16, "\0x123" },
13357718be8SEnji Cooper { "ABCD", 0xabcd, 16, NULL },
13457718be8SEnji Cooper { "aBcD", 0xabcd, 16, NULL },
13557718be8SEnji Cooper { "0xABCD", 0xabcd, 16, NULL },
13657718be8SEnji Cooper { "0xABCDX", 0xabcd, 16, "X" },
13757718be8SEnji Cooper };
13857718be8SEnji Cooper
13957718be8SEnji Cooper long long int lli;
14057718be8SEnji Cooper long int li;
14157718be8SEnji Cooper char *end;
14257718be8SEnji Cooper size_t i;
14357718be8SEnji Cooper
14457718be8SEnji Cooper for (i = 0; i < __arraycount(t); i++) {
14557718be8SEnji Cooper
14657718be8SEnji Cooper li = strtol(t[i].str, &end, t[i].base);
14757718be8SEnji Cooper lli = strtoll(t[i].str, NULL, t[i].base);
14857718be8SEnji Cooper
14957718be8SEnji Cooper check(&t[i], li, lli, end);
15057718be8SEnji Cooper }
15157718be8SEnji Cooper }
15257718be8SEnji Cooper
15357718be8SEnji Cooper ATF_TC(strtol_range);
ATF_TC_HEAD(strtol_range,tc)15457718be8SEnji Cooper ATF_TC_HEAD(strtol_range, tc)
15557718be8SEnji Cooper {
15657718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test ERANGE from strtol(3)");
15757718be8SEnji Cooper }
15857718be8SEnji Cooper
ATF_TC_BODY(strtol_range,tc)15957718be8SEnji Cooper ATF_TC_BODY(strtol_range, tc)
16057718be8SEnji Cooper {
16157718be8SEnji Cooper
16257718be8SEnji Cooper #if LONG_MAX == 0x7fffffff /* XXX: Is this portable? */
16357718be8SEnji Cooper
16457718be8SEnji Cooper struct test t[] = {
16557718be8SEnji Cooper { "20000000000", 2147483647, 8, NULL },
16657718be8SEnji Cooper { "2147483648", 2147483647, 10, NULL },
16757718be8SEnji Cooper { "80000000", 2147483647, 16, NULL },
16857718be8SEnji Cooper };
16957718be8SEnji Cooper #else
17057718be8SEnji Cooper struct test t[] = {
17157718be8SEnji Cooper { "1000000000000000000000", 9223372036854775807, 8, NULL },
17257718be8SEnji Cooper { "9223372036854775808", 9223372036854775807, 10, NULL },
17357718be8SEnji Cooper { "8000000000000000", 9223372036854775807, 16, NULL },
17457718be8SEnji Cooper };
17557718be8SEnji Cooper #endif
17657718be8SEnji Cooper
17757718be8SEnji Cooper long int li;
17857718be8SEnji Cooper char *end;
17957718be8SEnji Cooper size_t i;
18057718be8SEnji Cooper
18157718be8SEnji Cooper for (i = 0; i < __arraycount(t); i++) {
18257718be8SEnji Cooper
18357718be8SEnji Cooper errno = 0;
18457718be8SEnji Cooper li = strtol(t[i].str, &end, t[i].base);
18557718be8SEnji Cooper
18657718be8SEnji Cooper if (errno != ERANGE)
18757718be8SEnji Cooper atf_tc_fail("strtol(3) did not catch ERANGE");
18857718be8SEnji Cooper
18957718be8SEnji Cooper check(&t[i], li, -1, end);
19057718be8SEnji Cooper }
19157718be8SEnji Cooper }
19257718be8SEnji Cooper
19357718be8SEnji Cooper ATF_TC(strtol_signed);
ATF_TC_HEAD(strtol_signed,tc)19457718be8SEnji Cooper ATF_TC_HEAD(strtol_signed, tc)
19557718be8SEnji Cooper {
19657718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "A basic test of strtol(3)");
19757718be8SEnji Cooper }
19857718be8SEnji Cooper
ATF_TC_BODY(strtol_signed,tc)19957718be8SEnji Cooper ATF_TC_BODY(strtol_signed, tc)
20057718be8SEnji Cooper {
20157718be8SEnji Cooper struct test t[] = {
20257718be8SEnji Cooper { "1", 1, 0, NULL },
20357718be8SEnji Cooper { " 2", 2, 0, NULL },
20457718be8SEnji Cooper { " 3", 3, 0, NULL },
20557718be8SEnji Cooper { " -3", -3, 0, NULL },
20657718be8SEnji Cooper { "--1", 0, 0, "--1" },
20757718be8SEnji Cooper { "+-2", 0, 0, "+-2" },
20857718be8SEnji Cooper { "++3", 0, 0, "++3" },
20957718be8SEnji Cooper { "+9", 9, 0, NULL },
21057718be8SEnji Cooper { "+123", 123, 0, NULL },
21157718be8SEnji Cooper { "-1 3", -1, 0, " 3" },
21257718be8SEnji Cooper { "-1.3", -1, 0, ".3" },
21357718be8SEnji Cooper { "- 3", 0, 0, "- 3" },
21457718be8SEnji Cooper { "+33.", 33, 0, "." },
21557718be8SEnji Cooper { "30x0", 30, 0, "x0" },
21657718be8SEnji Cooper };
21757718be8SEnji Cooper
21857718be8SEnji Cooper long long int lli;
21957718be8SEnji Cooper long int li;
22057718be8SEnji Cooper char *end;
22157718be8SEnji Cooper size_t i;
22257718be8SEnji Cooper
22357718be8SEnji Cooper for (i = 0; i < __arraycount(t); i++) {
22457718be8SEnji Cooper
22557718be8SEnji Cooper li = strtol(t[i].str, &end, t[i].base);
22657718be8SEnji Cooper lli = strtoll(t[i].str, NULL, t[i].base);
22757718be8SEnji Cooper
22857718be8SEnji Cooper check(&t[i], li, lli, end);
22957718be8SEnji Cooper }
23057718be8SEnji Cooper }
23157718be8SEnji Cooper
ATF_TP_ADD_TCS(tp)23257718be8SEnji Cooper ATF_TP_ADD_TCS(tp)
23357718be8SEnji Cooper {
23457718be8SEnji Cooper
23557718be8SEnji Cooper ATF_TP_ADD_TC(tp, strtol_base);
23657718be8SEnji Cooper ATF_TP_ADD_TC(tp, strtol_case);
23757718be8SEnji Cooper ATF_TP_ADD_TC(tp, strtol_range);
23857718be8SEnji Cooper ATF_TP_ADD_TC(tp, strtol_signed);
23957718be8SEnji Cooper
24057718be8SEnji Cooper return atf_no_error();
24157718be8SEnji Cooper }
242