annotate src/fftw-3.3.3/kernel/print.c @ 83:ae30d91d2ffe

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