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