source: trunk/libs/newlib/src/newlib/libc/stdio/ungetwc.c @ 577

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

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

File size: 3.3 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<<ungetwc>>---push wide character data back into a stream
30
31INDEX
32        ungetwc
33INDEX
34        _ungetwc_r
35
36SYNOPSIS
37        #include <stdio.h>
38        #include <wchar.h>
39        wint_t ungetwc(wint_t <[wc]>, FILE *<[stream]>);
40
41        wint_t _ungetwc_r(struct _reent *<[reent]>, wint_t <[wc]>, FILE *<[stream]>);
42
43DESCRIPTION
44<<ungetwc>> is used to return wide characters back to <[stream]> to be
45read again.  If <[wc]> is WEOF, the stream is unchanged.  Otherwise, the
46wide character <[wc]> is put back on the stream, and subsequent reads will see
47the wide chars pushed back in reverse order.  Pushed wide chars are lost if the
48stream is repositioned, such as by <<fseek>>, <<fsetpos>>, or
49<<rewind>>.
50
51The underlying file is not changed, but it is possible to push back
52something different than what was originally read.  Ungetting a
53character will clear the end-of-stream marker, and decrement the file
54position indicator.  Pushing back beyond the beginning of a file gives
55unspecified behavior.
56
57The alternate function <<_ungetwc_r>> is a reentrant version.  The
58extra argument <[reent]> is a pointer to a reentrancy structure.
59
60RETURNS
61The wide character pushed back, or <<WEOF>> on error.
62
63PORTABILITY
64C99
65*/
66
67#include <_ansi.h>
68#include <reent.h>
69#include <errno.h>
70#include <limits.h>
71#include <stdio.h>
72#include <stdlib.h>
73#include <wchar.h>
74#include "local.h"
75
76wint_t
77_ungetwc_r (struct _reent *ptr,
78        wint_t wc,
79        register FILE *fp)
80{
81  char buf[MB_LEN_MAX];
82  size_t len;
83
84  _newlib_flockfile_start (fp);
85  ORIENT (fp, 1);
86  if (wc == WEOF)
87    wc = WEOF;
88  else if ((len = _wcrtomb_r(ptr, buf, wc, &fp->_mbstate)) == (size_t)-1)
89    {
90      fp->_flags |= __SERR;
91      wc = WEOF;
92    }
93  else
94    while (len-- != 0)
95      if (_ungetc_r(ptr, (unsigned char)buf[len], fp) == EOF)
96        {
97          wc = WEOF;
98          break;
99        }
100  _newlib_flockfile_end (fp);
101  return wc;
102}
103
104/*
105 * MT-safe version.
106 */
107wint_t
108ungetwc (wint_t wc,
109        FILE *fp)
110{
111  struct _reent *reent = _REENT;
112
113  CHECK_INIT (reent, fp);
114  return _ungetwc_r (reent, wc, fp);
115}
Note: See TracBrowser for help on using the repository browser.