summaryrefslogtreecommitdiffstats
path: root/system/ksh-openbsd/patches/02-remove_fp.diff
diff options
context:
space:
mode:
Diffstat (limited to 'system/ksh-openbsd/patches/02-remove_fp.diff')
-rw-r--r--system/ksh-openbsd/patches/02-remove_fp.diff217
1 files changed, 217 insertions, 0 deletions
diff --git a/system/ksh-openbsd/patches/02-remove_fp.diff b/system/ksh-openbsd/patches/02-remove_fp.diff
new file mode 100644
index 0000000000..25817d0a56
--- /dev/null
+++ b/system/ksh-openbsd/patches/02-remove_fp.diff
@@ -0,0 +1,217 @@
+Remove disabled FP support.
+From Okan Demirmen.
+Index: ksh_limval.h
+===================================================================
+RCS file: /home/okan/hack/open/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 14 Mar 2011 10:03:41 -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: /home/okan/hack/open/cvs/src/bin/ksh/shf.c,v
+retrieving revision 1.15
+diff -u -p -r1.15 shf.c
+--- shf.c 2 Apr 2006 00:48:33 -0000 1.15
++++ shf.c 14 Mar 2011 10:03:19 -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
+@@ -744,18 +736,6 @@ shf_smprintf(const char *fmt, ...)
+ #define FL_NUMBER 0x200 /* 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)
+ {
+@@ -769,17 +749,6 @@ shf_vfprintf(struct shf *shf, const char
+ char numbuf[(BITS(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;
+@@ -946,134 +915,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_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 *)))
+
+