Blame tools/tiffdump.c

Packit Service 2594b8
/* $Id: tiffdump.c,v 1.35 2016-11-19 15:42:46 bfriesen Exp $ */
Packit Service 2594b8
Packit Service 2594b8
/*
Packit Service 2594b8
 * Copyright (c) 1988-1997 Sam Leffler
Packit Service 2594b8
 * Copyright (c) 1991-1997 Silicon Graphics, Inc.
Packit Service 2594b8
 *
Packit Service 2594b8
 * Permission to use, copy, modify, distribute, and sell this software and 
Packit Service 2594b8
 * its documentation for any purpose is hereby granted without fee, provided
Packit Service 2594b8
 * that (i) the above copyright notices and this permission notice appear in
Packit Service 2594b8
 * all copies of the software and related documentation, and (ii) the names of
Packit Service 2594b8
 * Sam Leffler and Silicon Graphics may not be used in any advertising or
Packit Service 2594b8
 * publicity relating to the software without the specific, prior written
Packit Service 2594b8
 * permission of Sam Leffler and Silicon Graphics.
Packit Service 2594b8
 * 
Packit Service 2594b8
 * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
Packit Service 2594b8
 * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
Packit Service 2594b8
 * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
Packit Service 2594b8
 * 
Packit Service 2594b8
 * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
Packit Service 2594b8
 * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
Packit Service 2594b8
 * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
Packit Service 2594b8
 * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
Packit Service 2594b8
 * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
Packit Service 2594b8
 * OF THIS SOFTWARE.
Packit Service 2594b8
 */
