1/* $Id: tif_dirwrite.c,v 1.78 2015-05-31 00:38:46 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 * Directory Write Support Routines.
31 */
32#include "tiffiop.h"
33
34#ifdef HAVE_IEEEFP
35#define TIFFCvtNativeToIEEEFloat(tif, n, fp)
36#define TIFFCvtNativeToIEEEDouble(tif, n, dp)
37#else
38extern void TIFFCvtNativeToIEEEFloat(TIFF* tif, uint32 n, float* fp);
39extern void TIFFCvtNativeToIEEEDouble(TIFF* tif, uint32 n, double* dp);
40#endif
41
42static int TIFFWriteDirectorySec(TIFF* tif, int isimage, int imagedone, uint64* pdiroff);
43
44static int TIFFWriteDirectoryTagSampleformatArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, double* value);
45#if 0
46static int TIFFWriteDirectoryTagSampleformatPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value);
47#endif
48
49static int TIFFWriteDirectoryTagAscii(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, char* value);
50static int TIFFWriteDirectoryTagUndefinedArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint8* value);
51#ifdef notdef
52static int TIFFWriteDirectoryTagByte(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint8 value);
53#endif
54static int TIFFWriteDirectoryTagByteArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint8* value);
55#if 0
56static int TIFFWriteDirectoryTagBytePerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint8 value);
57#endif
58#ifdef notdef
59static int TIFFWriteDirectoryTagSbyte(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int8 value);
60#endif
61static int TIFFWriteDirectoryTagSbyteArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int8* value);
62#if 0
63static int TIFFWriteDirectoryTagSbytePerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int8 value);
64#endif
65static int TIFFWriteDirectoryTagShort(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint16 value);
66static int TIFFWriteDirectoryTagShortArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint16* value);
67static int TIFFWriteDirectoryTagShortPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint16 value);
68#ifdef notdef
69static int TIFFWriteDirectoryTagSshort(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int16 value);
70#endif
71static int TIFFWriteDirectoryTagSshortArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int16* value);
72#if 0
73static int TIFFWriteDirectoryTagSshortPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int16 value);
74#endif
75static int TIFFWriteDirectoryTagLong(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 value);
76static int TIFFWriteDirectoryTagLongArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint32* value);
77#if 0
78static int TIFFWriteDirectoryTagLongPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 value);
79#endif
80#ifdef notdef
81static int TIFFWriteDirectoryTagSlong(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int32 value);
82#endif
83static int TIFFWriteDirectoryTagSlongArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int32* value);
84#if 0
85static int TIFFWriteDirectoryTagSlongPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int32 value);
86#endif
87#ifdef notdef
88static int TIFFWriteDirectoryTagLong8(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint64 value);
89#endif
90static int TIFFWriteDirectoryTagLong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value);
91#ifdef notdef
92static int TIFFWriteDirectoryTagSlong8(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int64 value);
93#endif
94static int TIFFWriteDirectoryTagSlong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int64* value);
95static int TIFFWriteDirectoryTagRational(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value);
96static int TIFFWriteDirectoryTagRationalArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value);
97static int TIFFWriteDirectoryTagSrationalArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value);
98#ifdef notdef
99static int TIFFWriteDirectoryTagFloat(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, float value);
100#endif
101static int TIFFWriteDirectoryTagFloatArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value);
102#if 0
103static int TIFFWriteDirectoryTagFloatPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, float value);
104#endif
105#ifdef notdef
106static int TIFFWriteDirectoryTagDouble(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value);
107#endif
108static int TIFFWriteDirectoryTagDoubleArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, double* value);
109#if 0
110static int TIFFWriteDirectoryTagDoublePerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value);
111#endif
112static int TIFFWriteDirectoryTagIfdArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint32* value);
113#ifdef notdef
114static int TIFFWriteDirectoryTagIfd8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value);
115#endif
116static int TIFFWriteDirectoryTagShortLong(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 value);
117static int TIFFWriteDirectoryTagLongLong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value);
118static int TIFFWriteDirectoryTagIfdIfd8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value);
119#ifdef notdef
120static int TIFFWriteDirectoryTagShortLongLong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value);
121#endif
122static int TIFFWriteDirectoryTagColormap(TIFF* tif, uint32* ndir, TIFFDirEntry* dir);
123static int TIFFWriteDirectoryTagTransferfunction(TIFF* tif, uint32* ndir, TIFFDirEntry* dir);
124static int TIFFWriteDirectoryTagSubifd(TIFF* tif, uint32* ndir, TIFFDirEntry* dir);
125
126static int TIFFWriteDirectoryTagCheckedAscii(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, char* value);
127static int TIFFWriteDirectoryTagCheckedUndefinedArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint8* value);
128#ifdef notdef
129static int TIFFWriteDirectoryTagCheckedByte(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint8 value);
130#endif
131static int TIFFWriteDirectoryTagCheckedByteArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint8* value);
132#ifdef notdef
133static int TIFFWriteDirectoryTagCheckedSbyte(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int8 value);
134#endif
135static int TIFFWriteDirectoryTagCheckedSbyteArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int8* value);
136static int TIFFWriteDirectoryTagCheckedShort(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint16 value);
137static int TIFFWriteDirectoryTagCheckedShortArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint16* value);
138#ifdef notdef
139static int TIFFWriteDirectoryTagCheckedSshort(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int16 value);
140#endif
141static int TIFFWriteDirectoryTagCheckedSshortArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int16* value);
142static int TIFFWriteDirectoryTagCheckedLong(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 value);
143static int TIFFWriteDirectoryTagCheckedLongArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint32* value);
144#ifdef notdef
145static int TIFFWriteDirectoryTagCheckedSlong(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int32 value);
146#endif
147static int TIFFWriteDirectoryTagCheckedSlongArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int32* value);
148#ifdef notdef
149static int TIFFWriteDirectoryTagCheckedLong8(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint64 value);
150#endif
151static int TIFFWriteDirectoryTagCheckedLong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value);
152#ifdef notdef
153static int TIFFWriteDirectoryTagCheckedSlong8(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int64 value);
154#endif
155static int TIFFWriteDirectoryTagCheckedSlong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int64* value);
156static int TIFFWriteDirectoryTagCheckedRational(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value);
157static int TIFFWriteDirectoryTagCheckedRationalArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value);
158static int TIFFWriteDirectoryTagCheckedSrationalArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value);
159#ifdef notdef
160static int TIFFWriteDirectoryTagCheckedFloat(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, float value);
161#endif
162static int TIFFWriteDirectoryTagCheckedFloatArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value);
163#ifdef notdef
164static int TIFFWriteDirectoryTagCheckedDouble(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value);
165#endif
166static int TIFFWriteDirectoryTagCheckedDoubleArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, double* value);
167static int TIFFWriteDirectoryTagCheckedIfdArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint32* value);
168static int TIFFWriteDirectoryTagCheckedIfd8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value);
169
170static int TIFFWriteDirectoryTagData(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint16 datatype, uint32 count, uint32 datalength, void* data);
171
172static int TIFFLinkDirectory(TIFF*);
173
174/*
175 * Write the contents of the current directory
176 * to the specified file.  This routine doesn't
177 * handle overwriting a directory with auxiliary
178 * storage that's been changed.
179 */
180int
181TIFFWriteDirectory(TIFF* tif)
182{
183	return TIFFWriteDirectorySec(tif,TRUE,TRUE,NULL);
184}
185
186/*
187 * Similar to TIFFWriteDirectory(), writes the directory out
188 * but leaves all data structures in memory so that it can be
189 * written again.  This will make a partially written TIFF file
190 * readable before it is successfully completed/closed.
191 */
192int
193TIFFCheckpointDirectory(TIFF* tif)
194{
195	int rc;
196	/* Setup the strips arrays, if they haven't already been. */
197	if (tif->tif_dir.td_stripoffset == NULL)
198	    (void) TIFFSetupStrips(tif);
199	rc = TIFFWriteDirectorySec(tif,TRUE,FALSE,NULL);
200	(void) TIFFSetWriteOffset(tif, TIFFSeekFile(tif, 0, SEEK_END));
201	return rc;
202}
203
204int
205TIFFWriteCustomDirectory(TIFF* tif, uint64* pdiroff)
206{
207	return TIFFWriteDirectorySec(tif,FALSE,FALSE,pdiroff);
208}
209
210/*
211 * Similar to TIFFWriteDirectory(), but if the directory has already
212 * been written once, it is relocated to the end of the file, in case it
213 * has changed in size.  Note that this will result in the loss of the
214 * previously used directory space.
215 */
216int
217TIFFRewriteDirectory( TIFF *tif )
218{
219	static const char module[] = "TIFFRewriteDirectory";
220
221	/* We don't need to do anything special if it hasn't been written. */
222	if( tif->tif_diroff == 0 )
223		return TIFFWriteDirectory( tif );
224
225	/*
226	 * Find and zero the pointer to this directory, so that TIFFLinkDirectory
227	 * will cause it to be added after this directories current pre-link.
228	 */
229
230	if (!(tif->tif_flags&TIFF_BIGTIFF))
231	{
232		if (tif->tif_header.classic.tiff_diroff == tif->tif_diroff)
233		{
234			tif->tif_header.classic.tiff_diroff = 0;
235			tif->tif_diroff = 0;
236
237			TIFFSeekFile(tif,4,SEEK_SET);
238			if (!WriteOK(tif, &(tif->tif_header.classic.tiff_diroff),4))
239			{
240				TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
241				    "Error updating TIFF header");
242				return (0);
243			}
244		}
245		else
246		{
247			uint32 nextdir;
248			nextdir = tif->tif_header.classic.tiff_diroff;
249			while(1) {
250				uint16 dircount;
251				uint32 nextnextdir;
252
253				if (!SeekOK(tif, nextdir) ||
254				    !ReadOK(tif, &dircount, 2)) {
255					TIFFErrorExt(tif->tif_clientdata, module,
256					     "Error fetching directory count");
257					return (0);
258				}
259				if (tif->tif_flags & TIFF_SWAB)
260					TIFFSwabShort(&dircount);
261				(void) TIFFSeekFile(tif,
262				    nextdir+2+dircount*12, SEEK_SET);
263				if (!ReadOK(tif, &nextnextdir, 4)) {
264					TIFFErrorExt(tif->tif_clientdata, module,
265					     "Error fetching directory link");
266					return (0);
267				}
268				if (tif->tif_flags & TIFF_SWAB)
269					TIFFSwabLong(&nextnextdir);
270				if (nextnextdir==tif->tif_diroff)
271				{
272					uint32 m;
273					m=0;
274					(void) TIFFSeekFile(tif,
275					    nextdir+2+dircount*12, SEEK_SET);
276					if (!WriteOK(tif, &m, 4)) {
277						TIFFErrorExt(tif->tif_clientdata, module,
278						     "Error writing directory link");
279						return (0);
280					}
281					tif->tif_diroff=0;
282					break;
283				}
284				nextdir=nextnextdir;
285			}
286		}
287	}
288	else
289	{
290		if (tif->tif_header.big.tiff_diroff == tif->tif_diroff)
291		{
292			tif->tif_header.big.tiff_diroff = 0;
293			tif->tif_diroff = 0;
294
295			TIFFSeekFile(tif,8,SEEK_SET);
296			if (!WriteOK(tif, &(tif->tif_header.big.tiff_diroff),8))
297			{
298				TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
299				    "Error updating TIFF header");
300				return (0);
301			}
302		}
303		else
304		{
305			uint64 nextdir;
306			nextdir = tif->tif_header.big.tiff_diroff;
307			while(1) {
308				uint64 dircount64;
309				uint16 dircount;
310				uint64 nextnextdir;
311
312				if (!SeekOK(tif, nextdir) ||
313				    !ReadOK(tif, &dircount64, 8)) {
314					TIFFErrorExt(tif->tif_clientdata, module,
315					     "Error fetching directory count");
316					return (0);
317				}
318				if (tif->tif_flags & TIFF_SWAB)
319					TIFFSwabLong8(&dircount64);
320				if (dircount64>0xFFFF)
321				{
322					TIFFErrorExt(tif->tif_clientdata, module,
323					     "Sanity check on tag count failed, likely corrupt TIFF");
324					return (0);
325				}
326				dircount=(uint16)dircount64;
327				(void) TIFFSeekFile(tif,
328				    nextdir+8+dircount*20, SEEK_SET);
329				if (!ReadOK(tif, &nextnextdir, 8)) {
330					TIFFErrorExt(tif->tif_clientdata, module,
331					     "Error fetching directory link");
332					return (0);
333				}
334				if (tif->tif_flags & TIFF_SWAB)
335					TIFFSwabLong8(&nextnextdir);
336				if (nextnextdir==tif->tif_diroff)
337				{
338					uint64 m;
339					m=0;
340					(void) TIFFSeekFile(tif,
341					    nextdir+8+dircount*20, SEEK_SET);
342					if (!WriteOK(tif, &m, 8)) {
343						TIFFErrorExt(tif->tif_clientdata, module,
344						     "Error writing directory link");
345						return (0);
346					}
347					tif->tif_diroff=0;
348					break;
349				}
350				nextdir=nextnextdir;
351			}
352		}
353	}
354
355	/*
356	 * Now use TIFFWriteDirectory() normally.
357	 */
358
359	return TIFFWriteDirectory( tif );
360}
361
362static int
363TIFFWriteDirectorySec(TIFF* tif, int isimage, int imagedone, uint64* pdiroff)
364{
365	static const char module[] = "TIFFWriteDirectorySec";
366	uint32 ndir;
367	TIFFDirEntry* dir;
368	uint32 dirsize;
369	void* dirmem;
370	uint32 m;
371	if (tif->tif_mode == O_RDONLY)
372		return (1);
373
374        _TIFFFillStriles( tif );
375
376	/*
377	 * Clear write state so that subsequent images with
378	 * different characteristics get the right buffers
379	 * setup for them.
380	 */
381	if (imagedone)
382	{
383		if (tif->tif_flags & TIFF_POSTENCODE)
384		{
385			tif->tif_flags &= ~TIFF_POSTENCODE;
386			if (!(*tif->tif_postencode)(tif))
387			{
388				TIFFErrorExt(tif->tif_clientdata,module,
389				    "Error post-encoding before directory write");
390				return (0);
391			}
392		}
393		(*tif->tif_close)(tif);       /* shutdown encoder */
394		/*
395		 * Flush any data that might have been written
396		 * by the compression close+cleanup routines.  But
397                 * be careful not to write stuff if we didn't add data
398                 * in the previous steps as the "rawcc" data may well be
399                 * a previously read tile/strip in mixed read/write mode.
400		 */
401		if (tif->tif_rawcc > 0
402		    && (tif->tif_flags & TIFF_BEENWRITING) != 0 )
403		{
404		    if( !TIFFFlushData1(tif) )
405                    {
406			TIFFErrorExt(tif->tif_clientdata, module,
407			    "Error flushing data before directory write");
408			return (0);
409                    }
410		}
411		if ((tif->tif_flags & TIFF_MYBUFFER) && tif->tif_rawdata)
412		{
413			_TIFFfree(tif->tif_rawdata);
414			tif->tif_rawdata = NULL;
415			tif->tif_rawcc = 0;
416			tif->tif_rawdatasize = 0;
417                        tif->tif_rawdataoff = 0;
418                        tif->tif_rawdataloaded = 0;
419		}
420		tif->tif_flags &= ~(TIFF_BEENWRITING|TIFF_BUFFERSETUP);
421	}
422	dir=NULL;
423	dirmem=NULL;
424	dirsize=0;
425	while (1)
426	{
427		ndir=0;
428		if (isimage)
429		{
430			if (TIFFFieldSet(tif,FIELD_IMAGEDIMENSIONS))
431			{
432				if (!TIFFWriteDirectoryTagShortLong(tif,&ndir,dir,TIFFTAG_IMAGEWIDTH,tif->tif_dir.td_imagewidth))
433					goto bad;
434				if (!TIFFWriteDirectoryTagShortLong(tif,&ndir,dir,TIFFTAG_IMAGELENGTH,tif->tif_dir.td_imagelength))
435					goto bad;
436			}
437			if (TIFFFieldSet(tif,FIELD_TILEDIMENSIONS))
438			{
439				if (!TIFFWriteDirectoryTagShortLong(tif,&ndir,dir,TIFFTAG_TILEWIDTH,tif->tif_dir.td_tilewidth))
440					goto bad;
441				if (!TIFFWriteDirectoryTagShortLong(tif,&ndir,dir,TIFFTAG_TILELENGTH,tif->tif_dir.td_tilelength))
442					goto bad;
443			}
444			if (TIFFFieldSet(tif,FIELD_RESOLUTION))
445			{
446				if (!TIFFWriteDirectoryTagRational(tif,&ndir,dir,TIFFTAG_XRESOLUTION,tif->tif_dir.td_xresolution))
447					goto bad;
448				if (!TIFFWriteDirectoryTagRational(tif,&ndir,dir,TIFFTAG_YRESOLUTION,tif->tif_dir.td_yresolution))
449					goto bad;
450			}
451			if (TIFFFieldSet(tif,FIELD_POSITION))
452			{
453				if (!TIFFWriteDirectoryTagRational(tif,&ndir,dir,TIFFTAG_XPOSITION,tif->tif_dir.td_xposition))
454					goto bad;
455				if (!TIFFWriteDirectoryTagRational(tif,&ndir,dir,TIFFTAG_YPOSITION,tif->tif_dir.td_yposition))
456					goto bad;
457			}
458			if (TIFFFieldSet(tif,FIELD_SUBFILETYPE))
459			{
460				if (!TIFFWriteDirectoryTagLong(tif,&ndir,dir,TIFFTAG_SUBFILETYPE,tif->tif_dir.td_subfiletype))
461					goto bad;
462			}
463			if (TIFFFieldSet(tif,FIELD_BITSPERSAMPLE))
464			{
465				if (!TIFFWriteDirectoryTagShortPerSample(tif,&ndir,dir,TIFFTAG_BITSPERSAMPLE,tif->tif_dir.td_bitspersample))
466					goto bad;
467			}
468			if (TIFFFieldSet(tif,FIELD_COMPRESSION))
469			{
470				if (!TIFFWriteDirectoryTagShort(tif,&ndir,dir,TIFFTAG_COMPRESSION,tif->tif_dir.td_compression))
471					goto bad;
472			}
473			if (TIFFFieldSet(tif,FIELD_PHOTOMETRIC))
474			{
475				if (!TIFFWriteDirectoryTagShort(tif,&ndir,dir,TIFFTAG_PHOTOMETRIC,tif->tif_dir.td_photometric))
476					goto bad;
477			}
478			if (TIFFFieldSet(tif,FIELD_THRESHHOLDING))
479			{
480				if (!TIFFWriteDirectoryTagShort(tif,&ndir,dir,TIFFTAG_THRESHHOLDING,tif->tif_dir.td_threshholding))
481					goto bad;
482			}
483			if (TIFFFieldSet(tif,FIELD_FILLORDER))
484			{
485				if (!TIFFWriteDirectoryTagShort(tif,&ndir,dir,TIFFTAG_FILLORDER,tif->tif_dir.td_fillorder))
486					goto bad;
487			}
488			if (TIFFFieldSet(tif,FIELD_ORIENTATION))
489			{
490				if (!TIFFWriteDirectoryTagShort(tif,&ndir,dir,TIFFTAG_ORIENTATION,tif->tif_dir.td_orientation))
491					goto bad;
492			}
493			if (TIFFFieldSet(tif,FIELD_SAMPLESPERPIXEL))
494			{
495				if (!TIFFWriteDirectoryTagShort(tif,&ndir,dir,TIFFTAG_SAMPLESPERPIXEL,tif->tif_dir.td_samplesperpixel))
496					goto bad;
497			}
498			if (TIFFFieldSet(tif,FIELD_ROWSPERSTRIP))
499			{
500				if (!TIFFWriteDirectoryTagShortLong(tif,&ndir,dir,TIFFTAG_ROWSPERSTRIP,tif->tif_dir.td_rowsperstrip))
501					goto bad;
502			}
503			if (TIFFFieldSet(tif,FIELD_MINSAMPLEVALUE))
504			{
505				if (!TIFFWriteDirectoryTagShortPerSample(tif,&ndir,dir,TIFFTAG_MINSAMPLEVALUE,tif->tif_dir.td_minsamplevalue))
506					goto bad;
507			}
508			if (TIFFFieldSet(tif,FIELD_MAXSAMPLEVALUE))
509			{
510				if (!TIFFWriteDirectoryTagShortPerSample(tif,&ndir,dir,TIFFTAG_MAXSAMPLEVALUE,tif->tif_dir.td_maxsamplevalue))
511					goto bad;
512			}
513			if (TIFFFieldSet(tif,FIELD_PLANARCONFIG))
514			{
515				if (!TIFFWriteDirectoryTagShort(tif,&ndir,dir,TIFFTAG_PLANARCONFIG,tif->tif_dir.td_planarconfig))
516					goto bad;
517			}
518			if (TIFFFieldSet(tif,FIELD_RESOLUTIONUNIT))
519			{
520				if (!TIFFWriteDirectoryTagShort(tif,&ndir,dir,TIFFTAG_RESOLUTIONUNIT,tif->tif_dir.td_resolutionunit))
521					goto bad;
522			}
523			if (TIFFFieldSet(tif,FIELD_PAGENUMBER))
524			{
525				if (!TIFFWriteDirectoryTagShortArray(tif,&ndir,dir,TIFFTAG_PAGENUMBER,2,&tif->tif_dir.td_pagenumber[0]))
526					goto bad;
527			}
528			if (TIFFFieldSet(tif,FIELD_STRIPBYTECOUNTS))
529			{
530				if (!isTiled(tif))
531				{
532					if (!TIFFWriteDirectoryTagLongLong8Array(tif,&ndir,dir,TIFFTAG_STRIPBYTECOUNTS,tif->tif_dir.td_nstrips,tif->tif_dir.td_stripbytecount))
533						goto bad;
534				}
535				else
536				{
537					if (!TIFFWriteDirectoryTagLongLong8Array(tif,&ndir,dir,TIFFTAG_TILEBYTECOUNTS,tif->tif_dir.td_nstrips,tif->tif_dir.td_stripbytecount))
538						goto bad;
539				}
540			}
541			if (TIFFFieldSet(tif,FIELD_STRIPOFFSETS))
542			{
543				if (!isTiled(tif))
544				{
545					if (!TIFFWriteDirectoryTagLongLong8Array(tif,&ndir,dir,TIFFTAG_STRIPOFFSETS,tif->tif_dir.td_nstrips,tif->tif_dir.td_stripoffset))
546						goto bad;
547				}
548				else
549				{
550					if (!TIFFWriteDirectoryTagLongLong8Array(tif,&ndir,dir,TIFFTAG_TILEOFFSETS,tif->tif_dir.td_nstrips,tif->tif_dir.td_stripoffset))
551						goto bad;
552				}
553			}
554			if (TIFFFieldSet(tif,FIELD_COLORMAP))
555			{
556				if (!TIFFWriteDirectoryTagColormap(tif,&ndir,dir))
557					goto bad;
558			}
559			if (TIFFFieldSet(tif,FIELD_EXTRASAMPLES))
560			{
561				if (tif->tif_dir.td_extrasamples)
562				{
563					uint16 na;
564					uint16* nb;
565					TIFFGetFieldDefaulted(tif,TIFFTAG_EXTRASAMPLES,&na,&nb);
566					if (!TIFFWriteDirectoryTagShortArray(tif,&ndir,dir,TIFFTAG_EXTRASAMPLES,na,nb))
567						goto bad;
568				}
569			}
570			if (TIFFFieldSet(tif,FIELD_SAMPLEFORMAT))
571			{
572				if (!TIFFWriteDirectoryTagShortPerSample(tif,&ndir,dir,TIFFTAG_SAMPLEFORMAT,tif->tif_dir.td_sampleformat))
573					goto bad;
574			}
575			if (TIFFFieldSet(tif,FIELD_SMINSAMPLEVALUE))
576			{
577				if (!TIFFWriteDirectoryTagSampleformatArray(tif,&ndir,dir,TIFFTAG_SMINSAMPLEVALUE,tif->tif_dir.td_samplesperpixel,tif->tif_dir.td_sminsamplevalue))
578					goto bad;
579			}
580			if (TIFFFieldSet(tif,FIELD_SMAXSAMPLEVALUE))
581			{
582				if (!TIFFWriteDirectoryTagSampleformatArray(tif,&ndir,dir,TIFFTAG_SMAXSAMPLEVALUE,tif->tif_dir.td_samplesperpixel,tif->tif_dir.td_smaxsamplevalue))
583					goto bad;
584			}
585			if (TIFFFieldSet(tif,FIELD_IMAGEDEPTH))
586			{
587				if (!TIFFWriteDirectoryTagLong(tif,&ndir,dir,TIFFTAG_IMAGEDEPTH,tif->tif_dir.td_imagedepth))
588					goto bad;
589			}
590			if (TIFFFieldSet(tif,FIELD_TILEDEPTH))
591			{
592				if (!TIFFWriteDirectoryTagLong(tif,&ndir,dir,TIFFTAG_TILEDEPTH,tif->tif_dir.td_tiledepth))
593					goto bad;
594			}
595			if (TIFFFieldSet(tif,FIELD_HALFTONEHINTS))
596			{
597				if (!TIFFWriteDirectoryTagShortArray(tif,&ndir,dir,TIFFTAG_HALFTONEHINTS,2,&tif->tif_dir.td_halftonehints[0]))
598					goto bad;
599			}
600			if (TIFFFieldSet(tif,FIELD_YCBCRSUBSAMPLING))
601			{
602				if (!TIFFWriteDirectoryTagShortArray(tif,&ndir,dir,TIFFTAG_YCBCRSUBSAMPLING,2,&tif->tif_dir.td_ycbcrsubsampling[0]))
603					goto bad;
604			}
605			if (TIFFFieldSet(tif,FIELD_YCBCRPOSITIONING))
606			{
607				if (!TIFFWriteDirectoryTagShort(tif,&ndir,dir,TIFFTAG_YCBCRPOSITIONING,tif->tif_dir.td_ycbcrpositioning))
608					goto bad;
609			}
610			if (TIFFFieldSet(tif,FIELD_REFBLACKWHITE))
611			{
612				if (!TIFFWriteDirectoryTagRationalArray(tif,&ndir,dir,TIFFTAG_REFERENCEBLACKWHITE,6,tif->tif_dir.td_refblackwhite))
613					goto bad;
614			}
615			if (TIFFFieldSet(tif,FIELD_TRANSFERFUNCTION))
616			{
617				if (!TIFFWriteDirectoryTagTransferfunction(tif,&ndir,dir))
618					goto bad;
619			}
620			if (TIFFFieldSet(tif,FIELD_INKNAMES))
621			{
622				if (!TIFFWriteDirectoryTagAscii(tif,&ndir,dir,TIFFTAG_INKNAMES,tif->tif_dir.td_inknameslen,tif->tif_dir.td_inknames))
623					goto bad;
624			}
625			if (TIFFFieldSet(tif,FIELD_SUBIFD))
626			{
627				if (!TIFFWriteDirectoryTagSubifd(tif,&ndir,dir))
628					goto bad;
629			}
630			{
631				uint32 n;
632				for (n=0; n<tif->tif_nfields; n++) {
633					const TIFFField* o;
634					o = tif->tif_fields[n];
635					if ((o->field_bit>=FIELD_CODEC)&&(TIFFFieldSet(tif,o->field_bit)))
636					{
637						switch (o->get_field_type)
638						{
639							case TIFF_SETGET_ASCII:
640								{
641									uint32 pa;
642									char* pb;
643									assert(o->field_type==TIFF_ASCII);
644									assert(o->field_readcount==TIFF_VARIABLE);
645									assert(o->field_passcount==0);
646									TIFFGetField(tif,o->field_tag,&pb);
647									pa=(uint32)(strlen(pb));
648									if (!TIFFWriteDirectoryTagAscii(tif,&ndir,dir,o->field_tag,pa,pb))
649										goto bad;
650								}
651								break;
652							case TIFF_SETGET_UINT16:
653								{
654									uint16 p;
655									assert(o->field_type==TIFF_SHORT);
656									assert(o->field_readcount==1);
657									assert(o->field_passcount==0);
658									TIFFGetField(tif,o->field_tag,&p);
659									if (!TIFFWriteDirectoryTagShort(tif,&ndir,dir,o->field_tag,p))
660										goto bad;
661								}
662								break;
663							case TIFF_SETGET_UINT32:
664								{
665									uint32 p;
666									assert(o->field_type==TIFF_LONG);
667									assert(o->field_readcount==1);
668									assert(o->field_passcount==0);
669									TIFFGetField(tif,o->field_tag,&p);
670									if (!TIFFWriteDirectoryTagLong(tif,&ndir,dir,o->field_tag,p))
671										goto bad;
672								}
673								break;
674							case TIFF_SETGET_C32_UINT8:
675								{
676									uint32 pa;
677									void* pb;
678									assert(o->field_type==TIFF_UNDEFINED);
679									assert(o->field_readcount==TIFF_VARIABLE2);
680									assert(o->field_passcount==1);
681									TIFFGetField(tif,o->field_tag,&pa,&pb);
682									if (!TIFFWriteDirectoryTagUndefinedArray(tif,&ndir,dir,o->field_tag,pa,pb))
683										goto bad;
684								}
685								break;
686							default:
687								assert(0);   /* we should never get here */
688								break;
689						}
690					}
691				}
692			}
693		}
694		for (m=0; m<(uint32)(tif->tif_dir.td_customValueCount); m++)
695		{
696			switch (tif->tif_dir.td_customValues[m].info->field_type)
697			{
698				case TIFF_ASCII:
699					if (!TIFFWriteDirectoryTagAscii(tif,&ndir,dir,tif->tif_dir.td_customValues[m].info->field_tag,tif->tif_dir.td_customValues[m].count,tif->tif_dir.td_customValues[m].value))
700						goto bad;
701					break;
702				case TIFF_UNDEFINED:
703					if (!TIFFWriteDirectoryTagUndefinedArray(tif,&ndir,dir,tif->tif_dir.td_customValues[m].info->field_tag,tif->tif_dir.td_customValues[m].count,tif->tif_dir.td_customValues[m].value))
704						goto bad;
705					break;
706				case TIFF_BYTE:
707					if (!TIFFWriteDirectoryTagByteArray(tif,&ndir,dir,tif->tif_dir.td_customValues[m].info->field_tag,tif->tif_dir.td_customValues[m].count,tif->tif_dir.td_customValues[m].value))
708						goto bad;
709					break;
710				case TIFF_SBYTE:
711					if (!TIFFWriteDirectoryTagSbyteArray(tif,&ndir,dir,tif->tif_dir.td_customValues[m].info->field_tag,tif->tif_dir.td_customValues[m].count,tif->tif_dir.td_customValues[m].value))
712						goto bad;
713					break;
714				case TIFF_SHORT:
715					if (!TIFFWriteDirectoryTagShortArray(tif,&ndir,dir,tif->tif_dir.td_customValues[m].info->field_tag,tif->tif_dir.td_customValues[m].count,tif->tif_dir.td_customValues[m].value))
716						goto bad;
717					break;
718				case TIFF_SSHORT:
719					if (!TIFFWriteDirectoryTagSshortArray(tif,&ndir,dir,tif->tif_dir.td_customValues[m].info->field_tag,tif->tif_dir.td_customValues[m].count,tif->tif_dir.td_customValues[m].value))
720						goto bad;
721					break;
722				case TIFF_LONG:
723					if (!TIFFWriteDirectoryTagLongArray(tif,&ndir,dir,tif->tif_dir.td_customValues[m].info->field_tag,tif->tif_dir.td_customValues[m].count,tif->tif_dir.td_customValues[m].value))
724						goto bad;
725					break;
726				case TIFF_SLONG:
727					if (!TIFFWriteDirectoryTagSlongArray(tif,&ndir,dir,tif->tif_dir.td_customValues[m].info->field_tag,tif->tif_dir.td_customValues[m].count,tif->tif_dir.td_customValues[m].value))
728						goto bad;
729					break;
730				case TIFF_LONG8:
731					if (!TIFFWriteDirectoryTagLong8Array(tif,&ndir,dir,tif->tif_dir.td_customValues[m].info->field_tag,tif->tif_dir.td_customValues[m].count,tif->tif_dir.td_customValues[m].value))
732						goto bad;
733					break;
734				case TIFF_SLONG8:
735					if (!TIFFWriteDirectoryTagSlong8Array(tif,&ndir,dir,tif->tif_dir.td_customValues[m].info->field_tag,tif->tif_dir.td_customValues[m].count,tif->tif_dir.td_customValues[m].value))
736						goto bad;
737					break;
738				case TIFF_RATIONAL:
739					if (!TIFFWriteDirectoryTagRationalArray(tif,&ndir,dir,tif->tif_dir.td_customValues[m].info->field_tag,tif->tif_dir.td_customValues[m].count,tif->tif_dir.td_customValues[m].value))
740						goto bad;
741					break;
742				case TIFF_SRATIONAL:
743					if (!TIFFWriteDirectoryTagSrationalArray(tif,&ndir,dir,tif->tif_dir.td_customValues[m].info->field_tag,tif->tif_dir.td_customValues[m].count,tif->tif_dir.td_customValues[m].value))
744						goto bad;
745					break;
746				case TIFF_FLOAT:
747					if (!TIFFWriteDirectoryTagFloatArray(tif,&ndir,dir,tif->tif_dir.td_customValues[m].info->field_tag,tif->tif_dir.td_customValues[m].count,tif->tif_dir.td_customValues[m].value))
748						goto bad;
749					break;
750				case TIFF_DOUBLE:
751					if (!TIFFWriteDirectoryTagDoubleArray(tif,&ndir,dir,tif->tif_dir.td_customValues[m].info->field_tag,tif->tif_dir.td_customValues[m].count,tif->tif_dir.td_customValues[m].value))
752						goto bad;
753					break;
754				case TIFF_IFD:
755					if (!TIFFWriteDirectoryTagIfdArray(tif,&ndir,dir,tif->tif_dir.td_customValues[m].info->field_tag,tif->tif_dir.td_customValues[m].count,tif->tif_dir.td_customValues[m].value))
756						goto bad;
757					break;
758				case TIFF_IFD8:
759					if (!TIFFWriteDirectoryTagIfdIfd8Array(tif,&ndir,dir,tif->tif_dir.td_customValues[m].info->field_tag,tif->tif_dir.td_customValues[m].count,tif->tif_dir.td_customValues[m].value))
760						goto bad;
761					break;
762				default:
763					assert(0);   /* we should never get here */
764					break;
765			}
766		}
767		if (dir!=NULL)
768			break;
769		dir=_TIFFmalloc(ndir*sizeof(TIFFDirEntry));
770		if (dir==NULL)
771		{
772			TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
773			goto bad;
774		}
775		if (isimage)
776		{
777			if ((tif->tif_diroff==0)&&(!TIFFLinkDirectory(tif)))
778				goto bad;
779		}
780		else
781			tif->tif_diroff=(TIFFSeekFile(tif,0,SEEK_END)+1)&(~1);
782		if (pdiroff!=NULL)
783			*pdiroff=tif->tif_diroff;
784		if (!(tif->tif_flags&TIFF_BIGTIFF))
785			dirsize=2+ndir*12+4;
786		else
787			dirsize=8+ndir*20+8;
788		tif->tif_dataoff=tif->tif_diroff+dirsize;
789		if (!(tif->tif_flags&TIFF_BIGTIFF))
790			tif->tif_dataoff=(uint32)tif->tif_dataoff;
791		if ((tif->tif_dataoff<tif->tif_diroff)||(tif->tif_dataoff<(uint64)dirsize))
792		{
793			TIFFErrorExt(tif->tif_clientdata,module,"Maximum TIFF file size exceeded");
794			goto bad;
795		}
796		if (tif->tif_dataoff&1)
797			tif->tif_dataoff++;
798		if (isimage)
799			tif->tif_curdir++;
800	}
801	if (isimage)
802	{
803		if (TIFFFieldSet(tif,FIELD_SUBIFD)&&(tif->tif_subifdoff==0))
804		{
805			uint32 na;
806			TIFFDirEntry* nb;
807			for (na=0, nb=dir; ; na++, nb++)
808			{
809				assert(na<ndir);
810				if (nb->tdir_tag==TIFFTAG_SUBIFD)
811					break;
812			}
813			if (!(tif->tif_flags&TIFF_BIGTIFF))
814				tif->tif_subifdoff=tif->tif_diroff+2+na*12+8;
815			else
816				tif->tif_subifdoff=tif->tif_diroff+8+na*20+12;
817		}
818	}
819	dirmem=_TIFFmalloc(dirsize);
820	if (dirmem==NULL)
821	{
822		TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
823		goto bad;
824	}
825	if (!(tif->tif_flags&TIFF_BIGTIFF))
826	{
827		uint8* n;
828		uint32 nTmp;
829		TIFFDirEntry* o;
830		n=dirmem;
831		*(uint16*)n=ndir;
832		if (tif->tif_flags&TIFF_SWAB)
833			TIFFSwabShort((uint16*)n);
834		n+=2;
835		o=dir;
836		for (m=0; m<ndir; m++)
837		{
838			*(uint16*)n=o->tdir_tag;
839			if (tif->tif_flags&TIFF_SWAB)
840				TIFFSwabShort((uint16*)n);
841			n+=2;
842			*(uint16*)n=o->tdir_type;
843			if (tif->tif_flags&TIFF_SWAB)
844				TIFFSwabShort((uint16*)n);
845			n+=2;
846			nTmp = (uint32)o->tdir_count;
847			_TIFFmemcpy(n,&nTmp,4);
848			if (tif->tif_flags&TIFF_SWAB)
849				TIFFSwabLong((uint32*)n);
850			n+=4;
851			/* This is correct. The data has been */
852			/* swabbed previously in TIFFWriteDirectoryTagData */
853			_TIFFmemcpy(n,&o->tdir_offset,4);
854			n+=4;
855			o++;
856		}
857		nTmp = (uint32)tif->tif_nextdiroff;
858		if (tif->tif_flags&TIFF_SWAB)
859			TIFFSwabLong(&nTmp);
860		_TIFFmemcpy(n,&nTmp,4);
861	}
862	else
863	{
864		uint8* n;
865		TIFFDirEntry* o;
866		n=dirmem;
867		*(uint64*)n=ndir;
868		if (tif->tif_flags&TIFF_SWAB)
869			TIFFSwabLong8((uint64*)n);
870		n+=8;
871		o=dir;
872		for (m=0; m<ndir; m++)
873		{
874			*(uint16*)n=o->tdir_tag;
875			if (tif->tif_flags&TIFF_SWAB)
876				TIFFSwabShort((uint16*)n);
877			n+=2;
878			*(uint16*)n=o->tdir_type;
879			if (tif->tif_flags&TIFF_SWAB)
880				TIFFSwabShort((uint16*)n);
881			n+=2;
882			_TIFFmemcpy(n,&o->tdir_count,8);
883			if (tif->tif_flags&TIFF_SWAB)
884				TIFFSwabLong8((uint64*)n);
885			n+=8;
886			_TIFFmemcpy(n,&o->tdir_offset,8);
887			n+=8;
888			o++;
889		}
890		_TIFFmemcpy(n,&tif->tif_nextdiroff,8);
891		if (tif->tif_flags&TIFF_SWAB)
892			TIFFSwabLong8((uint64*)n);
893	}
894	_TIFFfree(dir);
895	dir=NULL;
896	if (!SeekOK(tif,tif->tif_diroff))
897	{
898		TIFFErrorExt(tif->tif_clientdata,module,"IO error writing directory");
899		goto bad;
900	}
901	if (!WriteOK(tif,dirmem,(tmsize_t)dirsize))
902	{
903		TIFFErrorExt(tif->tif_clientdata,module,"IO error writing directory");
904		goto bad;
905	}
906	_TIFFfree(dirmem);
907	if (imagedone)
908	{
909		TIFFFreeDirectory(tif);
910		tif->tif_flags &= ~TIFF_DIRTYDIRECT;
911		tif->tif_flags &= ~TIFF_DIRTYSTRIP;
912		(*tif->tif_cleanup)(tif);
913		/*
914		* Reset directory-related state for subsequent
915		* directories.
916		*/
917		TIFFCreateDirectory(tif);
918	}
919	return(1);
920bad:
921	if (dir!=NULL)
922		_TIFFfree(dir);
923	if (dirmem!=NULL)
924		_TIFFfree(dirmem);
925	return(0);
926}
927
928static int
929TIFFWriteDirectoryTagSampleformatArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, double* value)
930{
931	static const char module[] = "TIFFWriteDirectoryTagSampleformatArray";
932	void* conv;
933	uint32 i;
934	int ok;
935	conv = _TIFFmalloc(count*sizeof(double));
936	if (conv == NULL)
937	{
938		TIFFErrorExt(tif->tif_clientdata, module, "Out of memory");
939		return (0);
940	}
941
942	switch (tif->tif_dir.td_sampleformat)
943	{
944		case SAMPLEFORMAT_IEEEFP:
945			if (tif->tif_dir.td_bitspersample<=32)
946			{
947				for (i = 0; i < count; ++i)
948					((float*)conv)[i] = (float)value[i];
949				ok = TIFFWriteDirectoryTagFloatArray(tif,ndir,dir,tag,count,(float*)conv);
950			}
951			else
952			{
953				ok = TIFFWriteDirectoryTagDoubleArray(tif,ndir,dir,tag,count,value);
954			}
955			break;
956		case SAMPLEFORMAT_INT:
957			if (tif->tif_dir.td_bitspersample<=8)
958			{
959				for (i = 0; i < count; ++i)
960					((int8*)conv)[i] = (int8)value[i];
961				ok = TIFFWriteDirectoryTagSbyteArray(tif,ndir,dir,tag,count,(int8*)conv);
962			}
963			else if (tif->tif_dir.td_bitspersample<=16)
964			{
965				for (i = 0; i < count; ++i)
966					((int16*)conv)[i] = (int16)value[i];
967				ok = TIFFWriteDirectoryTagSshortArray(tif,ndir,dir,tag,count,(int16*)conv);
968			}
969			else
970			{
971				for (i = 0; i < count; ++i)
972					((int32*)conv)[i] = (int32)value[i];
973				ok = TIFFWriteDirectoryTagSlongArray(tif,ndir,dir,tag,count,(int32*)conv);
974			}
975			break;
976		case SAMPLEFORMAT_UINT:
977			if (tif->tif_dir.td_bitspersample<=8)
978			{
979				for (i = 0; i < count; ++i)
980					((uint8*)conv)[i] = (uint8)value[i];
981				ok = TIFFWriteDirectoryTagByteArray(tif,ndir,dir,tag,count,(uint8*)conv);
982			}
983			else if (tif->tif_dir.td_bitspersample<=16)
984			{
985				for (i = 0; i < count; ++i)
986					((uint16*)conv)[i] = (uint16)value[i];
987				ok = TIFFWriteDirectoryTagShortArray(tif,ndir,dir,tag,count,(uint16*)conv);
988			}
989			else
990			{
991				for (i = 0; i < count; ++i)
992					((uint32*)conv)[i] = (uint32)value[i];
993				ok = TIFFWriteDirectoryTagLongArray(tif,ndir,dir,tag,count,(uint32*)conv);
994			}
995			break;
996		default:
997			ok = 0;
998	}
999
1000	_TIFFfree(conv);
1001	return (ok);
1002}
1003
1004#if 0
1005static int
1006TIFFWriteDirectoryTagSampleformatPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value)
1007{
1008	switch (tif->tif_dir.td_sampleformat)
1009	{
1010		case SAMPLEFORMAT_IEEEFP:
1011			if (tif->tif_dir.td_bitspersample<=32)
1012				return(TIFFWriteDirectoryTagFloatPerSample(tif,ndir,dir,tag,(float)value));
1013			else
1014				return(TIFFWriteDirectoryTagDoublePerSample(tif,ndir,dir,tag,value));
1015		case SAMPLEFORMAT_INT:
1016			if (tif->tif_dir.td_bitspersample<=8)
1017				return(TIFFWriteDirectoryTagSbytePerSample(tif,ndir,dir,tag,(int8)value));
1018			else if (tif->tif_dir.td_bitspersample<=16)
1019				return(TIFFWriteDirectoryTagSshortPerSample(tif,ndir,dir,tag,(int16)value));
1020			else
1021				return(TIFFWriteDirectoryTagSlongPerSample(tif,ndir,dir,tag,(int32)value));
1022		case SAMPLEFORMAT_UINT:
1023			if (tif->tif_dir.td_bitspersample<=8)
1024				return(TIFFWriteDirectoryTagBytePerSample(tif,ndir,dir,tag,(uint8)value));
1025			else if (tif->tif_dir.td_bitspersample<=16)
1026				return(TIFFWriteDirectoryTagShortPerSample(tif,ndir,dir,tag,(uint16)value));
1027			else
1028				return(TIFFWriteDirectoryTagLongPerSample(tif,ndir,dir,tag,(uint32)value));
1029		default:
1030			return(1);
1031	}
1032}
1033#endif
1034
1035static int
1036TIFFWriteDirectoryTagAscii(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, char* value)
1037{
1038	if (dir==NULL)
1039	{
1040		(*ndir)++;
1041		return(1);
1042	}
1043	return(TIFFWriteDirectoryTagCheckedAscii(tif,ndir,dir,tag,count,value));
1044}
1045
1046static int
1047TIFFWriteDirectoryTagUndefinedArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint8* value)
1048{
1049	if (dir==NULL)
1050	{
1051		(*ndir)++;
1052		return(1);
1053	}
1054	return(TIFFWriteDirectoryTagCheckedUndefinedArray(tif,ndir,dir,tag,count,value));
1055}
1056
1057#ifdef notdef
1058static int
1059TIFFWriteDirectoryTagByte(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint8 value)
1060{
1061	if (dir==NULL)
1062	{
1063		(*ndir)++;
1064		return(1);
1065	}
1066	return(TIFFWriteDirectoryTagCheckedByte(tif,ndir,dir,tag,value));
1067}
1068#endif
1069
1070static int
1071TIFFWriteDirectoryTagByteArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint8* value)
1072{
1073	if (dir==NULL)
1074	{
1075		(*ndir)++;
1076		return(1);
1077	}
1078	return(TIFFWriteDirectoryTagCheckedByteArray(tif,ndir,dir,tag,count,value));
1079}
1080
1081#if 0
1082static int
1083TIFFWriteDirectoryTagBytePerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint8 value)
1084{
1085	static const char module[] = "TIFFWriteDirectoryTagBytePerSample";
1086	uint8* m;
1087	uint8* na;
1088	uint16 nb;
1089	int o;
1090	if (dir==NULL)
1091	{
1092		(*ndir)++;
1093		return(1);
1094	}
1095	m=_TIFFmalloc(tif->tif_dir.td_samplesperpixel*sizeof(uint8));
1096	if (m==NULL)
1097	{
1098		TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
1099		return(0);
1100	}
1101	for (na=m, nb=0; nb<tif->tif_dir.td_samplesperpixel; na++, nb++)
1102		*na=value;
1103	o=TIFFWriteDirectoryTagCheckedByteArray(tif,ndir,dir,tag,tif->tif_dir.td_samplesperpixel,m);
1104	_TIFFfree(m);
1105	return(o);
1106}
1107#endif
1108
1109#ifdef notdef
1110static int
1111TIFFWriteDirectoryTagSbyte(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int8 value)
1112{
1113	if (dir==NULL)
1114	{
1115		(*ndir)++;
1116		return(1);
1117	}
1118	return(TIFFWriteDirectoryTagCheckedSbyte(tif,ndir,dir,tag,value));
1119}
1120#endif
1121
1122static int
1123TIFFWriteDirectoryTagSbyteArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int8* value)
1124{
1125	if (dir==NULL)
1126	{
1127		(*ndir)++;
1128		return(1);
1129	}
1130	return(TIFFWriteDirectoryTagCheckedSbyteArray(tif,ndir,dir,tag,count,value));
1131}
1132
1133#if 0
1134static int
1135TIFFWriteDirectoryTagSbytePerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int8 value)
1136{
1137	static const char module[] = "TIFFWriteDirectoryTagSbytePerSample";
1138	int8* m;
1139	int8* na;
1140	uint16 nb;
1141	int o;
1142	if (dir==NULL)
1143	{
1144		(*ndir)++;
1145		return(1);
1146	}
1147	m=_TIFFmalloc(tif->tif_dir.td_samplesperpixel*sizeof(int8));
1148	if (m==NULL)
1149	{
1150		TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
1151		return(0);
1152	}
1153	for (na=m, nb=0; nb<tif->tif_dir.td_samplesperpixel; na++, nb++)
1154		*na=value;
1155	o=TIFFWriteDirectoryTagCheckedSbyteArray(tif,ndir,dir,tag,tif->tif_dir.td_samplesperpixel,m);
1156	_TIFFfree(m);
1157	return(o);
1158}
1159#endif
1160
1161static int
1162TIFFWriteDirectoryTagShort(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint16 value)
1163{
1164	if (dir==NULL)
1165	{
1166		(*ndir)++;
1167		return(1);
1168	}
1169	return(TIFFWriteDirectoryTagCheckedShort(tif,ndir,dir,tag,value));
1170}
1171
1172static int
1173TIFFWriteDirectoryTagShortArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint16* value)
1174{
1175	if (dir==NULL)
1176	{
1177		(*ndir)++;
1178		return(1);
1179	}
1180	return(TIFFWriteDirectoryTagCheckedShortArray(tif,ndir,dir,tag,count,value));
1181}
1182
1183static int
1184TIFFWriteDirectoryTagShortPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint16 value)
1185{
1186	static const char module[] = "TIFFWriteDirectoryTagShortPerSample";
1187	uint16* m;
1188	uint16* na;
1189	uint16 nb;
1190	int o;
1191	if (dir==NULL)
1192	{
1193		(*ndir)++;
1194		return(1);
1195	}
1196	m=_TIFFmalloc(tif->tif_dir.td_samplesperpixel*sizeof(uint16));
1197	if (m==NULL)
1198	{
1199		TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
1200		return(0);
1201	}
1202	for (na=m, nb=0; nb<tif->tif_dir.td_samplesperpixel; na++, nb++)
1203		*na=value;
1204	o=TIFFWriteDirectoryTagCheckedShortArray(tif,ndir,dir,tag,tif->tif_dir.td_samplesperpixel,m);
1205	_TIFFfree(m);
1206	return(o);
1207}
1208
1209#ifdef notdef
1210static int
1211TIFFWriteDirectoryTagSshort(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int16 value)
1212{
1213	if (dir==NULL)
1214	{
1215		(*ndir)++;
1216		return(1);
1217	}
1218	return(TIFFWriteDirectoryTagCheckedSshort(tif,ndir,dir,tag,value));
1219}
1220#endif
1221
1222static int
1223TIFFWriteDirectoryTagSshortArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int16* value)
1224{
1225	if (dir==NULL)
1226	{
1227		(*ndir)++;
1228		return(1);
1229	}
1230	return(TIFFWriteDirectoryTagCheckedSshortArray(tif,ndir,dir,tag,count,value));
1231}
1232
1233#if 0
1234static int
1235TIFFWriteDirectoryTagSshortPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int16 value)
1236{
1237	static const char module[] = "TIFFWriteDirectoryTagSshortPerSample";
1238	int16* m;
1239	int16* na;
1240	uint16 nb;
1241	int o;
1242	if (dir==NULL)
1243	{
1244		(*ndir)++;
1245		return(1);
1246	}
1247	m=_TIFFmalloc(tif->tif_dir.td_samplesperpixel*sizeof(int16));
1248	if (m==NULL)
1249	{
1250		TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
1251		return(0);
1252	}
1253	for (na=m, nb=0; nb<tif->tif_dir.td_samplesperpixel; na++, nb++)
1254		*na=value;
1255	o=TIFFWriteDirectoryTagCheckedSshortArray(tif,ndir,dir,tag,tif->tif_dir.td_samplesperpixel,m);
1256	_TIFFfree(m);
1257	return(o);
1258}
1259#endif
1260
1261static int
1262TIFFWriteDirectoryTagLong(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 value)
1263{
1264	if (dir==NULL)
1265	{
1266		(*ndir)++;
1267		return(1);
1268	}
1269	return(TIFFWriteDirectoryTagCheckedLong(tif,ndir,dir,tag,value));
1270}
1271
1272static int
1273TIFFWriteDirectoryTagLongArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint32* value)
1274{
1275	if (dir==NULL)
1276	{
1277		(*ndir)++;
1278		return(1);
1279	}
1280	return(TIFFWriteDirectoryTagCheckedLongArray(tif,ndir,dir,tag,count,value));
1281}
1282
1283#if 0
1284static int
1285TIFFWriteDirectoryTagLongPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 value)
1286{
1287	static const char module[] = "TIFFWriteDirectoryTagLongPerSample";
1288	uint32* m;
1289	uint32* na;
1290	uint16 nb;
1291	int o;
1292	if (dir==NULL)
1293	{
1294		(*ndir)++;
1295		return(1);
1296	}
1297	m=_TIFFmalloc(tif->tif_dir.td_samplesperpixel*sizeof(uint32));
1298	if (m==NULL)
1299	{
1300		TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
1301		return(0);
1302	}
1303	for (na=m, nb=0; nb<tif->tif_dir.td_samplesperpixel; na++, nb++)
1304		*na=value;
1305	o=TIFFWriteDirectoryTagCheckedLongArray(tif,ndir,dir,tag,tif->tif_dir.td_samplesperpixel,m);
1306	_TIFFfree(m);
1307	return(o);
1308}
1309#endif
1310
1311#ifdef notdef
1312static int
1313TIFFWriteDirectoryTagSlong(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int32 value)
1314{
1315	if (dir==NULL)
1316	{
1317		(*ndir)++;
1318		return(1);
1319	}
1320	return(TIFFWriteDirectoryTagCheckedSlong(tif,ndir,dir,tag,value));
1321}
1322#endif
1323
1324static int
1325TIFFWriteDirectoryTagSlongArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int32* value)
1326{
1327	if (dir==NULL)
1328	{
1329		(*ndir)++;
1330		return(1);
1331	}
1332	return(TIFFWriteDirectoryTagCheckedSlongArray(tif,ndir,dir,tag,count,value));
1333}
1334
1335#if 0
1336static int
1337TIFFWriteDirectoryTagSlongPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int32 value)
1338{
1339	static const char module[] = "TIFFWriteDirectoryTagSlongPerSample";
1340	int32* m;
1341	int32* na;
1342	uint16 nb;
1343	int o;
1344	if (dir==NULL)
1345	{
1346		(*ndir)++;
1347		return(1);
1348	}
1349	m=_TIFFmalloc(tif->tif_dir.td_samplesperpixel*sizeof(int32));
1350	if (m==NULL)
1351	{
1352		TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
1353		return(0);
1354	}
1355	for (na=m, nb=0; nb<tif->tif_dir.td_samplesperpixel; na++, nb++)
1356		*na=value;
1357	o=TIFFWriteDirectoryTagCheckedSlongArray(tif,ndir,dir,tag,tif->tif_dir.td_samplesperpixel,m);
1358	_TIFFfree(m);
1359	return(o);
1360}
1361#endif
1362
1363#ifdef notdef
1364static int
1365TIFFWriteDirectoryTagLong8(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint64 value)
1366{
1367	if (dir==NULL)
1368	{
1369		(*ndir)++;
1370		return(1);
1371	}
1372	return(TIFFWriteDirectoryTagCheckedLong8(tif,ndir,dir,tag,value));
1373}
1374#endif
1375
1376static int
1377TIFFWriteDirectoryTagLong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value)
1378{
1379	if (dir==NULL)
1380	{
1381		(*ndir)++;
1382		return(1);
1383	}
1384	return(TIFFWriteDirectoryTagCheckedLong8Array(tif,ndir,dir,tag,count,value));
1385}
1386
1387#ifdef notdef
1388static int
1389TIFFWriteDirectoryTagSlong8(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int64 value)
1390{
1391	if (dir==NULL)
1392	{
1393		(*ndir)++;
1394		return(1);
1395	}
1396	return(TIFFWriteDirectoryTagCheckedSlong8(tif,ndir,dir,tag,value));
1397}
1398#endif
1399
1400static int
1401TIFFWriteDirectoryTagSlong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int64* value)
1402{
1403	if (dir==NULL)
1404	{
1405		(*ndir)++;
1406		return(1);
1407	}
1408	return(TIFFWriteDirectoryTagCheckedSlong8Array(tif,ndir,dir,tag,count,value));
1409}
1410
1411static int
1412TIFFWriteDirectoryTagRational(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value)
1413{
1414	if (dir==NULL)
1415	{
1416		(*ndir)++;
1417		return(1);
1418	}
1419	return(TIFFWriteDirectoryTagCheckedRational(tif,ndir,dir,tag,value));
1420}
1421
1422static int
1423TIFFWriteDirectoryTagRationalArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value)
1424{
1425	if (dir==NULL)
1426	{
1427		(*ndir)++;
1428		return(1);
1429	}
1430	return(TIFFWriteDirectoryTagCheckedRationalArray(tif,ndir,dir,tag,count,value));
1431}
1432
1433static int
1434TIFFWriteDirectoryTagSrationalArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value)
1435{
1436	if (dir==NULL)
1437	{
1438		(*ndir)++;
1439		return(1);
1440	}
1441	return(TIFFWriteDirectoryTagCheckedSrationalArray(tif,ndir,dir,tag,count,value));
1442}
1443
1444#ifdef notdef
1445static int TIFFWriteDirectoryTagFloat(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, float value)
1446{
1447	if (dir==NULL)
1448	{
1449		(*ndir)++;
1450		return(1);
1451	}
1452	return(TIFFWriteDirectoryTagCheckedFloat(tif,ndir,dir,tag,value));
1453}
1454#endif
1455
1456static int TIFFWriteDirectoryTagFloatArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value)
1457{
1458	if (dir==NULL)
1459	{
1460		(*ndir)++;
1461		return(1);
1462	}
1463	return(TIFFWriteDirectoryTagCheckedFloatArray(tif,ndir,dir,tag,count,value));
1464}
1465
1466#if 0
1467static int TIFFWriteDirectoryTagFloatPerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, float value)
1468{
1469	static const char module[] = "TIFFWriteDirectoryTagFloatPerSample";
1470	float* m;
1471	float* na;
1472	uint16 nb;
1473	int o;
1474	if (dir==NULL)
1475	{
1476		(*ndir)++;
1477		return(1);
1478	}
1479	m=_TIFFmalloc(tif->tif_dir.td_samplesperpixel*sizeof(float));
1480	if (m==NULL)
1481	{
1482		TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
1483		return(0);
1484	}
1485	for (na=m, nb=0; nb<tif->tif_dir.td_samplesperpixel; na++, nb++)
1486		*na=value;
1487	o=TIFFWriteDirectoryTagCheckedFloatArray(tif,ndir,dir,tag,tif->tif_dir.td_samplesperpixel,m);
1488	_TIFFfree(m);
1489	return(o);
1490}
1491#endif
1492
1493#ifdef notdef
1494static int TIFFWriteDirectoryTagDouble(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value)
1495{
1496	if (dir==NULL)
1497	{
1498		(*ndir)++;
1499		return(1);
1500	}
1501	return(TIFFWriteDirectoryTagCheckedDouble(tif,ndir,dir,tag,value));
1502}
1503#endif
1504
1505static int TIFFWriteDirectoryTagDoubleArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, double* value)
1506{
1507	if (dir==NULL)
1508	{
1509		(*ndir)++;
1510		return(1);
1511	}
1512	return(TIFFWriteDirectoryTagCheckedDoubleArray(tif,ndir,dir,tag,count,value));
1513}
1514
1515#if 0
1516static int TIFFWriteDirectoryTagDoublePerSample(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value)
1517{
1518	static const char module[] = "TIFFWriteDirectoryTagDoublePerSample";
1519	double* m;
1520	double* na;
1521	uint16 nb;
1522	int o;
1523	if (dir==NULL)
1524	{
1525		(*ndir)++;
1526		return(1);
1527	}
1528	m=_TIFFmalloc(tif->tif_dir.td_samplesperpixel*sizeof(double));
1529	if (m==NULL)
1530	{
1531		TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
1532		return(0);
1533	}
1534	for (na=m, nb=0; nb<tif->tif_dir.td_samplesperpixel; na++, nb++)
1535		*na=value;
1536	o=TIFFWriteDirectoryTagCheckedDoubleArray(tif,ndir,dir,tag,tif->tif_dir.td_samplesperpixel,m);
1537	_TIFFfree(m);
1538	return(o);
1539}
1540#endif
1541
1542static int
1543TIFFWriteDirectoryTagIfdArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint32* value)
1544{
1545	if (dir==NULL)
1546	{
1547		(*ndir)++;
1548		return(1);
1549	}
1550	return(TIFFWriteDirectoryTagCheckedIfdArray(tif,ndir,dir,tag,count,value));
1551}
1552
1553#ifdef notdef
1554static int
1555TIFFWriteDirectoryTagIfd8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value)
1556{
1557	if (dir==NULL)
1558	{
1559		(*ndir)++;
1560		return(1);
1561	}
1562	return(TIFFWriteDirectoryTagCheckedIfd8Array(tif,ndir,dir,tag,count,value));
1563}
1564#endif
1565
1566static int
1567TIFFWriteDirectoryTagShortLong(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 value)
1568{
1569	if (dir==NULL)
1570	{
1571		(*ndir)++;
1572		return(1);
1573	}
1574	if (value<=0xFFFF)
1575		return(TIFFWriteDirectoryTagCheckedShort(tif,ndir,dir,tag,(uint16)value));
1576	else
1577		return(TIFFWriteDirectoryTagCheckedLong(tif,ndir,dir,tag,value));
1578}
1579
1580/************************************************************************/
1581/*                TIFFWriteDirectoryTagLongLong8Array()                 */
1582/*                                                                      */
1583/*      Write out LONG8 array as LONG8 for BigTIFF or LONG for          */
1584/*      Classic TIFF with some checking.                                */
1585/************************************************************************/
1586
1587static int
1588TIFFWriteDirectoryTagLongLong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value)
1589{
1590    static const char module[] = "TIFFWriteDirectoryTagLongLong8Array";
1591    uint64* ma;
1592    uint32 mb;
1593    uint32* p;
1594    uint32* q;
1595    int o;
1596
1597    /* is this just a counting pass? */
1598    if (dir==NULL)
1599    {
1600        (*ndir)++;
1601        return(1);
1602    }
1603
1604    /* We always write LONG8 for BigTIFF, no checking needed. */
1605    if( tif->tif_flags&TIFF_BIGTIFF )
1606        return TIFFWriteDirectoryTagCheckedLong8Array(tif,ndir,dir,
1607                                                      tag,count,value);
1608
1609    /*
1610    ** For classic tiff we want to verify everything is in range for LONG
1611    ** and convert to long format.
1612    */
1613
1614    p = _TIFFmalloc(count*sizeof(uint32));
1615    if (p==NULL)
1616    {
1617        TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
1618        return(0);
1619    }
1620
1621    for (q=p, ma=value, mb=0; mb<count; ma++, mb++, q++)
1622    {
1623        if (*ma>0xFFFFFFFF)
1624        {
1625            TIFFErrorExt(tif->tif_clientdata,module,
1626                         "Attempt to write value larger than 0xFFFFFFFF in Classic TIFF file.");
1627            _TIFFfree(p);
1628            return(0);
1629        }
1630        *q= (uint32)(*ma);
1631    }
1632
1633    o=TIFFWriteDirectoryTagCheckedLongArray(tif,ndir,dir,tag,count,p);
1634    _TIFFfree(p);
1635
1636    return(o);
1637}
1638
1639/************************************************************************/
1640/*                 TIFFWriteDirectoryTagIfdIfd8Array()                  */
1641/*                                                                      */
1642/*      Write either IFD8 or IFD array depending on file type.          */
1643/************************************************************************/
1644
1645static int
1646TIFFWriteDirectoryTagIfdIfd8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value)
1647{
1648    static const char module[] = "TIFFWriteDirectoryTagIfdIfd8Array";
1649    uint64* ma;
1650    uint32 mb;
1651    uint32* p;
1652    uint32* q;
1653    int o;
1654
1655    /* is this just a counting pass? */
1656    if (dir==NULL)
1657    {
1658        (*ndir)++;
1659        return(1);
1660    }
1661
1662    /* We always write IFD8 for BigTIFF, no checking needed. */
1663    if( tif->tif_flags&TIFF_BIGTIFF )
1664        return TIFFWriteDirectoryTagCheckedIfd8Array(tif,ndir,dir,
1665                                                     tag,count,value);
1666
1667    /*
1668    ** For classic tiff we want to verify everything is in range for IFD
1669    ** and convert to long format.
1670    */
1671
1672    p = _TIFFmalloc(count*sizeof(uint32));
1673    if (p==NULL)
1674    {
1675        TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
1676        return(0);
1677    }
1678
1679    for (q=p, ma=value, mb=0; mb<count; ma++, mb++, q++)
1680    {
1681        if (*ma>0xFFFFFFFF)
1682        {
1683            TIFFErrorExt(tif->tif_clientdata,module,
1684                         "Attempt to write value larger than 0xFFFFFFFF in Classic TIFF file.");
1685            _TIFFfree(p);
1686            return(0);
1687        }
1688        *q= (uint32)(*ma);
1689    }
1690
1691    o=TIFFWriteDirectoryTagCheckedIfdArray(tif,ndir,dir,tag,count,p);
1692    _TIFFfree(p);
1693
1694    return(o);
1695}
1696
1697#ifdef notdef
1698static int
1699TIFFWriteDirectoryTagShortLongLong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value)
1700{
1701	static const char module[] = "TIFFWriteDirectoryTagShortLongLong8Array";
1702	uint64* ma;
1703	uint32 mb;
1704	uint8 n;
1705	int o;
1706	if (dir==NULL)
1707	{
1708		(*ndir)++;
1709		return(1);
1710	}
1711	n=0;
1712	for (ma=value, mb=0; mb<count; ma++, mb++)
1713	{
1714		if ((n==0)&&(*ma>0xFFFF))
1715			n=1;
1716		if ((n==1)&&(*ma>0xFFFFFFFF))
1717		{
1718			n=2;
1719			break;
1720		}
1721	}
1722	if (n==0)
1723	{
1724		uint16* p;
1725		uint16* q;
1726		p=_TIFFmalloc(count*sizeof(uint16));
1727		if (p==NULL)
1728		{
1729			TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
1730			return(0);
1731		}
1732		for (ma=value, mb=0, q=p; mb<count; ma++, mb++, q++)
1733			*q=(uint16)(*ma);
1734		o=TIFFWriteDirectoryTagCheckedShortArray(tif,ndir,dir,tag,count,p);
1735		_TIFFfree(p);
1736	}
1737	else if (n==1)
1738	{
1739		uint32* p;
1740		uint32* q;
1741		p=_TIFFmalloc(count*sizeof(uint32));
1742		if (p==NULL)
1743		{
1744			TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
1745			return(0);
1746		}
1747		for (ma=value, mb=0, q=p; mb<count; ma++, mb++, q++)
1748			*q=(uint32)(*ma);
1749		o=TIFFWriteDirectoryTagCheckedLongArray(tif,ndir,dir,tag,count,p);
1750		_TIFFfree(p);
1751	}
1752	else
1753	{
1754		assert(n==2);
1755		o=TIFFWriteDirectoryTagCheckedLong8Array(tif,ndir,dir,tag,count,value);
1756	}
1757	return(o);
1758}
1759#endif
1760static int
1761TIFFWriteDirectoryTagColormap(TIFF* tif, uint32* ndir, TIFFDirEntry* dir)
1762{
1763	static const char module[] = "TIFFWriteDirectoryTagColormap";
1764	uint32 m;
1765	uint16* n;
1766	int o;
1767	if (dir==NULL)
1768	{
1769		(*ndir)++;
1770		return(1);
1771	}
1772	m=(1<<tif->tif_dir.td_bitspersample);
1773	n=_TIFFmalloc(3*m*sizeof(uint16));
1774	if (n==NULL)
1775	{
1776		TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
1777		return(0);
1778	}
1779	_TIFFmemcpy(&n[0],tif->tif_dir.td_colormap[0],m*sizeof(uint16));
1780	_TIFFmemcpy(&n[m],tif->tif_dir.td_colormap[1],m*sizeof(uint16));
1781	_TIFFmemcpy(&n[2*m],tif->tif_dir.td_colormap[2],m*sizeof(uint16));
1782	o=TIFFWriteDirectoryTagCheckedShortArray(tif,ndir,dir,TIFFTAG_COLORMAP,3*m,n);
1783	_TIFFfree(n);
1784	return(o);
1785}
1786
1787static int
1788TIFFWriteDirectoryTagTransferfunction(TIFF* tif, uint32* ndir, TIFFDirEntry* dir)
1789{
1790	static const char module[] = "TIFFWriteDirectoryTagTransferfunction";
1791	uint32 m;
1792	uint16 n;
1793	uint16* o;
1794	int p;
1795	if (dir==NULL)
1796	{
1797		(*ndir)++;
1798		return(1);
1799	}
1800	m=(1<<tif->tif_dir.td_bitspersample);
1801	n=tif->tif_dir.td_samplesperpixel-tif->tif_dir.td_extrasamples;
1802	/*
1803	 * Check if the table can be written as a single column,
1804	 * or if it must be written as 3 columns.  Note that we
1805	 * write a 3-column tag if there are 2 samples/pixel and
1806	 * a single column of data won't suffice--hmm.
1807	 */
1808	if (n>3)
1809		n=3;
1810	if (n==3)
1811	{
1812		if (!_TIFFmemcmp(tif->tif_dir.td_transferfunction[0],tif->tif_dir.td_transferfunction[2],m*sizeof(uint16)))
1813			n=2;
1814	}
1815	if (n==2)
1816	{
1817		if (!_TIFFmemcmp(tif->tif_dir.td_transferfunction[0],tif->tif_dir.td_transferfunction[1],m*sizeof(uint16)))
1818			n=1;
1819	}
1820	if (n==0)
1821		n=1;
1822	o=_TIFFmalloc(n*m*sizeof(uint16));
1823	if (o==NULL)
1824	{
1825		TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
1826		return(0);
1827	}
1828	_TIFFmemcpy(&o[0],tif->tif_dir.td_transferfunction[0],m*sizeof(uint16));
1829	if (n>1)
1830		_TIFFmemcpy(&o[m],tif->tif_dir.td_transferfunction[1],m*sizeof(uint16));
1831	if (n>2)
1832		_TIFFmemcpy(&o[2*m],tif->tif_dir.td_transferfunction[2],m*sizeof(uint16));
1833	p=TIFFWriteDirectoryTagCheckedShortArray(tif,ndir,dir,TIFFTAG_TRANSFERFUNCTION,n*m,o);
1834	_TIFFfree(o);
1835	return(p);
1836}
1837
1838static int
1839TIFFWriteDirectoryTagSubifd(TIFF* tif, uint32* ndir, TIFFDirEntry* dir)
1840{
1841	static const char module[] = "TIFFWriteDirectoryTagSubifd";
1842	uint64 m;
1843	int n;
1844	if (tif->tif_dir.td_nsubifd==0)
1845		return(1);
1846	if (dir==NULL)
1847	{
1848		(*ndir)++;
1849		return(1);
1850	}
1851	m=tif->tif_dataoff;
1852	if (!(tif->tif_flags&TIFF_BIGTIFF))
1853	{
1854		uint32* o;
1855		uint64* pa;
1856		uint32* pb;
1857		uint16 p;
1858		o=_TIFFmalloc(tif->tif_dir.td_nsubifd*sizeof(uint32));
1859		if (o==NULL)
1860		{
1861			TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
1862			return(0);
1863		}
1864		pa=tif->tif_dir.td_subifd;
1865		pb=o;
1866		for (p=0; p < tif->tif_dir.td_nsubifd; p++)
1867		{
1868                        assert(pa != 0);
1869			assert(*pa <= 0xFFFFFFFFUL);
1870			*pb++=(uint32)(*pa++);
1871		}
1872		n=TIFFWriteDirectoryTagCheckedIfdArray(tif,ndir,dir,TIFFTAG_SUBIFD,tif->tif_dir.td_nsubifd,o);
1873		_TIFFfree(o);
1874	}
1875	else
1876		n=TIFFWriteDirectoryTagCheckedIfd8Array(tif,ndir,dir,TIFFTAG_SUBIFD,tif->tif_dir.td_nsubifd,tif->tif_dir.td_subifd);
1877	if (!n)
1878		return(0);
1879	/*
1880	 * Total hack: if this directory includes a SubIFD
1881	 * tag then force the next <n> directories to be
1882	 * written as ``sub directories'' of this one.  This
1883	 * is used to write things like thumbnails and
1884	 * image masks that one wants to keep out of the
1885	 * normal directory linkage access mechanism.
1886	 */
1887	tif->tif_flags|=TIFF_INSUBIFD;
1888	tif->tif_nsubifd=tif->tif_dir.td_nsubifd;
1889	if (tif->tif_dir.td_nsubifd==1)
1890		tif->tif_subifdoff=0;
1891	else
1892		tif->tif_subifdoff=m;
1893	return(1);
1894}
1895
1896static int
1897TIFFWriteDirectoryTagCheckedAscii(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, char* value)
1898{
1899	assert(sizeof(char)==1);
1900	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_ASCII,count,count,value));
1901}
1902
1903static int
1904TIFFWriteDirectoryTagCheckedUndefinedArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint8* value)
1905{
1906	assert(sizeof(uint8)==1);
1907	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_UNDEFINED,count,count,value));
1908}
1909
1910#ifdef notdef
1911static int
1912TIFFWriteDirectoryTagCheckedByte(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint8 value)
1913{
1914	assert(sizeof(uint8)==1);
1915	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_BYTE,1,1,&value));
1916}
1917#endif
1918
1919static int
1920TIFFWriteDirectoryTagCheckedByteArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint8* value)
1921{
1922	assert(sizeof(uint8)==1);
1923	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_BYTE,count,count,value));
1924}
1925
1926#ifdef notdef
1927static int
1928TIFFWriteDirectoryTagCheckedSbyte(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int8 value)
1929{
1930	assert(sizeof(int8)==1);
1931	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_SBYTE,1,1,&value));
1932}
1933#endif
1934
1935static int
1936TIFFWriteDirectoryTagCheckedSbyteArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int8* value)
1937{
1938	assert(sizeof(int8)==1);
1939	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_SBYTE,count,count,value));
1940}
1941
1942static int
1943TIFFWriteDirectoryTagCheckedShort(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint16 value)
1944{
1945	uint16 m;
1946	assert(sizeof(uint16)==2);
1947	m=value;
1948	if (tif->tif_flags&TIFF_SWAB)
1949		TIFFSwabShort(&m);
1950	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_SHORT,1,2,&m));
1951}
1952
1953static int
1954TIFFWriteDirectoryTagCheckedShortArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint16* value)
1955{
1956	assert(count<0x80000000);
1957	assert(sizeof(uint16)==2);
1958	if (tif->tif_flags&TIFF_SWAB)
1959		TIFFSwabArrayOfShort(value,count);
1960	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_SHORT,count,count*2,value));
1961}
1962
1963#ifdef notdef
1964static int
1965TIFFWriteDirectoryTagCheckedSshort(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int16 value)
1966{
1967	int16 m;
1968	assert(sizeof(int16)==2);
1969	m=value;
1970	if (tif->tif_flags&TIFF_SWAB)
1971		TIFFSwabShort((uint16*)(&m));
1972	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_SSHORT,1,2,&m));
1973}
1974#endif
1975
1976static int
1977TIFFWriteDirectoryTagCheckedSshortArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int16* value)
1978{
1979	assert(count<0x80000000);
1980	assert(sizeof(int16)==2);
1981	if (tif->tif_flags&TIFF_SWAB)
1982		TIFFSwabArrayOfShort((uint16*)value,count);
1983	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_SSHORT,count,count*2,value));
1984}
1985
1986static int
1987TIFFWriteDirectoryTagCheckedLong(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 value)
1988{
1989	uint32 m;
1990	assert(sizeof(uint32)==4);
1991	m=value;
1992	if (tif->tif_flags&TIFF_SWAB)
1993		TIFFSwabLong(&m);
1994	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_LONG,1,4,&m));
1995}
1996
1997static int
1998TIFFWriteDirectoryTagCheckedLongArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint32* value)
1999{
2000	assert(count<0x40000000);
2001	assert(sizeof(uint32)==4);
2002	if (tif->tif_flags&TIFF_SWAB)
2003		TIFFSwabArrayOfLong(value,count);
2004	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_LONG,count,count*4,value));
2005}
2006
2007#ifdef notdef
2008static int
2009TIFFWriteDirectoryTagCheckedSlong(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int32 value)
2010{
2011	int32 m;
2012	assert(sizeof(int32)==4);
2013	m=value;
2014	if (tif->tif_flags&TIFF_SWAB)
2015		TIFFSwabLong((uint32*)(&m));
2016	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_SLONG,1,4,&m));
2017}
2018#endif
2019
2020static int
2021TIFFWriteDirectoryTagCheckedSlongArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int32* value)
2022{
2023	assert(count<0x40000000);
2024	assert(sizeof(int32)==4);
2025	if (tif->tif_flags&TIFF_SWAB)
2026		TIFFSwabArrayOfLong((uint32*)value,count);
2027	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_SLONG,count,count*4,value));
2028}
2029
2030#ifdef notdef
2031static int
2032TIFFWriteDirectoryTagCheckedLong8(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint64 value)
2033{
2034	uint64 m;
2035	assert(sizeof(uint64)==8);
2036	assert(tif->tif_flags&TIFF_BIGTIFF);
2037	m=value;
2038	if (tif->tif_flags&TIFF_SWAB)
2039		TIFFSwabLong8(&m);
2040	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_LONG8,1,8,&m));
2041}
2042#endif
2043
2044static int
2045TIFFWriteDirectoryTagCheckedLong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value)
2046{
2047	assert(count<0x20000000);
2048	assert(sizeof(uint64)==8);
2049	assert(tif->tif_flags&TIFF_BIGTIFF);
2050	if (tif->tif_flags&TIFF_SWAB)
2051		TIFFSwabArrayOfLong8(value,count);
2052	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_LONG8,count,count*8,value));
2053}
2054
2055#ifdef notdef
2056static int
2057TIFFWriteDirectoryTagCheckedSlong8(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, int64 value)
2058{
2059	int64 m;
2060	assert(sizeof(int64)==8);
2061	assert(tif->tif_flags&TIFF_BIGTIFF);
2062	m=value;
2063	if (tif->tif_flags&TIFF_SWAB)
2064		TIFFSwabLong8((uint64*)(&m));
2065	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_SLONG8,1,8,&m));
2066}
2067#endif
2068
2069static int
2070TIFFWriteDirectoryTagCheckedSlong8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, int64* value)
2071{
2072	assert(count<0x20000000);
2073	assert(sizeof(int64)==8);
2074	assert(tif->tif_flags&TIFF_BIGTIFF);
2075	if (tif->tif_flags&TIFF_SWAB)
2076		TIFFSwabArrayOfLong8((uint64*)value,count);
2077	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_SLONG8,count,count*8,value));
2078}
2079
2080static int
2081TIFFWriteDirectoryTagCheckedRational(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value)
2082{
2083	uint32 m[2];
2084	assert(value>=0.0);
2085	assert(sizeof(uint32)==4);
2086	if (value<=0.0)
2087	{
2088		m[0]=0;
2089		m[1]=1;
2090	}
2091	else if (value==(double)(uint32)value)
2092	{
2093		m[0]=(uint32)value;
2094		m[1]=1;
2095	}
2096	else if (value<1.0)
2097	{
2098		m[0]=(uint32)(value*0xFFFFFFFF);
2099		m[1]=0xFFFFFFFF;
2100	}
2101	else
2102	{
2103		m[0]=0xFFFFFFFF;
2104		m[1]=(uint32)(0xFFFFFFFF/value);
2105	}
2106	if (tif->tif_flags&TIFF_SWAB)
2107	{
2108		TIFFSwabLong(&m[0]);
2109		TIFFSwabLong(&m[1]);
2110	}
2111	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_RATIONAL,1,8,&m[0]));
2112}
2113
2114static int
2115TIFFWriteDirectoryTagCheckedRationalArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value)
2116{
2117	static const char module[] = "TIFFWriteDirectoryTagCheckedRationalArray";
2118	uint32* m;
2119	float* na;
2120	uint32* nb;
2121	uint32 nc;
2122	int o;
2123	assert(sizeof(uint32)==4);
2124	m=_TIFFmalloc(count*2*sizeof(uint32));
2125	if (m==NULL)
2126	{
2127		TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
2128		return(0);
2129	}
2130	for (na=value, nb=m, nc=0; nc<count; na++, nb+=2, nc++)
2131	{
2132		if (*na<=0.0)
2133		{
2134			nb[0]=0;
2135			nb[1]=1;
2136		}
2137		else if (*na==(float)(uint32)(*na))
2138		{
2139			nb[0]=(uint32)(*na);
2140			nb[1]=1;
2141		}
2142		else if (*na<1.0)
2143		{
2144			nb[0]=(uint32)((*na)*0xFFFFFFFF);
2145			nb[1]=0xFFFFFFFF;
2146		}
2147		else
2148		{
2149			nb[0]=0xFFFFFFFF;
2150			nb[1]=(uint32)(0xFFFFFFFF/(*na));
2151		}
2152	}
2153	if (tif->tif_flags&TIFF_SWAB)
2154		TIFFSwabArrayOfLong(m,count*2);
2155	o=TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_RATIONAL,count,count*8,&m[0]);
2156	_TIFFfree(m);
2157	return(o);
2158}
2159
2160static int
2161TIFFWriteDirectoryTagCheckedSrationalArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value)
2162{
2163	static const char module[] = "TIFFWriteDirectoryTagCheckedSrationalArray";
2164	int32* m;
2165	float* na;
2166	int32* nb;
2167	uint32 nc;
2168	int o;
2169	assert(sizeof(int32)==4);
2170	m=_TIFFmalloc(count*2*sizeof(int32));
2171	if (m==NULL)
2172	{
2173		TIFFErrorExt(tif->tif_clientdata,module,"Out of memory");
2174		return(0);
2175	}
2176	for (na=value, nb=m, nc=0; nc<count; na++, nb+=2, nc++)
2177	{
2178		if (*na<0.0)
2179		{
2180			if (*na==(int32)(*na))
2181			{
2182				nb[0]=(int32)(*na);
2183				nb[1]=1;
2184			}
2185			else if (*na>-1.0)
2186			{
2187				nb[0]=-(int32)((-*na)*0x7FFFFFFF);
2188				nb[1]=0x7FFFFFFF;
2189			}
2190			else
2191			{
2192				nb[0]=-0x7FFFFFFF;
2193				nb[1]=(int32)(0x7FFFFFFF/(-*na));
2194			}
2195		}
2196		else
2197		{
2198			if (*na==(int32)(*na))
2199			{
2200				nb[0]=(int32)(*na);
2201				nb[1]=1;
2202			}
2203			else if (*na<1.0)
2204			{
2205				nb[0]=(int32)((*na)*0x7FFFFFFF);
2206				nb[1]=0x7FFFFFFF;
2207			}
2208			else
2209			{
2210				nb[0]=0x7FFFFFFF;
2211				nb[1]=(int32)(0x7FFFFFFF/(*na));
2212			}
2213		}
2214	}
2215	if (tif->tif_flags&TIFF_SWAB)
2216		TIFFSwabArrayOfLong((uint32*)m,count*2);
2217	o=TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_SRATIONAL,count,count*8,&m[0]);
2218	_TIFFfree(m);
2219	return(o);
2220}
2221
2222#ifdef notdef
2223static int
2224TIFFWriteDirectoryTagCheckedFloat(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, float value)
2225{
2226	float m;
2227	assert(sizeof(float)==4);
2228	m=value;
2229	TIFFCvtNativeToIEEEFloat(tif,1,&m);
2230	if (tif->tif_flags&TIFF_SWAB)
2231		TIFFSwabFloat(&m);
2232	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_FLOAT,1,4,&m));
2233}
2234#endif
2235
2236static int
2237TIFFWriteDirectoryTagCheckedFloatArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, float* value)
2238{
2239	assert(count<0x40000000);
2240	assert(sizeof(float)==4);
2241	TIFFCvtNativeToIEEEFloat(tif,count,&value);
2242	if (tif->tif_flags&TIFF_SWAB)
2243		TIFFSwabArrayOfFloat(value,count);
2244	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_FLOAT,count,count*4,value));
2245}
2246
2247#ifdef notdef
2248static int
2249TIFFWriteDirectoryTagCheckedDouble(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, double value)
2250{
2251	double m;
2252	assert(sizeof(double)==8);
2253	m=value;
2254	TIFFCvtNativeToIEEEDouble(tif,1,&m);
2255	if (tif->tif_flags&TIFF_SWAB)
2256		TIFFSwabDouble(&m);
2257	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_DOUBLE,1,8,&m));
2258}
2259#endif
2260
2261static int
2262TIFFWriteDirectoryTagCheckedDoubleArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, double* value)
2263{
2264	assert(count<0x20000000);
2265	assert(sizeof(double)==8);
2266	TIFFCvtNativeToIEEEDouble(tif,count,&value);
2267	if (tif->tif_flags&TIFF_SWAB)
2268		TIFFSwabArrayOfDouble(value,count);
2269	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_DOUBLE,count,count*8,value));
2270}
2271
2272static int
2273TIFFWriteDirectoryTagCheckedIfdArray(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint32* value)
2274{
2275	assert(count<0x40000000);
2276	assert(sizeof(uint32)==4);
2277	if (tif->tif_flags&TIFF_SWAB)
2278		TIFFSwabArrayOfLong(value,count);
2279	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_IFD,count,count*4,value));
2280}
2281
2282static int
2283TIFFWriteDirectoryTagCheckedIfd8Array(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint32 count, uint64* value)
2284{
2285	assert(count<0x20000000);
2286	assert(sizeof(uint64)==8);
2287	assert(tif->tif_flags&TIFF_BIGTIFF);
2288	if (tif->tif_flags&TIFF_SWAB)
2289		TIFFSwabArrayOfLong8(value,count);
2290	return(TIFFWriteDirectoryTagData(tif,ndir,dir,tag,TIFF_IFD8,count,count*8,value));
2291}
2292
2293static int
2294TIFFWriteDirectoryTagData(TIFF* tif, uint32* ndir, TIFFDirEntry* dir, uint16 tag, uint16 datatype, uint32 count, uint32 datalength, void* data)
2295{
2296	static const char module[] = "TIFFWriteDirectoryTagData";
2297	uint32 m;
2298	m=0;
2299	while (m<(*ndir))
2300	{
2301		assert(dir[m].tdir_tag!=tag);
2302		if (dir[m].tdir_tag>tag)
2303			break;
2304		m++;
2305	}
2306	if (m<(*ndir))
2307	{
2308		uint32 n;
2309		for (n=*ndir; n>m; n--)
2310			dir[n]=dir[n-1];
2311	}
2312	dir[m].tdir_tag=tag;
2313	dir[m].tdir_type=datatype;
2314	dir[m].tdir_count=count;
2315	dir[m].tdir_offset.toff_long8 = 0;
2316	if (datalength<=((tif->tif_flags&TIFF_BIGTIFF)?0x8U:0x4U))
2317		_TIFFmemcpy(&dir[m].tdir_offset,data,datalength);
2318	else
2319	{
2320		uint64 na,nb;
2321		na=tif->tif_dataoff;
2322		nb=na+datalength;
2323		if (!(tif->tif_flags&TIFF_BIGTIFF))
2324			nb=(uint32)nb;
2325		if ((nb<na)||(nb<datalength))
2326		{
2327			TIFFErrorExt(tif->tif_clientdata,module,"Maximum TIFF file size exceeded");
2328			return(0);
2329		}
2330		if (!SeekOK(tif,na))
2331		{
2332			TIFFErrorExt(tif->tif_clientdata,module,"IO error writing tag data");
2333			return(0);
2334		}
2335		assert(datalength<0x80000000UL);
2336		if (!WriteOK(tif,data,(tmsize_t)datalength))
2337		{
2338			TIFFErrorExt(tif->tif_clientdata,module,"IO error writing tag data");
2339			return(0);
2340		}
2341		tif->tif_dataoff=nb;
2342		if (tif->tif_dataoff&1)
2343			tif->tif_dataoff++;
2344		if (!(tif->tif_flags&TIFF_BIGTIFF))
2345		{
2346			uint32 o;
2347			o=(uint32)na;
2348			if (tif->tif_flags&TIFF_SWAB)
2349				TIFFSwabLong(&o);
2350			_TIFFmemcpy(&dir[m].tdir_offset,&o,4);
2351		}
2352		else
2353		{
2354			dir[m].tdir_offset.toff_long8 = na;
2355			if (tif->tif_flags&TIFF_SWAB)
2356				TIFFSwabLong8(&dir[m].tdir_offset.toff_long8);
2357		}
2358	}
2359	(*ndir)++;
2360	return(1);
2361}
2362
2363/*
2364 * Link the current directory into the directory chain for the file.
2365 */
2366static int
2367TIFFLinkDirectory(TIFF* tif)
2368{
2369	static const char module[] = "TIFFLinkDirectory";
2370
2371	tif->tif_diroff = (TIFFSeekFile(tif,0,SEEK_END)+1) &~ 1;
2372
2373	/*
2374	 * Handle SubIFDs
2375	 */
2376	if (tif->tif_flags & TIFF_INSUBIFD)
2377	{
2378		if (!(tif->tif_flags&TIFF_BIGTIFF))
2379		{
2380			uint32 m;
2381			m = (uint32)tif->tif_diroff;
2382			if (tif->tif_flags & TIFF_SWAB)
2383				TIFFSwabLong(&m);
2384			(void) TIFFSeekFile(tif, tif->tif_subifdoff, SEEK_SET);
2385			if (!WriteOK(tif, &m, 4)) {
2386				TIFFErrorExt(tif->tif_clientdata, module,
2387				     "Error writing SubIFD directory link");
2388				return (0);
2389			}
2390			/*
2391			 * Advance to the next SubIFD or, if this is
2392			 * the last one configured, revert back to the
2393			 * normal directory linkage.
2394			 */
2395			if (--tif->tif_nsubifd)
2396				tif->tif_subifdoff += 4;
2397			else
2398				tif->tif_flags &= ~TIFF_INSUBIFD;
2399			return (1);
2400		}
2401		else
2402		{
2403			uint64 m;
2404			m = tif->tif_diroff;
2405			if (tif->tif_flags & TIFF_SWAB)
2406				TIFFSwabLong8(&m);
2407			(void) TIFFSeekFile(tif, tif->tif_subifdoff, SEEK_SET);
2408			if (!WriteOK(tif, &m, 8)) {
2409				TIFFErrorExt(tif->tif_clientdata, module,
2410				     "Error writing SubIFD directory link");
2411				return (0);
2412			}
2413			/*
2414			 * Advance to the next SubIFD or, if this is
2415			 * the last one configured, revert back to the
2416			 * normal directory linkage.
2417			 */
2418			if (--tif->tif_nsubifd)
2419				tif->tif_subifdoff += 8;
2420			else
2421				tif->tif_flags &= ~TIFF_INSUBIFD;
2422			return (1);
2423		}
2424	}
2425
2426	if (!(tif->tif_flags&TIFF_BIGTIFF))
2427	{
2428		uint32 m;
2429		uint32 nextdir;
2430		m = (uint32)(tif->tif_diroff);
2431		if (tif->tif_flags & TIFF_SWAB)
2432			TIFFSwabLong(&m);
2433		if (tif->tif_header.classic.tiff_diroff == 0) {
2434			/*
2435			 * First directory, overwrite offset in header.
2436			 */
2437			tif->tif_header.classic.tiff_diroff = (uint32) tif->tif_diroff;
2438			(void) TIFFSeekFile(tif,4, SEEK_SET);
2439			if (!WriteOK(tif, &m, 4)) {
2440				TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
2441					     "Error writing TIFF header");
2442				return (0);
2443			}
2444			return (1);
2445		}
2446		/*
2447		 * Not the first directory, search to the last and append.
2448		 */
2449		nextdir = tif->tif_header.classic.tiff_diroff;
2450		while(1) {
2451			uint16 dircount;
2452			uint32 nextnextdir;
2453
2454			if (!SeekOK(tif, nextdir) ||
2455			    !ReadOK(tif, &dircount, 2)) {
2456				TIFFErrorExt(tif->tif_clientdata, module,
2457					     "Error fetching directory count");
2458				return (0);
2459			}
2460			if (tif->tif_flags & TIFF_SWAB)
2461				TIFFSwabShort(&dircount);
2462			(void) TIFFSeekFile(tif,
2463			    nextdir+2+dircount*12, SEEK_SET);
2464			if (!ReadOK(tif, &nextnextdir, 4)) {
2465				TIFFErrorExt(tif->tif_clientdata, module,
2466					     "Error fetching directory link");
2467				return (0);
2468			}
2469			if (tif->tif_flags & TIFF_SWAB)
2470				TIFFSwabLong(&nextnextdir);
2471			if (nextnextdir==0)
2472			{
2473				(void) TIFFSeekFile(tif,
2474				    nextdir+2+dircount*12, SEEK_SET);
2475				if (!WriteOK(tif, &m, 4)) {
2476					TIFFErrorExt(tif->tif_clientdata, module,
2477					     "Error writing directory link");
2478					return (0);
2479				}
2480				break;
2481			}
2482			nextdir=nextnextdir;
2483		}
2484	}
2485	else
2486	{
2487		uint64 m;
2488		uint64 nextdir;
2489		m = tif->tif_diroff;
2490		if (tif->tif_flags & TIFF_SWAB)
2491			TIFFSwabLong8(&m);
2492		if (tif->tif_header.big.tiff_diroff == 0) {
2493			/*
2494			 * First directory, overwrite offset in header.
2495			 */
2496			tif->tif_header.big.tiff_diroff = tif->tif_diroff;
2497			(void) TIFFSeekFile(tif,8, SEEK_SET);
2498			if (!WriteOK(tif, &m, 8)) {
2499				TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
2500					     "Error writing TIFF header");
2501				return (0);
2502			}
2503			return (1);
2504		}
2505		/*
2506		 * Not the first directory, search to the last and append.
2507		 */
2508		nextdir = tif->tif_header.big.tiff_diroff;
2509		while(1) {
2510			uint64 dircount64;
2511			uint16 dircount;
2512			uint64 nextnextdir;
2513
2514			if (!SeekOK(tif, nextdir) ||
2515			    !ReadOK(tif, &dircount64, 8)) {
2516				TIFFErrorExt(tif->tif_clientdata, module,
2517					     "Error fetching directory count");
2518				return (0);
2519			}
2520			if (tif->tif_flags & TIFF_SWAB)
2521				TIFFSwabLong8(&dircount64);
2522			if (dircount64>0xFFFF)
2523			{
2524				TIFFErrorExt(tif->tif_clientdata, module,
2525					     "Sanity check on tag count failed, likely corrupt TIFF");
2526				return (0);
2527			}
2528			dircount=(uint16)dircount64;
2529			(void) TIFFSeekFile(tif,
2530			    nextdir+8+dircount*20, SEEK_SET);
2531			if (!ReadOK(tif, &nextnextdir, 8)) {
2532				TIFFErrorExt(tif->tif_clientdata, module,
2533					     "Error fetching directory link");
2534				return (0);
2535			}
2536			if (tif->tif_flags & TIFF_SWAB)
2537				TIFFSwabLong8(&nextnextdir);
2538			if (nextnextdir==0)
2539			{
2540				(void) TIFFSeekFile(tif,
2541				    nextdir+8+dircount*20, SEEK_SET);
2542				if (!WriteOK(tif, &m, 8)) {
2543					TIFFErrorExt(tif->tif_clientdata, module,
2544					     "Error writing directory link");
2545					return (0);
2546				}
2547				break;
2548			}
2549			nextdir=nextnextdir;
2550		}
2551	}
2552	return (1);
2553}
2554
2555/************************************************************************/
2556/*                          TIFFRewriteField()                          */
2557/*                                                                      */
2558/*      Rewrite a field in the directory on disk without regard to      */
2559/*      updating the TIFF directory structure in memory.  Currently     */
2560/*      only supported for field that already exist in the on-disk      */
2561/*      directory.  Mainly used for updating stripoffset /              */
2562/*      stripbytecount values after the directory is already on         */
2563/*      disk.                                                           */
2564/*                                                                      */
2565/*      Returns zero on failure, and one on success.                    */
2566/************************************************************************/
2567
2568int
2569_TIFFRewriteField(TIFF* tif, uint16 tag, TIFFDataType in_datatype,
2570                  tmsize_t count, void* data)
2571{
2572    static const char module[] = "TIFFResetField";
2573    /* const TIFFField* fip = NULL; */
2574    uint16 dircount;
2575    tmsize_t dirsize;
2576    uint8 direntry_raw[20];
2577    uint16 entry_tag = 0;
2578    uint16 entry_type = 0;
2579    uint64 entry_count = 0;
2580    uint64 entry_offset = 0;
2581    int    value_in_entry = 0;
2582    uint64 read_offset;
2583    uint8 *buf_to_write = NULL;
2584    TIFFDataType datatype;
2585
2586/* -------------------------------------------------------------------- */
2587/*      Find field definition.                                          */
2588/* -------------------------------------------------------------------- */
2589    /*fip =*/ TIFFFindField(tif, tag, TIFF_ANY);
2590
2591/* -------------------------------------------------------------------- */
2592/*      Do some checking this is a straight forward case.               */
2593/* -------------------------------------------------------------------- */
2594    if( isMapped(tif) )
2595    {
2596        TIFFErrorExt( tif->tif_clientdata, module,
2597                      "Memory mapped files not currently supported for this operation." );
2598        return 0;
2599    }
2600
2601    if( tif->tif_diroff == 0 )
2602    {
2603        TIFFErrorExt( tif->tif_clientdata, module,
2604                      "Attempt to reset field on directory not already on disk." );
2605        return 0;
2606    }
2607
2608/* -------------------------------------------------------------------- */
2609/*      Read the directory entry count.                                 */
2610/* -------------------------------------------------------------------- */
2611    if (!SeekOK(tif, tif->tif_diroff)) {
2612        TIFFErrorExt(tif->tif_clientdata, module,
2613                     "%s: Seek error accessing TIFF directory",
2614                     tif->tif_name);
2615        return 0;
2616    }
2617
2618    read_offset = tif->tif_diroff;
2619
2620    if (!(tif->tif_flags&TIFF_BIGTIFF))
2621    {
2622        if (!ReadOK(tif, &dircount, sizeof (uint16))) {
2623            TIFFErrorExt(tif->tif_clientdata, module,
2624                         "%s: Can not read TIFF directory count",
2625                         tif->tif_name);
2626            return 0;
2627        }
2628        if (tif->tif_flags & TIFF_SWAB)
2629            TIFFSwabShort(&dircount);
2630        dirsize = 12;
2631        read_offset += 2;
2632    } else {
2633        uint64 dircount64;
2634        if (!ReadOK(tif, &dircount64, sizeof (uint64))) {
2635            TIFFErrorExt(tif->tif_clientdata, module,
2636                         "%s: Can not read TIFF directory count",
2637                         tif->tif_name);
2638            return 0;
2639        }
2640        if (tif->tif_flags & TIFF_SWAB)
2641            TIFFSwabLong8(&dircount64);
2642        dircount = (uint16)dircount64;
2643        dirsize = 20;
2644        read_offset += 8;
2645    }
2646
2647/* -------------------------------------------------------------------- */
2648/*      Read through directory to find target tag.                      */
2649/* -------------------------------------------------------------------- */
2650    while( dircount > 0 )
2651    {
2652        if (!ReadOK(tif, direntry_raw, dirsize)) {
2653            TIFFErrorExt(tif->tif_clientdata, module,
2654                         "%s: Can not read TIFF directory entry.",
2655                         tif->tif_name);
2656            return 0;
2657        }
2658
2659        memcpy( &entry_tag, direntry_raw + 0, sizeof(uint16) );
2660        if (tif->tif_flags&TIFF_SWAB)
2661            TIFFSwabShort( &entry_tag );
2662
2663        if( entry_tag == tag )
2664            break;
2665
2666        read_offset += dirsize;
2667    }
2668
2669    if( entry_tag != tag )
2670    {
2671        TIFFErrorExt(tif->tif_clientdata, module,
2672                     "%s: Could not find tag %d.",
2673                     tif->tif_name, tag );
2674        return 0;
2675    }
2676
2677/* -------------------------------------------------------------------- */
2678/*      Extract the type, count and offset for this entry.              */
2679/* -------------------------------------------------------------------- */
2680    memcpy( &entry_type, direntry_raw + 2, sizeof(uint16) );
2681    if (tif->tif_flags&TIFF_SWAB)
2682        TIFFSwabShort( &entry_type );
2683
2684    if (!(tif->tif_flags&TIFF_BIGTIFF))
2685    {
2686        uint32 value;
2687
2688        memcpy( &value, direntry_raw + 4, sizeof(uint32) );
2689        if (tif->tif_flags&TIFF_SWAB)
2690            TIFFSwabLong( &value );
2691        entry_count = value;
2692
2693        memcpy( &value, direntry_raw + 8, sizeof(uint32) );
2694        if (tif->tif_flags&TIFF_SWAB)
2695            TIFFSwabLong( &value );
2696        entry_offset = value;
2697    }
2698    else
2699    {
2700        memcpy( &entry_count, direntry_raw + 4, sizeof(uint64) );
2701        if (tif->tif_flags&TIFF_SWAB)
2702            TIFFSwabLong8( &entry_count );
2703
2704        memcpy( &entry_offset, direntry_raw + 12, sizeof(uint64) );
2705        if (tif->tif_flags&TIFF_SWAB)
2706            TIFFSwabLong8( &entry_offset );
2707    }
2708
2709/* -------------------------------------------------------------------- */
2710/*      What data type do we want to write this as?                     */
2711/* -------------------------------------------------------------------- */
2712    if( TIFFDataWidth(in_datatype) == 8 && !(tif->tif_flags&TIFF_BIGTIFF) )
2713    {
2714        if( in_datatype == TIFF_LONG8 )
2715            datatype = TIFF_LONG;
2716        else if( in_datatype == TIFF_SLONG8 )
2717            datatype = TIFF_SLONG;
2718        else if( in_datatype == TIFF_IFD8 )
2719            datatype = TIFF_IFD;
2720        else
2721            datatype = in_datatype;
2722    }
2723    else
2724        datatype = in_datatype;
2725
2726/* -------------------------------------------------------------------- */
2727/*      Prepare buffer of actual data to write.  This includes          */
2728/*      swabbing as needed.                                             */
2729/* -------------------------------------------------------------------- */
2730    buf_to_write =
2731	    (uint8 *)_TIFFCheckMalloc(tif, count, TIFFDataWidth(datatype),
2732				      "for field buffer.");
2733    if (!buf_to_write)
2734        return 0;
2735
2736    if( datatype == in_datatype )
2737        memcpy( buf_to_write, data, count * TIFFDataWidth(datatype) );
2738    else if( datatype == TIFF_SLONG && in_datatype == TIFF_SLONG8 )
2739    {
2740	tmsize_t i;
2741
2742        for( i = 0; i < count; i++ )
2743        {
2744            ((int32 *) buf_to_write)[i] =
2745                (int32) ((int64 *) data)[i];
2746            if( (int64) ((int32 *) buf_to_write)[i] != ((int64 *) data)[i] )
2747            {
2748                _TIFFfree( buf_to_write );
2749                TIFFErrorExt( tif->tif_clientdata, module,
2750                              "Value exceeds 32bit range of output type." );
2751                return 0;
2752            }
2753        }
2754    }
2755    else if( (datatype == TIFF_LONG && in_datatype == TIFF_LONG8)
2756             || (datatype == TIFF_IFD && in_datatype == TIFF_IFD8) )
2757    {
2758	tmsize_t i;
2759
2760        for( i = 0; i < count; i++ )
2761        {
2762            ((uint32 *) buf_to_write)[i] =
2763                (uint32) ((uint64 *) data)[i];
2764            if( (uint64) ((uint32 *) buf_to_write)[i] != ((uint64 *) data)[i] )
2765            {
2766                _TIFFfree( buf_to_write );
2767                TIFFErrorExt( tif->tif_clientdata, module,
2768                              "Value exceeds 32bit range of output type." );
2769                return 0;
2770            }
2771        }
2772    }
2773
2774    if( TIFFDataWidth(datatype) > 1 && (tif->tif_flags&TIFF_SWAB) )
2775    {
2776        if( TIFFDataWidth(datatype) == 2 )
2777            TIFFSwabArrayOfShort( (uint16 *) buf_to_write, count );
2778        else if( TIFFDataWidth(datatype) == 4 )
2779            TIFFSwabArrayOfLong( (uint32 *) buf_to_write, count );
2780        else if( TIFFDataWidth(datatype) == 8 )
2781            TIFFSwabArrayOfLong8( (uint64 *) buf_to_write, count );
2782    }
2783
2784/* -------------------------------------------------------------------- */
2785/*      Is this a value that fits into the directory entry?             */
2786/* -------------------------------------------------------------------- */
2787    if (!(tif->tif_flags&TIFF_BIGTIFF))
2788    {
2789        if( TIFFDataWidth(datatype) * count <= 4 )
2790        {
2791            entry_offset = read_offset + 8;
2792            value_in_entry = 1;
2793        }
2794    }
2795    else
2796    {
2797        if( TIFFDataWidth(datatype) * count <= 8 )
2798        {
2799            entry_offset = read_offset + 12;
2800            value_in_entry = 1;
2801        }
2802    }
2803
2804/* -------------------------------------------------------------------- */
2805/*      If the tag type, and count match, then we just write it out     */
2806/*      over the old values without altering the directory entry at     */
2807/*      all.                                                            */
2808/* -------------------------------------------------------------------- */
2809    if( entry_count == (uint64)count && entry_type == (uint16) datatype )
2810    {
2811        if (!SeekOK(tif, entry_offset)) {
2812            _TIFFfree( buf_to_write );
2813            TIFFErrorExt(tif->tif_clientdata, module,
2814                         "%s: Seek error accessing TIFF directory",
2815                         tif->tif_name);
2816            return 0;
2817        }
2818        if (!WriteOK(tif, buf_to_write, count*TIFFDataWidth(datatype))) {
2819            _TIFFfree( buf_to_write );
2820            TIFFErrorExt(tif->tif_clientdata, module,
2821                         "Error writing directory link");
2822            return (0);
2823        }
2824
2825        _TIFFfree( buf_to_write );
2826        return 1;
2827    }
2828
2829/* -------------------------------------------------------------------- */
2830/*      Otherwise, we write the new tag data at the end of the file.    */
2831/* -------------------------------------------------------------------- */
2832    if( !value_in_entry )
2833    {
2834        entry_offset = TIFFSeekFile(tif,0,SEEK_END);
2835
2836        if (!WriteOK(tif, buf_to_write, count*TIFFDataWidth(datatype))) {
2837            _TIFFfree( buf_to_write );
2838            TIFFErrorExt(tif->tif_clientdata, module,
2839                         "Error writing directory link");
2840            return (0);
2841        }
2842    }
2843    else
2844    {
2845        memcpy( &entry_offset, buf_to_write, count*TIFFDataWidth(datatype));
2846    }
2847
2848    _TIFFfree( buf_to_write );
2849    buf_to_write = 0;
2850
2851/* -------------------------------------------------------------------- */
2852/*      Adjust the directory entry.                                     */
2853/* -------------------------------------------------------------------- */
2854    entry_type = datatype;
2855    memcpy( direntry_raw + 2, &entry_type, sizeof(uint16) );
2856    if (tif->tif_flags&TIFF_SWAB)
2857        TIFFSwabShort( (uint16 *) (direntry_raw + 2) );
2858
2859    if (!(tif->tif_flags&TIFF_BIGTIFF))
2860    {
2861        uint32 value;
2862
2863        value = (uint32) entry_count;
2864        memcpy( direntry_raw + 4, &value, sizeof(uint32) );
2865        if (tif->tif_flags&TIFF_SWAB)
2866            TIFFSwabLong( (uint32 *) (direntry_raw + 4) );
2867
2868        value = (uint32) entry_offset;
2869        memcpy( direntry_raw + 8, &value, sizeof(uint32) );
2870        if (tif->tif_flags&TIFF_SWAB)
2871            TIFFSwabLong( (uint32 *) (direntry_raw + 8) );
2872    }
2873    else
2874    {
2875        memcpy( direntry_raw + 4, &entry_count, sizeof(uint64) );
2876        if (tif->tif_flags&TIFF_SWAB)
2877            TIFFSwabLong8( (uint64 *) (direntry_raw + 4) );
2878
2879        memcpy( direntry_raw + 12, &entry_offset, sizeof(uint64) );
2880        if (tif->tif_flags&TIFF_SWAB)
2881            TIFFSwabLong8( (uint64 *) (direntry_raw + 12) );
2882    }
2883
2884/* -------------------------------------------------------------------- */
2885/*      Write the directory entry out to disk.                          */
2886/* -------------------------------------------------------------------- */
2887    if (!SeekOK(tif, read_offset )) {
2888        TIFFErrorExt(tif->tif_clientdata, module,
2889                     "%s: Seek error accessing TIFF directory",
2890                     tif->tif_name);
2891        return 0;
2892    }
2893
2894    if (!WriteOK(tif, direntry_raw,dirsize))
2895    {
2896        TIFFErrorExt(tif->tif_clientdata, module,
2897                     "%s: Can not write TIFF directory entry.",
2898                     tif->tif_name);
2899        return 0;
2900    }
2901
2902    return 1;
2903}
2904/* vim: set ts=8 sts=8 sw=8 noet: */
2905/*
2906 * Local Variables:
2907 * mode: c
2908 * c-basic-offset: 8
2909 * fill-column: 78
2910 * End:
2911 */
2912