|
|
1.1 ! root 1: # include "ctlmod.h" ! 2: # include "pipes.h" ! 3: # include <sccs.h> ! 4: ! 5: SCCSID(@(#)pb_get.c 7.1 2/5/81) ! 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.