Upload Tizen:Base source
[external/gmp.git] / tests / mpz / t-import.c
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 }