Date: Sat, 8 Feb 2003 14:59:21 +0100 From: Eirik Nygaard <eirikn@bluezone.no> To: standards@FreeBSD.ORG Subject: strtof() Message-ID: <20030208135921.GA72899@eirikn.net>
next in thread | raw e-mail | index | archive | help
--V0207lvV8h4k8FAm Content-Type: multipart/mixed; boundary="fUYQa+Pmc3FrFX/N" Content-Disposition: inline --fUYQa+Pmc3FrFX/N Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable I tave made a strtof(3) function. Attached is the function, a small test program and the man page. I will also start on the strtold(3) now. --=20 Eirik Nygaard <eirikn@bluezone.no> PGP Key: 83C55EDE --fUYQa+Pmc3FrFX/N Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="strtof.c" Content-Transfer-Encoding: quoted-printable /* * * Copyright (c) 2003 Eirik Nygaard <eirikn@bluezone.no> * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPO= SE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTI= AL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRI= CT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #include <sys/cdefs.h> __FBSDID("$FreeBSD$"); #include <float.h> #include <errno.h> #include <stdlib.h> float strtof(const char * __restrict nptr, char ** __restrict endptr) { char c; const char *s; float acc, decnum; int neg, any, dec, deccnt, a; =09 s =3D nptr; do { c =3D *s++; } while (isspace((unsigned char)c)); if (c =3D=3D '-') { neg =3D 1; c =3D *s++; } else { neg =3D 0; if (c =3D=3D '+') c =3D *s++; } =09 any =3D acc =3D dec =3D 0; for ( ; ; c =3D *s++) { if (c =3D=3D '.') { dec =3D 1; deccnt =3D 0; continue; } if (c >=3D '0' && c <=3D '9') c -=3D '0'; else break; any =3D 1; if (dec) { deccnt++; a =3D deccnt; decnum =3D c; for (; a > 0; a--) decnum /=3D 10; if ((FLT_MAX - decnum < acc) && !neg) { any =3D -1; break; } if ((FLT_MIN + decnum < acc) && neg) { any =3D -1; break; } else { if (neg) acc -=3D decnum; else acc +=3D decnum; } } else { any =3D 1; acc *=3D 10; if ((FLT_MAX - c < acc) && !neg) { any =3D -1; break; } if ((FLT_MIN + c < acc) && neg) { any =3D -1; break; } else { if (neg) acc -=3D c; else acc +=3D c; } } } if (any < 0) { acc =3D neg ? FLT_MIN : FLT_MAX; errno =3D ERANGE; } else if (!any) errno =3D EINVAL; =09 if (endptr !=3D NULL) *endptr =3D (char *)(any ? s - 1 : nptr); return (acc); } --fUYQa+Pmc3FrFX/N Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="strtof.3" .\" Copyright (c) 2003 Eirik Nygaard <eirikn@bluezone.no> .\" All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE .\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" .\" $FreeBSD$ .\" .Dd February 8, 2003 .Dt STRTOF 3 .Os .Sh NAME .Nm strtof .Nd "convert a string value to a" .Vt float .Sh LIBRARY .Lb libc .Sh SYNOPSIS .In stdlib.h .Ft float .Fn strtof "const char * restrict nptr" "char ** restrict endptr" .Sh DESCRIPTION The .Fn strtof function converts the string in .Fa nptr to a .Vt float value. .Pp The string may begin with an arbitrary amount of white space (as determined by .Xr isspace 3 ) followed by a single optional .Ql + or .Ql - sign. .Pp The remainder of the string is converted to a .Vt float value in the obvious manner, stopping at the first character which is not a valid digit. .Pp If .Fa endptr is not .Dv NULL , .Fn strtof stores the address of the first invalid character in .Fa *endptr . If there were no digits at all, however, .Fn strtof stores the original value of .Fa nptr in .Fa *endptr . (Thus, if .Fa *nptr is not .Ql \e0 but .Fa **endptr is .Ql \e0 on return, the entire string was valid.) .Sh RETURN VALUES The .Fn strtof , function return the result of the conversion, unless the value would underflow or overflow. If no conversion could be performed, 0 is returned and the global variable .Va errno is set to .Er EINVAL . If an overflow or underflow occurs, .Va errno is set to .Er ERANGE and the function return value is clamped according to the following table. .Bl -column -offset indent ".Fn strtoimax" ".Sy overflow" ".Sy underflow" .It Sy Function Ta Sy overflow Ta Sy underflow .It Fn strtof Ta Dv FLT_MIN Ta Dv FLT_MAX .El .Sh ERRORS .Bl -tag -width Er .It Bq Er EINVAL The value of .Fa base is not supported or no conversion could be performed. .It Bq Er ERANGE The given string was out of range; the value converted has been clamped. .El .Sh SEE ALSO .Xr atof 3 , .Xr atoi 3 , .Xr atol 3 , .Xr strtod 3 , .Xr strtoul 3 , .Xr strtol 3 , .Xr wcstol 3 .Sh STANDARDS The .Fn strtof function conform to .St -isoC-99 . --fUYQa+Pmc3FrFX/N Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="mainstrtof.c" #include <stdio.h> #include <stdlib.h> #include <errno.h> int main () { char *endp; float f; f = strtof("-5214.452", &endp); if (errno == ERANGE) printf("ERANGE\n"); else if (errno == EINVAL) printf("EINVAL\n"); else printf("It's a float with value %f\n", f); return 0; } --fUYQa+Pmc3FrFX/N-- --V0207lvV8h4k8FAm Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.1 (FreeBSD) iD8DBQE+RQ041JB0Z4PFXt4RAkWrAJ4vFB2in8LMK96RwR0Dnx27Iow9pQCfYjmK jK1lrlDu/f+tSW4VlxBzAtM= =M8ed -----END PGP SIGNATURE----- --V0207lvV8h4k8FAm-- To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-standards" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20030208135921.GA72899>