Module Name: src Committed By: christos Date: Fri Jan 16 18:37:21 UTC 2015
Modified Files: src/lib/libc/stdlib: Makefile.inc strtol.3 strtoul.3 Log Message: strtoi and strtou additions To generate a diff of this commit: cvs rdiff -u -r1.83 -r1.84 src/lib/libc/stdlib/Makefile.inc cvs rdiff -u -r1.26 -r1.27 src/lib/libc/stdlib/strtol.3 cvs rdiff -u -r1.25 -r1.26 src/lib/libc/stdlib/strtoul.3 Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/lib/libc/stdlib/Makefile.inc diff -u src/lib/libc/stdlib/Makefile.inc:1.83 src/lib/libc/stdlib/Makefile.inc:1.84 --- src/lib/libc/stdlib/Makefile.inc:1.83 Wed Dec 10 11:55:54 2014 +++ src/lib/libc/stdlib/Makefile.inc Fri Jan 16 13:37:21 2015 @@ -1,4 +1,4 @@ -# $NetBSD: Makefile.inc,v 1.83 2014/12/10 16:55:54 pooka Exp $ +# $NetBSD: Makefile.inc,v 1.84 2015/01/16 18:37:21 christos Exp $ # from: @(#)Makefile.inc 8.3 (Berkeley) 2/4/95 # stdlib sources @@ -13,6 +13,7 @@ SRCS+= _env.c _rand48.c \ nrand48.c putenv.c qabs.c qdiv.c qsort.c posix_openpt.c pty.c \ quick_exit.c radixsort.c rand.c rand_r.c random.c remque.c \ seed48.c setenv.c srand48.c strsuftoll.c \ + strtoi.c strtou.c \ strtoimax.c strtol.c strtoll.c strtoq.c strtoul.c strtoull.c \ strtoumax.c strtouq.c system.c tdelete.c tfind.c tsearch.c twalk.c \ unsetenv.c strfmon.c @@ -86,7 +87,9 @@ MLINKS+=strtod.3 strtof.3 strtod.3 strto MLINKS+=strtol.3 strtoimax.3 MLINKS+=strtol.3 strtoll.3 MLINKS+=strtol.3 strtoq.3 +MLINKS+=strtol.3 strtoi.3 MLINKS+=strtoul.3 strtoull.3 MLINKS+=strtoul.3 strtoumax.3 MLINKS+=strtoul.3 strtouq.3 +MLINKS+=strtoul.3 strtou.3 MLINKS+=tsearch.3 tfind.3 tsearch.3 twalk.3 tsearch.3 tdelete.3 Index: src/lib/libc/stdlib/strtol.3 diff -u src/lib/libc/stdlib/strtol.3:1.26 src/lib/libc/stdlib/strtol.3:1.27 --- src/lib/libc/stdlib/strtol.3:1.26 Thu Jul 23 09:38:57 2009 +++ src/lib/libc/stdlib/strtol.3 Fri Jan 16 13:37:21 2015 @@ -1,4 +1,4 @@ -.\" $NetBSD: strtol.3,v 1.26 2009/07/23 13:38:57 wiz Exp $ +.\" $NetBSD: strtol.3,v 1.27 2015/01/16 18:37:21 christos Exp $ .\" .\" Copyright (c) 1990, 1991, 1993 .\" The Regents of the University of California. All rights reserved. @@ -33,10 +33,11 @@ .\" .\" from: @(#)strtol.3 8.1 (Berkeley) 6/4/93 .\" -.Dd July 23, 2009 +.Dd December 27, 2014 .Dt STRTOL 3 .Os .Sh NAME +.Nm strtoi , .Nm strtol , .Nm strtoll , .Nm strtoimax , @@ -53,6 +54,8 @@ .Fn strtoll "const char * restrict nptr" "char ** restrict endptr" "int base" .Pp .In inttypes.h +.Ft intmax_t +.Fn strtoi "const char * restrict nptr" "char ** restrict endptr" "int base" "intmax_t lo" "intmax_t hi" "int *rerror" .Ft intmax_t .Fn strtoimax "const char * restrict nptr" "char ** restrict endptr" "int base" .Pp @@ -87,6 +90,27 @@ to an .Ft intmax_t value. The +.Fn strtoi +function +is using internally +.Fn strtoimax +and ensures that the result is always in the range [ +.Fa lo .. +.Fa hi +]. +In adddition it always places +.Dv 0 +on success or an error value in the +.Fa rerror +argument, avoiding the +.Dv errno +gymnastics the other functions require. +The +.Fa rerror +argument can be +.Dv NULL +if errors are to be ignored. +The .Fn strtoq function converts the string in @@ -156,6 +180,15 @@ is on return, the entire string was valid.) .Sh RETURN VALUES The +.Fn strtoi +function +always returns the closest value in the range specified by +the +.Fa lo +and +.Fa hi +arguments. +The .Fn strtol function returns the result of the conversion, @@ -200,6 +233,21 @@ is left unchanged. This behavior (which is unlike most library functions) is guaranteed by the pertinent standards. .Sh EXAMPLES +The +.Fn strtoi +function is the simplest to use: +.Bd -literal -offset indent +int e; +intmax_t lval = strtoi(buf, NULL, 0, 1, 99, &e); +if (e) + warn("conversion of `%s' to a number failed, using %jd", + buf, lval); +.Ed +.Pp +This will always return a number in +.Dv [1..99] +range no matter what the input is, and warn if the conversion failed. +.Pp Because the return value of .Fn strtol cannot be used unambiguously to detect an error, @@ -269,12 +317,31 @@ is not between 2 and 36 and does not con .It Bq Er ERANGE The given string was out of range; the value converted has been clamped. .El +.Pp +In addition to the above errors +.Fn strtoi +returns: +.Bl -tag -width Er +.It Bq Er ECANCELED +The string did not contain any characters that could be converted. +.It Bq Er ENOTSUP +The string contained non-numeric characters that did not get converted. +In this case, +.Fa endptr +points to the first unconverted character. +.It Bq Er ERANGE +The range given was invalid, i.e. +.Fa lo +\*[Gt] +.Fa hi . +.El .Sh SEE ALSO .Xr atof 3 , .Xr atoi 3 , .Xr atol 3 , .Xr atoll 3 , .Xr strtod 3 , +.Xr strtou 3 , .Xr strtoul 3 , .Xr strtoull 3 , .Xr strtoumax 3 @@ -290,5 +357,9 @@ and .Fn strtoimax functions conform to .St -isoC-99 . +The +.Fn strtoi +function appeared in +.Nx 8 . .Sh BUGS Ignores the current locale. Index: src/lib/libc/stdlib/strtoul.3 diff -u src/lib/libc/stdlib/strtoul.3:1.25 src/lib/libc/stdlib/strtoul.3:1.26 --- src/lib/libc/stdlib/strtoul.3:1.25 Wed Dec 2 07:50:27 2009 +++ src/lib/libc/stdlib/strtoul.3 Fri Jan 16 13:37:21 2015 @@ -1,4 +1,4 @@ -.\" $NetBSD: strtoul.3,v 1.25 2009/12/02 12:50:27 pooka Exp $ +.\" $NetBSD: strtoul.3,v 1.26 2015/01/16 18:37:21 christos Exp $ .\" .\" Copyright (c) 1990, 1991, 1993 .\" The Regents of the University of California. All rights reserved. @@ -33,10 +33,11 @@ .\" .\" from: @(#)strtoul.3 8.1 (Berkeley) 6/4/93 .\" -.Dd December 2, 2009 +.Dd December 27, 2014 .Dt STRTOUL 3 .Os .Sh NAME +.Nm strtou , .Nm strtoul , .Nm strtoull , .Nm strtoumax , @@ -53,6 +54,8 @@ .Fn strtoull "const char * restrict nptr" "char ** restrict endptr" "int base" .Pp .In inttypes.h +.Ft uintmax_t +.Fn strtou "const char * restrict nptr" "char ** restrict endptr" "int base" "uintmax_t lo" "uintmax_t hi" "int *rerror" .Ft uintmax_t .Fn strtoumax "const char * restrict nptr" "char ** restrict endptr" "int base" .Pp @@ -86,6 +89,26 @@ converts the string in to an .Ft uintmax_t value. +.Fn strtou +function +is using internally +.Fn strtoumax +and ensures that the result is always in the range [ +.Fa lo .. +.Fa hi +]. +In adddition it always places +.Dv 0 +on success or an error value in the +.Fa rerror +argument, avoiding the +.Dv errno +gymnastics the other functions require. +The +.Fa rerror +argument can be +.Dv NULL +if errors are to be ignored. The .Fn strtouq function @@ -157,6 +180,15 @@ is on return, the entire string was valid.) .Sh RETURN VALUES The +.Fn strtou +function +always returns the closest value in the range specified by +the +.Fa lo +and +.Fa hi +arguments. +The .Fn strtoul function returns either the result of the conversion @@ -201,6 +233,21 @@ is left unchanged. This behavior (which is unlike most library functions) is guaranteed by the pertinent standards. .Sh EXAMPLES +The +.Fn strtou +function is the simplest to use: +.Bd -literal -offset indent +int e; +uintmax_t lval = strtou(buf, NULL, 0, 1, 99, &e); +if (e) + warn("conversion of `%s' to a number failed, using %ju", + buf, lval); +.Ed +.Pp +This will always return a number in +.Dv [1..99] +range no matter what the input is, and warn if the conversion failed. +.Pp Because the return value of .Fn strtoul cannot be used unambiguously to detect an error, @@ -243,7 +290,26 @@ is not between 2 and 36 and does not con .It Bq Er ERANGE The given string was out of range; the value converted has been clamped. .El +.Pp +In addition to the above errors +.Fn strtou +returns: +.Bl -tag -width Er +.It Bq Er ECANCELED +The string did not contain any characters that could be converted. +.It Bq Er ENOTSUP +The string contained non-numeric characters that did not get converted. +In this case, +.Fa endptr +points to the first unconverted character. +.It Bq Er ERANGE +The range given was invalid, i.e. +.Fa lo +\*[Gt] +.Fa hi . +.El .Sh SEE ALSO +.Xr strtoi 3 , .Xr strtoimax 3 , .Xr strtol 3 , .Xr strtoll 3 @@ -259,5 +325,9 @@ and .Fn strtoumax functions conform to .St -isoC-99 . +The +.Fn strtou +function appeared in +.Nx 8 . .Sh BUGS Ignores the current locale.