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

   2  * Copyright (c) 2002-2004 Tim J. Robbins.
   3  * All rights reserved.
   4  *
   5  * Redistribution and use in source and binary forms, with or without
   6  * modification, are permitted provided that the following conditions
   7  * are met:
   8  * 1. Redistributions of source code must retain the above copyright
   9  *    notice, this list of conditions and the following disclaimer.
  10  * 2. Redistributions in binary form must reproduce the above copyright
  11  *    notice, this list of conditions and the following disclaimer in the
  12  *    documentation and/or other materials provided with the distribution.
  13  *
  14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
  15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
  18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT


  55  * that the stream orientation change, but legacy calls don't do that.
  56  *
  57  * Note that we had the source for the XPG5 version of this, but it relied
  58  * on closed implementation bits that we lack, so we supply replacements
  59  * here.
  60  */
  61 static wint_t
  62 __fputwc_impl(wchar_t wc, FILE *fp, int orient)
  63 {
  64         char buf[MB_LEN_MAX];
  65         size_t          i, len;
  66         rmutex_t        *mx;
  67 
  68         /* If we are given WEOF, then we have to stop */
  69         if (wc == WEOF)
  70                 return (WEOF);
  71 
  72         if (MB_CUR_MAX == 1 && wc > 0 && wc <= UCHAR_MAX) {
  73                 /*
  74                  * Assume single-byte locale with no special encoding.
  75                  * A more careful test would be to check
  76                  * _CurrentRuneLocale->encoding.
  77                  */
  78                 *buf = (unsigned char)wc;
  79                 len = 1;
  80         } else {
  81                 /*
  82                  * FreeBSD used restartable wcrtomb.  I think we can use
  83                  * the simpler wctomb form here.  We should have a complete
  84                  * decode.
  85                  */
  86                 if ((len = wctomb(buf, wc)) == (size_t)-1) {
  87                         fp->_flag |= _IOERR;
  88                         errno = EILSEQ;
  89                         return (WEOF);
  90                 }
  91         }
  92 
  93         FLOCKFILE(mx, fp);
  94         /*
  95          * This is used for XPG 5 semantics, which requires the stream
  96          * orientation to be changed when the function is called.


   1 /*
   2  * Copyright 2013 Garrett D'Amore <garrett@damore.org>
   3  * Copyright (c) 2002-2004 Tim J. Robbins.
   4  * All rights reserved.
   5  *
   6  * Redistribution and use in source and binary forms, with or without
   7  * modification, are permitted provided that the following conditions
   8  * are met:
   9  * 1. Redistributions of source code must retain the above copyright
  10  *    notice, this list of conditions and the following disclaimer.
  11  * 2. Redistributions in binary form must reproduce the above copyright
  12  *    notice, this list of conditions and the following disclaimer in the
  13  *    documentation and/or other materials provided with the distribution.
  14  *
  15  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
  16  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  17  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  18  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
  19  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  20  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  21  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  22  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT


  56  * that the stream orientation change, but legacy calls don't do that.
  57  *
  58  * Note that we had the source for the XPG5 version of this, but it relied
  59  * on closed implementation bits that we lack, so we supply replacements
  60  * here.
  61  */
  62 static wint_t
  63 __fputwc_impl(wchar_t wc, FILE *fp, int orient)
  64 {
  65         char buf[MB_LEN_MAX];
  66         size_t          i, len;
  67         rmutex_t        *mx;
  68 
  69         /* If we are given WEOF, then we have to stop */
  70         if (wc == WEOF)
  71                 return (WEOF);
  72 
  73         if (MB_CUR_MAX == 1 && wc > 0 && wc <= UCHAR_MAX) {
  74                 /*
  75                  * Assume single-byte locale with no special encoding.


  76                  */
  77                 *buf = (unsigned char)wc;
  78                 len = 1;
  79         } else {
  80                 /*
  81                  * FreeBSD used restartable wcrtomb.  I think we can use
  82                  * the simpler wctomb form here.  We should have a complete
  83                  * decode.
  84                  */
  85                 if ((len = wctomb(buf, wc)) == (size_t)-1) {
  86                         fp->_flag |= _IOERR;
  87                         errno = EILSEQ;
  88                         return (WEOF);
  89                 }
  90         }
  91 
  92         FLOCKFILE(mx, fp);
  93         /*
  94          * This is used for XPG 5 semantics, which requires the stream
  95          * orientation to be changed when the function is called.