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/fputwc.c
          +++ new/usr/src/lib/libc/port/locale/fputwc.c
   1    1  /*
        2 + * Copyright 2013 Garrett D'Amore <garrett@damore.org>
   2    3   * Copyright (c) 2002-2004 Tim J. Robbins.
   3    4   * All rights reserved.
   4    5   *
   5    6   * Redistribution and use in source and binary forms, with or without
   6    7   * modification, are permitted provided that the following conditions
   7    8   * are met:
   8    9   * 1. Redistributions of source code must retain the above copyright
   9   10   *    notice, this list of conditions and the following disclaimer.
  10   11   * 2. Redistributions in binary form must reproduce the above copyright
  11   12   *    notice, this list of conditions and the following disclaimer in the
  12   13   *    documentation and/or other materials provided with the distribution.
  13   14   *
  14   15   * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
  15   16   * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  16   17   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  17   18   * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
  18   19   * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  19   20   * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  20   21   * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  21   22   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  22   23   * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  23   24   * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  24   25   * SUCH DAMAGE.
  25   26   */
  26   27  
  27   28  /*
  28   29   * Copyright 2010 Nexenta Systems, Inc.  All rights reserved.
  29   30   * Use is subject to license terms.
  30   31   */
  31   32  
  32   33  #include "lint.h"
  33   34  #include "file64.h"
  34   35  #include "mtlib.h"
  35   36  #include "mse_int.h"
  36   37  #include <errno.h>
  37   38  #include <limits.h>
  38   39  #include <stdio.h>
  39   40  #include <stdlib.h>
  40   41  #include <wchar.h>
  41   42  #include <synch.h>
  42   43  #include "mblocal.h"
  43   44  #include "stdiom.h"
  44   45  #include "mse.h"
  45   46  
  46   47  #pragma weak    _putwc = putwc
  47   48  
  48   49  /*
  49   50   * FreeBSD had both a MT safe and non-MT safe version.  For whatever reason,
  50   51   * we don't need the non-MT safe version.  We do this because its faster,
  51   52   * since we don't have to lock the file while doing the potentially expensive
  52   53   * conversion from wide to mb.
  53   54   *
  54   55   * Solaris also has XPG5 and legacy semantics.  The new standard requires
  55   56   * that the stream orientation change, but legacy calls don't do that.
  56   57   *
  57   58   * Note that we had the source for the XPG5 version of this, but it relied
  58   59   * on closed implementation bits that we lack, so we supply replacements
  59   60   * here.
  60   61   */
  61   62  static wint_t
  62   63  __fputwc_impl(wchar_t wc, FILE *fp, int orient)
  63   64  {
  64   65          char buf[MB_LEN_MAX];
  
    | 
      ↓ open down ↓ | 
    53 lines elided | 
    
      ↑ open up ↑ | 
  
  65   66          size_t          i, len;
  66   67          rmutex_t        *mx;
  67   68  
  68   69          /* If we are given WEOF, then we have to stop */
  69   70          if (wc == WEOF)
  70   71                  return (WEOF);
  71   72  
  72   73          if (MB_CUR_MAX == 1 && wc > 0 && wc <= UCHAR_MAX) {
  73   74                  /*
  74   75                   * Assume single-byte locale with no special encoding.
  75      -                 * A more careful test would be to check
  76      -                 * _CurrentRuneLocale->encoding.
  77   76                   */
  78   77                  *buf = (unsigned char)wc;
  79   78                  len = 1;
  80   79          } else {
  81   80                  /*
  82   81                   * FreeBSD used restartable wcrtomb.  I think we can use
  83   82                   * the simpler wctomb form here.  We should have a complete
  84   83                   * decode.
  85   84                   */
  86   85                  if ((len = wctomb(buf, wc)) == (size_t)-1) {
  87   86                          fp->_flag |= _IOERR;
  88   87                          errno = EILSEQ;
  89   88                          return (WEOF);
  90   89                  }
  91   90          }
  92   91  
  93   92          FLOCKFILE(mx, fp);
  94   93          /*
  95   94           * This is used for XPG 5 semantics, which requires the stream
  96   95           * orientation to be changed when the function is called.
  97   96           */
  98   97          if (orient && GET_NO_MODE(fp)) {
  99   98                  _setorientation(fp, _WC_MODE);
 100   99          }
 101  100          for (i = 0; i < len; i++) {
 102  101                  if (PUTC((unsigned char)buf[i], fp) == EOF) {
 103  102                          FUNLOCKFILE(mx);
 104  103                          return (WEOF);
 105  104                  }
 106  105          }
 107  106          FUNLOCKFILE(mx);
 108  107          return ((wint_t)wc);
 109  108  }
 110  109  
 111  110  wint_t
 112  111  fputwc(wchar_t wc, FILE *fp)
 113  112  {
 114  113          return (__fputwc_impl(wc, fp, 0));
 115  114  }
 116  115  
 117  116  /*
 118  117   * Trivial functional form of the typical macro.
 119  118   */
 120  119  #undef __putwc
 121  120  wint_t
 122  121  putwc(wchar_t wc, FILE *fp)
 123  122  {
 124  123          return (__fputwc_impl(wc, fp, 0));
 125  124  }
 126  125  
 127  126  wint_t
 128  127  __fputwc_xpg5(wint_t wc, FILE *fp)
 129  128  {
 130  129          return (__fputwc_impl(wc, fp, 1));
 131  130  }
 132  131  
 133  132  #undef __putwc_xpg5
 134  133  wint_t
 135  134  __putwc_xpg5(wint_t wc, FILE *fp)
 136  135  {
 137  136          return (__fputwc_impl(wc, fp, 1));
 138  137  }
  
    | 
      ↓ open down ↓ | 
    52 lines elided | 
    
      ↑ open up ↑ | 
  
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX