From 6388df8cda57f49e9246c89582edd244a07969d4 Mon Sep 17 00:00:00 2001 From: millert <> Date: Fri, 13 Jan 2006 17:58:09 +0000 Subject: [PATCH] Add lldiv(), imaxabs(), imaxdiv(), strtoimax() and strtoumax() --- src/include/inttypes.h | 14 +++- src/include/stdlib.h | 11 ++- src/lib/libc/stdlib/Makefile.inc | 21 ++--- src/lib/libc/stdlib/abs.3 | 3 +- src/lib/libc/stdlib/div.3 | 4 +- src/lib/libc/stdlib/imaxabs.3 | 66 +++++++++++++++ src/lib/libc/stdlib/imaxabs.c | 38 +++++++++ src/lib/libc/stdlib/imaxdiv.3 | 67 +++++++++++++++ src/lib/libc/stdlib/imaxdiv.c | 50 +++++++++++ src/lib/libc/stdlib/labs.3 | 3 +- src/lib/libc/stdlib/ldiv.3 | 4 +- src/lib/libc/stdlib/lldiv.3 | 67 +++++++++++++++ src/lib/libc/stdlib/lldiv.c | 50 +++++++++++ src/lib/libc/stdlib/qabs.3 | 3 +- src/lib/libc/stdlib/qdiv.3 | 4 +- src/lib/libc/stdlib/strtoimax.c | 140 +++++++++++++++++++++++++++++++ src/lib/libc/stdlib/strtol.3 | 68 ++++++++------- src/lib/libc/stdlib/strtoul.3 | 69 ++++++++------- src/lib/libc/stdlib/strtoumax.c | 102 ++++++++++++++++++++++ 19 files changed, 706 insertions(+), 78 deletions(-) create mode 100644 src/lib/libc/stdlib/imaxabs.3 create mode 100644 src/lib/libc/stdlib/imaxabs.c create mode 100644 src/lib/libc/stdlib/imaxdiv.3 create mode 100644 src/lib/libc/stdlib/imaxdiv.c create mode 100644 src/lib/libc/stdlib/lldiv.3 create mode 100644 src/lib/libc/stdlib/lldiv.c create mode 100644 src/lib/libc/stdlib/strtoimax.c create mode 100644 src/lib/libc/stdlib/strtoumax.c diff --git a/src/include/inttypes.h b/src/include/inttypes.h index 1a0773c4..bc128433 100644 --- a/src/include/inttypes.h +++ b/src/include/inttypes.h @@ -1,4 +1,4 @@ -/* $OpenBSD: inttypes.h,v 1.6 2006/01/06 18:54:25 millert Exp $ */ +/* $OpenBSD: inttypes.h,v 1.7 2006/01/13 17:58:09 millert Exp $ */ /* * Copyright (c) 1997, 2005 Todd C. Miller @@ -286,6 +286,16 @@ #endif /* __cplusplus || __STDC_FORMAT_MACROS */ -/* XXX - need to add imax/umax functions */ +typedef struct { + intmax_t quot; /* quotient */ + intmax_t rem; /* remainder */ +} imaxdiv_t; + +__BEGIN_DECLS +intmax_t imaxabs(intmax_t); +imaxdiv_t imaxdiv(intmax_t, intmax_t); +intmax_t strtoimax(const char *, char **, int); +uintmax_t strtoumax(const char *, char **, int); +__END_DECLS #endif /* _INTTYPES_H_ */ diff --git a/src/include/stdlib.h b/src/include/stdlib.h index 5edd8236..c73b6465 100644 --- a/src/include/stdlib.h +++ b/src/include/stdlib.h @@ -1,4 +1,4 @@ -/* $OpenBSD: stdlib.h,v 1.36 2006/01/06 18:53:04 millert Exp $ */ +/* $OpenBSD: stdlib.h,v 1.37 2006/01/13 17:58:09 millert Exp $ */ /* $NetBSD: stdlib.h,v 1.25 1995/12/27 21:19:08 jtc Exp $ */ /*- @@ -62,6 +62,13 @@ typedef struct { long rem; /* remainder */ } ldiv_t; +#if __ISO_C_VISIBLE >= 1999 +typedef struct { + long long quot; /* quotient */ + long long rem; /* remainder */ +} lldiv_t; +#endif + #if __BSD_VISIBLE typedef struct { quad_t quot; /* quotient */ @@ -182,7 +189,7 @@ void *valloc(size_t); /* obsoleted by malloc() */ /* * ISO C99 */ -#if __BSD_VISIBLE || __ISO_C_VISIBLE >= 1999 +#if __ISO_C_VISIBLE >= 1999 long long atoll(const char *); long long diff --git a/src/lib/libc/stdlib/Makefile.inc b/src/lib/libc/stdlib/Makefile.inc index ba81d5ee..c7ee0a80 100644 --- a/src/lib/libc/stdlib/Makefile.inc +++ b/src/lib/libc/stdlib/Makefile.inc @@ -1,14 +1,14 @@ -# $OpenBDS: Makefile.inc,v 1.6 1996/08/21 03:47:21 tholo Exp $ +# $OpenBSD: Makefile.inc,v 1.35 2006/01/13 17:58:09 millert Exp $ # stdlib sources .PATH: ${LIBCSRCDIR}/arch/${MACHINE_ARCH}/stdlib ${LIBCSRCDIR}/stdlib SRCS+= a64l.c abort.c atexit.c atoi.c atof.c atol.c atoll.c bsearch.c \ calloc.c cfree.c exit.c ecvt.c gcvt.c getenv.c getopt_long.c \ - getsubopt.c hcreate.c heapsort.c l64a.c llabs.c lsearch.c malloc.c \ - merge.c putenv.c qsort.c radixsort.c rand.c random.c \ - realpath.c setenv.c strtod.c strtol.c strtoll.c strtonum.c strtoul.c \ - strtoull.c system.c \ + getsubopt.c hcreate.c heapsort.c imaxabs.c imaxdiv.c l64a.c llabs.c \ + lldiv.c lsearch.c malloc.c merge.c putenv.c qsort.c radixsort.c rand.c \ + random.c realpath.c setenv.c strtoimax.c strtod.c strtol.c strtoll.c \ + strtonum.c strtoul.c strtoull.c strtoumax.c system.c \ tfind.c tsearch.c _rand48.c drand48.c erand48.c jrand48.c lcong48.c \ lrand48.c mrand48.c nrand48.c seed48.c srand48.c qabs.c qdiv.c _Exit.c @@ -41,9 +41,10 @@ SRCS+= insque.c remque.c MAN+= a64l.3 abort.3 abs.3 alloca.3 atexit.3 atof.3 atoi.3 atol.3 atoll.3 \ bsearch.3 div.3 ecvt.3 exit.3 getenv.3 getopt.3 getopt_long.3 \ - getsubopt.3 hcreate.3 insque.3 labs.3 ldiv.3 lsearch.3 malloc.3 qabs.3 \ - qdiv.3 qsort.3 radixsort.3 rand48.3 rand.3 random.3 realpath.3 \ - strtod.3 strtonum.3 strtol.3 strtoul.3 system.3 tsearch.3 + getsubopt.3 hcreate.3 imaxabs.3 imaxdiv.3 insque.3 labs.3 ldiv.3 \ + lldiv.3 lsearch.3 malloc.3 qabs.3 qdiv.3 qsort.3 radixsort.3 rand48.3 \ + rand.3 random.3 realpath.3 strtod.3 strtonum.3 strtol.3 strtoul.3 \ + system.3 tsearch.3 MLINKS+=exit.3 _Exit.3 MLINKS+=ecvt.3 fcvt.3 ecvt.3 gcvt.3 @@ -63,8 +64,8 @@ MLINKS+=random.3 srandom.3 random.3 srandomdev.3 MLINKS+=rand48.3 drand48.3 rand48.3 erand48.3 rand48.3 lrand48.3 MLINKS+=rand48.3 mrand48.3 rand48.3 nrand48.3 rand48.3 jrand48.3 MLINKS+=rand48.3 srand48.3 rand48.3 seed48.3 rand48.3 lcong48.3 -MLINKS+=strtol.3 strtoll.3 strtol.3 strtoq.3 -MLINKS+=strtoul.3 strtoull.3 strtoul.3 strtouq.3 +MLINKS+=strtol.3 strtoll.3 strtol.3 strtoq.3 strtol.3 strtoimax.3 +MLINKS+=strtoul.3 strtoull.3 strtoul.3 strtouq.3 strtoul.3 strtoumax.3 MLINKS+=tsearch.3 tfind.3 MLINKS+=tsearch.3 tdelete.3 MLINKS+=tsearch.3 twalk.3 diff --git a/src/lib/libc/stdlib/abs.3 b/src/lib/libc/stdlib/abs.3 index f0a6b8a2..fc0b20b7 100644 --- a/src/lib/libc/stdlib/abs.3 +++ b/src/lib/libc/stdlib/abs.3 @@ -29,7 +29,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $OpenBSD: abs.3,v 1.6 2003/06/02 20:18:37 millert Exp $ +.\" $OpenBSD: abs.3,v 1.7 2006/01/13 17:58:09 millert Exp $ .\" .Dd June 29, 1991 .Dt ABS 3 @@ -54,6 +54,7 @@ function returns the absolute value. .Xr cabs 3 , .Xr floor 3 , .Xr hypot 3 , +.Xr imaxabs 3 , .Xr labs 3 , .Xr math 3 .Sh STANDARDS diff --git a/src/lib/libc/stdlib/div.3 b/src/lib/libc/stdlib/div.3 index a7561431..d6a9a002 100644 --- a/src/lib/libc/stdlib/div.3 +++ b/src/lib/libc/stdlib/div.3 @@ -27,7 +27,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $OpenBSD: div.3,v 1.7 2004/01/23 23:08:46 jmc Exp $ +.\" $OpenBSD: div.3,v 1.8 2006/01/13 17:58:09 millert Exp $ .\" .Dd April 19, 1991 .Dt DIV 3 @@ -53,7 +53,9 @@ members named and .Fa rem . .Sh SEE ALSO +.Xr imaxdiv 3 , .Xr ldiv 3 , +.Xr lldiv 3 , .Xr math 3 , .Xr qdiv 3 .Sh STANDARDS diff --git a/src/lib/libc/stdlib/imaxabs.3 b/src/lib/libc/stdlib/imaxabs.3 new file mode 100644 index 00000000..5384d0c9 --- /dev/null +++ b/src/lib/libc/stdlib/imaxabs.3 @@ -0,0 +1,66 @@ +.\" Copyright (c) 1990, 1991 The Regents of the University of California. +.\" All rights reserved. +.\" +.\" This code is derived from software contributed to Berkeley by +.\" the American National Standards Committee X3, on Information +.\" Processing Systems. +.\" +.\" 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. +.\" 3. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" 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. +.\" +.\" $OpenBSD: imaxabs.3,v 1.1 2006/01/13 17:58:09 millert Exp $ +.\" +.Dd January 6, 2005 +.Dt IMAXABS 3 +.Os +.Sh NAME +.Nm imaxabs +.Nd integer absolute value function +.Sh SYNOPSIS +.Fd #include +.Ft int +.Fn imaxabs "int j" +.Sh DESCRIPTION +The +.Fn imaxabs +function computes the absolute value of the intmax_t variable +.Fa j . +.Sh RETURN VALUES +The +.Fn imaxabs +function returns the absolute value. +.Sh SEE ALSO +.Xr abs 3 , +.Xr cabs 3 , +.Xr floor 3 , +.Xr hypot 3 , +.Xr labs 3 , +.Xr math 3 +.Sh STANDARDS +The +.Fn abs +function conforms to +.St -ansiC-99 . +.Sh BUGS +The absolute value of the most negative integer remains negative. diff --git a/src/lib/libc/stdlib/imaxabs.c b/src/lib/libc/stdlib/imaxabs.c new file mode 100644 index 00000000..b7e910ee --- /dev/null +++ b/src/lib/libc/stdlib/imaxabs.c @@ -0,0 +1,38 @@ +/* $OpenBSD: imaxabs.c,v 1.1 2006/01/13 17:58:09 millert Exp $ */ + +/*- + * Copyright (c) 1990 The Regents of the University of California. + * 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. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * 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. + */ + +#include + +intmax_t +imaxabs(intmax_t j) +{ + return (j < 0 ? -j : j); +} diff --git a/src/lib/libc/stdlib/imaxdiv.3 b/src/lib/libc/stdlib/imaxdiv.3 new file mode 100644 index 00000000..183cc91d --- /dev/null +++ b/src/lib/libc/stdlib/imaxdiv.3 @@ -0,0 +1,67 @@ +.\" Copyright (c) 1990, 1991 The Regents of the University of California. +.\" All rights reserved. +.\" +.\" This code is derived from software contributed to Berkeley by +.\" Chris Torek and the American National Standards Committee X3, +.\" on Information Processing Systems. +.\" +.\" 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. +.\" 3. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" 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. +.\" +.\" $OpenBSD: imaxdiv.3,v 1.1 2006/01/13 17:58:09 millert Exp $ +.\" +.Dd January 3, 2006 +.Dt IMAXDIV 3 +.Os +.Sh NAME +.Nm imaxdiv +.Nd return quotient and remainder from division +.Sh SYNOPSIS +.Fd #include +.Ft imaxdiv_t +.Fn ldiv "intmax_t num" "intmax_t denom" +.Sh DESCRIPTION +The +.Fn imaxdiv +function computes the value +.Fa num Ns / Ns Fa denom +and returns the quotient and remainder in a structure named +.Li imaxdiv_t +that contains two +.Li intmax_t +members named +.Fa quot +and +.Fa rem . +.Sh SEE ALSO +.Xr div 3 , +.Xr ldiv 3 , +.Xr lldiv 3 , +.Xr math 3 , +.Xr qdiv 3 +.Sh STANDARDS +The +.Fn imaxdiv +function conforms to +.St -ansiC-99 . diff --git a/src/lib/libc/stdlib/imaxdiv.c b/src/lib/libc/stdlib/imaxdiv.c new file mode 100644 index 00000000..0515a94b --- /dev/null +++ b/src/lib/libc/stdlib/imaxdiv.c @@ -0,0 +1,50 @@ +/* $OpenBSD: imaxdiv.c,v 1.1 2006/01/13 17:58:09 millert Exp $ */ +/* + * Copyright (c) 1990 Regents of the University of California. + * All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Chris Torek. + * + * 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. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * 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. + */ + +#include /* imaxdiv_t */ + +imaxdiv_t +imaxdiv(intmax_t num, intmax_t denom) +{ + imaxdiv_t r; + + /* see div.c for comments */ + + r.quot = num / denom; + r.rem = num % denom; + if (num >= 0 && r.rem < 0) { + r.quot++; + r.rem -= denom; + } + return (r); +} diff --git a/src/lib/libc/stdlib/labs.3 b/src/lib/libc/stdlib/labs.3 index 742f3eed..ab1ccaaf 100644 --- a/src/lib/libc/stdlib/labs.3 +++ b/src/lib/libc/stdlib/labs.3 @@ -29,7 +29,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $OpenBSD: labs.3,v 1.7 2003/07/21 20:20:04 millert Exp $ +.\" $OpenBSD: labs.3,v 1.8 2006/01/13 17:58:09 millert Exp $ .\" .Dd May 14, 2003 .Dt LABS 3 @@ -56,6 +56,7 @@ function returns the absolute value of the long long integer .Xr abs 3 , .Xr cabs 3 , .Xr floor 3 , +.Xr imaxabs 3 , .Xr math 3 .Sh STANDARDS The diff --git a/src/lib/libc/stdlib/ldiv.3 b/src/lib/libc/stdlib/ldiv.3 index 63e1f216..951a5807 100644 --- a/src/lib/libc/stdlib/ldiv.3 +++ b/src/lib/libc/stdlib/ldiv.3 @@ -29,7 +29,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $OpenBSD: ldiv.3,v 1.7 2004/01/23 23:08:46 jmc Exp $ +.\" $OpenBSD: ldiv.3,v 1.8 2006/01/13 17:58:09 millert Exp $ .\" .Dd June 29, 1991 .Dt LDIV 3 @@ -56,6 +56,8 @@ and .Fa rem . .Sh SEE ALSO .Xr div 3 , +.Xr imaxdiv 3 , +.Xr lldiv 3 , .Xr math 3 , .Xr qdiv 3 .Sh STANDARDS diff --git a/src/lib/libc/stdlib/lldiv.3 b/src/lib/libc/stdlib/lldiv.3 new file mode 100644 index 00000000..53bb3d35 --- /dev/null +++ b/src/lib/libc/stdlib/lldiv.3 @@ -0,0 +1,67 @@ +.\" Copyright (c) 1990, 1991 The Regents of the University of California. +.\" All rights reserved. +.\" +.\" This code is derived from software contributed to Berkeley by +.\" Chris Torek and the American National Standards Committee X3, +.\" on Information Processing Systems. +.\" +.\" 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. +.\" 3. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" 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. +.\" +.\" $OpenBSD: lldiv.3,v 1.1 2006/01/13 17:58:09 millert Exp $ +.\" +.Dd January 3, 2006 +.Dt LLDIV 3 +.Os +.Sh NAME +.Nm lldiv +.Nd return quotient and remainder from division +.Sh SYNOPSIS +.Fd #include +.Ft lldiv_t +.Fn lldiv "long long num" "long long denom" +.Sh DESCRIPTION +The +.Fn lldiv +function computes the value +.Fa num Ns / Ns Fa denom +and returns the quotient and remainder in a structure named +.Li lldiv_t +that contains two +.Li long long integer +members named +.Fa quot +and +.Fa rem . +.Sh SEE ALSO +.Xr div 3 , +.Xr imaxdiv 3 , +.Xr ldiv 3 , +.Xr math 3 , +.Xr qdiv 3 +.Sh STANDARDS +The +.Fn lldiv +function conforms to +.St -ansiC-99 . diff --git a/src/lib/libc/stdlib/lldiv.c b/src/lib/libc/stdlib/lldiv.c new file mode 100644 index 00000000..e8d6c978 --- /dev/null +++ b/src/lib/libc/stdlib/lldiv.c @@ -0,0 +1,50 @@ +/* $OpenBSD: lldiv.c,v 1.1 2006/01/13 17:58:09 millert Exp $ */ +/* + * Copyright (c) 1990 Regents of the University of California. + * All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Chris Torek. + * + * 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. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * 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. + */ + +#include /* lldiv_t */ + +lldiv_t +lldiv(long long num, long long denom) +{ + lldiv_t r; + + /* see div.c for comments */ + + r.quot = num / denom; + r.rem = num % denom; + if (num >= 0 && r.rem < 0) { + r.quot++; + r.rem -= denom; + } + return (r); +} diff --git a/src/lib/libc/stdlib/qabs.3 b/src/lib/libc/stdlib/qabs.3 index 093212ed..2a1ae0d2 100644 --- a/src/lib/libc/stdlib/qabs.3 +++ b/src/lib/libc/stdlib/qabs.3 @@ -29,7 +29,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $OpenBSD: qabs.3,v 1.6 2003/06/02 20:18:38 millert Exp $ +.\" $OpenBSD: qabs.3,v 1.7 2006/01/13 17:58:09 millert Exp $ .\" .Dd June 29, 1991 .Dt QABS 3 @@ -48,6 +48,7 @@ function returns the absolute value of the quad integer .Fa j . .Sh SEE ALSO .Xr abs 3 , +.Xr imaxabs 3 , .Xr cabs 3 , .Xr floor 3 , .Xr labs 3 , diff --git a/src/lib/libc/stdlib/qdiv.3 b/src/lib/libc/stdlib/qdiv.3 index 5f17ec17..643672ea 100644 --- a/src/lib/libc/stdlib/qdiv.3 +++ b/src/lib/libc/stdlib/qdiv.3 @@ -29,7 +29,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $OpenBSD: qdiv.3,v 1.6 2004/01/23 23:08:46 jmc Exp $ +.\" $OpenBSD: qdiv.3,v 1.7 2006/01/13 17:58:09 millert Exp $ .\" .Dd June 29, 1991 .Dt QDIV 3 @@ -56,5 +56,7 @@ and .Fa rem . .Sh SEE ALSO .Xr div 3 , +.Xr imaxdiv 3 , .Xr ldiv 3 , +.Xr lldiv 3 , .Xr math 3 diff --git a/src/lib/libc/stdlib/strtoimax.c b/src/lib/libc/stdlib/strtoimax.c new file mode 100644 index 00000000..2c77f416 --- /dev/null +++ b/src/lib/libc/stdlib/strtoimax.c @@ -0,0 +1,140 @@ +/* $OpenBSD: strtoimax.c,v 1.1 2006/01/13 17:58:09 millert Exp $ */ + +/*- + * Copyright (c) 1992 The Regents of the University of California. + * 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. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * 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. + */ + +#include +#include +#include + +/* + * Convert a string to an intmax_t + * + * Ignores `locale' stuff. Assumes that the upper and lower case + * alphabets and digits are each contiguous. + */ +intmax_t +strtoimax(const char *nptr, char **endptr, int base) +{ + const char *s; + intmax_t acc, cutoff; + int c; + int neg, any, cutlim; + + /* + * Skip white space and pick up leading +/- sign if any. + * If base is 0, allow 0x for hex and 0 for octal, else + * assume decimal; if base is already 16, allow 0x. + */ + s = nptr; + do { + c = (unsigned char) *s++; + } while (isspace(c)); + if (c == '-') { + neg = 1; + c = *s++; + } else { + neg = 0; + if (c == '+') + c = *s++; + } + if ((base == 0 || base == 16) && + c == '0' && (*s == 'x' || *s == 'X')) { + c = s[1]; + s += 2; + base = 16; + } + if (base == 0) + base = c == '0' ? 8 : 10; + + /* + * Compute the cutoff value between legal numbers and illegal + * numbers. That is the largest legal value, divided by the + * base. An input number that is greater than this value, if + * followed by a legal input character, is too big. One that + * is equal to this value may be valid or not; the limit + * between valid and invalid numbers is then based on the last + * digit. For instance, if the range for intmax_t is + * [-9223372036854775808..9223372036854775807] and the input base + * is 10, cutoff will be set to 922337203685477580 and cutlim to + * either 7 (neg==0) or 8 (neg==1), meaning that if we have + * accumulated a value > 922337203685477580, or equal but the + * next digit is > 7 (or 8), the number is too big, and we will + * return a range error. + * + * Set any if any `digits' consumed; make it negative to indicate + * overflow. + */ + cutoff = neg ? INTMAX_MIN : INTMAX_MAX; + cutlim = cutoff % base; + cutoff /= base; + if (neg) { + if (cutlim > 0) { + cutlim -= base; + cutoff += 1; + } + cutlim = -cutlim; + } + for (acc = 0, any = 0;; c = (unsigned char) *s++) { + if (isdigit(c)) + c -= '0'; + else if (isalpha(c)) + c -= isupper(c) ? 'A' - 10 : 'a' - 10; + else + break; + if (c >= base) + break; + if (any < 0) + continue; + if (neg) { + if (acc < cutoff || (acc == cutoff && c > cutlim)) { + any = -1; + acc = INTMAX_MIN; + errno = ERANGE; + } else { + any = 1; + acc *= base; + acc -= c; + } + } else { + if (acc > cutoff || (acc == cutoff && c > cutlim)) { + any = -1; + acc = INTMAX_MAX; + errno = ERANGE; + } else { + any = 1; + acc *= base; + acc += c; + } + } + } + if (endptr != 0) + *endptr = (char *) (any ? s - 1 : nptr); + return (acc); +} diff --git a/src/lib/libc/stdlib/strtol.3 b/src/lib/libc/stdlib/strtol.3 index 3f5375c5..1ba936dd 100644 --- a/src/lib/libc/stdlib/strtol.3 +++ b/src/lib/libc/stdlib/strtol.3 @@ -29,27 +29,30 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $OpenBSD: strtol.3,v 1.13 2003/06/02 20:18:38 millert Exp $ +.\" $OpenBSD: strtol.3,v 1.14 2006/01/13 17:58:09 millert Exp $ .\" -.Dd June 25, 1992 +.Dd January 3, 2006 .Dt STRTOL 3 .Os .Sh NAME .Nm strtol , .Nm strtoll , -.Nm strtoq -.Nd "convert string value to a long or long long integer" +.Nm strtoimax , +.Nm strtoq , +.Nd "convert string value to a long, long long or intmax_t integer" .Sh SYNOPSIS .Fd #include .Fd #include .Ft long .Fn strtol "const char *nptr" "char **endptr" "int base" .Pp -.Fd #include -.Fd #include .Ft long long .Fn strtoll "const char *nptr" "char **endptr" "int base" .Pp +.Fd #include +.Ft intmax_t +.Fn strtoimax "const char *nptr" "char **endptr" "int base" +.Pp .Fd #include .Fd #include .Fd #include @@ -71,6 +74,13 @@ to a .Li long long value. The +.Fn strtoimax +function converts the string in +.Fa nptr +to an +.Li intmax_t +value. +The .Fn strtoq function is a deprecated equivalent of .Fn strtoll @@ -98,7 +108,10 @@ is taken as 10 (decimal) unless the next character is in which case it is taken as 8 (octal). .Pp The remainder of the string is converted to a -.Li long +.Li long , +.Li long long , +or +.Li intmax_t , value in the obvious manner, stopping at the first character which is not a valid digit in the given base. @@ -133,29 +146,25 @@ is on return, the entire string was valid.) .Sh RETURN VALUES The -.Fn strtol -function returns the result of the conversion, +.Fn strtol , +.Fn strtoll , +.Fn strtoimax , +and +.Fn strtoq +functions returns the result of the conversion, unless the value would underflow or overflow. -If an underflow occurs, -.Fn strtol -returns -.Dv LONG_MIN . -If an overflow occurs, -.Fn strtol -returns -.Dv LONG_MAX . -In both cases, +If overflow or underflow occurs, .Va errno is set to -.Er ERANGE . -.Pp -The -.Fn strtoll -function has identical return values except that -.Dv LLONG_MIN -and -.Dv LLONG_MAX -are used to indicate underflow and overflow respectively. +.Er ERANGE +and the function return value is as follows: +.Bl -column -offset indent "strtoimax" "overflow" "underflow" +.It Sy Function Ta Sy overflow Ta Sy underflow +.It Fn strtol Ta Dv LONG_MIN Ta Dv LONG_MAX +.It Fn strtoll Ta Dv LLONG_MIN Ta Dv LLONG_MAX +.It Fn strtoimax Ta Dv INTMAX_MIN Ta Dv INTMAX_MAX +.It Fn strtoq Ta Dv LLONG_MIN Ta Dv LLONG_MAX +.El .Sh EXAMPLES Ensuring that a string is a valid number (i.e., in range and containing no trailing characters) requires clearing @@ -233,9 +242,10 @@ The given string was out of range; the value converted has been clamped. .Xr strtoul 3 .Sh STANDARDS The -.Fn strtol +.Fn strtol , +.Fn strtoll , and -.Fn strtoll +.Fn strtoimax functions conform to .St -ansiC-99 . The diff --git a/src/lib/libc/stdlib/strtoul.3 b/src/lib/libc/stdlib/strtoul.3 index 4f6d6a51..2ea5e832 100644 --- a/src/lib/libc/stdlib/strtoul.3 +++ b/src/lib/libc/stdlib/strtoul.3 @@ -29,27 +29,30 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $OpenBSD: strtoul.3,v 1.15 2003/06/02 20:18:38 millert Exp $ +.\" $OpenBSD: strtoul.3,v 1.16 2006/01/13 17:58:09 millert Exp $ .\" -.Dd June 25, 1992 +.Dd January 3, 2006 .Dt STRTOUL 3 .Os .Sh NAME .Nm strtoul , .Nm strtoull , +.Nm strtoumax , .Nm strtouq -.Nd "convert a string to an unsigned long or unsigned long long integer" +.Nd "convert a string to an unsigned long, unsigned long long or uintmax_t integer" .Sh SYNOPSIS .Fd #include .Fd #include .Ft unsigned long .Fn strtoul "const char *nptr" "char **endptr" "int base" .Pp -.Fd #include -.Fd #include .Ft unsigned long long .Fn strtoull "const char *nptr" "char **endptr" "int base" .Pp +.Fd #include +.Ft uintmax_t +.Fn strtoumax "const char *nptr" "char **endptr" "int base" +.Pp .Fd #include .Fd #include .Fd #include @@ -71,6 +74,13 @@ to an .Li unsigned long long value. The +.Fn strtoumax +function converts the string in +.Fa nptr +to a +.Li umaxint_t +value. +The .Fn strtouq function is a deprecated equivalent of .Fn strtoull @@ -139,32 +149,32 @@ is on return, the entire string was valid.) .Sh RETURN VALUES The -.Fn strtoul -function returns the result of the conversion, -unless the value would overflow, in which case -.Dv ULONG_MAX -is returned and -.Va errno -is set to -.Er ERANGE . -If there was a leading minus sign, -.Fn strtoul -returns the (unsigned) negation of the absolute value of the number, unless -the absolute value would overflow. -In this case, +.Fn strtoul , +.Fn strtoull , +.Fn strtoumax +and +.Fn strtouq +functions return either the result of the conversion or, +if there was a leading minus sign, +the negation of the result of the conversion, +unless the original (non-negated) value would overflow. +If overflow occurs, .Fn strtoul returns -.Dv ULONG_MAX -and sets the global variable -.Va errno -to -.Er ERANGE . -.Pp -The +.Dv ULONG_MAX , .Fn strtoull -function has identical return values except that +returns +.Dv ULLONG_MAX , +.Fn strtoumax +returns +.Dv UINTMAX_MAX , +.Fn strtouq +returns .Dv ULLONG_MAX -is used to indicate overflow. +and the global variable +.Va errno +is set to +.Er ERANGE . .Pp There is no way to determine if .Fn strtoul @@ -217,9 +227,10 @@ The given string was out of range; the value converted has been clamped. .Xr strtol 3 .Sh STANDARDS The -.Fn strtoul +.Fn strtoul , +.Fn strtoull , and -.Fn strtoull +.Fn strtoumax functions conform to .St -ansiC-99 . The diff --git a/src/lib/libc/stdlib/strtoumax.c b/src/lib/libc/stdlib/strtoumax.c new file mode 100644 index 00000000..ce6e2c00 --- /dev/null +++ b/src/lib/libc/stdlib/strtoumax.c @@ -0,0 +1,102 @@ +/* $OpenBSD: strtoumax.c,v 1.1 2006/01/13 17:58:09 millert Exp $ */ + +/*- + * Copyright (c) 1992 The Regents of the University of California. + * 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. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * 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. + */ + +#include +#include +#include + +/* + * Convert a string to a uintmax_t. + * + * Ignores `locale' stuff. Assumes that the upper and lower case + * alphabets and digits are each contiguous. + */ +uintmax_t +strtoumax(const char *nptr, char **endptr, int base) +{ + const char *s; + uintmax_t acc, cutoff; + int c; + int neg, any, cutlim; + + /* + * See strtoq for comments as to the logic used. + */ + s = nptr; + do { + c = (unsigned char) *s++; + } while (isspace(c)); + if (c == '-') { + neg = 1; + c = *s++; + } else { + neg = 0; + if (c == '+') + c = *s++; + } + if ((base == 0 || base == 16) && + c == '0' && (*s == 'x' || *s == 'X')) { + c = s[1]; + s += 2; + base = 16; + } + if (base == 0) + base = c == '0' ? 8 : 10; + + cutoff = UINTMAX_MAX / (uintmax_t)base; + cutlim = UINTMAX_MAX % (uintmax_t)base; + for (acc = 0, any = 0;; c = (unsigned char) *s++) { + if (isdigit(c)) + c -= '0'; + else if (isalpha(c)) + c -= isupper(c) ? 'A' - 10 : 'a' - 10; + else + break; + if (c >= base) + break; + if (any < 0) + continue; + if (acc > cutoff || (acc == cutoff && c > cutlim)) { + any = -1; + acc = UINTMAX_MAX; + errno = ERANGE; + } else { + any = 1; + acc *= (uintmax_t)base; + acc += c; + } + } + if (neg && any > 0) + acc = -acc; + if (endptr != 0) + *endptr = (char *) (any ? s - 1 : nptr); + return (acc); +}