github.com/aergoio/aergo@v1.3.1/libtool/src/gmp-6.1.2/tests/mpz/t-export.c (about) 1 /* Test mpz_export. 2 3 Copyright 2002, 2003 Free Software Foundation, Inc. 4 5 This file is part of the GNU MP Library test suite. 6 7 The GNU MP Library test suite is free software; you can redistribute it 8 and/or modify it under the terms of the GNU General Public License as 9 published by the Free Software Foundation; either version 3 of the License, 10 or (at your option) any later version. 11 12 The GNU MP Library test suite is distributed in the hope that it will be 13 useful, but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 15 Public License for more details. 16 17 You should have received a copy of the GNU General Public License along with 18 the GNU MP Library test suite. If not, see https://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 }