Works for me. ok anyone?
I think ksh_limval.h can go entirely after this, per the note in
PROJECTS.
On Sat, Sep 12, 2015 at 03:00:02PM -0400, Michael McConville wrote:
> Nicholas Marriott wrote:
> > I would kill it. FPBUF_SIZE and DMAXEXP can go too.
>
> Here's the diff:
>
>
> Index: ksh_limval.h
> ===================================================================
> RCS file: /cvs/src/bin/ksh/ksh_limval.h,v
> retrieving revision 1.2
> diff -u -p -r1.2 ksh_limval.h
> --- ksh_limval.h 18 Dec 2004 20:55:52 -0000 1.2
> +++ ksh_limval.h 12 Sep 2015 18:59:00 -0000
> @@ -4,10 +4,6 @@
>
> /* limits.h is included in sh.h */
>
> -#ifndef DMAXEXP
> -# define DMAXEXP 128 /* should be big enough */
> -#endif
> -
> #ifndef BITS
> # define BITS(t) (CHAR_BIT * sizeof(t))
> #endif
> Index: shf.c
> ===================================================================
> RCS file: /cvs/src/bin/ksh/shf.c,v
> retrieving revision 1.16
> diff -u -p -r1.16 shf.c
> --- shf.c 19 Apr 2013 17:36:09 -0000 1.16
> +++ shf.c 12 Sep 2015 18:59:00 -0000
> @@ -705,15 +705,7 @@ shf_smprintf(const char *fmt, ...)
> return shf_sclose(&shf); /* null terminates */
> }
>
> -#undef FP /* if you want floating point stuff */
> -
> #define BUF_SIZE 128
> -#define FPBUF_SIZE (DMAXEXP+16)/* this must be >
> - * MAX(DMAXEXP, log10(pow(2, DSIGNIF)))
> - * + ceil(log10(DMAXEXP)) + 8 (I think).
> - * Since this is hard to express as a
> - * constant, just use a large buffer.
> - */
>
> /*
> * What kinda of machine we on? Hopefully the C compiler will optimize
> @@ -746,18 +738,6 @@ shf_smprintf(const char *fmt, ...)
> #define FL_NUMBER 0x400 /* a number was formated %[douxefg] */
>
>
> -#ifdef FP
> -#include <math.h>
> -
> -static double
> -my_ceil(double d)
> -{
> - double i;
> -
> - return d - modf(d, &i) + (d < 0 ? -1 : 1);
> -}
> -#endif /* FP */
> -
> int
> shf_vfprintf(struct shf *shf, const char *fmt, va_list args)
> {
> @@ -771,17 +751,6 @@ shf_vfprintf(struct shf *shf, const char
> char numbuf[(BITS(long long) + 2) / 3 + 1];
> /* this stuff for dealing with the buffer */
> int nwritten = 0;
> -#ifdef FP
> - /* should be in <math.h>
> - * extern double frexp();
> - */
> - extern char *ecvt();
> -
> - double fpnum;
> - int expo, decpt;
> - char style;
> - char fpbuf[FPBUF_SIZE];
> -#endif /* FP */
>
> if (!fmt)
> return 0;
> @@ -952,134 +921,6 @@ shf_vfprintf(struct shf *shf, const char
> precision = len; /* no loss */
> }
> break;
> -
> -#ifdef FP
> - case 'e':
> - case 'g':
> - case 'f':
> - {
> - char *p;
> -
> - /*
> - * This could probably be done better,
> - * but it seems to work. Note that gcvt()
> - * is not used, as you cannot tell it to
> - * not strip the zeros.
> - */
> - flags |= FL_NUMBER;
> - if (!(flags & FL_DOT))
> - precision = 6; /* default */
> - /*
> - * Assumes doubles are pushed on
> - * the stack. If this is not so, then
> - * FL_LLONG/FL_LONG/FL_SHORT should be checked.
> - */
> - fpnum = va_arg(args, double);
> - s = fpbuf;
> - style = c;
> - /*
> - * This is the same as
> - * expo = ceil(log10(fpnum))
> - * but doesn't need -lm. This is an
> - * approximation as expo is rounded up.
> - */
> - (void) frexp(fpnum, &expo);
> - expo = my_ceil(expo / LOG2_10);
> -
> - if (expo < 0)
> - expo = 0;
> -
> - p = ecvt(fpnum, precision + 1 + expo,
> - &decpt, &tmp);
> - if (c == 'g') {
> - if (decpt < -4 || decpt > precision)
> - style = 'e';
> - else
> - style = 'f';
> - if (decpt > 0 && (precision -= decpt) < 0)
> - precision = 0;
> - }
> - if (tmp)
> - *s++ = '-';
> - else if (flags & FL_PLUS)
> - *s++ = '+';
> - else if (flags & FL_BLANK)
> - *s++ = ' ';
> -
> - if (style == 'e')
> - *s++ = *p++;
> - else {
> - if (decpt > 0) {
> - /* Overflow check - should
> - * never have this problem.
> - */
> - if (decpt > &fpbuf[sizeof(fpbuf)] - s -
> 8)
> - decpt = &fpbuf[sizeof(fpbuf)] -
> s - 8;
> - (void) memcpy(s, p, decpt);
> - s += decpt;
> - p += decpt;
> - } else
> - *s++ = '0';
> - }
> -
> - /* print the fraction? */
> - if (precision > 0) {
> - *s++ = '.';
> - /* Overflow check - should
> - * never have this problem.
> - */
> - if (precision > &fpbuf[sizeof(fpbuf)] - s - 7)
> - precision = &fpbuf[sizeof(fpbuf)] - s -
> 7;
> - for (tmp = decpt; tmp++ < 0 &&
> - precision > 0 ; precision--)
> - *s++ = '0';
> - tmp = strlen(p);
> - if (precision > tmp)
> - precision = tmp;
> - /* Overflow check - should
> - * never have this problem.
> - */
> - if (precision > &fpbuf[sizeof(fpbuf)] - s - 7)
> - precision = &fpbuf[sizeof(fpbuf)] - s -
> 7;
> - (void) memcpy(s, p, precision);
> - s += precision;
> - /*
> - * `g' format strips trailing
> - * zeros after the decimal.
> - */
> - if (c == 'g' && !(flags & FL_HASH)) {
> - while (*--s == '0')
> - ;
> - if (*s != '.')
> - s++;
> - }
> - } else if (flags & FL_HASH)
> - *s++ = '.';
> -
> - if (style == 'e') {
> - *s++ = (flags & FL_UPPER) ? 'E' : 'e';
> - if (--decpt >= 0)
> - *s++ = '+';
> - else {
> - *s++ = '-';
> - decpt = -decpt;
> - }
> - p = &numbuf[sizeof(numbuf)];
> - for (tmp = 0; tmp < 2 || decpt ; tmp++) {
> - *--p = '0' + decpt % 10;
> - decpt /= 10;
> - }
> - tmp = &numbuf[sizeof(numbuf)] - p;
> - (void) memcpy(s, p, tmp);
> - s += tmp;
> - }
> -
> - len = s - fpbuf;
> - s = fpbuf;
> - precision = len;
> - break;
> - }
> -#endif /* FP */
>
> case 's':
> if (!(s = va_arg(args, char *)))