t-export.c
上传用户:qaz666999
上传日期:2022-08-06
资源大小:2570k
文件大小:7k
源码类别:

数学计算

开发平台:

Unix_Linux

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