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/strxfrm.c
          +++ new/usr/src/lib/libc/port/locale/strxfrm.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) 1995 Alex Tatmanjants <alex@elvisti.kiev.ua>
   4    5   *              at Electronni Visti IA, Kiev, Ukraine.
   5    6   *                      All rights reserved.
   6    7   *
   7    8   * Redistribution and use in source and binary forms, with or without
   8    9   * modification, are permitted provided that the following conditions
   9   10   * are met:
  10   11   * 1. Redistributions of source code must retain the above copyright
  11   12   *    notice, this list of conditions and the following disclaimer.
↓ open down ↓ 13 lines elided ↑ open up ↑
  25   26   * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  26   27   * SUCH DAMAGE.
  27   28   */
  28   29  
  29   30  #include "lint.h"
  30   31  #include <stdlib.h>
  31   32  #include <string.h>
  32   33  #include <errno.h>
  33   34  #include <wchar.h>
  34   35  #include <assert.h>
       36 +#include <xlocale.h>
  35   37  #include "collate.h"
  36   38  
  37   39  size_t
  38      -strxfrm(char *_RESTRICT_KYWD xf, const char *_RESTRICT_KYWD src, size_t dlen)
       40 +strxfrm_l(char *_RESTRICT_KYWD xf, const char *_RESTRICT_KYWD src,
       41 +    size_t dlen, locale_t loc)
  39   42  {
  40   43          size_t slen;
  41   44          size_t xlen;
  42   45          wchar_t *wcs = NULL;
  43   46  
  44   47          if (!*src) {
  45   48                  if (dlen > 0)
  46   49                          *xf = '\0';
  47   50                  return (0);
  48   51          }
  49   52  
  50   53          /*
  51   54           * The conversion from multibyte to wide character strings is
  52   55           * strictly reducing (one byte of an mbs cannot expand to more
  53   56           * than one wide character.)
  54   57           */
  55   58          slen = strlen(src);
  56   59  
  57      -        if (_collate_load_error)
       60 +        if (loc->collate->lc_is_posix)
  58   61                  goto error;
  59   62  
  60   63          if ((wcs = malloc((slen + 1) * sizeof (wchar_t))) == NULL)
  61   64                  goto error;
  62   65  
  63      -        if (mbstowcs(wcs, src, slen + 1) == (size_t)-1)
       66 +        if (mbstowcs_l(wcs, src, slen + 1, loc) == (size_t)-1)
  64   67                  goto error;
  65   68  
  66      -        if ((xlen = _collate_sxfrm(wcs, xf, dlen)) == (size_t)-1)
       69 +        if ((xlen = _collate_sxfrm(wcs, xf, dlen, loc)) == (size_t)-1)
  67   70                  goto error;
  68   71  
  69   72          if (wcs)
  70   73                  free(wcs);
  71   74  
  72   75          if (dlen > xlen) {
  73   76                  xf[xlen] = 0;
  74   77          } else if (dlen) {
  75   78                  xf[dlen-1] = 0;
  76   79          }
  77   80  
  78   81          return (xlen);
  79   82  
  80   83  error:
  81   84          /* errno should be set to ENOMEM if malloc failed */
  82   85          if (wcs)
  83   86                  free(wcs);
  84   87          (void) strlcpy(xf, src, dlen);
  85   88  
  86   89          return (slen);
       90 +}
       91 +
       92 +size_t
       93 +strxfrm(char *_RESTRICT_KYWD xf, const char *_RESTRICT_KYWD src, size_t dlen)
       94 +{
       95 +        return (strxfrm_l(xf, src, dlen, uselocale(NULL)));
  87   96  }
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX