home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / misc / volume8 / mdcopy / part02 / mdclose.c < prev    next >
Encoding:
C/C++ Source or Header  |  1989-11-02  |  1.2 KB  |  69 lines

  1. /*
  2.  * Created 1989 by greg yachuk.  Placed in the public domain.
  3.  */
  4.  
  5. #include <stdio.h>
  6. #include <fcntl.h>
  7. #include "mdiskio.h"
  8.  
  9. /*
  10.  * mdclose -    flush the buffer if writing, close the file and deallocate
  11.  */
  12. mdclose(mdp)
  13. MDFILE *mdp;
  14. {
  15.     if (mdp->fid != -1)
  16.     {
  17.         mdflush(mdp);
  18.         _mdclose(mdp);
  19.     }
  20.  
  21.     if (mdp->buffer != NULL)
  22.         free(mdp->buffer);
  23.  
  24.     free(mdp);
  25. }
  26.  
  27. /*
  28.  * mdflush -    flush the buffer for output, and clear for input
  29.  */
  30. mdflush(mdp)
  31. MDFILE *mdp;
  32. {
  33.     int    bufsiz;
  34.  
  35.     /* return zero if we have not allocated a buffer, yet */
  36.     if (mdp->buffer == NULL)
  37.         return (0);
  38.  
  39.     /* return zero if buffer is empty */
  40.     if (mdp->flags & _MDEMPTY)
  41.         return (0);
  42.  
  43.     /* return zero if file is read only */
  44.     if (mdp->flags & _MDREAD)
  45.         mdp->bufptr += mdp->bufcnt;
  46.     else    /* _MDWRITE */
  47.     {
  48.         /* keep track of the current size of the buffer */
  49.         bufsiz = mdp->bufcnt + (mdp->bufptr - mdp->buffer);
  50.  
  51.         /* flush the buffer */
  52.         if (_mdflsbf(mdp) == EOF)
  53.             return (EOF);
  54.  
  55.         /* set buffer ptr to end of buffer (not just chars written) */
  56.         mdp->bufptr = mdp->buffer + bufsiz;
  57.     }
  58.  
  59.     /* mark the buffer as empty */
  60.     mdp->bufcnt = 0;
  61.     mdp->flags |= _MDEMPTY;
  62.  
  63.     /* if open for read/write, reset the read and write flags */
  64.     if (mdp->flags & _MDRDWR)
  65.         mdp->flags &= ~(_MDREAD|_MDWRITE);
  66.  
  67.     return (0);
  68. }
  69.