diff options
Diffstat (limited to 'misc/efgcvt-template.c')
-rw-r--r-- | misc/efgcvt-template.c | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/misc/efgcvt-template.c b/misc/efgcvt-template.c new file mode 100644 index 0000000000..aeb4e1ea01 --- /dev/null +++ b/misc/efgcvt-template.c @@ -0,0 +1,78 @@ +/* Compatibility functions for floating point formatting. + Copyright (C) 1995-2019 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <https://www.gnu.org/licenses/>. */ + +#include <math.h> +#include <stdio.h> +#include <stdlib.h> +#include <sys/param.h> +#include <libc-lock.h> +#include <math_ldbl_opt.h> + +#define APPEND(a, b) APPEND2 (a, b) +#define APPEND2(a, b) a##b +#define __APPEND(a, b) __APPEND2 (a, b) +#define __APPEND2(a, b) __##a##b + + +#define FCVT_BUFFER APPEND (FUNC_PREFIX, fcvt_buffer) +#define FCVT_BUFPTR APPEND (FUNC_PREFIX, fcvt_bufptr) +#define ECVT_BUFFER APPEND (FUNC_PREFIX, ecvt_buffer) + + +static char FCVT_BUFFER[MAXDIG]; +static char ECVT_BUFFER[MAXDIG]; +libc_freeres_ptr (static char *FCVT_BUFPTR); + +char * +__APPEND (FUNC_PREFIX, fcvt) (FLOAT_TYPE value, int ndigit, int *decpt, + int *sign) +{ + if (FCVT_BUFPTR == NULL) + { + if (__APPEND (FUNC_PREFIX, fcvt_r) (value, ndigit, decpt, sign, + FCVT_BUFFER, MAXDIG) != -1) + return FCVT_BUFFER; + + FCVT_BUFPTR = (char *) malloc (FCVT_MAXDIG); + if (FCVT_BUFPTR == NULL) + return FCVT_BUFFER; + } + + (void) __APPEND (FUNC_PREFIX, fcvt_r) (value, ndigit, decpt, sign, + FCVT_BUFPTR, FCVT_MAXDIG); + + return FCVT_BUFPTR; +} + + +char * +__APPEND (FUNC_PREFIX, ecvt) (FLOAT_TYPE value, int ndigit, int *decpt, + int *sign) +{ + (void) __APPEND (FUNC_PREFIX, ecvt_r) (value, ndigit, decpt, sign, + ECVT_BUFFER, MAXDIG); + + return ECVT_BUFFER; +} + +char * +__APPEND (FUNC_PREFIX, gcvt) (FLOAT_TYPE value, int ndigit, char *buf) +{ + sprintf (buf, "%.*" FLOAT_FMT_FLAG "g", MIN (ndigit, NDIGIT_MAX), value); + return buf; +} |