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 :
|