OpenCores
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);
}
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.