Subversion Repositories Kolibri OS

Rev

Rev 4874 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. /*
  2. FUNCTION
  3. <<mbtowc>>---minimal multibyte to wide char converter
  4.  
  5. INDEX
  6.         mbtowc
  7.  
  8. ANSI_SYNOPSIS
  9.         #include <stdlib.h>
  10.         int mbtowc(wchar_t *restrict <[pwc]>, const char *restrict <[s]>, size_t <[n]>);
  11.  
  12. TRAD_SYNOPSIS
  13.         #include <stdlib.h>
  14.         int mbtowc(<[pwc]>, <[s]>, <[n]>)
  15.         wchar_t *<[pwc]>;
  16.         const char *<[s]>;
  17.         size_t <[n]>;
  18.  
  19. DESCRIPTION
  20. When _MB_CAPABLE is not defined, this is a minimal ANSI-conforming
  21. implementation of <<mbtowc>>.  In this case,
  22. only ``multi-byte character sequences'' recognized are single bytes,
  23. and they are ``converted'' to themselves.
  24. Each call to <<mbtowc>> copies one character from <<*<[s]>>> to
  25. <<*<[pwc]>>>, unless <[s]> is a null pointer.  The argument n
  26. is ignored.
  27.  
  28. When _MB_CAPABLE is defined, this routine calls <<_mbtowc_r>> to perform
  29. the conversion, passing a state variable to allow state dependent
  30. decoding.  The result is based on the locale setting which may
  31. be restricted to a defined set of locales.
  32.  
  33. RETURNS
  34. This implementation of <<mbtowc>> returns <<0>> if
  35. <[s]> is <<NULL>> or is the empty string;
  36. it returns <<1>> if not _MB_CAPABLE or
  37. the character is a single-byte character; it returns <<-1>>
  38. if n is <<0>> or the multi-byte character is invalid;
  39. otherwise it returns the number of bytes in the multibyte character.
  40. If the return value is -1, no changes are made to the <<pwc>>
  41. output string.  If the input is the empty string, a wchar_t nul
  42. is placed in the output string and 0 is returned.  If the input
  43. has a length of 0, no changes are made to the <<pwc>> output string.
  44.  
  45. PORTABILITY
  46. <<mbtowc>> is required in the ANSI C standard.  However, the precise
  47. effects vary with the locale.
  48.  
  49. <<mbtowc>> requires no supporting OS subroutines.
  50. */
  51.  
  52. #ifndef _REENT_ONLY
  53.  
  54. #include <newlib.h>
  55. #include <stdlib.h>
  56. #include <wchar.h>
  57. #include "local.h"
  58.  
  59. int
  60. _DEFUN (mbtowc, (pwc, s, n),
  61.         wchar_t *__restrict pwc _AND
  62.         const char *__restrict s _AND
  63.         size_t n)
  64. {
  65. #ifdef _MB_CAPABLE
  66.   int retval = 0;
  67.   struct _reent *reent = _REENT;
  68.   mbstate_t *ps;
  69.  
  70.   _REENT_CHECK_MISC(reent);
  71.   ps = &(_REENT_MBTOWC_STATE(reent));
  72.  
  73.   retval = __mbtowc (reent, pwc, s, n, __locale_charset (), ps);
  74.  
  75.   if (retval < 0)
  76.     {
  77.       ps->__count = 0;
  78.       return -1;
  79.     }
  80.   return retval;
  81. #else /* not _MB_CAPABLE */
  82.   if (s == NULL)
  83.     return 0;
  84.   if (n == 0)
  85.     return -1;
  86.   if (pwc)
  87.     *pwc = (wchar_t) *s;
  88.   return (*s != '\0');
  89. #endif /* not _MB_CAPABLE */
  90. }
  91.  
  92. #endif /* !_REENT_ONLY */
  93.  
  94.  
  95.  
  96.  
  97.