Packit Service 2594b8
Packit Service 2594b8
#include "tif_config.h"
Packit Service 2594b8
Packit Service 2594b8
#include <stdio.h>
Packit Service 2594b8
#include <stdlib.h>
Packit Service 2594b8
#include <string.h>
Packit Service 2594b8
Packit Service 2594b8
#ifdef HAVE_UNISTD_H
Packit Service 2594b8
# include <unistd.h>
Packit Service 2594b8
#endif
Packit Service 2594b8
Packit Service 2594b8
#include "tiffiop.h"
Packit Service 2594b8
Packit Service 2594b8
#ifdef HAVE_FCNTL_H
Packit Service 2594b8
# include <fcntl.h>
Packit Service 2594b8
#endif
Packit Service 2594b8
Packit Service 2594b8
#ifdef HAVE_SYS_TYPES_H
Packit Service 2594b8
# include <sys/types.h>
Packit Service 2594b8
#endif
Packit Service 2594b8
Packit Service 2594b8
#ifdef HAVE_IO_H
Packit Service 2594b8
# include <io.h>
Packit Service 2594b8
#endif
Packit Service 2594b8
Packit Service 2594b8
#ifdef NEED_LIBPORT
Packit Service 2594b8
# include "libport.h"
Packit Service 2594b8
#endif
Packit Service 2594b8
Packit Service 2594b8
#ifndef HAVE_GETOPT
Packit Service 2594b8
extern int getopt(int, char**, char*);
Packit Service 2594b8
#endif
Packit Service 2594b8
Packit Service 2594b8
#include "tiffio.h"
Packit Service 2594b8
Packit Service 2594b8
#ifndef O_BINARY
Packit Service 2594b8
# define O_BINARY	0
Packit Service 2594b8
#endif
Packit Service 2594b8
Packit Service 2594b8
static union
Packit Service 2594b8
{
Packit Service 2594b8
	TIFFHeaderClassic classic;
Packit Service 2594b8
	TIFFHeaderBig big;
Packit Service 2594b8
	TIFFHeaderCommon common;
Packit Service 2594b8
} hdr;
Packit Service 2594b8
char* appname;
Packit Service 2594b8
char* curfile;
Packit Service 2594b8
int swabflag;
Packit Service 2594b8
int bigendian;
Packit Service 2594b8
int bigtiff;
Packit Service 2594b8
uint32 maxitems = 24;   /* maximum indirect data items to print */
Packit Service 2594b8
Packit Service 2594b8
const char* bytefmt = "%s%#02x";	/* BYTE */
Packit Service 2594b8
const char* sbytefmt = "%s%d";		/* SBYTE */
Packit Service 2594b8
const char* shortfmt = "%s%u";		/* SHORT */
Packit Service 2594b8
const char* sshortfmt = "%s%d";		/* SSHORT */
Packit Service 2594b8
const char* longfmt = "%s%lu";		/* LONG */
Packit Service 2594b8
const char* slongfmt = "%s%ld";		/* SLONG */
Packit Service 2594b8
const char* ifdfmt = "%s%#04lx";	/* IFD offset */
Packit Service 2594b8
#if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__))
Packit Service 2594b8
const char* long8fmt = "%s%I64u";	/* LONG8 */
Packit Service 2594b8
const char* slong8fmt = "%s%I64d";	/* SLONG8 */
Packit Service 2594b8
const char* ifd8fmt = "%s%#08I64x";	/* IFD offset8*/
Packit Service 2594b8
#else
Packit Service 2594b8
const char* long8fmt = "%s%llu";	/* LONG8 */
Packit Service 2594b8
const char* slong8fmt = "%s%lld";	/* SLONG8 */
Packit Service 2594b8
const char* ifd8fmt = "%s%#08llx";	/* IFD offset8*/
Packit Service 2594b8
#endif
Packit Service 2594b8
const char* rationalfmt = "%s%g";	/* RATIONAL */
Packit Service 2594b8
const char* srationalfmt = "%s%g";	/* SRATIONAL */
Packit Service 2594b8
const char* floatfmt = "%s%g";		/* FLOAT */
Packit Service 2594b8
const char* doublefmt = "%s%g";		/* DOUBLE */
Packit Service 2594b8
Packit Service 2594b8
static void dump(int, uint64);
Packit Service 2594b8
Packit Service 2594b8
#if !HAVE_DECL_OPTARG
Packit Service 2594b8
extern int optind;
Packit Service 2594b8
extern char* optarg;
Packit Service 2594b8
#endif
Packit Service 2594b8
Packit Service 2594b8
void
Packit Service 2594b8
usage()
Packit Service 2594b8
{
Packit Service 2594b8
	fprintf(stderr, "usage: %s [-h] [-o offset] [-m maxitems] file.tif ...\n", appname);
Packit Service 2594b8
	exit(-1);
Packit Service 2594b8
}
Packit Service 2594b8
Packit Service 2594b8
int
Packit Service 2594b8
main(int argc, char* argv[])
Packit Service 2594b8
{
Packit Service 2594b8
	int one = 1, fd;
Packit Service 2594b8
	int multiplefiles = (argc > 1);
Packit Service 2594b8
	int c;
Packit Service 2594b8
	uint64 diroff = 0;
Packit Service 2594b8
	bigendian = (*(char *)&one == 0);
Packit Service 2594b8
Packit Service 2594b8
	appname = argv[0];
Packit Service 2594b8
	while ((c = getopt(argc, argv, "m:o:h")) != -1) {
Packit Service 2594b8
		switch (c) {
Packit Service 2594b8
		case 'h':			/* print values in hex */
Packit Service 2594b8
			shortfmt = "%s%#x";
Packit Service 2594b8
			sshortfmt = "%s%#x";
Packit Service 2594b8
			longfmt = "%s%#lx";
Packit Service 2594b8
			slongfmt = "%s%#lx";
Packit Service 2594b8
			break;
Packit Service 2594b8
		case 'o':
Packit Service 2594b8
			diroff = (uint64) strtoul(optarg, NULL, 0);
Packit Service 2594b8
			break;
Packit Service 2594b8
		case 'm':
Packit Service 2594b8
			maxitems = strtoul(optarg, NULL, 0);
Packit Service 2594b8
			break;
Packit Service 2594b8
		default:
Packit Service 2594b8
			usage();
Packit Service 2594b8
		}
Packit Service 2594b8
	}
Packit Service 2594b8
	if (optind >= argc)
Packit Service 2594b8
		usage();
Packit Service 2594b8
	for (; optind < argc; optind++) {
Packit Service 2594b8
		fd = open(argv[optind], O_RDONLY|O_BINARY, 0);
Packit Service 2594b8
		if (fd < 0) {
Packit Service 2594b8
			perror(argv[0]);
Packit Service 2594b8
			return (-1);
Packit Service 2594b8
		}
Packit Service 2594b8
		if (multiplefiles)
Packit Service 2594b8
			printf("%s:\n", argv[optind]);
Packit Service 2594b8
		curfile = argv[optind];
Packit Service 2594b8
		swabflag = 0;
Packit Service 2594b8
		bigtiff = 0;
Packit Service 2594b8
		dump(fd, diroff);
Packit Service 2594b8
		close(fd);
Packit Service 2594b8
	}
Packit Service 2594b8
	return (0);
Packit Service 2594b8
}
Packit Service 2594b8
Packit Service 2594b8
#define ord(e) ((int)e)
Packit Service 2594b8
Packit Service 2594b8
static uint64 ReadDirectory(int, unsigned, uint64);
Packit Service 2594b8
static void ReadError(char*);
Packit Service 2594b8
static void Error(const char*, ...);
Packit Service 2594b8
static void Fatal(const char*, ...);
Packit Service 2594b8
Packit Service 2594b8
static void
Packit Service 2594b8
dump(int fd, uint64 diroff)
Packit Service 2594b8
{
Packit Service 2594b8
	unsigned i, j;
Packit Service 2594b8
	uint64* visited_diroff = NULL;
Packit Service 2594b8
	unsigned int count_visited_dir = 0;
Packit Service 2594b8
Packit Service 2594b8
	_TIFF_lseek_f(fd, (_TIFF_off_t) 0, 0);
Packit Service 2594b8
	if (read(fd, (char*) &hdr, sizeof (TIFFHeaderCommon)) != sizeof (TIFFHeaderCommon))
Packit Service 2594b8
		ReadError("TIFF header");
Packit Service 2594b8
	if (hdr.common.tiff_magic != TIFF_BIGENDIAN
Packit Service 2594b8
	    && hdr.common.tiff_magic != TIFF_LITTLEENDIAN &&
Packit Service 2594b8
#if HOST_BIGENDIAN
Packit Service 2594b8
	    /* MDI is sensitive to the host byte order, unlike TIFF */
Packit Service 2594b8
	    MDI_BIGENDIAN != hdr.common.tiff_magic
Packit Service 2594b8
#else
Packit Service 2594b8
	    MDI_LITTLEENDIAN != hdr.common.tiff_magic
Packit Service 2594b8
#endif
Packit Service 2594b8
	   ) {
Packit Service 2594b8
		Fatal("Not a TIFF or MDI file, bad magic number %u (%#x)",
Packit Service 2594b8
		    hdr.common.tiff_magic, hdr.common.tiff_magic);
Packit Service 2594b8
	}
Packit Service 2594b8
	if (hdr.common.tiff_magic == TIFF_BIGENDIAN
Packit Service 2594b8
	    || hdr.common.tiff_magic == MDI_BIGENDIAN)
Packit Service 2594b8
		swabflag = !bigendian;
Packit Service 2594b8
	else
Packit Service 2594b8
		swabflag = bigendian;
Packit Service 2594b8
	if (swabflag)
Packit Service 2594b8
		TIFFSwabShort(&hdr.common.tiff_version);
Packit Service 2594b8
	if (hdr.common.tiff_version==42)
Packit Service 2594b8
	{
Packit Service 2594b8
		if (read(fd, (char*) &hdr.classic.tiff_diroff, 4) != 4)
Packit Service 2594b8
			ReadError("TIFF header");
Packit Service 2594b8
		if (swabflag)
Packit Service 2594b8
			TIFFSwabLong(&hdr.classic.tiff_diroff);
Packit Service 2594b8
		printf("Magic: %#x <%s-endian> Version: %#x <%s>\n",
Packit Service 2594b8
		    hdr.classic.tiff_magic,
Packit Service 2594b8
		    hdr.classic.tiff_magic == TIFF_BIGENDIAN ? "big" : "little",
Packit Service 2594b8
		    42,"ClassicTIFF");
Packit Service 2594b8
		if (diroff == 0)
Packit Service 2594b8
			diroff = hdr.classic.tiff_diroff;
Packit Service 2594b8
	}
Packit Service 2594b8
	else if (hdr.common.tiff_version==43)
Packit Service 2594b8
	{
Packit Service 2594b8
		if (read(fd, (char*) &hdr.big.tiff_offsetsize, 12) != 12)
Packit Service 2594b8
			ReadError("TIFF header");
Packit Service 2594b8
		if (swabflag)
Packit Service 2594b8
		{
Packit Service 2594b8
			TIFFSwabShort(&hdr.big.tiff_offsetsize);
Packit Service 2594b8
			TIFFSwabShort(&hdr.big.tiff_unused);
Packit Service 2594b8
			TIFFSwabLong8(&hdr.big.tiff_diroff);
Packit Service 2594b8
		}
Packit Service 2594b8
		printf("Magic: %#x <%s-endian> Version: %#x <%s>\n",
Packit Service 2594b8
		    hdr.big.tiff_magic,
Packit Service 2594b8
		    hdr.big.tiff_magic == TIFF_BIGENDIAN ? "big" : "little",
Packit Service 2594b8
		    43,"BigTIFF");
Packit Service 2594b8
		printf("OffsetSize: %#x Unused: %#x\n",
Packit Service 2594b8
		    hdr.big.tiff_offsetsize,hdr.big.tiff_unused);
Packit Service 2594b8
		if (diroff == 0)
Packit Service 2594b8
			diroff = hdr.big.tiff_diroff;
Packit Service 2594b8
		bigtiff = 1;
Packit Service 2594b8
	}
Packit Service 2594b8
	else
Packit Service 2594b8
		Fatal("Not a TIFF file, bad version number %u (%#x)",
Packit Service 2594b8
		    hdr.common.tiff_version, hdr.common.tiff_version);
Packit Service 2594b8
	for (i = 0; diroff != 0; i++) {
Packit Service 2594b8
		for(j=0; j
Packit Service 2594b8
		{
Packit Service 2594b8
		    if( visited_diroff[j] == diroff )
Packit Service 2594b8
		    {
Packit Service 2594b8
			free(visited_diroff);
Packit Service 2594b8
			Fatal("Cycle detected in chaining of TIFF directories!");
Packit Service 2594b8
		    }
Packit Service 2594b8
		}
Packit Service 2594b8
                {
Packit Service 2594b8
                    size_t alloc_size;
Packit Service 2594b8
                    alloc_size=TIFFSafeMultiply(tmsize_t,(count_visited_dir + 1),
Packit Service 2594b8
                                                sizeof(uint64));
Packit Service 2594b8
                    if (alloc_size == 0)
Packit Service 2594b8
                    {
Packit Service 2594b8
                        if (visited_diroff)
Packit Service 2594b8
                            free(visited_diroff);
Packit Service 2594b8
                        visited_diroff = 0;
Packit Service 2594b8
                    }
Packit Service 2594b8
                    else
Packit Service 2594b8
                    {
Packit Service 2594b8
                        visited_diroff = (uint64*) realloc(visited_diroff,alloc_size);
Packit Service 2594b8
                    }
Packit Service 2594b8
                }
Packit Service 2594b8
		if( !visited_diroff )
Packit Service 2594b8
		    Fatal("Out of memory");
Packit Service 2594b8
		visited_diroff[count_visited_dir] = diroff;
Packit Service 2594b8
		count_visited_dir ++;
Packit Service 2594b8
Packit Service 2594b8
		if (i > 0)
Packit Service 2594b8
			putchar('\n');
Packit Service 2594b8
		diroff = ReadDirectory(fd, i, diroff);
Packit Service 2594b8
	}
Packit Service 2594b8
	if( visited_diroff )
Packit Service 2594b8
	    free(visited_diroff);
Packit Service 2594b8
}
Packit Service 2594b8
Packit Service 2594b8
static const int datawidth[] = {
Packit Service 2594b8
	0, /* 00 = undefined */
Packit Service 2594b8
	1, /* 01 = TIFF_BYTE */
Packit Service 2594b8
	1, /* 02 = TIFF_ASCII */
Packit Service 2594b8
	2, /* 03 = TIFF_SHORT */
Packit Service 2594b8
	4, /* 04 = TIFF_LONG */
Packit Service 2594b8
	8, /* 05 = TIFF_RATIONAL */
Packit Service 2594b8
	1, /* 06 = TIFF_SBYTE */
Packit Service 2594b8
	1, /* 07 = TIFF_UNDEFINED */
Packit Service 2594b8
	2, /* 08 = TIFF_SSHORT */
Packit Service 2594b8
	4, /* 09 = TIFF_SLONG */
Packit Service 2594b8
	8, /* 10 = TIFF_SRATIONAL */
Packit Service 2594b8
	4, /* 11 = TIFF_FLOAT */
Packit Service 2594b8
	8, /* 12 = TIFF_DOUBLE */
Packit Service 2594b8
	4, /* 13 = TIFF_IFD */
Packit Service 2594b8
	0, /* 14 = undefined */
Packit Service 2594b8
	0, /* 15 = undefined */
Packit Service 2594b8
	8, /* 16 = TIFF_LONG8 */
Packit Service 2594b8
	8, /* 17 = TIFF_SLONG8 */
Packit Service 2594b8
	8, /* 18 = TIFF_IFD8 */
Packit Service 2594b8
};
Packit Service 2594b8
#define NWIDTHS (sizeof (datawidth) / sizeof (datawidth[0]))
Packit Service 2594b8
static void PrintTag(FILE*, uint16);
Packit Service 2594b8
static void PrintType(FILE*, uint16);
Packit Service 2594b8
static void PrintData(FILE*, uint16, uint32, unsigned char*);
Packit Service 2594b8
Packit Service 2594b8
/*
Packit Service 2594b8
 * Read the next TIFF directory from a file
Packit Service 2594b8
 * and convert it to the internal format.
Packit Service 2594b8
 * We read directories sequentially.
Packit Service 2594b8
 */
Packit Service 2594b8
static uint64
Packit Service 2594b8
ReadDirectory(int fd, unsigned int ix, uint64 off)
Packit Service 2594b8
{
Packit Service 2594b8
	uint16 dircount;
Packit Service 2594b8
	uint32 direntrysize;
Packit Service 2594b8
	void* dirmem = NULL;
Packit Service 2594b8
	uint64 nextdiroff = 0;
Packit Service 2594b8
	uint32 n;
Packit Service 2594b8
	uint8* dp;
Packit Service 2594b8
Packit Service 2594b8
	if (off == 0)			/* no more directories */
Packit Service 2594b8
		goto done;
Packit Service 2594b8
	if (_TIFF_lseek_f(fd, (_TIFF_off_t)off, SEEK_SET) != (_TIFF_off_t)off) {
Packit Service 2594b8
		Fatal("Seek error accessing TIFF directory");
Packit Service 2594b8
		goto done;
Packit Service 2594b8
	}
Packit Service 2594b8
	if (!bigtiff) {
Packit Service 2594b8
		if (read(fd, (char*) &dircount, sizeof (uint16)) != sizeof (uint16)) {
Packit Service 2594b8
			ReadError("directory count");
Packit Service 2594b8
			goto done;
Packit Service 2594b8
		}
Packit Service 2594b8
		if (swabflag)
Packit Service 2594b8
			TIFFSwabShort(&dircount);
Packit Service 2594b8
		direntrysize = 12;
Packit Service 2594b8
	} else {
Packit Service 2594b8
		uint64 dircount64 = 0;
Packit Service 2594b8
		if (read(fd, (char*) &dircount64, sizeof (uint64)) != sizeof (uint64)) {
Packit Service 2594b8
			ReadError("directory count");
Packit Service 2594b8
			goto done;
Packit Service 2594b8
		}
Packit Service 2594b8
		if (swabflag)
Packit Service 2594b8
			TIFFSwabLong8(&dircount64);
Packit Service 2594b8
		if (dircount64>0xFFFF) {
Packit Service 2594b8
			Error("Sanity check on directory count failed");
Packit Service 2594b8
			goto done;
Packit Service 2594b8
		}
Packit Service 2594b8
		dircount = (uint16)dircount64;
Packit Service 2594b8
		direntrysize = 20;
Packit Service 2594b8
	}
Packit Service 2594b8
	dirmem = _TIFFmalloc(TIFFSafeMultiply(tmsize_t,dircount,direntrysize));
Packit Service 2594b8
	if (dirmem == NULL) {
Packit Service 2594b8
		Fatal("No space for TIFF directory");
Packit Service 2594b8
		goto done;
Packit Service 2594b8
	}
Packit Service 2594b8
	n = read(fd, (char*) dirmem, dircount*direntrysize);
Packit Service 2594b8
	if (n != dircount*direntrysize) {
Packit Service 2594b8
		n /= direntrysize;
Packit Service 2594b8
		Error(
Packit Service 2594b8
#if defined(__WIN32__) && defined(_MSC_VER)
Packit Service 2594b8
	    "Could only read %lu of %u entries in directory at offset %#I64x",
Packit Service 2594b8
		      (unsigned long)n, dircount, (unsigned __int64) off);
Packit Service 2594b8
#else
Packit Service 2594b8
	    "Could only read %lu of %u entries in directory at offset %#llx",
Packit Service 2594b8
		      (unsigned long)n, dircount, (unsigned long long) off);
Packit Service 2594b8
#endif
Packit Service 2594b8
		dircount = n;
Packit Service 2594b8
		nextdiroff = 0;
Packit Service 2594b8
	} else {
Packit Service 2594b8
		if (!bigtiff) {
Packit Service 2594b8
			uint32 nextdiroff32;
Packit Service 2594b8
			if (read(fd, (char*) &nextdiroff32, sizeof (uint32)) != sizeof (uint32))
Packit Service 2594b8
				nextdiroff32 = 0;
Packit Service 2594b8
			if (swabflag)
Packit Service 2594b8
				TIFFSwabLong(&nextdiroff32);
Packit Service 2594b8
			nextdiroff = nextdiroff32;
Packit Service 2594b8
		} else {
Packit Service 2594b8
			if (read(fd, (char*) &nextdiroff, sizeof (uint64)) != sizeof (uint64))
Packit Service 2594b8
				nextdiroff = 0;
Packit Service 2594b8
			if (swabflag)
Packit Service 2594b8
				TIFFSwabLong8(&nextdiroff);
Packit Service 2594b8
		}
Packit Service 2594b8
	}
Packit Service 2594b8
#if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__))
Packit Service 2594b8
	printf("Directory %u: offset %I64u (%#I64x) next %I64u (%#I64x)\n", ix,
Packit Service 2594b8
	    (unsigned __int64)off, (unsigned __int64)off,
Packit Service 2594b8
	    (unsigned __int64)nextdiroff, (unsigned __int64)nextdiroff);
Packit Service 2594b8
#else
Packit Service 2594b8
	printf("Directory %u: offset %llu (%#llx) next %llu (%#llx)\n", ix,
Packit Service 2594b8
	    (unsigned long long)off, (unsigned long long)off,
Packit Service 2594b8
	    (unsigned long long)nextdiroff, (unsigned long long)nextdiroff);
Packit Service 2594b8
#endif
Packit Service 2594b8
	for (dp = (uint8*)dirmem, n = dircount; n > 0; n--) {
Packit Service 2594b8
		uint16 tag;
Packit Service 2594b8
		uint16 type;
Packit Service 2594b8
		uint16 typewidth;
Packit Service 2594b8
		uint64 count;
Packit Service 2594b8
		uint64 datasize;
Packit Service 2594b8
		int datafits;
Packit Service 2594b8
		void* datamem;
Packit Service 2594b8
		uint64 dataoffset;
Packit Service 2594b8
		int datatruncated;
Packit Service 2594b8
                int datasizeoverflow;
Packit Service 2594b8
Packit Service 2594b8
		tag = *(uint16*)dp;
Packit Service 2594b8
		if (swabflag)
Packit Service 2594b8
			TIFFSwabShort(&tag;;
Packit Service 2594b8
		dp += sizeof(uint16);
Packit Service 2594b8
		type = *(uint16*)dp;
Packit Service 2594b8
		dp += sizeof(uint16);
Packit Service 2594b8
		if (swabflag)
Packit Service 2594b8
			TIFFSwabShort(&type);
Packit Service 2594b8
		PrintTag(stdout, tag);
Packit Service 2594b8
		putchar(' ');
Packit Service 2594b8
		PrintType(stdout, type);
Packit Service 2594b8
		putchar(' ');
Packit Service 2594b8
		if (!bigtiff)
Packit Service 2594b8
		{
Packit Service 2594b8
			uint32 count32;
Packit Service 2594b8
			count32 = *(uint32*)dp;
Packit Service 2594b8
			if (swabflag)
Packit Service 2594b8
				TIFFSwabLong(&count32);
Packit Service 2594b8
			dp += sizeof(uint32);
Packit Service 2594b8
			count = count32;
Packit Service 2594b8
		}
Packit Service 2594b8
		else
Packit Service 2594b8
		{
Packit Service 2594b8
			memcpy(&count, dp, sizeof(uint64));
Packit Service 2594b8
			if (swabflag)
Packit Service 2594b8
				TIFFSwabLong8(&count);
Packit Service 2594b8
			dp += sizeof(uint64);
Packit Service 2594b8
		}
Packit Service 2594b8
#if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__))
Packit Service 2594b8
		printf("%I64u<", (unsigned __int64)count);
Packit Service 2594b8
#else
Packit Service 2594b8
		printf("%llu<", (unsigned long long)count);
Packit Service 2594b8
#endif
Packit Service 2594b8
		if (type >= NWIDTHS)
Packit Service 2594b8
			typewidth = 0;
Packit Service 2594b8
		else
Packit Service 2594b8
			typewidth = datawidth[type];
Packit Service 2594b8
		datasize = TIFFSafeMultiply(tmsize_t,count,typewidth);
Packit Service 2594b8
                datasizeoverflow = (typewidth > 0 && datasize / typewidth != count);
Packit Service 2594b8
		datafits = 1;
Packit Service 2594b8
		datamem = dp;
Packit Service 2594b8
		dataoffset = 0;
Packit Service 2594b8
		datatruncated = 0;
Packit Service 2594b8
		if (!bigtiff)
Packit Service 2594b8
		{
Packit Service 2594b8
			if (datasizeoverflow || datasize>4)
Packit Service 2594b8
			{
Packit Service 2594b8
				uint32 dataoffset32;
Packit Service 2594b8
				datafits = 0;
Packit Service 2594b8
				datamem = NULL;
Packit Service 2594b8
				dataoffset32 = *(uint32*)dp;
Packit Service 2594b8
				if (swabflag)
Packit Service 2594b8
					TIFFSwabLong(&dataoffset32);
Packit Service 2594b8
				dataoffset = dataoffset32;
Packit Service 2594b8
			}
Packit Service 2594b8
			dp += sizeof(uint32);
Packit Service 2594b8
		}
Packit Service 2594b8
		else
Packit Service 2594b8
		{
Packit Service 2594b8
			if (datasizeoverflow || datasize>8)
Packit Service 2594b8
			{
Packit Service 2594b8
				datafits = 0;
Packit Service 2594b8
				datamem = NULL;
Packit Service 2594b8
				dataoffset = *(uint64*)dp;
Packit Service 2594b8
				if (swabflag)
Packit Service 2594b8
					TIFFSwabLong8(&dataoffset);
Packit Service 2594b8
			}
Packit Service 2594b8
			dp += sizeof(uint64);
Packit Service 2594b8
		}
Packit Service 2594b8
		if (datasizeoverflow || datasize>0x10000)
Packit Service 2594b8
		{
Packit Service 2594b8
			datatruncated = 1;
Packit Service 2594b8
			count = 0x10000/typewidth;
Packit Service 2594b8
			datasize = TIFFSafeMultiply(tmsize_t,count,typewidth);
Packit Service 2594b8
		}
Packit Service 2594b8
		if (count>maxitems)
Packit Service 2594b8
		{
Packit Service 2594b8
			datatruncated = 1;
Packit Service 2594b8
			count = maxitems;
Packit Service 2594b8
                        datasize = TIFFSafeMultiply(tmsize_t,count,typewidth);
Packit Service 2594b8
		}
Packit Service 2594b8
		if (!datafits)
Packit Service 2594b8
		{
Packit Service 2594b8
			datamem = _TIFFmalloc(datasize);
Packit Service 2594b8
			if (datamem) {
Packit Service 2594b8
				if (_TIFF_lseek_f(fd, (_TIFF_off_t)dataoffset, 0) !=
Packit Service 2594b8
				    (_TIFF_off_t)dataoffset)
Packit Service 2594b8
				{
Packit Service 2594b8
					Error(
Packit Service 2594b8
				"Seek error accessing tag %u value", tag);
Packit Service 2594b8
					_TIFFfree(datamem);
Packit Service 2594b8
					datamem = NULL;
Packit Service 2594b8
				}
Packit Service 2594b8
				else if (read(fd, datamem, (size_t)datasize) != (TIFF_SSIZE_T)datasize)
Packit Service 2594b8
				{
Packit Service 2594b8
					Error(
Packit Service 2594b8
				"Read error accessing tag %u value", tag);
Packit Service 2594b8
					_TIFFfree(datamem);
Packit Service 2594b8
					datamem = NULL;
Packit Service 2594b8
				}
Packit Service 2594b8
			} else
Packit Service 2594b8
				Error("No space for data for tag %u",tag);
Packit Service 2594b8
		}
Packit Service 2594b8
		if (datamem)
Packit Service 2594b8
		{
Packit Service 2594b8
			if (swabflag)
Packit Service 2594b8
			{
Packit Service 2594b8
				switch (type)
Packit Service 2594b8
				{
Packit Service 2594b8
					case TIFF_BYTE:
Packit Service 2594b8
					case TIFF_ASCII:
Packit Service 2594b8
					case TIFF_SBYTE:
Packit Service 2594b8
					case TIFF_UNDEFINED:
Packit Service 2594b8
						break;
Packit Service 2594b8
					case TIFF_SHORT:
Packit Service 2594b8
					case TIFF_SSHORT:
Packit Service 2594b8
						TIFFSwabArrayOfShort((uint16*)datamem,(tmsize_t)count);
Packit Service 2594b8
						break;
Packit Service 2594b8
					case TIFF_LONG:
Packit Service 2594b8
					case TIFF_SLONG:
Packit Service 2594b8
					case TIFF_FLOAT:
Packit Service 2594b8
					case TIFF_IFD:
Packit Service 2594b8
						TIFFSwabArrayOfLong((uint32*)datamem,(tmsize_t)count);
Packit Service 2594b8
						break;
Packit Service 2594b8
					case TIFF_RATIONAL:
Packit Service 2594b8
					case TIFF_SRATIONAL:
Packit Service 2594b8
						TIFFSwabArrayOfLong((uint32*)datamem,(tmsize_t)count*2);
Packit Service 2594b8
						break;
Packit Service 2594b8
					case TIFF_DOUBLE:
Packit Service 2594b8
					case TIFF_LONG8:
Packit Service 2594b8
					case TIFF_SLONG8:
Packit Service 2594b8
					case TIFF_IFD8:
Packit Service 2594b8
						TIFFSwabArrayOfLong8((uint64*)datamem,(tmsize_t)count);
Packit Service 2594b8
						break;
Packit Service 2594b8
				}
Packit Service 2594b8
			}
Packit Service 2594b8
			PrintData(stdout,type,(uint32)count,datamem);
Packit Service 2594b8
			if (datatruncated)
Packit Service 2594b8
				printf(" ...");
Packit Service 2594b8
			if (!datafits)
Packit Service 2594b8
                                {
Packit Service 2594b8
                                        _TIFFfree(datamem);
Packit Service 2594b8
                                        datamem = NULL;
Packit Service 2594b8
                                }
Packit Service 2594b8
		}
Packit Service 2594b8
		printf(">\n");
Packit Service 2594b8
	}
Packit Service 2594b8
done:
Packit Service 2594b8
	if (dirmem)
Packit Service 2594b8
		_TIFFfree((char *)dirmem);
Packit Service 2594b8
	return (nextdiroff);
Packit Service 2594b8
}
Packit Service 2594b8
Packit Service 2594b8
static const struct tagname {
Packit Service 2594b8
	uint16 tag;
Packit Service 2594b8
	const char* name;
Packit Service 2594b8
} tagnames[] = {
Packit Service 2594b8
    { TIFFTAG_SUBFILETYPE,	"SubFileType" },
Packit Service 2594b8
    { TIFFTAG_OSUBFILETYPE,	"OldSubFileType" },
Packit Service 2594b8
    { TIFFTAG_IMAGEWIDTH,	"ImageWidth" },
Packit Service 2594b8
    { TIFFTAG_IMAGELENGTH,	"ImageLength" },
Packit Service 2594b8
    { TIFFTAG_BITSPERSAMPLE,	"BitsPerSample" },
Packit Service 2594b8
    { TIFFTAG_COMPRESSION,	"Compression" },
Packit Service 2594b8
    { TIFFTAG_PHOTOMETRIC,	"Photometric" },
Packit Service 2594b8
    { TIFFTAG_THRESHHOLDING,	"Threshholding" },
Packit Service 2594b8
    { TIFFTAG_CELLWIDTH,	"CellWidth" },
Packit Service 2594b8
    { TIFFTAG_CELLLENGTH,	"CellLength" },
Packit Service 2594b8
    { TIFFTAG_FILLORDER,	"FillOrder" },
Packit Service 2594b8
    { TIFFTAG_DOCUMENTNAME,	"DocumentName" },
Packit Service 2594b8
    { TIFFTAG_IMAGEDESCRIPTION,	"ImageDescription" },
Packit Service 2594b8
    { TIFFTAG_MAKE,		"Make" },
Packit Service 2594b8
    { TIFFTAG_MODEL,		"Model" },
Packit Service 2594b8
    { TIFFTAG_STRIPOFFSETS,	"StripOffsets" },
Packit Service 2594b8
    { TIFFTAG_ORIENTATION,	"Orientation" },
Packit Service 2594b8
    { TIFFTAG_SAMPLESPERPIXEL,	"SamplesPerPixel" },
Packit Service 2594b8
    { TIFFTAG_ROWSPERSTRIP,	"RowsPerStrip" },
Packit Service 2594b8
    { TIFFTAG_STRIPBYTECOUNTS,	"StripByteCounts" },
Packit Service 2594b8
    { TIFFTAG_MINSAMPLEVALUE,	"MinSampleValue" },
Packit Service 2594b8
    { TIFFTAG_MAXSAMPLEVALUE,	"MaxSampleValue" },
Packit Service 2594b8
    { TIFFTAG_XRESOLUTION,	"XResolution" },
Packit Service 2594b8
    { TIFFTAG_YRESOLUTION,	"YResolution" },
Packit Service 2594b8
    { TIFFTAG_PLANARCONFIG,	"PlanarConfig" },
Packit Service 2594b8
    { TIFFTAG_PAGENAME,		"PageName" },
Packit Service 2594b8
    { TIFFTAG_XPOSITION,	"XPosition" },
Packit Service 2594b8
    { TIFFTAG_YPOSITION,	"YPosition" },
Packit Service 2594b8
    { TIFFTAG_FREEOFFSETS,	"FreeOffsets" },
Packit Service 2594b8
    { TIFFTAG_FREEBYTECOUNTS,	"FreeByteCounts" },
Packit Service 2594b8
    { TIFFTAG_GRAYRESPONSEUNIT,	"GrayResponseUnit" },
Packit Service 2594b8
    { TIFFTAG_GRAYRESPONSECURVE,"GrayResponseCurve" },
Packit Service 2594b8
    { TIFFTAG_GROUP3OPTIONS,	"Group3Options" },
Packit Service 2594b8
    { TIFFTAG_GROUP4OPTIONS,	"Group4Options" },
Packit Service 2594b8
    { TIFFTAG_RESOLUTIONUNIT,	"ResolutionUnit" },
Packit Service 2594b8
    { TIFFTAG_PAGENUMBER,	"PageNumber" },
Packit Service 2594b8
    { TIFFTAG_COLORRESPONSEUNIT,"ColorResponseUnit" },
Packit Service 2594b8
    { TIFFTAG_TRANSFERFUNCTION,	"TransferFunction" },
Packit Service 2594b8
    { TIFFTAG_SOFTWARE,		"Software" },
Packit Service 2594b8
    { TIFFTAG_DATETIME,		"DateTime" },
Packit Service 2594b8
    { TIFFTAG_ARTIST,		"Artist" },
Packit Service 2594b8
    { TIFFTAG_HOSTCOMPUTER,	"HostComputer" },
Packit Service 2594b8
    { TIFFTAG_PREDICTOR,	"Predictor" },
Packit Service 2594b8
    { TIFFTAG_WHITEPOINT,	"Whitepoint" },
Packit Service 2594b8
    { TIFFTAG_PRIMARYCHROMATICITIES,"PrimaryChromaticities" },
Packit Service 2594b8
    { TIFFTAG_COLORMAP,		"Colormap" },
Packit Service 2594b8
    { TIFFTAG_HALFTONEHINTS,	"HalftoneHints" },
Packit Service 2594b8
    { TIFFTAG_TILEWIDTH,	"TileWidth" },
Packit Service 2594b8
    { TIFFTAG_TILELENGTH,	"TileLength" },
Packit Service 2594b8
    { TIFFTAG_TILEOFFSETS,	"TileOffsets" },
Packit Service 2594b8
    { TIFFTAG_TILEBYTECOUNTS,	"TileByteCounts" },
Packit Service 2594b8
    { TIFFTAG_BADFAXLINES,	"BadFaxLines" },
Packit Service 2594b8
    { TIFFTAG_CLEANFAXDATA,	"CleanFaxData" },
Packit Service 2594b8
    { TIFFTAG_CONSECUTIVEBADFAXLINES, "ConsecutiveBadFaxLines" },
Packit Service 2594b8
    { TIFFTAG_SUBIFD,		"SubIFD" },
Packit Service 2594b8
    { TIFFTAG_INKSET,		"InkSet" },
Packit Service 2594b8
    { TIFFTAG_INKNAMES,		"InkNames" },
Packit Service 2594b8
    { TIFFTAG_NUMBEROFINKS,	"NumberOfInks" },
Packit Service 2594b8
    { TIFFTAG_DOTRANGE,		"DotRange" },
Packit Service 2594b8
    { TIFFTAG_TARGETPRINTER,	"TargetPrinter" },
Packit Service 2594b8
    { TIFFTAG_EXTRASAMPLES,	"ExtraSamples" },
Packit Service 2594b8
    { TIFFTAG_SAMPLEFORMAT,	"SampleFormat" },
Packit Service 2594b8
    { TIFFTAG_SMINSAMPLEVALUE,	"SMinSampleValue" },
Packit Service 2594b8
    { TIFFTAG_SMAXSAMPLEVALUE,	"SMaxSampleValue" },
Packit Service 2594b8
    { TIFFTAG_JPEGPROC,		"JPEGProcessingMode" },
Packit Service 2594b8
    { TIFFTAG_JPEGIFOFFSET,	"JPEGInterchangeFormat" },
Packit Service 2594b8
    { TIFFTAG_JPEGIFBYTECOUNT,	"JPEGInterchangeFormatLength" },
Packit Service 2594b8
    { TIFFTAG_JPEGRESTARTINTERVAL,"JPEGRestartInterval" },
Packit Service 2594b8
    { TIFFTAG_JPEGLOSSLESSPREDICTORS,"JPEGLosslessPredictors" },
Packit Service 2594b8
    { TIFFTAG_JPEGPOINTTRANSFORM,"JPEGPointTransform" },
Packit Service 2594b8
    { TIFFTAG_JPEGTABLES,       "JPEGTables" },
Packit Service 2594b8
    { TIFFTAG_JPEGQTABLES,	"JPEGQTables" },
Packit Service 2594b8
    { TIFFTAG_JPEGDCTABLES,	"JPEGDCTables" },
Packit Service 2594b8
    { TIFFTAG_JPEGACTABLES,	"JPEGACTables" },
Packit Service 2594b8
    { TIFFTAG_YCBCRCOEFFICIENTS,"YCbCrCoefficients" },
Packit Service 2594b8
    { TIFFTAG_YCBCRSUBSAMPLING,	"YCbCrSubsampling" },
Packit Service 2594b8
    { TIFFTAG_YCBCRPOSITIONING,	"YCbCrPositioning" },
Packit Service 2594b8
    { TIFFTAG_REFERENCEBLACKWHITE, "ReferenceBlackWhite" },
Packit Service 2594b8
    { TIFFTAG_REFPTS,		"IgReferencePoints (Island Graphics)" },
Packit Service 2594b8
    { TIFFTAG_REGIONTACKPOINT,	"IgRegionTackPoint (Island Graphics)" },
Packit Service 2594b8
    { TIFFTAG_REGIONWARPCORNERS,"IgRegionWarpCorners (Island Graphics)" },
Packit Service 2594b8
    { TIFFTAG_REGIONAFFINE,	"IgRegionAffine (Island Graphics)" },
Packit Service 2594b8
    { TIFFTAG_MATTEING,		"OBSOLETE Matteing (Silicon Graphics)" },
Packit Service 2594b8
    { TIFFTAG_DATATYPE,		"OBSOLETE DataType (Silicon Graphics)" },
Packit Service 2594b8
    { TIFFTAG_IMAGEDEPTH,	"ImageDepth (Silicon Graphics)" },
Packit Service 2594b8
    { TIFFTAG_TILEDEPTH,	"TileDepth (Silicon Graphics)" },
Packit Service 2594b8
    { 32768,			"OLD BOGUS Matteing tag" },
Packit Service 2594b8
    { TIFFTAG_COPYRIGHT,	"Copyright" },
Packit Service 2594b8
    { TIFFTAG_ICCPROFILE,	"ICC Profile" },
Packit Service 2594b8
    { TIFFTAG_JBIGOPTIONS,	"JBIG Options" },
Packit Service 2594b8
    { TIFFTAG_STONITS,		"StoNits" },
Packit Service 2594b8
};
Packit Service 2594b8
#define	NTAGS	(sizeof (tagnames) / sizeof (tagnames[0]))
Packit Service 2594b8
Packit Service 2594b8
static void
Packit Service 2594b8
PrintTag(FILE* fd, uint16 tag)
Packit Service 2594b8
{
Packit Service 2594b8
	const struct tagname *tp;
Packit Service 2594b8
Packit Service 2594b8
	for (tp = tagnames; tp < &tagnames[NTAGS]; tp++)
Packit Service 2594b8
		if (tp->tag == tag) {
Packit Service 2594b8
			fprintf(fd, "%s (%u)", tp->name, tag);
Packit Service 2594b8
			return;
Packit Service 2594b8
		}
Packit Service 2594b8
	fprintf(fd, "%u (%#x)", tag, tag);
Packit Service 2594b8
}
Packit Service 2594b8
Packit Service 2594b8
static void
Packit Service 2594b8
PrintType(FILE* fd, uint16 type)
Packit Service 2594b8
{
Packit Service 2594b8
	static const char *typenames[] = {
Packit Service 2594b8
	    "0",
Packit Service 2594b8
	    "BYTE",
Packit Service 2594b8
	    "ASCII",
Packit Service 2594b8
	    "SHORT",
Packit Service 2594b8
	    "LONG",
Packit Service 2594b8
	    "RATIONAL",
Packit Service 2594b8
	    "SBYTE",
Packit Service 2594b8
	    "UNDEFINED",
Packit Service 2594b8
	    "SSHORT",
Packit Service 2594b8
	    "SLONG",
Packit Service 2594b8
	    "SRATIONAL",
Packit Service 2594b8
	    "FLOAT",
Packit Service 2594b8
	    "DOUBLE",
Packit Service 2594b8
	    "IFD",
Packit Service 2594b8
	    "14",
Packit Service 2594b8
	    "15",
Packit Service 2594b8
	    "LONG8",
Packit Service 2594b8
	    "SLONG8",
Packit Service 2594b8
	    "IFD8"
Packit Service 2594b8
	};
Packit Service 2594b8
#define	NTYPES	(sizeof (typenames) / sizeof (typenames[0]))
Packit Service 2594b8
Packit Service 2594b8
	if (type < NTYPES)
Packit Service 2594b8
		fprintf(fd, "%s (%u)", typenames[type], type);
Packit Service 2594b8
	else
Packit Service 2594b8
		fprintf(fd, "%u (%#x)", type, type);
Packit Service 2594b8
}
Packit Service 2594b8
#undef	NTYPES
Packit Service 2594b8
Packit Service 2594b8
#include <ctype.h>
Packit Service 2594b8
Packit Service 2594b8
static void
Packit Service 2594b8
PrintASCII(FILE* fd, uint32 cc, const unsigned char* cp)
Packit Service 2594b8
{
Packit Service 2594b8
	for (; cc > 0; cc--, cp++) {
Packit Service 2594b8
		const char* tp;
Packit Service 2594b8
Packit Service 2594b8
		if (isprint(*cp)) {
Packit Service 2594b8
			fputc(*cp, fd);
Packit Service 2594b8
			continue;
Packit Service 2594b8
		}
Packit Service 2594b8
		for (tp = "\tt\bb\rr\nn\vv"; *tp; tp++)
Packit Service 2594b8
			if (*tp++ == *cp)
Packit Service 2594b8
				break;
Packit Service 2594b8
		if (*tp)
Packit Service 2594b8
			fprintf(fd, "\\%c", *tp);
Packit Service 2594b8
		else if (*cp)
Packit Service 2594b8
			fprintf(fd, "\\%03o", *cp);
Packit Service 2594b8
		else
Packit Service 2594b8
			fprintf(fd, "\\0");
Packit Service 2594b8
	}
Packit Service 2594b8
}
Packit Service 2594b8
Packit Service 2594b8
static void
Packit Service 2594b8
PrintData(FILE* fd, uint16 type, uint32 count, unsigned char* data)
Packit Service 2594b8
{
Packit Service 2594b8
	char* sep = "";
Packit Service 2594b8
Packit Service 2594b8
	switch (type) {
Packit Service 2594b8
	case TIFF_BYTE:
Packit Service 2594b8
		while (count-- > 0)
Packit Service 2594b8
			fprintf(fd, bytefmt, sep, *data++), sep = " ";
Packit Service 2594b8
		break;
Packit Service 2594b8
	case TIFF_SBYTE:
Packit Service 2594b8
		while (count-- > 0)
Packit Service 2594b8
			fprintf(fd, sbytefmt, sep, *(char *)data++), sep = " ";
Packit Service 2594b8
		break;
Packit Service 2594b8
	case TIFF_UNDEFINED:
Packit Service 2594b8
		while (count-- > 0)
Packit Service 2594b8
			fprintf(fd, bytefmt, sep, *data++), sep = " ";
Packit Service 2594b8
		break;
Packit Service 2594b8
	case TIFF_ASCII:
Packit Service 2594b8
		PrintASCII(fd, count, data);
Packit Service 2594b8
		break;
Packit Service 2594b8
	case TIFF_SHORT: {
Packit Service 2594b8
		uint16 *wp = (uint16*)data;
Packit Service 2594b8
		while (count-- > 0)
Packit Service 2594b8
			fprintf(fd, shortfmt, sep, *wp++), sep = " ";
Packit Service 2594b8
		break;
Packit Service 2594b8
	}
Packit Service 2594b8
	case TIFF_SSHORT: {
Packit Service 2594b8
		int16 *wp = (int16*)data;
Packit Service 2594b8
		while (count-- > 0)
Packit Service 2594b8
			fprintf(fd, sshortfmt, sep, *wp++), sep = " ";
Packit Service 2594b8
		break;
Packit Service 2594b8
	}
Packit Service 2594b8
	case TIFF_LONG: {
Packit Service 2594b8
		uint32 *lp = (uint32*)data;
Packit Service 2594b8
		while (count-- > 0) {
Packit Service 2594b8
			fprintf(fd, longfmt, sep, (unsigned long) *lp++);
Packit Service 2594b8
			sep = " ";
Packit Service 2594b8
		}
Packit Service 2594b8
		break;
Packit Service 2594b8
	}
Packit Service 2594b8
	case TIFF_SLONG: {
Packit Service 2594b8
		int32 *lp = (int32*)data;
Packit Service 2594b8
		while (count-- > 0)
Packit Service 2594b8
			fprintf(fd, slongfmt, sep, (long) *lp++), sep = " ";
Packit Service 2594b8
		break;
Packit Service 2594b8
	}
Packit Service 2594b8
	case TIFF_LONG8: {
Packit Service 2594b8
		uint64 *llp = (uint64*)data;
Packit Service 2594b8
		while (count-- > 0) {
Packit Service 2594b8
                        uint64 val;
Packit Service 2594b8
                        memcpy(&val, llp, sizeof(uint64));
Packit Service 2594b8
                        llp ++;
Packit Service 2594b8
			fprintf(fd, long8fmt, sep, val);
Packit Service 2594b8
			sep = " ";
Packit Service 2594b8
		}
Packit Service 2594b8
		break;
Packit Service 2594b8
	}
Packit Service 2594b8
	case TIFF_SLONG8: {
Packit Service 2594b8
		int64 *llp = (int64*)data;
Packit Service 2594b8
		while (count-- > 0) {
Packit Service 2594b8
                        int64 val;
Packit Service 2594b8
                        memcpy(&val, llp, sizeof(int64));
Packit Service 2594b8
                        llp ++;
Packit Service 2594b8
                        fprintf(fd, slong8fmt, sep, val);
Packit Service 2594b8
                        sep = " ";
Packit Service 2594b8
                }
Packit Service 2594b8
		break;
Packit Service 2594b8
	}
Packit Service 2594b8
	case TIFF_RATIONAL: {
Packit Service 2594b8
		uint32 *lp = (uint32*)data;
Packit Service 2594b8
		while (count-- > 0) {
Packit Service 2594b8
			if (lp[1] == 0)
Packit Service 2594b8
				fprintf(fd, "%sNan (%lu/%lu)", sep,
Packit Service 2594b8
				    (unsigned long) lp[0],
Packit Service 2594b8
				    (unsigned long) lp[1]);
Packit Service 2594b8
			else
Packit Service 2594b8
				fprintf(fd, rationalfmt, sep,
Packit Service 2594b8
				    (double)lp[0] / (double)lp[1]);
Packit Service 2594b8
			sep = " ";
Packit Service 2594b8
			lp += 2;
Packit Service 2594b8
		}
Packit Service 2594b8
		break;
Packit Service 2594b8
	}
Packit Service 2594b8
	case TIFF_SRATIONAL: {
Packit Service 2594b8
		int32 *lp = (int32*)data;
Packit Service 2594b8
		while (count-- > 0) {
Packit Service 2594b8
			if (lp[1] == 0)
Packit Service 2594b8
				fprintf(fd, "%sNan (%ld/%ld)", sep,
Packit Service 2594b8
				    (long) lp[0], (long) lp[1]);
Packit Service 2594b8
			else
Packit Service 2594b8
				fprintf(fd, srationalfmt, sep,
Packit Service 2594b8
				    (double)lp[0] / (double)lp[1]);
Packit Service 2594b8
			sep = " ";
Packit Service 2594b8
			lp += 2;
Packit Service 2594b8
		}
Packit Service 2594b8
		break;
Packit Service 2594b8
	}
Packit Service 2594b8
	case TIFF_FLOAT: {
Packit Service 2594b8
		float *fp = (float *)data;
Packit Service 2594b8
		while (count-- > 0)
Packit Service 2594b8
			fprintf(fd, floatfmt, sep, *fp++), sep = " ";
Packit Service 2594b8
		break;
Packit Service 2594b8
	}
Packit Service 2594b8
	case TIFF_DOUBLE: {
Packit Service 2594b8
		double *dp = (double *)data;
Packit Service 2594b8
		while (count-- > 0)
Packit Service 2594b8
			fprintf(fd, doublefmt, sep, *dp++), sep = " ";
Packit Service 2594b8
		break;
Packit Service 2594b8
	}
Packit Service 2594b8
	case TIFF_IFD: {
Packit Service 2594b8
		uint32 *lp = (uint32*)data;
Packit Service 2594b8
		while (count-- > 0) {
Packit Service 2594b8
			fprintf(fd, ifdfmt, sep, (unsigned long) *lp++);
Packit Service 2594b8
			sep = " ";
Packit Service 2594b8
		}
Packit Service 2594b8
		break;
Packit Service 2594b8
	}
Packit Service 2594b8
	case TIFF_IFD8: {
Packit Service 2594b8
		uint64 *llp = (uint64*)data;
Packit Service 2594b8
		while (count-- > 0) {
Packit Service 2594b8
#if defined(__WIN32__) && defined(_MSC_VER)
Packit Service 2594b8
			fprintf(fd, ifd8fmt, sep, (unsigned __int64) *llp++);
Packit Service 2594b8
#else
Packit Service 2594b8
			fprintf(fd, ifd8fmt, sep, (unsigned long long) *llp++);
Packit Service 2594b8
#endif
Packit Service 2594b8
			sep = " ";
Packit Service 2594b8
		}
Packit Service 2594b8
		break;
Packit Service 2594b8
	}
Packit Service 2594b8
	}
Packit Service 2594b8
}
Packit Service 2594b8
Packit Service 2594b8
static void
Packit Service 2594b8
ReadError(char* what)
Packit Service 2594b8
{
Packit Service 2594b8
	Fatal("Error while reading %s", what);
Packit Service 2594b8
}
Packit Service 2594b8
Packit Service 2594b8
#include <stdarg.h>
Packit Service 2594b8
Packit Service 2594b8
static void
Packit Service 2594b8
vError(FILE* fd, const char* fmt, va_list ap)
Packit Service 2594b8
{
Packit Service 2594b8
	fprintf(fd, "%s: ", curfile);
Packit Service 2594b8
	vfprintf(fd, fmt, ap);
Packit Service 2594b8
	fprintf(fd, ".\n");
Packit Service 2594b8
}
Packit Service 2594b8
Packit Service 2594b8
static void
Packit Service 2594b8
Error(const char* fmt, ...)
Packit Service 2594b8
{
Packit Service 2594b8
	va_list ap;
Packit Service 2594b8
	va_start(ap, fmt);
Packit Service 2594b8
	vError(stderr, fmt, ap);
Packit Service 2594b8
	va_end(ap);
Packit Service 2594b8
}
Packit Service 2594b8
Packit Service 2594b8
static void
Packit Service 2594b8
Fatal(const char* fmt, ...)
Packit Service 2594b8
{
Packit Service 2594b8
	va_list ap;
Packit Service 2594b8
	va_start(ap, fmt);
Packit Service 2594b8
	vError(stderr, fmt, ap);
Packit Service 2594b8
	va_end(ap);
Packit Service 2594b8
	exit(-1);
Packit Service 2594b8
}
Packit Service 2594b8
Packit Service 2594b8
/* vim: set ts=8 sts=8 sw=8 noet: */
Packit Service 2594b8
/*
Packit Service 2594b8
 * Local Variables:
Packit Service 2594b8
 * mode: c
Packit Service 2594b8
 * c-basic-offset: 8
Packit Service 2594b8
 * fill-column: 78
Packit Service 2594b8
 * End:
Packit Service 2594b8
 */