Annotation of OpenXM_contrib/gmp/tests/trace.c, Revision 1.1
1.1 ! ohara 1: /* Support for diagnostic traces.
! 2:
! 3: Copyright 1999, 2000, 2001, 2002 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:
! 23: /* Future: Would like commas printed between limbs in hex or binary, but
! 24: perhaps not always since it might upset cutting and pasting into bc or
! 25: whatever. */
! 26:
! 27:
! 28: #include <stdio.h>
! 29: #include <stdlib.h>
! 30: #include <string.h> /* for strlen */
! 31:
! 32: #include "gmp.h"
! 33: #include "gmp-impl.h"
! 34:
! 35: #include "tests.h"
! 36:
! 37:
! 38: /* Number base for the various trace printing routines.
! 39: Set this in main() or with the debugger.
! 40: If hexadecimal is going to be fed into GNU bc, remember to use -16
! 41: because bc requires upper case. */
! 42:
! 43: int mp_trace_base = 10;
! 44:
! 45:
! 46: void
! 47: mp_trace_start (const char *name)
! 48: {
! 49: if (name != NULL && name[0] != '\0')
! 50: printf ("%s=", name);
! 51:
! 52: switch (ABS (mp_trace_base)) {
! 53: case 2: printf ("bin:"); break;
! 54: case 8: printf ("oct:"); break;
! 55: case 10: break;
! 56: case 16: printf ("0x"); break;
! 57: default: printf ("base%d:", ABS (mp_trace_base)); break;
! 58: }
! 59: }
! 60:
! 61: /* Print "name=value\n" to stdout for an mpq_t value. */
! 62: void
! 63: mpq_trace (const char *name, mpq_srcptr q)
! 64: {
! 65: mp_trace_start (name);
! 66: if (q == NULL)
! 67: {
! 68: printf ("NULL\n");
! 69: return;
! 70: }
! 71:
! 72: mpq_out_str (stdout, mp_trace_base, q);
! 73: printf ("\n");
! 74: }
! 75:
! 76:
! 77: /* Print "name=value\n" to stdout for an mpz_t value. */
! 78: void
! 79: mpz_trace (const char *name, mpz_srcptr z)
! 80: {
! 81: mpq_t q;
! 82: mp_limb_t one;
! 83:
! 84: if (z == NULL)
! 85: {
! 86: mpq_trace (name, NULL);
! 87: return;
! 88: }
! 89:
! 90: q->_mp_num._mp_alloc = ALLOC(z);
! 91: q->_mp_num._mp_size = SIZ(z);
! 92: q->_mp_num._mp_d = PTR(z);
! 93:
! 94: one = 1;
! 95: q->_mp_den._mp_alloc = 1;
! 96: q->_mp_den._mp_size = 1;
! 97: q->_mp_den._mp_d = &one;
! 98:
! 99: mpq_trace(name, q);
! 100: }
! 101:
! 102:
! 103: /* Print "name=value\n" to stdout for an mpf_t value. */
! 104: void
! 105: mpf_trace (const char *name, mpf_srcptr f)
! 106: {
! 107: mp_trace_start (name);
! 108: if (f == NULL)
! 109: {
! 110: printf ("NULL\n");
! 111: return;
! 112: }
! 113:
! 114: mpf_out_str (stdout, mp_trace_base, 0, f);
! 115: printf ("\n");
! 116: }
! 117:
! 118:
! 119: /* Print "namenum=value\n" to stdout for an mpz_t value.
! 120: "name" should have a "%d" to get the number. */
! 121: void
! 122: mpz_tracen (const char *name, int num, mpz_srcptr z)
! 123: {
! 124: if (name != NULL && name[0] != '\0')
! 125: {
! 126: printf (name, num);
! 127: putchar ('=');
! 128: }
! 129: mpz_trace (NULL, z);
! 130: }
! 131:
! 132:
! 133: /* Print "name=value\n" to stdout for an mpn style ptr,size. */
! 134: void
! 135: mpn_trace (const char *name, mp_srcptr ptr, mp_size_t size)
! 136: {
! 137: mpz_t z;
! 138: if (ptr == NULL)
! 139: {
! 140: mpz_trace (name, NULL);
! 141: return;
! 142: }
! 143: MPN_NORMALIZE (ptr, size);
! 144: PTR(z) = (mp_ptr) ptr;
! 145: SIZ(z) = size;
! 146: ALLOC(z) = size;
! 147: mpz_trace (name, z);
! 148: }
! 149:
! 150:
! 151: /* Print "namenum=value\n" to stdout for an mpn style ptr,size.
! 152: "name" should have a "%d" to get the number. */
! 153: void
! 154: mpn_tracen (const char *name, int num, mp_srcptr ptr, mp_size_t size)
! 155: {
! 156: if (name != NULL && name[0] != '\0')
! 157: {
! 158: printf (name, num);
! 159: putchar ('=');
! 160: }
! 161: mpn_trace (NULL, ptr, size);
! 162: }
! 163:
! 164:
! 165: /* Print "namenum=value\n" to stdout for an array of mpn style ptr,size.
! 166:
! 167: "a" is an array of pointers, each a[i] is a pointer to "size" many limbs.
! 168: The formal parameter isn't mp_srcptr because that causes compiler
! 169: warnings, but the values aren't modified.
! 170:
! 171: "name" should have a printf style "%d" to get the array index. */
! 172:
! 173: void
! 174: mpn_tracea (const char *name, const mp_ptr *a, int count, mp_size_t size)
! 175: {
! 176: int i;
! 177: for (i = 0; i < count; i++)
! 178: mpn_tracen (name, i, a[i], size);
! 179: }
! 180:
! 181:
! 182: /* Print "value\n" to a file for an mpz_t value. Any previous contents of
! 183: the file are overwritten, so you need different file names each time this
! 184: is called.
! 185:
! 186: Overwriting the file is a feature, it means you get old data replaced
! 187: when you run a test program repeatedly. */
! 188:
! 189: void
! 190: mpn_trace_file (const char *filename, mp_srcptr ptr, mp_size_t size)
! 191: {
! 192: FILE *fp;
! 193: mpz_t z;
! 194:
! 195: fp = fopen (filename, "w");
! 196: if (fp == NULL)
! 197: {
! 198: perror ("fopen");
! 199: abort();
! 200: }
! 201:
! 202: MPN_NORMALIZE (ptr, size);
! 203: PTR(z) = (mp_ptr) ptr;
! 204: SIZ(z) = (int) size;
! 205:
! 206: mpz_out_str (fp, mp_trace_base, z);
! 207: fprintf (fp, "\n");
! 208:
! 209: if (ferror (fp) || fclose (fp) != 0)
! 210: {
! 211: printf ("error writing %s\n", filename);
! 212: abort();
! 213: }
! 214: }
! 215:
! 216:
! 217: /* Print "value\n" to a set of files, one file for each element of the given
! 218: array of mpn style ptr,size. Any previous contents of the files are
! 219: overwritten, so you need different file names each time this is called.
! 220: Each file is "filenameN" where N is 0 to count-1.
! 221:
! 222: "a" is an array of pointers, each a[i] is a pointer to "size" many limbs.
! 223: The formal parameter isn't mp_srcptr because that causes compiler
! 224: warnings, but the values aren't modified.
! 225:
! 226: Overwriting the files is a feature, it means you get old data replaced
! 227: when you run a test program repeatedly. The output style isn't
! 228: particularly pretty, but at least it gets something out, and you can cat
! 229: the files into bc, or whatever. */
! 230:
! 231: void
! 232: mpn_tracea_file (const char *filename,
! 233: const mp_ptr *a, int count, mp_size_t size)
! 234: {
! 235: char *s;
! 236: int i;
! 237: TMP_DECL (marker);
! 238:
! 239: TMP_MARK (marker);
! 240: s = (char *) TMP_ALLOC (strlen (filename) + 50);
! 241:
! 242: for (i = 0; i < count; i++)
! 243: {
! 244: sprintf (s, "%s%d", filename, i);
! 245: mpn_trace_file (s, a[i], size);
! 246: }
! 247:
! 248: TMP_FREE (marker);
! 249: }
! 250:
! 251:
! 252: void
! 253: byte_trace (const char *name, const void *ptr, mp_size_t size)
! 254: {
! 255: char *fmt;
! 256: mp_size_t i;
! 257:
! 258: mp_trace_start (name);
! 259:
! 260: switch (mp_trace_base) {
! 261: case 8: fmt = " %o"; break;
! 262: case 10: fmt = " %d"; break;
! 263: case 16: fmt = " %x"; break;
! 264: case -16: fmt = " %X"; break;
! 265: default: printf ("Oops, unsupported base in byte_trace\n"); abort (); break;
! 266: }
! 267:
! 268: for (i = 0; i < size; i++)
! 269: printf (fmt, (int) ((unsigned char *) ptr)[i]);
! 270: printf ("\n");
! 271: }
! 272:
! 273: void
! 274: byte_tracen (const char *name, int num, const void *ptr, mp_size_t size)
! 275: {
! 276: if (name != NULL && name[0] != '\0')
! 277: {
! 278: printf (name, num);
! 279: putchar ('=');
! 280: }
! 281: byte_trace (NULL, ptr, size);
! 282: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>