1 /*-
2     Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR>
3     This program and the accompanying materials are licensed and made available
4     under the terms and conditions of the BSD License that accompanies this
5     distribution.  The full text of the license may be found at
6     http://opensource.org/licenses/bsd-license.
7 
8     THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
9     WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
10 
11  * Copyright (c)2001 Citrus Project,
12  * All rights reserved.
13  *
14  * Redistribution and use in source and binary forms, with or without
15  * modification, are permitted provided that the following conditions
16  * are met:
17  * 1. Redistributions of source code must retain the above copyright
18  *    notice, this list of conditions and the following disclaimer.
19  * 2. Redistributions in binary form must reproduce the above copyright
20  *    notice, this list of conditions and the following disclaimer in the
21  *    documentation and/or other materials provided with the distribution.
22  *
23  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
24  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
27  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33  * SUCH DAMAGE.
34  *
35  * $Citrus$
36 
37   NetBSD: fgetwc.c,v 1.5 2006/07/03 17:06:36 tnozaki Exp
38  */
39 #include  <LibConfig.h>
40 #include  <sys/EfiCdefs.h>
41 
42 #include  <assert.h>
43 #include  <errno.h>
44 #include  <stdio.h>
45 #include  <wchar.h>
46 #include  "reentrant.h"
47 #include  "local.h"
48 
49 wint_t
__fgetwc_unlock(FILE * fp)50 __fgetwc_unlock(FILE *fp)
51 {
52   struct wchar_io_data *wcio;
53   mbstate_t *st;
54   wchar_t wc;
55   size_t size;
56 
57   _DIAGASSERT(fp != NULL);
58   if(fp == NULL) {
59     errno = ENOSTR;
60     return WEOF;
61   }
62 
63   _SET_ORIENTATION(fp, 1);
64   wcio = WCIO_GET(fp);
65   if (wcio == 0) {
66     errno = ENOMEM;
67     return WEOF;
68   }
69 
70   /* if there're ungetwc'ed wchars, use them */
71   if (wcio->wcio_ungetwc_inbuf) {
72     wc = wcio->wcio_ungetwc_buf[--wcio->wcio_ungetwc_inbuf];
73 
74     return wc;
75   }
76 
77   st = &wcio->wcio_mbstate_in;
78 
79   do {
80     char c;
81     int ch = __sgetc(fp);
82 
83     if (ch == EOF) {
84       return WEOF;
85     }
86 
87     c = (char)ch;
88     size = mbrtowc(&wc, &c, 1, st);
89     if (size == (size_t)-1) {
90       errno = EILSEQ;
91       fp->_flags |= __SERR;
92       return WEOF;
93     }
94   } while (size == (size_t)-2);
95 
96   _DIAGASSERT(size == 1);
97 
98   return wc;
99 }
100 
101 wint_t
fgetwc(FILE * fp)102 fgetwc(FILE *fp)
103 {
104   wint_t r;
105 
106   _DIAGASSERT(fp != NULL);
107   if(fp == NULL) {
108     errno = EINVAL;
109     return (WEOF);
110   }
111 
112   FLOCKFILE(fp);
113   r = __fgetwc_unlock(fp);
114   FUNLOCKFILE(fp);
115 
116   return (r);
117 }
118