source: trunk/libs/newlib/src/newlib/libc/stdio/fgetwc.c @ 450

Last change on this file since 450 was 444, checked in by satin@…, 6 years ago

add newlib,libalmos-mkh, restructure shared_syscalls.h and mini-libc

File size: 5.2 KB
Line 
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/*
28FUNCTION
29<<fgetwc>>, <<getwc>>, <<fgetwc_unlocked>>, <<getwc_unlocked>>---get a wide character from a file or stream
30
31INDEX
32        fgetwc
33INDEX
34        fgetwc_unlocked
35INDEX
36        _fgetwc_r
37INDEX
38        _fgetwc_unlocked_r
39INDEX
40        getwc
41INDEX
42        getwc_unlocked
43INDEX
44        _getwc_r
45INDEX
46        _getwc_unlocked_r
47
48SYNOPSIS
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
83DESCRIPTION
84Use <<fgetwc>> to get the next wide character from the file or stream
85identified by <[fp]>.  As a side effect, <<fgetwc>> advances the file's
86current position indicator.
87
88<<fgetwc_unlocked>> is a non-thread-safe version of <<fgetwc>>.
89<<fgetwc_unlocked>> may only safely be used within a scope
90protected by flockfile() (or ftrylockfile()) and funlockfile().  This
91function may safely be used in a multi-threaded program if and only
92if they are called while the invoking thread owns the (FILE *)
93object, as is the case after a successful call to the flockfile() or
94ftrylockfile() functions.  If threads are disabled, then
95<<fgetwc_unlocked>> is equivalent to <<fgetwc>>.
96
97The <<getwc>> and <<getwc_unlocked>> functions or macros functions identically
98to <<fgetwc>> and <<fgetwc_unlocked>>.  It may be implemented as a macro, and
99may evaluate its argument more than once. There is no reason ever to use it.
100
101<<_fgetwc_r>>, <<_getwc_r>>, <<_fgetwc_unlocked_r>>, and <<_getwc_unlocked_r>>
102are simply reentrant versions of the above functions that are passed the
103additional reentrant structure pointer argument: <[ptr]>.
104
105RETURNS
106The next wide character cast to <<wint_t>>, unless there is no more data,
107or the host system reports a read error; in either of these situations,
108<<fgetwc>> and <<getwc>> return <<WEOF>>.
109
110You can distinguish the two situations that cause an <<EOF>> result by
111using the <<ferror>> and <<feof>> functions.
112
113PORTABILITY
114<<fgetwc>> and <<getwc>> are required by C99 and POSIX.1-2001.
115
116<<fgetwc_unlocked>> and <<getwc_unlocked>> are GNU extensions.
117*/
118
119#include <_ansi.h>
120#include <reent.h>
121#include <errno.h>
122#include <stdio.h>
123#include <stdlib.h>
124#include <wchar.h>
125#include "local.h"
126
127wint_t
128__fgetwc (struct _reent *ptr,
129        register FILE *fp)
130{
131  wchar_t wc;
132  size_t nconv;
133
134  if (fp->_r <= 0 && __srefill_r (ptr, fp))
135    return (WEOF);
136  if (MB_CUR_MAX == 1)
137    {
138      /* Fast path for single-byte encodings. */
139      wc = *fp->_p++;
140      fp->_r--;
141      return (wc);
142    }
143  do
144    {
145      nconv = _mbrtowc_r (ptr, &wc, (char *) fp->_p, fp->_r, &fp->_mbstate);
146      if (nconv == (size_t)-1)
147        break;
148      else if (nconv == (size_t)-2)
149        continue;
150      else if (nconv == 0)
151        {
152          /*
153           * Assume that the only valid representation of
154           * the null wide character is a single null byte.
155           */
156          fp->_p++;
157          fp->_r--;
158          return (L'\0');
159        }
160      else
161        {
162          fp->_p += nconv;
163          fp->_r -= nconv;
164          return (wc);
165        }
166    }
167  while (__srefill_r(ptr, fp) == 0);
168  fp->_flags |= __SERR;
169  errno = EILSEQ;
170  return (WEOF);
171}
172
173wint_t
174_fgetwc_r (struct _reent *ptr,
175        register FILE *fp)
176{
177  wint_t r;
178
179  _newlib_flockfile_start (fp);
180  ORIENT(fp, 1);
181  r = __fgetwc (ptr, fp);
182  _newlib_flockfile_end (fp);
183  return r;
184}
185
186wint_t
187fgetwc (FILE *fp)
188{
189  struct _reent *reent = _REENT;
190
191  CHECK_INIT(reent, fp);
192  return _fgetwc_r (reent, fp);
193}
Note: See TracBrowser for help on using the repository browser.