Tizen 2.1 base
[external/gmp.git] / tests / mpz / t-export.c
1 /* Test mpz_export.
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  *src;
33     size_t      want_count;
34     int         order;
35     size_t      size;
36     int         endian;
37     int         nail;
38     char        want_data[64];
39
40   } data[] = {
41
42     { "0", 0,1, 1,1, 0 },
43     { "0", 0,1, 2,1, 0 },
44     { "0", 0,1, 3,1, 0 },
45
46     { "0x12345678", 4,1,  1,1, 0, { '\022', '\064', '\126', '\170' } },
47     { "0x12345678", 1,1,  4,1, 0, { '\022', '\064', '\126', '\170' } },
48     { "0x12345678", 1,-1, 4,1, 0, { '\022', '\064', '\126', '\170' } },
49
50     { "0x12345678", 4,-1, 1,-1, 0, { '\170', '\126', '\064', '\022' } },
51     { "0x12345678", 1,1,  4,-1, 0, { '\170', '\126', '\064', '\022' } },
52     { "0x12345678", 1,-1, 4,-1, 0, { '\170', '\126', '\064', '\022' } },
53
54     { "0x15", 5,1,  1,1, 7, { '\001', '\000', '\001', '\000', '\001' } },
55
56     { "0x1FFFFFFFFFFF", 3,1,  2,1,   1, {
57         '\177','\377', '\177','\377', '\177','\377' } },
58     { "0x1FFFFFFFFFFF", 3,1,  2,-1,  1, {
59         '\377','\177', '\377','\177', '\377','\177' } },
60     { "0x7",            3,1,  2,1,  15, {
61         '\000','\001', '\000','\001', '\000','\001' } },
62     { "0x7",            3,1,  2,-1, 15, {
63         '\001','\000', '\001','\000', '\001','\000' } },
64
65     { "0x24", 3,1,  2,1,  14, { '\000','\002', '\000','\001', '\000','\000' }},
66     { "0x24", 3,1,  2,-1, 14, { '\002','\000', '\001','\000', '\000','\000' }},
67     { "0x24", 3,-1, 2,-1, 14, { '\000','\000', '\001','\000', '\002','\000' }},
68     { "0x24", 3,-1, 2,1,  14, { '\000','\000', '\000','\001', '\000','\002' }},
69
70     { "0x123456789ABC", 3,1,  2,1,  0, {
71         '\022','\064', '\126','\170', '\232','\274' } },
72     { "0x123456789ABC", 3,-1, 2,1,  0, {
73         '\232','\274', '\126','\170', '\022','\064' } },
74     { "0x123456789ABC", 3,1,  2,-1, 0, {
75         '\064','\022', '\170','\126', '\274','\232' } },
76     { "0x123456789ABC", 3,-1, 2,-1, 0, {
77         '\274','\232', '\170','\126', '\064','\022' } },
78
79     { "0x112233445566778899AABBCC", 3,1,  4,1,  0,
80       { '\021','\042','\063','\104',
81         '\125','\146','\167','\210',
82         '\231','\252','\273','\314' } },
83     { "0x112233445566778899AABBCC", 3,-1, 4,1,  0,
84       { '\231','\252','\273','\314',
85         '\125','\146','\167','\210',
86         '\021','\042','\063','\104' } },
87     { "0x112233445566778899AABBCC", 3,1,  4,-1, 0,
88       { '\104','\063','\042','\021',
89         '\210','\167','\146','\125',
90         '\314','\273','\252','\231' } },
91     { "0x112233445566778899AABBCC", 3,-1, 4,-1, 0,
92       { '\314','\273','\252','\231',
93         '\210','\167','\146','\125',
94         '\104','\063','\042','\021' } },
95
96     { "0x100120023003400450056006700780089009A00AB00BC00C", 3,1,  8,1,  0,
97       { '\020','\001','\040','\002','\060','\003','\100','\004',
98         '\120','\005','\140','\006','\160','\007','\200','\010',
99         '\220','\011','\240','\012','\260','\013','\300','\014' } },
100     { "0x100120023003400450056006700780089009A00AB00BC00C", 3,-1, 8,1,  0,
101       { '\220','\011','\240','\012','\260','\013','\300','\014',
102         '\120','\005','\140','\006','\160','\007','\200','\010',
103         '\020','\001','\040','\002','\060','\003','\100','\004' } },
104     { "0x100120023003400450056006700780089009A00AB00BC00C", 3,1,  8,-1, 0,
105       { '\004','\100','\003','\060','\002','\040','\001','\020',
106         '\010','\200','\007','\160','\006','\140','\005','\120',
107         '\014','\300','\013','\260','\012','\240','\011','\220' } },
108     { "0x100120023003400450056006700780089009A00AB00BC00C", 3,-1, 8,-1, 0,
109       { '\014','\300','\013','\260','\012','\240','\011','\220',
110         '\010','\200','\007','\160','\006','\140','\005','\120',
111         '\004','\100','\003','\060','\002','\040','\001','\020' } },
112
113     { "0x155555555555555555555555", 3,1,  4,1,  1,
114       { '\125','\125','\125','\125',
115         '\052','\252','\252','\252',
116         '\125','\125','\125','\125' } },
117     { "0x155555555555555555555555", 3,-1,  4,1,  1,
118       { '\125','\125','\125','\125',
119         '\052','\252','\252','\252',
120         '\125','\125','\125','\125' } },
121     { "0x155555555555555555555555", 3,1,  4,-1,  1,
122       { '\125','\125','\125','\125',
123         '\252','\252','\252','\052',
124         '\125','\125','\125','\125' } },
125     { "0x155555555555555555555555", 3,-1,  4,-1,  1,
126       { '\125','\125','\125','\125',
127         '\252','\252','\252','\052',
128         '\125','\125','\125','\125' } },
129   };
130
131   char    buf[sizeof(data[0].src) + sizeof (mp_limb_t) + 128];
132   char    *got_data;
133   void    *ret;
134   size_t  align, got_count, j;
135   int     i, error = 0;
136   mpz_t   src;
137
138   mpz_init (src);
139
140   for (i = 0; i < numberof (data); i++)
141     {
142       for (align = 0; align < sizeof (mp_limb_t); align++)
143         {
144           mpz_set_str_or_abort (src, data[i].src, 0);
145           MPZ_CHECK_FORMAT (src);
146           got_data = buf + align;
147
148           ASSERT_ALWAYS (data[i].want_count * data[i].size + align
149                          <= sizeof (buf));
150
151           memset (got_data, '\0', data[i].want_count * data[i].size);
152           ret = mpz_export (got_data, &got_count, data[i].order,
153                             data[i].size, data[i].endian, data[i].nail, src);
154
155           if (ret != got_data)
156             {
157               printf ("return doesn't equal given pointer\n");
158               error = 1;
159             }
160           if (got_count != data[i].want_count)
161             {
162               printf ("wrong count\n");
163               error = 1;
164             }
165           if (memcmp (got_data, data[i].want_data, got_count * data[i].size) != 0)
166             {
167               printf ("wrong result data\n");
168               error = 1;
169             }
170           if (error)
171             {
172               printf ("    at data[%d]  align=%d\n", i, (int) align);
173               printf ("    src \"%s\"\n", data[i].src);
174               mpz_trace ("    src", src);
175               printf ("    order=%d  size=%lu endian=%d nail=%u\n",
176                       data[i].order,
177                       (unsigned long) data[i].size, data[i].endian, data[i].nail);
178               printf ("    want count %lu\n", (unsigned long) data[i].want_count);
179               printf ("    got count  %lu\n", (unsigned long) got_count);
180               printf ("    want");
181               for (j = 0; j < data[i].want_count*data[i].size; j++)
182                 printf (" 0x%02X,", (unsigned) (unsigned char) data[i].want_data[j]);
183               printf ("\n");
184               printf ("    got ");
185               for (j = 0; j < got_count*data[i].size; j++)
186                 printf (" 0x%02X,", (unsigned) (unsigned char) got_data[j]);
187               printf ("\n");
188               abort ();
189             }
190         }
191     }
192   mpz_clear (src);
193 }
194
195
196 int
197 main (void)
198 {
199   tests_start ();
200
201   mp_trace_base = -16;
202   check_data ();
203
204   tests_end ();
205   exit (0);
206 }