1*b753e46cSjoerg /* $NetBSD: t_bitstring.c,v 1.4 2012/03/25 06:54:04 joerg Exp $ */
26cbeb05cSjmmv
36cbeb05cSjmmv /*-
46cbeb05cSjmmv * Copyright (c) 1993, 2008, 2010 The NetBSD Foundation, Inc.
56cbeb05cSjmmv * All rights reserved.
66cbeb05cSjmmv *
76cbeb05cSjmmv * Redistribution and use in source and binary forms, with or without
86cbeb05cSjmmv * modification, are permitted provided that the following conditions
96cbeb05cSjmmv * are met:
106cbeb05cSjmmv * 1. Redistributions of source code must retain the above copyright
116cbeb05cSjmmv * notice, this list of conditions and the following disclaimer.
126cbeb05cSjmmv * 2. Redistributions in binary form must reproduce the above copyright
136cbeb05cSjmmv * notice, this list of conditions and the following disclaimer in the
146cbeb05cSjmmv * documentation and/or other materials provided with the distribution.
156cbeb05cSjmmv *
166cbeb05cSjmmv * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
176cbeb05cSjmmv * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
186cbeb05cSjmmv * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
196cbeb05cSjmmv * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
206cbeb05cSjmmv * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
216cbeb05cSjmmv * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
226cbeb05cSjmmv * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
236cbeb05cSjmmv * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
246cbeb05cSjmmv * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
256cbeb05cSjmmv * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
266cbeb05cSjmmv * POSSIBILITY OF SUCH DAMAGE.
276cbeb05cSjmmv */
286cbeb05cSjmmv
296cbeb05cSjmmv #include <assert.h>
306cbeb05cSjmmv #include <bitstring.h>
316cbeb05cSjmmv #include <stdio.h>
326cbeb05cSjmmv #include <stdlib.h>
336cbeb05cSjmmv
346cbeb05cSjmmv #include <atf-c.h>
356cbeb05cSjmmv
366cbeb05cSjmmv static void
clearbits(bitstr_t * b,int n)376cbeb05cSjmmv clearbits(bitstr_t *b, int n)
386cbeb05cSjmmv {
396cbeb05cSjmmv int i = bitstr_size(n);
406cbeb05cSjmmv
416cbeb05cSjmmv while(i--)
426cbeb05cSjmmv *(b + i) = 0;
436cbeb05cSjmmv }
446cbeb05cSjmmv
456cbeb05cSjmmv static void
printbits(FILE * file,bitstr_t * b,int n)466cbeb05cSjmmv printbits(FILE *file, bitstr_t *b, int n)
476cbeb05cSjmmv {
486cbeb05cSjmmv int i;
496cbeb05cSjmmv int jc, js;
506cbeb05cSjmmv
516cbeb05cSjmmv bit_ffc(b, n, &jc);
526cbeb05cSjmmv bit_ffs(b, n, &js);
536cbeb05cSjmmv
546cbeb05cSjmmv (void) fprintf(file, "%3d %3d ", jc, js);
556cbeb05cSjmmv
566cbeb05cSjmmv for (i=0; i < n; i++) {
576cbeb05cSjmmv (void) fprintf(file, "%c", (bit_test(b, i) ? '1' : '0'));
586cbeb05cSjmmv }
596cbeb05cSjmmv
606cbeb05cSjmmv (void) fprintf(file, "%c", '\n');
616cbeb05cSjmmv }
626cbeb05cSjmmv
636cbeb05cSjmmv static void
calculate_data(FILE * file,const int test_length)646cbeb05cSjmmv calculate_data(FILE *file, const int test_length)
656cbeb05cSjmmv {
660f10aa9dSchristos int i;
676cbeb05cSjmmv bitstr_t *bs;
686cbeb05cSjmmv
696cbeb05cSjmmv assert(test_length >= 4);
706cbeb05cSjmmv
716cbeb05cSjmmv (void) fprintf(file, "Testing with TEST_LENGTH = %d\n\n", test_length);
726cbeb05cSjmmv
736cbeb05cSjmmv (void) fprintf(file, "test _bit_byte, _bit_mask, and bitstr_size\n");
746cbeb05cSjmmv (void) fprintf(file, " i _bit_byte(i) _bit_mask(i) bitstr_size(i)\n");
756cbeb05cSjmmv
766cbeb05cSjmmv for (i=0; i < test_length; i++) {
770f10aa9dSchristos (void) fprintf(file, "%3d%15u%15u%15zu\n",
786cbeb05cSjmmv i, _bit_byte(i), _bit_mask(i), bitstr_size(i));
796cbeb05cSjmmv }
806cbeb05cSjmmv
816cbeb05cSjmmv bs = bit_alloc(test_length);
826cbeb05cSjmmv clearbits(bs, test_length);
836cbeb05cSjmmv (void) fprintf(file, "\ntest bit_alloc, clearbits, bit_ffc, bit_ffs\n");
846cbeb05cSjmmv (void) fprintf(file, "be: 0 -1 ");
856cbeb05cSjmmv for (i=0; i < test_length; i++)
866cbeb05cSjmmv (void) fprintf(file, "%c", '0');
876cbeb05cSjmmv (void) fprintf(file, "\nis: ");
886cbeb05cSjmmv printbits(file, bs, test_length);
896cbeb05cSjmmv
906cbeb05cSjmmv (void) fprintf(file, "\ntest bit_set\n");
916cbeb05cSjmmv for (i=0; i < test_length; i+=3)
926cbeb05cSjmmv bit_set(bs, i);
936cbeb05cSjmmv (void) fprintf(file, "be: 1 0 ");
946cbeb05cSjmmv for (i=0; i < test_length; i++)
95*b753e46cSjoerg (void) fprintf(file, "%c", "100"[i % 3]);
966cbeb05cSjmmv (void) fprintf(file, "\nis: ");
976cbeb05cSjmmv printbits(file, bs, test_length);
986cbeb05cSjmmv
996cbeb05cSjmmv (void) fprintf(file, "\ntest bit_clear\n");
1006cbeb05cSjmmv for (i=0; i < test_length; i+=6)
1016cbeb05cSjmmv bit_clear(bs, i);
1026cbeb05cSjmmv (void) fprintf(file, "be: 0 3 ");
1036cbeb05cSjmmv for (i=0; i < test_length; i++)
104*b753e46cSjoerg (void) fprintf(file, "%c", "000100"[i % 6]);
1056cbeb05cSjmmv (void) fprintf(file, "\nis: ");
1066cbeb05cSjmmv printbits(file, bs, test_length);
1076cbeb05cSjmmv
1086cbeb05cSjmmv (void) fprintf(file, "\ntest bit_test using previous bitstring\n");
1096cbeb05cSjmmv (void) fprintf(file, " i bit_test(i)\n");
1106cbeb05cSjmmv for (i=0; i < test_length; i++)
1116cbeb05cSjmmv (void) fprintf(file, "%3d%15d\n", i, bit_test(bs, i));
1126cbeb05cSjmmv
1136cbeb05cSjmmv clearbits(bs, test_length);
1146cbeb05cSjmmv (void) fprintf(file, "\ntest clearbits\n");
1156cbeb05cSjmmv (void) fprintf(file, "be: 0 -1 ");
1166cbeb05cSjmmv for (i=0; i < test_length; i++)
1176cbeb05cSjmmv (void) fprintf(file, "%c", '0');
1186cbeb05cSjmmv (void) fprintf(file, "\nis: ");
1196cbeb05cSjmmv printbits(file, bs, test_length);
1206cbeb05cSjmmv
1216cbeb05cSjmmv (void) fprintf(file, "\ntest bit_nset and bit_nclear\n");
1226cbeb05cSjmmv bit_nset(bs, 1, test_length - 2);
1236cbeb05cSjmmv (void) fprintf(file, "be: 0 1 0");
1246cbeb05cSjmmv for (i=0; i < test_length - 2; i++)
1256cbeb05cSjmmv (void) fprintf(file, "%c", '1');
1266cbeb05cSjmmv (void) fprintf(file, "0\nis: ");
1276cbeb05cSjmmv printbits(file, bs, test_length);
1286cbeb05cSjmmv
1296cbeb05cSjmmv bit_nclear(bs, 2, test_length - 3);
1306cbeb05cSjmmv (void) fprintf(file, "be: 0 1 01");
1316cbeb05cSjmmv for (i=0; i < test_length - 4; i++)
1326cbeb05cSjmmv (void) fprintf(file, "%c", '0');
1336cbeb05cSjmmv (void) fprintf(file, "10\nis: ");
1346cbeb05cSjmmv printbits(file, bs, test_length);
1356cbeb05cSjmmv
1366cbeb05cSjmmv bit_nclear(bs, 0, test_length - 1);
1376cbeb05cSjmmv (void) fprintf(file, "be: 0 -1 ");
1386cbeb05cSjmmv for (i=0; i < test_length; i++)
1396cbeb05cSjmmv (void) fprintf(file, "%c", '0');
1406cbeb05cSjmmv (void) fprintf(file, "\nis: ");
1416cbeb05cSjmmv printbits(file, bs, test_length);
1426cbeb05cSjmmv bit_nset(bs, 0, test_length - 2);
1436cbeb05cSjmmv (void) fprintf(file, "be: %3d 0 ",test_length - 1);
1446cbeb05cSjmmv for (i=0; i < test_length - 1; i++)
1456cbeb05cSjmmv (void) fprintf(file, "%c", '1');
1466cbeb05cSjmmv fprintf(file, "%c", '0');
1476cbeb05cSjmmv (void) fprintf(file, "\nis: ");
1486cbeb05cSjmmv printbits(file, bs, test_length);
1496cbeb05cSjmmv bit_nclear(bs, 0, test_length - 1);
1506cbeb05cSjmmv (void) fprintf(file, "be: 0 -1 ");
1516cbeb05cSjmmv for (i=0; i < test_length; i++)
1526cbeb05cSjmmv (void) fprintf(file, "%c", '0');
1536cbeb05cSjmmv (void) fprintf(file, "\nis: ");
1546cbeb05cSjmmv printbits(file, bs, test_length);
1556cbeb05cSjmmv
1566cbeb05cSjmmv (void) fprintf(file, "\n");
1576cbeb05cSjmmv (void) fprintf(file, "first 1 bit should move right 1 position each line\n");
1586cbeb05cSjmmv for (i=0; i < test_length; i++) {
1596cbeb05cSjmmv bit_nclear(bs, 0, test_length - 1);
1606cbeb05cSjmmv bit_nset(bs, i, test_length - 1);
1616cbeb05cSjmmv (void) fprintf(file, "%3d ", i); printbits(file, bs, test_length);
1626cbeb05cSjmmv }
1636cbeb05cSjmmv
1646cbeb05cSjmmv (void) fprintf(file, "\n");
1656cbeb05cSjmmv (void) fprintf(file, "first 0 bit should move right 1 position each line\n");
1666cbeb05cSjmmv for (i=0; i < test_length; i++) {
1676cbeb05cSjmmv bit_nset(bs, 0, test_length - 1);
1686cbeb05cSjmmv bit_nclear(bs, i, test_length - 1);
1696cbeb05cSjmmv (void) fprintf(file, "%3d ", i); printbits(file, bs, test_length);
1706cbeb05cSjmmv }
1716cbeb05cSjmmv
1726cbeb05cSjmmv (void) fprintf(file, "\n");
1736cbeb05cSjmmv (void) fprintf(file, "first 0 bit should move left 1 position each line\n");
1746cbeb05cSjmmv for (i=0; i < test_length; i++) {
1756cbeb05cSjmmv bit_nclear(bs, 0, test_length - 1);
1766cbeb05cSjmmv bit_nset(bs, 0, test_length - 1 - i);
1776cbeb05cSjmmv (void) fprintf(file, "%3d ", i); printbits(file, bs, test_length);
1786cbeb05cSjmmv }
1796cbeb05cSjmmv
1806cbeb05cSjmmv (void) fprintf(file, "\n");
1816cbeb05cSjmmv (void) fprintf(file, "first 1 bit should move left 1 position each line\n");
1826cbeb05cSjmmv for (i=0; i < test_length; i++) {
1836cbeb05cSjmmv bit_nset(bs, 0, test_length - 1);
1846cbeb05cSjmmv bit_nclear(bs, 0, test_length - 1 - i);
1856cbeb05cSjmmv (void) fprintf(file, "%3d ", i); printbits(file, bs, test_length);
1866cbeb05cSjmmv }
1876cbeb05cSjmmv
1886cbeb05cSjmmv (void) fprintf(file, "\n");
1896cbeb05cSjmmv (void) fprintf(file, "0 bit should move right 1 position each line\n");
1906cbeb05cSjmmv for (i=0; i < test_length; i++) {
1916cbeb05cSjmmv bit_nset(bs, 0, test_length - 1);
1926cbeb05cSjmmv bit_nclear(bs, i, i);
1936cbeb05cSjmmv (void) fprintf(file, "%3d ", i); printbits(file, bs, test_length);
1946cbeb05cSjmmv }
1956cbeb05cSjmmv
1966cbeb05cSjmmv (void) fprintf(file, "\n");
1976cbeb05cSjmmv (void) fprintf(file, "1 bit should move right 1 position each line\n");
1986cbeb05cSjmmv for (i=0; i < test_length; i++) {
1996cbeb05cSjmmv bit_nclear(bs, 0, test_length - 1);
2006cbeb05cSjmmv bit_nset(bs, i, i);
2016cbeb05cSjmmv (void) fprintf(file, "%3d ", i); printbits(file, bs, test_length);
2026cbeb05cSjmmv }
2036cbeb05cSjmmv
2046cbeb05cSjmmv (void) free(bs);
2056cbeb05cSjmmv }
2066cbeb05cSjmmv
2070f10aa9dSchristos static void
one_check(const atf_tc_t * tc,const int test_length)2086cbeb05cSjmmv one_check(const atf_tc_t *tc, const int test_length)
2096cbeb05cSjmmv {
2106cbeb05cSjmmv FILE *out;
2116cbeb05cSjmmv char command[1024];
2126cbeb05cSjmmv
2136cbeb05cSjmmv ATF_REQUIRE((out = fopen("out", "w")) != NULL);
2146cbeb05cSjmmv calculate_data(out, test_length);
2156cbeb05cSjmmv fclose(out);
2166cbeb05cSjmmv
2176cbeb05cSjmmv /* XXX The following is a huge hack that was added to simplify the
2186cbeb05cSjmmv * conversion of these tests from src/regress/ to src/tests/. The
2196cbeb05cSjmmv * tests in this file should be checking their own results, without
2206cbeb05cSjmmv * having to resort to external data files. */
2216cbeb05cSjmmv snprintf(command, sizeof(command), "diff -u %s/d_bitstring_%d.out out",
2226cbeb05cSjmmv atf_tc_get_config_var(tc, "srcdir"), test_length);
2236cbeb05cSjmmv if (system(command) != EXIT_SUCCESS)
2246cbeb05cSjmmv atf_tc_fail("Test failed; see output for details");
2256cbeb05cSjmmv }
2266cbeb05cSjmmv
2276cbeb05cSjmmv ATF_TC(bits_8);
ATF_TC_HEAD(bits_8,tc)2286cbeb05cSjmmv ATF_TC_HEAD(bits_8, tc)
2296cbeb05cSjmmv {
2306cbeb05cSjmmv atf_tc_set_md_var(tc, "descr", "Checks 8-bit long bitstrings");
2316cbeb05cSjmmv }
ATF_TC_BODY(bits_8,tc)2326cbeb05cSjmmv ATF_TC_BODY(bits_8, tc)
2336cbeb05cSjmmv {
2346cbeb05cSjmmv one_check(tc, 8);
2356cbeb05cSjmmv }
2366cbeb05cSjmmv
2376cbeb05cSjmmv ATF_TC(bits_27);
ATF_TC_HEAD(bits_27,tc)2386cbeb05cSjmmv ATF_TC_HEAD(bits_27, tc)
2396cbeb05cSjmmv {
2406cbeb05cSjmmv atf_tc_set_md_var(tc, "descr", "Checks 27-bit long bitstrings");
2416cbeb05cSjmmv }
ATF_TC_BODY(bits_27,tc)2426cbeb05cSjmmv ATF_TC_BODY(bits_27, tc)
2436cbeb05cSjmmv {
2446cbeb05cSjmmv one_check(tc, 27);
2456cbeb05cSjmmv }
2466cbeb05cSjmmv
2476cbeb05cSjmmv ATF_TC(bits_32);
ATF_TC_HEAD(bits_32,tc)2486cbeb05cSjmmv ATF_TC_HEAD(bits_32, tc)
2496cbeb05cSjmmv {
2506cbeb05cSjmmv atf_tc_set_md_var(tc, "descr", "Checks 32-bit long bitstrings");
2516cbeb05cSjmmv }
ATF_TC_BODY(bits_32,tc)2526cbeb05cSjmmv ATF_TC_BODY(bits_32, tc)
2536cbeb05cSjmmv {
2546cbeb05cSjmmv one_check(tc, 32);
2556cbeb05cSjmmv }
2566cbeb05cSjmmv
2576cbeb05cSjmmv ATF_TC(bits_49);
ATF_TC_HEAD(bits_49,tc)2586cbeb05cSjmmv ATF_TC_HEAD(bits_49, tc)
2596cbeb05cSjmmv {
2606cbeb05cSjmmv atf_tc_set_md_var(tc, "descr", "Checks 49-bit long bitstrings");
2616cbeb05cSjmmv }
ATF_TC_BODY(bits_49,tc)2626cbeb05cSjmmv ATF_TC_BODY(bits_49, tc)
2636cbeb05cSjmmv {
2646cbeb05cSjmmv one_check(tc, 49);
2656cbeb05cSjmmv }
2666cbeb05cSjmmv
2676cbeb05cSjmmv ATF_TC(bits_64);
ATF_TC_HEAD(bits_64,tc)2686cbeb05cSjmmv ATF_TC_HEAD(bits_64, tc)
2696cbeb05cSjmmv {
2706cbeb05cSjmmv atf_tc_set_md_var(tc, "descr", "Checks 64-bit long bitstrings");
2716cbeb05cSjmmv }
ATF_TC_BODY(bits_64,tc)2726cbeb05cSjmmv ATF_TC_BODY(bits_64, tc)
2736cbeb05cSjmmv {
2746cbeb05cSjmmv one_check(tc, 64);
2756cbeb05cSjmmv }
2766cbeb05cSjmmv
2776cbeb05cSjmmv ATF_TC(bits_67);
ATF_TC_HEAD(bits_67,tc)2786cbeb05cSjmmv ATF_TC_HEAD(bits_67, tc)
2796cbeb05cSjmmv {
2806cbeb05cSjmmv atf_tc_set_md_var(tc, "descr", "Checks 67-bit long bitstrings");
2816cbeb05cSjmmv }
ATF_TC_BODY(bits_67,tc)2826cbeb05cSjmmv ATF_TC_BODY(bits_67, tc)
2836cbeb05cSjmmv {
2846cbeb05cSjmmv one_check(tc, 67);
2856cbeb05cSjmmv }
2866cbeb05cSjmmv
ATF_TP_ADD_TCS(tp)2876cbeb05cSjmmv ATF_TP_ADD_TCS(tp)
2886cbeb05cSjmmv {
2896cbeb05cSjmmv
2906cbeb05cSjmmv ATF_TP_ADD_TC(tp, bits_8);
2916cbeb05cSjmmv ATF_TP_ADD_TC(tp, bits_27);
2926cbeb05cSjmmv ATF_TP_ADD_TC(tp, bits_32);
2936cbeb05cSjmmv ATF_TP_ADD_TC(tp, bits_49);
2946cbeb05cSjmmv ATF_TP_ADD_TC(tp, bits_64);
2956cbeb05cSjmmv ATF_TP_ADD_TC(tp, bits_67);
2966cbeb05cSjmmv
2976cbeb05cSjmmv return atf_no_error();
2986cbeb05cSjmmv }
299