2 Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
18 /* This is a simple implementation of buffering IO-read functions. */
29 rbuf_initialize (struct rbuf *rbuf, int fd)
32 rbuf->buffer_pos = rbuf->buffer;
33 rbuf->buffer_left = 0;
37 rbuf_initialized_p (struct rbuf *rbuf)
39 return rbuf->fd != -1;
43 rbuf_uninitialize (struct rbuf *rbuf)
48 /* Currently unused -- see RBUF_READCHAR. */
50 /* Function version of RBUF_READCHAR. */
52 rbuf_readchar (struct rbuf *rbuf, char *store)
54 return RBUF_READCHAR (rbuf, store);
58 /* Like rbuf_readchar(), only don't move the buffer position. */
60 rbuf_peek (struct rbuf *rbuf, char *store)
62 if (!rbuf->buffer_left)
65 rbuf->buffer_pos = rbuf->buffer;
66 rbuf->buffer_left = 0;
67 res = iread (rbuf->fd, rbuf->buffer, sizeof (rbuf->buffer));
70 rbuf->buffer_left = res;
72 *store = *rbuf->buffer_pos;
76 /* Flush RBUF's buffer to WHERE. Flush MAXSIZE bytes at most.
77 Returns the number of bytes actually copied. If the buffer is
78 empty, 0 is returned. */
80 rbuf_flush (struct rbuf *rbuf, char *where, int maxsize)
82 if (!rbuf->buffer_left)
86 int howmuch = MINVAL (rbuf->buffer_left, maxsize);
89 memcpy (where, rbuf->buffer_pos, howmuch);
90 rbuf->buffer_left -= howmuch;
91 rbuf->buffer_pos += howmuch;
96 /* Discard any cached data in RBUF. */
98 rbuf_discard (struct rbuf *rbuf)
100 rbuf->buffer_left = 0;
101 rbuf->buffer_pos = rbuf->buffer;