home *** CD-ROM | disk | FTP | other *** search
/ Complete Linux / Complete Linux.iso / docs / apps / database / ingres04.lzh / source / ctlmod / pb_get.c < prev    next >
Encoding:
C/C++ Source or Header  |  1985-01-23  |  1.5 KB  |  88 lines

  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. }
  88.