[PATCH] Importing inttypes.h library and related methods.
Joel Sherrill
joel at rtems.org
Mon Jun 12 23:10:28 UTC 2017
These methods need to be added to newlib not the RTEMS cpukit.
The tests can be added to RTEMS.
--joel
On Mon, Jun 12, 2017 at 1:52 PM, Aditya Upadhyay <aadit0402 at gmail.com>
wrote:
> ---
> cpukit/Makefile.am | 20 +++---
> cpukit/configure.ac | 4 +-
> cpukit/inttypes/Makefile.am | 14 ++++
> cpukit/inttypes/imaxabs.c | 44 +++++++++++++
> cpukit/inttypes/imaxdiv.c | 53 ++++++++++++++++
> cpukit/inttypes/strtoimax.c | 144 ++++++++++++++++++++++++++++++
> ++++++++++++
> cpukit/inttypes/strtoumax.c | 135 +++++++++++++++++++++++++++++++++++++++
> cpukit/inttypes/wcstoimax.c | 151 ++++++++++++++++++++++++++++++
> ++++++++++++++
> cpukit/inttypes/wcstoumax.c | 144 ++++++++++++++++++++++++++++++
> ++++++++++++
> cpukit/preinstall.am | 59 +++++++++--------
> 10 files changed, 724 insertions(+), 44 deletions(-)
> create mode 100644 cpukit/inttypes/Makefile.am
> create mode 100644 cpukit/inttypes/imaxabs.c
> create mode 100644 cpukit/inttypes/imaxdiv.c
> create mode 100644 cpukit/inttypes/strtoimax.c
> create mode 100644 cpukit/inttypes/strtoumax.c
> create mode 100644 cpukit/inttypes/wcstoimax.c
> create mode 100644 cpukit/inttypes/wcstoumax.c
>
> diff --git a/cpukit/Makefile.am b/cpukit/Makefile.am
> index 2c2f2e5..045017e 100644
> --- a/cpukit/Makefile.am
> +++ b/cpukit/Makefile.am
> @@ -7,6 +7,7 @@ include $(top_srcdir)/automake/multilib.am
> _SUBDIRS = . score rtems sapi posix
> _SUBDIRS += dev
> _SUBDIRS += dtc/libfdt
> +_SUBDIRS += inttypes
> _SUBDIRS += libcrypt
> _SUBDIRS += libcsupport libblock libfs
> _SUBDIRS += libdrvmgr
> @@ -59,25 +60,22 @@ include_HEADERS += include/memory.h
> include_HEADERS += libmisc/xz/xz.h
>
> include_sys_HEADERS += libcsupport/include/sys/event.h
> -include_sys_HEADERS += libcsupport/include/sys/poll.h
> -include_sys_HEADERS += libcsupport/include/sys/statvfs.h
> -include_sys_HEADERS += libcsupport/include/sys/utsname.h
> -
> -include_sys_HEADERS += include/sys/endian.h
> -include_sys_HEADERS += include/sys/priority.h
> -
> -if !HAS_NEWLIB_20170522_HEADER
> -include_sys_HEADERS += include/sys/_iovec.h
> -include_sys_HEADERS += include/sys/uio.h
> include_sys_HEADERS += libcsupport/include/sys/filio.h
> include_sys_HEADERS += libcsupport/include/sys/ioccom.h
> include_sys_HEADERS += libcsupport/include/sys/ioctl.h
> +include_sys_HEADERS += libcsupport/include/sys/poll.h
> include_sys_HEADERS += libcsupport/include/sys/sockio.h
> +include_sys_HEADERS += libcsupport/include/sys/statvfs.h
> include_sys_HEADERS += libcsupport/include/sys/_termios.h
> include_sys_HEADERS += libcsupport/include/sys/termios.h
> include_sys_HEADERS += libcsupport/include/sys/ttycom.h
> include_sys_HEADERS += libcsupport/include/sys/ttydefaults.h
> -endif
> +include_sys_HEADERS += libcsupport/include/sys/utsname.h
> +
> +include_sys_HEADERS += include/sys/endian.h
> +include_sys_HEADERS += include/sys/uio.h
> +include_sys_HEADERS += include/sys/_iovec.h
> +include_sys_HEADERS += include/sys/priority.h
>
> if LIBNETWORKING
> include_rtems_bsdnetdir = $(includedir)/rtems/bsdnet
> diff --git a/cpukit/configure.ac b/cpukit/configure.ac
> index 8d5b322..ad0865b 100644
> --- a/cpukit/configure.ac
> +++ b/cpukit/configure.ac
> @@ -166,9 +166,6 @@ if test x"$RTEMS_USE_NEWLIB" = xyes ; then
> AC_CHECK_DECLS([__getreent],[],[RTEMS_TOOL_CHAIN_ERROR],[#include
> <sys/reent.h>])
> fi
>
> -AC_CHECK_HEADER([sys/socket.h],[],[])
> -AM_CONDITIONAL(HAS_NEWLIB_20170522_HEADER,[test
> x"${ac_cv_header_sys_socket_h}" = xyes])
> -
> RTEMS_CHECK_MULTIPROCESSING
> RTEMS_CHECK_POSIX_API
> RTEMS_CHECK_NETWORKING
> @@ -464,6 +461,7 @@ score/cpu/sparc64/Makefile
> score/cpu/v850/Makefile
> score/cpu/no_cpu/Makefile
> posix/Makefile
> +inttypes/Makefile
> libblock/Makefile
> libdrvmgr/Makefile
> libfs/Makefile
> diff --git a/cpukit/inttypes/Makefile.am b/cpukit/inttypes/Makefile.am
> new file mode 100644
> index 0000000..c90b872
> --- /dev/null
> +++ b/cpukit/inttypes/Makefile.am
> @@ -0,0 +1,14 @@
> +include $(top_srcdir)/automake/multilib.am
> +include $(top_srcdir)/automake/compile.am
> +
> +
> +noinst_LIBRARIES = libinttypes.a
> +
> +libinttypes_a_SOURCES = imaxdiv.c imaxabs.c strtoimax.c strtoumax.c
> wcstoimax.c wcstoumax.c
> +
> +libinttypes_a_CPPFLAGS = $(AM_CPPFLAGS)
> +
> +
> +#include $(srcdir)/preinstall.am
> +include $(top_srcdir)/automake/subdirs.am
> +include $(top_srcdir)/automake/local.am
> diff --git a/cpukit/inttypes/imaxabs.c b/cpukit/inttypes/imaxabs.c
> new file mode 100644
> index 0000000..fe9331f
> --- /dev/null
> +++ b/cpukit/inttypes/imaxabs.c
> @@ -0,0 +1,44 @@
> +/*-
> + * Copyright (c) 2001 Mike Barcroft <mike at 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.
> + */
> +
> +#if HAVE_CONFIG_H
> +#include "config.h"
> +#endif
> +
> +/* intmax_t data type defined here */
> +
> +#include <stdint.h>
> +#include <stdio.h>
> +
> +#include <rtems/inttypes.h>
> +
> +
> +intmax_t
> +imaxabs(
> + intmax_t j)
> +{
> + return (j < 0 ? -j : j);
> +}
> diff --git a/cpukit/inttypes/imaxdiv.c b/cpukit/inttypes/imaxdiv.c
> new file mode 100644
> index 0000000..765481e
> --- /dev/null
> +++ b/cpukit/inttypes/imaxdiv.c
> @@ -0,0 +1,53 @@
> +/*-
> + * Copyright (c) 2001 Mike Barcroft <mike at 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.
> + */
> +
> +#if HAVE_CONFIG_H
> +#include "config.h"
> +#endif
> +
> +/* intmax_t data type defined here */
> +
> +#include <stdint.h>
> +
> +#include <rtems/inttypes.h>
> +
> +imaxdiv_t
> +imaxdiv(
> + intmax_t numer, intmax_t denom)
> +{
> + imaxdiv_t retval;
> +
> + retval.quot = numer / denom;
> + retval.rem = numer % denom;
> +
> + #if !defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L)
> + if (numer >= 0 && retval.rem < 0) {
> + retval.quot++;
> + retval.rem -= denom;
> + }
> + #endif
> + return (retval);
> +}
> diff --git a/cpukit/inttypes/strtoimax.c b/cpukit/inttypes/strtoimax.c
> new file mode 100644
> index 0000000..092a2a9
> --- /dev/null
> +++ b/cpukit/inttypes/strtoimax.c
> @@ -0,0 +1,144 @@
> +/**
> + * This file has no copyright assigned and is placed in the Public
> Domain.
> + * This file is part of the mingw-w64 runtime package.
> + * No warranty is given; refer to the file DISCLAIMER.PD within this
> package.
> + */
> +
> +/*
> + * This source code was extracted from the Q8 package created and
> + * placed in the PUBLIC DOMAIN by Doug Gwyn <gwyn at arl.mil>
> + * last edit: 1999/11/05 gwyn at arl.mil
> + *
> + * Implements subclause 7.8.2 of ISO/IEC 9899:1999 (E).
> + *
> + * This particular implementation requires the matching <inttypes.h>.
> + * It also assumes that character codes for A..Z and a..z are in
> + * contiguous ascending order; this is true for ASCII but not EBCDIC.
> + */
> +
> +#include <stdlib.h>
> +#include <errno.h>
> +#include <ctype.h>
> +#include <inttypes.h>
> +
> +/* Helper macros */
> +
> +/* convert digit character to number, in any base */
> +
> +#define ToNumber(c) (isdigit(c) ? (c) - '0' : \
> + isupper(c) ? (c) - 'A' + 10 : \
> + islower(c) ? (c) - 'a' + 10 : \
> + -1 /* "invalid"
> flag */ \
> + )
> +/* validate converted digit character for specific base */
> +
> +#define valid(n, b) ((n) >= 0 && (n) < (b))
> +
> +intmax_t
> +strtoimax(
> + nptr, endptr, base)
> + register const char * __restrict__ nptr;
> + char ** __restrict__ endptr;
> + register int base;
> +{
> + register uintmax_t accum;
> + register int n;
> + int minus;
> + int toobig;
> +
> + /* in case no conversion's performed */
> +
> + if (endptr != NULL)
> + *endptr = (char *)nptr;
> +
> + /* unspecified behavior */
> +
> + if (base < 0 || base == 1 || base > 36){
> + errno = EDOM;
> + return 0;
> + }
> +
> + /* skip initial, possibly empty sequence of white-space characters */
> +
> + while (isspace(*nptr))
> + ++nptr;
> +
> + /* process subject sequence: */
> +
> + /* optional sign */
> +
> + if ((minus = *nptr == '-') || *nptr == '+')
> + ++nptr;
> +
> + if (base == 0) {
> + if (*nptr == '0') {
> + if (nptr[1] == 'X' || nptr[1] == 'x'){
> + base = 16;
> + }else{
> + base = 8;
> + }
> + }else{
> + base = 10;
> + }
> +
> + }
> +
> + /* optional "0x" or "0X" for base 16 */
> +
> + /* skip past this prefix */
> +
> + if (base == 16 && *nptr == '0' && (nptr[1] == 'X' || nptr[1] == 'x'))
> + nptr += 2;
> +
> + /* check whether there is at least one valid digit */
> +
> + n = ToNumber(*nptr);
> + ++nptr;
> +
> + /* subject seq. not of expected form */
> +
> + if (!valid(n, base))
> + return 0;
> +
> + accum = n;
> +
> + for (toobig = 0; n = ToNumber(*nptr), valid(n, base); ++nptr)
> +
> + /* major wrap-around */
> +
> + if (accum > (uintmax_t)(INTMAX_MAX / base + 2))
> +
> + /* but keep scanning */
> +
> + toobig = 1;
> + else
> + accum = base * accum + n;
> +
> + /* points to first not-valid-digit */
> +
> + if (endptr != NULL)
> + *endptr = (char *)nptr;
> +
> + if (minus){
> + if (accum > (uintmax_t)INTMAX_MAX + 1)
> + toobig = 1;
> + }
> + else
> + if (accum > (uintmax_t)INTMAX_MAX)
> + toobig = 1;
> +
> + if (toobig){
> + errno = ERANGE;
> + return minus ? INTMAX_MIN : INTMAX_MAX;
> + }
> + else
> + return (intmax_t)(minus ? -accum : accum);
> +}
> +
> +long long __attribute__ (
> +(alias ("strtoimax")))
> +
> +strtoll (
> +const char* __restrict__ nptr,
> +char ** __restrict__ endptr, int base );
> +
> diff --git a/cpukit/inttypes/strtoumax.c b/cpukit/inttypes/strtoumax.c
> new file mode 100644
> index 0000000..48c818b
> --- /dev/null
> +++ b/cpukit/inttypes/strtoumax.c
> @@ -0,0 +1,135 @@
> +/**
> + * This file has no copyright assigned and is placed in the Public
> Domain.
> + * This file is part of the mingw-w64 runtime package.
> + * No warranty is given; refer to the file DISCLAIMER.PD within this
> package.
> + */
> +
> +/*
> + * This source code was extracted from the Q8 package created and
> + * placed in the PUBLIC DOMAIN by Doug Gwyn <gwyn at arl.mil>
> + * last edit: 1999/11/05 gwyn at arl.mil
> + *
> + * Implements subclause 7.8.2 of ISO/IEC 9899:1999 (E).
> + *
> + * This particular implementation requires the matching <inttypes.h>.
> + * It also assumes that character codes for A..Z and a..z are in
> + * contiguous ascending order; this is true for ASCII but not EBCDIC.
> +*/
> +
> +#include <stdlib.h>
> +#include <errno.h>
> +#include <ctype.h>
> +#include <inttypes.h>
> +
> +/* Helper macros */
> +
> +/* convert digit character to number, in any base */
> +
> +#define ToNumber(c) (isdigit(c) ? (c) - '0' : \
> + isupper(c) ? (c) - 'A' + 10 : \
> + islower(c) ? (c) - 'a' + 10 : \
> + -1 /* "invalid" flag */ \
> + )
> +/* validate converted digit character for specific base */
> +
> +#define valid(n, b) ((n) >= 0 && (n) < (b))
> +
> +uintmax_t
> +strtoumax(
> + nptr, endptr, base)
> + register const char * __restrict__ nptr;
> + char ** __restrict__ endptr;
> + register int base;
> +{
> + register uintmax_t accum;
> + register uintmax_t next;
> + register int n;
> + int minus;
> + int toobig;
> +
> + /* in case no conversion's performed */
> +
> + if ( endptr != NULL )
> + *endptr = (char *)nptr;
> +
> + /* unspecified behavior */
> +
> + if ( base < 0 || base == 1 || base > 36 ){
> + errno = EDOM;
> + return 0;
> + }
> +
> + /* skip initial, possibly empty sequence of white-space characters */
> +
> + while ( isspace(*nptr) )
> + ++nptr;
> +
> + /* process subject sequence: */
> +
> + /* optional sign (yes!) */
> +
> + if ((minus = *nptr == '-') || *nptr == '+')
> + ++nptr;
> +
> + if (base == 0){
> + if (*nptr == '0'){
> + if (nptr[1] == 'X' || nptr[1] == 'x')
> + base = 16;
> + else
> + base = 8;
> + }
> + else
> + base = 10;
> + }
> +
> + /* optional "0x" or "0X" for base 16 */
> +
> + if (base == 16 && *nptr == '0' && (nptr[1] == 'X' || nptr[1] == 'x'))
> +
> + /* skip past this prefix */
> +
> + nptr += 2;
> +
> + /* check whether there is at least one valid digit */
> +
> + n = ToNumber(*nptr);
> + ++nptr;
> +
> + /* subject seq. not of expected form */
> +
> + if ( !valid(n, base) )
> + return 0;
> +
> + accum = n;
> +
> + for ( toobig = 0; n = ToNumber(*nptr), valid(n, base); ++nptr )
> +
> + /* major wrap-around and minor wrap-around */
> +
> + if (accum > UINTMAX_MAX / base + 1 || (next = base * accum + n) <
> accum)
> +
> + /* but keep scanning */
> +
> + toobig = 1;
> + else
> + accum = next;
> +
> + /* points to first not-valid-digit */
> +
> + if (endptr != NULL)
> + *endptr = (char *)nptr;
> +
> + if (toobig){
> + errno = ERANGE;
> + return UINTMAX_MAX;
> + }
> + else
> + return minus ? -accum : accum; /* (yes!) */
> +}
> +
> +unsigned long long
> + __attribute__ (
> + (alias ("strtoumax")))
> +strtoull (const char* __restrict__ nptr,
> + char ** __restrict__ endptr, int base);
> +
> diff --git a/cpukit/inttypes/wcstoimax.c b/cpukit/inttypes/wcstoimax.c
> new file mode 100644
> index 0000000..4ec0e91
> --- /dev/null
> +++ b/cpukit/inttypes/wcstoimax.c
> @@ -0,0 +1,151 @@
> +/**
> + * This file has no copyright assigned and is placed in the Public
> Domain.
> + * This file is part of the mingw-w64 runtime package.
> + * No warranty is given; refer to the file DISCLAIMER.PD within this
> package.
> + */
> +
> +/*
> + * This source code was extracted from the Q8 package created and
> + * placed in the PUBLIC DOMAIN by Doug Gwyn <gwyn at arl.mil>
> + * last edit: 1999/11/05 gwyn at arl.mil
> + * Implements subclause 7.8.2 of ISO/IEC 9899:1999 (E).
> + * This particular implementation requires the matching <inttypes.h>.
> + * It also assumes that character codes for A..Z and a..z are in
> + * contiguous ascending order; this is true for ASCII but not EBCDIC.
> +*/
> +
> +#include <wchar.h>
> +#include <errno.h>
> +#include <ctype.h>
> +#include <inttypes.h>
> +
> +/* convert digit wide character to number, in any base */
> +
> +#define ToWNumber(c) (iswdigit(c) ? (c) - L'0' : \
> + iswupper(c) ? (c) - L'A' + 10 : \
> + iswlower(c) ? (c) - L'a' + 10 : \
> + -1 /* "invalid" flag */ \
> + )
> +
> +/* validate converted digit character for specific base */
> +
> +#define valid(n, b) ((n) >= 0 && (n) < (b))
> +
> +intmax_t
> +wcstoimax(
> + nptr, endptr, base)
> + register const wchar_t * __restrict__ nptr;
> + wchar_t ** __restrict__ endptr;
> + register int base;
> +{
> + /* accumulates converted value */
> +
> + register uintmax_t accum;
> +
> + /* numeral from digit character */
> +
> + register int n;
> +
> + /* set iff minus sign seen */
> +
> + int minus;
> +
> + /* set iff value overflows */
> +
> + int toobig;
> +
> + /* in case no conv performed */
> +
> + if (endptr != NULL)
> + *endptr = (wchar_t *)nptr;
> +
> + /* unspecified behavior */
> +
> + if (base < 0 || base == 1 || base > 36){
> + errno = EDOM;
> + return 0;
> + }
> +
> + /* skip initial, possibly empty sequence of white-space w.characters */
> +
> + while (iswspace(*nptr))
> + ++nptr;
> +
> + /* process subject sequence: */
> +
> + /* optional sign */
> +
> + if ((minus = *nptr == L'-') || *nptr == L'+')
> + ++nptr;
> +
> + if (base == 0){
> + if (*nptr == L'0'){
> + if (nptr[1] == L'X' || nptr[1] == L'x')
> + base = 16;
> + else
> + base = 8;
> + }
> + else
> + base = 10;
> + }
> +
> + /* optional "0x" or "0X" for base 16 */
> +
> + if ( base == 16 && *nptr == L'0' && (nptr[1] == L'X' || nptr[1] ==
> L'x'))
> +
> + /* skip past this prefix */
> +
> + nptr += 2;
> +
> + /* check whether there is at least one valid digit */
> +
> + n = ToWNumber(*nptr);
> + ++nptr;
> +
> + /* subject seq. not of expected form */
> +
> + if (!valid(n, base))
> + return 0;
> +
> + accum = n;
> +
> + for (toobig = 0; n = ToWNumber(*nptr), valid(n, base); ++nptr)
> +
> + /* major wrap-around */
> +
> + if (accum > (uintmax_t)(INTMAX_MAX / base + 2))
> +
> + /* but keep scanning */
> +
> + toobig = 1;
> + else
> + accum = base * accum + n;
> +
> + /* -> first not-valid-digit */
> +
> + if (endptr != NULL)
> + *endptr = (wchar_t *)nptr;
> +
> + if (minus){
> + if (accum > (uintmax_t)INTMAX_MAX + 1)
> + toobig = 1;
> + }
> + else
> + if (accum > (uintmax_t)INTMAX_MAX)
> + toobig = 1;
> +
> + if (toobig){
> + errno = ERANGE;
> + return minus ? INTMAX_MIN : INTMAX_MAX;
> + }
> + else
> + return (intmax_t)(minus ? -accum : accum);
> +}
> +
> +long long
> +__attribute__ (
> + (alias ("wcstoimax")))
> +wcstoll (
> + const wchar_t* __restrict__ nptr,
> + wchar_t ** __restrict__ endptr, int base);
> +
> diff --git a/cpukit/inttypes/wcstoumax.c b/cpukit/inttypes/wcstoumax.c
> new file mode 100644
> index 0000000..890126e
> --- /dev/null
> +++ b/cpukit/inttypes/wcstoumax.c
> @@ -0,0 +1,144 @@
> +/**
> + * This file has no copyright assigned and is placed in the Public Domain.
> + * This file is part of the mingw-w64 runtime package.
> + * No warranty is given; refer to the file DISCLAIMER.PD within this
> package.
> + */
> +
> +/*
> + * This source code was extracted from the Q8 package created and
> + * placed in the PUBLIC DOMAIN by Doug Gwyn <gwyn at arl.mil>
> + * last edit: 1999/11/05 gwyn at arl.mil
> + * Implements subclause 7.8.2 of ISO/IEC 9899:1999 (E).
> + * This particular implementation requires the matching <inttypes.h>.
> + * It also assumes that character codes for A..Z and a..z are in
> + * contiguous ascending order; this is true for ASCII but not EBCDIC.
> +*/
> +
> +#include <wchar.h>
> +#include <errno.h>
> +#include <ctype.h>
> +#include <inttypes.h>
> +
> +/* convert digit wide character to number, in any base */
> +
> +#define ToWNumber(c) (iswdigit(c) ? (c) - L'0' : \
> + iswupper(c) ? (c) - L'A' + 10 : \
> + iswlower(c) ? (c) - L'a' + 10 : \
> + -1 /* "invalid" flag */ \
> + )
> +
> +/* validate converted digit character for specific base */
> +#define valid(n, b) ((n) >= 0 && (n) < (b))
> +
> +uintmax_t
> +wcstoumax(
> + nptr, endptr, base)
> + register const wchar_t * __restrict__ nptr;
> + wchar_t ** __restrict__ endptr;
> + register int base;
> +{
> + /* accumulates converted value */
> +
> + register uintmax_t accum, next;
> +
> + /* numeral from digit character */
> +
> + register int n;
> +
> + /* set iff minus sign seen */
> +
> + int minus;
> +
> + /* set iff value overflows */
> +
> + int toobig;
> +
> + /* in case no conv performed */
> +
> + if (endptr != NULL)
> + *endptr = (wchar_t *)nptr;
> +
> + /* unspecified behavior */
> +
> + if (base < 0 || base == 1 || base > 36){
> + errno = EDOM;
> + return 0;
> + }
> +
> +
> + /* skip initial, possibly empty sequence of white-space w.characters */
> +
> + while (iswspace(*nptr))
> + ++nptr;
> +
> + /* process subject sequence: */
> +
> + /* optional sign */
> +
> + if ((minus = *nptr == L'-') || *nptr == L'+')
> + ++nptr;
> +
> + if (base == 0){
> + if (*nptr == L'0'){
> + if (nptr[1] == L'X' || nptr[1] == L'x')
> + base = 16;
> + else
> + base = 8;
> + }
> + else
> + base = 10;
> + }
> +
> + /* optional "0x" or "0X" for base 16 */
> +
> + if ( base == 16 && *nptr == L'0' && (nptr[1] == L'X' || nptr[1] ==
> L'x'))
> +
> + /* skip past this prefix */
> +
> + nptr += 2;
> +
> + /* check whether there is at least one valid digit */
> +
> + n = ToWNumber(*nptr);
> + ++nptr;
> +
> + /* subject seq. not of expected form */
> +
> + if (!valid(n, base))
> + return 0;
> +
> + accum = n;
> +
> + for (toobig = 0; n = ToWNumber(*nptr), valid(n, base); ++nptr)
> +
> + /* minor wrap-around */
> +
> + if (accum > UINTMAX_MAX / base + 1 || (next = base * accum + n) <
> accum)
> +
> + /* but keep scanning */
> +
> + toobig = 1;
> + else
> + accum = next;
> +
> + /* -> first not-valid-digit */
> +
> + if ( endptr != NULL )
> + *endptr = (wchar_t *)nptr;
> +
> + if ( toobig )
> + {
> + errno = ERANGE;
> + return UINTMAX_MAX;
> + }
> + else
> + return minus ? -accum : accum; /* (yes!) */
> +}
> +
> +unsigned long long
> +__attribute__ (
> + (alias ("wcstoumax")))
> +wcstoull (
> + const wchar_t* __restrict__ nptr,
> + wchar_t ** __restrict__ endptr, int base);
> +
> diff --git a/cpukit/preinstall.am b/cpukit/preinstall.am
> index ef09294..6f94076 100644
> --- a/cpukit/preinstall.am
> +++ b/cpukit/preinstall.am
> @@ -71,35 +71,6 @@ $(PROJECT_INCLUDE)/sys/event.h:
> libcsupport/include/sys/event.h $(PROJECT_INCLUD
> $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/sys/event.h
> PREINSTALL_FILES += $(PROJECT_INCLUDE)/sys/event.h
>
> -$(PROJECT_INCLUDE)/sys/poll.h: libcsupport/include/sys/poll.h
> $(PROJECT_INCLUDE)/sys/$(dirstamp)
> - $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/sys/poll.h
> -PREINSTALL_FILES += $(PROJECT_INCLUDE)/sys/poll.h
> -
> -$(PROJECT_INCLUDE)/sys/statvfs.h: libcsupport/include/sys/statvfs.h
> $(PROJECT_INCLUDE)/sys/$(dirstamp)
> - $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/sys/statvfs.h
> -PREINSTALL_FILES += $(PROJECT_INCLUDE)/sys/statvfs.h
> -
> -$(PROJECT_INCLUDE)/sys/utsname.h: libcsupport/include/sys/utsname.h
> $(PROJECT_INCLUDE)/sys/$(dirstamp)
> - $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/sys/utsname.h
> -PREINSTALL_FILES += $(PROJECT_INCLUDE)/sys/utsname.h
> -
> -$(PROJECT_INCLUDE)/sys/endian.h: include/sys/endian.h
> $(PROJECT_INCLUDE)/sys/$(dirstamp)
> - $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/sys/endian.h
> -PREINSTALL_FILES += $(PROJECT_INCLUDE)/sys/endian.h
> -
> -$(PROJECT_INCLUDE)/sys/priority.h: include/sys/priority.h
> $(PROJECT_INCLUDE)/sys/$(dirstamp)
> - $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/sys/priority.h
> -PREINSTALL_FILES += $(PROJECT_INCLUDE)/sys/priority.h
> -
> -if !HAS_NEWLIB_20170522_HEADER
> -$(PROJECT_INCLUDE)/sys/_iovec.h: include/sys/_iovec.h
> $(PROJECT_INCLUDE)/sys/$(dirstamp)
> - $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/sys/_iovec.h
> -PREINSTALL_FILES += $(PROJECT_INCLUDE)/sys/_iovec.h
> -
> -$(PROJECT_INCLUDE)/sys/uio.h: include/sys/uio.h $(PROJECT_INCLUDE)/sys/$(
> dirstamp)
> - $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/sys/uio.h
> -PREINSTALL_FILES += $(PROJECT_INCLUDE)/sys/uio.h
> -
> $(PROJECT_INCLUDE)/sys/filio.h: libcsupport/include/sys/filio.h
> $(PROJECT_INCLUDE)/sys/$(dirstamp)
> $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/sys/filio.h
> PREINSTALL_FILES += $(PROJECT_INCLUDE)/sys/filio.h
> @@ -112,10 +83,18 @@ $(PROJECT_INCLUDE)/sys/ioctl.h:
> libcsupport/include/sys/ioctl.h $(PROJECT_INCLUD
> $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/sys/ioctl.h
> PREINSTALL_FILES += $(PROJECT_INCLUDE)/sys/ioctl.h
>
> +$(PROJECT_INCLUDE)/sys/poll.h: libcsupport/include/sys/poll.h
> $(PROJECT_INCLUDE)/sys/$(dirstamp)
> + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/sys/poll.h
> +PREINSTALL_FILES += $(PROJECT_INCLUDE)/sys/poll.h
> +
> $(PROJECT_INCLUDE)/sys/sockio.h: libcsupport/include/sys/sockio.h
> $(PROJECT_INCLUDE)/sys/$(dirstamp)
> $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/sys/sockio.h
> PREINSTALL_FILES += $(PROJECT_INCLUDE)/sys/sockio.h
>
> +$(PROJECT_INCLUDE)/sys/statvfs.h: libcsupport/include/sys/statvfs.h
> $(PROJECT_INCLUDE)/sys/$(dirstamp)
> + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/sys/statvfs.h
> +PREINSTALL_FILES += $(PROJECT_INCLUDE)/sys/statvfs.h
> +
> $(PROJECT_INCLUDE)/sys/_termios.h: libcsupport/include/sys/_termios.h
> $(PROJECT_INCLUDE)/sys/$(dirstamp)
> $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/sys/_termios.h
> PREINSTALL_FILES += $(PROJECT_INCLUDE)/sys/_termios.h
> @@ -131,7 +110,27 @@ PREINSTALL_FILES += $(PROJECT_INCLUDE)/sys/ttycom.h
> $(PROJECT_INCLUDE)/sys/ttydefaults.h: libcsupport/include/sys/ttydefaults.h
> $(PROJECT_INCLUDE)/sys/$(dirstamp)
> $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/sys/ttydefaults.h
> PREINSTALL_FILES += $(PROJECT_INCLUDE)/sys/ttydefaults.h
> -endif
> +
> +$(PROJECT_INCLUDE)/sys/utsname.h: libcsupport/include/sys/utsname.h
> $(PROJECT_INCLUDE)/sys/$(dirstamp)
> + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/sys/utsname.h
> +PREINSTALL_FILES += $(PROJECT_INCLUDE)/sys/utsname.h
> +
> +$(PROJECT_INCLUDE)/sys/endian.h: include/sys/endian.h
> $(PROJECT_INCLUDE)/sys/$(dirstamp)
> + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/sys/endian.h
> +PREINSTALL_FILES += $(PROJECT_INCLUDE)/sys/endian.h
> +
> +$(PROJECT_INCLUDE)/sys/uio.h: include/sys/uio.h $(PROJECT_INCLUDE)/sys/$(
> dirstamp)
> + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/sys/uio.h
> +PREINSTALL_FILES += $(PROJECT_INCLUDE)/sys/uio.h
> +
> +$(PROJECT_INCLUDE)/sys/_iovec.h: include/sys/_iovec.h
> $(PROJECT_INCLUDE)/sys/$(dirstamp)
> + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/sys/_iovec.h
> +PREINSTALL_FILES += $(PROJECT_INCLUDE)/sys/_iovec.h
> +
> +$(PROJECT_INCLUDE)/sys/priority.h: include/sys/priority.h
> $(PROJECT_INCLUDE)/sys/$(dirstamp)
> + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/sys/priority.h
> +PREINSTALL_FILES += $(PROJECT_INCLUDE)/sys/priority.h
> +
> if LIBNETWORKING
> $(PROJECT_INCLUDE)/rtems/bsdnet/$(dirstamp):
> @$(MKDIR_P) $(PROJECT_INCLUDE)/rtems/bsdnet
> --
> 2.7.4
>
> _______________________________________________
> devel mailing list
> devel at rtems.org
> http://lists.rtems.org/mailman/listinfo/devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rtems.org/pipermail/devel/attachments/20170612/f36d6d86/attachment-0002.html>
More information about the devel
mailing list