Add lldiv() and imaxdiv() to libc.
authorSascha Wildner <swildner@dragonflybsd.org>
Fri, 25 Jan 2008 23:24:31 +0000 (23:24 +0000)
committerSascha Wildner <swildner@dragonflybsd.org>
Fri, 25 Jan 2008 23:24:31 +0000 (23:24 +0000)
Submitted-by: Rumko <rumcic@gmail.com>
Taken-from:   FreeBSD

lib/libc/stdlib/Makefile.inc
lib/libc/stdlib/div.3
lib/libc/stdlib/imaxdiv.3 [new file with mode: 0644]
lib/libc/stdlib/imaxdiv.c [new file with mode: 0644]
lib/libc/stdlib/ldiv.3
lib/libc/stdlib/lldiv.3 [new file with mode: 0644]
lib/libc/stdlib/lldiv.c [new file with mode: 0644]

index f704b58..a30f471 100644 (file)
@@ -1,14 +1,15 @@
 #      from @(#)Makefile.inc   8.3 (Berkeley) 2/4/95
 # $FreeBSD: src/lib/libc/stdlib/Makefile.inc,v 1.19.2.4 2001/10/02 11:15:38 ru Exp $
-# $DragonFly: src/lib/libc/stdlib/Makefile.inc,v 1.20 2007/12/02 03:00:18 swildner Exp $
+# $DragonFly: src/lib/libc/stdlib/Makefile.inc,v 1.21 2008/01/25 23:24:31 swildner Exp $
 
 # machine-independent stdlib sources
 .PATH: ${.CURDIR}/../libc/${MACHINE_ARCH}/stdlib ${.CURDIR}/../libc/stdlib
 
 MISRCS+=abort.c abs.c atexit.c atof.c atoi.c atol.c atoll.c bsearch.c calloc.c div.c \
        exit.c getenv.c getopt.c getopt_long.c getsubopt.c hcreate.c heapsort.c \
-       imaxabs.c \
-       labs.c ldiv.c llabs.c malloc.c merge.c putenv.c qsort.c radixsort.c rand.c \
+       imaxabs.c imaxdiv.c \
+       labs.c ldiv.c llabs.c lldiv.c malloc.c merge.c putenv.c \
+       qsort.c radixsort.c rand.c \
        random.c reallocf.c realpath.c setenv.c strtod.c strtoimax.c strtol.c \
        strtoll.c strtonum.c strtoq.c strtoul.c strtoull.c strtoumax.c \
        strtouq.c system.c tdelete.c tfind.c tsearch.c twalk.c
@@ -21,8 +22,9 @@ MISRCS+=abort.c abs.c atexit.c atof.c atoi.c atol.c atoll.c bsearch.c calloc.c d
 .if ${LIB} == "c"
 MAN+=  abort.3 abs.3 alloca.3 atexit.3 atof.3 atoi.3 atol.3 bsearch.3 \
        div.3 exit.3 getenv.3 getopt.3 getopt_long.3 getsubopt.3 hcreate.3 \
-       imaxabs.3 \
-       labs.3 ldiv.3 llabs.3 malloc.3 memory.3 qsort.3 radixsort.3 rand.3 random.3 \
+       imaxabs.3 imaxdiv.3 \
+       labs.3 ldiv.3 llabs.3 lldiv.3 malloc.3 memory.3 \
+       qsort.3 radixsort.3 rand.3 random.3 \
        realpath.3 strtod.3 strtol.3 strtonum.3 strtoul.3 system.3 tsearch.3
 
 MLINKS+=atol.3 atoll.3
index cda2643..a937f5e 100644 (file)
@@ -33,7 +33,7 @@
 .\"
 .\"     @(#)div.3      8.1 (Berkeley) 6/4/93
 .\" $FreeBSD: src/lib/libc/stdlib/div.3,v 1.3.2.3 2001/12/14 18:33:58 ru Exp $
