Print this page
2964 need POSIX 2008 locale object support
Reviewed by: Robert Mustacchi <rm@joyent.com>
Reviewed by: Gordon Ross <gordon.ross@nexenta.com>
Approved by: TBD

Split Close
Expand all
Collapse all
          --- old/usr/src/lib/libc/port/locale/mbsnrtowcs.c
          +++ new/usr/src/lib/libc/port/locale/mbsnrtowcs.c
   1    1  /*
        2 + * Copyright 2013 Garrett D'Amore <garrett@damore.org>
   2    3   * Copyright 2010 Nexenta Systems, Inc.  All rights reserved.
   3    4   * Copyright (c) 2002-2004 Tim J. Robbins.
   4    5   * All rights reserved.
   5    6   *
   6    7   * Redistribution and use in source and binary forms, with or without
   7    8   * modification, are permitted provided that the following conditions
   8    9   * are met:
   9   10   * 1. Redistributions of source code must retain the above copyright
  10   11   *    notice, this list of conditions and the following disclaimer.
  11   12   * 2. Redistributions in binary form must reproduce the above copyright
↓ open down ↓ 12 lines elided ↑ open up ↑
  24   25   * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  25   26   * SUCH DAMAGE.
  26   27   */
  27   28  
  28   29  #include "lint.h"
  29   30  #include <errno.h>
  30   31  #include <limits.h>
  31   32  #include <stdlib.h>
  32   33  #include <wchar.h>
  33   34  #include "mblocal.h"
       35 +#include "localeimpl.h"
       36 +#include "lctype.h"
  34   37  
  35   38  size_t
  36      -mbsnrtowcs(wchar_t *_RESTRICT_KYWD dst, const char **_RESTRICT_KYWD src,
  37      -    size_t nms, size_t len, mbstate_t *_RESTRICT_KYWD ps)
       39 +mbsnrtowcs_l(wchar_t *_RESTRICT_KYWD dst, const char **_RESTRICT_KYWD src,
       40 +    size_t nms, size_t len, mbstate_t *_RESTRICT_KYWD ps, locale_t loc)
  38   41  {
  39   42          static mbstate_t mbs;
  40   43  
  41   44          if (ps == NULL)
  42   45                  ps = &mbs;
  43      -        return (__mbsnrtowcs(dst, src, nms, len, ps));
       46 +        return (loc->ctype->lc_mbsnrtowcs(dst, src, nms, len, ps));
  44   47  }
  45   48  
  46   49  size_t
  47      -__mbsnrtowcs_std(wchar_t *_RESTRICT_KYWD dst, const char **_RESTRICT_KYWD src,
       50 +mbsnrtowcs(wchar_t *_RESTRICT_KYWD dst, const char **_RESTRICT_KYWD src,
  48   51      size_t nms, size_t len, mbstate_t *_RESTRICT_KYWD ps)
  49   52  {
       53 +        return (mbsnrtowcs_l(dst, src, nms, len, ps, uselocale(NULL)));
       54 +}
       55 +
       56 +size_t
       57 +__mbsnrtowcs_std(wchar_t *_RESTRICT_KYWD dst, const char **_RESTRICT_KYWD src,
       58 +    size_t nms, size_t len, mbstate_t *_RESTRICT_KYWD ps,
       59 +    mbrtowc_pfn_t pmbrtowc)
       60 +{
  50   61          const char *s;
  51   62          size_t nchr;
  52   63          wchar_t wc;
  53   64          size_t nb;
  54   65  
  55   66          s = *src;
  56   67          nchr = 0;
  57   68  
  58   69          if (dst == NULL) {
  59   70                  for (;;) {
  60      -                        if ((nb = __mbrtowc(&wc, s, nms, ps)) == (size_t)-1)
       71 +                        if ((nb = pmbrtowc(&wc, s, nms, ps)) == (size_t)-1)
  61   72                                  /* Invalid sequence - mbrtowc() sets errno. */
  62   73                                  return ((size_t)-1);
  63   74                          else if (nb == 0 || nb == (size_t)-2)
  64   75                                  return (nchr);
  65   76                          s += nb;
  66   77                          nms -= nb;
  67   78                          nchr++;
  68   79                  }
  69   80                  /*NOTREACHED*/
  70   81          }
  71   82  
  72   83          while (len-- > 0) {
  73      -                if ((nb = __mbrtowc(dst, s, nms, ps)) == (size_t)-1) {
       84 +                if ((nb = pmbrtowc(dst, s, nms, ps)) == (size_t)-1) {
  74   85                          *src = s;
  75   86                          return ((size_t)-1);
  76   87                  } else if (nb == (size_t)-2) {
  77   88                          *src = s + nms;
  78   89                          return (nchr);
  79   90                  } else if (nb == 0) {
  80   91                          *src = NULL;
  81   92                          return (nchr);
  82   93                  }
  83   94                  s += nb;
  84   95                  nms -= nb;
  85   96                  nchr++;
  86   97                  dst++;
  87   98          }
  88   99          *src = s;
  89  100          return (nchr);
  90  101  }
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX