Print this page
2964 need POSIX 2008 locale object support
Reviewed by: Robert Mustacchi <rm@joyent.com>

Split Close
Expand all
Collapse all
          --- old/usr/src/lib/libc/port/locale/wcsxfrm.c
          +++ new/usr/src/lib/libc/port/locale/wcsxfrm.c
   1    1  /*
        2 + * Copyright 2013 Garrett D'Amore <garrett@damore.org>
   2    3   * Copyright 2011 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 ↓ 17 lines elided ↑ open up ↑
  29   30  #include "lint.h"
  30   31  #include <stdlib.h>
  31   32  #include <string.h>
  32   33  #include <wchar.h>
  33   34  #include <assert.h>
  34   35  #include "collate.h"
  35   36  
  36   37  #define WCS_XFRM_OFFSET 1
  37   38  
  38   39  size_t
  39      -wcsxfrm(wchar_t *_RESTRICT_KYWD dest,
  40      -    const wchar_t *_RESTRICT_KYWD src, size_t len)
       40 +wcsxfrm_l(wchar_t *_RESTRICT_KYWD dest,
       41 +    const wchar_t *_RESTRICT_KYWD src, size_t len, locale_t loc)
  41   42  {
  42   43          size_t slen;
       44 +        const struct lc_collate *lcc = loc->collate;
  43   45  
  44   46          if (*src == L'\0') {
  45   47                  if (len != 0)
  46   48                          *dest = L'\0';
  47   49                  return (0);
  48   50          }
  49   51  
  50      -        if ((_collate_load_error) ||
  51      -            ((slen = _collate_wxfrm(src, dest, len)) == (size_t)-1)) {
       52 +        if ((lcc->lc_is_posix) ||
       53 +            ((slen = _collate_wxfrm(lcc, src, dest, len)) == (size_t)-1)) {
  52   54                  goto error;
  53   55          }
  54   56  
  55   57          /* Add null termination at the correct location. */
  56   58          if (len > slen) {
  57   59                  dest[slen] = 0;
  58   60          } else if (len != 0) {
  59   61                  dest[len-1] = 0;
  60   62          }
  61   63  
↓ open down ↓ 1 lines elided ↑ open up ↑
  63   65  
  64   66  error:
  65   67          slen = wcslen(src);
  66   68          if (slen < len)
  67   69                  (void) wcscpy(dest, src);
  68   70          else if (len != 0) {
  69   71                  (void) wcsncpy(dest, src, len - 1);
  70   72                  dest[len - 1] = L'\0';
  71   73          }
  72   74          return (slen);
       75 +}
       76 +
       77 +size_t
       78 +wcsxfrm(wchar_t *_RESTRICT_KYWD dest,
       79 +    const wchar_t *_RESTRICT_KYWD src, size_t len)
       80 +{
       81 +        return (wcsxfrm_l(dest, src, len, uselocale(NULL)));
  73   82  }
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX