OLD | NEW |
| (Empty) |
1 /* $Id: tif_close.c,v 1.19 2010-03-10 18:56:48 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 TIFFCleanup(TIFF* tif) | |
48 { | |
49 /* | |
50 * Flush buffered data and directory (if dirty). | |
51 */ | |
52 if (tif->tif_mode != O_RDONLY) | |
53 TIFFFlush(tif); | |
54 (*tif->tif_cleanup)(tif); | |
55 TIFFFreeDirectory(tif); | |
56 | |
57 if (tif->tif_dirlist) | |
58 _TIFFfree(tif->tif_dirlist); | |
59 | |
60 /* | |
61 * Clean up client info links. | |
62 */ | |
63 while( tif->tif_clientinfo ) | |
64 { | |
65 TIFFClientInfoLink *link = tif->tif_clientinfo; | |
66 | |
67 tif->tif_clientinfo = link->next; | |
68 _TIFFfree( link->name ); | |
69 _TIFFfree( link ); | |
70 } | |
71 | |
72 if (tif->tif_rawdata && (tif->tif_flags&TIFF_MYBUFFER)) | |
73 _TIFFfree(tif->tif_rawdata); | |
74 if (isMapped(tif)) | |
75 TIFFUnmapFileContents(tif, tif->tif_base, (toff_t)tif->tif_size)
; | |
76 | |
77 /* | |
78 * Clean up custom fields. | |
79 */ | |
80 if (tif->tif_fields && tif->tif_nfields > 0) { | |
81 uint32 i; | |
82 | |
83 for (i = 0; i < tif->tif_nfields; i++) { | |
84 TIFFField *fld = tif->tif_fields[i]; | |
85 if (fld->field_bit == FIELD_CUSTOM && | |
86 strncmp("Tag ", fld->field_name, 4) == 0) { | |
87 _TIFFfree(fld->field_name); | |
88 _TIFFfree(fld); | |
89 } | |
90 } | |
91 | |
92 _TIFFfree(tif->tif_fields); | |
93 } | |
94 | |
95 if (tif->tif_nfieldscompat > 0) { | |
96 uint32 i; | |
97 | |
98 for (i = 0; i < tif->tif_nfieldscompat; i++) { | |
99 if (tif->tif_fieldscompat[i].allocated_size) | |
100 _TIFFfree(tif->tif_fieldscompat[i].fields); | |
101 } | |
102 _TIFFfree(tif->tif_fieldscompat); | |
103 } | |
104 | |
105 _TIFFfree(tif); | |
106 } | |
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 TIFFClose(TIFF* tif) | |
124 { | |
125 TIFFCloseProc closeproc = tif->tif_closeproc; | |
126 thandle_t fd = tif->tif_clientdata; | |
127 | |
128 TIFFCleanup(tif); | |
129 (void) (*closeproc)(fd); | |
130 } | |
131 | |
132 /* vim: set ts=8 sts=8 sw=8 noet: */ | |
133 | |
134 /* | |
135 * Local Variables: | |
136 * mode: c | |
137 * c-basic-offset: 8 | |
138 * fill-column: 78 | |
139 * End: | |
140 */ | |
141 | |
OLD | NEW |