1/* Test mpz_set_si and mpz_init_set_si. 2 3Copyright 2000, 2001, 2002 Free Software Foundation, Inc. 4 5This file is part of the GNU MP Library. 6 7The GNU MP Library is free software; you can redistribute it and/or modify 8it under the terms of the GNU Lesser General Public License as published by 9the Free Software Foundation; either version 3 of the License, or (at your 10option) any later version. 11 12The GNU MP Library is distributed in the hope that it will be useful, but 13WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 14or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 15License for more details. 16 17You should have received a copy of the GNU Lesser General Public License 18along with the GNU MP Library. If not, see http://www.gnu.org/licenses/. */ 19 20#include <stdio.h> 21#include <stdlib.h> 22#include "gmp.h" 23#include "gmp-impl.h" 24#include "tests.h" 25 26 27void 28check_data (void) 29{ 30#if GMP_NUMB_BITS <= BITS_PER_ULONG 31#define ENTRY(n) { n, { n, 0 } } 32#else 33#define ENTRY(n) { n, { (n) & GMP_NUMB_MASK, (n) >> GMP_NUMB_BITS } } 34#endif 35 36 static const struct { 37 long n; 38 mp_size_t want_size; 39 mp_limb_t want_data[2]; 40 } data[] = { 41 42 { 0L, 0 }, 43 { 1L, 1, { 1 } }, 44 { -1L, -1, { 1 } }, 45 46#if GMP_NUMB_BITS >= BITS_PER_ULONG 47 { LONG_MAX, 1, { LONG_MAX, 0 } }, 48 { -LONG_MAX, -1, { LONG_MAX, 0 } }, 49 { LONG_HIGHBIT, -1, { ULONG_HIGHBIT, 0 } }, 50#else 51 { LONG_MAX, 2, { LONG_MAX & GMP_NUMB_MASK, LONG_MAX >> GMP_NUMB_BITS } }, 52 { -LONG_MAX, -2, { LONG_MAX & GMP_NUMB_MASK, LONG_MAX >> GMP_NUMB_BITS }}, 53 { LONG_HIGHBIT, -2, { 0, ULONG_HIGHBIT >> GMP_NUMB_BITS } }, 54#endif 55 }; 56 57 mpz_t n; 58 int i; 59 60 for (i = 0; i < numberof (data); i++) 61 { 62 mpz_init (n); 63 mpz_set_si (n, data[i].n); 64 MPZ_CHECK_FORMAT (n); 65 if (n->_mp_size != data[i].want_size 66 || refmpn_cmp_allowzero (n->_mp_d, data[i].want_data, 67 ABS (data[i].want_size)) != 0) 68 { 69 printf ("mpz_set_si wrong on data[%d]\n", i); 70 abort(); 71 } 72 mpz_clear (n); 73 74 mpz_init_set_si (n, data[i].n); 75 MPZ_CHECK_FORMAT (n); 76 if (n->_mp_size != data[i].want_size 77 || refmpn_cmp_allowzero (n->_mp_d, data[i].want_data, 78 ABS (data[i].want_size)) != 0) 79 { 80 printf ("mpz_init_set_si wrong on data[%d]\n", i); 81 abort(); 82 } 83 mpz_clear (n); 84 } 85} 86 87 88int 89main (void) 90{ 91 tests_start (); 92 93 check_data (); 94 95 tests_end (); 96 exit (0); 97} 98