home *** CD-ROM | disk | FTP | other *** search
/ Frostbyte's 1980s DOS Shareware Collection / floppyshareware.zip / floppyshareware / DOOG / CBASE09.ZIP / BLKIO10.ZIP / BFLPOP.C < prev    next >
Text File  |  1989-08-30  |  3KB  |  122 lines

  1. /*    Copyright (c) 1989 Citadel    */
  2. /*       All Rights Reserved        */
  3.  
  4. /* #ident    "bflpop.c    1.1 - 89/07/03" */
  5.  
  6. #include <errno.h>
  7. #include "blkio_.h"
  8.  
  9. /*man---------------------------------------------------------------------------
  10. NAME
  11.      bflpop - pop block off of free list
  12.  
  13. SYNOPSIS
  14.      #include <blkio.h>
  15.  
  16.      int bflpop(bp, bn_p)
  17.      BLKFILE *bp;
  18.      bpos_t *bn_p;
  19.  
  20. DESCRIPTION
  21.      The bflpop function gets a block out of the free list of the block file
  22.      associated with BLKFILE pointer bp.  If the free list is empty, the block
  23.      number of the first block past the end of file is retrieved.  The block
  24.      number of the new block is returned in the location pointed to by bn_p.
  25.  
  26.      Note that if the free list is empty, the same end block will be retrieved
  27.      by flpop until that block is written, extending the file length.
  28.  
  29.      bflpop will fail if one or more of the following is true:
  30.  
  31.      [EINVAL]       bp is not a valid BLKFILE pointer.
  32.      [EINVAL]       bn_p is the NULL pointer.
  33.      [BEEOF]        bp is empty.
  34.      [BEEOF]        Free list head past points past the end
  35.                     of the file.
  36.      [BENFL]        bp does not have a free list.
  37.      [BENOPEN]      bp is not open for writing.
  38.  
  39. SEE ALSO
  40.      bflpush.
  41.  
  42. DIAGNOSTICS
  43.      Upon successful completion, a value of 0 is returned.  Otherwise, a
  44.      value of -1 is returned, and errno set to indicate the error.
  45.  
  46. NOTES
  47.      To use the free list functions in the blkio library, the first element
  48.      of the file header must be the free list head with type bpos_t.  This
  49.      must be initialized to 0 immediately after the file is created and not
  50.      accessed afterward except using bflpop and bflpush.  Also, the block
  51.      size must be at least sizeof(bpos_t).
  52.  
  53. ------------------------------------------------------------------------------*/
  54. int bflpop(bp, bn_p)
  55. BLKFILE * bp;
  56. bpos_t *  bn_p;
  57. {
  58.     int    rs        = 0;
  59.     bpos_t    oldflhno    = 0;
  60.     bpos_t    newflhno    = 0;
  61.  
  62.     errno = 0;
  63.  
  64.     /* validate arguments */
  65.     if ((!b_valid(bp)) || (bn_p == NULL)) {
  66.         errno = EINVAL;
  67.         return -1;
  68.     }
  69.  
  70.     /* check if not open for writing */
  71.     if (!(bp->flags & BIOWRITE)) {
  72.         errno = BENOPEN;
  73.         return -1;
  74.     }
  75.  
  76.     /* check if no free list */
  77.     if ((bp->hdrsize < sizeof(oldflhno)) || (bp->blksize < sizeof(oldflhno))) {
  78.         errno = BENFL;
  79.         return -1;
  80.     }
  81.  
  82.     /* check if header not yet written */
  83.     if (bp->endblk < 1) {
  84.         errno = BEEOF;
  85.         return -1;
  86.     }
  87.  
  88.     /* get block number of current free list head */
  89.     rs = bgethf(bp, (size_t)0, (void *)&oldflhno, sizeof(oldflhno));
  90.     if (rs == -1) {
  91.         BEPRINT;
  92.         return -1;
  93.     }
  94.     if (oldflhno >= bp->endblk) {
  95.         errno = BEEOF;
  96.         return -1;
  97.     }
  98.  
  99.     /* if free list empty, get new block at end of file */
  100.     if (oldflhno == 0) {
  101.         oldflhno = bp->endblk;
  102.     /* else get new free list head */
  103.     } else {
  104.         rs = bgetbf(bp, oldflhno, (size_t)0, (void *)&newflhno, sizeof(newflhno));
  105.         if (rs == -1) {
  106.             BEPRINT;
  107.             return -1;
  108.         }
  109.         rs = bputhf(bp, (size_t)0, (void *)&newflhno, sizeof(newflhno));
  110.         if (rs == -1) {
  111.             BEPRINT;
  112.             return -1;
  113.         }
  114.     }
  115.  
  116.     /* load return argument */
  117.     *bn_p = oldflhno;
  118.  
  119.     errno = 0;
  120.     return 0;
  121. }
  122.