-.\" $DragonFly: src/lib/libc/stdlib/div.3,v 1.2 2003/06/17 04:26:46 dillon Exp $
+.\" $DragonFly: src/lib/libc/stdlib/div.3,v 1.3 2008/01/25 23:24:31 swildner Exp $
 .\"
 .Dd June 4, 1993
 .Dt DIV 3
@@ -62,7 +62,9 @@ members named
 and
 .Fa rem .
 .Sh SEE ALSO
-.Xr ldiv 3
+.Xr imaxdiv 3 ,
+.Xr ldiv 3 ,
+.Xr lldiv 3
 .Sh STANDARDS
 The
 .Fn div
diff --git a/lib/libc/stdlib/imaxdiv.3 b/lib/libc/stdlib/imaxdiv.3
new file mode 100644 (file)
index 0000000..14e5fef
--- /dev/null
@@ -0,0 +1,74 @@
+.\" Copyright (c) 2001 Mike Barcroft <mike@FreeBSD.org>
+.\" 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 AUTHOR 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 AUTHOR 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: src/lib/libc/stdlib/imaxdiv.3,v 1.2 2001/11/21 16:19:50 ru Exp $
+.\" $DragonFly: src/lib/libc/stdlib/imaxdiv.3,v 1.1 2008/01/25 23:24:31 swildner Exp $
+.\"
+.Dd January 25, 2008
+.Dt IMAXDIV 3
+.Os
+.Sh NAME
+.Nm imaxdiv
+.Nd returns quotient and remainder
+.Sh LIBRARY
+.Lb libc
+.Sh SYNOPSIS
+.In inttypes.h
+.Ft imaxdiv_t
+.Fn imaxdiv "intmax_t numer" "intmax_t denom"
+.Sh DESCRIPTION
+The
+.Fn imaxdiv
+function computes the value of
+.Fa numer
+divided by
+.Fa denom
+and returns the stored result in the form of the
+.Vt imaxdiv_t
+type.
+.Pp
+The
+.Vt imaxdiv_t
+type is defined as:
+.Bd -literal -offset indent
+typedef struct {
+       intmax_t quot; /* Quotient. */
+       intmax_t rem;  /* Remainder. */
+} imaxdiv_t;
+.Ed
+.Sh SEE ALSO
+.Xr div 3 ,
+.Xr ldiv 3 ,
+.Xr lldiv 3 ,
+.Xr math 3
+.Sh STANDARDS
+The
+.Fn imaxdiv
+function conforms to
+.St -isoC-99 .
+.Sh HISTORY
+The
+.Fn imaxdiv
+function first appeared in
+.Fx 5.0 .
diff --git a/lib/libc/stdlib/imaxdiv.c b/lib/libc/stdlib/imaxdiv.c
new file mode 100644 (file)
index 0000000..f2e6263
--- /dev/null
@@ -0,0 +1,46 @@
+/*-
+ * Copyright (c) 2001 Mike Barcroft <mike@FreeBSD.org>
+ * 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 AUTHOR 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 AUTHOR 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: src/lib/libc/stdlib/imaxdiv.c,v 1.1 2001/11/15 02:05:03 mike Exp $
+ * $DragonFly: src/lib/libc/stdlib/imaxdiv.c,v 1.1 2008/01/25 23:24:31 swildner Exp $
+ */
+
+#include <inttypes.h>
+
+imaxdiv_t
+imaxdiv(intmax_t numer, intmax_t denom)
+{
+       imaxdiv_t retval;
+       
+       /* see div.c for comments */
+       
+       retval.quot = numer / denom;
+       retval.rem = numer % denom;
+       if (numer >= 0 && retval.rem < 0) {
+               retval.quot++;
+               retval.rem -= denom;
+       }
+       return (retval);
+}
index c661582..49e8266 100644 (file)
@@ -35,7 +35,7 @@
 .\"
 .\"     @(#)ldiv.3     8.1 (Berkeley) 6/4/93
 .\" $FreeBSD: src/lib/libc/stdlib/ldiv.3,v 1.4.2.3 2001/12/14 18:33:58 ru Exp $
