URL
https://opencores.org/ocsvn/or1k/or1k/trunk
Subversion Repositories or1k
[/] [or1k/] [trunk/] [newlib/] [newlib/] [libc/] [stdlib/] [efgcvt.c] - Rev 1765
Compare with Previous | Blame | View Log
/* FUNCTION <<ecvt>>,<<ecvtf>>,<<fcvt>>,<<fcvtf>>---double or float to string INDEX ecvt INDEX fcvt 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 <<gvcvt>>, <<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]>>>. <<gdvtf>> 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>>. */ #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); }