mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-07-06 19:28:29 +00:00
Clean up gdtoa code
This commit is contained in:
parent
7341336b1a
commit
da45c7c80b
48 changed files with 2808 additions and 4721 deletions
150
third_party/gdtoa/g__fmt.c
vendored
150
third_party/gdtoa/g__fmt.c
vendored
|
@ -1,52 +1,44 @@
|
|||
/*-*- mode:c;indent-tabs-mode:t;c-basic-offset:8;tab-width:8;coding:utf-8 -*-│
|
||||
│vi: set et ft=c ts=8 tw=8 fenc=utf-8 :vi│
|
||||
╚──────────────────────────────────────────────────────────────────────────────╝
|
||||
│ │
|
||||
│ The author of this software is David M. Gay. │
|
||||
│ Please send bug reports to David M. Gay <dmg@acm.org> │
|
||||
│ or Justine Tunney <jtunney@gmail.com> │
|
||||
│ │
|
||||
│ Copyright (C) 1998, 1999 by Lucent Technologies │
|
||||
│ All Rights Reserved │
|
||||
│ │
|
||||
│ Permission to use, copy, modify, and distribute this software and │
|
||||
│ its documentation for any purpose and without fee is hereby │
|
||||
│ granted, provided that the above copyright notice appear in all │
|
||||
│ copies and that both that the copyright notice and this │
|
||||
│ permission notice and warranty disclaimer appear in supporting │
|
||||
│ documentation, and that the name of Lucent or any of its entities │
|
||||
│ not be used in advertising or publicity pertaining to │
|
||||
│ distribution of the software without specific, written prior │
|
||||
│ permission. │
|
||||
│ │
|
||||
│ LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, │
|
||||
│ INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. │
|
||||
│ IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY │
|
||||
│ SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES │
|
||||
│ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER │
|
||||
│ IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, │
|
||||
│ ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF │
|
||||
│ THIS SOFTWARE. │
|
||||
│ │
|
||||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||||
#include "third_party/gdtoa/gdtoa.internal.h"
|
||||
|
||||
/* clang-format off */
|
||||
/****************************************************************
|
||||
|
||||
The author of this software is David M. Gay.
|
||||
|
||||
Copyright (C) 1998 by Lucent Technologies
|
||||
All Rights Reserved
|
||||
|
||||
Permission to use, copy, modify, and distribute this software and
|
||||
its documentation for any purpose and without fee is hereby
|
||||
granted, provided that the above copyright notice appear in all
|
||||
copies and that both that the copyright notice and this
|
||||
permission notice and warranty disclaimer appear in supporting
|
||||
documentation, and that the name of Lucent or any of its entities
|
||||
not be used in advertising or publicity pertaining to
|
||||
distribution of the software without specific, written prior
|
||||
permission.
|
||||
|
||||
LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
||||
INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
|
||||
IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY
|
||||
SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
|
||||
IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
||||
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
|
||||
THIS SOFTWARE.
|
||||
|
||||
****************************************************************/
|
||||
|
||||
/* Please send bug reports to David M. Gay (dmg at acm dot org,
|
||||
* with " at " changed at "@" and " dot " changed to "."). */
|
||||
|
||||
#ifndef ldus_QNAN0
|
||||
#define dlen 0
|
||||
#define HEXDIG "0123456789abcdef"
|
||||
#define ldus_QNAN0 0x7fff
|
||||
#endif
|
||||
#ifndef ldus_QNAN1
|
||||
#define ldus_QNAN1 0xc000
|
||||
#endif
|
||||
#ifndef ldus_QNAN2
|
||||
#define ldus_QNAN2 0
|
||||
#endif
|
||||
#ifndef ldus_QNAN3
|
||||
#define ldus_QNAN3 0
|
||||
#endif
|
||||
#ifndef ldus_QNAN4
|
||||
#define ldus_QNAN4 0
|
||||
#endif
|
||||
|
||||
const char *const InfName[6] = { "Infinity", "infinity", "INFINITY", "Inf", "inf", "INF" };
|
||||
const char *const NanName[3] = { "NaN", "nan", "NAN" };
|
||||
|
@ -62,27 +54,6 @@ g__fmt(char *b, char *s, char *se, int decpt, ULong sign, size_t blen)
|
|||
int i, j, k;
|
||||
char *be, *s0;
|
||||
size_t len;
|
||||
#ifdef USE_LOCALE
|
||||
#ifdef NO_LOCALE_CACHE
|
||||
char *decimalpoint = localeconv()->decimal_point;
|
||||
size_t dlen = strlen(decimalpoint);
|
||||
#else
|
||||
char *decimalpoint;
|
||||
static char *decimalpoint_cache;
|
||||
static size_t dlen;
|
||||
if (!(s0 = decimalpoint_cache)) {
|
||||
s0 = localeconv()->decimal_point;
|
||||
dlen = strlen(s0);
|
||||
if ((decimalpoint_cache = (char*)MALLOC(strlen(s0) + 1))) {
|
||||
strcpy(decimalpoint_cache, s0);
|
||||
s0 = decimalpoint_cache;
|
||||
}
|
||||
}
|
||||
decimalpoint = s0;
|
||||
#endif
|
||||
#else
|
||||
#define dlen 0
|
||||
#endif
|
||||
s0 = s;
|
||||
len = (se-s) + dlen + 6; /* 6 = sign + e+dd + trailing null */
|
||||
if (blen < len)
|
||||
|
@ -93,21 +64,16 @@ g__fmt(char *b, char *s, char *se, int decpt, ULong sign, size_t blen)
|
|||
if (decpt <= -4 || decpt > se - s + 5) {
|
||||
*b++ = *s++;
|
||||
if (*s) {
|
||||
#ifdef USE_LOCALE
|
||||
while((*b = *decimalpoint++))
|
||||
++b;
|
||||
#else
|
||||
*b++ = '.';
|
||||
#endif
|
||||
while((*b = *s++) !=0)
|
||||
b++;
|
||||
}
|
||||
}
|
||||
*b++ = 'e';
|
||||
/* sprintf(b, "%+.2d", decpt - 1); */
|
||||
if (--decpt < 0) {
|
||||
*b++ = '-';
|
||||
decpt = -decpt;
|
||||
}
|
||||
}
|
||||
else
|
||||
*b++ = '+';
|
||||
for(j = 2, k = 10; 10*k <= decpt; j++, k *= 10){}
|
||||
|
@ -120,58 +86,46 @@ g__fmt(char *b, char *s, char *se, int decpt, ULong sign, size_t blen)
|
|||
break;
|
||||
decpt -= i*k;
|
||||
decpt *= 10;
|
||||
}
|
||||
*b = 0;
|
||||
}
|
||||
*b = 0;
|
||||
}
|
||||
else if (decpt <= 0) {
|
||||
#ifdef USE_LOCALE
|
||||
while((*b = *decimalpoint++))
|
||||
++b;
|
||||
#else
|
||||
*b++ = '.';
|
||||
#endif
|
||||
if (be < b - decpt + (se - s))
|
||||
goto ret0;
|
||||
for(; decpt < 0; decpt++)
|
||||
*b++ = '0';
|
||||
while((*b = *s++) != 0)
|
||||
b++;
|
||||
}
|
||||
}
|
||||
else {
|
||||
while((*b = *s++) != 0) {
|
||||
b++;
|
||||
if (--decpt == 0 && *s) {
|
||||
#ifdef USE_LOCALE
|
||||
while(*b = *decimalpoint++)
|
||||
++b;
|
||||
#else
|
||||
*b++ = '.';
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
if (b + decpt > be) {
|
||||
ret0:
|
||||
ret0:
|
||||
b = 0;
|
||||
goto ret;
|
||||
}
|
||||
}
|
||||
for(; decpt > 0; decpt--)
|
||||
*b++ = '0';
|
||||
*b = 0;
|
||||
}
|
||||
ret:
|
||||
}
|
||||
ret:
|
||||
freedtoa(s0);
|
||||
return b;
|
||||
}
|
||||
}
|
||||
|
||||
char *
|
||||
char *
|
||||
__gdtoa_add_nanbits(char *b, size_t blen, ULong *bits, int nb)
|
||||
{
|
||||
ULong t;
|
||||
char *rv;
|
||||
int i, j;
|
||||
size_t L;
|
||||
static char Hexdig[16] = "0123456789abcdef";
|
||||
|
||||
while(!bits[--nb])
|
||||
if (!nb)
|
||||
return b;
|
||||
|
@ -183,14 +137,14 @@ __gdtoa_add_nanbits(char *b, size_t blen, ULong *bits, int nb)
|
|||
b += L;
|
||||
*--b = 0;
|
||||
rv = b;
|
||||
*--b = /*(*/ ')';
|
||||
*--b = ')';
|
||||
for(i = 0; i < nb; ++i) {
|
||||
t = bits[i];
|
||||
for(j = 0; j < 8; ++j, t >>= 4)
|
||||
*--b = Hexdig[t & 0xf];
|
||||
}
|
||||
t = bits[nb];
|
||||
do *--b = Hexdig[t & 0xf]; while(t >>= 4);
|
||||
*--b = '('; /*)*/
|
||||
return rv;
|
||||
*--b = HEXDIG[t & 0xf];
|
||||
}
|
||||
t = bits[nb];
|
||||
do *--b = HEXDIG[t & 0xf]; while(t >>= 4);
|
||||
*--b = '(';
|
||||
return rv;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue