1/* Test mpz_fits_*_p */
2
3/*
4Copyright 2001 Free Software Foundation, Inc.
5
6This file is part of the GNU MP Library.
7
8The GNU MP Library is free software; you can redistribute it and/or modify
9it under the terms of the GNU Lesser General Public License as published by
10the Free Software Foundation; either version 3 of the License, or (at your
11option) any later version.
12
13The GNU MP Library is distributed in the hope that it will be useful, but
14WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
16License for more details.
17
18You should have received a copy of the GNU Lesser General Public License
19along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.  */
20
21#include <stdio.h>
22#include <stdlib.h>
23#include "gmp.h"
24#include "gmp-impl.h"
25#include "tests.h"
26
27
28/* Nothing sophisticated here, just exercise mpz_fits_*_p on a small amount
29   of data. */
30
31#define EXPECT_S(fun,name,answer)                                       \
32  got = fun (z);                                                        \
33  if (got != answer)                                                    \
34    {                                                                   \
35      printf ("%s (%s) got %d want %d\n", name, expr, got, answer);     \
36      printf (" z size %d\n", SIZ(z));                                  \
37      printf (" z dec "); mpz_out_str (stdout, 10, z); printf ("\n");   \
38      printf (" z hex "); mpz_out_str (stdout, 16, z); printf ("\n");   \
39      error = 1;                                                        \
40    }
41
42#if HAVE_STRINGIZE
43#define EXPECT(fun,answer)  EXPECT_S(fun,#fun,answer)
44#else
45#define EXPECT(fun,answer)  EXPECT_S(fun,"fun",answer)
46#endif
47
48int
49main (void)
50{
51  mpz_t       z;
52  int         got;
53  const char  *expr;
54  int         error = 0;
55
56  tests_start ();
57  mpz_init (z);
58
59  mpz_set_ui (z, 0L);
60  expr = "0";
61  EXPECT (mpz_fits_ulong_p, 1);
62  EXPECT (mpz_fits_uint_p, 1);
63  EXPECT (mpz_fits_ushort_p, 1);
64  EXPECT (mpz_fits_slong_p, 1);
65  EXPECT (mpz_fits_sint_p, 1);
66  EXPECT (mpz_fits_sshort_p, 1);
67
68  mpz_set_ui (z, 1L);
69  expr = "1";
70  EXPECT (mpz_fits_ulong_p, 1);
71  EXPECT (mpz_fits_uint_p, 1);
72  EXPECT (mpz_fits_ushort_p, 1);
73  EXPECT (mpz_fits_slong_p, 1);
74  EXPECT (mpz_fits_sint_p, 1);
75  EXPECT (mpz_fits_sshort_p, 1);
76
77  mpz_set_si (z, -1L);
78  expr = "-1";
79  EXPECT (mpz_fits_ulong_p, 0);
80  EXPECT (mpz_fits_uint_p, 0);
81  EXPECT (mpz_fits_ushort_p, 0);
82  EXPECT (mpz_fits_slong_p, 1);
83  EXPECT (mpz_fits_sint_p, 1);
84  EXPECT (mpz_fits_sshort_p, 1);
85
86  mpz_set_ui (z, 1L);
87  mpz_mul_2exp (z, z, 5L*GMP_LIMB_BITS);
88  expr = "2^(5*BPML)";
89  EXPECT (mpz_fits_ulong_p, 0);
90  EXPECT (mpz_fits_uint_p, 0);
91  EXPECT (mpz_fits_ushort_p, 0);
92  EXPECT (mpz_fits_slong_p, 0);
93  EXPECT (mpz_fits_sint_p, 0);
94  EXPECT (mpz_fits_sshort_p, 0);
95
96
97  mpz_set_ui (z, (unsigned long) USHRT_MAX);
98  expr = "USHRT_MAX";
99  EXPECT (mpz_fits_ulong_p, 1);
100  EXPECT (mpz_fits_uint_p, 1);
101  EXPECT (mpz_fits_ushort_p, 1);
102
103  mpz_set_ui (z, (unsigned long) USHRT_MAX);
104  mpz_add_ui (z, z, 1L);
105  expr = "USHRT_MAX + 1";
106  EXPECT (mpz_fits_ushort_p, 0);
107
108
109  mpz_set_ui (z, (unsigned long) UINT_MAX);
110  expr = "UINT_MAX";
111  EXPECT (mpz_fits_ulong_p, 1);
112  EXPECT (mpz_fits_uint_p, 1);
113
114  mpz_set_ui (z, (unsigned long) UINT_MAX);
115  mpz_add_ui (z, z, 1L);
116  expr = "UINT_MAX + 1";
117  EXPECT (mpz_fits_uint_p, 0);
118
119
120  mpz_set_ui (z, ULONG_MAX);
121  expr = "ULONG_MAX";
122  EXPECT (mpz_fits_ulong_p, 1);
123
124  mpz_set_ui (z, ULONG_MAX);
125  mpz_add_ui (z, z, 1L);
126  expr = "ULONG_MAX + 1";
127  EXPECT (mpz_fits_ulong_p, 0);
128
129
130  mpz_set_si (z, (long) SHRT_MAX);
131  expr = "SHRT_MAX";
132  EXPECT (mpz_fits_slong_p, 1);
133  EXPECT (mpz_fits_sint_p, 1);
134  EXPECT (mpz_fits_sshort_p, 1);
135
136  mpz_set_si (z, (long) SHRT_MAX);
137  mpz_add_ui (z, z, 1L);
138  expr = "SHRT_MAX + 1";
139  EXPECT (mpz_fits_sshort_p, 0);
140
141
142  mpz_set_si (z, (long) INT_MAX);
143  expr = "INT_MAX";
144  EXPECT (mpz_fits_slong_p, 1);
145  EXPECT (mpz_fits_sint_p, 1);
146
147  mpz_set_si (z, (long) INT_MAX);
148  mpz_add_ui (z, z, 1L);
149  expr = "INT_MAX + 1";
150  EXPECT (mpz_fits_sint_p, 0);
151
152
153  mpz_set_si (z, LONG_MAX);
154  expr = "LONG_MAX";
155  EXPECT (mpz_fits_slong_p, 1);
156
157  mpz_set_si (z, LONG_MAX);
158  mpz_add_ui (z, z, 1L);
159  expr = "LONG_MAX + 1";
160  EXPECT (mpz_fits_slong_p, 0);
161
162
163  mpz_set_si (z, (long) SHRT_MIN);
164  expr = "SHRT_MIN";
165  EXPECT (mpz_fits_slong_p, 1);
166  EXPECT (mpz_fits_sint_p, 1);
167  EXPECT (mpz_fits_sshort_p, 1);
168
169  mpz_set_si (z, (long) SHRT_MIN);
170  mpz_sub_ui (z, z, 1L);
171  expr = "SHRT_MIN + 1";
172  EXPECT (mpz_fits_sshort_p, 0);
173
174
175  mpz_set_si (z, (long) INT_MIN);
176  expr = "INT_MIN";
177  EXPECT (mpz_fits_slong_p, 1);
178  EXPECT (mpz_fits_sint_p, 1);
179
180  mpz_set_si (z, (long) INT_MIN);
181  mpz_sub_ui (z, z, 1L);
182  expr = "INT_MIN + 1";
183  EXPECT (mpz_fits_sint_p, 0);
184
185
186  mpz_set_si (z, LONG_MIN);
187  expr = "LONG_MIN";
188  EXPECT (mpz_fits_slong_p, 1);
189
190  mpz_set_si (z, LONG_MIN);
191  mpz_sub_ui (z, z, 1L);
192  expr = "LONG_MIN + 1";
193  EXPECT (mpz_fits_slong_p, 0);
194
195
196  if (error)
197    abort ();
198
199  mpz_clear (z);
200  tests_end ();
201  exit (0);
202}
203