home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 387b.lha / dice_v2.02 / lib / stdio / fclose.c next >
Encoding:
C/C++ Source or Header  |  1990-05-30  |  1.0 KB  |  59 lines

  1.  
  2. /*
  3.  *  FCLOSE.C
  4.  *
  5.  *  (c)Copyright 1990, Matthew Dillon, All Rights Reserved
  6.  */
  7.  
  8. #include <stdio.h>
  9.  
  10. int
  11. fclose(fi)
  12. FILE *fi;
  13. {
  14.     int error = EOF;
  15.  
  16.     if (fi && (fi->sd_Flags & __SIF_OPEN)) {
  17.     error = __fclose(fi);
  18.     if (fi->sd_Name)
  19.         free(fi->sd_Name);
  20.     if ((fi->sd_Flags & __SIF_NOFREE) == 0) {
  21.         *fi->sd_Prev = fi->sd_Next;
  22.         if (fi->sd_Next)
  23.         fi->sd_Next->sd_Prev = fi->sd_Prev;
  24.         free(fi);
  25.     }
  26.     }
  27.     return(error);
  28. }
  29.  
  30. int
  31. __fclose(fi)
  32. FILE *fi;
  33. {
  34.     int error;
  35.     int n = fi->sd_BufSiz - fi->sd_WLeft;
  36.  
  37.     if (fi->sd_WLeft >= 0 && fi->sd_WBuf && n) {
  38.     if (write(fi->sd_Fd, fi->sd_WBuf, n) != n)
  39.         fi->sd_Error = EOF;
  40.     }
  41.     error = fi->sd_Error;
  42.     if (fi->sd_Flags & __SIF_MYBUF) {
  43.     if (fi->sd_RBuf) {
  44.         free(fi->sd_RBuf);
  45.         fi->sd_RBuf = NULL;
  46.     }
  47.     if (fi->sd_WBuf) {
  48.         free(fi->sd_WBuf);
  49.         fi->sd_WBuf = NULL;
  50.     }
  51.     }
  52.     close(fi->sd_Fd);
  53.     if (fi->sd_Flags & __SIF_REMOVE)
  54.     DeleteFile(fi->sd_Name);
  55.     fi->sd_Flags &= ~(__SIF_OPEN|__SIF_READ|__SIF_WRITE);
  56.     return(error);
  57. }
  58.  
  59.