| /**************************************************************************** |
| * apps/testing/libc/stdbit/stdbit.c |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. The |
| * ASF licenses this file to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance with the |
| * License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
| * License for the specific language governing permissions and limitations |
| * under the License. |
| * |
| ****************************************************************************/ |
| |
| /**************************************************************************** |
| * Included Files |
| ****************************************************************************/ |
| |
| #include <sys/stat.h> |
| #include <unistd.h> |
| #include <stdio.h> |
| #include <fcntl.h> |
| #include <stdbit.h> |
| #include <limits.h> |
| #include <sys/param.h> |
| |
| /**************************************************************************** |
| * Pre-processor Definitions |
| ****************************************************************************/ |
| |
| #define CHAR_SIZ (8) |
| #define NBITS(x) (sizeof(x) * CHAR_SIZ) |
| |
| /**************************************************************************** |
| * Private Types |
| ****************************************************************************/ |
| |
| struct test_entry_s |
| { |
| const char name[NAME_MAX]; |
| CODE int (*entry)(void); |
| }; |
| |
| /**************************************************************************** |
| * Private Functions Prototypes |
| ****************************************************************************/ |
| |
| static int leading_zeros(void); |
| static int leading_ones(void); |
| static int trailing_zeros(void); |
| static int trailing_ones(void); |
| static int first_leading_zero(void); |
| static int first_leading_one(void); |
| static int first_trailing_zero(void); |
| static int first_trailing_one(void); |
| static int count_zeros(void); |
| static int count_ones(void); |
| static int has_single_bit(void); |
| static int bit_width(void); |
| static int bit_floor(void); |
| static int bit_ceil(void); |
| |
| /**************************************************************************** |
| * Private data |
| ****************************************************************************/ |
| |
| static const struct test_entry_s g_entry_list[] = |
| { |
| {"leading_zeros", leading_zeros}, |
| {"leading_ones", leading_ones}, |
| {"trailing_zeros", trailing_zeros}, |
| {"trailing_ones", trailing_ones}, |
| {"first_leading_zero", first_leading_zero}, |
| {"first_leading_one", first_leading_one}, |
| {"first_trailing_zero", first_trailing_zero}, |
| {"first_trailing_one", first_trailing_one}, |
| {"count_zeros", count_zeros}, |
| {"count_ones", count_ones}, |
| {"has_single_bit", has_single_bit}, |
| {"bit_width", bit_width}, |
| {"bit_floor", bit_floor}, |
| {"bit_ceil", bit_ceil}, |
| }; |
| |
| /**************************************************************************** |
| * Private Functions |
| ****************************************************************************/ |
| |
| /**************************************************************************** |
| * Name: leading_zeros |
| ****************************************************************************/ |
| |
| static int leading_zeros(void) |
| { |
| int i; |
| int nbits; |
| int ret; |
| int ret2; |
| unsigned char uc; |
| unsigned short us; |
| unsigned int ui; |
| unsigned long int ul; |
| unsigned long long int ull; |
| |
| nbits = NBITS(uc); |
| uc = (1 << (nbits - 1)); |
| for (i = 0; i <= nbits; i++) |
| { |
| ret = stdc_leading_zeros_uc(uc); |
| ret2 = stdc_leading_zeros(uc); |
| if (ret != i || ret2 != i) |
| { |
| return -1; |
| } |
| |
| uc = uc >> 1; |
| } |
| |
| nbits = NBITS(us); |
| us = (1 << (nbits - 1)); |
| for (i = 0; i <= nbits; i++) |
| { |
| ret = stdc_leading_zeros_us(us); |
| ret2 = stdc_leading_zeros(us); |
| if (ret != i || ret2 != i) |
| { |
| return -1; |
| } |
| |
| us = us >> 1; |
| } |
| |
| nbits = NBITS(ui); |
| ui = (1U << (nbits - 1)); |
| for (i = 0; i <= nbits; i++) |
| { |
| ret = stdc_leading_zeros_ui(ui); |
| ret2 = stdc_leading_zeros(ui); |
| if (ret != i || ret2 != i) |
| { |
| return -1; |
| } |
| |
| ui = ui >> 1; |
| } |
| |
| nbits = NBITS(ul); |
| ul = (1UL << (nbits - 1)); |
| for (i = 0; i <= nbits; i++) |
| { |
| ret = stdc_leading_zeros_ul(ul); |
| ret2 = stdc_leading_zeros(ul); |
| if (ret != i || ret2 != i) |
| { |
| return -1; |
| } |
| |
| ul = ul >> 1; |
| } |
| |
| nbits = NBITS(ull); |
| ull = (1ULL << (nbits - 1)); |
| for (i = 0; i <= nbits; i++) |
| { |
| ret = stdc_leading_zeros_ul(ull); |
| ret2 = stdc_leading_zeros(ull); |
| if (ret != i || ret2 != i) |
| { |
| return -1; |
| } |
| |
| ull = ull >> 1; |
| } |
| |
| return 0; |
| } |
| |
| /**************************************************************************** |
| * Name: leading_ones |
| ****************************************************************************/ |
| |
| static int leading_ones(void) |
| { |
| int i; |
| int nbits; |
| int ret; |
| int ret2; |
| unsigned char uc; |
| unsigned short us; |
| unsigned int ui; |
| unsigned long int ul; |
| unsigned long long int ull; |
| |
| nbits = NBITS(uc); |
| uc = 0; |
| for (i = 0; i <= nbits; i++) |
| { |
| ret = stdc_leading_ones_uc(uc); |
| ret2 = stdc_leading_ones(uc); |
| if (ret != i || ret2 != i) |
| { |
| return -1; |
| } |
| |
| uc |= (1 << (nbits - (i + 1))); |
| } |
| |
| nbits = NBITS(us); |
| us = 0; |
| for (i = 0; i <= nbits; i++) |
| { |
| ret = stdc_leading_ones_us(us); |
| ret2 = stdc_leading_ones(us); |
| if (ret != i || ret2 != i) |
| { |
| return -1; |
| } |
| |
| us |= (1 << (nbits - (i + 1))); |
| } |
| |
| nbits = NBITS(ui); |
| ui = 0; |
| for (i = 0; i <= nbits; i++) |
| { |
| ret = stdc_leading_ones_ui(ui); |
| ret2 = stdc_leading_ones(ui); |
| if (ret != i || ret2 != i) |
| { |
| return -1; |
| } |
| |
| ui |= (1U << (nbits - (i + 1))); |
| } |
| |
| nbits = NBITS(ul); |
| ul = 0; |
| for (i = 0; i <= nbits; i++) |
| { |
| ret = stdc_leading_ones_ul(ul); |
| ret2 = stdc_leading_ones(ul); |
| if (ret != i || ret2 != i) |
| { |
| return -1; |
| } |
| |
| ul |= (1UL << (nbits - (i + 1))); |
| } |
| |
| nbits = NBITS(ull); |
| ull = 0; |
| for (i = 0; i <= nbits; i++) |
| { |
| ret = stdc_leading_ones_ul(ull); |
| ret2 = stdc_leading_ones(ull); |
| if (ret != i || ret2 != i) |
| { |
| return -1; |
| } |
| |
| ull |= (1ULL << (nbits - (i + 1))); |
| } |
| |
| return 0; |
| } |
| |
| /**************************************************************************** |
| * Name: trailing_zeros |
| ****************************************************************************/ |
| |
| static int trailing_zeros(void) |
| { |
| int i; |
| int nbits; |
| int ret; |
| int ret2; |
| unsigned char uc; |
| unsigned short us; |
| unsigned int ui; |
| unsigned long int ul; |
| unsigned long long int ull; |
| |
| nbits = NBITS(uc); |
| uc = 1; |
| for (i = 0; i <= nbits; i++) |
| { |
| ret = stdc_trailing_zeros_uc(uc); |
| ret2 = stdc_trailing_zeros(uc); |
| if (ret != i || ret2 != i) |
| { |
| return -1; |
| } |
| |
| uc = uc << 1; |
| } |
| |
| nbits = NBITS(us); |
| us = 1; |
| for (i = 0; i <= nbits; i++) |
| { |
| ret = stdc_trailing_zeros_us(us); |
| ret2 = stdc_trailing_zeros(us); |
| if (ret != i || ret2 != i) |
| { |
| return -1; |
| } |
| |
| us = us << 1; |
| } |
| |
| nbits = NBITS(ui); |
| ui = 1; |
| for (i = 0; i <= nbits; i++) |
| { |
| ret = stdc_trailing_zeros_ui(ui); |
| ret2 = stdc_trailing_zeros(ui); |
| if (ret != i || ret2 != i) |
| { |
| return -1; |
| } |
| |
| ui = ui << 1; |
| } |
| |
| nbits = NBITS(ul); |
| ul = 1; |
| for (i = 0; i <= nbits; i++) |
| { |
| ret = stdc_trailing_zeros_ul(ul); |
| ret2 = stdc_trailing_zeros(ul); |
| if (ret != i || ret2 != i) |
| { |
| return -1; |
| } |
| |
| ul = ul << 1; |
| } |
| |
| nbits = NBITS(ull); |
| ull = 1; |
| for (i = 0; i <= nbits; i++) |
| { |
| ret = stdc_trailing_zeros_ul(ull); |
| ret2 = stdc_trailing_zeros(ull); |
| if (ret != i || ret2 != i) |
| { |
| return -1; |
| } |
| |
| ull = ull << 1; |
| } |
| |
| return 0; |
| } |
| |
| /**************************************************************************** |
| * Name: traling_ones |
| ****************************************************************************/ |
| |
| static int trailing_ones(void) |
| { |
| int i; |
| int nbits; |
| int ret; |
| int ret2; |
| unsigned char uc; |
| unsigned short us; |
| unsigned int ui; |
| unsigned long int ul; |
| unsigned long long int ull; |
| |
| nbits = NBITS(uc); |
| uc = 0; |
| for (i = 0; i <= nbits; i++) |
| { |
| ret = stdc_trailing_ones_uc(uc); |
| ret2 = stdc_trailing_ones(uc); |
| if (ret != i || ret2 != i) |
| { |
| return -1; |
| } |
| |
| uc |= (1 << i); |
| } |
| |
| nbits = NBITS(us); |
| us = 0; |
| for (i = 0; i <= nbits; i++) |
| { |
| ret = stdc_trailing_ones_us(us); |
| ret2 = stdc_trailing_ones(us); |
| if (ret != i || ret2 != i) |
| { |
| return -1; |
| } |
| |
| us |= (1 << i); |
| } |
| |
| nbits = NBITS(ui); |
| ui = 0; |
| for (i = 0; i <= nbits; i++) |
| { |
| ret = stdc_trailing_ones_ui(ui); |
| ret2 = stdc_trailing_ones(ui); |
| if (ret != i || ret2 != i) |
| { |
| return -1; |
| } |
| |
| ui |= (1U << i); |
| } |
| |
| nbits = NBITS(ul); |
| ul = 0; |
| for (i = 0; i <= nbits; i++) |
| { |
| ret = stdc_trailing_ones_ul(ul); |
| ret2 = stdc_trailing_ones(ul); |
| if (ret != i || ret2 != i) |
| { |
| return -1; |
| } |
| |
| ul |= (1UL << i); |
| } |
| |
| nbits = NBITS(ull); |
| ull = 0; |
| for (i = 0; i <= nbits; i++) |
| { |
| ret = stdc_trailing_ones_ul(ull); |
| ret2 = stdc_trailing_ones(ull); |
| if (ret != i || ret2 != i) |
| { |
| return -1; |
| } |
| |
| ull |= (1ULL << i); |
| } |
| |
| return 0; |
| } |
| |
| /**************************************************************************** |
| * Name: first_leading_zero |
| ****************************************************************************/ |
| |
| static int first_leading_zero(void) |
| { |
| int i; |
| int nbits; |
| int ret; |
| int ret2; |
| unsigned char uc; |
| unsigned short us; |
| unsigned int ui; |
| unsigned long int ul; |
| unsigned long long int ull; |
| |
| nbits = NBITS(uc); |
| uc = 0; |
| for (i = 1; i <= nbits + 1; i++) |
| { |
| ret = stdc_first_leading_zero_uc(uc); |
| ret2 = stdc_first_leading_zero(uc); |
| if (ret != (i % (nbits + 1)) || ret2 != (i % (nbits + 1))) |
| { |
| return -1; |
| } |
| |
| uc |= (1 << (nbits - i)); |
| } |
| |
| nbits = NBITS(us); |
| us = 0; |
| for (i = 1; i <= nbits + 1; i++) |
| { |
| ret = stdc_first_leading_zero_us(us); |
| ret2 = stdc_first_leading_zero(us); |
| if (ret != (i % (nbits + 1)) || ret2 != (i % (nbits + 1))) |
| { |
| return -1; |
| } |
| |
| us |= (1 << (nbits - i)); |
| } |
| |
| nbits = NBITS(ui); |
| ui = 0; |
| for (i = 1; i <= nbits + 1; i++) |
| { |
| ret = stdc_first_leading_zero_ui(ui); |
| ret2 = stdc_first_leading_zero(ui); |
| if (ret != (i % (nbits + 1)) || ret2 != (i % (nbits + 1))) |
| { |
| return -1; |
| } |
| |
| ui |= (1U << (nbits - i)); |
| } |
| |
| nbits = NBITS(ul); |
| ul = 0; |
| for (i = 1; i <= (nbits + 1); i++) |
| { |
| ret = stdc_first_leading_zero_ul(ul); |
| ret2 = stdc_first_leading_zero(ul); |
| if (ret != (i % (nbits + 1)) || ret2 != (i % (nbits + 1))) |
| { |
| return -1; |
| } |
| |
| ul |= (1UL << (nbits - i)); |
| } |
| |
| nbits = NBITS(ull); |
| ull = 0; |
| for (i = 1; i <= nbits + 1; i++) |
| { |
| ret = stdc_first_leading_zero_ul(ull); |
| ret2 = stdc_first_leading_zero(ull); |
| if (ret != (i % (nbits + 1)) || ret2 != (i % (nbits + 1))) |
| { |
| return -1; |
| } |
| |
| ull |= (1ULL << (nbits - i)); |
| } |
| |
| return 0; |
| } |
| |
| /**************************************************************************** |
| * Name: first_leading_zero |
| ****************************************************************************/ |
| |
| static int first_leading_one(void) |
| { |
| int i; |
| int nbits; |
| int ret; |
| int ret2; |
| unsigned char uc; |
| unsigned short us; |
| unsigned int ui; |
| unsigned long int ul; |
| unsigned long long int ull; |
| |
| nbits = NBITS(uc); |
| uc = UCHAR_MAX; |
| for (i = 0; i <= nbits; i++) |
| { |
| ret = stdc_first_leading_one_uc(uc); |
| ret2 = stdc_first_leading_one(uc); |
| if (ret != ((i + 1) % (nbits + 1)) || ret2 != ((i + 1) % (nbits + 1))) |
| { |
| return -1; |
| } |
| |
| uc &= ~(1 << (nbits - (i + 1))); |
| } |
| |
| nbits = NBITS(us); |
| us = USHRT_MAX; |
| for (i = 0; i <= nbits; i++) |
| { |
| ret = stdc_first_leading_one_us(us); |
| ret2 = stdc_first_leading_one(us); |
| if (ret != ((i + 1) % (nbits + 1)) || ret2 != ((i + 1) % (nbits + 1))) |
| { |
| return -1; |
| } |
| |
| us &= ~(1 << (nbits - (i + 1))); |
| } |
| |
| nbits = NBITS(ui); |
| ui = UINT_MAX; |
| for (i = 0; i <= nbits; i++) |
| { |
| ret = stdc_first_leading_one_ui(ui); |
| ret2 = stdc_first_leading_one(ui); |
| if (ret != ((i + 1) % (nbits + 1)) || ret2 != ((i + 1) % (nbits + 1))) |
| { |
| return -1; |
| } |
| |
| ui &= ~(1U << (nbits - (i + 1))); |
| } |
| |
| nbits = NBITS(ul); |
| ul = ULONG_MAX; |
| for (i = 0; i <= nbits; i++) |
| { |
| ret = stdc_first_leading_one_ul(ul); |
| ret2 = stdc_first_leading_one(ul); |
| if (ret != ((i + 1) % (nbits + 1)) || ret2 != ((i + 1) % (nbits + 1))) |
| { |
| return -1; |
| } |
| |
| ul &= ~(1UL << (nbits - (i + 1))); |
| } |
| |
| nbits = NBITS(ull); |
| ull = ULLONG_MAX; |
| for (i = 0; i <= nbits; i++) |
| { |
| ret = stdc_first_leading_one_ull(ull); |
| ret2 = stdc_first_leading_one(ull); |
| if (ret != ((i + 1) % (nbits + 1)) || ret2 != ((i + 1) % (nbits + 1))) |
| { |
| return -1; |
| } |
| |
| ull &= ~(1ULL << (nbits - (i + 1))); |
| } |
| |
| return 0; |
| } |
| |
| /**************************************************************************** |
| * Name: first_trailing_zero |
| ****************************************************************************/ |
| |
| static int first_trailing_zero(void) |
| { |
| int i; |
| int nbits; |
| int ret; |
| int ret2; |
| unsigned char uc; |
| unsigned short us; |
| unsigned int ui; |
| unsigned long int ul; |
| unsigned long long int ull; |
| |
| nbits = NBITS(uc); |
| uc = 0; |
| for (i = 0; i <= nbits; i++) |
| { |
| ret = stdc_first_trailing_zero_uc(uc); |
| ret2 = stdc_first_trailing_zero(uc); |
| if (ret != ((i + 1) % (nbits + 1)) || ret2 != ((i + 1) % (nbits + 1))) |
| { |
| return -1; |
| } |
| |
| uc |= (1 << i); |
| } |
| |
| nbits = NBITS(us); |
| us = 0; |
| for (i = 0; i <= nbits; i++) |
| { |
| ret = stdc_first_trailing_zero_us(us); |
| ret2 = stdc_first_trailing_zero(us); |
| if (ret != ((i + 1) % (nbits + 1)) || ret2 != ((i + 1) % (nbits + 1))) |
| { |
| return -1; |
| } |
| |
| us |= (1 << i); |
| } |
| |
| nbits = NBITS(ui); |
| ui = 0; |
| for (i = 0; i <= nbits; i++) |
| { |
| ret = stdc_first_trailing_zero_ui(ui); |
| ret2 = stdc_first_trailing_zero(ui); |
| if (ret != ((i + 1) % (nbits + 1)) || ret2 != ((i + 1) % (nbits + 1))) |
| { |
| return -1; |
| } |
| |
| ui |= (1U << i); |
| } |
| |
| nbits = NBITS(ul); |
| ul = 0; |
| for (i = 0; i <= nbits; i++) |
| { |
| ret = stdc_first_trailing_zero_ul(ul); |
| ret2 = stdc_first_trailing_zero(ul); |
| if (ret != ((i + 1) % (nbits + 1)) || ret2 != ((i + 1) % (nbits + 1))) |
| { |
| return -1; |
| } |
| |
| ul |= (1UL << i); |
| } |
| |
| nbits = NBITS(ull); |
| ull = 0; |
| for (i = 0; i <= nbits; i++) |
| { |
| ret = stdc_first_trailing_zero_ull(ull); |
| ret2 = stdc_first_trailing_zero(ull); |
| if (ret != ((i + 1) % (nbits + 1)) || ret2 != ((i + 1) % (nbits + 1))) |
| { |
| return -1; |
| } |
| |
| ull |= (1ULL << i); |
| } |
| |
| return 0; |
| } |
| |
| /**************************************************************************** |
| * Name: first_trailing_one |
| ****************************************************************************/ |
| |
| static int first_trailing_one(void) |
| { |
| int i; |
| int nbits; |
| int ret; |
| int ret2; |
| unsigned char uc; |
| unsigned short us; |
| unsigned int ui; |
| unsigned long int ul; |
| unsigned long long int ull; |
| |
| nbits = NBITS(uc); |
| uc = 0; |
| for (i = 0; i <= nbits; i++) |
| { |
| ret = stdc_first_trailing_one_uc(uc); |
| ret2 = stdc_first_trailing_one(uc); |
| if (ret != i || ret2 != i) |
| { |
| return -1; |
| } |
| |
| uc = (1 << i); |
| } |
| |
| nbits = NBITS(us); |
| us = 0; |
| for (i = 0; i <= nbits; i++) |
| { |
| ret = stdc_first_trailing_one_us(us); |
| ret2 = stdc_first_trailing_one(us); |
| if (ret != i || ret2 != i) |
| { |
| return -1; |
| } |
| |
| us = (1 << i); |
| } |
| |
| nbits = NBITS(ui); |
| ui = 0; |
| for (i = 0; i <= nbits; i++) |
| { |
| ret = stdc_first_trailing_one_ui(ui); |
| ret2 = stdc_first_trailing_one(ui); |
| if (ret != i || ret2 != i) |
| { |
| return -1; |
| } |
| |
| ui = (1U << i); |
| } |
| |
| nbits = NBITS(ul); |
| ul = 0; |
| for (i = 0; i <= nbits; i++) |
| { |
| ret = stdc_first_trailing_one_ul(ul); |
| ret2 = stdc_first_trailing_one(ul); |
| if (ret != i || ret2 != i) |
| { |
| return -1; |
| } |
| |
| ul = (1UL << i); |
| } |
| |
| nbits = NBITS(ull); |
| ull = 0; |
| for (i = 0; i <= nbits; i++) |
| { |
| ret = stdc_first_trailing_one_ull(ull); |
| ret2 = stdc_first_trailing_one(ull); |
| if (ret != i || ret2 != i) |
| { |
| return -1; |
| } |
| |
| ull = (1ULL << i); |
| } |
| |
| return 0; |
| } |
| |
| /**************************************************************************** |
| * Name: count_zeros |
| ****************************************************************************/ |
| |
| static int count_zeros(void) |
| { |
| int i; |
| int nbits; |
| int ret; |
| int ret2; |
| unsigned char uc; |
| unsigned short us; |
| unsigned int ui; |
| unsigned long int ul; |
| unsigned long long int ull; |
| |
| nbits = NBITS(uc); |
| uc = 0; |
| for (i = nbits; i >= 0; i--) |
| { |
| ret = stdc_count_zeros_uc(uc); |
| ret2 = stdc_count_zeros(uc); |
| if (ret != i || ret2 != i) |
| { |
| return -1; |
| } |
| |
| uc |= (1 << (i - 1)); |
| } |
| |
| nbits = NBITS(us); |
| us = 0; |
| for (i = nbits; i >= 0; i--) |
| { |
| ret = stdc_count_zeros_us(us); |
| ret2 = stdc_count_zeros(us); |
| if (ret != i || ret2 != i) |
| { |
| return -1; |
| } |
| |
| us |= (1 << (i - 1)); |
| } |
| |
| nbits = NBITS(ui); |
| ui = 0; |
| for (i = nbits; i >= 0; i--) |
| { |
| ret = stdc_count_zeros_ui(ui); |
| ret2 = stdc_count_zeros(ui); |
| if (ret != i || ret2 != i) |
| { |
| return -1; |
| } |
| |
| ui |= (1U << (i - 1)); |
| } |
| |
| nbits = NBITS(ul); |
| ul = 0; |
| for (i = nbits; i >= 0; i--) |
| { |
| ret = stdc_count_zeros_ul(ul); |
| ret2 = stdc_count_zeros(ul); |
| if (ret != i || ret2 != i) |
| { |
| return -1; |
| } |
| |
| ul |= (1UL << (i - 1)); |
| } |
| |
| nbits = NBITS(ull); |
| ull = 0; |
| for (i = nbits; i >= 0; i--) |
| { |
| ret = stdc_count_zeros_ull(ull); |
| ret2 = stdc_count_zeros(ull); |
| if (ret != i || ret2 != i) |
| { |
| return -1; |
| } |
| |
| ull |= (1ULL << (i - 1)); |
| } |
| |
| return 0; |
| } |
| |
| /**************************************************************************** |
| * Name: count_ones |
| ****************************************************************************/ |
| |
| static int count_ones(void) |
| { |
| int i; |
| int nbits; |
| int ret; |
| int ret2; |
| unsigned char uc; |
| unsigned short us; |
| unsigned int ui; |
| unsigned long int ul; |
| unsigned long long int ull; |
| |
| nbits = NBITS(uc); |
| uc = 0; |
| for (i = 0; i <= nbits; i++) |
| { |
| ret = stdc_count_ones_uc(uc); |
| ret2 = stdc_count_ones(uc); |
| if (ret != i || ret2 != i) |
| { |
| return -1; |
| } |
| |
| uc |= (1 << i); |
| } |
| |
| nbits = NBITS(us); |
| us = 0; |
| for (i = 0; i <= nbits; i++) |
| { |
| ret = stdc_count_ones_us(us); |
| ret2 = stdc_count_ones(us); |
| if (ret != i || ret2 != i) |
| { |
| return -1; |
| } |
| |
| us |= (1 << i); |
| } |
| |
| nbits = NBITS(ui); |
| ui = 0; |
| for (i = 0; i <= nbits; i++) |
| { |
| ret = stdc_count_ones_ui(ui); |
| ret2 = stdc_count_ones(ui); |
| if (ret != i || ret2 != i) |
| { |
| return -1; |
| } |
| |
| ui |= (1U << i); |
| } |
| |
| nbits = NBITS(ul); |
| ul = 0; |
| for (i = 0; i <= nbits; i++) |
| { |
| ret = stdc_count_ones_ul(ul); |
| ret2 = stdc_count_ones(ul); |
| if (ret != i || ret2 != i) |
| { |
| return -1; |
| } |
| |
| ul |= (1UL << i); |
| } |
| |
| nbits = NBITS(ull); |
| ull = 0; |
| for (i = 0; i <= nbits; i++) |
| { |
| ret = stdc_count_ones_ull(ull); |
| ret2 = stdc_count_ones(ull); |
| if (ret != i || ret2 != i) |
| { |
| return -1; |
| } |
| |
| ull |= (1ULL << i); |
| } |
| |
| return 0; |
| } |
| |
| /**************************************************************************** |
| * Name: has_single_bit |
| ****************************************************************************/ |
| |
| static int has_single_bit(void) |
| { |
| int i; |
| int nbits; |
| bool ret; |
| bool ret2; |
| unsigned char uc; |
| unsigned short us; |
| unsigned int ui; |
| unsigned long int ul; |
| unsigned long long int ull; |
| |
| nbits = NBITS(uc); |
| uc = (1 << (nbits - 1)); |
| for (i = 0; i < nbits; i++) |
| { |
| ret = stdc_has_single_bit_uc(uc); |
| ret2 = stdc_has_single_bit(uc); |
| if (!ret || !ret2) |
| { |
| return -1; |
| } |
| |
| uc = uc >> 1; |
| } |
| |
| nbits = NBITS(us); |
| us = (1 << (nbits - 1)); |
| for (i = 0; i < nbits; i++) |
| { |
| ret = stdc_has_single_bit_us(us); |
| ret2 = stdc_has_single_bit(us); |
| if (!ret || !ret2) |
| { |
| return -1; |
| } |
| |
| us = us >> 1; |
| } |
| |
| nbits = NBITS(ui); |
| ui = (1U << (nbits - 1)); |
| for (i = 0; i < nbits; i++) |
| { |
| ret = stdc_has_single_bit_ui(ui); |
| ret2 = stdc_has_single_bit(ui); |
| if (!ret || !ret2) |
| { |
| return -1; |
| } |
| |
| ui = ui >> 1; |
| } |
| |
| nbits = NBITS(ul); |
| ul = (1UL << (nbits - 1)); |
| for (i = 0; i < nbits; i++) |
| { |
| ret = stdc_has_single_bit_ul(ul); |
| ret2 = stdc_has_single_bit(ul); |
| if (!ret || !ret2) |
| { |
| return -1; |
| } |
| |
| ul = ul >> 1; |
| } |
| |
| nbits = NBITS(ull); |
| ull = (1ULL << (nbits - 1)); |
| for (i = 0; i < nbits; i++) |
| { |
| ret = stdc_has_single_bit_ull(ull); |
| ret2 = stdc_has_single_bit(ull); |
| if (!ret || !ret2) |
| { |
| return -1; |
| } |
| |
| ull = ull >> 1; |
| } |
| |
| return 0; |
| } |
| |
| /**************************************************************************** |
| * Name: bit_width |
| ****************************************************************************/ |
| |
| static int bit_width(void) |
| { |
| int i; |
| int nbits; |
| int ret; |
| int ret2; |
| unsigned char uc; |
| unsigned short us; |
| unsigned int ui; |
| unsigned long int ul; |
| unsigned long long int ull; |
| |
| nbits = NBITS(uc); |
| uc = 0; |
| for (i = 0; i <= nbits; i++) |
| { |
| ret = stdc_bit_width_uc(uc); |
| ret2 = stdc_bit_width(uc); |
| if (ret != i || ret2 != i) |
| { |
| return -1; |
| } |
| |
| uc = 1 << i; |
| } |
| |
| nbits = NBITS(us); |
| us = 0; |
| for (i = 0; i <= nbits; i++) |
| { |
| ret = stdc_bit_width_us(us); |
| ret2 = stdc_bit_width(us); |
| if (ret != i || ret2 != i) |
| { |
| return -1; |
| } |
| |
| us = 1 << i; |
| } |
| |
| nbits = NBITS(ui); |
| ui = 0; |
| for (i = 0; i <= nbits; i++) |
| { |
| ret = stdc_bit_width_ui(ui); |
| ret2 = stdc_bit_width(ui); |
| if (ret != i || ret2 != i) |
| { |
| return -1; |
| } |
| |
| ui = 1U << i; |
| } |
| |
| nbits = NBITS(ul); |
| ul = 0; |
| for (i = 0; i <= nbits; i++) |
| { |
| ret = stdc_bit_width_ul(ul); |
| ret2 = stdc_bit_width(ul); |
| if (ret != i || ret2 != i) |
| { |
| return -1; |
| } |
| |
| ul = 1UL << i; |
| } |
| |
| nbits = NBITS(ull); |
| ull = 0; |
| for (i = 0; i <= nbits; i++) |
| { |
| ret = stdc_bit_width_ull(ull); |
| ret2 = stdc_bit_width(ull); |
| if (ret != i || ret2 != i) |
| { |
| return -1; |
| } |
| |
| ull = 1ULL << i; |
| } |
| |
| return 0; |
| } |
| |
| static int bit_floor(void) |
| { |
| int nbits; |
| unsigned long long ret; |
| unsigned long long ret2; |
| unsigned char uc; |
| unsigned short us; |
| unsigned int ui; |
| unsigned long int ul; |
| unsigned long long int ull; |
| |
| uc = 5; |
| ret = stdc_bit_floor_uc(uc); |
| ret2 = stdc_bit_floor(uc); |
| if (ret != 4 || ret2 != 4) |
| { |
| return -1; |
| } |
| |
| nbits = NBITS(uc); |
| uc = (1 << (nbits - 1)) + 1; |
| ret = stdc_bit_floor_uc(uc); |
| ret2 = stdc_bit_floor(uc); |
| if (ret != uc - 1 || ret2 != uc - 1) |
| { |
| return -1; |
| } |
| |
| us = 5; |
| ret = stdc_bit_floor_us(us); |
| ret2 = stdc_bit_floor(us); |
| if (ret != 4 || ret2 != 4) |
| { |
| return -1; |
| } |
| |
| nbits = NBITS(us); |
| us = (1 << (nbits - 1)) + 1; |
| ret = stdc_bit_floor_us(us); |
| ret2 = stdc_bit_floor(us); |
| if (ret != us - 1 || ret2 != us - 1) |
| { |
| return -1; |
| } |
| |
| ui = 5; |
| ret = stdc_bit_floor_ui(ui); |
| ret2 = stdc_bit_floor(ui); |
| if (ret != 4 || ret2 != 4) |
| { |
| return -1; |
| } |
| |
| nbits = NBITS(uc); |
| ui = (1U << (nbits - 1)) + 1; |
| ret = stdc_bit_floor_ui(ui); |
| ret2 = stdc_bit_floor(ui); |
| if (ret != ui - 1 || ret2 != ui - 1) |
| { |
| return -1; |
| } |
| |
| ul = 5; |
| ret = stdc_bit_floor_ul(ul); |
| ret2 = stdc_bit_floor(ul); |
| if (ret != 4 || ret2 != 4) |
| { |
| return -1; |
| } |
| |
| nbits = NBITS(ul); |
| ul = (1UL << (nbits - 1)) + 1; |
| ret = stdc_bit_floor_ul(ul); |
| ret2 = stdc_bit_floor(ul); |
| if (ret != ul - 1 || ret2 != ul - 1) |
| { |
| return -1; |
| } |
| |
| ull = 5; |
| ret = stdc_bit_floor_ull(ull); |
| ret2 = stdc_bit_floor(ull); |
| if (ret != 4 || ret2 != 4) |
| { |
| return -1; |
| } |
| |
| nbits = NBITS(ull); |
| ull = (1ULL << (nbits - 1)) + 1; |
| ret = stdc_bit_floor_ull(ull); |
| ret2 = stdc_bit_floor(ull); |
| if (ret != ull - 1 || ret2 != ull - 1) |
| { |
| return -1; |
| } |
| |
| return 0; |
| } |
| |
| static int bit_ceil(void) |
| { |
| int nbits; |
| unsigned long long ret; |
| unsigned long long ret2; |
| unsigned char uc; |
| unsigned short us; |
| unsigned int ui; |
| unsigned long int ul; |
| unsigned long long int ull; |
| |
| uc = 5; |
| ret = stdc_bit_ceil_uc(uc); |
| ret2 = stdc_bit_ceil(uc); |
| if (ret != 8 || ret2 != 8) |
| { |
| return -1; |
| } |
| |
| nbits = NBITS(uc); |
| uc = (1 << (nbits - 1)) - 1; |
| ret = stdc_bit_ceil_uc(uc); |
| ret2 = stdc_bit_ceil(uc); |
| if (ret != uc + 1 || ret2 != uc + 1) |
| { |
| return -1; |
| } |
| |
| us = 5; |
| ret = stdc_bit_ceil_us(us); |
| ret2 = stdc_bit_ceil(us); |
| if (ret != 8 || ret2 != 8) |
| { |
| return -1; |
| } |
| |
| nbits = NBITS(us); |
| us = (1 << (nbits - 1)) - 1; |
| ret = stdc_bit_ceil_us(us); |
| ret2 = stdc_bit_ceil(us); |
| if (ret != us + 1 || ret2 != us + 1) |
| { |
| return -1; |
| } |
| |
| ui = 5; |
| ret = stdc_bit_ceil_ui(ui); |
| ret2 = stdc_bit_ceil(ui); |
| if (ret != 8 || ret2 != 8) |
| { |
| return -1; |
| } |
| |
| nbits = NBITS(uc); |
| ui = (1U << (nbits - 1)) - 1; |
| ret = stdc_bit_ceil_ui(ui); |
| ret2 = stdc_bit_ceil(ui); |
| if (ret != ui + 1 || ret2 != ui + 1) |
| { |
| return -1; |
| } |
| |
| ul = 5; |
| ret = stdc_bit_ceil_ul(ul); |
| ret2 = stdc_bit_ceil(ul); |
| if (ret != 8 || ret2 != 8) |
| { |
| return -1; |
| } |
| |
| nbits = NBITS(ul); |
| ul = (1UL << (nbits - 1)) - 1; |
| ret = stdc_bit_ceil_ul(ul); |
| ret2 = stdc_bit_ceil(ul); |
| if (ret != ul + 1 || ret2 != ul + 1) |
| { |
| return -1; |
| } |
| |
| ull = 5; |
| ret = stdc_bit_ceil_ull(ull); |
| ret2 = stdc_bit_ceil(ull); |
| if (ret != 8 || ret2 != 8) |
| { |
| return -1; |
| } |
| |
| nbits = NBITS(ull); |
| ull = (1ULL << (nbits - 1)) - 1; |
| ret = stdc_bit_ceil_ull(ull); |
| ret2 = stdc_bit_ceil(ull); |
| if (ret != ull + 1 || ret2 != ull + 1) |
| { |
| return -1; |
| } |
| |
| return 0; |
| } |
| |
| /**************************************************************************** |
| * Public Functions |
| ****************************************************************************/ |
| |
| int main(int argc, FAR char *argv[]) |
| { |
| const FAR struct test_entry_s *item = NULL; |
| int i; |
| int ret; |
| int tests_ok; |
| int tests_err; |
| |
| tests_ok = tests_err = 0; |
| |
| for (i = 0; i < sizeof(g_entry_list) / sizeof(g_entry_list[0]); i++) |
| { |
| item = &g_entry_list[i]; |
| ret = item->entry(); |
| if (ret < 0) |
| { |
| tests_err++; |
| printf("stdbit_tests: %s test failed.\n", item->name); |
| } |
| else |
| { |
| tests_ok++; |
| } |
| } |
| |
| /* Run tests. They should return 0 on success, -1 otherwise. */ |
| |
| printf("stdbit tests: SUCCESSFUL: %d; FAILED: %d\n", tests_ok, |
| tests_err); |
| |
| return 0; |
| } |