Blame tools/tiffdump.c

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