Browse Source

Add lldiv(), imaxabs(), imaxdiv(), strtoimax() and strtoumax()

OPENBSD_3_9
millert 19 years ago
parent
commit
6388df8cda
19 changed files with 706 additions and 78 deletions
  1. +12
    -2
      src/include/inttypes.h
  2. +9
    -2
      src/include/stdlib.h
  3. +11
    -10
      src/lib/libc/stdlib/Makefile.inc
  4. +2
    -1
      src/lib/libc/stdlib/abs.3
  5. +3
    -1
      src/lib/libc/stdlib/div.3
  6. +66
    -0
      src/lib/libc/stdlib/imaxabs.3
  7. +38
    -0
      src/lib/libc/stdlib/imaxabs.c
  8. +67
    -0
      src/lib/libc/stdlib/imaxdiv.3
  9. +50
    -0
      src/lib/libc/stdlib/imaxdiv.c
  10. +2
    -1
      src/lib/libc/stdlib/labs.3
  11. +3
    -1
      src/lib/libc/stdlib/ldiv.3
  12. +67
    -0
      src/lib/libc/stdlib/lldiv.3
  13. +50
    -0
      src/lib/libc/stdlib/lldiv.c
  14. +2
    -1
      src/lib/libc/stdlib/qabs.3
  15. +3
    -1
      src/lib/libc/stdlib/qdiv.3
  16. +140
    -0
      src/lib/libc/stdlib/strtoimax.c
  17. +39
    -29
      src/lib/libc/stdlib/strtol.3
  18. +40
    -29
      src/lib/libc/stdlib/strtoul.3
  19. +102
    -0
      src/lib/libc/stdlib/strtoumax.c

+ 12
- 2
src/include/inttypes.h View File

@ -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 <Todd.Miller@courtesan.com> * Copyright (c) 1997, 2005 Todd C. Miller <Todd.Miller@courtesan.com>
@ -286,6 +286,16 @@
#endif /* __cplusplus || __STDC_FORMAT_MACROS */ #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_ */ #endif /* _INTTYPES_H_ */

+ 9
- 2
src/include/stdlib.h View File

