annotate fft/fftw/fftw-3.3.4/kernel/print.c @ 40:223f770b5341 kissfft-double tip

Try a double-precision kissfft
author Chris Cannam
date Wed, 07 Sep 2016 10:40:32 +0100
parents 26056e866c29
children
rev   line source
Chris@19 1 /*
Chris@19 2 * Copyright (c) 2003, 2007-14 Matteo Frigo
Chris@19 3 * Copyright (c) 2003, 2007-14 Massachusetts Institute of Technology
Chris@19 4 *
Chris@19 5 * This program is free software; you can redistribute it and/or modify
Chris@19 6 * it under the terms of the GNU General Public License as published by
Chris@19 7 * the Free Software Foundation; either version 2 of the License, or
Chris@19 8 * (at your option) any later version.
Chris@19 9 *
Chris@19 10 * This program is distributed in the hope that it will be useful,
Chris@19 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Chris@19 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Chris@19 13 * GNU General Public License for more details.
Chris@19 14 *
Chris@19 15 * You should have received a copy of the GNU General Public License
Chris@19 16 * along with this program; if not, write to the Free Software
Chris@19 17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Chris@19 18 *
Chris@19 19 */
Chris@19 20
Chris@19 21
Chris@19 22 #include "ifftw.h"
Chris@19 23 #include <stddef.h>
Chris@19 24 #include <stdarg.h>
Chris@19 25 #include <stdio.h>
Chris@19 26
Chris@19 27 #define BSZ 64
Chris@19 28
Chris@19 29 static void myputs(printer *p, const char *s)
Chris@19 30 {
Chris@19 31 char c;
Chris@19 32 while ((c = *s++))
Chris@19 33 p->putchr(p, c);
Chris@19 34 }
Chris@19 35
Chris@19 36 static void newline(printer *p)
Chris@19 37 {
Chris@19 38 int i;
Chris@19 39
Chris@19 40 p->putchr(p, '\n');
Chris@19 41 for (i = 0; i < p->indent; ++i)
Chris@19 42 p->putchr(p, ' ');
Chris@19 43 }
Chris@19 44
Chris@19 45 static const char *digits = "0123456789abcdef";
Chris@19 46
Chris@19 47 static void putint(printer *p, INT i)
Chris@19 48 {
Chris@19 49 char buf[BSZ];
Chris@19 50 char *f = buf;
Chris@19 51
Chris@19 52 if (i < 0) {
Chris@19 53 p->putchr(p, '-');
Chris@19 54 i = -i;
Chris@19 55 }
Chris@19 56
Chris@19 57 do {
Chris@19 58 *f++ = digits[i % 10];
Chris@19 59 i /= 10;
Chris@19 60 } while (i);
Chris@19 61
Chris@19 62 do {
Chris@19 63 p->putchr(p, *--f);
Chris@19 64 } while (f != buf);
Chris@19 65 }
Chris@19 66
Chris@19 67 static void putulong(printer *p, unsigned long i, int base, int width)
Chris@19 68 {
Chris@19 69 char buf[BSZ];
Chris@19 70 char *f = buf;
Chris@19 71
Chris@19 72 do {
Chris@19 73 *f++ = digits[i % base];
Chris@19 74 i /= base;
Chris@19 75 } while (i);
Chris@19 76
Chris@19 77 while (width > f - buf) {
Chris@19 78 p->putchr(p, '0');
Chris@19 79 --width;
Chris@19 80 }
Chris@19 81
Chris@19 82 do {
Chris@19 83 p->putchr(p, *--f);
Chris@19 84 } while (f != buf);
Chris@19 85 }
Chris@19 86
Chris@19 87 static void vprint(printer *p, const char *format, va_list ap)
Chris@19 88 {
Chris@19 89 const char *s = format;
Chris@19 90 char c;
Chris@19 91 INT ival;
Chris@19 92
Chris@19 93 while ((c = *s++)) {
Chris@19 94 switch (c) {
Chris@19 95 case '%':
Chris@19 96 switch ((c = *s++)) {
Chris@19 97 case 'M': {
Chris@19 98 /* md5 value */
Chris@19 99 md5uint x = va_arg(ap, md5uint);
Chris@19 100 putulong(p, (unsigned long)(0xffffffffUL & x),
Chris@19 101 16, 8);
Chris@19 102 break;
Chris@19 103 }
Chris@19 104 case 'c': {
Chris@19 105 int x = va_arg(ap, int);
Chris@19 106 p->putchr(p, x);
Chris@19 107 break;
Chris@19 108 }
Chris@19 109 case 's': {
Chris@19 110 char *x = va_arg(ap, char *);
Chris@19 111 if (x)
Chris@19 112 myputs(p, x);
Chris@19 113 else
Chris@19 114 goto putnull;
Chris@19 115 break;
Chris@19 116 }
Chris@19 117 case 'd': {
Chris@19 118 int x = va_arg(ap, int);
Chris@19 119 ival = (INT)x;
Chris@19 120 goto putival;
Chris@19 121 }
Chris@19 122 case 'D': {
Chris@19 123 ival = va_arg(ap, INT);
Chris@19 124 goto putival;
Chris@19 125 }
Chris@19 126 case 'v': {
Chris@19 127 /* print optional vector length */
Chris@19 128 ival = va_arg(ap, INT);
Chris@19 129 if (ival > 1) {
Chris@19 130 myputs(p, "-x");
Chris@19 131 goto putival;
Chris@19 132 }
Chris@19 133 break;
Chris@19 134 }
Chris@19 135 case 'o': {
Chris@19 136 /* integer option. Usage: %oNAME= */
Chris@19 137 ival = va_arg(ap, INT);
Chris@19 138 if (ival)
Chris@19 139 p->putchr(p, '/');
Chris@19 140 while ((c = *s++) != '=')
Chris@19 141 if (ival)
Chris@19 142 p->putchr(p, c);
Chris@19 143 if (ival) {
Chris@19 144 p->putchr(p, '=');
Chris@19 145 goto putival;
Chris@19 146 }
Chris@19 147 break;
Chris@19 148 }
Chris@19 149 case 'u': {
Chris@19 150 unsigned x = va_arg(ap, unsigned);
Chris@19 151 putulong(p, (unsigned long)x, 10, 0);
Chris@19 152 break;
Chris@19 153 }
Chris@19 154 case 'x': {
Chris@19 155 unsigned x = va_arg(ap, unsigned);
Chris@19 156 putulong(p, (unsigned long)x, 16, 0);
Chris@19 157 break;
Chris@19 158 }
Chris@19 159 case '(': {
Chris@19 160 /* newline, augment indent level */
Chris@19 161 p->indent += p->indent_incr;
Chris@19 162 newline(p);
Chris@19 163 break;
Chris@19 164 }
Chris@19 165 case ')': {
Chris@19 166 /* decrement indent level */
Chris@19 167 p->indent -= p->indent_incr;
Chris@19 168 break;
Chris@19 169 }
Chris@19 170 case 'p': { /* note difference from C's %p */
Chris@19 171 /* print plan */
Chris@19 172 plan *x = va_arg(ap, plan *);
Chris@19 173 if (x)
Chris@19 174 x->adt->print(x, p);
Chris@19 175 else
Chris@19 176 goto putnull;
Chris@19 177 break;
Chris@19 178 }
Chris@19 179 case 'P': {
Chris@19 180 /* print problem */
Chris@19 181 problem *x = va_arg(ap, problem *);
Chris@19 182 if (x)
Chris@19 183 x->adt->print(x, p);
Chris@19 184 else
Chris@19 185 goto putnull;
Chris@19 186 break;
Chris@19 187 }
Chris@19 188 case 'T': {
Chris@19 189 /* print tensor */
Chris@19 190 tensor *x = va_arg(ap, tensor *);
Chris@19 191 if (x)
Chris@19 192 X(tensor_print)(x, p);
Chris@19 193 else
Chris@19 194 goto putnull;
Chris@19 195 break;
Chris@19 196 }
Chris@19 197 default:
Chris@19 198 A(0 /* unknown format */);
Chris@19 199 break;
Chris@19 200
Chris@19 201 putnull:
Chris@19 202 myputs(p, "(null)");
Chris@19 203 break;
Chris@19 204
Chris@19 205 putival:
Chris@19 206 putint(p, ival);
Chris@19 207 break;
Chris@19 208 }
Chris@19 209 break;
Chris@19 210 default:
Chris@19 211 p->putchr(p, c);
Chris@19 212 break;
Chris@19 213 }
Chris@19 214 }
Chris@19 215 }
Chris@19 216
Chris@19 217 static void print(printer *p, const char *format, ...)
Chris@19 218 {
Chris@19 219 va_list ap;
Chris@19 220 va_start(ap, format);
Chris@19 221 vprint(p, format, ap);
Chris@19 222 va_end(ap);
Chris@19 223 }
Chris@19 224
Chris@19 225 printer *X(mkprinter)(size_t size,
Chris@19 226 void (*putchr)(printer *p, char c),
Chris@19 227 void (*cleanup)(printer *p))
Chris@19 228 {
Chris@19 229 printer *s = (printer *)MALLOC(size, OTHER);
Chris@19 230 s->print = print;
Chris@19 231 s->vprint = vprint;
Chris@19 232 s->putchr = putchr;
Chris@19 233 s->cleanup = cleanup;
Chris@19 234 s->indent = 0;
Chris@19 235 s->indent_incr = 2;
Chris@19 236 return s;
Chris@19 237 }
Chris@19 238
Chris@19 239 void X(printer_destroy)(printer *p)
Chris@19 240 {
Chris@19 241 if (p->cleanup)
Chris@19 242 p->cleanup(p);
Chris@19 243 X(ifree)(p);
Chris@19 244 }