]> git.proxmox.com Git - mirror_edk2.git/blame - StdLib/LibC/Stdio/fgetws.c
Add device abstraction code for the UEFI Console and UEFI Shell-based file systems.
[mirror_edk2.git] / StdLib / LibC / Stdio / fgetws.c
CommitLineData
2aa62f2b 1/* $NetBSD: fgetws.c,v 1.2 2006/07/03 17:06:36 tnozaki Exp $ */\r
2\r
3/*-\r
4 * Copyright (c) 2002 Tim J. Robbins.\r
5 * All rights reserved.\r
6 *\r
7 * Redistribution and use in source and binary forms, with or without\r
8 * modification, are permitted provided that the following conditions\r
9 * are met:\r
10 * 1. Redistributions of source code must retain the above copyright\r
11 * notice, this list of conditions and the following disclaimer.\r
12 * 2. Redistributions in binary form must reproduce the above copyright\r
13 * notice, this list of conditions and the following disclaimer in the\r
14 * documentation and/or other materials provided with the distribution.\r
15 *\r
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\r
17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\r
20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\r
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\r
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\r
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\r
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\r
26 * SUCH DAMAGE.\r
27 *\r
28 * Original version ID:\r
29 * FreeBSD: src/lib/libc/stdio/fgetws.c,v 1.4 2002/09/20 13:25:40 tjr Exp\r
30 *\r
31 */\r
32#include <LibConfig.h>\r
33#include <sys/EfiCdefs.h>\r
34#if defined(LIB_SCCS) && !defined(lint)\r
35__RCSID("$NetBSD: fgetws.c,v 1.2 2006/07/03 17:06:36 tnozaki Exp $");\r
36#endif\r
37\r
38#include <assert.h>\r
39#include <errno.h>\r
40#include <stdio.h>\r
41#include <wchar.h>\r
42#include "reentrant.h"\r
43#include "local.h"\r
44\r
45wchar_t *\r
46fgetws(\r
47 wchar_t * __restrict ws,\r
48 int n,\r
49 FILE * __restrict fp\r
50 )\r
51{\r
52 wchar_t *wsp;\r
53 wint_t wc;\r
54\r
55 _DIAGASSERT(fp != NULL);\r
56 _DIAGASSERT(ws != NULL);\r
57\r
58 FLOCKFILE(fp);\r
59 _SET_ORIENTATION(fp, 1);\r
60\r
61 if (n <= 0) {\r
62 errno = EINVAL;\r
63 goto error;\r
64 }\r
65\r
66 wsp = ws;\r
67 while (n-- > 1) {\r
68 wc = __fgetwc_unlock(fp);\r
69 if (__sferror(fp) != 0)\r
70 goto error;\r
71 if (__sfeof(fp) != 0) {\r
72 if (wsp == ws) {\r
73 /* EOF/error, no characters read yet. */\r
74 goto error;\r
75 }\r
76 break;\r
77 }\r
78 *wsp++ = (wchar_t)wc;\r
79 if (wc == L'\n') {\r
80 break;\r
81 }\r
82 }\r
83\r
84 *wsp++ = L'\0';\r
85 FUNLOCKFILE(fp);\r
86\r
87 return (ws);\r
88\r
89error:\r
90 FUNLOCKFILE(fp);\r
91 return (NULL);\r
92}\r