Annotation of prex/usr/lib/libc/stdio/ungetc.c, Revision 1.1.1.1
1.1 nbrk 1: /*-
2: * Copyright (c) 1990, 1993
3: * The Regents of the University of California. All rights reserved.
4: *
5: * This code is derived from software contributed to Berkeley by
6: * Chris Torek.
7: *
8: * Redistribution and use in source and binary forms, with or without
9: * modification, are permitted provided that the following conditions
10: * are met:
11: * 1. Redistributions of source code must retain the above copyright
12: * notice, this list of conditions and the following disclaimer.
13: * 2. Redistributions in binary form must reproduce the above copyright
14: * notice, this list of conditions and the following disclaimer in the
15: * documentation and/or other materials provided with the distribution.
16: * 3. Neither the name of the University nor the names of its contributors
17: * may be used to endorse or promote products derived from this software
18: * without specific prior written permission.
19: *
20: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30: * SUCH DAMAGE.
31: */
32:
33: #include <stdio.h>
34: #include <stdlib.h>
35: #include <string.h>
36: #include "local.h"
37:
38: int
39: ungetc(c, fp)
40: int c;
41: FILE *fp;
42: {
43: if (c == EOF)
44: return (EOF);
45: if (!__sdidinit)
46: __sinit();
47: if ((fp->_flags & __SRD) == 0) {
48: /*
49: * Not already reading: no good unless reading-and-writing.
50: * Otherwise, flush any current write stuff.
51: */
52: if ((fp->_flags & __SRW) == 0)
53: return (EOF);
54: if (fp->_flags & __SWR) {
55: if (__sflush(fp))
56: return (EOF);
57: fp->_flags &= ~__SWR;
58: fp->_w = 0;
59: }
60: fp->_flags |= __SRD;
61: }
62: c = (unsigned char)c;
63:
64: /*
65: * If we are in the middle of ungetc'ing, just continue.
66: */
67: if (HASUB(fp)) {
68: if (fp->_r >= fp->_ub._size)
69: return (EOF);
70: *--fp->_p = c;
71: fp->_r++;
72: return (c);
73: }
74: fp->_flags &= ~__SEOF;
75:
76: /*
77: * If we can handle this by simply backing up, do so,
78: * but never replace the original character.
79: * (This makes sscanf() work when scanning `const' data.)
80: */
81: if (fp->_bf._base != NULL && fp->_p > fp->_bf._base &&
82: fp->_p[-1] == c) {
83: fp->_p--;
84: fp->_r++;
85: return (c);
86: }
87:
88: /*
89: * Create an ungetc buffer.
90: * we will use the `reserve' buffer.
91: */
92: fp->_ur = fp->_r;
93: fp->_up = fp->_p;
94: fp->_ub._base = fp->_ubuf;
95: fp->_ub._size = sizeof(fp->_ubuf);
96: fp->_ubuf[sizeof(fp->_ubuf) - 1] = c;
97: fp->_p = &fp->_ubuf[sizeof(fp->_ubuf) - 1];
98: fp->_r = 1;
99: return (c);
100: }
CVSweb