2 * Copyright (c) 1990 The Regents of the University of California.
5 * Redistribution and use in source and binary forms are permitted
6 * provided that the above copyright notice and this paragraph are
7 * duplicated in all such forms and that any documentation,
8 * advertising materials, and other materials related to such
9 * distribution and use acknowledge that the software was developed
10 * by the University of California, Berkeley. The name of the
11 * University may not be used to endorse or promote products derived
12 * from this software without specific prior written permission.
13 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
17 /* No user fns here. Pesch 15apr92. */
29 if ((fp->_flags & (__SLBF | __SWR)) == (__SLBF | __SWR))
35 * Refill a stdio buffer.
36 * Return EOF on eof or error, 0 otherwise.
40 _DEFUN(__srefill_r, (ptr, fp),
41 struct _reent * ptr _AND
44 /* make sure stdio is set up */
50 fp->_r = 0; /* largely a convenience for callers */
53 /* SysV does not make this test; take it out for compatibility */
54 if (fp->_flags & __SEOF)
58 /* if not already reading, have to be reading and writing */
59 if ((fp->_flags & __SRD) == 0)
61 if ((fp->_flags & __SRW) == 0)
67 /* switch to reading */
68 if (fp->_flags & __SWR)
70 if (_fflush_r (ptr, fp))
81 * We were reading. If there is an ungetc buffer,
82 * we must have been reading from that. Drop it,
83 * restoring the previous buffer (if any). If there
84 * is anything in that buffer, return.
89 if ((fp->_r = fp->_ur) != 0)
97 if (fp->_bf._base == NULL)
98 __smakebuf_r (ptr, fp);
101 * Before reading from a line buffered or unbuffered file,
102 * flush all line buffered output files, per the ANSI C
105 if (fp->_flags & (__SLBF | __SNBF))
107 /* Ignore this file in _fwalk to avoid potential deadlock. */
108 short orig_flags = fp->_flags;
110 _CAST_VOID _fwalk (_GLOBAL_REENT, lflush);
111 fp->_flags = orig_flags;
113 /* Now flush this file without locking it. */
114 if ((fp->_flags & (__SLBF|__SWR)) == (__SLBF|__SWR))
115 __sflush_r (ptr, fp);
118 fp->_p = fp->_bf._base;
119 fp->_r = fp->_read (ptr, fp->_cookie, (char *) fp->_p, fp->_bf._size);
124 fp->_flags &= ~__SEOF;
129 fp->_flags |= __SEOF;
133 fp->_flags |= __SERR;