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

数学计算

开发平台:

Unix_Linux

  1. /* Test mpz_import.
  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  *want;
  25.     size_t      count;
  26.     int         order;
  27.     size_t      size;
  28.     int         endian;
  29.     int         nail;
  30.     char        src[64];
  31.   } data[] = {
  32.     { "0", 0,1, 1,1, 0 },
  33.     { "0", 1,1, 0,1, 0 },
  34.     { "0x12345678", 4,1,  1,1, 0, { '22', '64', '126', '170' } },
  35.     { "0x12345678", 1,1,  4,1, 0, { '22', '64', '126', '170' } },
  36.     { "0x12345678", 1,-1, 4,1, 0, { '22', '64', '126', '170' } },
  37.     { "0x12345678", 4,-1, 1,-1, 0, { '170', '126', '64', '22' } },
  38.     { "0x12345678", 1,1,  4,-1, 0, { '170', '126', '64', '22' } },
  39.     { "0x12345678", 1,-1, 4,-1, 0, { '170', '126', '64', '22' } },
  40.     { "0",    5,1,  1,1, 7, { '376', '376', '376', '376', '376' } },
  41.     { "0",    5,-1, 1,1, 7, { '376', '376', '376', '376', '376' } },
  42.     { "0x15", 5,1,  1,1, 7, { '377', '376', '377', '376', '377' } },
  43.     { "0",    3,1,  2,1,   1, { '200','00', '200','00', '200','00' }},
  44.     { "0",    3,1,  2,-1,  1, { '00','200', '00','200', '00','200' }},
  45.     { "0",    3,1,  2,1,  15, { '377','376', '377','376', '377','376' }},
  46.     { "0x2A", 3,1,  2,1, 14, { '377','376', '377','376', '377','376' } },
  47.     { "0x06", 3,1,  2,1, 14, { '377','374', '377','375', '377','376' } },
  48.     { "0x24", 3,-1, 2,1, 14, { '377','374', '377','375', '377','376' } },
  49.     { "0x123456789ABC", 3,1,  2,1,  0, {
  50.         '22','64', '126','170', '232','274' } },
  51.     { "0x123456789ABC", 3,-1, 2,1,  0, {
  52.         '232','274', '126','170', '22','64' } },
  53.     { "0x123456789ABC", 3,1,  2,-1, 0, {
  54.         '64','22', '170','126', '274','232' } },
  55.     { "0x123456789ABC", 3,-1, 2,-1, 0, {
  56.         '274','232', '170','126', '64','22' } },
  57.     { "0x112233445566778899AABBCC", 3,1,  4,1,  0,
  58.       { '21','42','63','104',
  59.         '125','146','167','210',
  60.         '231','252','273','314' } },
  61.     { "0x112233445566778899AABBCC", 3,-1, 4,1,  0,
  62.       { '231','252','273','314',
  63.         '125','146','167','210',
  64.         '21','42','63','104' } },
  65.     { "0x112233445566778899AABBCC", 3,1,  4,-1, 0,
  66.       { '104','63','42','21',
  67.         '210','167','146','125',
  68.         '314','273','252','231' } },
  69.     { "0x112233445566778899AABBCC", 3,-1, 4,-1, 0,
  70.       { '314','273','252','231',
  71.         '210','167','146','125',
  72.         '104','63','42','21' } },
  73.     { "0x100120023003400450056006700780089009A00AB00BC00C", 3,1,  8,1,  0,
  74.       { '20','01','40','02','60','03','100','04',
  75.         '120','05','140','06','160','07','200','10',
  76.         '220','11','240','12','260','13','300','14' } },
  77.     { "0x100120023003400450056006700780089009A00AB00BC00C", 3,-1, 8,1,  0,
  78.       { '220','11','240','12','260','13','300','14',
  79.         '120','05','140','06','160','07','200','10',
  80.         '20','01','40','02','60','03','100','04' } },
  81.     { "0x100120023003400450056006700780089009A00AB00BC00C", 3,1,  8,-1, 0,
  82.       { '04','100','03','60','02','40','01','20',
  83.         '10','200','07','160','06','140','05','120',
  84.         '14','300','13','260','12','240','11','220' } },
  85.     { "0x100120023003400450056006700780089009A00AB00BC00C", 3,-1, 8,-1, 0,
  86.       { '14','300','13','260','12','240','11','220',
  87.         '10','200','07','160','06','140','05','120',
  88.         '04','100','03','60','02','40','01','20' } },
  89.     { "0x155555555555555555555555", 3,1,  4,1,  1,
  90.       { '325','125','125','125',
  91.         '252','252','252','252',
  92.         '325','125','125','125' } },
  93.     { "0x155555555555555555555555", 3,-1,  4,1,  1,
  94.       { '325','125','125','125',
  95.         '252','252','252','252',
  96.         '325','125','125','125' } },
  97.     { "0x155555555555555555555555", 3,1,  4,-1,  1,
  98.       { '125','125','125','325',
  99.         '252','252','252','252',
  100.         '125','125','125','325' } },
  101.     { "0x155555555555555555555555", 3,-1,  4,-1,  1,
  102.       { '125','125','125','325',
  103.         '252','252','252','252',
  104.         '125','125','125','325' } },
  105.   };
  106.   char    buf[sizeof(data[0].src) + sizeof (mp_limb_t)];
  107.   char    *src;
  108.   size_t  align;
  109.   int     i;
  110.   mpz_t   got, want;
  111.   mpz_init (got);
  112.   mpz_init (want);
  113.   for (i = 0; i < numberof (data); i++)
  114.     {
  115.       for (align = 0; align < sizeof (mp_limb_t); align++)
  116.         {
  117.           mpz_set_str_or_abort (want, data[i].want, 0);
  118.           src = buf + align;
  119.           memcpy (src, data[i].src, data[i].count * data[i].size);
  120.           mpz_set_ui (got, 0L);
  121.           mpz_import (got, data[i].count, data[i].order,
  122.                       data[i].size, data[i].endian, data[i].nail, src);
  123.           MPZ_CHECK_FORMAT (got);
  124.           if (mpz_cmp (got, want) != 0)
  125.             {
  126.               printf ("wrong at data[%d]n", i);
  127.               printf ("    count=%lu order=%d  size=%lu endian=%d nail=%u  align=%lun",
  128.                       (unsigned long) data[i].count, data[i].order,
  129.                       (unsigned long) data[i].size, data[i].endian, data[i].nail,
  130.                       (unsigned long) align);
  131.               mpz_trace ("    got ", got);
  132.               mpz_trace ("    want", want);
  133.               abort ();
  134.             }
  135.         }
  136.     }
  137.   mpz_clear (got);
  138.   mpz_clear (want);
  139. }
  140. int
  141. main (void)
  142. {
  143.   tests_start ();
  144.   mp_trace_base = -16;
  145.   check_data ();
  146.   tests_end ();
  147.   exit (0);
  148. }