LCOV - code coverage report
Current view: directory - frmts/gtiff/libtiff - tif_close.c (source / functions) Found Hit Coverage
Test: gdal_filtered.info Lines: 37 30 81.1 %
Date: 2010-01-09 Functions: 2 2 100.0 %

       1                 : /* $Id: tif_close.c,v 1.18 2008/03/28 01:10:39 bfriesen Exp $ */
       2                 : 
       3                 : /*
       4                 :  * Copyright (c) 1988-1997 Sam Leffler
       5                 :  * Copyright (c) 1991-1997 Silicon Graphics, Inc.
       6                 :  *
       7                 :  * Permission to use, copy, modify, distribute, and sell this software and 
       8                 :  * its documentation for any purpose is hereby granted without fee, provided
       9                 :  * that (i) the above copyright notices and this permission notice appear in
      10                 :  * all copies of the software and related documentation, and (ii) the names of
      11                 :  * Sam Leffler and Silicon Graphics may not be used in any advertising or
      12                 :  * publicity relating to the software without the specific, prior written
      13                 :  * permission of Sam Leffler and Silicon Graphics.
      14                 :  * 
      15                 :  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
      16                 :  * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
      17                 :  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
      18                 :  * 
      19                 :  * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
      20                 :  * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
      21                 :  * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
      22                 :  * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
      23                 :  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
      24                 :  * OF THIS SOFTWARE.
      25                 :  */
      26                 : 
      27                 : /*
      28                 :  * TIFF Library.
      29                 :  */
      30                 : #include "tiffiop.h"
      31                 : #include <string.h>
      32                 : 
      33                 : /************************************************************************/
      34                 : /*                            TIFFCleanup()                             */
      35                 : /************************************************************************/
      36                 : 
      37                 : /**
      38                 :  * Auxiliary function to free the TIFF structure. Given structure will be
      39                 :  * completetly freed, so you should save opened file handle and pointer
      40                 :  * to the close procedure in external variables before calling
      41                 :  * _TIFFCleanup(), if you will need these ones to close the file.
      42                 :  * 
      43                 :  * @param tif A TIFF pointer.
      44                 :  */
      45                 : 
      46                 : void
      47            3738 : TIFFCleanup(TIFF* tif)
      48                 : {
      49                 :   /*
      50                 :          * Flush buffered data and directory (if dirty).
      51                 :          */
      52            3738 :   if (tif->tif_mode != O_RDONLY)
      53            1084 :     TIFFFlush(tif);
      54            3738 :   (*tif->tif_cleanup)(tif);
      55            3738 :   TIFFFreeDirectory(tif);
      56                 : 
      57            3738 :   if (tif->tif_dirlist)
      58            3609 :     _TIFFfree(tif->tif_dirlist);
      59                 : 
      60                 :   /*
      61                 :          * Clean up client info links.
      62                 :          */
      63            7476 :   while( tif->tif_clientinfo )
      64                 :   {
      65               0 :     TIFFClientInfoLink *link = tif->tif_clientinfo;
      66                 : 
      67               0 :     tif->tif_clientinfo = link->next;
      68               0 :     _TIFFfree( link->name );
      69               0 :     _TIFFfree( link );
      70                 :   }
      71                 : 
      72            3738 :   if (tif->tif_rawdata && (tif->tif_flags&TIFF_MYBUFFER))
      73            2147 :     _TIFFfree(tif->tif_rawdata);
      74            3738 :   if (isMapped(tif))
      75               0 :     TIFFUnmapFileContents(tif, tif->tif_base, (toff_t)tif->tif_size);
      76                 : 
      77                 :   /*
      78                 :          * Clean up custom fields.
      79                 :          */
      80            3738 :   if (tif->tif_fields && tif->tif_nfields > 0) {
      81                 :     uint32 i;
      82                 : 
      83          553615 :     for (i = 0; i < tif->tif_nfields; i++) {
      84          549877 :       TIFFField *fld = tif->tif_fields[i];
      85          912463 :       if (fld->field_bit == FIELD_CUSTOM &&
      86          362586 :           strncmp("Tag ", fld->field_name, 4) == 0) {
      87               0 :         _TIFFfree(fld->field_name);
      88               0 :         _TIFFfree(fld);
      89                 :       }
      90                 :     }
      91                 : 
      92            3738 :     _TIFFfree(tif->tif_fields);
      93                 :   }
      94                 : 
      95            3738 :         if (tif->tif_nfieldscompat > 0) {
      96                 :                 uint32 i;
      97                 : 
      98           17860 :                 for (i = 0; i < tif->tif_nfieldscompat; i++) {
      99           14122 :                         if (tif->tif_fieldscompat[i].allocated_size)
     100           14122 :                                 _TIFFfree(tif->tif_fieldscompat[i].fields);
     101                 :                 }
     102            3738 :                 _TIFFfree(tif->tif_fieldscompat);
     103                 :         }
     104                 : 
     105            3738 :   _TIFFfree(tif);
     106            3738 : }
     107                 : 
     108                 : /************************************************************************/
     109                 : /*                            TIFFClose()                               */
     110                 : /************************************************************************/
     111                 : 
     112                 : /**
     113                 :  * Close a previously opened TIFF file.
     114                 :  *
     115                 :  * TIFFClose closes a file that was previously opened with TIFFOpen().
     116                 :  * Any buffered data are flushed to the file, including the contents of
     117                 :  * the current directory (if modified); and all resources are reclaimed.
     118                 :  * 
     119                 :  * @param tif A TIFF pointer.
     120                 :  */
     121                 : 
     122                 : void
     123            3738 : TIFFClose(TIFF* tif)
     124                 : {
     125            3738 :   TIFFCloseProc closeproc = tif->tif_closeproc;
     126            3738 :   thandle_t fd = tif->tif_clientdata;
     127                 : 
     128            3738 :   TIFFCleanup(tif);
     129            3738 :   (void) (*closeproc)(fd);
     130            3738 : }
     131                 : 
     132                 : /* vim: set ts=8 sts=8 sw=8 noet: */
     133                 : 

Generated by: LCOV version 1.7