mirror of
git://sourceware.org/git/newlib-cygwin.git
synced 2025-01-17 03:49:46 +08:00
84ba25226c
Throughout, simplify the C99/C11 conditionals, and replace __STRICT_ANSI__ with the proper internal POSIX macros. The _*_r reentrant functions need not be guarded (and most haven't been) because such names in the global scope are reserved to the implementation. atoff is unique to newlib. dtoa is not actually exported (_dtoa_r is used internally), is nonstandard, and the declaration conflicts with the code included in MySQL, NSPR, and SpiderMonkey. mktemp was removed in POSIX.1-2001. The qsort_r declarations are reordered so that the GNU version retains precedence. Signed-off-by: Yaakov Selkowitz <yselkowi@redhat.com>
209 lines
4.8 KiB
C
209 lines
4.8 KiB
C
/*
|
|
FUNCTION
|
|
<<ecvt>>, <<ecvtf>>, <<fcvt>>, <<fcvtf>>---double or float to string
|
|
|
|
INDEX
|
|
ecvt
|
|
INDEX
|
|
ecvtf
|
|
INDEX
|
|
fcvt
|
|
INDEX
|
|
fcvtf
|
|
|
|
ANSI_SYNOPSIS
|
|
#include <stdlib.h>
|
|
|
|
char *ecvt(double <[val]>, int <[chars]>, int *<[decpt]>, int *<[sgn]>);
|
|
char *ecvtf(float <[val]>, int <[chars]>, int *<[decpt]>, int *<[sgn]>);
|
|
|
|
char *fcvt(double <[val]>, int <[decimals]>,
|
|
int *<[decpt]>, int *<[sgn]>);
|
|
char *fcvtf(float <[val]>, int <[decimals]>,
|
|
int *<[decpt]>, int *<[sgn]>);
|
|
|
|
TRAD_SYNOPSIS
|
|
#include <stdlib.h>
|
|
|
|
char *ecvt(<[val]>, <[chars]>, <[decpt]>, <[sgn]>);
|
|
double <[val]>;
|
|
int <[chars]>;
|
|
int *<[decpt]>;
|
|
int *<[sgn]>;
|
|
char *ecvtf(<[val]>, <[chars]>, <[decpt]>, <[sgn]>);
|
|
float <[val]>;
|
|
int <[chars]>;
|
|
int *<[decpt]>;
|
|
int *<[sgn]>;
|
|
|
|
char *fcvt(<[val]>, <[decimals]>, <[decpt]>, <[sgn]>);
|
|
double <[val]>;
|
|
int <[decimals]>;
|
|
int *<[decpt]>;
|
|
int *<[sgn]>;
|
|
char *fcvtf(<[val]>, <[decimals]>, <[decpt]>, <[sgn]>);
|
|
float <[val]>;
|
|
int <[decimals]>;
|
|
int *<[decpt]>;
|
|
int *<[sgn]>;
|
|
|
|
DESCRIPTION
|
|
<<ecvt>> and <<fcvt>> produce (null-terminated) strings of digits
|
|
representating the <<double>> number <[val]>.
|
|
<<ecvtf>> and <<fcvtf>> produce the corresponding character
|
|
representations of <<float>> numbers.
|
|
|
|
(The <<stdlib>> functions <<ecvtbuf>> and <<fcvtbuf>> are reentrant
|
|
versions of <<ecvt>> and <<fcvt>>.)
|
|
|
|
The only difference between <<ecvt>> and <<fcvt>> is the
|
|
interpretation of the second argument (<[chars]> or <[decimals]>).
|
|
For <<ecvt>>, the second argument <[chars]> specifies the total number
|
|
of characters to write (which is also the number of significant digits
|
|
in the formatted string, since these two functions write only digits).
|
|
For <<fcvt>>, the second argument <[decimals]> specifies the number of
|
|
characters to write after the decimal point; all digits for the integer
|
|
part of <[val]> are always included.
|
|
|
|
Since <<ecvt>> and <<fcvt>> write only digits in the output string,
|
|
they record the location of the decimal point in <<*<[decpt]>>>, and
|
|
the sign of the number in <<*<[sgn]>>>. After formatting a number,
|
|
<<*<[decpt]>>> contains the number of digits to the left of the
|
|
decimal point. <<*<[sgn]>>> contains <<0>> if the number is positive,
|
|
and <<1>> if it is negative.
|
|
|
|
RETURNS
|
|
All four functions return a pointer to the new string containing a
|
|
character representation of <[val]>.
|
|
|
|
PORTABILITY
|
|
None of these functions are ANSI C.
|
|
|
|
Supporting OS subroutines required: <<close>>, <<fstat>>, <<isatty>>,
|
|
<<lseek>>, <<read>>, <<sbrk>>, <<write>>.
|
|
|
|
NEWPAGE
|
|
FUNCTION
|
|
<<gcvt>>, <<gcvtf>>---format double or float as string
|
|
|
|
INDEX
|
|
gcvt
|
|
INDEX
|
|
gcvtf
|
|
|
|
ANSI_SYNOPSIS
|
|
#include <stdlib.h>
|
|
|
|
char *gcvt(double <[val]>, int <[precision]>, char *<[buf]>);
|
|
char *gcvtf(float <[val]>, int <[precision]>, char *<[buf]>);
|
|
|
|
TRAD_SYNOPSIS
|
|
#include <stdlib.h>
|
|
|
|
char *gcvt(<[val]>, <[precision]>, <[buf]>);
|
|
double <[val]>;
|
|
int <[precision]>;
|
|
char *<[buf]>;
|
|
char *gcvtf(<[val]>, <[precision]>, <[buf]>);
|
|
float <[val]>;
|
|
int <[precision]>;
|
|
char *<[buf]>;
|
|
|
|
DESCRIPTION
|
|
<<gcvt>> writes a fully formatted number as a null-terminated
|
|
string in the buffer <<*<[buf]>>>. <<gcvtf>> produces corresponding
|
|
character representations of <<float>> numbers.
|
|
|
|
<<gcvt>> uses the same rules as the <<printf>> format
|
|
`<<%.<[precision]>g>>'---only negative values are signed (with
|
|
`<<->>'), and either exponential or ordinary decimal-fraction format
|
|
is chosen depending on the number of significant digits (specified by
|
|
<[precision]>).
|
|
|
|
RETURNS
|
|
The result is a pointer to the formatted representation of <[val]>
|
|
(the same as the argument <[buf]>).
|
|
|
|
PORTABILITY
|
|
Neither function is ANSI C.
|
|
|
|
Supporting OS subroutines required: <<close>>, <<fstat>>, <<isatty>>,
|
|
<<lseek>>, <<read>>, <<sbrk>>, <<write>>.
|
|
*/
|
|
|
|
#define _XOPEN_SOURCE
|
|
#define _XOPEN_SOURCE_EXTENDED
|
|
#include <_ansi.h>
|
|
#include <reent.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include "local.h"
|
|
|
|
char *
|
|
_DEFUN (fcvt, (d, ndigit, decpt, sign),
|
|
double d _AND
|
|
int ndigit _AND
|
|
int *decpt _AND
|
|
int *sign)
|
|
{
|
|
return fcvtbuf (d, ndigit, decpt, sign, NULL);
|
|
}
|
|
|
|
char *
|
|
_DEFUN (fcvtf, (d, ndigit, decpt, sign),
|
|
float d _AND
|
|
int ndigit _AND
|
|
int *decpt _AND
|
|
int *sign)
|
|
{
|
|
return fcvt ((float) d, ndigit, decpt, sign);
|
|
}
|
|
|
|
|
|
char *
|
|
_DEFUN (gcvtf, (d, ndigit, buf),
|
|
float d _AND
|
|
int ndigit _AND
|
|
char *buf)
|
|
{
|
|
double asd = d;
|
|
return gcvt (asd, ndigit, buf);
|
|
}
|
|
|
|
|
|
char *
|
|
_DEFUN (ecvt, (d, ndigit, decpt, sign),
|
|
double d _AND
|
|
int ndigit _AND
|
|
int *decpt _AND
|
|
int *sign)
|
|
{
|
|
return ecvtbuf (d, ndigit, decpt, sign, NULL);
|
|
}
|
|
|
|
char *
|
|
_DEFUN (ecvtf, (d, ndigit, decpt, sign),
|
|
float d _AND
|
|
int ndigit _AND
|
|
int *decpt _AND
|
|
int *sign)
|
|
{
|
|
return ecvt ((double) d, ndigit, decpt, sign);
|
|
}
|
|
|
|
|
|
char *
|
|
_DEFUN (gcvt, (d, ndigit, buf),
|
|
double d _AND
|
|
int ndigit _AND
|
|
char *buf)
|
|
{
|
|
char *tbuf = buf;
|
|
if (d < 0) {
|
|
*buf = '-';
|
|
buf++;
|
|
ndigit--;
|
|
}
|
|
return (_gcvt (_REENT, d, ndigit, buf, 'g', 0) ? tbuf : 0);
|
|
}
|