[BACK]Return to t-io_raw.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / gmp / tests / mpz

Annotation of OpenXM_contrib/gmp/tests/mpz/t-io_raw.c, Revision 1.1

1.1     ! ohara       1: /* Test mpz_inp_raw and mpz_out_raw.
        !             2:
        !             3: Copyright 2001 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 2.1 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; see the file COPYING.LIB.  If not, write to
        !            19: the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
        !            20: MA 02111-1307, USA. */
        !            21:
        !            22: #include "config.h"
        !            23:
        !            24: #include <stdio.h>
        !            25: #include <stdlib.h>
        !            26: #include <string.h>
        !            27: #if HAVE_UNISTD_H
        !            28: #include <unistd.h>
        !            29: #endif
        !            30:
        !            31: #include "gmp.h"
        !            32: #include "gmp-impl.h"
        !            33: #include "tests.h"
        !            34:
        !            35: #define FILENAME  "t-io_raw.tmp"
        !            36:
        !            37:
        !            38: /* In the fopen, "b" selects binary mode on DOS systems, meaning no
        !            39:    conversion of '\n' to and from CRLF.  It's believed systems without such
        !            40:    nonsense will simply ignore the "b", but in case that's not so a plain
        !            41:    "w+" is attempted if "w+b" fails.  */
        !            42:
        !            43: FILE *
        !            44: fopen_wplusb_or_die (const char *filename)
        !            45: {
        !            46:   FILE  *fp;
        !            47:   fp = fopen (filename, "w+b");
        !            48:   if (fp == NULL)
        !            49:     fp = fopen (filename, "w+");
        !            50:
        !            51:   if (fp == NULL)
        !            52:     {
        !            53:       printf ("Cannot create file %s\n", filename);
        !            54:       abort ();
        !            55:     }
        !            56:   return fp;
        !            57: }
        !            58:
        !            59: /* use 0x80 to check nothing bad happens with sign extension etc */
        !            60: #define BYTEVAL(i)  (((i) + 1) | 0x80)
        !            61:
        !            62: void
        !            63: check_in (void)
        !            64: {
        !            65:   int        i, j, zeros, neg, error = 0;
        !            66:   mpz_t      want, got;
        !            67:   size_t     want_ret, got_ret;
        !            68:   mp_size_t  size;
        !            69:   FILE       *fp;
        !            70:
        !            71:   mpz_init (want);
        !            72:   mpz_init (got);
        !            73:
        !            74:   for (i = 0; i < 32; i++)
        !            75:     {
        !            76:       for (zeros = 0; zeros < 8; zeros++)
        !            77:         {
        !            78:           for (neg = 0; neg <= 1; neg++)
        !            79:             {
        !            80:               want_ret = i + zeros + 4;
        !            81:
        !            82:               /* need this to get the twos complement right */
        !            83:               ASSERT_ALWAYS (sizeof (size) >= 4);
        !            84:
        !            85:               size = i + zeros;
        !            86:               if (neg)
        !            87:                 size = -size;
        !            88:
        !            89:               fp = fopen_wplusb_or_die (FILENAME);
        !            90:               for (j = 3; j >= 0; j--)
        !            91:                 ASSERT_ALWAYS (putc ((size >> (j*8)) & 0xFF, fp) != EOF);
        !            92:               for (j = 0; j < zeros; j++)
        !            93:                 ASSERT_ALWAYS (putc ('\0', fp) != EOF);
        !            94:               for (j = 0; j < i; j++)
        !            95:                 ASSERT_ALWAYS (putc (BYTEVAL (j), fp) != EOF);
        !            96:               /* and some trailing garbage */
        !            97:               ASSERT_ALWAYS (putc ('x', fp) != EOF);
        !            98:               ASSERT_ALWAYS (putc ('y', fp) != EOF);
        !            99:               ASSERT_ALWAYS (putc ('z', fp) != EOF);
        !           100:               ASSERT_ALWAYS (fflush (fp) == 0);
        !           101:               rewind (fp);
        !           102:
        !           103:               got_ret = mpz_inp_raw (got, fp);
        !           104:               ASSERT_ALWAYS (! ferror(fp));
        !           105:               ASSERT_ALWAYS (fclose (fp) == 0);
        !           106:
        !           107:               MPZ_CHECK_FORMAT (got);
        !           108:
        !           109:               if (got_ret != want_ret)
        !           110:                 {
        !           111:                   printf ("check_in: return value wrong\n");
        !           112:                   error = 1;
        !           113:                 }
        !           114:               if (mpz_cmp (got, want) != 0)
        !           115:                 {
        !           116:                   printf ("check_in: result wrong\n");
        !           117:                   error = 1;
        !           118:                 }
        !           119:               if (error)
        !           120:                 {
        !           121:                   printf    ("  i=%d zeros=%d neg=%d\n", i, zeros, neg);
        !           122:                   printf    ("  got_ret  %u\n", got_ret);
        !           123:                   printf    ("  want_ret %u\n", want_ret);
        !           124:                   mpz_trace ("  got      ", got);
        !           125:                   mpz_trace ("  want     ", want);
        !           126:                   abort ();
        !           127:                 }
        !           128:
        !           129:               mpz_neg (want, want);
        !           130:             }
        !           131:         }
        !           132:       mpz_mul_2exp (want, want, 8);
        !           133:       mpz_add_ui (want, want, (unsigned long) BYTEVAL (i));
        !           134:     }
        !           135:
        !           136:   mpz_clear (want);
        !           137:   mpz_clear (got);
        !           138: }
        !           139:
        !           140:
        !           141: void
        !           142: check_out (void)
        !           143: {
        !           144:   int        i, j, neg, error = 0;
        !           145:   mpz_t      z;
        !           146:   char       want[256], got[256], *p;
        !           147:   size_t     want_len, got_ret, got_read;
        !           148:   mp_size_t  size;
        !           149:   FILE       *fp;
        !           150:
        !           151:   mpz_init (z);
        !           152:
        !           153:   for (i = 0; i < 32; i++)
        !           154:     {
        !           155:       for (neg = 0; neg <= 1; neg++)
        !           156:         {
        !           157:           want_len = i + 4;
        !           158:
        !           159:           /* need this to get the twos complement right */
        !           160:           ASSERT_ALWAYS (sizeof (size) >= 4);
        !           161:
        !           162:           size = i;
        !           163:           if (neg)
        !           164:             size = -size;
        !           165:
        !           166:           p = want;
        !           167:           for (j = 3; j >= 0; j--)
        !           168:             *p++ = size >> (j*8);
        !           169:           for (j = 0; j < i; j++)
        !           170:             *p++ = BYTEVAL (j);
        !           171:           ASSERT_ALWAYS (p <= want + sizeof (want));
        !           172:
        !           173:           fp = fopen_wplusb_or_die (FILENAME);
        !           174:           got_ret = mpz_out_raw (fp, z);
        !           175:           ASSERT_ALWAYS (fflush (fp) == 0);
        !           176:           rewind (fp);
        !           177:           got_read = fread (got, 1, sizeof(got), fp);
        !           178:           ASSERT_ALWAYS (! ferror(fp));
        !           179:           ASSERT_ALWAYS (fclose (fp) == 0);
        !           180:
        !           181:           if (got_ret != want_len)
        !           182:             {
        !           183:               printf ("check_out: wrong return value\n");
        !           184:               error = 1;
        !           185:             }
        !           186:           if (got_read != want_len)
        !           187:             {
        !           188:               printf ("check_out: wrong number of bytes read back\n");
        !           189:               error = 1;
        !           190:             }
        !           191:           if (memcmp (want, got, want_len) != 0)
        !           192:             {
        !           193:               printf ("check_out: wrong data\n");
        !           194:               error = 1;
        !           195:             }
        !           196:           if (error)
        !           197:             {
        !           198:               printf    ("  i=%d neg=%d\n", i, neg);
        !           199:               mpz_trace ("  z", z);
        !           200:               printf    ("  got_ret  %u\n", got_ret);
        !           201:               printf    ("  got_read %u\n", got_read);
        !           202:               printf    ("  want_len %u\n", want_len);
        !           203:               printf    ("  want");
        !           204:               for (j = 0; j < want_len; j++)
        !           205:                 printf (" %02X", (unsigned) (unsigned char) want[j]);
        !           206:               printf    ("\n");
        !           207:               printf    ("  got ");
        !           208:               for (j = 0; j < want_len; j++)
        !           209:                 printf (" %02X", (unsigned) (unsigned char) got[j]);
        !           210:               printf    ("\n");
        !           211:               abort ();
        !           212:             }
        !           213:
        !           214:           mpz_neg (z, z);
        !           215:         }
        !           216:       mpz_mul_2exp (z, z, 8);
        !           217:       mpz_add_ui (z, z, (unsigned long) BYTEVAL (i));
        !           218:     }
        !           219:
        !           220:   mpz_clear (z);
        !           221: }
        !           222:
        !           223:
        !           224: void
        !           225: check_rand (void)
        !           226: {
        !           227:   gmp_randstate_ptr  rands = RANDS;
        !           228:   int        i, error = 0;
        !           229:   mpz_t      got, want;
        !           230:   size_t     inp_ret, out_ret;
        !           231:   FILE       *fp;
        !           232:
        !           233:   mpz_init (want);
        !           234:   mpz_init (got);
        !           235:
        !           236:   for (i = 0; i < 500; i++)
        !           237:     {
        !           238:       mpz_erandomb (want, rands, 10*BITS_PER_MP_LIMB);
        !           239:       mpz_negrandom (want, rands);
        !           240:
        !           241:       fp = fopen_wplusb_or_die (FILENAME);
        !           242:       out_ret = mpz_out_raw (fp, want);
        !           243:       ASSERT_ALWAYS (fflush (fp) == 0);
        !           244:       rewind (fp);
        !           245:       inp_ret = mpz_inp_raw (got, fp);
        !           246:       ASSERT_ALWAYS (fclose (fp) == 0);
        !           247:
        !           248:       MPZ_CHECK_FORMAT (got);
        !           249:
        !           250:       if (inp_ret != out_ret)
        !           251:         {
        !           252:           printf ("check_rand: different inp/out return values\n");
        !           253:           error = 1;
        !           254:         }
        !           255:       if (mpz_cmp (got, want) != 0)
        !           256:         {
        !           257:           printf ("check_rand: wrong result\n");
        !           258:           error = 1;
        !           259:         }
        !           260:       if (error)
        !           261:         {
        !           262:           printf    ("  out_ret %u\n", out_ret);
        !           263:           printf    ("  inp_ret %u\n", inp_ret);
        !           264:           mpz_trace ("  want", want);
        !           265:           mpz_trace ("  got ", got);
        !           266:           abort ();
        !           267:         }
        !           268:     }
        !           269:
        !           270:   mpz_clear (got);
        !           271:   mpz_clear (want);
        !           272: }
        !           273:
        !           274:
        !           275: int
        !           276: main (void)
        !           277: {
        !           278:   tests_start ();
        !           279:   mp_trace_base = -16;
        !           280:
        !           281:   check_in ();
        !           282:   check_out ();
        !           283:   check_rand ();
        !           284:
        !           285:   unlink (FILENAME);
        !           286:   tests_end ();
        !           287:
        !           288:   exit (0);
        !           289: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>