Annotation of OpenXM_contrib/gmp/mpn/tests/trace.c, Revision 1.1.1.1
1.1 maekawa 1: /* trace.c -- Support for diagnostic traces. */
2:
3: /*
4: Copyright (C) 1999, 2000 Free Software Foundation, Inc.
5:
6: This file is part of the GNU MP Library.
7:
8: The GNU MP Library is free software; you can redistribute it and/or modify
9: it under the terms of the GNU Lesser General Public License as published by
10: the Free Software Foundation; either version 2.1 of the License, or (at your
11: option) any later version.
12:
13: The GNU MP Library is distributed in the hope that it will be useful, but
14: WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15: or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
16: License for more details.
17:
18: You should have received a copy of the GNU Lesser General Public License
19: along with the GNU MP Library; see the file COPYING.LIB. If not, write to
20: the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
21: MA 02111-1307, USA.
22: */
23:
24: #include <stdio.h>
25: #include "gmp.h"
26: #include "gmp-impl.h"
27: #include "try.h"
28:
29:
30: /* Number base for the various trace printing routines.
31: Set this in main() or with the debugger.
32: If hexadecimal is going to be fed into GNU bc, remember to use -16
33: because bc requires upper case. */
34:
35: int mp_trace_base = 10;
36:
37:
38: /* Print "name=value\n" to stdout for an mpq_t value. */
39: void
40: mpq_trace (const char *name, mpq_srcptr q)
41: {
42: if (name != NULL && name[0] != '\0')
43: printf ("%s=", name);
44:
45: switch (ABS (mp_trace_base)) {
46: case 8: printf ("oct"); break;
47: case 10: break;
48: case 16: printf ("0x"); break;
49: default: printf ("base%d:", ABS (mp_trace_base)); break;
50: }
51:
52: mpq_out_str (stdout, mp_trace_base, q);
53:
54: /* It's not very interesting to know when numbers are unnormalized.
55: mpz's should always be and ought to be checked with ASSERT() if in doubt.
56: mpn's can often be unnormalized without affecting anything. */
57: /* if (!mpq_normalized_p (z)) printf (" (unnorm)"); */
58:
59: printf ("\n");
60: }
61:
62:
63: /* Print "name=value\n" to stdout for an mpz_t value. */
64: void
65: mpz_trace (const char *name, mpz_srcptr z)
66: {
67: mpq_t q;
68: mpz_t one;
69: mp_limb_t one_limb;
70:
71: PTR(one) = &one_limb;
72: SIZ(one) = 1;
73: one_limb = 1;
74:
75: q->_mp_num = *z;
76: q->_mp_den = *one;
77:
78: mpq_trace(name, q);
79: }
80:
81:
82: /* Print "namenum=value\n" to stdout for an mpz_t value.
83: "name" should have a "%d" to get the number. */
84: void
85: mpz_tracen (const char *name, int num, mpz_srcptr z)
86: {
87: if (name != NULL && name[0] != '\0')
88: {
89: printf (name, num);
90: putchar ('=');
91: }
92: mpz_trace (NULL, z);
93: }
94:
95:
96: /* Print "name=value\n" to stdout for an mpn style ptr,size. */
97: void
98: mpn_trace (const char *name, mp_srcptr ptr, mp_size_t size)
99: {
100: mpz_t z;
101: MPN_NORMALIZE (ptr, size);
102: PTR(z) = (mp_ptr) ptr;
103: SIZ(z) = (int) size;
104: mpz_trace (name, z);
105: }
106:
107:
108: /* Print "namenum=value\n" to stdout for an mpn style ptr,size.
109: "name" should have a "%d" to get the number. */
110: void
111: mpn_tracen (const char *name, int num, mp_srcptr ptr, mp_size_t size)
112: {
113: if (name != NULL && name[0] != '\0')
114: {
115: printf (name, num);
116: putchar ('=');
117: }
118: mpn_trace (NULL, ptr, size);
119: }
120:
121:
122: /* Print "namenum=value\n" to stdout for an array of mpn style ptr,size.
123:
124: "a" is an array of pointers, each a[i] is a pointer to "size" many limbs.
125: The formal parameter isn't mp_srcptr because that causes compiler
126: warnings, but the values aren't modified.
127:
128: "name" should have a printf style "%d" to get the array index. */
129:
130: void
131: mpn_tracea (const char *name, const mp_ptr *a, int count, mp_size_t size)
132: {
133: int i;
134: for (i = 0; i < count; i++)
135: mpn_tracen (name, i, a[i], size);
136: }
137:
138:
139: /* Print "value\n" to a file for an mpz_t value. Any previous contents of
140: the file are overwritten, so you need different file names each time this
141: is called.
142:
143: Overwriting the file is a feature, it means you get old data replaced
144: when you run a test program repeatedly. */
145:
146: void
147: mpn_trace_file (const char *filename, mp_srcptr ptr, mp_size_t size)
148: {
149: FILE *fp;
150: mpz_t z;
151:
152: fp = fopen (filename, "w");
153: if (fp == NULL)
154: {
155: perror ("fopen");
156: abort();
157: }
158:
159: MPN_NORMALIZE (ptr, size);
160: PTR(z) = (mp_ptr) ptr;
161: SIZ(z) = (int) size;
162:
163: mpz_out_str (fp, mp_trace_base, z);
164: fprintf (fp, "\n");
165:
166: if (ferror (fp) || fclose (fp) != 0)
167: {
168: printf ("error writing %s\n", filename);
169: abort();
170: }
171: }
172:
173:
174: /* Print "value\n" to a set of files, one file for each element of the given
175: array of mpn style ptr,size. Any previous contents of the files are
176: overwritten, so you need different file names each time this is called.
177: Each file is "filenameN" where N is 0 to count-1.
178:
179: "a" is an array of pointers, each a[i] is a pointer to "size" many limbs.
180: The formal parameter isn't mp_srcptr because that causes compiler
181: warnings, but the values aren't modified.
182:
183: Overwriting the files is a feature, it means you get old data replaced
184: when you run a test program repeatedly. The output style isn't
185: particularly pretty, but at least it gets something out, and you can cat
186: the files into bc, or whatever. */
187:
188: void
189: mpn_tracea_file (const char *filename,
190: const mp_ptr *a, int count, mp_size_t size)
191: {
192: char *s;
193: int i;
194: TMP_DECL (marker);
195:
196: TMP_MARK (marker);
197: s = (char *) TMP_ALLOC (strlen (filename) + 50);
198:
199: for (i = 0; i < count; i++)
200: {
201: sprintf (s, "%s%d", filename, i);
202: mpn_trace_file (s, a[i], size);
203: }
204:
205: TMP_FREE (marker);
206: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>