-.\" $DragonFly: src/lib/libc/stdlib/ldiv.3,v 1.2 2003/06/17 04:26:46 dillon Exp $
+.\" $DragonFly: src/lib/libc/stdlib/ldiv.3,v 1.3 2008/01/25 23:24:31 swildner Exp $
 .\"
 .Dd June 4, 1993
 .Dt LDIV 3
@@ -65,6 +65,8 @@ and
 .Ar rem .
 .Sh SEE ALSO
 .Xr div 3 ,
+.Xr imaxdiv 3 ,
+.Xr lldiv 3 ,
 .Xr math 3
 .Sh STANDARDS
 The
diff --git a/lib/libc/stdlib/lldiv.3 b/lib/libc/stdlib/lldiv.3
new file mode 100644 (file)
index 0000000..2a6443e
--- /dev/null
@@ -0,0 +1,74 @@
+.\" Copyright (c) 2001 Mike Barcroft <mike@FreeBSD.org>
+.\" 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 AUTHOR 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 AUTHOR 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: src/lib/libc/stdlib/lldiv.3,v 1.2 2001/11/21 16:19:50 ru Exp $
+.\" $DragonFly: src/lib/libc/stdlib/lldiv.3,v 1.1 2008/01/25 23:24:31 swildner Exp $
+.\"
+.Dd January 25, 2008
+.Dt LLDIV 3
+.Os
+.Sh NAME
+.Nm lldiv
+.Nd returns quotient and remainder
+.Sh LIBRARY
+.Lb libc
+.Sh SYNOPSIS
+.In stdlib.h
+.Ft lldiv_t
+.Fn lldiv "long long numer" "long long denom"
+.Sh DESCRIPTION
+The
+.Fn lldiv
+function computes the value of
+.Fa numer
+divided by
+.Fa denom
+and returns the stored result in the form of the
+.Vt lldiv_t
+type.
+.Pp
+The
+.Vt lldiv_t
+type is defined as:
+.Bd -literal -offset indent
+typedef struct {
+       long long quot; /* Quotient. */
+       long long rem;  /* Remainder. */
+} lldiv_t;
+.Ed
+.Sh SEE ALSO
+.Xr div 3 ,
+.Xr imaxdiv 3 ,
+.Xr ldiv 3 ,
+.Xr math 3
+.Sh STANDARDS
+The
+.Fn lldiv
+function conforms to
+.St -isoC-99 .
+.Sh HISTORY
+The
+.Fn lldiv
+function first appeared in
+.Fx 5.0 .
diff --git a/lib/libc/stdlib/lldiv.c b/lib/libc/stdlib/lldiv.c
new file mode 100644 (file)
index 0000000..2f676de
--- /dev/null
@@ -0,0 +1,46 @@
+/*-
+ * Copyright (c) 2001 Mike Barcroft <mike@FreeBSD.org>
+ * 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 AUTHOR 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 AUTHOR 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: src/lib/libc/stdlib/lldiv.c,v 1.1 2001/11/15 02:05:03 mike Exp $
+ * $DragonFly: src/lib/libc/stdlib/lldiv.c,v 1.1 2008/01/25 23:24:31 swildner Exp $
+ */
+
+#include <stdlib.h>            /* lldiv_t */
+
+lldiv_t
+lldiv(long long numer, long long denom)
+{
+       lldiv_t retval;
+       
+       /* see div.c for comments */
+
+       retval.quot = numer / denom;
+       retval.rem = numer % denom;
+       if (numer >= 0 && retval.rem < 0) {
+               retval.quot++;
+               retval.rem -= denom;
+       }
+       return (retval);
+}