OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [tags/] [gnu-src/] [newlib-1.18.0/] [newlib-1.18.0-or32-1.0rc2/] [newlib/] [libc/] [stdlib/] [wcsnrtombs.c] - Diff between revs 207 and 520

Only display areas with differences | Details | Blame | View Log

Rev 207 Rev 520
/*
/*
FUNCTION
FUNCTION
<<wcsrtombs>>, <<wcsnrtombs>>---convert a wide-character string to a character string
<<wcsrtombs>>, <<wcsnrtombs>>---convert a wide-character string to a character string
 
 
INDEX
INDEX
        wcsrtombs
        wcsrtombs
INDEX
INDEX
        _wcsrtombs_r
        _wcsrtombs_r
INDEX
INDEX
        wcsnrtombs
        wcsnrtombs
INDEX
INDEX
        _wcsnrtombs_r
        _wcsnrtombs_r
 
 
ANSI_SYNOPSIS
ANSI_SYNOPSIS
        #include <wchar.h>
        #include <wchar.h>
        size_t wcsrtombs(char *<[dst]>, const wchar_t **<[src]>, size_t <[len]>,
        size_t wcsrtombs(char *<[dst]>, const wchar_t **<[src]>, size_t <[len]>,
                         mbstate_t *<[ps]>);
                         mbstate_t *<[ps]>);
 
 
        #include <wchar.h>
        #include <wchar.h>
        size_t _wcsrtombs_r(struct _reent *<[ptr]>, char *<[dst]>,
        size_t _wcsrtombs_r(struct _reent *<[ptr]>, char *<[dst]>,
                            const wchar_t **<[src]>, size_t <[len]>,
                            const wchar_t **<[src]>, size_t <[len]>,
                            mbstate_t *<[ps]>);
                            mbstate_t *<[ps]>);
 
 
        #include <wchar.h>
        #include <wchar.h>
        size_t wcsnrtombs(char *<[dst]>, const wchar_t **<[src]>,
        size_t wcsnrtombs(char *<[dst]>, const wchar_t **<[src]>,
                          size_t <[nwc]>, size_t <[len]>, mbstate_t *<[ps]>);
                          size_t <[nwc]>, size_t <[len]>, mbstate_t *<[ps]>);
 
 
        #include <wchar.h>
        #include <wchar.h>
        size_t _wcsnrtombs_r(struct _reent *<[ptr]>, char *<[dst]>,
        size_t _wcsnrtombs_r(struct _reent *<[ptr]>, char *<[dst]>,
                             const wchar_t **<[src]>, size_t <[nwc]>,
                             const wchar_t **<[src]>, size_t <[nwc]>,
                             size_t <[len]>, mbstate_t *<[ps]>);
                             size_t <[len]>, mbstate_t *<[ps]>);
 
 
TRAD_SYNOPSIS
TRAD_SYNOPSIS
        #include <wchar.h>
        #include <wchar.h>
        size_t wcsrtombs(<[dst]>, <[src]>, <[len]>, <[ps]>)
        size_t wcsrtombs(<[dst]>, <[src]>, <[len]>, <[ps]>)
        char *<[dst]>;
        char *<[dst]>;
        const wchar_t **<[src]>;
        const wchar_t **<[src]>;
        size_t <[len]>;
        size_t <[len]>;
        mbstate_t *<[ps]>;
        mbstate_t *<[ps]>;
 
 
        #include <wchar.h>
        #include <wchar.h>
        size_t _wcsrtombs_r(<[ptr]>, <[dst]>, <[src]>, <[len]>, <[ps]>)
        size_t _wcsrtombs_r(<[ptr]>, <[dst]>, <[src]>, <[len]>, <[ps]>)
        struct _rent *<[ptr]>;
        struct _rent *<[ptr]>;
        char *<[dst]>;
        char *<[dst]>;
        const wchar_t **<[src]>;
        const wchar_t **<[src]>;
        size_t <[len]>;
        size_t <[len]>;
        mbstate_t *<[ps]>;
        mbstate_t *<[ps]>;
 
 
        #include <wchar.h>
        #include <wchar.h>
        size_t wcsnrtombs(<[dst]>, <[src]>, <[nwc]>, <[len]>, <[ps]>)
        size_t wcsnrtombs(<[dst]>, <[src]>, <[nwc]>, <[len]>, <[ps]>)
        char *<[dst]>;
        char *<[dst]>;
        const wchar_t **<[src]>;
        const wchar_t **<[src]>;
        size_t <[nwc]>;
        size_t <[nwc]>;
        size_t <[len]>;
        size_t <[len]>;
        mbstate_t *<[ps]>;
        mbstate_t *<[ps]>;
 
 
        #include <wchar.h>
        #include <wchar.h>
        size_t _wcsnrtombs_r(<[ptr]>, <[dst]>, <[src]>, <[nwc]>, <[len]>, <[ps]>)
        size_t _wcsnrtombs_r(<[ptr]>, <[dst]>, <[src]>, <[nwc]>, <[len]>, <[ps]>)
        struct _rent *<[ptr]>;
        struct _rent *<[ptr]>;
        char *<[dst]>;
        char *<[dst]>;
        const wchar_t **<[src]>;
        const wchar_t **<[src]>;
        size_t <[nwc]>;
        size_t <[nwc]>;
        size_t <[len]>;
        size_t <[len]>;
        mbstate_t *<[ps]>;
        mbstate_t *<[ps]>;
 
 
DESCRIPTION
DESCRIPTION
The <<wcsrtombs>> function converts a string of wide characters indirectly
The <<wcsrtombs>> function converts a string of wide characters indirectly
pointed to by <[src]> to a corresponding multibyte character string stored in
pointed to by <[src]> to a corresponding multibyte character string stored in
the array pointed to by <[dst}>.  No more than <[len]> bytes are written to
the array pointed to by <[dst}>.  No more than <[len]> bytes are written to
<[dst}>.
<[dst}>.
 
 
If <[dst}> is NULL, no characters are stored.
If <[dst}> is NULL, no characters are stored.
 
 
If <[dst}> is not NULL, the pointer pointed to by <[src]> is updated to point
If <[dst}> is not NULL, the pointer pointed to by <[src]> is updated to point
to the character after the one that conversion stopped at.  If conversion
to the character after the one that conversion stopped at.  If conversion
stops because a null character is encountered, *<[src]> is set to NULL.
stops because a null character is encountered, *<[src]> is set to NULL.
 
 
The mbstate_t argument, <[ps]>, is used to keep track of the shift state.  If
The mbstate_t argument, <[ps]>, is used to keep track of the shift state.  If
it is NULL, <<wcsrtombs>> uses an internal, static mbstate_t object, which
it is NULL, <<wcsrtombs>> uses an internal, static mbstate_t object, which
is initialized to the initial conversion state at program startup.
is initialized to the initial conversion state at program startup.
 
 
The <<wcsnrtombs>> function behaves identically to <<wcsrtombs>>, except that
The <<wcsnrtombs>> function behaves identically to <<wcsrtombs>>, except that
conversion stops after reading at most <[nwc]> characters from the buffer
conversion stops after reading at most <[nwc]> characters from the buffer
pointed to by <[src]>.
pointed to by <[src]>.
 
 
RETURNS
RETURNS
The <<wcsrtombs>> and <<wcsnrtombs>> functions return the number of bytes
The <<wcsrtombs>> and <<wcsnrtombs>> functions return the number of bytes
stored in the array pointed to by <[dst]> (not including any terminating
stored in the array pointed to by <[dst]> (not including any terminating
null), if successful, otherwise it returns (size_t)-1.
null), if successful, otherwise it returns (size_t)-1.
 
 
PORTABILITY
PORTABILITY
<<wcsrtombs>> is defined by C99 standard.
<<wcsrtombs>> is defined by C99 standard.
<<wcsnrtombs>> is defined by the POSIX.1-2008 standard.
<<wcsnrtombs>> is defined by the POSIX.1-2008 standard.
*/
*/
 
 
#include <reent.h>
#include <reent.h>
#include <newlib.h>
#include <newlib.h>
#include <wchar.h>
#include <wchar.h>
#include <stdlib.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdio.h>
#include <errno.h>
#include <errno.h>
#include "local.h"
#include "local.h"
 
 
size_t
size_t
_DEFUN (_wcsnrtombs_r, (r, dst, src, nwc, len, ps),
_DEFUN (_wcsnrtombs_r, (r, dst, src, nwc, len, ps),
        struct _reent *r _AND
        struct _reent *r _AND
        char *dst _AND
        char *dst _AND
        const wchar_t **src _AND
        const wchar_t **src _AND
        size_t nwc _AND
        size_t nwc _AND
        size_t len _AND
        size_t len _AND
        mbstate_t *ps)
        mbstate_t *ps)
{
{
  char *ptr = dst;
  char *ptr = dst;
  char buff[10];
  char buff[10];
  wchar_t *pwcs;
  wchar_t *pwcs;
  size_t n;
  size_t n;
  int i;
  int i;
 
 
#ifdef _MB_CAPABLE
#ifdef _MB_CAPABLE
  if (ps == NULL)
  if (ps == NULL)
    {
    {
      _REENT_CHECK_MISC(r);
      _REENT_CHECK_MISC(r);
      ps = &(_REENT_WCSRTOMBS_STATE(r));
      ps = &(_REENT_WCSRTOMBS_STATE(r));
    }
    }
#endif
#endif
 
 
  /* If no dst pointer, treat len as maximum possible value. */
  /* If no dst pointer, treat len as maximum possible value. */
  if (dst == NULL)
  if (dst == NULL)
    len = (size_t)-1;
    len = (size_t)-1;
 
 
  n = 0;
  n = 0;
  pwcs = (wchar_t *)(*src);
  pwcs = (wchar_t *)(*src);
 
 
  while (n < len && nwc-- > 0)
  while (n < len && nwc-- > 0)
    {
    {
      int count = ps->__count;
      int count = ps->__count;
      wint_t wch = ps->__value.__wch;
      wint_t wch = ps->__value.__wch;
      int bytes = __wctomb (r, buff, *pwcs, __locale_charset (), ps);
      int bytes = __wctomb (r, buff, *pwcs, __locale_charset (), ps);
      if (bytes == -1)
      if (bytes == -1)
        {
        {
          r->_errno = EILSEQ;
          r->_errno = EILSEQ;
          ps->__count = 0;
          ps->__count = 0;
          return (size_t)-1;
          return (size_t)-1;
        }
        }
      if (n + bytes <= len)
      if (n + bytes <= len)
        {
        {
          n += bytes;
          n += bytes;
          if (dst)
          if (dst)
            {
            {
              for (i = 0; i < bytes; ++i)
              for (i = 0; i < bytes; ++i)
                *ptr++ = buff[i];
                *ptr++ = buff[i];
              ++(*src);
              ++(*src);
            }
            }
          if (*pwcs++ == 0x00)
          if (*pwcs++ == 0x00)
            {
            {
              if (dst)
              if (dst)
                *src = NULL;
                *src = NULL;
              ps->__count = 0;
              ps->__count = 0;
              return n - 1;
              return n - 1;
            }
            }
        }
        }
      else
      else
        {
        {
          /* not enough room, we must back up state to before __wctomb call */
          /* not enough room, we must back up state to before __wctomb call */
          ps->__count = count;
          ps->__count = count;
          ps->__value.__wch = wch;
          ps->__value.__wch = wch;
          len = 0;
          len = 0;
        }
        }
    }
    }
 
 
  return n;
  return n;
}
}
 
 
#ifndef _REENT_ONLY
#ifndef _REENT_ONLY
size_t
size_t
_DEFUN (wcsnrtombs, (dst, src, nwc, len, ps),
_DEFUN (wcsnrtombs, (dst, src, nwc, len, ps),
        char *dst _AND
        char *dst _AND
        const wchar_t **src _AND
        const wchar_t **src _AND
        size_t nwc _AND
        size_t nwc _AND
        size_t len _AND
        size_t len _AND
        mbstate_t *ps)
        mbstate_t *ps)
{
{
  return _wcsnrtombs_r (_REENT, dst, src, nwc, len, ps);
  return _wcsnrtombs_r (_REENT, dst, src, nwc, len, ps);
}
}
#endif /* !_REENT_ONLY */
#endif /* !_REENT_ONLY */
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.