xref: /netbsd-src/external/lgpl3/gmp/dist/tests/mpz/t-import.c (revision 51c5f9b7c2b2cc93506078d2cab158634a65201f)
1 /* Test mpz_import.
2 
3 Copyright 2002, 2003 Free Software Foundation, Inc.
4 
5 This file is part of the GNU MP Library.
6 
7 The GNU MP Library is free software; you can redistribute it and/or modify
8 it under the terms of the GNU Lesser General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or (at your
10 option) any later version.
11 
12 The GNU MP Library is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14 or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
15 License for more details.
16 
17 You should have received a copy of the GNU Lesser General Public License
18 along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.  */
19 
20 #include <stdio.h>
21 #include <stdlib.h>
22 #include <string.h>
23 #include "gmp.h"
24 #include "gmp-impl.h"
25 #include "tests.h"
26 
27 
28 void
29 check_data (void)
30 {
31   static const struct {
32     const char  *want;
33     size_t      count;
34     int         order;
35     size_t      size;
36     int         endian;
37     int         nail;
38     char        src[64];
39 
40   } data[] = {
41 
42     { "0", 0,1, 1,1, 0 },
43     { "0", 1,1, 0,1, 0 },
44 
45     { "0x12345678", 4,1,  1,1, 0, { '\22', '\64', '\126', '\170' } },
46     { "0x12345678", 1,1,  4,1, 0, { '\22', '\64', '\126', '\170' } },
47     { "0x12345678", 1,-1, 4,1, 0, { '\22', '\64', '\126', '\170' } },
48 
49     { "0x12345678", 4,-1, 1,-1, 0, { '\170', '\126', '\064', '\22' } },
50     { "0x12345678", 1,1,  4,-1, 0, { '\170', '\126', '\064', '\22' } },
51     { "0x12345678", 1,-1, 4,-1, 0, { '\170', '\126', '\064', '\22' } },
52 
53     { "0",    5,1,  1,1, 7, { '\376', '\376', '\376', '\376', '\376' } },
54     { "0",    5,-1, 1,1, 7, { '\376', '\376', '\376', '\376', '\376' } },
55     { "0x15", 5,1,  1,1, 7, { '\377', '\376', '\377', '\376', '\377' } },
56 
57     { "0",    3,1,  2,1,   1, { '\200','\000', '\200','\000', '\200','\000' }},
58     { "0",    3,1,  2,-1,  1, { '\000','\200', '\000','\200', '\000','\200' }},
59     { "0",    3,1,  2,1,  15, { '\377','\376', '\377','\376', '\377','\376' }},
60 
61     { "0x2A", 3,1,  2,1, 14, { '\377','\376', '\377','\376', '\377','\376' } },
62     { "0x06", 3,1,  2,1, 14, { '\377','\374', '\377','\375', '\377','\376' } },
63     { "0x24", 3,-1, 2,1, 14, { '\377','\374', '\377','\375', '\377','\376' } },
64 
65     { "0x123456789ABC", 3,1,  2,1,  0, {
66         '\022','\064', '\126','\170', '\232','\274' } },
67     { "0x123456789ABC", 3,-1, 2,1,  0, {
68         '\232','\274', '\126','\170', '\022','\064' } },
69     { "0x123456789ABC", 3,1,  2,-1, 0, {
70         '\064','\022', '\170','\126', '\274','\232' } },
71     { "0x123456789ABC", 3,-1, 2,-1, 0, {
72         '\274','\232', '\170','\126', '\064','\022' } },
73 
74     { "0x112233445566778899AABBCC", 3,1,  4,1,  0,
75       { '\021','\042','\063','\104',
76         '\125','\146','\167','\210',
77         '\231','\252','\273','\314' } },
78     { "0x112233445566778899AABBCC", 3,-1, 4,1,  0,
79       { '\231','\252','\273','\314',
80         '\125','\146','\167','\210',
81         '\021','\042','\063','\104' } },
82     { "0x112233445566778899AABBCC", 3,1,  4,-1, 0,
83       { '\104','\063','\042','\021',
84         '\210','\167','\146','\125',
85         '\314','\273','\252','\231' } },
86     { "0x112233445566778899AABBCC", 3,-1, 4,-1, 0,
87       { '\314','\273','\252','\231',
88         '\210','\167','\146','\125',
89         '\104','\063','\042','\021' } },
90 
91     { "0x100120023003400450056006700780089009A00AB00BC00C", 3,1,  8,1,  0,
92       { '\020','\001','\040','\002','\060','\003','\100','\004',
93         '\120','\005','\140','\006','\160','\007','\200','\010',
94         '\220','\011','\240','\012','\260','\013','\300','\014' } },
95     { "0x100120023003400450056006700780089009A00AB00BC00C", 3,-1, 8,1,  0,
96       { '\220','\011','\240','\012','\260','\013','\300','\014',
97         '\120','\005','\140','\006','\160','\007','\200','\010',
98         '\020','\001','\040','\002','\060','\003','\100','\004' } },
99     { "0x100120023003400450056006700780089009A00AB00BC00C", 3,1,  8,-1, 0,
100       { '\004','\100','\003','\060','\002','\040','\001','\020',
101         '\010','\200','\007','\160','\006','\140','\005','\120',
102         '\014','\300','\013','\260','\012','\240','\011','\220' } },
103     { "0x100120023003400450056006700780089009A00AB00BC00C", 3,-1, 8,-1, 0,
104       { '\014','\300','\013','\260','\012','\240','\011','\220',
105         '\010','\200','\007','\160','\006','\140','\005','\120',
106         '\004','\100','\003','\060','\002','\040','\001','\020' } },
107 
108     { "0x155555555555555555555555", 3,1,  4,1,  1,
109       { '\325','\125','\125','\125',
110         '\252','\252','\252','\252',
111         '\325','\125','\125','\125' } },
112     { "0x155555555555555555555555", 3,-1,  4,1,  1,
113       { '\325','\125','\125','\125',
114         '\252','\252','\252','\252',
115         '\325','\125','\125','\125' } },
116     { "0x155555555555555555555555", 3,1,  4,-1,  1,
117       { '\125','\125','\125','\325',
118         '\252','\252','\252','\252',
119         '\125','\125','\125','\325' } },
120     { "0x155555555555555555555555", 3,-1,  4,-1,  1,
121       { '\125','\125','\125','\325',
122         '\252','\252','\252','\252',
123         '\125','\125','\125','\325' } },
124   };
125 
126   char    buf[sizeof(data[0].src) + sizeof (mp_limb_t)];
127   char    *src;
128   size_t  align;
129   int     i;
130   mpz_t   got, want;
131 
132   mpz_init (got);
133   mpz_init (want);
134 
135   for (i = 0; i < numberof (data); i++)
136     {
137       for (align = 0; align < sizeof (mp_limb_t); align++)
138         {
139           mpz_set_str_or_abort (want, data[i].want, 0);
140           src = buf + align;
141           memcpy (src, data[i].src, data[i].count * data[i].size);
142 
143           mpz_set_ui (got, 0L);
144           mpz_import (got, data[i].count, data[i].order,
145                       data[i].size, data[i].endian, data[i].nail, src);
146 
147           MPZ_CHECK_FORMAT (got);
148           if (mpz_cmp (got, want) != 0)
149             {
150               printf ("wrong at data[%d]\n", i);
151               printf ("    count=%lu order=%d  size=%lu endian=%d nail=%u  align=%lu\n",
152                       (unsigned long) data[i].count, data[i].order,
153                       (unsigned long) data[i].size, data[i].endian, data[i].nail,
154                       (unsigned long) align);
155               mpz_trace ("    got ", got);
156               mpz_trace ("    want", want);
157               abort ();
158             }
159         }
160     }
161   mpz_clear (got);
162   mpz_clear (want);
163 }
164 
165 
166 int
167 main (void)
168 {
169   tests_start ();
170 
171   mp_trace_base = -16;
172   check_data ();
173 
174   tests_end ();
175   exit (0);
176 }
177