@ -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 $ */ /* $NetBSD: stdlib.h,v 1.25 1995/12/27 21:19:08 jtc Exp $ */
/*- /*-
@ -62,6 +62,13 @@ typedef struct {
long rem; /* remainder */ long rem; /* remainder */
} ldiv_t; } ldiv_t;
#if __ISO_C_VISIBLE >= 1999
typedef struct {
long long quot; /* quotient */
long long rem; /* remainder */
} lldiv_t;
#endif
#if __BSD_VISIBLE #if __BSD_VISIBLE
typedef struct { typedef struct {
quad_t quot; /* quotient */ quad_t quot; /* quotient */
@ -182,7 +189,7 @@ void *valloc(size_t); /* obsoleted by malloc() */
/* /*
* ISO C99 * ISO C99
*/ */
#if __BSD_VISIBLE || __ISO_C_VISIBLE >= 1999
#if __ISO_C_VISIBLE >= 1999
long long long long
atoll(const char *); atoll(const char *);
long long long long


+ 11
- 10
src/lib/libc/stdlib/Makefile.inc View File

@ -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 # stdlib sources
.PATH: ${LIBCSRCDIR}/arch/${MACHINE_ARCH}/stdlib ${LIBCSRCDIR}/stdlib .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 \ 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 \ 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 \ 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 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 \ 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 \ 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+=exit.3 _Exit.3
MLINKS+=ecvt.3 fcvt.3 ecvt.3 gcvt.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 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 mrand48.3 rand48.3 nrand48.3 rand48.3 jrand48.3
MLINKS+=rand48.3 srand48.3 rand48.3 seed48.3 rand48.3 lcong48.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 tfind.3
MLINKS+=tsearch.3 tdelete.3 MLINKS+=tsearch.3 tdelete.3
MLINKS+=tsearch.3 twalk.3 MLINKS+=tsearch.3 twalk.3


+ 2
- 1
src/lib/libc/stdlib/abs.3 View File

@ -29,7 +29,7 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE. .\" 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 .Dd June 29, 1991
.Dt ABS 3 .Dt ABS 3
@ -54,6 +54,7 @@ function returns the absolute value.
.Xr cabs 3 , .Xr cabs 3 ,
.Xr floor 3 , .Xr floor 3 ,
.Xr hypot 3 , .Xr hypot 3 ,
.Xr imaxabs 3 ,
.Xr labs 3 , .Xr labs 3 ,
.Xr math 3 .Xr math 3
.Sh STANDARDS .Sh STANDARDS


+ 3
- 1
src/lib/libc/stdlib/div.3 View File

@ -27,7 +27,7 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE. .\" 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 .Dd April 19, 1991
.Dt DIV 3 .Dt DIV 3
@ -53,7 +53,9 @@ members named
and and
.Fa rem . .Fa rem .
.Sh SEE ALSO .Sh SEE ALSO
.Xr imaxdiv 3 ,
.Xr ldiv 3 , .Xr ldiv 3 ,
.Xr lldiv 3 ,
.Xr math 3 , .Xr math 3 ,
.Xr qdiv 3 .Xr qdiv 3
.Sh STANDARDS .Sh STANDARDS


+ 66
- 0
src/lib/libc/stdlib/imaxabs.3 View File

@ -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 <inttypes.h>
.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.

+ 38
- 0
src/lib/libc/stdlib/imaxabs.c View File

@ -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 <inttypes.h>
intmax_t
imaxabs(intmax_t j)
{
return (j < 0 ? -j : j);
}

+ 67
- 0
src/lib/libc/stdlib/imaxdiv.3 View File

@ -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 <inttypes.h>
.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 .

+ 50
- 0
src/lib/libc/stdlib/imaxdiv.c View File

@ -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 <inttypes.h> /* 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);
}

+ 2
- 1
src/lib/libc/stdlib/labs.3 View File

@ -29,7 +29,7 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE. .\" 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 .Dd May 14, 2003
.Dt LABS 3 .Dt LABS 3
@ -56,6 +56,7 @@ function returns the absolute value of the long long integer
.Xr abs 3 , .Xr abs 3 ,
.Xr cabs 3 , .Xr cabs 3 ,
.Xr floor 3 , .Xr floor 3 ,
.Xr imaxabs 3 ,
.Xr math 3 .Xr math 3
.Sh STANDARDS .Sh STANDARDS
The The


+ 3
- 1
src/lib/libc/stdlib/ldiv.3 View File

@ -29,7 +29,7 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE. .\" 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 .Dd June 29, 1991
.Dt LDIV 3 .Dt LDIV 3
@ -56,6 +56,8 @@ and
.Fa rem . .Fa rem .
.Sh SEE ALSO .Sh SEE ALSO
.Xr div 3 , .Xr div 3 ,
.Xr imaxdiv 3 ,
.Xr lldiv 3 ,
.Xr math 3 , .Xr math 3 ,
.Xr qdiv 3 .Xr qdiv 3
.Sh STANDARDS .Sh STANDARDS


+ 67
- 0
src/lib/libc/stdlib/lldiv.3 View File

@ -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 <stdlib.h>
.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 .

+ 50
- 0
src/lib/libc/stdlib/lldiv.c View File

@ -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 <stdlib.h> /* 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);
}

+ 2
- 1
src/lib/libc/stdlib/qabs.3 View File

@ -29,7 +29,7 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE. .\" 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 .Dd June 29, 1991
.Dt QABS 3 .Dt QABS 3
@ -48,6 +48,7 @@ function returns the absolute value of the quad integer
.Fa j . .Fa j .
.Sh SEE ALSO .Sh SEE ALSO
.Xr abs 3 , .Xr abs 3 ,
.Xr imaxabs 3 ,
.Xr cabs 3 , .Xr cabs 3 ,
.Xr floor 3 , .Xr floor 3 ,
.Xr labs 3 , .Xr labs 3 ,


+ 3
- 1
src/lib/libc/stdlib/qdiv.3 View File

@ -29,7 +29,7 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE. .\" 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 .Dd June 29, 1991
.Dt QDIV 3 .Dt QDIV 3
@ -56,5 +56,7 @@ and
.Fa rem . .Fa rem .
.Sh SEE ALSO .Sh SEE ALSO
.Xr div 3 , .Xr div 3 ,
.Xr imaxdiv 3 ,
.Xr ldiv 3 , .Xr ldiv 3 ,
.Xr lldiv 3 ,
.Xr math 3 .Xr math 3

+ 140
- 0
src/lib/libc/stdlib/strtoimax.c View File

@ -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 <ctype.h>
#include <errno.h>
#include <inttypes.h>
/*
* 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);
}

+ 39
- 29
src/lib/libc/stdlib/strtol.3 View File

@ -29,27 +29,30 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE. .\" 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 .Dt STRTOL 3
.Os .Os
.Sh NAME .Sh NAME
.Nm strtol , .Nm strtol ,
.Nm strtoll , .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 .Sh SYNOPSIS
.Fd #include <stdlib.h> .Fd #include <stdlib.h>
.Fd #include <limits.h> .Fd #include <limits.h>
.Ft long .Ft long
.Fn strtol "const char *nptr" "char **endptr" "int base" .Fn strtol "const char *nptr" "char **endptr" "int base"
.Pp .Pp
.Fd #include <stdlib.h>
.Fd #include <limits.h>
.Ft long long .Ft long long
.Fn strtoll "const char *nptr" "char **endptr" "int base" .Fn strtoll "const char *nptr" "char **endptr" "int base"
.Pp .Pp
.Fd #include <inttypes.h>
.Ft intmax_t
.Fn strtoimax "const char *nptr" "char **endptr" "int base"
.Pp
.Fd #include <sys/types.h> .Fd #include <sys/types.h>
.Fd #include <stdlib.h> .Fd #include <stdlib.h>
.Fd #include <limits.h> .Fd #include <limits.h>
@ -71,6 +74,13 @@ to a
.Li long long .Li long long
value. value.
The The
.Fn strtoimax
function converts the string in
.Fa nptr
to an
.Li intmax_t
value.
The
.Fn strtoq .Fn strtoq
function is a deprecated equivalent of function is a deprecated equivalent of
.Fn strtoll .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). in which case it is taken as 8 (octal).
.Pp .Pp
The remainder of the string is converted to a 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, value in the obvious manner,
stopping at the first character which is not a valid digit stopping at the first character which is not a valid digit
in the given base. in the given base.
@ -133,29 +146,25 @@ is
on return, the entire string was valid.) on return, the entire string was valid.)
.Sh RETURN VALUES .Sh RETURN VALUES
The 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. 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 .Va errno
is set to 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 .Sh EXAMPLES
Ensuring that a string is a valid number (i.e., in range and containing no Ensuring that a string is a valid number (i.e., in range and containing no
trailing characters) requires clearing trailing characters) requires clearing
@ -233,9 +242,10 @@ The given string was out of range; the value converted has been clamped.
.Xr strtoul 3 .Xr strtoul 3
.Sh STANDARDS .Sh STANDARDS
The The
.Fn strtol
.Fn strtol ,
.Fn strtoll ,
and and
.Fn strtoll
.Fn strtoimax
functions conform to functions conform to
.St -ansiC-99 . .St -ansiC-99 .
The The


+ 40
- 29
src/lib/libc/stdlib/strtoul.3 View File

@ -29,27 +29,30 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE. .\" 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 .Dt STRTOUL 3
.Os .Os
.Sh NAME .Sh NAME
.Nm strtoul , .Nm strtoul ,
.Nm strtoull , .Nm strtoull ,
.Nm strtoumax ,
.Nm strtouq .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 .Sh SYNOPSIS
.Fd #include <stdlib.h> .Fd #include <stdlib.h>
.Fd #include <limits.h> .Fd #include <limits.h>
.Ft unsigned long .Ft unsigned long
.Fn strtoul "const char *nptr" "char **endptr" "int base" .Fn strtoul "const char *nptr" "char **endptr" "int base"
.Pp .Pp
.Fd #include <stdlib.h>
.Fd #include <limits.h>
.Ft unsigned long long .Ft unsigned long long
.Fn strtoull "const char *nptr" "char **endptr" "int base" .Fn strtoull "const char *nptr" "char **endptr" "int base"
.Pp .Pp
.Fd #include <inttypes.h>
.Ft uintmax_t
.Fn strtoumax "const char *nptr" "char **endptr" "int base"
.Pp
.Fd #include <sys/types.h> .Fd #include <sys/types.h>
.Fd #include <stdlib.h> .Fd #include <stdlib.h>
.Fd #include <limits.h> .Fd #include <limits.h>
@ -71,6 +74,13 @@ to an
.Li unsigned long long .Li unsigned long long
value. value.
The The
.Fn strtoumax
function converts the string in
.Fa nptr
to a
.Li umaxint_t
value.
The
.Fn strtouq .Fn strtouq
function is a deprecated equivalent of function is a deprecated equivalent of
.Fn strtoull .Fn strtoull
@ -139,32 +149,32 @@ is
on return, the entire string was valid.) on return, the entire string was valid.)
.Sh RETURN VALUES .Sh RETURN VALUES
The 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 .Fn strtoul
returns returns
.Dv ULONG_MAX
and sets the global variable
.Va errno
to
.Er ERANGE .
.Pp
The
.Dv ULONG_MAX ,
.Fn strtoull .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 .Dv ULLONG_MAX
is used to indicate overflow.
and the global variable
.Va errno
is set to
.Er ERANGE .
.Pp .Pp
There is no way to determine if There is no way to determine if
.Fn strtoul .Fn strtoul
@ -217,9 +227,10 @@ The given string was out of range; the value converted has been clamped.
.Xr strtol 3 .Xr strtol 3
.Sh STANDARDS .Sh STANDARDS
The The
.Fn strtoul
.Fn strtoul ,
.Fn strtoull ,
and and
.Fn strtoull
.Fn strtoumax
functions conform to functions conform to
.St -ansiC-99 . .St -ansiC-99 .
The The


+ 102
- 0
src/lib/libc/stdlib/strtoumax.c View File

@ -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 <ctype.h>
#include <errno.h>
#include <inttypes.h>
/*
* 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);
}

Loading…
Cancel
Save