1: # include "ctlmod.h"
2: # include "pipes.h"
3: # include <sccs.h>
4:
5: SCCSID(@(#)pb_get.c 8.1 12/31/84)
6:
7: /*
8: ** PB_GET -- buffered get from pipe
9: **
10: ** This routine just gets a record from the pipe block, reading
11: ** if necessary. It tries to do things in big chunks to keep
12: ** the overhead down.
13: **
14: ** Parameters:
15: ** ppb -- a pointer to the pipe block to unbuffer.
16: ** dp -- a pointer to the data area.
17: ** len -- the number of bytes to read.
18: **
19: ** Returns:
20: ** The number of bytes actually read.
21: ** Zero on end of file.
22: **
23: ** Side Effects:
24: ** none.
25: **
26: ** Trace Flags:
27: ** 18.1 - 18.7
28: */
29:
30: pb_get(ppb, dp, len)
31: register pb_t *ppb;
32: char *dp;
33: register int len;
34: {
35: int rct;
36: register int i;
37:
38: rct = 0;
39: # ifdef xCTR2
40: if (tTf(18, 1))
41: lprintf("pb_get: ");
42: # endif
43:
44: /*
45: ** Top Loop.
46: ** As long as we still want more, keep buffering out.
47: */
48:
49: while (len > 0)
50: {
51: /* if we have no data, read another block */
52: while (ppb->pb_nleft <= 0)
53: {
54: if (bitset(PB_EOF, ppb->pb_stat))
55: {
56: # ifdef xCTR2
57: if (tTf(18, 1))
58: printf("EOF\n");
59: # endif
60: if (rct != 0)
61: syserr("pb_get: EOF");
62: return (rct);
63: }
64: pb_read(ppb);
65: }
66:
67: /*
68: ** Compute the length to move.
69: ** This is the min of the amount we want and the
70: ** amount we have available to us in the buffer.
71: */
72:
73: i = min(ppb->pb_nleft, len);
74: bmove(ppb->pb_xptr, dp, i);
75: ppb->pb_xptr += i;
76: ppb->pb_nleft -= i;
77: dp += i;
78: len -= i;
79: rct += i;
80: }
81:
82: # ifdef xCTR2
83: if (tTf(18, 1))
84: printf("%d\n", rct);
85: # endif
86: return (rct);
87: }
Defined functions
pb_get
defined in line
5; used 7 times