mirror of
git://git.sv.gnu.org/coreutils.git
synced 2026-04-21 11:16:16 +02:00
.
This commit is contained in:
48
lib/xstrtod.c
Normal file
48
lib/xstrtod.c
Normal file
@@ -0,0 +1,48 @@
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#ifdef STDC_HEADERS
|
||||
#include <stdlib.h>
|
||||
#else
|
||||
double strtod ();
|
||||
#endif
|
||||
|
||||
#include <errno.h>
|
||||
#include <stdio.h>
|
||||
#include <limits.h>
|
||||
#include <ctype.h>
|
||||
#include "xstrtod.h"
|
||||
|
||||
int
|
||||
xstrtod (str, ptr, result)
|
||||
const char *str;
|
||||
const char **ptr;
|
||||
double *result;
|
||||
{
|
||||
double val;
|
||||
char *terminator;
|
||||
int fail;
|
||||
|
||||
fail = 0;
|
||||
errno = 0;
|
||||
val = strtod (str, &terminator);
|
||||
|
||||
/* Having a non-zero terminator is an error only when PTR is NULL. */
|
||||
if (terminator == str || (ptr == NULL && *terminator != '\0'))
|
||||
fail = 1;
|
||||
else
|
||||
{
|
||||
/* Allow underflow (in which case strtod returns zero),
|
||||
but flag overflow as an error. */
|
||||
if (val != 0.0 && errno == ERANGE)
|
||||
fail = 1;
|
||||
}
|
||||
|
||||
if (ptr != NULL)
|
||||
*ptr = terminator;
|
||||
|
||||
*result = val;
|
||||
return fail;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user