/* $Id$ */ /* * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. * * This product is part of the Amsterdam Compiler Kit. * * Permission to use, sell, duplicate or disclose this software must be * obtained in writing. Requests for such permissions may be sent to * * Dr. Andrew S. Tanenbaum * Wiskundig Seminarium * Vrije Universiteit * Postbox 7161 * 1007 MC Amsterdam * The Netherlands * */ /* Author: J.W. Stevenson */ #include "pc.h" #define assert(x) /* nothing */ #if __STDC__ #include #define HUGE_DIG DBL_MAX_10_EXP /* log10(maxreal) */ #else #define HUGE_DIG 400 /* log10(maxreal) */ #endif #define PREC_DIG 80 /* the maximum digits returned by _fcvt() */ #define FILL_CHAR '0' /* char printed if all of _fcvt() used */ #define BUFSIZE HUGE_DIG + PREC_DIG + 3 void _wrf(int n, int w, double r, struct file* f) { char *p, *b; int s, d; char buf[BUFSIZE]; if (n < 0 || w < 0) _trp(EWIDTH); p = buf; if (n > PREC_DIG) n = PREC_DIG; b = _fcvt(r, n, &d, &s); assert(abs(d) <= HUGE_DIG); if (s) *p++ = '-'; if (d <= 0) *p++ = '0'; else do *p++ = (*b ? *b++ : FILL_CHAR); while (--d > 0); if (n > 0) *p++ = '.'; while (++d <= 0) { if (--n < 0) break; *p++ = '0'; } while (--n >= 0) { *p++ = (*b ? *b++ : FILL_CHAR); assert(p <= buf + BUFSIZE); } _wstrin(w, (int)(p - buf), buf, f); }