Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  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
  22.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  23.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  24.  * SUCH DAMAGE.
  25.  */
  26.  
  27. /*
  28. FUNCTION
  29. <<fgetwc>>, <<getwc>>, <<fgetwc_unlocked>>, <<getwc_unlocked>>---get a wide character from a file or stream
  30.  
  31. INDEX
  32.         fgetwc
  33. INDEX
  34.         fgetwc_unlocked
  35. INDEX
  36.         _fgetwc_r
  37. INDEX
  38.         _fgetwc_unlocked_r
  39. INDEX
  40.         getwc
  41. INDEX
  42.         getwc_unlocked
  43. INDEX
  44.         _getwc_r
  45. INDEX
  46.         _getwc_unlocked_r
  47.  
  48. ANSI_SYNOPSIS
  49.         #include <stdio.h>
  50.         #include <wchar.h>
  51.         wint_t fgetwc(FILE *<[fp]>);
  52.  
  53.         #define _GNU_SOURCE
  54.         #include <stdio.h>
  55.         #include <wchar.h>
  56.         wint_t fgetwc_unlocked(FILE *<[fp]>);
  57.  
  58.         #include <stdio.h>
  59.         #include <wchar.h>
  60.         wint_t _fgetwc_r(struct _reent *<[ptr]>, FILE *<[fp]>);
  61.  
  62.         #include <stdio.h>
  63.         #include <wchar.h>
  64.         wint_t _fgetwc_unlocked_r(struct _reent *<[ptr]>, FILE *<[fp]>);
  65.  
  66.         #include <stdio.h>
  67.         #include <wchar.h>
  68.         wint_t getwc(FILE *<[fp]>);
  69.  
  70.         #define _GNU_SOURCE
  71.         #include <stdio.h>
  72.         #include <wchar.h>
  73.         wint_t getwc_unlocked(FILE *<[fp]>);
  74.  
  75.         #include <stdio.h>
  76.         #include <wchar.h>
  77.         wint_t _getwc_r(struct _reent *<[ptr]>, FILE *<[fp]>);
  78.  
  79.         #include <stdio.h>
  80.         #include <wchar.h>
  81.         wint_t _getwc_unlocked_r(struct _reent *<[ptr]>, FILE *<[fp]>);
  82.  
  83. TRAD_SYNOPSIS
  84.         #include <stdio.h>
  85.         #include <wchar.h>
  86.         wint_t fgetwc(<[fp]>)
  87.         FILE *<[fp]>;
  88.  
  89.         #define _GNU_SOURCE
  90.         #include <stdio.h>
  91.         #include <wchar.h>
  92.         wint_t fgetwc_unlocked(<[fp]>)
  93.         FILE *<[fp]>;
  94.  
  95.         #include <stdio.h>
  96.         #include <wchar.h>
  97.         wint_t _fgetwc_r(<[ptr]>, <[fp]>)
  98.         struct _reent *<[ptr]>;
  99.         FILE *<[fp]>;
  100.  
  101.         #include <stdio.h>
  102.         #include <wchar.h>
  103.         wint_t _fgetwc_unlocked_r(<[ptr]>, <[fp]>)
  104.         struct _reent *<[ptr]>;
  105.         FILE *<[fp]>;
  106.  
  107.         #include <stdio.h>
  108.         #include <wchar.h>
  109.         wint_t getwc(<[fp]>)
  110.         FILE *<[fp]>;
  111.  
  112.         #define _GNU_SOURCE
  113.         #include <stdio.h>
  114.         #include <wchar.h>
  115.         wint_t getwc_unlocked(<[fp]>)
  116.         FILE *<[fp]>;
  117.  
  118.         #include <stdio.h>
  119.         #include <wchar.h>
  120.         wint_t _getwc_r(<[ptr]>, <[fp]>)
  121.         struct _reent *<[ptr]>;
  122.         FILE *<[fp]>;
  123.  
  124.         #include <stdio.h>
  125.         #include <wchar.h>
  126.         wint_t _getwc_unlocked_r(<[ptr]>, <[fp]>)
  127.         struct _reent *<[ptr]>;
  128.         FILE *<[fp]>;
  129.  
  130. DESCRIPTION
  131. Use <<fgetwc>> to get the next wide character from the file or stream
  132. identified by <[fp]>.  As a side effect, <<fgetwc>> advances the file's
  133. current position indicator.
  134.  
  135. <<fgetwc_unlocked>> is a non-thread-safe version of <<fgetwc>>.
  136. <<fgetwc_unlocked>> may only safely be used within a scope
  137. protected by flockfile() (or ftrylockfile()) and funlockfile().  This
  138. function may safely be used in a multi-threaded program if and only
  139. if they are called while the invoking thread owns the (FILE *)
  140. object, as is the case after a successful call to the flockfile() or
  141. ftrylockfile() functions.  If threads are disabled, then
  142. <<fgetwc_unlocked>> is equivalent to <<fgetwc>>.
  143.  
  144. The <<getwc>> and <<getwc_unlocked>> functions or macros functions identically
  145. to <<fgetwc>> and <<fgetwc_unlocked>>.  It may be implemented as a macro, and
  146. may evaluate its argument more than once. There is no reason ever to use it.
  147.  
  148. <<_fgetwc_r>>, <<_getwc_r>>, <<_fgetwc_unlocked_r>>, and <<_getwc_unlocked_r>>
  149. are simply reentrant versions of the above functions that are passed the
  150. additional reentrant structure pointer argument: <[ptr]>.
  151.  
  152. RETURNS
  153. The next wide character cast to <<wint_t>>, unless there is no more data,
  154. or the host system reports a read error; in either of these situations,
  155. <<fgetwc>> and <<getwc>> return <<WEOF>>.
  156.  
  157. You can distinguish the two situations that cause an <<EOF>> result by
  158. using the <<ferror>> and <<feof>> functions.
  159.  
  160. PORTABILITY
  161. <<fgetwc>> and <<getwc>> are required by C99 and POSIX.1-2001.
  162.  
  163. <<fgetwc_unlocked>> and <<getwc_unlocked>> are GNU extensions.
  164. */
  165.  
  166. #include <_ansi.h>
  167. #include <reent.h>
  168. #include <errno.h>
  169. #include <stdio.h>
  170. #include <stdlib.h>
  171. #include <wchar.h>
  172. #include "local.h"
  173.  
  174. wint_t
  175. _DEFUN(__fgetwc, (ptr, fp),
  176.         struct _reent *ptr _AND
  177.         register FILE *fp)
  178. {
  179.   wchar_t wc;
  180.   size_t nconv;
  181.  
  182.   if (fp->_r <= 0 && __srefill_r (ptr, fp))
  183.     return (WEOF);
  184.   if (MB_CUR_MAX == 1)
  185.     {
  186.       /* Fast path for single-byte encodings. */
  187.       wc = *fp->_p++;
  188.       fp->_r--;
  189.       return (wc);
  190.     }
  191.   do
  192.     {
  193.       nconv = _mbrtowc_r (ptr, &wc, (char *) fp->_p, fp->_r, &fp->_mbstate);
  194.       if (nconv == (size_t)-1)
  195.         break;
  196.       else if (nconv == (size_t)-2)
  197.         continue;
  198.       else if (nconv == 0)
  199.         {
  200.           /*
  201.            * Assume that the only valid representation of
  202.            * the null wide character is a single null byte.
  203.            */
  204.           fp->_p++;
  205.           fp->_r--;
  206.           return (L'\0');
  207.         }
  208.       else
  209.         {
  210.           fp->_p += nconv;
  211.           fp->_r -= nconv;
  212.           return (wc);
  213.         }
  214.     }
  215.   while (__srefill_r(ptr, fp) == 0);
  216.   fp->_flags |= __SERR;
  217.   errno = EILSEQ;
  218.   return (WEOF);
  219. }
  220.  
  221. wint_t
  222. _DEFUN(_fgetwc_r, (ptr, fp),
  223.         struct _reent *ptr _AND
  224.         register FILE *fp)
  225. {
  226.   wint_t r;
  227.  
  228.   _newlib_flockfile_start (fp);
  229.   ORIENT(fp, 1);
  230.   r = __fgetwc (ptr, fp);
  231.   _newlib_flockfile_end (fp);
  232.   return r;
  233. }
  234.  
  235. wint_t
  236. _DEFUN(fgetwc, (fp),
  237.         FILE *fp)
  238. {
  239.   struct _reent *reent = _REENT;
  240.  
  241.   CHECK_INIT(reent, fp);
  242.   return _fgetwc_r (reent, fp);
  243. }
  244.