1 /* $Header$ */
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 
32 void
TIFFClose(TIFF * tif)33 TIFFClose(TIFF* tif)
34 {
35     if (tif->tif_mode != O_RDONLY)
36         /*
37          * Flush buffered data and directory (if dirty).
38          */
39         TIFFFlush(tif);
40     (*tif->tif_cleanup)(tif);
41     TIFFFreeDirectory(tif);
42 
43     if (tif->tif_dirlist)
44         _TIFFfree(tif->tif_dirlist);
45 
46     /* Clean up client info links */
47     while( tif->tif_clientinfo )
48     {
49         TIFFClientInfoLink *link = tif->tif_clientinfo;
50 
51         tif->tif_clientinfo = link->next;
52         _TIFFfree( link->name );
53         _TIFFfree( link );
54     }
55 
56     if (tif->tif_rawdata && (tif->tif_flags&TIFF_MYBUFFER))
57         _TIFFfree(tif->tif_rawdata);
58     if (isMapped(tif))
59         TIFFUnmapFileContents(tif, tif->tif_base, tif->tif_size);
60     (void) TIFFCloseFile(tif);
61     if (tif->tif_nfields > 0)
62     {
63         int  i;
64 
65         for (i = 0; i < tif->tif_nfields; i++)
66 	{
67 	    TIFFFieldInfo *fld = tif->tif_fieldinfo[i];
68  	    if (fld->field_bit == FIELD_CUSTOM &&
69 		strncmp("Tag ", fld->field_name, 4) == 0)
70 	    {
71                 _TIFFfree(fld->field_name);
72                 _TIFFfree(fld);
73 	    }
74         }
75 
76         _TIFFfree(tif->tif_fieldinfo);
77     }
78 
79     _TIFFfree(tif);
80 }
81