[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-0001.html>


More information about the devel mailing list