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