[Midnightbsd-cvs] src [6699] trunk/contrib/file: Merge file 5.19

laffer1 at midnightbsd.org laffer1 at midnightbsd.org
Mon Jun 30 07:58:43 EDT 2014


Revision: 6699
          http://svnweb.midnightbsd.org/src/?rev=6699
Author:   laffer1
Date:     2014-06-30 07:58:43 -0400 (Mon, 30 Jun 2014)
Log Message:
-----------
Merge file 5.19

Modified Paths:
--------------
    trunk/contrib/file/Magdir/commands

Added Paths:
-----------
    trunk/contrib/file/depcomp
    trunk/contrib/file/magic/

Removed Paths:
-------------
    trunk/contrib/file/Header
    trunk/contrib/file/Localstuff
    trunk/contrib/file/apprentice.c
    trunk/contrib/file/apptype.c
    trunk/contrib/file/ascmagic.c
    trunk/contrib/file/asprintf.c
    trunk/contrib/file/cdf.c
    trunk/contrib/file/cdf.h
    trunk/contrib/file/cdf_time.c
    trunk/contrib/file/compress.c
    trunk/contrib/file/elfclass.h
    trunk/contrib/file/encoding.c
    trunk/contrib/file/file.c
    trunk/contrib/file/file.h
    trunk/contrib/file/file.man
    trunk/contrib/file/file_opts.h
    trunk/contrib/file/fsmagic.c
    trunk/contrib/file/funcs.c
    trunk/contrib/file/getopt_long.c
    trunk/contrib/file/is_tar.c
    trunk/contrib/file/libmagic.man
    trunk/contrib/file/magic.c
    trunk/contrib/file/magic.h
    trunk/contrib/file/magic.man
    trunk/contrib/file/mygetopt.h
    trunk/contrib/file/names.h
    trunk/contrib/file/readelf.h

Deleted: trunk/contrib/file/Header
===================================================================
--- trunk/contrib/file/Header	2014-06-30 11:58:41 UTC (rev 6698)
+++ trunk/contrib/file/Header	2014-06-30 11:58:43 UTC (rev 6699)
@@ -1,5 +0,0 @@
-# Magic data for file(1) command.
-# Format is described in magic(files), where:
-# files is 5 on V7 and BSD, 4 on SV, and ?? on SVID.
-# Don't edit this file, edit /etc/magic or send your magic improvements
-# to the maintainers, at file at mx.gw.com

Deleted: trunk/contrib/file/Localstuff
===================================================================
--- trunk/contrib/file/Localstuff	2014-06-30 11:58:41 UTC (rev 6698)
+++ trunk/contrib/file/Localstuff	2014-06-30 11:58:43 UTC (rev 6699)
@@ -1,7 +0,0 @@
-
-#------------------------------------------------------------------------------
-# Localstuff:  file(1) magic for locally observed files
-#
-# $File: Localstuff,v 1.4 2003/03/23 04:17:27 christos Exp $
-# Add any locally observed files here.  Remember:
-# text if readable, executable if runnable binary, data if unreadable.

Modified: trunk/contrib/file/Magdir/commands
===================================================================
--- trunk/contrib/file/Magdir/commands	2014-06-30 11:58:41 UTC (rev 6698)
+++ trunk/contrib/file/Magdir/commands	2014-06-30 11:58:43 UTC (rev 6699)
@@ -49,7 +49,8 @@
 !:mime	text/x-awk
 0	string/wt	#!\ /usr/bin/awk	awk script text executable
 !:mime	text/x-awk
-0	regex		=^\\s*BEGIN\\s*[{]	awk script text
+0	regex		=^\\s{0,100}BEGIN\\s{0,100}[{]	awk script text
+!:strength - 12
 
 # AT&T Bell Labs' Plan 9 shell
 0	string/wt	#!\ /bin/rc	Plan 9 rc shell script text executable

Deleted: trunk/contrib/file/apprentice.c
===================================================================
--- trunk/contrib/file/apprentice.c	2014-06-30 11:58:41 UTC (rev 6698)
+++ trunk/contrib/file/apprentice.c	2014-06-30 11:58:43 UTC (rev 6699)
@@ -1,2521 +0,0 @@
-/*
- * Copyright (c) Ian F. Darwin 1986-1995.
- * Software written by Ian F. Darwin and others;
- * maintained 1995-present by Christos Zoulas and others.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice immediately at the beginning of the file, without modification,
- *    this list of conditions, and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *  
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-/*
- * apprentice - make one pass through /etc/magic, learning its secrets.
- */
-
-#include "file.h"
-
-#ifndef	lint
-FILE_RCSID("@(#)$File: apprentice.c,v 1.165 2011/01/16 19:30:36 rrt Exp $")
-#endif	/* lint */
-
-#include "magic.h"
-#include "patchlevel.h"
-#include <stdlib.h>
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#include <string.h>
-#include <assert.h>
-#include <ctype.h>
-#include <fcntl.h>
-#ifdef QUICK
-#include <sys/mman.h>
-#endif
-#include <dirent.h>
-
-#define	EATAB {while (isascii((unsigned char) *l) && \
-		      isspace((unsigned char) *l))  ++l;}
-#define LOWCASE(l) (isupper((unsigned char) (l)) ? \
-			tolower((unsigned char) (l)) : (l))
-/*
- * Work around a bug in headers on Digital Unix.
- * At least confirmed for: OSF1 V4.0 878
- */
-#if defined(__osf__) && defined(__DECC)
-#ifdef MAP_FAILED
-#undef MAP_FAILED
-#endif
-#endif
-
-#ifndef MAP_FAILED
-#define MAP_FAILED (void *) -1
-#endif
-
-#ifndef MAP_FILE
-#define MAP_FILE 0
-#endif
-
-#ifndef MAXPATHLEN
-#define MAXPATHLEN	1024
-#endif
-
-struct magic_entry {
-	struct magic *mp;	
-	uint32_t cont_count;
-	uint32_t max_count;
-};
-
-int file_formats[FILE_NAMES_SIZE];
-const size_t file_nformats = FILE_NAMES_SIZE;
-const char *file_names[FILE_NAMES_SIZE];
-const size_t file_nnames = FILE_NAMES_SIZE;
-
-private int getvalue(struct magic_set *ms, struct magic *, const char **, int);
-private int hextoint(int);
-private const char *getstr(struct magic_set *, struct magic *, const char *,
-    int);
-private int parse(struct magic_set *, struct magic_entry **, uint32_t *,
-    const char *, size_t, int);
-private void eatsize(const char **);
-private int apprentice_1(struct magic_set *, const char *, int, struct mlist *);
-private size_t apprentice_magic_strength(const struct magic *);
-private int apprentice_sort(const void *, const void *);
-private void apprentice_list(struct mlist *, int );
-private int apprentice_load(struct magic_set *, struct magic **, uint32_t *,
-    const char *, int);
-private void byteswap(struct magic *, uint32_t);
-private void bs1(struct magic *);
-private uint16_t swap2(uint16_t);
-private uint32_t swap4(uint32_t);
-private uint64_t swap8(uint64_t);
-private char *mkdbname(struct magic_set *, const char *, int);
-private int apprentice_map(struct magic_set *, struct magic **, uint32_t *,
-    const char *);
-private int apprentice_compile(struct magic_set *, struct magic **, uint32_t *,
-    const char *);
-private int check_format_type(const char *, int);
-private int check_format(struct magic_set *, struct magic *);
-private int get_op(char);
-private int parse_mime(struct magic_set *, struct magic_entry *, const char *);
-private int parse_strength(struct magic_set *, struct magic_entry *, const char *);
-private int parse_apple(struct magic_set *, struct magic_entry *, const char *);
-
-
-private size_t maxmagic = 0;
-private size_t magicsize = sizeof(struct magic);
-
-private const char usg_hdr[] = "cont\toffset\ttype\topcode\tmask\tvalue\tdesc";
-
-private struct {
-	const char *name;
-	size_t len;
-	int (*fun)(struct magic_set *, struct magic_entry *, const char *);
-} bang[] = {
-#define	DECLARE_FIELD(name) { # name, sizeof(# name) - 1, parse_ ## name }
-	DECLARE_FIELD(mime),
-	DECLARE_FIELD(apple),
-	DECLARE_FIELD(strength),
-#undef	DECLARE_FIELD
-	{ NULL, 0, NULL }
-};
-
-#ifdef COMPILE_ONLY
-
-int main(int, char *[]);
-
-int
-main(int argc, char *argv[])
-{
-	int ret;
-	struct magic_set *ms;
-	char *progname;
-
-	if ((progname = strrchr(argv[0], '/')) != NULL)
-		progname++;
-	else
-		progname = argv[0];
-
-	if (argc != 2) {
-		(void)fprintf(stderr, "Usage: %s file\n", progname);
-		return 1;
-	}
-
-	if ((ms = magic_open(MAGIC_CHECK)) == NULL) {
-		(void)fprintf(stderr, "%s: %s\n", progname, strerror(errno));
-		return 1;
-	}
-	ret = magic_compile(ms, argv[1]) == -1 ? 1 : 0;
-	if (ret == 1)
-		(void)fprintf(stderr, "%s: %s\n", progname, magic_error(ms));
-	magic_close(ms);
-	return ret;
-}
-#endif /* COMPILE_ONLY */
-
-static const struct type_tbl_s {
-	const char name[16];
-	const size_t len;
-	const int type;
-	const int format;
-} type_tbl[] = {
-# define XX(s)		s, (sizeof(s) - 1)
-# define XX_NULL	"", 0
-	{ XX("byte"),		FILE_BYTE,		FILE_FMT_NUM },
-	{ XX("short"),		FILE_SHORT,		FILE_FMT_NUM },
-	{ XX("default"),	FILE_DEFAULT,		FILE_FMT_STR },
-	{ XX("long"),		FILE_LONG,		FILE_FMT_NUM },
-	{ XX("string"),		FILE_STRING,		FILE_FMT_STR },
-	{ XX("date"),		FILE_DATE,		FILE_FMT_STR },
-	{ XX("beshort"),	FILE_BESHORT,		FILE_FMT_NUM },
-	{ XX("belong"),		FILE_BELONG,		FILE_FMT_NUM },
-	{ XX("bedate"),		FILE_BEDATE,		FILE_FMT_STR },
-	{ XX("leshort"),	FILE_LESHORT,		FILE_FMT_NUM },
-	{ XX("lelong"),		FILE_LELONG,		FILE_FMT_NUM },
-	{ XX("ledate"),		FILE_LEDATE,		FILE_FMT_STR },
-	{ XX("pstring"),	FILE_PSTRING,		FILE_FMT_STR },
-	{ XX("ldate"),		FILE_LDATE,		FILE_FMT_STR },
-	{ XX("beldate"),	FILE_BELDATE,		FILE_FMT_STR },
-	{ XX("leldate"),	FILE_LELDATE,		FILE_FMT_STR },
-	{ XX("regex"),		FILE_REGEX,		FILE_FMT_STR },
-	{ XX("bestring16"),	FILE_BESTRING16,	FILE_FMT_STR },
-	{ XX("lestring16"),	FILE_LESTRING16,	FILE_FMT_STR },
-	{ XX("search"),		FILE_SEARCH,		FILE_FMT_STR },
-	{ XX("medate"),		FILE_MEDATE,		FILE_FMT_STR },
-	{ XX("meldate"),	FILE_MELDATE,		FILE_FMT_STR },
-	{ XX("melong"),		FILE_MELONG,		FILE_FMT_NUM },
-	{ XX("quad"),		FILE_QUAD,		FILE_FMT_QUAD },
-	{ XX("lequad"),		FILE_LEQUAD,		FILE_FMT_QUAD },
-	{ XX("bequad"),		FILE_BEQUAD,		FILE_FMT_QUAD },
-	{ XX("qdate"),		FILE_QDATE,		FILE_FMT_STR },
-	{ XX("leqdate"),	FILE_LEQDATE,		FILE_FMT_STR },
-	{ XX("beqdate"),	FILE_BEQDATE,		FILE_FMT_STR },
-	{ XX("qldate"),		FILE_QLDATE,		FILE_FMT_STR },
-	{ XX("leqldate"),	FILE_LEQLDATE,		FILE_FMT_STR },
-	{ XX("beqldate"),	FILE_BEQLDATE,		FILE_FMT_STR },
-	{ XX("float"),		FILE_FLOAT,		FILE_FMT_FLOAT },
-	{ XX("befloat"),	FILE_BEFLOAT,		FILE_FMT_FLOAT },
-	{ XX("lefloat"),	FILE_LEFLOAT,		FILE_FMT_FLOAT },
-	{ XX("double"),		FILE_DOUBLE,		FILE_FMT_DOUBLE },
-	{ XX("bedouble"),	FILE_BEDOUBLE,		FILE_FMT_DOUBLE },
-	{ XX("ledouble"),	FILE_LEDOUBLE,		FILE_FMT_DOUBLE },
-	{ XX("leid3"),		FILE_LEID3,		FILE_FMT_NUM },
-	{ XX("beid3"),		FILE_BEID3,		FILE_FMT_NUM },
-	{ XX("indirect"),	FILE_INDIRECT,		FILE_FMT_NONE },
-	{ XX_NULL,		FILE_INVALID,		FILE_FMT_NONE },
-# undef XX
-# undef XX_NULL
-};
-
-private int
-get_type(const char *l, const char **t)
-{
-	const struct type_tbl_s *p;
-
-	for (p = type_tbl; p->len; p++) {
-		if (strncmp(l, p->name, p->len) == 0) {
-			if (t)
-				*t = l + p->len;
-			break;
-		}
-	}
-	return p->type;
-}
-
-private void
-init_file_tables(void)
-{
-	static int done = 0;
-	const struct type_tbl_s *p;
-
-	if (done)
-		return;
-	done++;
-
-	for (p = type_tbl; p->len; p++) {
-		assert(p->type < FILE_NAMES_SIZE);
-		file_names[p->type] = p->name;
-		file_formats[p->type] = p->format;
-	}
-}
-
-/*
- * Handle one file or directory.
- */
-private int
-apprentice_1(struct magic_set *ms, const char *fn, int action,
-    struct mlist *mlist)
-{
-	struct magic *magic = NULL;
-	uint32_t nmagic = 0;
-	struct mlist *ml;
-	int rv = -1;
-	int mapped;
-
-	if (magicsize != FILE_MAGICSIZE) {
-		file_error(ms, 0, "magic element size %lu != %lu",
-		    (unsigned long)sizeof(*magic),
-		    (unsigned long)FILE_MAGICSIZE);
-		return -1;
-	}
-
-	if (action == FILE_COMPILE) {
-		rv = apprentice_load(ms, &magic, &nmagic, fn, action);
-		if (rv != 0)
-			return -1;
-		rv = apprentice_compile(ms, &magic, &nmagic, fn);
-		free(magic);
-		return rv;
-	}
-
-#ifndef COMPILE_ONLY
-	if ((rv = apprentice_map(ms, &magic, &nmagic, fn)) == -1) {
-		if (ms->flags & MAGIC_CHECK)
-			file_magwarn(ms, "using regular magic file `%s'", fn);
-		rv = apprentice_load(ms, &magic, &nmagic, fn, action);
-		if (rv != 0)
-			return -1;
-	}
-
-	mapped = rv;
-	     
-	if (magic == NULL) {
-		file_delmagic(magic, mapped, nmagic);
-		return -1;
-	}
-
-	if ((ml = CAST(struct mlist *, malloc(sizeof(*ml)))) == NULL) {
-		file_delmagic(magic, mapped, nmagic);
-		file_oomem(ms, sizeof(*ml));
-		return -1;
-	}
-
-	ml->magic = magic;
-	ml->nmagic = nmagic;
-	ml->mapped = mapped;
-
-	mlist->prev->next = ml;
-	ml->prev = mlist->prev;
-	ml->next = mlist;
-	mlist->prev = ml;
-
-	if (action == FILE_LIST) {
-		printf("Binary patterns:\n");
-		apprentice_list(mlist, BINTEST);
-		printf("Text patterns:\n");
-		apprentice_list(mlist, TEXTTEST);
-	}
-	
-	return 0;
-#endif /* COMPILE_ONLY */
-}
-
-protected void
-file_delmagic(struct magic *p, int type, size_t entries)
-{
-	if (p == NULL)
-		return;
-	switch (type) {
-	case 2:
-#ifdef QUICK
-		p--;
-		(void)munmap((void *)p, sizeof(*p) * (entries + 1));
-		break;
-#else
-		(void)&entries;
-		abort();
-		/*NOTREACHED*/
-#endif
-	case 1:
-		p--;
-		/*FALLTHROUGH*/
-	case 0:
-		free(p);
-		break;
-	default:
-		abort();
-	}
-}
-
-/* const char *fn: list of magic files and directories */
-protected struct mlist *
-file_apprentice(struct magic_set *ms, const char *fn, int action)
-{
-	char *p, *mfn;
-	int file_err, errs = -1;
-	struct mlist *mlist;
-
-	if ((fn = magic_getpath(fn, action)) == NULL)
-		return NULL;
-
-	init_file_tables();
-
-	if ((mfn = strdup(fn)) == NULL) {
-		file_oomem(ms, strlen(fn));
-		return NULL;
-	}
-	fn = mfn;
-
-	if ((mlist = CAST(struct mlist *, malloc(sizeof(*mlist)))) == NULL) {
-		free(mfn);
-		file_oomem(ms, sizeof(*mlist));
-		return NULL;
-	}
-	mlist->next = mlist->prev = mlist;
-
-	while (fn) {
-		p = strchr(fn, PATHSEP);
-		if (p)
-			*p++ = '\0';
-		if (*fn == '\0')
-			break;
-		file_err = apprentice_1(ms, fn, action, mlist);
-		errs = MAX(errs, file_err);
-		fn = p;
-	}
-	if (errs == -1) {
-		free(mfn);
-		free(mlist);
-		mlist = NULL;
-		file_error(ms, 0, "could not find any magic files!");
-		return NULL;
-	}
-	free(mfn);
-	return mlist;
-}
-
-/*
- * Get weight of this magic entry, for sorting purposes.
- */
-private size_t
-apprentice_magic_strength(const struct magic *m)
-{
-#define MULT 10
-	size_t val = 2 * MULT;	/* baseline strength */
-
-	switch (m->type) {
-	case FILE_DEFAULT:	/* make sure this sorts last */
-		if (m->factor_op != FILE_FACTOR_OP_NONE)
-			abort();
-		return 0;
-
-	case FILE_BYTE:
-		val += 1 * MULT;
-		break;
-
-	case FILE_SHORT:
-	case FILE_LESHORT:
-	case FILE_BESHORT:
-		val += 2 * MULT;
-		break;
-
-	case FILE_LONG:
-	case FILE_LELONG:
-	case FILE_BELONG:
-	case FILE_MELONG:
-		val += 4 * MULT;
-		break;
-
-	case FILE_PSTRING:
-	case FILE_STRING:
-		val += m->vallen * MULT;
-		break;
-
-	case FILE_BESTRING16:
-	case FILE_LESTRING16:
-		val += m->vallen * MULT / 2;
-		break;
-
-	case FILE_SEARCH:
-	case FILE_REGEX:
-		val += m->vallen * MAX(MULT / m->vallen, 1);
-		break;
-
-	case FILE_DATE:
-	case FILE_LEDATE:
-	case FILE_BEDATE:
-	case FILE_MEDATE:
-	case FILE_LDATE:
-	case FILE_LELDATE:
-	case FILE_BELDATE:
-	case FILE_MELDATE:
-	case FILE_FLOAT:
-	case FILE_BEFLOAT:
-	case FILE_LEFLOAT:
-		val += 4 * MULT;
-		break;
-
-	case FILE_QUAD:
-	case FILE_BEQUAD:
-	case FILE_LEQUAD:
-	case FILE_QDATE:
-	case FILE_LEQDATE:
-	case FILE_BEQDATE:
-	case FILE_QLDATE:
-	case FILE_LEQLDATE:
-	case FILE_BEQLDATE:
-	case FILE_DOUBLE:
-	case FILE_BEDOUBLE:
-	case FILE_LEDOUBLE:
-		val += 8 * MULT;
-		break;
-
-	default:
-		val = 0;
-		(void)fprintf(stderr, "Bad type %d\n", m->type);
-		abort();
-	}
-
-	switch (m->reln) {
-	case 'x':	/* matches anything penalize */
-	case '!':       /* matches almost anything penalize */
-		val = 0;
-		break;
-
-	case '=':	/* Exact match, prefer */
-		val += MULT;
-		break;
-
-	case '>':
-	case '<':	/* comparison match reduce strength */
-		val -= 2 * MULT;
-		break;
-
-	case '^':
-	case '&':	/* masking bits, we could count them too */
-		val -= MULT;
-		break;
-
-	default:
-		(void)fprintf(stderr, "Bad relation %c\n", m->reln);
-		abort();
-	}
-
-	if (val == 0)	/* ensure we only return 0 for FILE_DEFAULT */
-		val = 1;
-
-	switch (m->factor_op) {
-	case FILE_FACTOR_OP_NONE:
-		break;
-	case FILE_FACTOR_OP_PLUS:
-		val += m->factor;
-		break;
-	case FILE_FACTOR_OP_MINUS:
-		val -= m->factor;
-		break;
-	case FILE_FACTOR_OP_TIMES:
-		val *= m->factor;
-		break;
-	case FILE_FACTOR_OP_DIV:
-		val /= m->factor;
-		break;
-	default:
-		abort();
-	}
-
-	/*
-	 * Magic entries with no description get a bonus because they depend
-	 * on subsequent magic entries to print something.
-	 */
-	if (m->desc[0] == '\0')
-		val++;
-	return val;
-}
-
-/*  
- * Sort callback for sorting entries by "strength" (basically length)
- */
-private int
-apprentice_sort(const void *a, const void *b)
-{
-	const struct magic_entry *ma = CAST(const struct magic_entry *, a);
-	const struct magic_entry *mb = CAST(const struct magic_entry *, b);
-	size_t sa = apprentice_magic_strength(ma->mp);
-	size_t sb = apprentice_magic_strength(mb->mp);
-	if (sa == sb)
-		return 0;
-	else if (sa > sb)
-		return -1;
-	else
-		return 1;
-}
-
-/*  
- * Shows sorted patterns list in the order which is used for the matching
- */
-private void
-apprentice_list(struct mlist *mlist, int mode)
-{
-	uint32_t magindex = 0;
-	struct mlist *ml;
-	for (ml = mlist->next; ml != mlist; ml = ml->next) {
-		for (magindex = 0; magindex < ml->nmagic; magindex++) {
-			struct magic *m = &ml->magic[magindex];
-			if ((m->flag & mode) != mode) {
-				/* Skip sub-tests */
-				while (magindex + 1 < ml->nmagic &&
-				       ml->magic[magindex + 1].cont_level != 0)
-					++magindex;
-				continue; /* Skip to next top-level test*/
-			}
-
-			/*
-			 * Try to iterate over the tree until we find item with
-			 * description/mimetype.
-			 */
-			while (magindex + 1 < ml->nmagic &&
-			       ml->magic[magindex + 1].cont_level != 0 &&
-			       *ml->magic[magindex].desc == '\0' &&
-			       *ml->magic[magindex].mimetype == '\0')
-				magindex++;
-
-			printf("Strength = %3" SIZE_T_FORMAT "u : %s [%s]\n",
-			    apprentice_magic_strength(m),
-			    ml->magic[magindex].desc,
-			    ml->magic[magindex].mimetype);
-		}
-	}
-}
-
-private void
-set_test_type(struct magic *mstart, struct magic *m)
-{
-	switch (m->type) {
-	case FILE_BYTE:
-	case FILE_SHORT:
-	case FILE_LONG:
-	case FILE_DATE:
-	case FILE_BESHORT:
-	case FILE_BELONG:
-	case FILE_BEDATE:
-	case FILE_LESHORT:
-	case FILE_LELONG:
-	case FILE_LEDATE:
-	case FILE_LDATE:
-	case FILE_BELDATE:
-	case FILE_LELDATE:
-	case FILE_MEDATE:
-	case FILE_MELDATE:
-	case FILE_MELONG:
-	case FILE_QUAD:
-	case FILE_LEQUAD:
-	case FILE_BEQUAD:
-	case FILE_QDATE:
-	case FILE_LEQDATE:
-	case FILE_BEQDATE:
-	case FILE_QLDATE:
-	case FILE_LEQLDATE:
-	case FILE_BEQLDATE:
-	case FILE_FLOAT:
-	case FILE_BEFLOAT:
-	case FILE_LEFLOAT:
-	case FILE_DOUBLE:
-	case FILE_BEDOUBLE:
-	case FILE_LEDOUBLE:
-	case FILE_STRING:
-	case FILE_PSTRING:
-	case FILE_BESTRING16:
-	case FILE_LESTRING16:
-		/* Allow text overrides */
-		if (mstart->str_flags & STRING_TEXTTEST)
-			mstart->flag |= TEXTTEST;
-		else
-			mstart->flag |= BINTEST;
-		break;
-	case FILE_REGEX:
-	case FILE_SEARCH:
-		/* Check for override */
-		if (mstart->str_flags & STRING_BINTEST)
-			mstart->flag |= BINTEST;
-		if (mstart->str_flags & STRING_TEXTTEST)
-			mstart->flag |= TEXTTEST;
-		    
-		if (mstart->flag & (TEXTTEST|BINTEST))
-			break;
-
-		/* binary test if pattern is not text */
-		if (file_looks_utf8(m->value.us, (size_t)m->vallen, NULL,
-		    NULL) <= 0)
-			mstart->flag |= BINTEST;
-		else
-			mstart->flag |= TEXTTEST;
-		break;
-	case FILE_DEFAULT:
-		/* can't deduce anything; we shouldn't see this at the
-		   top level anyway */
-		break;
-	case FILE_INVALID:
-	default:
-		/* invalid search type, but no need to complain here */
-		break;
-	}
-}
-
-/*
- * Load and parse one file.
- */
-private void
-load_1(struct magic_set *ms, int action, const char *fn, int *errs,
-   struct magic_entry **marray, uint32_t *marraycount)
-{
-	char line[BUFSIZ];
-	size_t lineno = 0;
-	FILE *f = fopen(ms->file = fn, "r");
-	if (f == NULL) {
-		if (errno != ENOENT)
-			file_error(ms, errno, "cannot read magic file `%s'",
-				   fn);
-		(*errs)++;
-	} else {
-		/* read and parse this file */
-		for (ms->line = 1;
-		    fgets(line, CAST(int, sizeof(line)), f) != NULL;
-		    ms->line++) {
-			size_t len;
-			len = strlen(line);
-			if (len == 0) /* null line, garbage, etc */
-				continue;
-			if (line[len - 1] == '\n') {
-				lineno++;
-				line[len - 1] = '\0'; /* delete newline */
-			}
-			if (line[0] == '\0')	/* empty, do not parse */
-				continue;
-			if (line[0] == '#')	/* comment, do not parse */
-				continue;
-			if (line[0] == '!' && line[1] == ':') {
-				size_t i;
-
-				for (i = 0; bang[i].name != NULL; i++) {
-					if (len - 2 > bang[i].len &&
-					    memcmp(bang[i].name, line + 2,
-					    bang[i].len) == 0)
-						break;
-				}
-				if (bang[i].name == NULL) {
-					file_error(ms, 0,
-					    "Unknown !: entry `%s'", line);
-					(*errs)++;
-					continue;
-				}
-				if (*marraycount == 0) {
-					file_error(ms, 0,
-					    "No current entry for :!%s type",
-						bang[i].name);
-					(*errs)++;
-					continue;
-				}
-				if ((*bang[i].fun)(ms, 
-				    &(*marray)[*marraycount - 1],
-				    line + bang[i].len + 2) != 0) {
-					(*errs)++;
-					continue;
-				}
-				continue;
-			}
-			if (parse(ms, marray, marraycount, line, lineno,
-			    action) != 0)
-				(*errs)++;
-		}
-
-		(void)fclose(f);
-	}
-}
-
-/*
- * parse a file or directory of files
- * const char *fn: name of magic file or directory
- */
-private int
-cmpstrp(const void *p1, const void *p2)
-{
-        return strcmp(*(char *const *)p1, *(char *const *)p2);
-}
-
-private int
-apprentice_load(struct magic_set *ms, struct magic **magicp, uint32_t *nmagicp,
-    const char *fn, int action)
-{
-	int errs = 0;
-	struct magic_entry *marray;
-	uint32_t marraycount, i, mentrycount = 0, starttest;
-	size_t slen, files = 0, maxfiles = 0;
-	char subfn[MAXPATHLEN], **filearr = NULL, *mfn;
-	struct stat st;
-	DIR *dir;
-	struct dirent *d;
-
-	ms->flags |= MAGIC_CHECK;	/* Enable checks for parsed files */
-
-        maxmagic = MAXMAGIS;
-	if ((marray = CAST(struct magic_entry *, calloc(maxmagic,
-	    sizeof(*marray)))) == NULL) {
-		file_oomem(ms, maxmagic * sizeof(*marray));
-		return -1;
-	}
-	marraycount = 0;
-
-	/* print silly verbose header for USG compat. */
-	if (action == FILE_CHECK)
-		(void)fprintf(stderr, "%s\n", usg_hdr);
-
-	/* load directory or file */
-	if (stat(fn, &st) == 0 && S_ISDIR(st.st_mode)) {
-		dir = opendir(fn);
-		if (!dir) {
-			errs++;
-			goto out;
-		}
-		while ((d = readdir(dir)) != NULL) {
-			(void)snprintf(subfn, sizeof(subfn), "%s/%s",
-			    fn, d->d_name);
-			if (stat(subfn, &st) == -1 || !S_ISREG(st.st_mode))
-				continue;
-			if ((mfn = strdup(subfn)) == NULL) {
-				file_oomem(ms, strlen(subfn));
-				errs++;
-				goto out;
-			}
-			if (files >= maxfiles) {
-				size_t mlen;
-				maxfiles = (maxfiles + 1) * 2;
-				mlen = maxfiles * sizeof(*filearr);
-				if ((filearr = CAST(char **,
-				    realloc(filearr, mlen))) == NULL) {
-					file_oomem(ms, mlen);
-					errs++;
-					goto out;
-				}
-			}
-			filearr[files++] = mfn;
-		}
-		closedir(dir);
-		qsort(filearr, files, sizeof(*filearr), cmpstrp);
-		for (i = 0; i < files; i++) {
-			load_1(ms, action, filearr[i], &errs, &marray,
-			    &marraycount);
-			free(filearr[i]);
-		}
-		free(filearr);
-	} else
-		load_1(ms, action, fn, &errs, &marray, &marraycount);
-	if (errs)
-		goto out;
-
-	/* Set types of tests */
-	for (i = 0; i < marraycount; ) {
-		if (marray[i].mp->cont_level != 0) {
-			i++;
-			continue;
-		}
-
-		starttest = i;
-		do {
-			static const char text[] = "text";
-			static const char binary[] = "binary";
-			static const size_t len = sizeof(text);
-			set_test_type(marray[starttest].mp, marray[i].mp);
-			if ((ms->flags & MAGIC_DEBUG) == 0)
-				continue;
-			(void)fprintf(stderr, "%s%s%s: %s\n",
-			    marray[i].mp->mimetype,
-			    marray[i].mp->mimetype[0] == '\0' ? "" : "; ",
-			    marray[i].mp->desc[0] ? marray[i].mp->desc :
-			    "(no description)",
-			    marray[i].mp->flag & BINTEST ? binary : text);
-			if (marray[i].mp->flag & BINTEST) {
-				char *p = strstr(marray[i].mp->desc, text);
-				if (p && (p == marray[i].mp->desc ||
-				    isspace((unsigned char)p[-1])) &&
-				    (p + len - marray[i].mp->desc == 
-				    MAXstring || (p[len] == '\0' ||
-				    isspace((unsigned char)p[len]))))
-					(void)fprintf(stderr, "*** Possible "
-					    "binary test for text type\n");
-			}
-		} while (++i < marraycount && marray[i].mp->cont_level != 0);
-	}
-
-	qsort(marray, marraycount, sizeof(*marray), apprentice_sort);
-
-	/*
-	 * Make sure that any level 0 "default" line is last (if one exists).
-	 */
-	for (i = 0; i < marraycount; i++) {
-		if (marray[i].mp->cont_level == 0 &&
-		    marray[i].mp->type == FILE_DEFAULT) {
-			while (++i < marraycount)
-				if (marray[i].mp->cont_level == 0)
-					break;
-			if (i != marraycount) {
-				/* XXX - Ugh! */
-				ms->line = marray[i].mp->lineno;
-				file_magwarn(ms,
-				    "level 0 \"default\" did not sort last");
-			}
-			break;					    
-		}
-	}
-
-	for (i = 0; i < marraycount; i++)
-		mentrycount += marray[i].cont_count;
-
-	slen = sizeof(**magicp) * mentrycount;
-	if ((*magicp = CAST(struct magic *, malloc(slen))) == NULL) {
-		file_oomem(ms, slen);
-		errs++;
-		goto out;
-	}
-
-	mentrycount = 0;
-	for (i = 0; i < marraycount; i++) {
-		(void)memcpy(*magicp + mentrycount, marray[i].mp,
-		    marray[i].cont_count * sizeof(**magicp));
-		mentrycount += marray[i].cont_count;
-	}
-out:
-	for (i = 0; i < marraycount; i++)
-		free(marray[i].mp);
-	free(marray);
-	if (errs) {
-		*magicp = NULL;
-		*nmagicp = 0;
-		return errs;
-	} else {
-		*nmagicp = mentrycount;
-		return 0;
-	}
-
-}
-
-/*
- * extend the sign bit if the comparison is to be signed
- */
-protected uint64_t
-file_signextend(struct magic_set *ms, struct magic *m, uint64_t v)
-{
-	if (!(m->flag & UNSIGNED)) {
-		switch(m->type) {
-		/*
-		 * Do not remove the casts below.  They are
-		 * vital.  When later compared with the data,
-		 * the sign extension must have happened.
-		 */
-		case FILE_BYTE:
-			v = (char) v;
-			break;
-		case FILE_SHORT:
-		case FILE_BESHORT:
-		case FILE_LESHORT:
-			v = (short) v;
-			break;
-		case FILE_DATE:
-		case FILE_BEDATE:
-		case FILE_LEDATE:
-		case FILE_MEDATE:
-		case FILE_LDATE:
-		case FILE_BELDATE:
-		case FILE_LELDATE:
-		case FILE_MELDATE:
-		case FILE_LONG:
-		case FILE_BELONG:
-		case FILE_LELONG:
-		case FILE_MELONG:
-		case FILE_FLOAT:
-		case FILE_BEFLOAT:
-		case FILE_LEFLOAT:
-			v = (int32_t) v;
-			break;
-		case FILE_QUAD:
-		case FILE_BEQUAD:
-		case FILE_LEQUAD:
-		case FILE_QDATE:
-		case FILE_QLDATE:
-		case FILE_BEQDATE:
-		case FILE_BEQLDATE:
-		case FILE_LEQDATE:
-		case FILE_LEQLDATE:
-		case FILE_DOUBLE:
-		case FILE_BEDOUBLE:
-		case FILE_LEDOUBLE:
-			v = (int64_t) v;
-			break;
-		case FILE_STRING:
-		case FILE_PSTRING:
-		case FILE_BESTRING16:
-		case FILE_LESTRING16:
-		case FILE_REGEX:
-		case FILE_SEARCH:
-		case FILE_DEFAULT:
-		case FILE_INDIRECT:
-			break;
-		default:
-			if (ms->flags & MAGIC_CHECK)
-			    file_magwarn(ms, "cannot happen: m->type=%d\n",
-				    m->type);
-			return ~0U;
-		}
-	}
-	return v;
-}
-
-private int
-string_modifier_check(struct magic_set *ms, struct magic *m)
-{
-	if ((ms->flags & MAGIC_CHECK) == 0)
-		return 0;
-
-	if (m->type != FILE_PSTRING && (m->str_flags & PSTRING_LEN) != 0) {
-		file_magwarn(ms,
-		    "'/BHhLl' modifiers are only allowed for pascal strings\n");
-		return -1;
-	}
-	switch (m->type) {
-	case FILE_BESTRING16:
-	case FILE_LESTRING16:
-		if (m->str_flags != 0) {
-			file_magwarn(ms,
-			    "no modifiers allowed for 16-bit strings\n");
-			return -1;
-		}
-		break;
-	case FILE_STRING:
-	case FILE_PSTRING:
-		if ((m->str_flags & REGEX_OFFSET_START) != 0) {
-			file_magwarn(ms,
-			    "'/%c' only allowed on regex and search\n",
-			    CHAR_REGEX_OFFSET_START);
-			return -1;
-		}
-		break;
-	case FILE_SEARCH:
-		if (m->str_range == 0) {
-			file_magwarn(ms,
-			    "missing range; defaulting to %d\n",
-                            STRING_DEFAULT_RANGE);
-			m->str_range = STRING_DEFAULT_RANGE;
-			return -1;
-		}
-		break;
-	case FILE_REGEX:
-		if ((m->str_flags & STRING_COMPACT_WHITESPACE) != 0) {
-			file_magwarn(ms, "'/%c' not allowed on regex\n",
-			    CHAR_COMPACT_WHITESPACE);
-			return -1;
-		}
-		if ((m->str_flags & STRING_COMPACT_OPTIONAL_WHITESPACE) != 0) {
-			file_magwarn(ms, "'/%c' not allowed on regex\n",
-			    CHAR_COMPACT_OPTIONAL_WHITESPACE);
-			return -1;
-		}
-		break;
-	default:
-		file_magwarn(ms, "coding error: m->type=%d\n",
-		    m->type);
-		return -1;
-	}
-	return 0;
-}
-
-private int
-get_op(char c)
-{
-	switch (c) {
-	case '&':
-		return FILE_OPAND;
-	case '|':
-		return FILE_OPOR;
-	case '^':
-		return FILE_OPXOR;
-	case '+':
-		return FILE_OPADD;
-	case '-':
-		return FILE_OPMINUS;
-	case '*':
-		return FILE_OPMULTIPLY;
-	case '/':
-		return FILE_OPDIVIDE;
-	case '%':
-		return FILE_OPMODULO;
-	default:
-		return -1;
-	}
-}
-
-#ifdef ENABLE_CONDITIONALS
-private int
-get_cond(const char *l, const char **t)
-{
-	static const struct cond_tbl_s {
-		char name[8];
-		size_t len;
-		int cond;
-	} cond_tbl[] = {
-		{ "if",		2,	COND_IF },
-		{ "elif",	4,	COND_ELIF },
-		{ "else",	4,	COND_ELSE },
-		{ "",		0,	COND_NONE },
-	};
-	const struct cond_tbl_s *p;
-
-	for (p = cond_tbl; p->len; p++) {
-		if (strncmp(l, p->name, p->len) == 0 &&
-		    isspace((unsigned char)l[p->len])) {
-			if (t)
-				*t = l + p->len;
-			break;
-		}
-	}
-	return p->cond;
-}
-
-private int
-check_cond(struct magic_set *ms, int cond, uint32_t cont_level)
-{
-	int last_cond;
-	last_cond = ms->c.li[cont_level].last_cond;
-
-	switch (cond) {
-	case COND_IF:
-		if (last_cond != COND_NONE && last_cond != COND_ELIF) {
-			if (ms->flags & MAGIC_CHECK)
-				file_magwarn(ms, "syntax error: `if'");
-			return -1;
-		}
-		last_cond = COND_IF;
-		break;
-
-	case COND_ELIF:
-		if (last_cond != COND_IF && last_cond != COND_ELIF) {
-			if (ms->flags & MAGIC_CHECK)
-				file_magwarn(ms, "syntax error: `elif'");
-			return -1;
-		}
-		last_cond = COND_ELIF;
-		break;
-
-	case COND_ELSE:
-		if (last_cond != COND_IF && last_cond != COND_ELIF) {
-			if (ms->flags & MAGIC_CHECK)
-				file_magwarn(ms, "syntax error: `else'");
-			return -1;
-		}
-		last_cond = COND_NONE;
-		break;
-
-	case COND_NONE:
-		last_cond = COND_NONE;
-		break;
-	}
-
-	ms->c.li[cont_level].last_cond = last_cond;
-	return 0;
-}
-#endif /* ENABLE_CONDITIONALS */
-
-/*
- * parse one line from magic file, put into magic[index++] if valid
- */
-private int
-parse(struct magic_set *ms, struct magic_entry **mentryp, uint32_t *nmentryp, 
-    const char *line, size_t lineno, int action)
-{
-#ifdef ENABLE_CONDITIONALS
-	static uint32_t last_cont_level = 0;
-#endif
-	size_t i;
-	struct magic_entry *me;
-	struct magic *m;
-	const char *l = line;
-	char *t;
-	int op;
-	uint32_t cont_level;
-
-	cont_level = 0;
-
-	while (*l == '>') {
-		++l;		/* step over */
-		cont_level++; 
-	}
-#ifdef ENABLE_CONDITIONALS
-	if (cont_level == 0 || cont_level > last_cont_level)
-		if (file_check_mem(ms, cont_level) == -1)
-			return -1;
-	last_cont_level = cont_level;
-#endif
-
-#define ALLOC_CHUNK	(size_t)10
-#define ALLOC_INCR	(size_t)200
-
-	if (cont_level != 0) {
-		if (*nmentryp == 0) {
-			file_error(ms, 0, "No current entry for continuation");
-			return -1;
-		}
-		me = &(*mentryp)[*nmentryp - 1];
-		if (me->cont_count == me->max_count) {
-			struct magic *nm;
-			size_t cnt = me->max_count + ALLOC_CHUNK;
-			if ((nm = CAST(struct magic *, realloc(me->mp,
-			    sizeof(*nm) * cnt))) == NULL) {
-				file_oomem(ms, sizeof(*nm) * cnt);
-				return -1;
-			}
-			me->mp = m = nm;
-			me->max_count = CAST(uint32_t, cnt);
-		}
-		m = &me->mp[me->cont_count++];
-		(void)memset(m, 0, sizeof(*m));
-		m->cont_level = cont_level;
-	} else {
-		if (*nmentryp == maxmagic) {
-			struct magic_entry *mp;
-
-			maxmagic += ALLOC_INCR;
-			if ((mp = CAST(struct magic_entry *,
-			    realloc(*mentryp, sizeof(*mp) * maxmagic))) ==
-			    NULL) {
-				file_oomem(ms, sizeof(*mp) * maxmagic);
-				return -1;
-			}
-			(void)memset(&mp[*nmentryp], 0, sizeof(*mp) *
-			    ALLOC_INCR);
-			*mentryp = mp;
-		}
-		me = &(*mentryp)[*nmentryp];
-		if (me->mp == NULL) {
-			size_t len = sizeof(*m) * ALLOC_CHUNK;
-			if ((m = CAST(struct magic *, malloc(len))) == NULL) {
-				file_oomem(ms, len);
-				return -1;
-			}
-			me->mp = m;
-			me->max_count = ALLOC_CHUNK;
-		} else
-			m = me->mp;
-		(void)memset(m, 0, sizeof(*m));
-		m->factor_op = FILE_FACTOR_OP_NONE;
-		m->cont_level = 0;
-		me->cont_count = 1;
-	}
-	m->lineno = CAST(uint32_t, lineno);
-
-	if (*l == '&') {  /* m->cont_level == 0 checked below. */
-                ++l;            /* step over */
-                m->flag |= OFFADD;
-        }
-	if (*l == '(') {
-		++l;		/* step over */
-		m->flag |= INDIR;
-		if (m->flag & OFFADD)
-			m->flag = (m->flag & ~OFFADD) | INDIROFFADD;
-
-		if (*l == '&') {  /* m->cont_level == 0 checked below */
-			++l;            /* step over */
-			m->flag |= OFFADD;
-		}
-	}
-	/* Indirect offsets are not valid at level 0. */
-	if (m->cont_level == 0 && (m->flag & (OFFADD | INDIROFFADD)))
-		if (ms->flags & MAGIC_CHECK)
-			file_magwarn(ms, "relative offset at level 0");
-
-	/* get offset, then skip over it */
-	m->offset = (uint32_t)strtoul(l, &t, 0);
-        if (l == t)
-		if (ms->flags & MAGIC_CHECK)
-			file_magwarn(ms, "offset `%s' invalid", l);
-        l = t;
-
-	if (m->flag & INDIR) {
-		m->in_type = FILE_LONG;
-		m->in_offset = 0;
-		/*
-		 * read [.lbs][+-]nnnnn)
-		 */
-		if (*l == '.') {
-			l++;
-			switch (*l) {
-			case 'l':
-				m->in_type = FILE_LELONG;
-				break;
-			case 'L':
-				m->in_type = FILE_BELONG;
-				break;
-			case 'm':
-				m->in_type = FILE_MELONG;
-				break;
-			case 'h':
-			case 's':
-				m->in_type = FILE_LESHORT;
-				break;
-			case 'H':
-			case 'S':
-				m->in_type = FILE_BESHORT;
-				break;
-			case 'c':
-			case 'b':
-			case 'C':
-			case 'B':
-				m->in_type = FILE_BYTE;
-				break;
-			case 'e':
-			case 'f':
-			case 'g':
-				m->in_type = FILE_LEDOUBLE;
-				break;
-			case 'E':
-			case 'F':
-			case 'G':
-				m->in_type = FILE_BEDOUBLE;
-				break;
-			case 'i':
-				m->in_type = FILE_LEID3;
-				break;
-			case 'I':
-				m->in_type = FILE_BEID3;
-				break;
-			default:
-				if (ms->flags & MAGIC_CHECK)
-					file_magwarn(ms,
-					    "indirect offset type `%c' invalid",
-					    *l);
-				break;
-			}
-			l++;
-		}
-
-		m->in_op = 0;
-		if (*l == '~') {
-			m->in_op |= FILE_OPINVERSE;
-			l++;
-		}
-		if ((op = get_op(*l)) != -1) {
-			m->in_op |= op;
-			l++;
-		}
-		if (*l == '(') {
-			m->in_op |= FILE_OPINDIRECT;
-			l++;
-		}
-		if (isdigit((unsigned char)*l) || *l == '-') {
-			m->in_offset = (int32_t)strtol(l, &t, 0);
-			if (l == t)
-				if (ms->flags & MAGIC_CHECK)
-					file_magwarn(ms,
-					    "in_offset `%s' invalid", l);
-			l = t;
-		}
-		if (*l++ != ')' || 
-		    ((m->in_op & FILE_OPINDIRECT) && *l++ != ')'))
-			if (ms->flags & MAGIC_CHECK)
-				file_magwarn(ms,
-				    "missing ')' in indirect offset");
-	}
-	EATAB;
-
-#ifdef ENABLE_CONDITIONALS
-	m->cond = get_cond(l, &l);
-	if (check_cond(ms, m->cond, cont_level) == -1)
-		return -1;
-
-	EATAB;
-#endif
-
-	if (*l == 'u') {
-		++l;
-		m->flag |= UNSIGNED;
-	}
-
-	m->type = get_type(l, &l);
-	if (m->type == FILE_INVALID) {
-		if (ms->flags & MAGIC_CHECK)
-			file_magwarn(ms, "type `%s' invalid", l);
-		return -1;
-	}
-
-	/* New-style anding: "0 byte&0x80 =0x80 dynamically linked" */
-	/* New and improved: ~ & | ^ + - * / % -- exciting, isn't it? */
-
-	m->mask_op = 0;
-	if (*l == '~') {
-		if (!IS_STRING(m->type))
-			m->mask_op |= FILE_OPINVERSE;
-		else if (ms->flags & MAGIC_CHECK)
-			file_magwarn(ms, "'~' invalid for string types");
-		++l;
-	}
-	m->str_range = 0;
-	m->str_flags = m->type == FILE_PSTRING ? PSTRING_1_LE : 0;
-	if ((op = get_op(*l)) != -1) {
-		if (!IS_STRING(m->type)) {
-			uint64_t val;
-			++l;
-			m->mask_op |= op;
-			val = (uint64_t)strtoull(l, &t, 0);
-			l = t;
-			m->num_mask = file_signextend(ms, m, val);
-			eatsize(&l);
-		}
-		else if (op == FILE_OPDIVIDE) {
-			int have_range = 0;
-			while (!isspace((unsigned char)*++l)) {
-				switch (*l) {
-				case '0':  case '1':  case '2':
-				case '3':  case '4':  case '5':
-				case '6':  case '7':  case '8':
-				case '9':
-					if (have_range &&
-					    (ms->flags & MAGIC_CHECK))
-						file_magwarn(ms,
-						    "multiple ranges");
-					have_range = 1;
-					m->str_range = CAST(uint32_t,
-					    strtoul(l, &t, 0));
-					if (m->str_range == 0)
-						file_magwarn(ms,
-						    "zero range");
-					l = t - 1;
-					break;
-				case CHAR_COMPACT_WHITESPACE:
-					m->str_flags |=
-					    STRING_COMPACT_WHITESPACE;
-					break;
-				case CHAR_COMPACT_OPTIONAL_WHITESPACE:
-					m->str_flags |=
-					    STRING_COMPACT_OPTIONAL_WHITESPACE;
-					break;
-				case CHAR_IGNORE_LOWERCASE:
-					m->str_flags |= STRING_IGNORE_LOWERCASE;
-					break;
-				case CHAR_IGNORE_UPPERCASE:
-					m->str_flags |= STRING_IGNORE_UPPERCASE;
-					break;
-				case CHAR_REGEX_OFFSET_START:
-					m->str_flags |= REGEX_OFFSET_START;
-					break;
-				case CHAR_BINTEST:
-					m->str_flags |= STRING_BINTEST;
-					break;
-				case CHAR_TEXTTEST:
-					m->str_flags |= STRING_TEXTTEST;
-					break;
-				case CHAR_PSTRING_1_LE:
-					if (m->type != FILE_PSTRING)
-						goto bad;
-					m->str_flags = (m->str_flags & ~PSTRING_LEN) | PSTRING_1_LE;
-					break;
-				case CHAR_PSTRING_2_BE:
-					if (m->type != FILE_PSTRING)
-						goto bad;
-					m->str_flags = (m->str_flags & ~PSTRING_LEN) | PSTRING_2_BE;
-					break;
-				case CHAR_PSTRING_2_LE:
-					if (m->type != FILE_PSTRING)
-						goto bad;
-					m->str_flags = (m->str_flags & ~PSTRING_LEN) | PSTRING_2_LE;
-					break;
-				case CHAR_PSTRING_4_BE:
-					if (m->type != FILE_PSTRING)
-						goto bad;
-					m->str_flags = (m->str_flags & ~PSTRING_LEN) | PSTRING_4_BE;
-					break;
-				case CHAR_PSTRING_4_LE:
-					if (m->type != FILE_PSTRING)
-						goto bad;
-					m->str_flags = (m->str_flags & ~PSTRING_LEN) | PSTRING_4_LE;
-					break;
-				case CHAR_PSTRING_LENGTH_INCLUDES_ITSELF:
-					if (m->type != FILE_PSTRING)
-						goto bad;
-					m->str_flags |= PSTRING_LENGTH_INCLUDES_ITSELF;
-					break;
-				bad:
-				default:
-					if (ms->flags & MAGIC_CHECK)
-						file_magwarn(ms,
-						    "string extension `%c' "
-						    "invalid", *l);
-					return -1;
-				}
-				/* allow multiple '/' for readability */
-				if (l[1] == '/' &&
-				    !isspace((unsigned char)l[2]))
-					l++;
-			}
-			if (string_modifier_check(ms, m) == -1)
-				return -1;
-		}
-		else {
-			if (ms->flags & MAGIC_CHECK)
-				file_magwarn(ms, "invalid string op: %c", *t);
-			return -1;
-		}
-	}
-	/*
-	 * We used to set mask to all 1's here, instead let's just not do
-	 * anything if mask = 0 (unless you have a better idea)
-	 */
-	EATAB;
-  
-	switch (*l) {
-	case '>':
-	case '<':
-  		m->reln = *l;
-  		++l;
-		if (*l == '=') {
-			if (ms->flags & MAGIC_CHECK) {
-				file_magwarn(ms, "%c= not supported",
-				    m->reln);
-				return -1;
-			}
-		   ++l;
-		}
-		break;
-	/* Old-style anding: "0 byte &0x80 dynamically linked" */
-	case '&':
-	case '^':
-	case '=':
-  		m->reln = *l;
-  		++l;
-		if (*l == '=') {
-		   /* HP compat: ignore &= etc. */
-		   ++l;
-		}
-		break;
-	case '!':
-		m->reln = *l;
-		++l;
-		break;
-	default:
-  		m->reln = '=';	/* the default relation */
-		if (*l == 'x' && ((isascii((unsigned char)l[1]) && 
-		    isspace((unsigned char)l[1])) || !l[1])) {
-			m->reln = *l;
-			++l;
-		}
-		break;
-	}
-	/*
-	 * Grab the value part, except for an 'x' reln.
-	 */
-	if (m->reln != 'x' && getvalue(ms, m, &l, action))
-		return -1;
-
-	/*
-	 * TODO finish this macro and start using it!
-	 * #define offsetcheck {if (offset > HOWMANY-1) 
-	 *	magwarn("offset too big"); }
-	 */
-
-	/*
-	 * Now get last part - the description
-	 */
-	EATAB;
-	if (l[0] == '\b') {
-		++l;
-		m->flag |= NOSPACE;
-	} else if ((l[0] == '\\') && (l[1] == 'b')) {
-		++l;
-		++l;
-		m->flag |= NOSPACE;
-	}
-	for (i = 0; (m->desc[i++] = *l++) != '\0' && i < sizeof(m->desc); )
-		continue;
-	if (i == sizeof(m->desc)) {
-		m->desc[sizeof(m->desc) - 1] = '\0';
-		if (ms->flags & MAGIC_CHECK)
-			file_magwarn(ms, "description `%s' truncated", m->desc);
-	}
-
-        /*
-	 * We only do this check while compiling, or if any of the magic
-	 * files were not compiled.
-         */
-        if (ms->flags & MAGIC_CHECK) {
-		if (check_format(ms, m) == -1)
-			return -1;
-	}
-#ifndef COMPILE_ONLY
-	if (action == FILE_CHECK) {
-		file_mdump(m);
-	}
-#endif
-	m->mimetype[0] = '\0';		/* initialise MIME type to none */
-	if (m->cont_level == 0)
-		++(*nmentryp);		/* make room for next */
-	return 0;
-}
-
-/*
- * parse a STRENGTH annotation line from magic file, put into magic[index - 1]
- * if valid
- */
-private int
-parse_strength(struct magic_set *ms, struct magic_entry *me, const char *line)
-{
-	const char *l = line;
-	char *el;
-	unsigned long factor;
-	struct magic *m = &me->mp[0];
-
-	if (m->factor_op != FILE_FACTOR_OP_NONE) {
-		file_magwarn(ms,
-		    "Current entry already has a strength type: %c %d",
-		    m->factor_op, m->factor);
-		return -1;
-	}
-	EATAB;
-	switch (*l) {
-	case FILE_FACTOR_OP_NONE:
-	case FILE_FACTOR_OP_PLUS:
-	case FILE_FACTOR_OP_MINUS:
-	case FILE_FACTOR_OP_TIMES:
-	case FILE_FACTOR_OP_DIV:
-		m->factor_op = *l++;
-		break;
-	default:
-		file_magwarn(ms, "Unknown factor op `%c'", *l);
-		return -1;
-	}
-	EATAB;
-	factor = strtoul(l, &el, 0);
-	if (factor > 255) {
-		file_magwarn(ms, "Too large factor `%lu'", factor);
-		goto out;
-	}
-	if (*el && !isspace((unsigned char)*el)) {
-		file_magwarn(ms, "Bad factor `%s'", l);
-		goto out;
-	}
-	m->factor = (uint8_t)factor;
-	if (m->factor == 0 && m->factor_op == FILE_FACTOR_OP_DIV) {
-		file_magwarn(ms, "Cannot have factor op `%c' and factor %u",
-		    m->factor_op, m->factor);
-		goto out;
-	}
-	return 0;
-out:
-	m->factor_op = FILE_FACTOR_OP_NONE;
-	m->factor = 0;
-	return -1;
-}
-
-/*
- * Parse an Apple CREATOR/TYPE annotation from magic file and put it into
- * magic[index - 1]
- */
-private int
-parse_apple(struct magic_set *ms, struct magic_entry *me, const char *line)
-{
-	size_t i;
-	const char *l = line;
-	struct magic *m = &me->mp[me->cont_count == 0 ? 0 : me->cont_count - 1];
-
-	if (m->apple[0] != '\0') {
-		file_magwarn(ms, "Current entry already has a APPLE type "
-		    "`%.8s', new type `%s'", m->mimetype, l);
-		return -1;
-	}	
-
-	EATAB;
-	for (i = 0; *l && ((isascii((unsigned char)*l) &&
-	    isalnum((unsigned char)*l)) || strchr("-+/.", *l)) &&
-	    i < sizeof(m->apple); m->apple[i++] = *l++)
-		continue;
-	if (i == sizeof(m->apple) && *l) {
-		/* We don't need to NUL terminate here, printing handles it */
-		if (ms->flags & MAGIC_CHECK)
-			file_magwarn(ms, "APPLE type `%s' truncated %"
-			    SIZE_T_FORMAT "u", line, i);
-	}
-
-	if (i > 0)
-		return 0;
-	else
-		return -1;
-}
-
-/*
- * parse a MIME annotation line from magic file, put into magic[index - 1]
- * if valid
- */
-private int
-parse_mime(struct magic_set *ms, struct magic_entry *me, const char *line)
-{
-	size_t i;
-	const char *l = line;
-	struct magic *m = &me->mp[me->cont_count == 0 ? 0 : me->cont_count - 1];
-
-	if (m->mimetype[0] != '\0') {
-		file_magwarn(ms, "Current entry already has a MIME type `%s',"
-		    " new type `%s'", m->mimetype, l);
-		return -1;
-	}	
-
-	EATAB;
-	for (i = 0; *l && ((isascii((unsigned char)*l) &&
-	    isalnum((unsigned char)*l)) || strchr("-+/.", *l)) &&
-	    i < sizeof(m->mimetype); m->mimetype[i++] = *l++)
-		continue;
-	if (i == sizeof(m->mimetype)) {
-		m->mimetype[sizeof(m->mimetype) - 1] = '\0';
-		if (ms->flags & MAGIC_CHECK)
-			file_magwarn(ms, "MIME type `%s' truncated %"
-			    SIZE_T_FORMAT "u", m->mimetype, i);
-	} else
-		m->mimetype[i] = '\0';
-
-	if (i > 0)
-		return 0;
-	else
-		return -1;
-}
-
-private int
-check_format_type(const char *ptr, int type)
-{
-	int quad = 0;
-	if (*ptr == '\0') {
-		/* Missing format string; bad */
-		return -1;
-	}
-
-	switch (type) {
-	case FILE_FMT_QUAD:
-		quad = 1;
-		/*FALLTHROUGH*/
-	case FILE_FMT_NUM:
-		if (*ptr == '-')
-			ptr++;
-		if (*ptr == '.')
-			ptr++;
-		while (isdigit((unsigned char)*ptr)) ptr++;
-		if (*ptr == '.')
-			ptr++;
-		while (isdigit((unsigned char)*ptr)) ptr++;
-		if (quad) {
-			if (*ptr++ != 'l')
-				return -1;
-			if (*ptr++ != 'l')
-				return -1;
-		}
-	
-		switch (*ptr++) {
-		case 'l':
-			switch (*ptr++) {
-			case 'i':
-			case 'd':
-			case 'u':
-			case 'x':
-			case 'X':
-				return 0;
-			default:
-				return -1;
-			}
-		
-		case 'h':
-			switch (*ptr++) {
-			case 'h':
-				switch (*ptr++) {
-				case 'i':
-				case 'd':
-				case 'u':
-				case 'x':
-				case 'X':
-					return 0;
-				default:
-					return -1;
-				}
-			case 'd':
-				return 0;
-			default:
-				return -1;
-			}
-
-		case 'i':
-		case 'c':
-		case 'd':
-		case 'u':
-		case 'x':
-		case 'X':
-			return 0;
-			
-		default:
-			return -1;
-		}
-		
-	case FILE_FMT_FLOAT:
-	case FILE_FMT_DOUBLE:
-		if (*ptr == '-')
-			ptr++;
-		if (*ptr == '.')
-			ptr++;
-		while (isdigit((unsigned char)*ptr)) ptr++;
-		if (*ptr == '.')
-			ptr++;
-		while (isdigit((unsigned char)*ptr)) ptr++;
-	
-		switch (*ptr++) {
-		case 'e':
-		case 'E':
-		case 'f':
-		case 'F':
-		case 'g':
-		case 'G':
-			return 0;
-			
-		default:
-			return -1;
-		}
-		
-
-	case FILE_FMT_STR:
-		if (*ptr == '-')
-			ptr++;
-		while (isdigit((unsigned char )*ptr))
-			ptr++;
-		if (*ptr == '.') {
-			ptr++;
-			while (isdigit((unsigned char )*ptr))
-				ptr++;
-		}
-		
-		switch (*ptr++) {
-		case 's':
-			return 0;
-		default:
-			return -1;
-		}
-		
-	default:
-		/* internal error */
-		abort();
-	}
-	/*NOTREACHED*/
-	return -1;
-}
-	
-/*
- * Check that the optional printf format in description matches
- * the type of the magic.
- */
-private int
-check_format(struct magic_set *ms, struct magic *m)
-{
-	char *ptr;
-
-	for (ptr = m->desc; *ptr; ptr++)
-		if (*ptr == '%')
-			break;
-	if (*ptr == '\0') {
-		/* No format string; ok */
-		return 1;
-	}
-
-	assert(file_nformats == file_nnames);
-
-	if (m->type >= file_nformats) {
-		file_magwarn(ms, "Internal error inconsistency between "
-		    "m->type and format strings");		
-		return -1;
-	}
-	if (file_formats[m->type] == FILE_FMT_NONE) {
-		file_magwarn(ms, "No format string for `%s' with description "
-		    "`%s'", m->desc, file_names[m->type]);
-		return -1;
-	}
-
-	ptr++;
-	if (check_format_type(ptr, file_formats[m->type]) == -1) {
-		/*
-		 * TODO: this error message is unhelpful if the format
-		 * string is not one character long
-		 */
-		file_magwarn(ms, "Printf format `%c' is not valid for type "
-		    "`%s' in description `%s'", *ptr ? *ptr : '?',
-		    file_names[m->type], m->desc);
-		return -1;
-	}
-	
-	for (; *ptr; ptr++) {
-		if (*ptr == '%') {
-			file_magwarn(ms,
-			    "Too many format strings (should have at most one) "
-			    "for `%s' with description `%s'",
-			    file_names[m->type], m->desc);
-			return -1;
-		}
-	}
-	return 0;
-}
-
-/* 
- * Read a numeric value from a pointer, into the value union of a magic 
- * pointer, according to the magic type.  Update the string pointer to point 
- * just after the number read.  Return 0 for success, non-zero for failure.
- */
-private int
-getvalue(struct magic_set *ms, struct magic *m, const char **p, int action)
-{
-	switch (m->type) {
-	case FILE_BESTRING16:
-	case FILE_LESTRING16:
-	case FILE_STRING:
-	case FILE_PSTRING:
-	case FILE_REGEX:
-	case FILE_SEARCH:
-		*p = getstr(ms, m, *p, action == FILE_COMPILE);
-		if (*p == NULL) {
-			if (ms->flags & MAGIC_CHECK)
-				file_magwarn(ms, "cannot get string from `%s'",
-				    m->value.s);
-			return -1;
-		}
-		return 0;
-	case FILE_FLOAT:
-	case FILE_BEFLOAT:
-	case FILE_LEFLOAT:
-		if (m->reln != 'x') {
-			char *ep;
-#ifdef HAVE_STRTOF
-			m->value.f = strtof(*p, &ep);
-#else
-			m->value.f = (float)strtod(*p, &ep);
-#endif
-			*p = ep;
-		}
-		return 0;
-	case FILE_DOUBLE:
-	case FILE_BEDOUBLE:
-	case FILE_LEDOUBLE:
-		if (m->reln != 'x') {
-			char *ep;
-			m->value.d = strtod(*p, &ep);
-			*p = ep;
-		}
-		return 0;
-	default:
-		if (m->reln != 'x') {
-			char *ep;
-			m->value.q = file_signextend(ms, m,
-			    (uint64_t)strtoull(*p, &ep, 0));
-			*p = ep;
-			eatsize(p);
-		}
-		return 0;
-	}
-}
-
-/*
- * Convert a string containing C character escapes.  Stop at an unescaped
- * space or tab.
- * Copy the converted version to "m->value.s", and the length in m->vallen.
- * Return updated scan pointer as function result. Warn if set.
- */
-private const char *
-getstr(struct magic_set *ms, struct magic *m, const char *s, int warn)
-{
-	const char *origs = s;
-	char	*p = m->value.s;
-	size_t  plen = sizeof(m->value.s);
-	char 	*origp = p;
-	char	*pmax = p + plen - 1;
-	int	c;
-	int	val;
-
-	while ((c = *s++) != '\0') {
-		if (isspace((unsigned char) c))
-			break;
-		if (p >= pmax) {
-			file_error(ms, 0, "string too long: `%s'", origs);
-			return NULL;
-		}
-		if (c == '\\') {
-			switch(c = *s++) {
-
-			case '\0':
-				if (warn)
-					file_magwarn(ms, "incomplete escape");
-				goto out;
-
-			case '\t':
-				if (warn) {
-					file_magwarn(ms,
-					    "escaped tab found, use \\t instead");
-					warn = 0;	/* already did */
-				}
-				/*FALLTHROUGH*/
-			default:
-				if (warn) {
-					if (isprint((unsigned char)c)) {
-						/* Allow escaping of 
-						 * ``relations'' */
-						if (strchr("<>&^=!", c) == NULL
-						    && (m->type != FILE_REGEX ||
-						    strchr("[]().*?^$|{}", c)
-						    == NULL)) {
-							file_magwarn(ms, "no "
-							    "need to escape "
-							    "`%c'", c);
-						}
-					} else {
-						file_magwarn(ms,
-						    "unknown escape sequence: "
-						    "\\%03o", c);
-					}
-				}
-				/*FALLTHROUGH*/
-			/* space, perhaps force people to use \040? */
-			case ' ':
-#if 0
-			/*
-			 * Other things people escape, but shouldn't need to,
-			 * so we disallow them
-			 */
-			case '\'':
-			case '"':
-			case '?':
-#endif
-			/* Relations */
-			case '>':
-			case '<':
-			case '&':
-			case '^':
-			case '=':
-			case '!':
-			/* and baskslash itself */
-			case '\\':
-				*p++ = (char) c;
-				break;
-
-			case 'a':
-				*p++ = '\a';
-				break;
-
-			case 'b':
-				*p++ = '\b';
-				break;
-
-			case 'f':
-				*p++ = '\f';
-				break;
-
-			case 'n':
-				*p++ = '\n';
-				break;
-
-			case 'r':
-				*p++ = '\r';
-				break;
-
-			case 't':
-				*p++ = '\t';
-				break;
-
-			case 'v':
-				*p++ = '\v';
-				break;
-
-			/* \ and up to 3 octal digits */
-			case '0':
-			case '1':
-			case '2':
-			case '3':
-			case '4':
-			case '5':
-			case '6':
-			case '7':
-				val = c - '0';
-				c = *s++;  /* try for 2 */
-				if (c >= '0' && c <= '7') {
-					val = (val << 3) | (c - '0');
-					c = *s++;  /* try for 3 */
-					if (c >= '0' && c <= '7')
-						val = (val << 3) | (c-'0');
-					else
-						--s;
-				}
-				else
-					--s;
-				*p++ = (char)val;
-				break;
-
-			/* \x and up to 2 hex digits */
-			case 'x':
-				val = 'x';	/* Default if no digits */
-				c = hextoint(*s++);	/* Get next char */
-				if (c >= 0) {
-					val = c;
-					c = hextoint(*s++);
-					if (c >= 0)
-						val = (val << 4) + c;
-					else
-						--s;
-				} else
-					--s;
-				*p++ = (char)val;
-				break;
-			}
-		} else
-			*p++ = (char)c;
-	}
-out:
-	*p = '\0';
-	m->vallen = CAST(unsigned char, (p - origp));
-	if (m->type == FILE_PSTRING)
-		m->vallen += file_pstring_length_size(m);
-	return s;
-}
-
-
-/* Single hex char to int; -1 if not a hex char. */
-private int
-hextoint(int c)
-{
-	if (!isascii((unsigned char) c))
-		return -1;
-	if (isdigit((unsigned char) c))
-		return c - '0';
-	if ((c >= 'a') && (c <= 'f'))
-		return c + 10 - 'a';
-	if (( c>= 'A') && (c <= 'F'))
-		return c + 10 - 'A';
-	return -1;
-}
-
-
-/*
- * Print a string containing C character escapes.
- */
-protected void
-file_showstr(FILE *fp, const char *s, size_t len)
-{
-	char	c;
-
-	for (;;) {
-		if (len == ~0U) {
-			c = *s++;
-			if (c == '\0')
-				break;
-		}
-		else  {
-			if (len-- == 0)
-				break;
-			c = *s++;
-		}
-		if (c >= 040 && c <= 0176)	/* TODO isprint && !iscntrl */
-			(void) fputc(c, fp);
-		else {
-			(void) fputc('\\', fp);
-			switch (c) {
-			case '\a':
-				(void) fputc('a', fp);
-				break;
-
-			case '\b':
-				(void) fputc('b', fp);
-				break;
-
-			case '\f':
-				(void) fputc('f', fp);
-				break;
-
-			case '\n':
-				(void) fputc('n', fp);
-				break;
-
-			case '\r':
-				(void) fputc('r', fp);
-				break;
-
-			case '\t':
-				(void) fputc('t', fp);
-				break;
-
-			case '\v':
-				(void) fputc('v', fp);
-				break;
-
-			default:
-				(void) fprintf(fp, "%.3o", c & 0377);
-				break;
-			}
-		}
-	}
-}
-
-/*
- * eatsize(): Eat the size spec from a number [eg. 10UL]
- */
-private void
-eatsize(const char **p)
-{
-	const char *l = *p;
-
-	if (LOWCASE(*l) == 'u') 
-		l++;
-
-	switch (LOWCASE(*l)) {
-	case 'l':    /* long */
-	case 's':    /* short */
-	case 'h':    /* short */
-	case 'b':    /* char/byte */
-	case 'c':    /* char/byte */
-		l++;
-		/*FALLTHROUGH*/
-	default:
-		break;
-	}
-
-	*p = l;
-}
-
-/*
- * handle a compiled file.
- */
-private int
-apprentice_map(struct magic_set *ms, struct magic **magicp, uint32_t *nmagicp,
-    const char *fn)
-{
-	int fd;
-	struct stat st;
-	uint32_t *ptr;
-	uint32_t version;
-	int needsbyteswap;
-	char *dbname = NULL;
-	void *mm = NULL;
-
-	dbname = mkdbname(ms, fn, 0);
-	if (dbname == NULL)
-		goto error2;
-
-	if ((fd = open(dbname, O_RDONLY|O_BINARY)) == -1)
-		goto error2;
-
-	if (fstat(fd, &st) == -1) {
-		file_error(ms, errno, "cannot stat `%s'", dbname);
-		goto error1;
-	}
-	if (st.st_size < 8) {
-		file_error(ms, 0, "file `%s' is too small", dbname);
-		goto error1;
-	}
-
-#ifdef QUICK
-	if ((mm = mmap(0, (size_t)st.st_size, PROT_READ|PROT_WRITE,
-	    MAP_PRIVATE|MAP_FILE, fd, (off_t)0)) == MAP_FAILED) {
-		file_error(ms, errno, "cannot map `%s'", dbname);
-		goto error1;
-	}
-#define RET	2
-#else
-	if ((mm = CAST(void *, malloc((size_t)st.st_size))) == NULL) {
-		file_oomem(ms, (size_t)st.st_size);
-		goto error1;
-	}
-	if (read(fd, mm, (size_t)st.st_size) != (ssize_t)st.st_size) {
-		file_badread(ms);
-		goto error1;
-	}
-#define RET	1
-#endif
-	*magicp = CAST(struct magic *, mm);
-	(void)close(fd);
-	fd = -1;
-	ptr = (uint32_t *)(void *)*magicp;
-	if (*ptr != MAGICNO) {
-		if (swap4(*ptr) != MAGICNO) {
-			file_error(ms, 0, "bad magic in `%s'", dbname);
-			goto error1;
-		}
-		needsbyteswap = 1;
-	} else
-		needsbyteswap = 0;
-	if (needsbyteswap)
-		version = swap4(ptr[1]);
-	else
-		version = ptr[1];
-	if (version != VERSIONNO) {
-		file_error(ms, 0, "File %d.%d supports only version %d magic "
-		    "files. `%s' is version %d", FILE_VERSION_MAJOR, patchlevel,
-		    VERSIONNO, dbname, version);
-		goto error1;
-	}
-	*nmagicp = (uint32_t)(st.st_size / sizeof(struct magic));
-	if (*nmagicp > 0)
-		(*nmagicp)--;
-	(*magicp)++;
-	if (needsbyteswap)
-		byteswap(*magicp, *nmagicp);
-	free(dbname);
-	return RET;
-
-error1:
-	if (fd != -1)
-		(void)close(fd);
-	if (mm) {
-#ifdef QUICK
-		(void)munmap((void *)mm, (size_t)st.st_size);
-#else
-		free(mm);
-#endif
-	} else {
-		*magicp = NULL;
-		*nmagicp = 0;
-	}
-error2:
-	free(dbname);
-	return -1;
-}
-
-private const uint32_t ar[] = {
-    MAGICNO, VERSIONNO
-};
-/*
- * handle an mmaped file.
- */
-private int
-apprentice_compile(struct magic_set *ms, struct magic **magicp,
-    uint32_t *nmagicp, const char *fn)
-{
-	int fd;
-	char *dbname;
-	int rv = -1;
-
-	dbname = mkdbname(ms, fn, 1);
-
-	if (dbname == NULL) 
-		goto out;
-
-	if ((fd = open(dbname, O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, 0644)) == -1) {
-		file_error(ms, errno, "cannot open `%s'", dbname);
-		goto out;
-	}
-
-	if (write(fd, ar, sizeof(ar)) != (ssize_t)sizeof(ar)) {
-		file_error(ms, errno, "error writing `%s'", dbname);
-		goto out;
-	}
-
-	if (lseek(fd, (off_t)sizeof(struct magic), SEEK_SET)
-	    != sizeof(struct magic)) {
-		file_error(ms, errno, "error seeking `%s'", dbname);
-		goto out;
-	}
-
-	if (write(fd, *magicp, (sizeof(struct magic) * *nmagicp)) 
-	    != (ssize_t)(sizeof(struct magic) * *nmagicp)) {
-		file_error(ms, errno, "error writing `%s'", dbname);
-		goto out;
-	}
-
-	(void)close(fd);
-	rv = 0;
-out:
-	free(dbname);
-	return rv;
-}
-
-private const char ext[] = ".mgc";
-/*
- * make a dbname
- */
-private char *
-mkdbname(struct magic_set *ms, const char *fn, int strip)
-{
-	const char *p, *q;
-	char *buf;
-
-	if (strip) {
-		if ((p = strrchr(fn, '/')) != NULL)
-			fn = ++p;
-	}
-
-	for (q = fn; *q; q++)
-		continue;
-	/* Look for .mgc */
-	for (p = ext + sizeof(ext) - 1; p >= ext && q >= fn; p--, q--)
-		if (*p != *q)
-			break;
-
-	/* Did not find .mgc, restore q */
-	if (p >= ext)
-		while (*q)
-			q++;
-
-	q++;
-	/* Compatibility with old code that looked in .mime */
-	if (ms->flags & MAGIC_MIME) {
-		asprintf(&buf, "%.*s.mime%s", (int)(q - fn), fn, ext);
-		if (access(buf, R_OK) != -1) {
-			ms->flags &= MAGIC_MIME_TYPE;
-			return buf;
-		}
-		free(buf);
-	}
-	asprintf(&buf, "%.*s%s", (int)(q - fn), fn, ext);
-
-	/* Compatibility with old code that looked in .mime */
-	if (strstr(p, ".mime") != NULL)
-		ms->flags &= MAGIC_MIME_TYPE;
-	return buf;
-}
-
-/*
- * Byteswap an mmap'ed file if needed
- */
-private void
-byteswap(struct magic *magic, uint32_t nmagic)
-{
-	uint32_t i;
-	for (i = 0; i < nmagic; i++)
-		bs1(&magic[i]);
-}
-
-/*
- * swap a short
- */
-private uint16_t
-swap2(uint16_t sv)
-{
-	uint16_t rv;
-	uint8_t *s = (uint8_t *)(void *)&sv; 
-	uint8_t *d = (uint8_t *)(void *)&rv; 
-	d[0] = s[1];
-	d[1] = s[0];
-	return rv;
-}
-
-/*
- * swap an int
- */
-private uint32_t
-swap4(uint32_t sv)
-{
-	uint32_t rv;
-	uint8_t *s = (uint8_t *)(void *)&sv; 
-	uint8_t *d = (uint8_t *)(void *)&rv; 
-	d[0] = s[3];
-	d[1] = s[2];
-	d[2] = s[1];
-	d[3] = s[0];
-	return rv;
-}
-
-/*
- * swap a quad
- */
-private uint64_t
-swap8(uint64_t sv)
-{
-	uint64_t rv;
-	uint8_t *s = (uint8_t *)(void *)&sv; 
-	uint8_t *d = (uint8_t *)(void *)&rv; 
-#if 0
-	d[0] = s[3];
-	d[1] = s[2];
-	d[2] = s[1];
-	d[3] = s[0];
-	d[4] = s[7];
-	d[5] = s[6];
-	d[6] = s[5];
-	d[7] = s[4];
-#else
-	d[0] = s[7];
-	d[1] = s[6];
-	d[2] = s[5];
-	d[3] = s[4];
-	d[4] = s[3];
-	d[5] = s[2];
-	d[6] = s[1];
-	d[7] = s[0];
-#endif
-	return rv;
-}
-
-/*
- * byteswap a single magic entry
- */
-private void
-bs1(struct magic *m)
-{
-	m->cont_level = swap2(m->cont_level);
-	m->offset = swap4((uint32_t)m->offset);
-	m->in_offset = swap4((uint32_t)m->in_offset);
-	m->lineno = swap4((uint32_t)m->lineno);
-	if (IS_STRING(m->type)) {
-		if (m->type == FILE_PSTRING)
-			printf("flags! %d\n", m->str_flags);
-		m->str_range = swap4(m->str_range);
-		m->str_flags = swap4(m->str_flags);
-	}
-	else {
-		m->value.q = swap8(m->value.q);
-		m->num_mask = swap8(m->num_mask);
-	}
-}
-
-protected size_t 
-file_pstring_length_size(const struct magic *m)
-{
-	switch (m->str_flags & PSTRING_LEN) {
-	case PSTRING_1_LE:
-		return 1;
-	case PSTRING_2_LE:
-	case PSTRING_2_BE:
-		return 2;
-	case PSTRING_4_LE:
-	case PSTRING_4_BE:
-		return 4;
-	default:
-		abort();	/* Impossible */
-		return 1;
-	}
-}
-protected size_t
-file_pstring_get_length(const struct magic *m, const char *s)
-{
-	size_t len = 0;
-
-	switch (m->str_flags & PSTRING_LEN) {
-	case PSTRING_1_LE:
-		len = *s;
-		break;
-	case PSTRING_2_LE:
-		len = (s[1] << 8) | s[0];
-		break;
-	case PSTRING_2_BE:
-		len = (s[0] << 8) | s[1];
-		break;
-	case PSTRING_4_LE:
-		len = (s[3] << 24) | (s[2] << 16) | (s[1] << 8) | s[0];
-		break;
-	case PSTRING_4_BE:
-		len = (s[0] << 24) | (s[1] << 16) | (s[2] << 8) | s[3];
-		break;
-	default:
-		abort();	/* Impossible */
-	}
-
-	if (m->str_flags & PSTRING_LENGTH_INCLUDES_ITSELF)
-		len -= file_pstring_length_size(m);
-
-	return len;
-}

Deleted: trunk/contrib/file/apptype.c
===================================================================
--- trunk/contrib/file/apptype.c	2014-06-30 11:58:41 UTC (rev 6698)
+++ trunk/contrib/file/apptype.c	2014-06-30 11:58:43 UTC (rev 6699)
@@ -1,168 +0,0 @@
-/*
- * Adapted from: apptype.c, Written by Eberhard Mattes and put into the
- * public domain
- * 
- * Notes: 1. Qualify the filename so that DosQueryAppType does not do extraneous
- * searches.
- * 
- * 2. DosQueryAppType will return FAPPTYP_DOS on a file ending with ".com"
- * (other than an OS/2 exe or Win exe with this name). Eberhard Mattes
- * remarks Tue, 6 Apr 93: Moreover, it reports the type of the (new and very
- * bug ridden) Win Emacs as "OS/2 executable".
- * 
- * 3. apptype() uses the filename if given, otherwise a tmp file is created with
- * the contents of buf. If buf is not the complete file, apptype can
- * incorrectly identify the exe type. The "-z" option of "file" is the reason
- * for this ugly code.
- */
-
-/*
- * amai: Darrel Hankerson did the changes described here.
- * 
- * It remains to check the validity of comments (2.) since it's referred to an
- * "old" OS/2 version.
- * 
- */
-
-#include "file.h"
-
-#ifndef	lint
-FILE_RCSID("@(#)$File: apptype.c,v 1.11 2009/02/04 18:24:32 christos Exp $")
-#endif /* lint */
-
-#include <stdlib.h>
-#include <string.h>
-
-#ifdef __EMX__
-#include <io.h>
-#define INCL_DOSSESMGR
-#define INCL_DOSERRORS
-#define INCL_DOSFILEMGR
-#include <os2.h>
-typedef ULONG   APPTYPE;
-
-protected int
-file_os2_apptype(struct magic_set *ms, const char *fn, const void *buf,
-    size_t nb)
-{
-	APPTYPE         rc, type;
-	char            path[_MAX_PATH], drive[_MAX_DRIVE], dir[_MAX_DIR],
-			fname[_MAX_FNAME], ext[_MAX_EXT];
-	char           *filename;
-	FILE           *fp;
-
-	if (fn)
-		filename = strdup(fn);
-	else if ((filename = tempnam("./", "tmp")) == NULL) {
-		file_error(ms, errno, "cannot create tempnam");
-		return -1;
-	}
-	/* qualify the filename to prevent extraneous searches */
-	_splitpath(filename, drive, dir, fname, ext);
-	(void)sprintf(path, "%s%s%s%s", drive,
-		(*dir == '\0') ? "./" : dir,
-		fname,
-		(*ext == '\0') ? "." : ext);
-
-	if (fn == NULL) {
-		if ((fp = fopen(path, "wb")) == NULL) {
-			file_error(ms, errno, "cannot open tmp file `%s'", path);
-			return -1;
-		}
-		if (fwrite(buf, 1, nb, fp) != nb) {
-			file_error(ms, errno, "cannot write tmp file `%s'",
-			    path);
-			return -1;
-		}
-		(void)fclose(fp);
-	}
-	rc = DosQueryAppType((unsigned char *)path, &type);
-
-	if (fn == NULL) {
-		unlink(path);
-		free(filename);
-	}
-#if 0
-	if (rc == ERROR_INVALID_EXE_SIGNATURE)
-		printf("%s: not an executable file\n", fname);
-	else if (rc == ERROR_FILE_NOT_FOUND)
-		printf("%s: not found\n", fname);
-	else if (rc == ERROR_ACCESS_DENIED)
-		printf("%s: access denied\n", fname);
-	else if (rc != 0)
-		printf("%s: error code = %lu\n", fname, rc);
-	else
-#else
-
-	/*
-	 * for our purpose here it's sufficient to just ignore the error and
-	 * return w/o success (=0)
-	 */
-
-	if (rc)
-		return (0);
-
-#endif
-
-	if (type & FAPPTYP_32BIT)
-		if (file_printf(ms, "32-bit ") == -1)
-			return -1;
-	if (type & FAPPTYP_PHYSDRV) {
-		if (file_printf(ms, "physical device driver") == -1)
-			return -1;
-	} else if (type & FAPPTYP_VIRTDRV) {
-		if (file_printf(ms, "virtual device driver") == -1)
-			return -1;
-	} else if (type & FAPPTYP_DLL) {
-		if (type & FAPPTYP_PROTDLL)
-			if (file_printf(ms, "protected ") == -1)
-				return -1;
-		if (file_printf(ms, "DLL") == -1)
-			return -1;
-	} else if (type & (FAPPTYP_WINDOWSREAL | FAPPTYP_WINDOWSPROT)) {
-		if (file_printf(ms, "Windows executable") == -1)
-			return -1;
-	} else if (type & FAPPTYP_DOS) {
-		/*
-		 * The API routine is partially broken on filenames ending
-		 * ".com".
-		 */
-		if (stricmp(ext, ".com") == 0)
-			if (strncmp((const char *)buf, "MZ", 2))
-				return (0);
-		if (file_printf(ms, "DOS executable") == -1)
-			return -1;
-		/* ---------------------------------------- */
-		/* Might learn more from the magic(4) entry */
-		if (file_printf(ms, ", magic(4)-> ") == -1)
-			return -1;
-		return (0);
-		/* ---------------------------------------- */
-	} else if (type & FAPPTYP_BOUND) {
-		if (file_printf(ms, "bound executable") == -1)
-			return -1;
-	} else if ((type & 7) == FAPPTYP_WINDOWAPI) {
-		if (file_printf(ms, "PM executable") == -1)
-			return -1;
-	} else if (file_printf(ms, "OS/2 executable") == -1)
-		return -1;
-
-	switch (type & (FAPPTYP_NOTWINDOWCOMPAT |
-			FAPPTYP_WINDOWCOMPAT |
-			FAPPTYP_WINDOWAPI)) {
-	case FAPPTYP_NOTWINDOWCOMPAT:
-		if (file_printf(ms, " [NOTWINDOWCOMPAT]") == -1)
-			return -1;
-		break;
-	case FAPPTYP_WINDOWCOMPAT:
-		if (file_printf(ms, " [WINDOWCOMPAT]") == -1)
-			return -1;
-		break;
-	case FAPPTYP_WINDOWAPI:
-		if (file_printf(ms, " [WINDOWAPI]") == -1)
-			return -1;
-		break;
-	}
-	return 1;
-}
-#endif

Deleted: trunk/contrib/file/ascmagic.c
===================================================================
--- trunk/contrib/file/ascmagic.c	2014-06-30 11:58:41 UTC (rev 6698)
+++ trunk/contrib/file/ascmagic.c	2014-06-30 11:58:43 UTC (rev 6699)
@@ -1,403 +0,0 @@
-/*
- * Copyright (c) Ian F. Darwin 1986-1995.
- * Software written by Ian F. Darwin and others;
- * maintained 1995-present by Christos Zoulas and others.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice immediately at the beginning of the file, without modification,
- *    this list of conditions, and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-/*
- * ASCII magic -- file types that we know based on keywords
- * that can appear anywhere in the file.
- *
- * Extensively modified by Eric Fischer <enf at pobox.com> in July, 2000,
- * to handle character codes other than ASCII on a unified basis.
- */
-
-#include "file.h"
-
-#ifndef	lint
-FILE_RCSID("@(#)$File: ascmagic.c,v 1.77 2010/11/30 14:58:53 rrt Exp $")
-#endif	/* lint */
-
-#include "magic.h"
-#include <string.h>
-#include <memory.h>
-#include <ctype.h>
-#include <stdlib.h>
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#include "names.h"
-
-#define MAXLINELEN 300	/* longest sane line length */
-#define ISSPC(x) ((x) == ' ' || (x) == '\t' || (x) == '\r' || (x) == '\n' \
-		  || (x) == 0x85 || (x) == '\f')
-
-private int ascmatch(const unsigned char *, const unichar *, size_t);
-private unsigned char *encode_utf8(unsigned char *, size_t, unichar *, size_t);
-private size_t trim_nuls(const unsigned char *, size_t);
-
-/*
- * Undo the NUL-termination kindly provided by process()
- * but leave at least one byte to look at
- */
-private size_t
-trim_nuls(const unsigned char *buf, size_t nbytes)
-{
-	while (nbytes > 1 && buf[nbytes - 1] == '\0')
-		nbytes--;
-
-	return nbytes;
-}
-
-protected int
-file_ascmagic(struct magic_set *ms, const unsigned char *buf, size_t nbytes)
-{
-	unichar *ubuf = NULL;
-	size_t ulen;
-	int rv = 1;
-
-	const char *code = NULL;
-	const char *code_mime = NULL;
-	const char *type = NULL;
-
-	if (ms->flags & MAGIC_APPLE)
-		return 0;
-
-	nbytes = trim_nuls(buf, nbytes);
-
-	/* If file doesn't look like any sort of text, give up. */
-	if (file_encoding(ms, buf, nbytes, &ubuf, &ulen, &code, &code_mime,
-	    &type) == 0) {
-		rv = 0;
-		goto done;
-	}
-
-	rv = file_ascmagic_with_encoding(ms, buf, nbytes, ubuf, ulen, code,
-	    type);
-
- done:
-	if (ubuf)
-		free(ubuf);
-
-	return rv;
-}
-
-protected int
-file_ascmagic_with_encoding(struct magic_set *ms, const unsigned char *buf,
-    size_t nbytes, unichar *ubuf, size_t ulen, const char *code,
-    const char *type)
-{
-	unsigned char *utf8_buf = NULL, *utf8_end;
-	size_t mlen, i;
-	const struct names *p;
-	int rv = -1;
-	int mime = ms->flags & MAGIC_MIME;
-
-	const char *subtype = NULL;
-	const char *subtype_mime = NULL;
-
-	int has_escapes = 0;
-	int has_backspace = 0;
-	int seen_cr = 0;
-
-	int n_crlf = 0;
-	int n_lf = 0;
-	int n_cr = 0;
-	int n_nel = 0;
-	int score, curtype;
-
-	size_t last_line_end = (size_t)-1;
-	int has_long_lines = 0;
-
-	if (ms->flags & MAGIC_APPLE)
-		return 0;
-
-	nbytes = trim_nuls(buf, nbytes);
-
-	/* If we have fewer than 2 bytes, give up. */
-	if (nbytes <= 1) {
-		rv = 0;
-		goto done;
-	}
-
-	if ((ms->flags & MAGIC_NO_CHECK_SOFT) == 0) {
-		/* Convert ubuf to UTF-8 and try text soft magic */
-		/* malloc size is a conservative overestimate; could be
-		   improved, or at least realloced after conversion. */
-		mlen = ulen * 6;
-		if ((utf8_buf = CAST(unsigned char *, malloc(mlen))) == NULL) {
-			file_oomem(ms, mlen);
-			goto done;
-		}
-		if ((utf8_end = encode_utf8(utf8_buf, mlen, ubuf, ulen)) == NULL)
-			goto done;
-		if ((rv = file_softmagic(ms, utf8_buf, (size_t)(utf8_end - utf8_buf),
-					 TEXTTEST)) != 0)
-			goto done;
-		else
-			rv = -1;
-	}
-
-	/* look for tokens from names.h - this is expensive! */
-	if ((ms->flags & MAGIC_NO_CHECK_TOKENS) != 0)
-		goto subtype_identified;
-
-	i = 0;
-	score = 0;
-	curtype = -1;
-	while (i < ulen) {
-		size_t end;
-
-		/* skip past any leading space */
-		while (i < ulen && ISSPC(ubuf[i]))
-			i++;
-		if (i >= ulen)
-			break;
-
-		/* find the next whitespace */
-		for (end = i + 1; end < nbytes; end++)
-			if (ISSPC(ubuf[end]))
-				break;
-
-		/* compare the word thus isolated against the token list */
-		for (p = names; p < names + NNAMES; p++) {
-			if (ascmatch((const unsigned char *)p->name, ubuf + i,
-			    end - i)) {
-				if (curtype == -1)
-					curtype = p->type;
-				else if (curtype != p->type) {
-					score = p->score;
-					curtype = p->type;
-				} else
-					score += p->score;
-				if (score > 1) {
-					subtype = types[p->type].human;
-					subtype_mime = types[p->type].mime;
-					goto subtype_identified;
-				}
-			}
-		}
-
-		i = end;
-	}
-
-subtype_identified:
-
-	/* Now try to discover other details about the file. */
-	for (i = 0; i < ulen; i++) {
-		if (ubuf[i] == '\n') {
-			if (seen_cr)
-				n_crlf++;
-			else
-				n_lf++;
-			last_line_end = i;
-		} else if (seen_cr)
-			n_cr++;
-
-		seen_cr = (ubuf[i] == '\r');
-		if (seen_cr)
-			last_line_end = i;
-
-		if (ubuf[i] == 0x85) { /* X3.64/ECMA-43 "next line" character */
-			n_nel++;
-			last_line_end = i;
-		}
-
-		/* If this line is _longer_ than MAXLINELEN, remember it. */
-		if (i > last_line_end + MAXLINELEN)
-			has_long_lines = 1;
-
-		if (ubuf[i] == '\033')
-			has_escapes = 1;
-		if (ubuf[i] == '\b')
-			has_backspace = 1;
-	}
-
-	/* Beware, if the data has been truncated, the final CR could have
-	   been followed by a LF.  If we have HOWMANY bytes, it indicates
-	   that the data might have been truncated, probably even before
-	   this function was called. */
-	if (seen_cr && nbytes < HOWMANY)
-		n_cr++;
-
-	if (strcmp(type, "binary") == 0) {
-		rv = 0;
-		goto done;
-	}
-	if (mime) {
-		if ((mime & MAGIC_MIME_TYPE) != 0) {
-			if (subtype_mime) {
-				if (file_printf(ms, "%s", subtype_mime) == -1)
-					goto done;
-			} else {
-				if (file_printf(ms, "text/plain") == -1)
-					goto done;
-			}
-		}
-	} else {
-		if (file_printf(ms, "%s", code) == -1)
-			goto done;
-
-		if (subtype) {
-			if (file_printf(ms, " %s", subtype) == -1)
-				goto done;
-		}
-
-		if (file_printf(ms, " %s", type) == -1)
-			goto done;
-
-		if (has_long_lines)
-			if (file_printf(ms, ", with very long lines") == -1)
-				goto done;
-
-		/*
-		 * Only report line terminators if we find one other than LF,
-		 * or if we find none at all.
-		 */
-		if ((n_crlf == 0 && n_cr == 0 && n_nel == 0 && n_lf == 0) ||
-		    (n_crlf != 0 || n_cr != 0 || n_nel != 0)) {
-			if (file_printf(ms, ", with") == -1)
-				goto done;
-
-			if (n_crlf == 0 && n_cr == 0 && n_nel == 0 && n_lf == 0) {
-				if (file_printf(ms, " no") == -1)
-					goto done;
-			} else {
-				if (n_crlf) {
-					if (file_printf(ms, " CRLF") == -1)
-						goto done;
-					if (n_cr || n_lf || n_nel)
-						if (file_printf(ms, ",") == -1)
-							goto done;
-				}
-				if (n_cr) {
-					if (file_printf(ms, " CR") == -1)
-						goto done;
-					if (n_lf || n_nel)
-						if (file_printf(ms, ",") == -1)
-							goto done;
-				}
-				if (n_lf) {
-					if (file_printf(ms, " LF") == -1)
-						goto done;
-					if (n_nel)
-						if (file_printf(ms, ",") == -1)
-							goto done;
-				}
-				if (n_nel)
-					if (file_printf(ms, " NEL") == -1)
-						goto done;
-			}
-
-			if (file_printf(ms, " line terminators") == -1)
-				goto done;
-		}
-
-		if (has_escapes)
-			if (file_printf(ms, ", with escape sequences") == -1)
-				goto done;
-		if (has_backspace)
-			if (file_printf(ms, ", with overstriking") == -1)
-				goto done;
-	}
-	rv = 1;
-done:
-	if (utf8_buf)
-		free(utf8_buf);
-
-	return rv;
-}
-
-private int
-ascmatch(const unsigned char *s, const unichar *us, size_t ulen)
-{
-	size_t i;
-
-	for (i = 0; i < ulen; i++) {
-		if (s[i] != us[i])
-			return 0;
-	}
-
-	if (s[i])
-		return 0;
-	else
-		return 1;
-}
-
-/*
- * Encode Unicode string as UTF-8, returning pointer to character
- * after end of string, or NULL if an invalid character is found.
- */
-private unsigned char *
-encode_utf8(unsigned char *buf, size_t len, unichar *ubuf, size_t ulen)
-{
-	size_t i;
-	unsigned char *end = buf + len;
-
-	for (i = 0; i < ulen; i++) {
-		if (ubuf[i] <= 0x7f) {
-			if (end - buf < 1)
-				return NULL;
-			*buf++ = (unsigned char)ubuf[i];
-		} else if (ubuf[i] <= 0x7ff) {
-			if (end - buf < 2)
-				return NULL;
-			*buf++ = (unsigned char)((ubuf[i] >> 6) + 0xc0);
-			*buf++ = (unsigned char)((ubuf[i] & 0x3f) + 0x80);
-		} else if (ubuf[i] <= 0xffff) {
-			if (end - buf < 3)
-				return NULL;
-			*buf++ = (unsigned char)((ubuf[i] >> 12) + 0xe0);
-			*buf++ = (unsigned char)(((ubuf[i] >> 6) & 0x3f) + 0x80);
-			*buf++ = (unsigned char)((ubuf[i] & 0x3f) + 0x80);
-		} else if (ubuf[i] <= 0x1fffff) {
-			if (end - buf < 4)
-				return NULL;
-			*buf++ = (unsigned char)((ubuf[i] >> 18) + 0xf0);
-			*buf++ = (unsigned char)(((ubuf[i] >> 12) & 0x3f) + 0x80);
-			*buf++ = (unsigned char)(((ubuf[i] >>  6) & 0x3f) + 0x80);
-			*buf++ = (unsigned char)((ubuf[i] & 0x3f) + 0x80);
-		} else if (ubuf[i] <= 0x3ffffff) {
-			if (end - buf < 5)
-				return NULL;
-			*buf++ = (unsigned char)((ubuf[i] >> 24) + 0xf8);
-			*buf++ = (unsigned char)(((ubuf[i] >> 18) & 0x3f) + 0x80);
-			*buf++ = (unsigned char)(((ubuf[i] >> 12) & 0x3f) + 0x80);
-			*buf++ = (unsigned char)(((ubuf[i] >>  6) & 0x3f) + 0x80);
-			*buf++ = (unsigned char)((ubuf[i] & 0x3f) + 0x80);
-		} else if (ubuf[i] <= 0x7fffffff) {
-			if (end - buf < 6)
-				return NULL;
-			*buf++ = (unsigned char)((ubuf[i] >> 30) + 0xfc);
-			*buf++ = (unsigned char)(((ubuf[i] >> 24) & 0x3f) + 0x80);
-			*buf++ = (unsigned char)(((ubuf[i] >> 18) & 0x3f) + 0x80);
-			*buf++ = (unsigned char)(((ubuf[i] >> 12) & 0x3f) + 0x80);
-			*buf++ = (unsigned char)(((ubuf[i] >>  6) & 0x3f) + 0x80);
-			*buf++ = (unsigned char)((ubuf[i] & 0x3f) + 0x80);
-		} else /* Invalid character */
-			return NULL;
-	}
-
-	return buf;
-}

Deleted: trunk/contrib/file/asprintf.c
===================================================================
--- trunk/contrib/file/asprintf.c	2014-06-30 11:58:41 UTC (rev 6698)
+++ trunk/contrib/file/asprintf.c	2014-06-30 11:58:43 UTC (rev 6699)
@@ -1,45 +0,0 @@
-/*
- * Copyright (c) Ian F. Darwin 1986-1995.
- * Software written by Ian F. Darwin and others;
- * maintained 1995-present by Christos Zoulas and others.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice immediately at the beginning of the file, without modification,
- *    this list of conditions, and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *  
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include "file.h"
-
-#ifndef lint
-FILE_RCSID("@(#)$File: asprintf.c,v 1.4 2010/07/21 16:47:17 christos Exp $")
-#endif
-
-int asprintf(char **ptr, const char *fmt, ...)
-{
-  va_list vargs;
-  int retval;
-
-  va_start(vargs, fmt);
-  retval = vasprintf(ptr, fmt, vargs);
-  va_end(vargs);
-
-  return retval;
-}

Deleted: trunk/contrib/file/cdf.c
===================================================================
--- trunk/contrib/file/cdf.c	2014-06-30 11:58:41 UTC (rev 6698)
+++ trunk/contrib/file/cdf.c	2014-06-30 11:58:43 UTC (rev 6699)
@@ -1,1288 +0,0 @@
-/*-
- * Copyright (c) 2008 Christos Zoulas
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
- * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-/*
- * Parse Composite Document Files, the format used in Microsoft Office
- * document files before they switched to zipped XML.
- * Info from: http://sc.openoffice.org/compdocfileformat.pdf
- *
- * N.B. This is the "Composite Document File" format, and not the
- * "Compound Document Format", nor the "Channel Definition Format".
- */
-
-#include "file.h"
-
-#ifndef lint
-FILE_RCSID("@(#)$File: cdf.c,v 1.39 2010/07/22 21:59:42 christos Exp $")
-#endif
-
-#include <assert.h>
-#ifdef CDF_DEBUG
-#include <err.h>
-#endif
-#include <stdlib.h>
-#include <unistd.h>
-#include <string.h>
-#include <time.h>
-#include <ctype.h>
-#ifdef HAVE_LIMITS_H
-#include <limits.h>
-#endif
-
-#ifndef EFTYPE
-#define EFTYPE EINVAL
-#endif
-
-#include "cdf.h"
-
-#ifndef __arraycount
-#define __arraycount(a) (sizeof(a) / sizeof(a[0]))
-#endif
-
-#ifdef CDF_DEBUG
-#define DPRINTF(a) printf a, fflush(stdout)
-#else
-#define DPRINTF(a)
-#endif
-
-static union {
-	char s[4];
-	uint32_t u;
-} cdf_bo;
-
-#define NEED_SWAP	(cdf_bo.u == (uint32_t)0x01020304)
-
-#define CDF_TOLE8(x)	((uint64_t)(NEED_SWAP ? cdf_tole8(x) : (uint64_t)(x)))
-#define CDF_TOLE4(x)	((uint32_t)(NEED_SWAP ? cdf_tole4(x) : (uint32_t)(x)))
-#define CDF_TOLE2(x)	((uint16_t)(NEED_SWAP ? cdf_tole2(x) : (uint16_t)(x)))
-#define CDF_GETUINT32(x, y)	cdf_getuint32(x, y)
-
-/*
- * grab a uint32_t from a possibly unaligned address, and return it in
- * the native host order.
- */
-static uint32_t
-cdf_getuint32(const uint8_t *p, size_t offs)
-{
-	uint32_t rv;
-	(void)memcpy(&rv, p + offs * sizeof(uint32_t), sizeof(rv));
-	return CDF_TOLE4(rv);
-}
-
-/*
- * swap a short
- */
-uint16_t
-cdf_tole2(uint16_t sv)
-{
-	uint16_t rv;
-	uint8_t *s = (uint8_t *)(void *)&sv;
-	uint8_t *d = (uint8_t *)(void *)&rv;
-	d[0] = s[1];
-	d[1] = s[0];
-	return rv;
-}
-
-/*
- * swap an int
- */
-uint32_t
-cdf_tole4(uint32_t sv)
-{
-	uint32_t rv;
-	uint8_t *s = (uint8_t *)(void *)&sv;
-	uint8_t *d = (uint8_t *)(void *)&rv;
-	d[0] = s[3];
-	d[1] = s[2];
-	d[2] = s[1];
-	d[3] = s[0];
-	return rv;
-}
-
-/*
- * swap a quad
- */
-uint64_t
-cdf_tole8(uint64_t sv)
-{
-	uint64_t rv;
-	uint8_t *s = (uint8_t *)(void *)&sv;
-	uint8_t *d = (uint8_t *)(void *)&rv;
-	d[0] = s[7];
-	d[1] = s[6];
-	d[2] = s[5];
-	d[3] = s[4];
-	d[4] = s[3];
-	d[5] = s[2];
-	d[6] = s[1];
-	d[7] = s[0];
-	return rv;
-}
-
-#define CDF_UNPACK(a)	\
-    (void)memcpy(&(a), &buf[len], sizeof(a)), len += sizeof(a)
-#define CDF_UNPACKA(a)	\
-    (void)memcpy((a), &buf[len], sizeof(a)), len += sizeof(a)
-
-void
-cdf_swap_header(cdf_header_t *h)
-{
-	size_t i;
-
-	h->h_magic = CDF_TOLE8(h->h_magic);
-	h->h_uuid[0] = CDF_TOLE8(h->h_uuid[0]);
-	h->h_uuid[1] = CDF_TOLE8(h->h_uuid[1]);
-	h->h_revision = CDF_TOLE2(h->h_revision);
-	h->h_version = CDF_TOLE2(h->h_version);
-	h->h_byte_order = CDF_TOLE2(h->h_byte_order);
-	h->h_sec_size_p2 = CDF_TOLE2(h->h_sec_size_p2);
-	h->h_short_sec_size_p2 = CDF_TOLE2(h->h_short_sec_size_p2);
-	h->h_num_sectors_in_sat = CDF_TOLE4(h->h_num_sectors_in_sat);
-	h->h_secid_first_directory = CDF_TOLE4(h->h_secid_first_directory);
-	h->h_min_size_standard_stream =
-	    CDF_TOLE4(h->h_min_size_standard_stream);
-	h->h_secid_first_sector_in_short_sat =
-	    CDF_TOLE4((uint32_t)h->h_secid_first_sector_in_short_sat);
-	h->h_num_sectors_in_short_sat =
-	    CDF_TOLE4(h->h_num_sectors_in_short_sat);
-	h->h_secid_first_sector_in_master_sat =
-	    CDF_TOLE4((uint32_t)h->h_secid_first_sector_in_master_sat);
-	h->h_num_sectors_in_master_sat =
-	    CDF_TOLE4(h->h_num_sectors_in_master_sat);
-	for (i = 0; i < __arraycount(h->h_master_sat); i++)
-		h->h_master_sat[i] = CDF_TOLE4((uint32_t)h->h_master_sat[i]);
-}
-
-void
-cdf_unpack_header(cdf_header_t *h, char *buf)
-{
-	size_t i;
-	size_t len = 0;
-
-	CDF_UNPACK(h->h_magic);
-	CDF_UNPACKA(h->h_uuid);
-	CDF_UNPACK(h->h_revision);
-	CDF_UNPACK(h->h_version);
-	CDF_UNPACK(h->h_byte_order);
-	CDF_UNPACK(h->h_sec_size_p2);
-	CDF_UNPACK(h->h_short_sec_size_p2);
-	CDF_UNPACKA(h->h_unused0);
-	CDF_UNPACK(h->h_num_sectors_in_sat);
-	CDF_UNPACK(h->h_secid_first_directory);
-	CDF_UNPACKA(h->h_unused1);
-	CDF_UNPACK(h->h_min_size_standard_stream);
-	CDF_UNPACK(h->h_secid_first_sector_in_short_sat);
-	CDF_UNPACK(h->h_num_sectors_in_short_sat);
-	CDF_UNPACK(h->h_secid_first_sector_in_master_sat);
-	CDF_UNPACK(h->h_num_sectors_in_master_sat);
-	for (i = 0; i < __arraycount(h->h_master_sat); i++)
-		CDF_UNPACK(h->h_master_sat[i]);
-}
-
-void
-cdf_swap_dir(cdf_directory_t *d)
-{
-	d->d_namelen = CDF_TOLE2(d->d_namelen);
-	d->d_left_child = CDF_TOLE4((uint32_t)d->d_left_child);
-	d->d_right_child = CDF_TOLE4((uint32_t)d->d_right_child);
-	d->d_storage = CDF_TOLE4((uint32_t)d->d_storage);
-	d->d_storage_uuid[0] = CDF_TOLE8(d->d_storage_uuid[0]);
-	d->d_storage_uuid[1] = CDF_TOLE8(d->d_storage_uuid[1]);
-	d->d_flags = CDF_TOLE4(d->d_flags);
-	d->d_created = CDF_TOLE8((uint64_t)d->d_created);
-	d->d_modified = CDF_TOLE8((uint64_t)d->d_modified);
-	d->d_stream_first_sector = CDF_TOLE4((uint32_t)d->d_stream_first_sector);
-	d->d_size = CDF_TOLE4(d->d_size);
-}
-
-void
-cdf_swap_class(cdf_classid_t *d)
-{
-	d->cl_dword = CDF_TOLE4(d->cl_dword);
-	d->cl_word[0] = CDF_TOLE2(d->cl_word[0]);
-	d->cl_word[1] = CDF_TOLE2(d->cl_word[1]);
-}
-
-void
-cdf_unpack_dir(cdf_directory_t *d, char *buf)
-{
-	size_t len = 0;
-
-	CDF_UNPACKA(d->d_name);
-	CDF_UNPACK(d->d_namelen);
-	CDF_UNPACK(d->d_type);
-	CDF_UNPACK(d->d_color);
-	CDF_UNPACK(d->d_left_child);
-	CDF_UNPACK(d->d_right_child);
-	CDF_UNPACK(d->d_storage);
-	CDF_UNPACKA(d->d_storage_uuid);
-	CDF_UNPACK(d->d_flags);
-	CDF_UNPACK(d->d_created);
-	CDF_UNPACK(d->d_modified);
-	CDF_UNPACK(d->d_stream_first_sector);
-	CDF_UNPACK(d->d_size);
-	CDF_UNPACK(d->d_unused0);
-}
-
-static int
-cdf_check_stream_offset(const cdf_stream_t *sst, const void *p, size_t tail,
-    int line)
-{
-	const char *b = (const char *)sst->sst_tab;
-	const char *e = ((const char *)p) + tail;
-	(void)&line;
-	if (e >= b && (size_t)(e - b) < sst->sst_dirlen * sst->sst_len)
-		return 0;
-	DPRINTF(("%d: offset begin %p end %p %" SIZE_T_FORMAT "u"
-	    " >= %" SIZE_T_FORMAT "u [%" SIZE_T_FORMAT "u %"
-	    SIZE_T_FORMAT "u]\n", line, b, e, (size_t)(e - b),
-	    sst->sst_dirlen * sst->sst_len, sst->sst_dirlen, sst->sst_len));
-	errno = EFTYPE;
-	return -1;
-}
-
-static ssize_t
-cdf_read(const cdf_info_t *info, off_t off, void *buf, size_t len)
-{
-	size_t siz = (size_t)off + len;
-
-	if ((off_t)(off + len) != (off_t)siz) {
-		errno = EINVAL;
-		return -1;
-	}
-
-	if (info->i_buf != NULL && info->i_len >= siz) {
-		(void)memcpy(buf, &info->i_buf[off], len);
-		return (ssize_t)len;
-	}
-
-	if (info->i_fd == -1)
-		return -1;
-
-	if (lseek(info->i_fd, off, SEEK_SET) == (off_t)-1)
-		return -1;
-
-	if (read(info->i_fd, buf, len) != (ssize_t)len)
-		return -1;
-
-	return (ssize_t)len;
-}
-
-int
-cdf_read_header(const cdf_info_t *info, cdf_header_t *h)
-{
-	char buf[512];
-
-	(void)memcpy(cdf_bo.s, "\01\02\03\04", 4);
-	if (cdf_read(info, (off_t)0, buf, sizeof(buf)) == -1)
-		return -1;
-	cdf_unpack_header(h, buf);
-	cdf_swap_header(h);
-	if (h->h_magic != CDF_MAGIC) {
-		DPRINTF(("Bad magic 0x%" INT64_T_FORMAT "x != 0x%"
-		    INT64_T_FORMAT "x\n",
-		    (unsigned long long)h->h_magic,
-		    (unsigned long long)CDF_MAGIC));
-		goto out;
-	}
-	if (h->h_sec_size_p2 > 20) {
-		DPRINTF(("Bad sector size 0x%u\n", h->h_sec_size_p2));
-		goto out;
-	}
-	if (h->h_short_sec_size_p2 > 20) {
-		DPRINTF(("Bad short sector size 0x%u\n",
-		    h->h_short_sec_size_p2));
-		goto out;
-	}
-	return 0;
-out:
-	errno = EFTYPE;
-	return -1;
-}
-
-
-ssize_t
-cdf_read_sector(const cdf_info_t *info, void *buf, size_t offs, size_t len,
-    const cdf_header_t *h, cdf_secid_t id)
-{
-	assert((size_t)CDF_SEC_SIZE(h) == len);
-	return cdf_read(info, (off_t)CDF_SEC_POS(h, id),
-	    ((char *)buf) + offs, len);
-}
-
-ssize_t
-cdf_read_short_sector(const cdf_stream_t *sst, void *buf, size_t offs,
-    size_t len, const cdf_header_t *h, cdf_secid_t id)
-{
-	assert((size_t)CDF_SHORT_SEC_SIZE(h) == len);
-	(void)memcpy(((char *)buf) + offs,
-	    ((const char *)sst->sst_tab) + CDF_SHORT_SEC_POS(h, id), len);
-	return len;
-}
-
-/*
- * Read the sector allocation table.
- */
-int
-cdf_read_sat(const cdf_info_t *info, cdf_header_t *h, cdf_sat_t *sat)
-{
-	size_t i, j, k;
-	size_t ss = CDF_SEC_SIZE(h);
-	cdf_secid_t *msa, mid, sec;
-	size_t nsatpersec = (ss / sizeof(mid)) - 1;
-
-	for (i = 0; i < __arraycount(h->h_master_sat); i++)
-		if (h->h_master_sat[i] == CDF_SECID_FREE)
-			break;
-
-#define CDF_SEC_LIMIT (UINT32_MAX / (4 * ss))
-	if (h->h_num_sectors_in_master_sat > CDF_SEC_LIMIT / nsatpersec ||
-	    i > CDF_SEC_LIMIT) {
-		DPRINTF(("Number of sectors in master SAT too big %u %"
-		    SIZE_T_FORMAT "u\n", h->h_num_sectors_in_master_sat, i));
-		errno = EFTYPE;
-		return -1;
-	}
-
-	sat->sat_len = h->h_num_sectors_in_master_sat * nsatpersec + i;
-	DPRINTF(("sat_len = %" SIZE_T_FORMAT "u ss = %" SIZE_T_FORMAT "u\n",
-	    sat->sat_len, ss));
-	if ((sat->sat_tab = CAST(cdf_secid_t *, calloc(sat->sat_len, ss)))
-	    == NULL)
-		return -1;
-
-	for (i = 0; i < __arraycount(h->h_master_sat); i++) {
-		if (h->h_master_sat[i] < 0)
-			break;
-		if (cdf_read_sector(info, sat->sat_tab, ss * i, ss, h,
-		    h->h_master_sat[i]) != (ssize_t)ss) {
-			DPRINTF(("Reading sector %d", h->h_master_sat[i]));
-			goto out1;
-		}
-	}
-
-	if ((msa = CAST(cdf_secid_t *, calloc(1, ss))) == NULL)
-		goto out1;
-
-	mid = h->h_secid_first_sector_in_master_sat;
-	for (j = 0; j < h->h_num_sectors_in_master_sat; j++) {
-		if (mid < 0)
-			goto out;
-		if (j >= CDF_LOOP_LIMIT) {
-			DPRINTF(("Reading master sector loop limit"));
-			errno = EFTYPE;
-			goto out2;
-		}
-		if (cdf_read_sector(info, msa, 0, ss, h, mid) != (ssize_t)ss) {
-			DPRINTF(("Reading master sector %d", mid));
-			goto out2;
-		}
-		for (k = 0; k < nsatpersec; k++, i++) {
-			sec = CDF_TOLE4((uint32_t)msa[k]);
-			if (sec < 0)
-				goto out;
-			if (i >= sat->sat_len) {
-			    DPRINTF(("Out of bounds reading MSA %u >= %u",
-				i, sat->sat_len));
-			    errno = EFTYPE;
-			    goto out2;
-			}
-			if (cdf_read_sector(info, sat->sat_tab, ss * i, ss, h,
-			    sec) != (ssize_t)ss) {
-				DPRINTF(("Reading sector %d",
-				    CDF_TOLE4(msa[k])));
-				goto out2;
-			}
-		}
-		mid = CDF_TOLE4((uint32_t)msa[nsatpersec]);
-	}
-out:
-	sat->sat_len = i;
-	free(msa);
-	return 0;
-out2:
-	free(msa);
-out1:
-	free(sat->sat_tab);
-	return -1;
-}
-
-size_t
-cdf_count_chain(const cdf_sat_t *sat, cdf_secid_t sid, size_t size)
-{
-	size_t i, j;
-	cdf_secid_t maxsector = (cdf_secid_t)(sat->sat_len * size);
-
-	DPRINTF(("Chain:"));
-	for (j = i = 0; sid >= 0; i++, j++) {
-		DPRINTF((" %d", sid));
-		if (j >= CDF_LOOP_LIMIT) {
-			DPRINTF(("Counting chain loop limit"));
-			errno = EFTYPE;
-			return (size_t)-1;
-		}
-		if (sid > maxsector) {
-			DPRINTF(("Sector %d > %d\n", sid, maxsector));
-			errno = EFTYPE;
-			return (size_t)-1;
-		}
-		sid = CDF_TOLE4((uint32_t)sat->sat_tab[sid]);
-	}
-	DPRINTF(("\n"));
-	return i;
-}
-
-int
-cdf_read_long_sector_chain(const cdf_info_t *info, const cdf_header_t *h,
-    const cdf_sat_t *sat, cdf_secid_t sid, size_t len, cdf_stream_t *scn)
-{
-	size_t ss = CDF_SEC_SIZE(h), i, j;
-	ssize_t nr;
-	scn->sst_len = cdf_count_chain(sat, sid, ss);
-	scn->sst_dirlen = len;
-
-	if (scn->sst_len == (size_t)-1)
-		return -1;
-
-	scn->sst_tab = calloc(scn->sst_len, ss);
-	if (scn->sst_tab == NULL)
-		return -1;
-
-	for (j = i = 0; sid >= 0; i++, j++) {
-		if (j >= CDF_LOOP_LIMIT) {
-			DPRINTF(("Read long sector chain loop limit"));
-			errno = EFTYPE;
-			goto out;
-		}
-		if (i >= scn->sst_len) {
-			DPRINTF(("Out of bounds reading long sector chain "
-			    "%u > %u\n", i, scn->sst_len));
-			errno = EFTYPE;
-			goto out;
-		}
-		if ((nr = cdf_read_sector(info, scn->sst_tab, i * ss, ss, h,
-		    sid)) != (ssize_t)ss) {
-			if (i == scn->sst_len - 1 && nr > 0) {
-				/* Last sector might be truncated */
-				return 0;
-			}
-			DPRINTF(("Reading long sector chain %d", sid));
-			goto out;
-		}
-		sid = CDF_TOLE4((uint32_t)sat->sat_tab[sid]);
-	}
-	return 0;
-out:
-	free(scn->sst_tab);
-	return -1;
-}
-
-int
-cdf_read_short_sector_chain(const cdf_header_t *h,
-    const cdf_sat_t *ssat, const cdf_stream_t *sst,
-    cdf_secid_t sid, size_t len, cdf_stream_t *scn)
-{
-	size_t ss = CDF_SHORT_SEC_SIZE(h), i, j;
-	scn->sst_len = cdf_count_chain(ssat, sid, CDF_SEC_SIZE(h));
-	scn->sst_dirlen = len;
-
-	if (sst->sst_tab == NULL || scn->sst_len == (size_t)-1)
-		return -1;
-
-	scn->sst_tab = calloc(scn->sst_len, ss);
-	if (scn->sst_tab == NULL)
-		return -1;
-
-	for (j = i = 0; sid >= 0; i++, j++) {
-		if (j >= CDF_LOOP_LIMIT) {
-			DPRINTF(("Read short sector chain loop limit"));
-			errno = EFTYPE;
-			goto out;
-		}
-		if (i >= scn->sst_len) {
-			DPRINTF(("Out of bounds reading short sector chain "
-			    "%u > %u\n", i, scn->sst_len));
-			errno = EFTYPE;
-			goto out;
-		}
-		if (cdf_read_short_sector(sst, scn->sst_tab, i * ss, ss, h,
-		    sid) != (ssize_t)ss) {
-			DPRINTF(("Reading short sector chain %d", sid));
-			goto out;
-		}
-		sid = CDF_TOLE4((uint32_t)ssat->sat_tab[sid]);
-	}
-	return 0;
-out:
-	free(scn->sst_tab);
-	return -1;
-}
-
-int
-cdf_read_sector_chain(const cdf_info_t *info, const cdf_header_t *h,
-    const cdf_sat_t *sat, const cdf_sat_t *ssat, const cdf_stream_t *sst,
-    cdf_secid_t sid, size_t len, cdf_stream_t *scn)
-{
-
-	if (len < h->h_min_size_standard_stream && sst->sst_tab != NULL)
-		return cdf_read_short_sector_chain(h, ssat, sst, sid, len,
-		    scn);
-	else
-		return cdf_read_long_sector_chain(info, h, sat, sid, len, scn);
-}
-
-int
-cdf_read_dir(const cdf_info_t *info, const cdf_header_t *h,
-    const cdf_sat_t *sat, cdf_dir_t *dir)
-{
-	size_t i, j;
-	size_t ss = CDF_SEC_SIZE(h), ns, nd;
-	char *buf;
-	cdf_secid_t sid = h->h_secid_first_directory;
-
-	ns = cdf_count_chain(sat, sid, ss);
-	if (ns == (size_t)-1)
-		return -1;
-
-	nd = ss / CDF_DIRECTORY_SIZE;
-
-	dir->dir_len = ns * nd;
-	dir->dir_tab = CAST(cdf_directory_t *,
-	    calloc(dir->dir_len, sizeof(dir->dir_tab[0])));
-	if (dir->dir_tab == NULL)
-		return -1;
-
-	if ((buf = CAST(char *, malloc(ss))) == NULL) {
-		free(dir->dir_tab);
-		return -1;
-	}
-
-	for (j = i = 0; i < ns; i++, j++) {
-		if (j >= CDF_LOOP_LIMIT) {
-			DPRINTF(("Read dir loop limit"));
-			errno = EFTYPE;
-			goto out;
-		}
-		if (cdf_read_sector(info, buf, 0, ss, h, sid) != (ssize_t)ss) {
-			DPRINTF(("Reading directory sector %d", sid));
-			goto out;
-		}
-		for (j = 0; j < nd; j++) {
-			cdf_unpack_dir(&dir->dir_tab[i * nd + j],
-			    &buf[j * CDF_DIRECTORY_SIZE]);
-		}
-		sid = CDF_TOLE4((uint32_t)sat->sat_tab[sid]);
-	}
-	if (NEED_SWAP)
-		for (i = 0; i < dir->dir_len; i++)
-			cdf_swap_dir(&dir->dir_tab[i]);
-	free(buf);
-	return 0;
-out:
-	free(dir->dir_tab);
-	free(buf);
-	return -1;
-}
-
-
-int
-cdf_read_ssat(const cdf_info_t *info, const cdf_header_t *h,
-    const cdf_sat_t *sat, cdf_sat_t *ssat)
-{
-	size_t i, j;
-	size_t ss = CDF_SEC_SIZE(h);
-	cdf_secid_t sid = h->h_secid_first_sector_in_short_sat;
-
-	ssat->sat_len = cdf_count_chain(sat, sid, CDF_SEC_SIZE(h));
-	if (ssat->sat_len == (size_t)-1)
-		return -1;
-
-	ssat->sat_tab = CAST(cdf_secid_t *, calloc(ssat->sat_len, ss));
-	if (ssat->sat_tab == NULL)
-		return -1;
-
-	for (j = i = 0; sid >= 0; i++, j++) {
-		if (j >= CDF_LOOP_LIMIT) {
-			DPRINTF(("Read short sat sector loop limit"));
-			errno = EFTYPE;
-			goto out;
-		}
-		if (i >= ssat->sat_len) {
-			DPRINTF(("Out of bounds reading short sector chain "
-			    "%u > %u\n", i, ssat->sat_len));
-			errno = EFTYPE;
-			goto out;
-		}
-		if (cdf_read_sector(info, ssat->sat_tab, i * ss, ss, h, sid) !=
-		    (ssize_t)ss) {
-			DPRINTF(("Reading short sat sector %d", sid));
-			goto out;
-		}
-		sid = CDF_TOLE4((uint32_t)sat->sat_tab[sid]);
-	}
-	return 0;
-out:
-	free(ssat->sat_tab);
-	return -1;
-}
-
-int
-cdf_read_short_stream(const cdf_info_t *info, const cdf_header_t *h,
-    const cdf_sat_t *sat, const cdf_dir_t *dir, cdf_stream_t *scn)
-{
-	size_t i;
-	const cdf_directory_t *d;
-
-	for (i = 0; i < dir->dir_len; i++)
-		if (dir->dir_tab[i].d_type == CDF_DIR_TYPE_ROOT_STORAGE)
-			break;
-
-	/* If the it is not there, just fake it; some docs don't have it */
-	if (i == dir->dir_len)
-		goto out;
-	d = &dir->dir_tab[i];
-
-	/* If the it is not there, just fake it; some docs don't have it */
-	if (d->d_stream_first_sector < 0)
-		goto out;
-
-	return	cdf_read_long_sector_chain(info, h, sat,
-	    d->d_stream_first_sector, d->d_size, scn);
-out:
-	scn->sst_tab = NULL;
-	scn->sst_len = 0;
-	scn->sst_dirlen = 0;
-	return 0;
-}
-
-static int
-cdf_namecmp(const char *d, const uint16_t *s, size_t l)
-{
-	for (; l--; d++, s++)
-		if (*d != CDF_TOLE2(*s))
-			return (unsigned char)*d - CDF_TOLE2(*s);
-	return 0;
-}
-
-int
-cdf_read_summary_info(const cdf_info_t *info, const cdf_header_t *h,
-    const cdf_sat_t *sat, const cdf_sat_t *ssat, const cdf_stream_t *sst,
-    const cdf_dir_t *dir, cdf_stream_t *scn)
-{
-	size_t i;
-	const cdf_directory_t *d;
-	static const char name[] = "\05SummaryInformation";
-
-	for (i = dir->dir_len; i > 0; i--)
-		if (dir->dir_tab[i - 1].d_type == CDF_DIR_TYPE_USER_STREAM &&
-		    cdf_namecmp(name, dir->dir_tab[i - 1].d_name, sizeof(name))
-		    == 0)
-			break;
-
-	if (i == 0) {
-		DPRINTF(("Cannot find summary information section\n"));
-		errno = ESRCH;
-		return -1;
-	}
-	d = &dir->dir_tab[i - 1];
-	return cdf_read_sector_chain(info, h, sat, ssat, sst,
-	    d->d_stream_first_sector, d->d_size, scn);
-}
-
-int
-cdf_read_property_info(const cdf_stream_t *sst, uint32_t offs,
-    cdf_property_info_t **info, size_t *count, size_t *maxcount)
-{
-	const cdf_section_header_t *shp;
-	cdf_section_header_t sh;
-	const uint8_t *p, *q, *e;
-	int16_t s16;
-	int32_t s32;
-	uint32_t u32;
-	int64_t s64;
-	uint64_t u64;
-	cdf_timestamp_t tp;
-	size_t i, o, o4, nelements, j;
-	cdf_property_info_t *inp;
-
-	if (offs > UINT32_MAX / 4) {
-		errno = EFTYPE;
-		goto out;
-	}
-	shp = CAST(const cdf_section_header_t *, (const void *)
-	    ((const char *)sst->sst_tab + offs));
-	if (cdf_check_stream_offset(sst, shp, sizeof(*shp), __LINE__) == -1)
-		goto out;
-	sh.sh_len = CDF_TOLE4(shp->sh_len);
-#define CDF_SHLEN_LIMIT (UINT32_MAX / 8)
-	if (sh.sh_len > CDF_SHLEN_LIMIT) {
-		errno = EFTYPE;
-		goto out;
-	}
-	sh.sh_properties = CDF_TOLE4(shp->sh_properties);
-#define CDF_PROP_LIMIT (UINT32_MAX / (4 * sizeof(*inp)))
-	if (sh.sh_properties > CDF_PROP_LIMIT)
-		goto out;
-	DPRINTF(("section len: %u properties %u\n", sh.sh_len,
-	    sh.sh_properties));
-	if (*maxcount) {
-		if (*maxcount > CDF_PROP_LIMIT)
-			goto out;
-		*maxcount += sh.sh_properties;
-		inp = CAST(cdf_property_info_t *,
-		    realloc(*info, *maxcount * sizeof(*inp)));
-	} else {
-		*maxcount = sh.sh_properties;
-		inp = CAST(cdf_property_info_t *,
-		    malloc(*maxcount * sizeof(*inp)));
-	}
-	if (inp == NULL)
-		goto out;
-	*info = inp;
-	inp += *count;
-	*count += sh.sh_properties;
-	p = CAST(const uint8_t *, (const void *)
-	    ((const char *)(const void *)sst->sst_tab +
-	    offs + sizeof(sh)));
-	e = CAST(const uint8_t *, (const void *)
-	    (((const char *)(const void *)shp) + sh.sh_len));
-	if (cdf_check_stream_offset(sst, e, 0, __LINE__) == -1)
-		goto out;
-	for (i = 0; i < sh.sh_properties; i++) {
-		q = (const uint8_t *)(const void *)
-		    ((const char *)(const void *)p +
-		    CDF_GETUINT32(p, (i << 1) + 1)) - 2 * sizeof(uint32_t);
-		if (q > e) {
-			DPRINTF(("Ran of the end %p > %p\n", q, e));
-			goto out;
-		}
-		inp[i].pi_id = CDF_GETUINT32(p, i << 1);
-		inp[i].pi_type = CDF_GETUINT32(q, 0);
-		DPRINTF(("%d) id=%x type=%x offs=%x,%d\n", i, inp[i].pi_id,
-		    inp[i].pi_type, q - p, CDF_GETUINT32(p, (i << 1) + 1)));
-		if (inp[i].pi_type & CDF_VECTOR) {
-			nelements = CDF_GETUINT32(q, 1);
-			o = 2;
-		} else {
-			nelements = 1;
-			o = 1;
-		}
-		o4 = o * sizeof(uint32_t);
-		if (inp[i].pi_type & (CDF_ARRAY|CDF_BYREF|CDF_RESERVED))
-			goto unknown;
-		switch (inp[i].pi_type & CDF_TYPEMASK) {
-		case CDF_NULL:
-		case CDF_EMPTY:
-			break;
-		case CDF_SIGNED16:
-			if (inp[i].pi_type & CDF_VECTOR)
-				goto unknown;
-			(void)memcpy(&s16, &q[o4], sizeof(s16));
-			inp[i].pi_s16 = CDF_TOLE2(s16);
-			break;
-		case CDF_SIGNED32:
-			if (inp[i].pi_type & CDF_VECTOR)
-				goto unknown;
-			(void)memcpy(&s32, &q[o4], sizeof(s32));
-			inp[i].pi_s32 = CDF_TOLE4((uint32_t)s32);
-			break;
-		case CDF_BOOL:
-		case CDF_UNSIGNED32:
-			if (inp[i].pi_type & CDF_VECTOR)
-				goto unknown;
-			(void)memcpy(&u32, &q[o4], sizeof(u32));
-			inp[i].pi_u32 = CDF_TOLE4(u32);
-			break;
-		case CDF_SIGNED64:
-			if (inp[i].pi_type & CDF_VECTOR)
-				goto unknown;
-			(void)memcpy(&s64, &q[o4], sizeof(s64));
-			inp[i].pi_s64 = CDF_TOLE8((uint64_t)s64);
-			break;
-		case CDF_UNSIGNED64:
-			if (inp[i].pi_type & CDF_VECTOR)
-				goto unknown;
-			(void)memcpy(&u64, &q[o4], sizeof(u64));
-			inp[i].pi_u64 = CDF_TOLE8((uint64_t)u64);
-			break;
-		case CDF_LENGTH32_STRING:
-		case CDF_LENGTH32_WSTRING:
-			if (nelements > 1) {
-				size_t nelem = inp - *info;
-				if (*maxcount > CDF_PROP_LIMIT
-				    || nelements > CDF_PROP_LIMIT)
-					goto out;
-				*maxcount += nelements;
-				inp = CAST(cdf_property_info_t *,
-				    realloc(*info, *maxcount * sizeof(*inp)));
-				if (inp == NULL)
-					goto out;
-				*info = inp;
-				inp = *info + nelem;
-			}
-			DPRINTF(("nelements = %d\n", nelements));
-			for (j = 0; j < nelements; j++, i++) {
-				uint32_t l = CDF_GETUINT32(q, o);
-				inp[i].pi_str.s_len = l;
-				inp[i].pi_str.s_buf =
-				    (const char *)(const void *)(&q[o4 + 1]);
-				DPRINTF(("l = %d, r = %d, s = %s\n", l,
-				    CDF_ROUND(l, sizeof(l)),
-				    inp[i].pi_str.s_buf));
-				l = 4 + (uint32_t)CDF_ROUND(l, sizeof(l));
-				o += l >> 2;
-				o4 = o * sizeof(uint32_t);
-			}
-			i--;
-			break;
-		case CDF_FILETIME:
-			if (inp[i].pi_type & CDF_VECTOR)
-				goto unknown;
-			(void)memcpy(&tp, &q[o4], sizeof(tp));
-			inp[i].pi_tp = CDF_TOLE8((uint64_t)tp);
-			break;
-		case CDF_CLIPBOARD:
-			if (inp[i].pi_type & CDF_VECTOR)
-				goto unknown;
-			break;
-		default:
-		unknown:
-			DPRINTF(("Don't know how to deal with %x\n",
-			    inp[i].pi_type));
-			goto out;
-		}
-	}
-	return 0;
-out:
-	free(*info);
-	return -1;
-}
-
-int
-cdf_unpack_summary_info(const cdf_stream_t *sst, cdf_summary_info_header_t *ssi,
-    cdf_property_info_t **info, size_t *count)
-{
-	size_t i, maxcount;
-	const cdf_summary_info_header_t *si =
-	    CAST(const cdf_summary_info_header_t *, sst->sst_tab);
-	const cdf_section_declaration_t *sd =
-	    CAST(const cdf_section_declaration_t *, (const void *)
-	    ((const char *)sst->sst_tab + CDF_SECTION_DECLARATION_OFFSET));
-
-	if (cdf_check_stream_offset(sst, si, sizeof(*si), __LINE__) == -1 ||
-	    cdf_check_stream_offset(sst, sd, sizeof(*sd), __LINE__) == -1)
-		return -1;
-	ssi->si_byte_order = CDF_TOLE2(si->si_byte_order);
-	ssi->si_os_version = CDF_TOLE2(si->si_os_version);
-	ssi->si_os = CDF_TOLE2(si->si_os);
-	ssi->si_class = si->si_class;
-	cdf_swap_class(&ssi->si_class);
-	ssi->si_count = CDF_TOLE2(si->si_count);
-	*count = 0;
-	maxcount = 0;
-	*info = NULL;
-	for (i = 0; i < CDF_TOLE4(si->si_count); i++) {
-		if (i >= CDF_LOOP_LIMIT) {
-			DPRINTF(("Unpack summary info loop limit"));
-			errno = EFTYPE;
-			return -1;
-		}
-		if (cdf_read_property_info(sst, CDF_TOLE4(sd->sd_offset),
-		    info, count, &maxcount) == -1)
-			return -1;
-	}
-	return 0;
-}
-
-
-
-int
-cdf_print_classid(char *buf, size_t buflen, const cdf_classid_t *id)
-{
-	return snprintf(buf, buflen, "%.8x-%.4x-%.4x-%.2x%.2x-"
-	    "%.2x%.2x%.2x%.2x%.2x%.2x", id->cl_dword, id->cl_word[0],
-	    id->cl_word[1], id->cl_two[0], id->cl_two[1], id->cl_six[0],
-	    id->cl_six[1], id->cl_six[2], id->cl_six[3], id->cl_six[4],
-	    id->cl_six[5]);
-}
-
-static const struct {
-	uint32_t v;
-	const char *n;
-} vn[] = {
-	{ CDF_PROPERTY_CODE_PAGE, "Code page" },
-	{ CDF_PROPERTY_TITLE, "Title" },
-	{ CDF_PROPERTY_SUBJECT, "Subject" },
-	{ CDF_PROPERTY_AUTHOR, "Author" },
-	{ CDF_PROPERTY_KEYWORDS, "Keywords" },
-	{ CDF_PROPERTY_COMMENTS, "Comments" },
-	{ CDF_PROPERTY_TEMPLATE, "Template" },
-	{ CDF_PROPERTY_LAST_SAVED_BY, "Last Saved By" },
-	{ CDF_PROPERTY_REVISION_NUMBER, "Revision Number" },
-	{ CDF_PROPERTY_TOTAL_EDITING_TIME, "Total Editing Time" },
-	{ CDF_PROPERTY_LAST_PRINTED, "Last Printed" },
-	{ CDF_PROPERTY_CREATE_TIME, "Create Time/Date" },
-	{ CDF_PROPERTY_LAST_SAVED_TIME, "Last Saved Time/Date" },
-	{ CDF_PROPERTY_NUMBER_OF_PAGES, "Number of Pages" },
-	{ CDF_PROPERTY_NUMBER_OF_WORDS, "Number of Words" },
-	{ CDF_PROPERTY_NUMBER_OF_CHARACTERS, "Number of Characters" },
-	{ CDF_PROPERTY_THUMBNAIL, "Thumbnail" },
-	{ CDF_PROPERTY_NAME_OF_APPLICATION, "Name of Creating Application" },
-	{ CDF_PROPERTY_SECURITY, "Security" },
-	{ CDF_PROPERTY_LOCALE_ID, "Locale ID" },
-};
-
-int
-cdf_print_property_name(char *buf, size_t bufsiz, uint32_t p)
-{
-	size_t i;
-
-	for (i = 0; i < __arraycount(vn); i++)
-		if (vn[i].v == p)
-			return snprintf(buf, bufsiz, "%s", vn[i].n);
-	return snprintf(buf, bufsiz, "0x%x", p);
-}
-
-int
-cdf_print_elapsed_time(char *buf, size_t bufsiz, cdf_timestamp_t ts)
-{
-	int len = 0;
-	int days, hours, mins, secs;
-
-	ts /= CDF_TIME_PREC;
-	secs = (int)(ts % 60);
-	ts /= 60;
-	mins = (int)(ts % 60);
-	ts /= 60;
-	hours = (int)(ts % 24);
-	ts /= 24;
-	days = (int)ts;
-
-	if (days) {
-		len += snprintf(buf + len, bufsiz - len, "%dd+", days);
-		if ((size_t)len >= bufsiz)
-			return len;
-	}
-
-	if (days || hours) {
-		len += snprintf(buf + len, bufsiz - len, "%.2d:", hours);
-		if ((size_t)len >= bufsiz)
-			return len;
-	}
-
-	len += snprintf(buf + len, bufsiz - len, "%.2d:", mins);
-	if ((size_t)len >= bufsiz)
-		return len;
-
-	len += snprintf(buf + len, bufsiz - len, "%.2d", secs);
-	return len;
-}
-
-
-#ifdef CDF_DEBUG
-void
-cdf_dump_header(const cdf_header_t *h)
-{
-	size_t i;
-
-#define DUMP(a, b) (void)fprintf(stderr, "%40.40s = " a "\n", # b, h->h_ ## b)
-#define DUMP2(a, b) (void)fprintf(stderr, "%40.40s = " a " (" a ")\n", # b, \
-    h->h_ ## b, 1 << h->h_ ## b)
-	DUMP("%d", revision);
-	DUMP("%d", version);
-	DUMP("0x%x", byte_order);
-	DUMP2("%d", sec_size_p2);
-	DUMP2("%d", short_sec_size_p2);
-	DUMP("%d", num_sectors_in_sat);
-	DUMP("%d", secid_first_directory);
-	DUMP("%d", min_size_standard_stream);
-	DUMP("%d", secid_first_sector_in_short_sat);
-	DUMP("%d", num_sectors_in_short_sat);
-	DUMP("%d", secid_first_sector_in_master_sat);
-	DUMP("%d", num_sectors_in_master_sat);
-	for (i = 0; i < __arraycount(h->h_master_sat); i++) {
-		if (h->h_master_sat[i] == CDF_SECID_FREE)
-			break;
-		(void)fprintf(stderr, "%35.35s[%.3zu] = %d\n",
-		    "master_sat", i, h->h_master_sat[i]);
-	}
-}
-
-void
-cdf_dump_sat(const char *prefix, const cdf_sat_t *sat, size_t size)
-{
-	size_t i, j, s = size / sizeof(cdf_secid_t);
-
-	for (i = 0; i < sat->sat_len; i++) {
-		(void)fprintf(stderr, "%s[%" SIZE_T_FORMAT "u]:\n%.6d: ",
-		    prefix, i, i * s);
-		for (j = 0; j < s; j++) {
-			(void)fprintf(stderr, "%5d, ",
-			    CDF_TOLE4(sat->sat_tab[s * i + j]));
-			if ((j + 1) % 10 == 0)
-				(void)fprintf(stderr, "\n%.6d: ",
-				    i * s + j + 1);
-		}
-		(void)fprintf(stderr, "\n");
-	}
-}
-
-void
-cdf_dump(void *v, size_t len)
-{
-	size_t i, j;
-	unsigned char *p = v;
-	char abuf[16];
-	(void)fprintf(stderr, "%.4x: ", 0);
-	for (i = 0, j = 0; i < len; i++, p++) {
-		(void)fprintf(stderr, "%.2x ", *p);
-		abuf[j++] = isprint(*p) ? *p : '.';
-		if (j == 16) {
-			j = 0;
-			abuf[15] = '\0';
-			(void)fprintf(stderr, "%s\n%.4x: ", abuf, i + 1);
-		}
-	}
-	(void)fprintf(stderr, "\n");
-}
-
-void
-cdf_dump_stream(const cdf_header_t *h, const cdf_stream_t *sst)
-{
-	size_t ss = sst->sst_dirlen < h->h_min_size_standard_stream ?
-	    CDF_SHORT_SEC_SIZE(h) : CDF_SEC_SIZE(h);
-	cdf_dump(sst->sst_tab, ss * sst->sst_len);
-}
-
-void
-cdf_dump_dir(const cdf_info_t *info, const cdf_header_t *h,
-    const cdf_sat_t *sat, const cdf_sat_t *ssat, const cdf_stream_t *sst,
-    const cdf_dir_t *dir)
-{
-	size_t i, j;
-	cdf_directory_t *d;
-	char name[__arraycount(d->d_name)];
-	cdf_stream_t scn;
-	struct timespec ts;
-
-	static const char *types[] = { "empty", "user storage",
-	    "user stream", "lockbytes", "property", "root storage" };
-
-	for (i = 0; i < dir->dir_len; i++) {
-		d = &dir->dir_tab[i];
-		for (j = 0; j < sizeof(name); j++)
-			name[j] = (char)CDF_TOLE2(d->d_name[j]);
-		(void)fprintf(stderr, "Directory %" SIZE_T_FORMAT "u: %s\n",
-		    i, name);
-		if (d->d_type < __arraycount(types))
-			(void)fprintf(stderr, "Type: %s\n", types[d->d_type]);
-		else
-			(void)fprintf(stderr, "Type: %d\n", d->d_type);
-		(void)fprintf(stderr, "Color: %s\n",
-		    d->d_color ? "black" : "red");
-		(void)fprintf(stderr, "Left child: %d\n", d->d_left_child);
-		(void)fprintf(stderr, "Right child: %d\n", d->d_right_child);
-		(void)fprintf(stderr, "Flags: 0x%x\n", d->d_flags);
-		cdf_timestamp_to_timespec(&ts, d->d_created);
-		(void)fprintf(stderr, "Created %s", ctime(&ts.tv_sec));
-		cdf_timestamp_to_timespec(&ts, d->d_modified);
-		(void)fprintf(stderr, "Modified %s", ctime(&ts.tv_sec));
-		(void)fprintf(stderr, "Stream %d\n", d->d_stream_first_sector);
-		(void)fprintf(stderr, "Size %d\n", d->d_size);
-		switch (d->d_type) {
-		case CDF_DIR_TYPE_USER_STORAGE:
-			(void)fprintf(stderr, "Storage: %d\n", d->d_storage);
-			break;
-		case CDF_DIR_TYPE_USER_STREAM:
-			if (sst == NULL)
-				break;
-			if (cdf_read_sector_chain(info, h, sat, ssat, sst,
-			    d->d_stream_first_sector, d->d_size, &scn) == -1) {
-				warn("Can't read stream for %s at %d len %d",
-				    name, d->d_stream_first_sector, d->d_size);
-				break;
-			}
-			cdf_dump_stream(h, &scn);
-			free(scn.sst_tab);
-			break;
-		default:
-			break;
-		}
-
-	}
-}
-
-void
-cdf_dump_property_info(const cdf_property_info_t *info, size_t count)
-{
-	cdf_timestamp_t tp;
-	struct timespec ts;
-	char buf[64];
-	size_t i, j;
-
-	for (i = 0; i < count; i++) {
-		cdf_print_property_name(buf, sizeof(buf), info[i].pi_id);
-		(void)fprintf(stderr, "%" SIZE_T_FORMAT "u) %s: ", i, buf);
-		switch (info[i].pi_type) {
-		case CDF_NULL:
-			break;
-		case CDF_SIGNED16:
-			(void)fprintf(stderr, "signed 16 [%hd]\n",
-			    info[i].pi_s16);
-			break;
-		case CDF_SIGNED32:
-			(void)fprintf(stderr, "signed 32 [%d]\n",
-			    info[i].pi_s32);
-			break;
-		case CDF_UNSIGNED32:
-			(void)fprintf(stderr, "unsigned 32 [%u]\n",
-			    info[i].pi_u32);
-			break;
-		case CDF_LENGTH32_STRING:
-			(void)fprintf(stderr, "string %u [%.*s]\n",
-			    info[i].pi_str.s_len,
-			    info[i].pi_str.s_len, info[i].pi_str.s_buf);
-			break;
-		case CDF_LENGTH32_WSTRING:
-			(void)fprintf(stderr, "string %u [",
-			    info[i].pi_str.s_len);
-			for (j = 0; j < info[i].pi_str.s_len - 1; j++)
-			    (void)fputc(info[i].pi_str.s_buf[j << 1], stderr);
-			(void)fprintf(stderr, "]\n");
-			break;
-		case CDF_FILETIME:
-			tp = info[i].pi_tp;
-			if (tp < 1000000000000000LL) {
-				cdf_print_elapsed_time(buf, sizeof(buf), tp);
-				(void)fprintf(stderr, "timestamp %s\n", buf);
-			} else {
-				cdf_timestamp_to_timespec(&ts, tp);
-				(void)fprintf(stderr, "timestamp %s",
-				    ctime(&ts.tv_sec));
-			}
-			break;
-		case CDF_CLIPBOARD:
-			(void)fprintf(stderr, "CLIPBOARD %u\n", info[i].pi_u32);
-			break;
-		default:
-			DPRINTF(("Don't know how to deal with %x\n",
-			    info[i].pi_type));
-			break;
-		}
-	}
-}
-
-
-void
-cdf_dump_summary_info(const cdf_header_t *h, const cdf_stream_t *sst)
-{
-	char buf[128];
-	cdf_summary_info_header_t ssi;
-	cdf_property_info_t *info;
-	size_t count;
-
-	(void)&h;
-	if (cdf_unpack_summary_info(sst, &ssi, &info, &count) == -1)
-		return;
-	(void)fprintf(stderr, "Endian: %x\n", ssi.si_byte_order);
-	(void)fprintf(stderr, "Os Version %d.%d\n", ssi.si_os_version & 0xff,
-		ssi.si_os_version >> 8);
-	(void)fprintf(stderr, "Os %d\n", ssi.si_os);
-	cdf_print_classid(buf, sizeof(buf), &ssi.si_class);
-	(void)fprintf(stderr, "Class %s\n", buf);
-	(void)fprintf(stderr, "Count %d\n", ssi.si_count);
-	cdf_dump_property_info(info, count);
-	free(info);
-}
-
-#endif
-
-#ifdef TEST
-int
-main(int argc, char *argv[])
-{
-	int i;
-	cdf_header_t h;
-	cdf_sat_t sat, ssat;
-	cdf_stream_t sst, scn;
-	cdf_dir_t dir;
-	cdf_info_t info;
-
-	if (argc < 2) {
-		(void)fprintf(stderr, "Usage: %s <filename>\n", getprogname());
-		return -1;
-	}
-
-	info.i_buf = NULL;
-	info.i_len = 0;
-	for (i = 1; i < argc; i++) {
-		if ((info.i_fd = open(argv[1], O_RDONLY)) == -1)
-			err(1, "Cannot open `%s'", argv[1]);
-
-		if (cdf_read_header(&info, &h) == -1)
-			err(1, "Cannot read header");
-#ifdef CDF_DEBUG
-		cdf_dump_header(&h);
-#endif
-
-		if (cdf_read_sat(&info, &h, &sat) == -1)
-			err(1, "Cannot read sat");
-#ifdef CDF_DEBUG
-		cdf_dump_sat("SAT", &sat, CDF_SEC_SIZE(&h));
-#endif
-
-		if (cdf_read_ssat(&info, &h, &sat, &ssat) == -1)
-			err(1, "Cannot read ssat");
-#ifdef CDF_DEBUG
-		cdf_dump_sat("SSAT", &ssat, CDF_SHORT_SEC_SIZE(&h));
-#endif
-
-		if (cdf_read_dir(&info, &h, &sat, &dir) == -1)
-			err(1, "Cannot read dir");
-
-		if (cdf_read_short_stream(&info, &h, &sat, &dir, &sst) == -1)
-			err(1, "Cannot read short stream");
-#ifdef CDF_DEBUG
-		cdf_dump_stream(&h, &sst);
-#endif
-
-#ifdef CDF_DEBUG
-		cdf_dump_dir(&info, &h, &sat, &ssat, &sst, &dir);
-#endif
-
-
-		if (cdf_read_summary_info(&info, &h, &sat, &ssat, &sst, &dir,
-		    &scn) == -1)
-			err(1, "Cannot read summary info");
-#ifdef CDF_DEBUG
-		cdf_dump_summary_info(&h, &scn);
-#endif
-
-		(void)close(info.i_fd);
-	}
-
-	return 0;
-}
-#endif

Deleted: trunk/contrib/file/cdf.h
===================================================================
--- trunk/contrib/file/cdf.h	2014-06-30 11:58:41 UTC (rev 6698)
+++ trunk/contrib/file/cdf.h	2014-06-30 11:58:43 UTC (rev 6699)
@@ -1,320 +0,0 @@
-/*-
- * Copyright (c) 2008 Christos Zoulas
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
- * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-/*
- * Parse Composite Document Files, the format used in Microsoft Office
- * document files before they switched to zipped XML.
- * Info from: http://sc.openoffice.org/compdocfileformat.pdf
- *
- * N.B. This is the "Composite Document File" format, and not the
- * "Compound Document Format", nor the "Channel Definition Format".
- */
-
-#ifndef _H_CDF_
-#define _H_CDF_
-
-#ifdef WIN32
-#include <winsock2.h>
-#define timespec timeval
-#define tv_nsec tv_usec
-#endif
-#ifdef __DJGPP__
-#define timespec timeval
-#define tv_nsec tv_usec
-#endif
-
-typedef int32_t cdf_secid_t;
-
-#define CDF_LOOP_LIMIT					10000
-
-#define CDF_SECID_NULL					0
-#define CDF_SECID_FREE					-1
-#define	CDF_SECID_END_OF_CHAIN				-2
-#define	CDF_SECID_SECTOR_ALLOCATION_TABLE		-3
-#define CDF_SECID_MASTER_SECTOR_ALLOCATION_TABLE	-4
-
-typedef struct {
-        uint64_t	h_magic;
-#define CDF_MAGIC	0xE11AB1A1E011CFD0LL
-        uint64_t	h_uuid[2];
-        uint16_t	h_revision;
-        uint16_t	h_version;
-        uint16_t	h_byte_order;
-        uint16_t	h_sec_size_p2;
-        uint16_t	h_short_sec_size_p2;
-        uint8_t		h_unused0[10];
-        uint32_t	h_num_sectors_in_sat;
-        uint32_t	h_secid_first_directory;
-        uint8_t		h_unused1[4];
-        uint32_t	h_min_size_standard_stream;
-        cdf_secid_t	h_secid_first_sector_in_short_sat;
-        uint32_t	h_num_sectors_in_short_sat;
-        cdf_secid_t	h_secid_first_sector_in_master_sat;
-        uint32_t	h_num_sectors_in_master_sat;
-        cdf_secid_t	h_master_sat[436/4];
-} cdf_header_t;
-
-#define CDF_SEC_SIZE(h)	(1 << (h)->h_sec_size_p2)
-#define CDF_SEC_POS(h, secid) (CDF_SEC_SIZE(h) + (secid) * CDF_SEC_SIZE(h))
-#define CDF_SHORT_SEC_SIZE(h)	(1 << (h)->h_short_sec_size_p2)
-#define CDF_SHORT_SEC_POS(h, secid) ((secid) * CDF_SHORT_SEC_SIZE(h))
-
-typedef int32_t	cdf_dirid_t;
-#define CDF_DIRID_NULL	-1
-
-typedef int64_t	cdf_timestamp_t;
-#define CDF_BASE_YEAR	1601
-#define CDF_TIME_PREC	10000000
-
-typedef struct {
-        uint16_t	d_name[32];
-        uint16_t	d_namelen;
-        uint8_t		d_type;
-#define CDF_DIR_TYPE_EMPTY		0
-#define	CDF_DIR_TYPE_USER_STORAGE	1
-#define	CDF_DIR_TYPE_USER_STREAM	2
-#define	CDF_DIR_TYPE_LOCKBYTES		3
-#define	CDF_DIR_TYPE_PROPERTY		4
-#define	CDF_DIR_TYPE_ROOT_STORAGE	5
-        uint8_t		d_color;
-#define CDF_DIR_COLOR_READ	0
-#define CDF_DIR_COLOR_BLACK	1
-        cdf_dirid_t	d_left_child;
-        cdf_dirid_t	d_right_child;
-        cdf_dirid_t	d_storage;
-        uint64_t	d_storage_uuid[2];
-        uint32_t	d_flags;
-        cdf_timestamp_t	d_created;
-        cdf_timestamp_t	d_modified;
-        cdf_secid_t	d_stream_first_sector;
-        uint32_t	d_size;
-        uint32_t	d_unused0;
-} cdf_directory_t;
-
-#define CDF_DIRECTORY_SIZE	128
-
-typedef struct {
-        cdf_secid_t *sat_tab;
-        size_t sat_len;
-} cdf_sat_t;
-
-typedef struct {
-        cdf_directory_t *dir_tab;
-        size_t dir_len;
-} cdf_dir_t;
-
-typedef struct {
-        void *sst_tab;
-        size_t sst_len;
-        size_t sst_dirlen;
-} cdf_stream_t;
-
-typedef struct {
-        uint32_t	cl_dword;
-        uint16_t	cl_word[2];
-        uint8_t		cl_two[2];
-        uint8_t		cl_six[6];
-} cdf_classid_t;
-
-typedef struct {
-        uint16_t	si_byte_order;
-        uint16_t	si_zero;
-        uint16_t	si_os_version;
-        uint16_t	si_os;
-        cdf_classid_t	si_class;
-        uint32_t	si_count;
-} cdf_summary_info_header_t;
-
-#define CDF_SECTION_DECLARATION_OFFSET 0x1c
-
-typedef struct {
-        cdf_classid_t	sd_class;
-        uint32_t	sd_offset;
-} cdf_section_declaration_t;
-
-typedef struct {
-        uint32_t	sh_len;
-        uint32_t	sh_properties;
-} cdf_section_header_t;
-
-typedef struct {
-        uint32_t	pi_id;
-        uint32_t	pi_type;
-        union {
-                uint16_t	_pi_u16;
-                int16_t		_pi_s16;
-                uint32_t	_pi_u32;
-                int32_t		_pi_s32;
-                uint64_t	_pi_u64;
-                int64_t		_pi_s64;
-                cdf_timestamp_t	_pi_tp;
-                struct {
-                        uint32_t s_len;
-                        const char *s_buf;
-                } _pi_str;
-        } pi_val;
-#define pi_u64	pi_val._pi_u64
-#define pi_s64	pi_val._pi_s64
-#define pi_u32	pi_val._pi_u32
-#define pi_s32	pi_val._pi_s32
-#define pi_u16	pi_val._pi_u16
-#define pi_s16	pi_val._pi_s16
-#define pi_tp	pi_val._pi_tp
-#define pi_str	pi_val._pi_str
-} cdf_property_info_t;
-
-#define CDF_ROUND(val, by)     (((val) + (by) - 1) & ~((by) - 1))
-
-/* Variant type definitions */
-#define CDF_EMPTY		0x00000000
-#define	CDF_NULL		0x00000001
-#define CDF_SIGNED16		0x00000002
-#define CDF_SIGNED32		0x00000003
-#define CDF_FLOAT		0x00000004
-#define CDF_DOUBLE		0x00000005
-#define CDF_CY			0x00000006
-#define	CDF_DATE		0x00000007
-#define CDF_BSTR		0x00000008
-#define CDF_DISPATCH		0x00000009
-#define CDF_ERROR		0x0000000a
-#define CDF_BOOL		0x0000000b
-#define CDF_VARIANT		0x0000000c
-#define CDF_UNKNOWN		0x0000000d
-#define CDF_DECIMAL		0x0000000e
-#define CDF_SIGNED8		0x00000010
-#define CDF_UNSIGNED8		0x00000011
-#define CDF_UNSIGNED16		0x00000012
-#define	CDF_UNSIGNED32		0x00000013
-#define CDF_SIGNED64		0x00000014
-#define CDF_UNSIGNED64		0x00000015
-#define CDF_INT			0x00000016
-#define CDF_UINT		0x00000017
-#define CDF_VOID		0x00000018
-#define CDF_HRESULT		0x00000019
-#define CDF_PTR			0x0000001a
-#define CDF_SAFEARRAY		0x0000001b
-#define CDF_CARRAY		0x0000001c
-#define CDF_USERDEFINED		0x0000001d
-#define CDF_LENGTH32_STRING	0x0000001e
-#define CDF_LENGTH32_WSTRING	0x0000001f
-#define CDF_FILETIME		0x00000040
-#define CDF_BLOB		0x00000041
-#define CDF_STREAM		0x00000042
-#define CDF_STORAGE		0x00000043
-#define CDF_STREAMED_OBJECT	0x00000044
-#define CDF_STORED_OBJECT	0x00000045
-#define CDF_BLOB_OBJECT		0x00000046
-#define CDF_CLIPBOARD		0x00000047
-#define CDF_CLSID		0x00000048
-#define CDF_VECTOR		0x00001000
-#define CDF_ARRAY		0x00002000
-#define CDF_BYREF		0x00004000
-#define CDF_RESERVED		0x00008000
-#define CDF_ILLEGAL		0x0000ffff
-#define CDF_ILLEGALMASKED	0x00000fff
-#define CDF_TYPEMASK		0x00000fff
-
-#define CDF_PROPERTY_CODE_PAGE			0x00000001
-#define CDF_PROPERTY_TITLE			0x00000002
-#define CDF_PROPERTY_SUBJECT			0x00000003
-#define CDF_PROPERTY_AUTHOR			0x00000004
-#define CDF_PROPERTY_KEYWORDS			0x00000005
-#define CDF_PROPERTY_COMMENTS                   0x00000006
-#define CDF_PROPERTY_TEMPLATE			0x00000007
-#define CDF_PROPERTY_LAST_SAVED_BY		0x00000008
-#define CDF_PROPERTY_REVISION_NUMBER		0x00000009
-#define CDF_PROPERTY_TOTAL_EDITING_TIME		0x0000000a
-#define CDF_PROPERTY_LAST_PRINTED		0X0000000b
-#define CDF_PROPERTY_CREATE_TIME		0x0000000c
-#define CDF_PROPERTY_LAST_SAVED_TIME		0x0000000d
-#define CDF_PROPERTY_NUMBER_OF_PAGES		0x0000000e
-#define CDF_PROPERTY_NUMBER_OF_WORDS		0x0000000f
-#define CDF_PROPERTY_NUMBER_OF_CHARACTERS	0x00000010
-#define CDF_PROPERTY_THUMBNAIL			0x00000011
-#define CDF_PROPERTY_NAME_OF_APPLICATION	0x00000012
-#define CDF_PROPERTY_SECURITY			0x00000013
-#define CDF_PROPERTY_LOCALE_ID			0x80000000
-
-typedef struct {
-        int i_fd;
-        const unsigned char *i_buf;
-        size_t i_len;
-} cdf_info_t;
-
-struct timespec;
-int cdf_timestamp_to_timespec(struct timespec *, cdf_timestamp_t);
-int cdf_timespec_to_timestamp(cdf_timestamp_t *, const struct timespec *);
-int cdf_read_header(const cdf_info_t *, cdf_header_t *);
-void cdf_swap_header(cdf_header_t *);
-void cdf_unpack_header(cdf_header_t *, char *);
-void cdf_swap_dir(cdf_directory_t *);
-void cdf_unpack_dir(cdf_directory_t *, char *);
-void cdf_swap_class(cdf_classid_t *);
-ssize_t cdf_read_sector(const cdf_info_t *, void *, size_t, size_t,
-    const cdf_header_t *, cdf_secid_t);
-ssize_t cdf_read_short_sector(const cdf_stream_t *, void *, size_t, size_t,
-    const cdf_header_t *, cdf_secid_t);
-int cdf_read_sat(const cdf_info_t *, cdf_header_t *, cdf_sat_t *);
-size_t cdf_count_chain(const cdf_sat_t *, cdf_secid_t, size_t);
-int cdf_read_long_sector_chain(const cdf_info_t *, const cdf_header_t *,
-    const cdf_sat_t *, cdf_secid_t, size_t, cdf_stream_t *);
-int cdf_read_short_sector_chain(const cdf_header_t *, const cdf_sat_t *,
-    const cdf_stream_t *, cdf_secid_t, size_t, cdf_stream_t *);
-int cdf_read_sector_chain(const cdf_info_t *, const cdf_header_t *,
-    const cdf_sat_t *, const cdf_sat_t *, const cdf_stream_t *, cdf_secid_t,
-    size_t, cdf_stream_t *);
-int cdf_read_dir(const cdf_info_t *, const cdf_header_t *, const cdf_sat_t *,
-    cdf_dir_t *);
-int cdf_read_ssat(const cdf_info_t *, const cdf_header_t *, const cdf_sat_t *,
-    cdf_sat_t *);
-int cdf_read_short_stream(const cdf_info_t *, const cdf_header_t *,
-    const cdf_sat_t *, const cdf_dir_t *, cdf_stream_t *);
-int cdf_read_property_info(const cdf_stream_t *, uint32_t,
-    cdf_property_info_t **, size_t *, size_t *);
-int cdf_read_summary_info(const cdf_info_t *, const cdf_header_t *,
-    const cdf_sat_t *, const cdf_sat_t *, const cdf_stream_t *,
-    const cdf_dir_t *, cdf_stream_t *);
-int cdf_unpack_summary_info(const cdf_stream_t *, cdf_summary_info_header_t *,
-    cdf_property_info_t **, size_t *);
-int cdf_print_classid(char *, size_t, const cdf_classid_t *);
-int cdf_print_property_name(char *, size_t, uint32_t);
-int cdf_print_elapsed_time(char *, size_t, cdf_timestamp_t);
-uint16_t cdf_tole2(uint16_t);
-uint32_t cdf_tole4(uint32_t);
-uint64_t cdf_tole8(uint64_t);
-
-#ifdef CDF_DEBUG
-void cdf_dump_header(const cdf_header_t *);
-void cdf_dump_sat(const char *, const cdf_sat_t *, size_t);
-void cdf_dump(void *, size_t);
-void cdf_dump_stream(const cdf_header_t *, const cdf_stream_t *);
-void cdf_dump_dir(const cdf_info_t *, const cdf_header_t *, const cdf_sat_t *,
-    const cdf_sat_t *, const cdf_stream_t *, const cdf_dir_t *);
-void cdf_dump_property_info(const cdf_property_info_t *, size_t);
-void cdf_dump_summary_info(const cdf_header_t *, const cdf_stream_t *);
-#endif
-
-
-#endif /* _H_CDF_ */

Deleted: trunk/contrib/file/cdf_time.c
===================================================================
--- trunk/contrib/file/cdf_time.c	2014-06-30 11:58:41 UTC (rev 6698)
+++ trunk/contrib/file/cdf_time.c	2014-06-30 11:58:43 UTC (rev 6699)
@@ -1,186 +0,0 @@
-/*-
- * Copyright (c) 2008 Christos Zoulas
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
- * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "file.h"
-
-#ifndef lint
-FILE_RCSID("@(#)$File: cdf_time.c,v 1.9 2010/10/02 15:36:15 christos Exp $")
-#endif
-
-#include <time.h>
-#ifdef TEST
-#include <err.h>
-#endif
-#include <string.h>
-
-#include "cdf.h"
-
-#define isleap(y) ((((y) % 4) == 0) && \
-    ((((y) % 100) != 0) || (((y) % 400) == 0)))
-
-static const int mdays[] = {
-    31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
-};
-
-/*
- * Return the number of days between jan 01 1601 and jan 01 of year.
- */
-static int
-cdf_getdays(int year)
-{
-	int days = 0;
-	int y;
-
-	for (y = CDF_BASE_YEAR; y < year; y++)
-		days += isleap(y) + 365;
-		
-	return days;
-}
-
-/*
- * Return the day within the month
- */
-static int
-cdf_getday(int year, int days)
-{
-	size_t m;
-
-	for (m = 0; m < sizeof(mdays) / sizeof(mdays[0]); m++) {
-		int sub = mdays[m] + (m == 1 && isleap(year));
-		if (days < sub)
-			return days;
-		days -= sub;
-	}
-	return days;
-}
-
-/* 
- * Return the 0...11 month number.
- */
-static int
-cdf_getmonth(int year, int days)
-{
-	size_t m;
-
-	for (m = 0; m < sizeof(mdays) / sizeof(mdays[0]); m++) {
-		days -= mdays[m];
-		if (m == 1 && isleap(year))
-			days--;
-		if (days <= 0)
-			return (int)m;
-	}
-	return (int)m;
-}
-
-int
-cdf_timestamp_to_timespec(struct timespec *ts, cdf_timestamp_t t)
-{
-	struct tm tm;
-#ifdef HAVE_STRUCT_TM_TM_ZONE
-	static char UTC[] = "UTC";
-#endif
-	int rdays;
-
-	/* Unit is 100's of nanoseconds */
-	ts->tv_nsec = (t % CDF_TIME_PREC) * 100;
-
-	t /= CDF_TIME_PREC;
-	tm.tm_sec = (int)(t % 60);
-	t /= 60;
-
-	tm.tm_min = (int)(t % 60);
-	t /= 60;
-
-	tm.tm_hour = (int)(t % 24);
-	t /= 24;
-
-	// XXX: Approx
-	tm.tm_year = (int)(CDF_BASE_YEAR + (t / 365));
-
-	rdays = cdf_getdays(tm.tm_year);
-	t -= rdays;
-	tm.tm_mday = cdf_getday(tm.tm_year, (int)t);
-	tm.tm_mon = cdf_getmonth(tm.tm_year, (int)t);
-	tm.tm_wday = 0;
-	tm.tm_yday = 0;
-	tm.tm_isdst = 0;
-#ifdef HAVE_STRUCT_TM_TM_GMTOFF
-	tm.tm_gmtoff = 0;
-#endif
-#ifdef HAVE_STRUCT_TM_TM_ZONE
-	tm.tm_zone = UTC;
-#endif
-	tm.tm_year -= 1900;
-	ts->tv_sec = mktime(&tm);
-	if (ts->tv_sec == -1) {
-		errno = EINVAL;
-		return -1;
-	}
-	return 0;
-}
-
-int
-/*ARGSUSED*/
-cdf_timespec_to_timestamp(cdf_timestamp_t *t, const struct timespec *ts)
-{
-#ifndef __lint__
-	(void)&t;
-	(void)&ts;
-#endif
-#ifdef notyet
-	struct tm tm;
-	if (gmtime_r(&ts->ts_sec, &tm) == NULL) {
-		errno = EINVAL;
-		return -1;
-	}
-	*t = (ts->ts_nsec / 100) * CDF_TIME_PREC;
-	*t = tm.tm_sec;
-	*t += tm.tm_min * 60;
-	*t += tm.tm_hour * 60 * 60;
-	*t += tm.tm_mday * 60 * 60 * 24;
-#endif
-	return 0;
-}
-
-
-#ifdef TEST
-int
-main(int argc, char *argv[])
-{
-	struct timespec ts;
-	static const cdf_timestamp_t tst = 0x01A5E403C2D59C00ULL;
-	static const char *ref = "Sat Apr 23 01:30:00 1977";
-	char *p, *q;
-
-	cdf_timestamp_to_timespec(&ts, tst);
-	p = ctime(&ts.tv_sec);
-	if ((q = strchr(p, '\n')) != NULL)
-		*q = '\0';
-	if (strcmp(ref, p) != 0)
-		errx(1, "Error date %s != %s\n", ref, p);
-	return 0;
-}
-#endif

Deleted: trunk/contrib/file/compress.c
===================================================================
--- trunk/contrib/file/compress.c	2014-06-30 11:58:41 UTC (rev 6698)
+++ trunk/contrib/file/compress.c	2014-06-30 11:58:43 UTC (rev 6699)
@@ -1,504 +0,0 @@
-/*
- * Copyright (c) Ian F. Darwin 1986-1995.
- * Software written by Ian F. Darwin and others;
- * maintained 1995-present by Christos Zoulas and others.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice immediately at the beginning of the file, without modification,
- *    this list of conditions, and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *  
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-/*
- * compress routines:
- *	zmagic() - returns 0 if not recognized, uncompresses and prints
- *		   information if recognized
- *	uncompress(method, old, n, newch) - uncompress old into new, 
- *					    using method, return sizeof new
- */
-#include "file.h"
-
-#ifndef lint
-FILE_RCSID("@(#)$File: compress.c,v 1.65 2010/07/21 16:47:17 christos Exp $")
-#endif
-
-#include "magic.h"
-#include <stdlib.h>
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#include <string.h>
-#include <errno.h>
-#ifndef __MINGW32__
-#include <sys/ioctl.h>
-#endif
-#ifdef HAVE_SYS_WAIT_H
-#include <sys/wait.h>
-#endif
-#if defined(HAVE_SYS_TIME_H)
-#include <sys/time.h>
-#endif
-#if defined(HAVE_ZLIB_H) && defined(HAVE_LIBZ)
-#define BUILTIN_DECOMPRESS
-#include <zlib.h>
-#endif
-
-private const struct {
-	const char magic[8];
-	size_t maglen;
-	const char *argv[3];
-	int silent;
-} compr[] = {
-	{ "\037\235", 2, { "gzip", "-cdq", NULL }, 1 },		/* compressed */
-	/* Uncompress can get stuck; so use gzip first if we have it
-	 * Idea from Damien Clark, thanks! */
-	{ "\037\235", 2, { "uncompress", "-c", NULL }, 1 },	/* compressed */
-	{ "\037\213", 2, { "gzip", "-cdq", NULL }, 1 },		/* gzipped */
-	{ "\037\236", 2, { "gzip", "-cdq", NULL }, 1 },		/* frozen */
-	{ "\037\240", 2, { "gzip", "-cdq", NULL }, 1 },		/* SCO LZH */
-	/* the standard pack utilities do not accept standard input */
-	{ "\037\036", 2, { "gzip", "-cdq", NULL }, 0 },		/* packed */
-	{ "PK\3\4",   4, { "gzip", "-cdq", NULL }, 1 },		/* pkzipped, */
-					    /* ...only first file examined */
-	{ "BZh",      3, { "bzip2", "-cd", NULL }, 1 },		/* bzip2-ed */
-	{ "LZIP",     4, { "lzip", "-cdq", NULL }, 1 },
- 	{ "\3757zXZ\0",6,{ "xz", "-cd", NULL }, 1 },		/* XZ Utils */
-};
-
-#define NODATA ((size_t)~0)
-
-private ssize_t swrite(int, const void *, size_t);
-#if HAVE_FORK
-private size_t ncompr = sizeof(compr) / sizeof(compr[0]);
-private size_t uncompressbuf(struct magic_set *, int, size_t,
-    const unsigned char *, unsigned char **, size_t);
-#ifdef BUILTIN_DECOMPRESS
-private size_t uncompressgzipped(struct magic_set *, const unsigned char *,
-    unsigned char **, size_t);
-#endif
-
-protected int
-file_zmagic(struct magic_set *ms, int fd, const char *name,
-    const unsigned char *buf, size_t nbytes)
-{
-	unsigned char *newbuf = NULL;
-	size_t i, nsz;
-	int rv = 0;
-	int mime = ms->flags & MAGIC_MIME;
-
-	if ((ms->flags & MAGIC_COMPRESS) == 0)
-		return 0;
-
-	for (i = 0; i < ncompr; i++) {
-		if (nbytes < compr[i].maglen)
-			continue;
-		if (memcmp(buf, compr[i].magic, compr[i].maglen) == 0 &&
-		    (nsz = uncompressbuf(ms, fd, i, buf, &newbuf,
-		    nbytes)) != NODATA) {
-			ms->flags &= ~MAGIC_COMPRESS;
-			rv = -1;
-			if (file_buffer(ms, -1, name, newbuf, nsz) == -1)
-				goto error;
-
-			if (mime == MAGIC_MIME || mime == 0) {
-				if (file_printf(ms, mime ?
-				    " compressed-encoding=" : " (") == -1)
-					goto error;
-			}
-
-			if ((mime == 0 || mime & MAGIC_MIME_ENCODING) &&
-			    file_buffer(ms, -1, NULL, buf, nbytes) == -1)
-				goto error;
-
-			if (!mime && file_printf(ms, ")") == -1)
-				goto error;
-			rv = 1;
-			break;
-		}
-	}
-error:
-	if (newbuf)
-		free(newbuf);
-	ms->flags |= MAGIC_COMPRESS;
-	return rv;
-}
-#endif
-/*
- * `safe' write for sockets and pipes.
- */
-private ssize_t
-swrite(int fd, const void *buf, size_t n)
-{
-	ssize_t rv;
-	size_t rn = n;
-
-	do
-		switch (rv = write(fd, buf, n)) {
-		case -1:
-			if (errno == EINTR)
-				continue;
-			return -1;
-		default:
-			n -= rv;
-			buf = CAST(const char *, buf) + rv;
-			break;
-		}
-	while (n > 0);
-	return rn;
-}
-
-
-/*
- * `safe' read for sockets and pipes.
- */
-protected ssize_t
-sread(int fd, void *buf, size_t n, int canbepipe __attribute__ ((unused)))
-{
-	ssize_t rv;
-#ifdef FD_ZERO
-	ssize_t cnt;
-#endif
-#ifdef FIONREAD
-	int t = 0;
-#endif
-	size_t rn = n;
-
-	if (fd == STDIN_FILENO)
-		goto nocheck;
-
-#ifdef FIONREAD
-	if ((canbepipe && (ioctl(fd, FIONREAD, &t) == -1)) || (t == 0)) {
-#ifdef FD_ZERO
-		for (cnt = 0;; cnt++) {
-			fd_set check;
-			struct timeval tout = {0, 100 * 1000};
-			int selrv;
-
-			FD_ZERO(&check);
-			FD_SET(fd, &check);
-
-			/*
-			 * Avoid soft deadlock: do not read if there
-			 * is nothing to read from sockets and pipes.
-			 */
-			selrv = select(fd + 1, &check, NULL, NULL, &tout);
-			if (selrv == -1) {
-				if (errno == EINTR || errno == EAGAIN)
-					continue;
-			} else if (selrv == 0 && cnt >= 5) {
-				return 0;
-			} else
-				break;
-		}
-#endif
-		(void)ioctl(fd, FIONREAD, &t);
-	}
-
-	if (t > 0 && (size_t)t < n) {
-		n = t;
-		rn = n;
-	}
-#endif
-
-nocheck:
-	do
-		switch ((rv = read(fd, buf, n))) {
-		case -1:
-			if (errno == EINTR)
-				continue;
-			return -1;
-		case 0:
-			return rn - n;
-		default:
-			n -= rv;
-			buf = ((char *)buf) + rv;
-			break;
-		}
-	while (n > 0);
-	return rn;
-}
-
-protected int
-file_pipe2file(struct magic_set *ms, int fd, const void *startbuf,
-    size_t nbytes)
-{
-	char buf[4096];
-	ssize_t r;
-	int tfd;
-#ifdef HAVE_MKSTEMP
-	int te;
-#endif
-
-	(void)strlcpy(buf, "/tmp/file.XXXXXX", sizeof buf);
-#ifndef HAVE_MKSTEMP
-	{
-		char *ptr = mktemp(buf);
-		tfd = open(ptr, O_RDWR|O_TRUNC|O_EXCL|O_CREAT, 0600);
-		r = errno;
-		(void)unlink(ptr);
-		errno = r;
-	}
-#else
-	tfd = mkstemp(buf);
-	te = errno;
-	(void)unlink(buf);
-	errno = te;
-#endif
-	if (tfd == -1) {
-		file_error(ms, errno,
-		    "cannot create temporary file for pipe copy");
-		return -1;
-	}
-
-	if (swrite(tfd, startbuf, nbytes) != (ssize_t)nbytes)
-		r = 1;
-	else {
-		while ((r = sread(fd, buf, sizeof(buf), 1)) > 0)
-			if (swrite(tfd, buf, (size_t)r) != r)
-				break;
-	}
-
-	switch (r) {
-	case -1:
-		file_error(ms, errno, "error copying from pipe to temp file");
-		return -1;
-	case 0:
-		break;
-	default:
-		file_error(ms, errno, "error while writing to temp file");
-		return -1;
-	}
-
-	/*
-	 * We duplicate the file descriptor, because fclose on a
-	 * tmpfile will delete the file, but any open descriptors
-	 * can still access the phantom inode.
-	 */
-	if ((fd = dup2(tfd, fd)) == -1) {
-		file_error(ms, errno, "could not dup descriptor for temp file");
-		return -1;
-	}
-	(void)close(tfd);
-	if (lseek(fd, (off_t)0, SEEK_SET) == (off_t)-1) {
-		file_badseek(ms);
-		return -1;
-	}
-	return fd;
-}
-#if HAVE_FORK
-#ifdef BUILTIN_DECOMPRESS
-
-#define FHCRC		(1 << 1)
-#define FEXTRA		(1 << 2)
-#define FNAME		(1 << 3)
-#define FCOMMENT	(1 << 4)
-
-private size_t
-uncompressgzipped(struct magic_set *ms, const unsigned char *old,
-    unsigned char **newch, size_t n)
-{
-	unsigned char flg = old[3];
-	size_t data_start = 10;
-	z_stream z;
-	int rc;
-
-	if (flg & FEXTRA) {
-		if (data_start+1 >= n)
-			return 0;
-		data_start += 2 + old[data_start] + old[data_start + 1] * 256;
-	}
-	if (flg & FNAME) {
-		while(data_start < n && old[data_start])
-			data_start++;
-		data_start++;
-	}
-	if(flg & FCOMMENT) {
-		while(data_start < n && old[data_start])
-			data_start++;
-		data_start++;
-	}
-	if(flg & FHCRC)
-		data_start += 2;
-
-	if (data_start >= n)
-		return 0;
-	if ((*newch = CAST(unsigned char *, malloc(HOWMANY + 1))) == NULL) {
-		return 0;
-	}
-	
-	/* XXX: const castaway, via strchr */
-	z.next_in = (Bytef *)strchr((const char *)old + data_start,
-	    old[data_start]);
-	z.avail_in = CAST(uint32_t, (n - data_start));
-	z.next_out = *newch;
-	z.avail_out = HOWMANY;
-	z.zalloc = Z_NULL;
-	z.zfree = Z_NULL;
-	z.opaque = Z_NULL;
-
-	/* LINTED bug in header macro */
-	rc = inflateInit2(&z, -15);
-	if (rc != Z_OK) {
-		file_error(ms, 0, "zlib: %s", z.msg);
-		return 0;
-	}
-
-	rc = inflate(&z, Z_SYNC_FLUSH);
-	if (rc != Z_OK && rc != Z_STREAM_END) {
-		file_error(ms, 0, "zlib: %s", z.msg);
-		return 0;
-	}
-
-	n = (size_t)z.total_out;
-	(void)inflateEnd(&z);
-	
-	/* let's keep the nul-terminate tradition */
-	(*newch)[n] = '\0';
-
-	return n;
-}
-#endif
-
-private size_t
-uncompressbuf(struct magic_set *ms, int fd, size_t method,
-    const unsigned char *old, unsigned char **newch, size_t n)
-{
-	int fdin[2], fdout[2];
-	ssize_t r;
-
-#ifdef BUILTIN_DECOMPRESS
-        /* FIXME: This doesn't cope with bzip2 */
-	if (method == 2)
-		return uncompressgzipped(ms, old, newch, n);
-#endif
-	(void)fflush(stdout);
-	(void)fflush(stderr);
-
-	if ((fd != -1 && pipe(fdin) == -1) || pipe(fdout) == -1) {
-		file_error(ms, errno, "cannot create pipe");	
-		return NODATA;
-	}
-	switch (fork()) {
-	case 0:	/* child */
-		(void) close(0);
-		if (fd != -1) {
-		    (void) dup(fd);
-		    (void) lseek(0, (off_t)0, SEEK_SET);
-		} else {
-		    (void) dup(fdin[0]);
-		    (void) close(fdin[0]);
-		    (void) close(fdin[1]);
-		}
-
-		(void) close(1);
-		(void) dup(fdout[1]);
-		(void) close(fdout[0]);
-		(void) close(fdout[1]);
-#ifndef DEBUG
-		if (compr[method].silent)
-			(void)close(2);
-#endif
-
-		(void)execvp(compr[method].argv[0],
-		    (char *const *)(intptr_t)compr[method].argv);
-#ifdef DEBUG
-		(void)fprintf(stderr, "exec `%s' failed (%s)\n",
-		    compr[method].argv[0], strerror(errno));
-#endif
-		exit(1);
-		/*NOTREACHED*/
-	case -1:
-		file_error(ms, errno, "could not fork");
-		return NODATA;
-
-	default: /* parent */
-		(void) close(fdout[1]);
-		if (fd == -1) {
-			(void) close(fdin[0]);
-			/* 
-			 * fork again, to avoid blocking because both
-			 * pipes filled
-			 */
-			switch (fork()) {
-			case 0: /* child */
-				(void)close(fdout[0]);
-				if (swrite(fdin[1], old, n) != (ssize_t)n) {
-#ifdef DEBUG
-					(void)fprintf(stderr,
-					    "Write failed (%s)\n",
-					    strerror(errno));
-#endif
-					exit(1);
-				}
-				exit(0);
-				/*NOTREACHED*/
-
-			case -1:
-#ifdef DEBUG
-				(void)fprintf(stderr, "Fork failed (%s)\n",
-				    strerror(errno));
-#endif
-				exit(1);
-				/*NOTREACHED*/
-
-			default:  /* parent */
-				break;
-			}
-			(void) close(fdin[1]);
-			fdin[1] = -1;
-		}
-
-		if ((*newch = (unsigned char *) malloc(HOWMANY + 1)) == NULL) {
-#ifdef DEBUG
-			(void)fprintf(stderr, "Malloc failed (%s)\n",
-			    strerror(errno));
-#endif
-			n = 0;
-			goto err;
-		}
-		if ((r = sread(fdout[0], *newch, HOWMANY, 0)) <= 0) {
-#ifdef DEBUG
-			(void)fprintf(stderr, "Read failed (%s)\n",
-			    strerror(errno));
-#endif
-			free(*newch);
-			n = 0;
-			newch[0] = '\0';
-			goto err;
-		} else {
-			n = r;
-		}
- 		/* NUL terminate, as every buffer is handled here. */
- 		(*newch)[n] = '\0';
-err:
-		if (fdin[1] != -1)
-			(void) close(fdin[1]);
-		(void) close(fdout[0]);
-#ifdef WNOHANG
-		while (waitpid(-1, NULL, WNOHANG) != -1)
-			continue;
-#else
-		(void)wait(NULL);
-#endif
-		(void) close(fdin[0]);
-	    
-		return n;
-	}
-}
-#endif

Copied: trunk/contrib/file/depcomp (from rev 6687, vendor/file/5.19/depcomp)
===================================================================
--- trunk/contrib/file/depcomp	                        (rev 0)
+++ trunk/contrib/file/depcomp	2014-06-30 11:58:43 UTC (rev 6699)
@@ -0,0 +1,791 @@
+#! /bin/sh
+# depcomp - compile a program generating dependencies as side-effects
+
+scriptversion=2013-05-30.07; # UTC
+
+# Copyright (C) 1999-2013 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Originally written by Alexandre Oliva <oliva at dcc.unicamp.br>.
+
+case $1 in
+  '')
+    echo "$0: No command.  Try '$0 --help' for more information." 1>&2
+    exit 1;
+    ;;
+  -h | --h*)
+    cat <<\EOF
+Usage: depcomp [--help] [--version] PROGRAM [ARGS]
+
+Run PROGRAMS ARGS to compile a file, generating dependencies
+as side-effects.
+
+Environment variables:
+  depmode     Dependency tracking mode.
+  source      Source file read by 'PROGRAMS ARGS'.
+  object      Object file output by 'PROGRAMS ARGS'.
+  DEPDIR      directory where to store dependencies.
+  depfile     Dependency file to output.
+  tmpdepfile  Temporary file to use when outputting dependencies.
+  libtool     Whether libtool is used (yes/no).
+
+Report bugs to <bug-automake at gnu.org>.
+EOF
+    exit $?
+    ;;
+  -v | --v*)
+    echo "depcomp $scriptversion"
+    exit $?
+    ;;
+esac
+
+# Get the directory component of the given path, and save it in the
+# global variables '$dir'.  Note that this directory component will
+# be either empty or ending with a '/' character.  This is deliberate.
+set_dir_from ()
+{
+  case $1 in
+    */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
+      *) dir=;;
+  esac
+}
+
+# Get the suffix-stripped basename of the given path, and save it the
+# global variable '$base'.
+set_base_from ()
+{
+  base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
+}
+
+# If no dependency file was actually created by the compiler invocation,
+# we still have to create a dummy depfile, to avoid errors with the
+# Makefile "include basename.Plo" scheme.
+make_dummy_depfile ()
+{
+  echo "#dummy" > "$depfile"
+}
+
+# Factor out some common post-processing of the generated depfile.
+# Requires the auxiliary global variable '$tmpdepfile' to be set.
+aix_post_process_depfile ()
+{
+  # If the compiler actually managed to produce a dependency file,
+  # post-process it.
+  if test -f "$tmpdepfile"; then
+    # Each line is of the form 'foo.o: dependency.h'.
+    # Do two passes, one to just change these to
+    #   $object: dependency.h
+    # and one to simply output
+    #   dependency.h:
+    # which is needed to avoid the deleted-header problem.
+    { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
+      sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
+    } > "$depfile"
+    rm -f "$tmpdepfile"
+  else
+    make_dummy_depfile
+  fi
+}
+
+# A tabulation character.
+tab='	'
+# A newline character.
+nl='
+'
+# Character ranges might be problematic outside the C locale.
+# These definitions help.
+upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
+lower=abcdefghijklmnopqrstuvwxyz
+digits=0123456789
+alpha=${upper}${lower}
+
+if test -z "$depmode" || test -z "$source" || test -z "$object"; then
+  echo "depcomp: Variables source, object and depmode must be set" 1>&2
+  exit 1
+fi
+
+# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
+depfile=${depfile-`echo "$object" |
+  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
+tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
+
+rm -f "$tmpdepfile"
+
+# Avoid interferences from the environment.
+gccflag= dashmflag=
+
+# Some modes work just like other modes, but use different flags.  We
+# parameterize here, but still list the modes in the big case below,
+# to make depend.m4 easier to write.  Note that we *cannot* use a case
+# here, because this file can only contain one case statement.
+if test "$depmode" = hp; then
+  # HP compiler uses -M and no extra arg.
+  gccflag=-M
+  depmode=gcc
+fi
+
+if test "$depmode" = dashXmstdout; then
+  # This is just like dashmstdout with a different argument.
+  dashmflag=-xM
+  depmode=dashmstdout
+fi
+
+cygpath_u="cygpath -u -f -"
+if test "$depmode" = msvcmsys; then
+  # This is just like msvisualcpp but w/o cygpath translation.
+  # Just convert the backslash-escaped backslashes to single forward
+  # slashes to satisfy depend.m4
+  cygpath_u='sed s,\\\\,/,g'
+  depmode=msvisualcpp
+fi
+
+if test "$depmode" = msvc7msys; then
+  # This is just like msvc7 but w/o cygpath translation.
+  # Just convert the backslash-escaped backslashes to single forward
+  # slashes to satisfy depend.m4
+  cygpath_u='sed s,\\\\,/,g'
+  depmode=msvc7
+fi
+
+if test "$depmode" = xlc; then
+  # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
+  gccflag=-qmakedep=gcc,-MF
+  depmode=gcc
+fi
+
+case "$depmode" in
+gcc3)
+## gcc 3 implements dependency tracking that does exactly what
+## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
+## it if -MD -MP comes after the -MF stuff.  Hmm.
+## Unfortunately, FreeBSD c89 acceptance of flags depends upon
+## the command line argument order; so add the flags where they
+## appear in depend2.am.  Note that the slowdown incurred here
+## affects only configure: in makefiles, %FASTDEP% shortcuts this.
+  for arg
+  do
+    case $arg in
+    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
+    *)  set fnord "$@" "$arg" ;;
+    esac
+    shift # fnord
+    shift # $arg
+  done
+  "$@"
+  stat=$?
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  mv "$tmpdepfile" "$depfile"
+  ;;
+
+gcc)
+## Note that this doesn't just cater to obsosete pre-3.x GCC compilers.
+## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.
+## (see the conditional assignment to $gccflag above).
+## There are various ways to get dependency output from gcc.  Here's
+## why we pick this rather obscure method:
+## - Don't want to use -MD because we'd like the dependencies to end
+##   up in a subdir.  Having to rename by hand is ugly.
+##   (We might end up doing this anyway to support other compilers.)
+## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
+##   -MM, not -M (despite what the docs say).  Also, it might not be
+##   supported by the other compilers which use the 'gcc' depmode.
+## - Using -M directly means running the compiler twice (even worse
+##   than renaming).
+  if test -z "$gccflag"; then
+    gccflag=-MD,
+  fi
+  "$@" -Wp,"$gccflag$tmpdepfile"
+  stat=$?
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  # The second -e expression handles DOS-style file names with drive
+  # letters.
+  sed -e 's/^[^:]*: / /' \
+      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
+## This next piece of magic avoids the "deleted header file" problem.
+## The problem is that when a header file which appears in a .P file
+## is deleted, the dependency causes make to die (because there is
+## typically no way to rebuild the header).  We avoid this by adding
+## dummy dependencies for each header file.  Too bad gcc doesn't do
+## this for us directly.
+## Some versions of gcc put a space before the ':'.  On the theory
+## that the space means something, we add a space to the output as
+## well.  hp depmode also adds that space, but also prefixes the VPATH
+## to the object.  Take care to not repeat it in the output.
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly.  Breaking it into two sed invocations is a workaround.
+  tr ' ' "$nl" < "$tmpdepfile" \
+    | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
+    | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+hp)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+sgi)
+  if test "$libtool" = yes; then
+    "$@" "-Wp,-MDupdate,$tmpdepfile"
+  else
+    "$@" -MDupdate "$tmpdepfile"
+  fi
+  stat=$?
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+
+  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
+    echo "$object : \\" > "$depfile"
+    # Clip off the initial element (the dependent).  Don't try to be
+    # clever and replace this with sed code, as IRIX sed won't handle
+    # lines with more than a fixed number of characters (4096 in
+    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
+    # the IRIX cc adds comments like '#:fec' to the end of the
+    # dependency line.
+    tr ' ' "$nl" < "$tmpdepfile" \
+      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
+      | tr "$nl" ' ' >> "$depfile"
+    echo >> "$depfile"
+    # The second pass generates a dummy entry for each header file.
+    tr ' ' "$nl" < "$tmpdepfile" \
+      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
+      >> "$depfile"
+  else
+    make_dummy_depfile
+  fi
+  rm -f "$tmpdepfile"
+  ;;
+
+xlc)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+aix)
+  # The C for AIX Compiler uses -M and outputs the dependencies
+  # in a .u file.  In older versions, this file always lives in the
+  # current directory.  Also, the AIX compiler puts '$object:' at the
+  # start of each line; $object doesn't have directory information.
+  # Version 6 uses the directory in both cases.
+  set_dir_from "$object"
+  set_base_from "$object"
+  if test "$libtool" = yes; then
+    tmpdepfile1=$dir$base.u
+    tmpdepfile2=$base.u
+    tmpdepfile3=$dir.libs/$base.u
+    "$@" -Wc,-M
+  else
+    tmpdepfile1=$dir$base.u
+    tmpdepfile2=$dir$base.u
+    tmpdepfile3=$dir$base.u
+    "$@" -M
+  fi
+  stat=$?
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+    exit $stat
+  fi
+
+  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+  do
+    test -f "$tmpdepfile" && break
+  done
+  aix_post_process_depfile
+  ;;
+
+tcc)
+  # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
+  # FIXME: That version still under development at the moment of writing.
+  #        Make that this statement remains true also for stable, released
+  #        versions.
+  # It will wrap lines (doesn't matter whether long or short) with a
+  # trailing '\', as in:
+  #
+  #   foo.o : \
+  #    foo.c \
+  #    foo.h \
+  #
+  # It will put a trailing '\' even on the last line, and will use leading
+  # spaces rather than leading tabs (at least since its commit 0394caf7
+  # "Emit spaces for -MD").
+  "$@" -MD -MF "$tmpdepfile"
+  stat=$?
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
+  # We have to change lines of the first kind to '$object: \'.
+  sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
+  # And for each line of the second kind, we have to emit a 'dep.h:'
+  # dummy dependency, to avoid the deleted-header problem.
+  sed -n -e 's|^  *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+## The order of this option in the case statement is important, since the
+## shell code in configure will try each of these formats in the order
+## listed in this file.  A plain '-MD' option would be understood by many
+## compilers, so we must ensure this comes after the gcc and icc options.
+pgcc)
+  # Portland's C compiler understands '-MD'.
+  # Will always output deps to 'file.d' where file is the root name of the
+  # source file under compilation, even if file resides in a subdirectory.
+  # The object file name does not affect the name of the '.d' file.
+  # pgcc 10.2 will output
+  #    foo.o: sub/foo.c sub/foo.h
+  # and will wrap long lines using '\' :
+  #    foo.o: sub/foo.c ... \
+  #     sub/foo.h ... \
+  #     ...
+  set_dir_from "$object"
+  # Use the source, not the object, to determine the base name, since
+  # that's sadly what pgcc will do too.
+  set_base_from "$source"
+  tmpdepfile=$base.d
+
+  # For projects that build the same source file twice into different object
+  # files, the pgcc approach of using the *source* file root name can cause
+  # problems in parallel builds.  Use a locking strategy to avoid stomping on
+  # the same $tmpdepfile.
+  lockdir=$base.d-lock
+  trap "
+    echo '$0: caught signal, cleaning up...' >&2
+    rmdir '$lockdir'
+    exit 1
+  " 1 2 13 15
+  numtries=100
+  i=$numtries
+  while test $i -gt 0; do
+    # mkdir is a portable test-and-set.
+    if mkdir "$lockdir" 2>/dev/null; then
+      # This process acquired the lock.
+      "$@" -MD
+      stat=$?
+      # Release the lock.
+      rmdir "$lockdir"
+      break
+    else
+      # If the lock is being held by a different process, wait
+      # until the winning process is done or we timeout.
+      while test -d "$lockdir" && test $i -gt 0; do
+        sleep 1
+        i=`expr $i - 1`
+      done
+    fi
+    i=`expr $i - 1`
+  done
+  trap - 1 2 13 15
+  if test $i -le 0; then
+    echo "$0: failed to acquire lock after $numtries attempts" >&2
+    echo "$0: check lockdir '$lockdir'" >&2
+    exit 1
+  fi
+
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  # Each line is of the form `foo.o: dependent.h',
+  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
+  # Do two passes, one to just change these to
+  # `$object: dependent.h' and one to simply `dependent.h:'.
+  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
+  # Some versions of the HPUX 10.20 sed can't process this invocation
+  # correctly.  Breaking it into two sed invocations is a workaround.
+  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
+    | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+hp2)
+  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
+  # compilers, which have integrated preprocessors.  The correct option
+  # to use with these is +Maked; it writes dependencies to a file named
+  # 'foo.d', which lands next to the object file, wherever that
+  # happens to be.
+  # Much of this is similar to the tru64 case; see comments there.
+  set_dir_from  "$object"
+  set_base_from "$object"
+  if test "$libtool" = yes; then
+    tmpdepfile1=$dir$base.d
+    tmpdepfile2=$dir.libs/$base.d
+    "$@" -Wc,+Maked
+  else
+    tmpdepfile1=$dir$base.d
+    tmpdepfile2=$dir$base.d
+    "$@" +Maked
+  fi
+  stat=$?
+  if test $stat -ne 0; then
+     rm -f "$tmpdepfile1" "$tmpdepfile2"
+     exit $stat
+  fi
+
+  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
+  do
+    test -f "$tmpdepfile" && break
+  done
+  if test -f "$tmpdepfile"; then
+    sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
+    # Add 'dependent.h:' lines.
+    sed -ne '2,${
+               s/^ *//
+               s/ \\*$//
+               s/$/:/
+               p
+             }' "$tmpdepfile" >> "$depfile"
+  else
+    make_dummy_depfile
+  fi
+  rm -f "$tmpdepfile" "$tmpdepfile2"
+  ;;
+
+tru64)
+  # The Tru64 compiler uses -MD to generate dependencies as a side
+  # effect.  'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
+  # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
+  # dependencies in 'foo.d' instead, so we check for that too.
+  # Subdirectories are respected.
+  set_dir_from  "$object"
+  set_base_from "$object"
+
+  if test "$libtool" = yes; then
+    # Libtool generates 2 separate objects for the 2 libraries.  These
+    # two compilations output dependencies in $dir.libs/$base.o.d and
+    # in $dir$base.o.d.  We have to check for both files, because
+    # one of the two compilations can be disabled.  We should prefer
+    # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
+    # automatically cleaned when .libs/ is deleted, while ignoring
+    # the former would cause a distcleancheck panic.
+    tmpdepfile1=$dir$base.o.d          # libtool 1.5
+    tmpdepfile2=$dir.libs/$base.o.d    # Likewise.
+    tmpdepfile3=$dir.libs/$base.d      # Compaq CCC V6.2-504
+    "$@" -Wc,-MD
+  else
+    tmpdepfile1=$dir$base.d
+    tmpdepfile2=$dir$base.d
+    tmpdepfile3=$dir$base.d
+    "$@" -MD
+  fi
+
+  stat=$?
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+    exit $stat
+  fi
+
+  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+  do
+    test -f "$tmpdepfile" && break
+  done
+  # Same post-processing that is required for AIX mode.
+  aix_post_process_depfile
+  ;;
+
+msvc7)
+  if test "$libtool" = yes; then
+    showIncludes=-Wc,-showIncludes
+  else
+    showIncludes=-showIncludes
+  fi
+  "$@" $showIncludes > "$tmpdepfile"
+  stat=$?
+  grep -v '^Note: including file: ' "$tmpdepfile"
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  # The first sed program below extracts the file names and escapes
+  # backslashes for cygpath.  The second sed program outputs the file
+  # name when reading, but also accumulates all include files in the
+  # hold buffer in order to output them again at the end.  This only
+  # works with sed implementations that can handle large buffers.
+  sed < "$tmpdepfile" -n '
+/^Note: including file:  *\(.*\)/ {
+  s//\1/
+  s/\\/\\\\/g
+  p
+}' | $cygpath_u | sort -u | sed -n '
+s/ /\\ /g
+s/\(.*\)/'"$tab"'\1 \\/p
+s/.\(.*\) \\/\1:/
+H
+$ {
+  s/.*/'"$tab"'/
+  G
+  p
+}' >> "$depfile"
+  echo >> "$depfile" # make sure the fragment doesn't end with a backslash
+  rm -f "$tmpdepfile"
+  ;;
+
+msvc7msys)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+#nosideeffect)
+  # This comment above is used by automake to tell side-effect
+  # dependency tracking mechanisms from slower ones.
+
+dashmstdout)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout, regardless of -o.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  # Remove '-o $object'.
+  IFS=" "
+  for arg
+  do
+    case $arg in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    *)
+      set fnord "$@" "$arg"
+      shift # fnord
+      shift # $arg
+      ;;
+    esac
+  done
+
+  test -z "$dashmflag" && dashmflag=-M
+  # Require at least two characters before searching for ':'
+  # in the target name.  This is to cope with DOS-style filenames:
+  # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
+  "$@" $dashmflag |
+    sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
+  rm -f "$depfile"
+  cat < "$tmpdepfile" > "$depfile"
+  # Some versions of the HPUX 10.20 sed can't process this sed invocation
+  # correctly.  Breaking it into two sed invocations is a workaround.
+  tr ' ' "$nl" < "$tmpdepfile" \
+    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
+    | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+dashXmstdout)
+  # This case only exists to satisfy depend.m4.  It is never actually
+  # run, as this mode is specially recognized in the preamble.
+  exit 1
+  ;;
+
+makedepend)
+  "$@" || exit $?
+  # Remove any Libtool call
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+  # X makedepend
+  shift
+  cleared=no eat=no
+  for arg
+  do
+    case $cleared in
+    no)
+      set ""; shift
+      cleared=yes ;;
+    esac
+    if test $eat = yes; then
+      eat=no
+      continue
+    fi
+    case "$arg" in
+    -D*|-I*)
+      set fnord "$@" "$arg"; shift ;;
+    # Strip any option that makedepend may not understand.  Remove
+    # the object too, otherwise makedepend will parse it as a source file.
+    -arch)
+      eat=yes ;;
+    -*|$object)
+      ;;
+    *)
+      set fnord "$@" "$arg"; shift ;;
+    esac
+  done
+  obj_suffix=`echo "$object" | sed 's/^.*\././'`
+  touch "$tmpdepfile"
+  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
+  rm -f "$depfile"
+  # makedepend may prepend the VPATH from the source file name to the object.
+  # No need to regex-escape $object, excess matching of '.' is harmless.
+  sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
+  # Some versions of the HPUX 10.20 sed can't process the last invocation
+  # correctly.  Breaking it into two sed invocations is a workaround.
+  sed '1,2d' "$tmpdepfile" \
+    | tr ' ' "$nl" \
+    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
+    | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile" "$tmpdepfile".bak
+  ;;
+
+cpp)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  # Remove '-o $object'.
+  IFS=" "
+  for arg
+  do
+    case $arg in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    *)
+      set fnord "$@" "$arg"
+      shift # fnord
+      shift # $arg
+      ;;
+    esac
+  done
+
+  "$@" -E \
+    | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
+             -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
+    | sed '$ s: \\$::' > "$tmpdepfile"
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  cat < "$tmpdepfile" >> "$depfile"
+  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+msvisualcpp)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  IFS=" "
+  for arg
+  do
+    case "$arg" in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
+        set fnord "$@"
+        shift
+        shift
+        ;;
+    *)
+        set fnord "$@" "$arg"
+        shift
+        shift
+        ;;
+    esac
+  done
+  "$@" -E 2>/dev/null |
+  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
+  echo "$tab" >> "$depfile"
+  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+msvcmsys)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+none)
+  exec "$@"
+  ;;
+
+*)
+  echo "Unknown depmode $depmode" 1>&2
+  exit 1
+  ;;
+esac
+
+exit 0
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:

Deleted: trunk/contrib/file/elfclass.h
===================================================================
--- trunk/contrib/file/elfclass.h	2014-06-30 11:58:41 UTC (rev 6698)
+++ trunk/contrib/file/elfclass.h	2014-06-30 11:58:43 UTC (rev 6699)
@@ -1,70 +0,0 @@
-/*
- * Copyright (c) Christos Zoulas 2008.
- * All Rights Reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice immediately at the beginning of the file, without modification,
- *    this list of conditions, and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *  
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-	if (nbytes <= sizeof(elfhdr))
-		return 0;
-
-	u.l = 1;
-	(void)memcpy(&elfhdr, buf, sizeof elfhdr);
-	swap = (u.c[sizeof(int32_t) - 1] + 1) != elfhdr.e_ident[EI_DATA];
-
-	type = elf_getu16(swap, elfhdr.e_type);
-	switch (type) {
-#ifdef ELFCORE
-	case ET_CORE:
-		flags |= FLAGS_IS_CORE;
-		if (dophn_core(ms, clazz, swap, fd,
-		    (off_t)elf_getu(swap, elfhdr.e_phoff),
-		    elf_getu16(swap, elfhdr.e_phnum), 
-		    (size_t)elf_getu16(swap, elfhdr.e_phentsize),
-		    fsize, &flags) == -1)
-			return -1;
-		break;
-#endif
-	case ET_EXEC:
-	case ET_DYN:
-		if (dophn_exec(ms, clazz, swap, fd,
-		    (off_t)elf_getu(swap, elfhdr.e_phoff),
-		    elf_getu16(swap, elfhdr.e_phnum), 
-		    (size_t)elf_getu16(swap, elfhdr.e_phentsize),
-		    fsize, &flags, elf_getu16(swap, elfhdr.e_shnum))
-		    == -1)
-			return -1;
-		/*FALLTHROUGH*/
-	case ET_REL:
-		if (doshn(ms, clazz, swap, fd,
-		    (off_t)elf_getu(swap, elfhdr.e_shoff),
-		    elf_getu16(swap, elfhdr.e_shnum),
-		    (size_t)elf_getu16(swap, elfhdr.e_shentsize),
-		    &flags,
-		    elf_getu16(swap, elfhdr.e_machine)) == -1)
-			return -1;
-		break;
-
-	default:
-		break;
-	}
-	return 1;

Deleted: trunk/contrib/file/encoding.c
===================================================================
--- trunk/contrib/file/encoding.c	2014-06-30 11:58:41 UTC (rev 6698)
+++ trunk/contrib/file/encoding.c	2014-06-30 11:58:43 UTC (rev 6699)
@@ -1,501 +0,0 @@
-/*
- * Copyright (c) Ian F. Darwin 1986-1995.
- * Software written by Ian F. Darwin and others;
- * maintained 1995-present by Christos Zoulas and others.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice immediately at the beginning of the file, without modification,
- *    this list of conditions, and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-/*
- * Encoding -- determine the character encoding of a text file.
- *
- * Joerg Wunsch <joerg at freebsd.org> wrote the original support for 8-bit
- * international characters.
- */
-
-#include "file.h"
-
-#ifndef	lint
-FILE_RCSID("@(#)$File: encoding.c,v 1.5 2010/07/21 16:47:17 christos Exp $")
-#endif	/* lint */
-
-#include "magic.h"
-#include <string.h>
-#include <memory.h>
-#include <stdlib.h>
-
-
-private int looks_ascii(const unsigned char *, size_t, unichar *, size_t *);
-private int looks_utf8_with_BOM(const unsigned char *, size_t, unichar *,
-    size_t *);
-private int looks_ucs16(const unsigned char *, size_t, unichar *, size_t *);
-private int looks_latin1(const unsigned char *, size_t, unichar *, size_t *);
-private int looks_extended(const unsigned char *, size_t, unichar *, size_t *);
-private void from_ebcdic(const unsigned char *, size_t, unsigned char *);
-
-#ifdef DEBUG_ENCODING
-#define DPRINTF(a) printf a
-#else
-#define DPRINTF(a)
-#endif
-
-/*
- * Try to determine whether text is in some character code we can
- * identify.  Each of these tests, if it succeeds, will leave
- * the text converted into one-unichar-per-character Unicode in
- * ubuf, and the number of characters converted in ulen.
- */
-protected int
-file_encoding(struct magic_set *ms, const unsigned char *buf, size_t nbytes, unichar **ubuf, size_t *ulen, const char **code, const char **code_mime, const char **type)
-{
-	size_t mlen;
-	int rv = 1, ucs_type;
-	unsigned char *nbuf = NULL;
-
-	mlen = (nbytes + 1) * sizeof(nbuf[0]);
-	if ((nbuf = CAST(unsigned char *, calloc((size_t)1, mlen))) == NULL) {
-		file_oomem(ms, mlen);
-		goto done;
-	}
-	mlen = (nbytes + 1) * sizeof((*ubuf)[0]);
-	if ((*ubuf = CAST(unichar *, calloc((size_t)1, mlen))) == NULL) {
-		file_oomem(ms, mlen);
-		goto done;
-	}
-
-	*type = "text";
-	if (looks_ascii(buf, nbytes, *ubuf, ulen)) {
-		DPRINTF(("ascii %" SIZE_T_FORMAT "u\n", *ulen));
-		*code = "ASCII";
-		*code_mime = "us-ascii";
-	} else if (looks_utf8_with_BOM(buf, nbytes, *ubuf, ulen) > 0) {
-		DPRINTF(("utf8/bom %" SIZE_T_FORMAT "u\n", *ulen));
-		*code = "UTF-8 Unicode (with BOM)";
-		*code_mime = "utf-8";
-	} else if (file_looks_utf8(buf, nbytes, *ubuf, ulen) > 1) {
-		DPRINTF(("utf8 %" SIZE_T_FORMAT "u\n", *ulen));
-		*code = "UTF-8 Unicode (with BOM)";
-		*code = "UTF-8 Unicode";
-		*code_mime = "utf-8";
-	} else if ((ucs_type = looks_ucs16(buf, nbytes, *ubuf, ulen)) != 0) {
-		if (ucs_type == 1) {
-			*code = "Little-endian UTF-16 Unicode";
-			*code_mime = "utf-16le";
-		} else {
-			*code = "Big-endian UTF-16 Unicode";
-			*code_mime = "utf-16be";
-		}
-		DPRINTF(("ucs16 %" SIZE_T_FORMAT "u\n", *ulen));
-	} else if (looks_latin1(buf, nbytes, *ubuf, ulen)) {
-		DPRINTF(("latin1 %" SIZE_T_FORMAT "u\n", *ulen));
-		*code = "ISO-8859";
-		*code_mime = "iso-8859-1";
-	} else if (looks_extended(buf, nbytes, *ubuf, ulen)) {
-		DPRINTF(("extended %" SIZE_T_FORMAT "u\n", *ulen));
-		*code = "Non-ISO extended-ASCII";
-		*code_mime = "unknown-8bit";
-	} else {
-		from_ebcdic(buf, nbytes, nbuf);
-
-		if (looks_ascii(nbuf, nbytes, *ubuf, ulen)) {
-			DPRINTF(("ebcdic %" SIZE_T_FORMAT "u\n", *ulen));
-			*code = "EBCDIC";
-			*code_mime = "ebcdic";
-		} else if (looks_latin1(nbuf, nbytes, *ubuf, ulen)) {
-			DPRINTF(("ebcdic/international %" SIZE_T_FORMAT "u\n",
-			    *ulen));
-			*code = "International EBCDIC";
-			*code_mime = "ebcdic";
-		} else { /* Doesn't look like text at all */
-			DPRINTF(("binary\n"));
-			rv = 0;
-			*type = "binary";
-		}
-	}
-
- done:
-	if (nbuf)
-		free(nbuf);
-
-	return rv;
-}
-
-/*
- * This table reflects a particular philosophy about what constitutes
- * "text," and there is room for disagreement about it.
- *
- * Version 3.31 of the file command considered a file to be ASCII if
- * each of its characters was approved by either the isascii() or
- * isalpha() function.  On most systems, this would mean that any
- * file consisting only of characters in the range 0x00 ... 0x7F
- * would be called ASCII text, but many systems might reasonably
- * consider some characters outside this range to be alphabetic,
- * so the file command would call such characters ASCII.  It might
- * have been more accurate to call this "considered textual on the
- * local system" than "ASCII."
- *
- * It considered a file to be "International language text" if each
- * of its characters was either an ASCII printing character (according
- * to the real ASCII standard, not the above test), a character in
- * the range 0x80 ... 0xFF, or one of the following control characters:
- * backspace, tab, line feed, vertical tab, form feed, carriage return,
- * escape.  No attempt was made to determine the language in which files
- * of this type were written.
- *
- *
- * The table below considers a file to be ASCII if all of its characters
- * are either ASCII printing characters (again, according to the X3.4
- * standard, not isascii()) or any of the following controls: bell,
- * backspace, tab, line feed, form feed, carriage return, esc, nextline.
- *
- * I include bell because some programs (particularly shell scripts)
- * use it literally, even though it is rare in normal text.  I exclude
- * vertical tab because it never seems to be used in real text.  I also
- * include, with hesitation, the X3.64/ECMA-43 control nextline (0x85),
- * because that's what the dd EBCDIC->ASCII table maps the EBCDIC newline
- * character to.  It might be more appropriate to include it in the 8859
- * set instead of the ASCII set, but it's got to be included in *something*
- * we recognize or EBCDIC files aren't going to be considered textual.
- * Some old Unix source files use SO/SI (^N/^O) to shift between Greek
- * and Latin characters, so these should possibly be allowed.  But they
- * make a real mess on VT100-style displays if they're not paired properly,
- * so we are probably better off not calling them text.
- *
- * A file is considered to be ISO-8859 text if its characters are all
- * either ASCII, according to the above definition, or printing characters
- * from the ISO-8859 8-bit extension, characters 0xA0 ... 0xFF.
- *
- * Finally, a file is considered to be international text from some other
- * character code if its characters are all either ISO-8859 (according to
- * the above definition) or characters in the range 0x80 ... 0x9F, which
- * ISO-8859 considers to be control characters but the IBM PC and Macintosh
- * consider to be printing characters.
- */
-
-#define F 0   /* character never appears in text */
-#define T 1   /* character appears in plain ASCII text */
-#define I 2   /* character appears in ISO-8859 text */
-#define X 3   /* character appears in non-ISO extended ASCII (Mac, IBM PC) */
-
-private char text_chars[256] = {
-	/*                  BEL BS HT LF    FF CR    */
-	F, F, F, F, F, F, F, T, T, T, T, F, T, T, F, F,  /* 0x0X */
-	/*                              ESC          */
-	F, F, F, F, F, F, F, F, F, F, F, T, F, F, F, F,  /* 0x1X */
-	T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,  /* 0x2X */
-	T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,  /* 0x3X */
-	T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,  /* 0x4X */
-	T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,  /* 0x5X */
-	T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T,  /* 0x6X */
-	T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, F,  /* 0x7X */
-	/*            NEL                            */
-	X, X, X, X, X, T, X, X, X, X, X, X, X, X, X, X,  /* 0x8X */
-	X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X,  /* 0x9X */
-	I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I,  /* 0xaX */
-	I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I,  /* 0xbX */
-	I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I,  /* 0xcX */
-	I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I,  /* 0xdX */
-	I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I,  /* 0xeX */
-	I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I   /* 0xfX */
-};
-
-private int
-looks_ascii(const unsigned char *buf, size_t nbytes, unichar *ubuf,
-    size_t *ulen)
-{
-	size_t i;
-
-	*ulen = 0;
-
-	for (i = 0; i < nbytes; i++) {
-		int t = text_chars[buf[i]];
-
-		if (t != T)
-			return 0;
-
-		ubuf[(*ulen)++] = buf[i];
-	}
-
-	return 1;
-}
-
-private int
-looks_latin1(const unsigned char *buf, size_t nbytes, unichar *ubuf, size_t *ulen)
-{
-	size_t i;
-
-	*ulen = 0;
-
-	for (i = 0; i < nbytes; i++) {
-		int t = text_chars[buf[i]];
-
-		if (t != T && t != I)
-			return 0;
-
-		ubuf[(*ulen)++] = buf[i];
-	}
-
-	return 1;
-}
-
-private int
-looks_extended(const unsigned char *buf, size_t nbytes, unichar *ubuf,
-    size_t *ulen)
-{
-	size_t i;
-
-	*ulen = 0;
-
-	for (i = 0; i < nbytes; i++) {
-		int t = text_chars[buf[i]];
-
-		if (t != T && t != I && t != X)
-			return 0;
-
-		ubuf[(*ulen)++] = buf[i];
-	}
-
-	return 1;
-}
-
-/*
- * Decide whether some text looks like UTF-8. Returns:
- *
- *     -1: invalid UTF-8
- *      0: uses odd control characters, so doesn't look like text
- *      1: 7-bit text
- *      2: definitely UTF-8 text (valid high-bit set bytes)
- *
- * If ubuf is non-NULL on entry, text is decoded into ubuf, *ulen;
- * ubuf must be big enough!
- */
-protected int
-file_looks_utf8(const unsigned char *buf, size_t nbytes, unichar *ubuf, size_t *ulen)
-{
-	size_t i;
-	int n;
-	unichar c;
-	int gotone = 0, ctrl = 0;
-
-	if (ubuf)
-		*ulen = 0;
-
-	for (i = 0; i < nbytes; i++) {
-		if ((buf[i] & 0x80) == 0) {	   /* 0xxxxxxx is plain ASCII */
-			/*
-			 * Even if the whole file is valid UTF-8 sequences,
-			 * still reject it if it uses weird control characters.
-			 */
-
-			if (text_chars[buf[i]] != T)
-				ctrl = 1;
-
-			if (ubuf)
-				ubuf[(*ulen)++] = buf[i];
-		} else if ((buf[i] & 0x40) == 0) { /* 10xxxxxx never 1st byte */
-			return -1;
-		} else {			   /* 11xxxxxx begins UTF-8 */
-			int following;
-
-			if ((buf[i] & 0x20) == 0) {		/* 110xxxxx */
-				c = buf[i] & 0x1f;
-				following = 1;
-			} else if ((buf[i] & 0x10) == 0) {	/* 1110xxxx */
-				c = buf[i] & 0x0f;
-				following = 2;
-			} else if ((buf[i] & 0x08) == 0) {	/* 11110xxx */
-				c = buf[i] & 0x07;
-				following = 3;
-			} else if ((buf[i] & 0x04) == 0) {	/* 111110xx */
-				c = buf[i] & 0x03;
-				following = 4;
-			} else if ((buf[i] & 0x02) == 0) {	/* 1111110x */
-				c = buf[i] & 0x01;
-				following = 5;
-			} else
-				return -1;
-
-			for (n = 0; n < following; n++) {
-				i++;
-				if (i >= nbytes)
-					goto done;
-
-				if ((buf[i] & 0x80) == 0 || (buf[i] & 0x40))
-					return -1;
-
-				c = (c << 6) + (buf[i] & 0x3f);
-			}
-
-			if (ubuf)
-				ubuf[(*ulen)++] = c;
-			gotone = 1;
-		}
-	}
-done:
-	return ctrl ? 0 : (gotone ? 2 : 1);
-}
-
-/*
- * Decide whether some text looks like UTF-8 with BOM. If there is no
- * BOM, return -1; otherwise return the result of looks_utf8 on the
- * rest of the text.
- */
-private int
-looks_utf8_with_BOM(const unsigned char *buf, size_t nbytes, unichar *ubuf,
-    size_t *ulen)
-{
-	if (nbytes > 3 && buf[0] == 0xef && buf[1] == 0xbb && buf[2] == 0xbf)
-		return file_looks_utf8(buf + 3, nbytes - 3, ubuf, ulen);
-	else
-		return -1;
-}
-
-private int
-looks_ucs16(const unsigned char *buf, size_t nbytes, unichar *ubuf,
-    size_t *ulen)
-{
-	int bigend;
-	size_t i;
-
-	if (nbytes < 2)
-		return 0;
-
-	if (buf[0] == 0xff && buf[1] == 0xfe)
-		bigend = 0;
-	else if (buf[0] == 0xfe && buf[1] == 0xff)
-		bigend = 1;
-	else
-		return 0;
-
-	*ulen = 0;
-
-	for (i = 2; i + 1 < nbytes; i += 2) {
-		/* XXX fix to properly handle chars > 65536 */
-
-		if (bigend)
-			ubuf[(*ulen)++] = buf[i + 1] + 256 * buf[i];
-		else
-			ubuf[(*ulen)++] = buf[i] + 256 * buf[i + 1];
-
-		if (ubuf[*ulen - 1] == 0xfffe)
-			return 0;
-		if (ubuf[*ulen - 1] < 128 &&
-		    text_chars[(size_t)ubuf[*ulen - 1]] != T)
-			return 0;
-	}
-
-	return 1 + bigend;
-}
-
-#undef F
-#undef T
-#undef I
-#undef X
-
-/*
- * This table maps each EBCDIC character to an (8-bit extended) ASCII
- * character, as specified in the rationale for the dd(1) command in
- * draft 11.2 (September, 1991) of the POSIX P1003.2 standard.
- *
- * Unfortunately it does not seem to correspond exactly to any of the
- * five variants of EBCDIC documented in IBM's _Enterprise Systems
- * Architecture/390: Principles of Operation_, SA22-7201-06, Seventh
- * Edition, July, 1999, pp. I-1 - I-4.
- *
- * Fortunately, though, all versions of EBCDIC, including this one, agree
- * on most of the printing characters that also appear in (7-bit) ASCII.
- * Of these, only '|', '!', '~', '^', '[', and ']' are in question at all.
- *
- * Fortunately too, there is general agreement that codes 0x00 through
- * 0x3F represent control characters, 0x41 a nonbreaking space, and the
- * remainder printing characters.
- *
- * This is sufficient to allow us to identify EBCDIC text and to distinguish
- * between old-style and internationalized examples of text.
- */
-
-private unsigned char ebcdic_to_ascii[] = {
-  0,   1,   2,   3, 156,   9, 134, 127, 151, 141, 142,  11,  12,  13,  14,  15,
- 16,  17,  18,  19, 157, 133,   8, 135,  24,  25, 146, 143,  28,  29,  30,  31,
-128, 129, 130, 131, 132,  10,  23,  27, 136, 137, 138, 139, 140,   5,   6,   7,
-144, 145,  22, 147, 148, 149, 150,   4, 152, 153, 154, 155,  20,  21, 158,  26,
-' ', 160, 161, 162, 163, 164, 165, 166, 167, 168, 213, '.', '<', '(', '+', '|',
-'&', 169, 170, 171, 172, 173, 174, 175, 176, 177, '!', '$', '*', ')', ';', '~',
-'-', '/', 178, 179, 180, 181, 182, 183, 184, 185, 203, ',', '%', '_', '>', '?',
-186, 187, 188, 189, 190, 191, 192, 193, 194, '`', ':', '#', '@', '\'','=', '"',
-195, 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 196, 197, 198, 199, 200, 201,
-202, 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', '^', 204, 205, 206, 207, 208,
-209, 229, 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 210, 211, 212, '[', 214, 215,
-216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, ']', 230, 231,
-'{', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 232, 233, 234, 235, 236, 237,
-'}', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 238, 239, 240, 241, 242, 243,
-'\\',159, 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 244, 245, 246, 247, 248, 249,
-'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 250, 251, 252, 253, 254, 255
-};
-
-#ifdef notdef
-/*
- * The following EBCDIC-to-ASCII table may relate more closely to reality,
- * or at least to modern reality.  It comes from
- *
- *   http://ftp.s390.ibm.com/products/oe/bpxqp9.html
- *
- * and maps the characters of EBCDIC code page 1047 (the code used for
- * Unix-derived software on IBM's 390 systems) to the corresponding
- * characters from ISO 8859-1.
- *
- * If this table is used instead of the above one, some of the special
- * cases for the NEL character can be taken out of the code.
- */
-
-private unsigned char ebcdic_1047_to_8859[] = {
-0x00,0x01,0x02,0x03,0x9C,0x09,0x86,0x7F,0x97,0x8D,0x8E,0x0B,0x0C,0x0D,0x0E,0x0F,
-0x10,0x11,0x12,0x13,0x9D,0x0A,0x08,0x87,0x18,0x19,0x92,0x8F,0x1C,0x1D,0x1E,0x1F,
-0x80,0x81,0x82,0x83,0x84,0x85,0x17,0x1B,0x88,0x89,0x8A,0x8B,0x8C,0x05,0x06,0x07,
-0x90,0x91,0x16,0x93,0x94,0x95,0x96,0x04,0x98,0x99,0x9A,0x9B,0x14,0x15,0x9E,0x1A,
-0x20,0xA0,0xE2,0xE4,0xE0,0xE1,0xE3,0xE5,0xE7,0xF1,0xA2,0x2E,0x3C,0x28,0x2B,0x7C,
-0x26,0xE9,0xEA,0xEB,0xE8,0xED,0xEE,0xEF,0xEC,0xDF,0x21,0x24,0x2A,0x29,0x3B,0x5E,
-0x2D,0x2F,0xC2,0xC4,0xC0,0xC1,0xC3,0xC5,0xC7,0xD1,0xA6,0x2C,0x25,0x5F,0x3E,0x3F,
-0xF8,0xC9,0xCA,0xCB,0xC8,0xCD,0xCE,0xCF,0xCC,0x60,0x3A,0x23,0x40,0x27,0x3D,0x22,
-0xD8,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0xAB,0xBB,0xF0,0xFD,0xFE,0xB1,
-0xB0,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,0x70,0x71,0x72,0xAA,0xBA,0xE6,0xB8,0xC6,0xA4,
-0xB5,0x7E,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0xA1,0xBF,0xD0,0x5B,0xDE,0xAE,
-0xAC,0xA3,0xA5,0xB7,0xA9,0xA7,0xB6,0xBC,0xBD,0xBE,0xDD,0xA8,0xAF,0x5D,0xB4,0xD7,
-0x7B,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0xAD,0xF4,0xF6,0xF2,0xF3,0xF5,
-0x7D,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,0x50,0x51,0x52,0xB9,0xFB,0xFC,0xF9,0xFA,0xFF,
-0x5C,0xF7,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0xB2,0xD4,0xD6,0xD2,0xD3,0xD5,
-0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0xB3,0xDB,0xDC,0xD9,0xDA,0x9F
-};
-#endif
-
-/*
- * Copy buf[0 ... nbytes-1] into out[], translating EBCDIC to ASCII.
- */
-private void
-from_ebcdic(const unsigned char *buf, size_t nbytes, unsigned char *out)
-{
-	size_t i;
-
-	for (i = 0; i < nbytes; i++) {
-		out[i] = ebcdic_to_ascii[buf[i]];
-	}
-}

Deleted: trunk/contrib/file/file.c
===================================================================
--- trunk/contrib/file/file.c	2014-06-30 11:58:41 UTC (rev 6698)
+++ trunk/contrib/file/file.c	2014-06-30 11:58:43 UTC (rev 6699)
@@ -1,498 +0,0 @@
-/*
- * Copyright (c) Ian F. Darwin 1986-1995.
- * Software written by Ian F. Darwin and others;
- * maintained 1995-present by Christos Zoulas and others.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice immediately at the beginning of the file, without modification,
- *    this list of conditions, and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-/*
- * file - find type of a file or files - main program.
- */
-
-#include "file.h"
-
-#ifndef	lint
-FILE_RCSID("@(#)$File: file.c,v 1.140 2010/11/30 14:58:53 rrt Exp $")
-#endif	/* lint */
-
-#include "magic.h"
-
-#include <stdlib.h>
-#include <unistd.h>
-#include <string.h>
-#ifdef RESTORE_TIME
-# if (__COHERENT__ >= 0x420)
-#  include <sys/utime.h>
-# else
-#  ifdef USE_UTIMES
-#   include <sys/time.h>
-#  else
-#   include <utime.h>
-#  endif
-# endif
-#endif
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>	/* for read() */
-#endif
-#ifdef HAVE_LOCALE_H
-#include <locale.h>
-#endif
-#ifdef HAVE_WCHAR_H
-#include <wchar.h>
-#endif
-
-#if defined(HAVE_GETOPT_H) && defined(HAVE_STRUCT_OPTION)
-#include <getopt.h>
-#ifndef HAVE_GETOPT_LONG
-int getopt_long(int argc, char * const *argv, const char *optstring, const struct option *longopts, int *longindex);
-#endif
-#else
-#include "mygetopt.h"
-#endif
-
-#include "patchlevel.h"
-
-#ifdef S_IFLNK
-#define FILE_FLAGS "-bchikLlNnprsvz0"
-#else
-#define FILE_FLAGS "-bciklNnprsvz0"
-#endif
-
-# define USAGE  \
-    "Usage: %s [" FILE_FLAGS \
-	"] [--apple] [--mime-encoding] [--mime-type]\n" \
-    "            [-e testname] [-F separator] [-f namefile] [-m magicfiles] " \
-    "file ...\n" \
-    "       %s -C [-m magicfiles]\n" \
-    "       %s [--help]\n"
-
-#ifndef MAXPATHLEN
-#define	MAXPATHLEN	1024
-#endif
-
-private int 		/* Global command-line options 		*/
-	bflag = 0,	/* brief output format	 		*/
-	nopad = 0,	/* Don't pad output			*/
-	nobuffer = 0,   /* Do not buffer stdout 		*/
-	nulsep = 0;	/* Append '\0' to the separator		*/
-
-private const char *separator = ":";	/* Default field separator	*/
-private const struct option long_options[] = {
-#define OPT(shortname, longname, opt, doc)      \
-    {longname, opt, NULL, shortname},
-#define OPT_LONGONLY(longname, opt, doc)        \
-    {longname, opt, NULL, 0},
-#include "file_opts.h"
-#undef OPT
-#undef OPT_LONGONLY
-    {0, 0, NULL, 0}
-};
-#define OPTSTRING	"bcCde:f:F:hiklLm:nNprsvz0"
-
-private const struct {
-	const char *name;
-	int value;
-} nv[] = {
-	{ "apptype",	MAGIC_NO_CHECK_APPTYPE },
-	{ "ascii",	MAGIC_NO_CHECK_ASCII },
-	{ "cdf",	MAGIC_NO_CHECK_CDF },
-	{ "compress",	MAGIC_NO_CHECK_COMPRESS },
-	{ "elf",	MAGIC_NO_CHECK_ELF },
-	{ "encoding",	MAGIC_NO_CHECK_ENCODING },
-	{ "soft",	MAGIC_NO_CHECK_SOFT },
-	{ "tar",	MAGIC_NO_CHECK_TAR },
-	{ "text",	MAGIC_NO_CHECK_TEXT },	/* synonym for ascii */
-	{ "tokens",	MAGIC_NO_CHECK_TOKENS },
-};
-
-private char *progname;		/* used throughout 		*/
-
-private void usage(void);
-private void help(void);
-int main(int, char *[]);
-
-private int unwrap(struct magic_set *, const char *);
-private int process(struct magic_set *ms, const char *, int);
-private struct magic_set *load(const char *, int);
-
-
-/*
- * main - parse arguments and handle options
- */
-int
-main(int argc, char *argv[])
-{
-	int c;
-	size_t i;
-	int action = 0, didsomefiles = 0, errflg = 0;
-	int flags = 0, e = 0;
-	struct magic_set *magic = NULL;
-	int longindex;
-	const char *magicfile = NULL;		/* where the magic is	*/
-
-	/* makes islower etc work for other langs */
-	(void)setlocale(LC_CTYPE, "");
-
-#ifdef __EMX__
-	/* sh-like wildcard expansion! Shouldn't hurt at least ... */
-	_wildcard(&argc, &argv);
-#endif
-
-	if ((progname = strrchr(argv[0], '/')) != NULL)
-		progname++;
-	else
-		progname = argv[0];
-
-#ifdef S_IFLNK
-	flags |= getenv("POSIXLY_CORRECT") ? MAGIC_SYMLINK : 0;
-#endif
-	while ((c = getopt_long(argc, argv, OPTSTRING, long_options,
-	    &longindex)) != -1)
-		switch (c) {
-		case 0 :
-			switch (longindex) {
-			case 0:
-				help();
-				break;
-			case 10:
-				flags |= MAGIC_APPLE;
-				break;
-			case 11:
-				flags |= MAGIC_MIME_TYPE;
-				break;
-			case 12:
-				flags |= MAGIC_MIME_ENCODING;
-				break;
-			}
-			break;
-		case '0':
-			nulsep = 1;
-			break;
-		case 'b':
-			bflag++;
-			break;
-		case 'c':
-			action = FILE_CHECK;
-			break;
-		case 'C':
-			action = FILE_COMPILE;
-			break;
-		case 'd':
-			flags |= MAGIC_DEBUG|MAGIC_CHECK;
-			break;
-		case 'e':
-			for (i = 0; i < sizeof(nv) / sizeof(nv[0]); i++)
-				if (strcmp(nv[i].name, optarg) == 0)
-					break;
-
-			if (i == sizeof(nv) / sizeof(nv[0]))
-				errflg++;
-			else
-				flags |= nv[i].value;
-			break;
-
-		case 'f':
-			if(action)
-				usage();
-			if (magic == NULL)
-				if ((magic = load(magicfile, flags)) == NULL)
-					return 1;
-			e |= unwrap(magic, optarg);
-			++didsomefiles;
-			break;
-		case 'F':
-			separator = optarg;
-			break;
-		case 'i':
-			flags |= MAGIC_MIME;
-			break;
-		case 'k':
-			flags |= MAGIC_CONTINUE;
-			break;
-		case 'l':
-			action = FILE_LIST;
-			break;
-		case 'm':
-			magicfile = optarg;
-			break;
-		case 'n':
-			++nobuffer;
-			break;
-		case 'N':
-			++nopad;
-			break;
-#if defined(HAVE_UTIME) || defined(HAVE_UTIMES)
-		case 'p':
-			flags |= MAGIC_PRESERVE_ATIME;
-			break;
-#endif
-		case 'r':
-			flags |= MAGIC_RAW;
-			break;
-		case 's':
-			flags |= MAGIC_DEVICES;
-			break;
-		case 'v':
-			if (magicfile == NULL)
-				magicfile = magic_getpath(magicfile, action);
-			(void)fprintf(stderr, "%s-%d.%.2d\n", progname,
-				       FILE_VERSION_MAJOR, patchlevel);
-			(void)fprintf(stderr, "magic file from %s\n",
-				       magicfile);
-			return 1;
-		case 'z':
-			flags |= MAGIC_COMPRESS;
-			break;
-#ifdef S_IFLNK
-		case 'L':
-			flags |= MAGIC_SYMLINK;
-			break;
-		case 'h':
-			flags &= ~MAGIC_SYMLINK;
-			break;
-#endif
-		case '?':
-		default:
-			errflg++;
-			break;
-		}
-
-	if (errflg) {
-		usage();
-	}
-	if (e)
-		return e;
-
-	switch(action) {
-	case FILE_CHECK:
-	case FILE_COMPILE:
-	case FILE_LIST:
-		/*
-		 * Don't try to check/compile ~/.magic unless we explicitly
-		 * ask for it.
-		 */
-		magic = magic_open(flags|MAGIC_CHECK);
-		if (magic == NULL) {
-			(void)fprintf(stderr, "%s: %s\n", progname,
-			    strerror(errno));
-			return 1;
-		}
-		switch(action) {
-		case FILE_CHECK:
-			c = magic_check(magic, magicfile);
-			break;
-		case FILE_COMPILE:
-			c = magic_compile(magic, magicfile);
-			break;
-		case FILE_LIST:
-			c = magic_list(magic, magicfile);
-			break;
-		default:
-			abort();
-		}
-		if (c == -1) {
-			(void)fprintf(stderr, "%s: %s\n", progname,
-			    magic_error(magic));
-			return 1;
-		}
-		return 0;
-	default:
-		if (magic == NULL)
-			if ((magic = load(magicfile, flags)) == NULL)
-				return 1;
-		break;
-	}
-
-	if (optind == argc) {
-		if (!didsomefiles)
-			usage();
-	}
-	else {
-		size_t j, wid, nw;
-		for (wid = 0, j = (size_t)optind; j < (size_t)argc; j++) {
-			nw = file_mbswidth(argv[j]);
-			if (nw > wid)
-				wid = nw;
-		}
-		/*
-		 * If bflag is only set twice, set it depending on
-		 * number of files [this is undocumented, and subject to change]
-		 */
-		if (bflag == 2) {
-			bflag = optind >= argc - 1;
-		}
-		for (; optind < argc; optind++)
-			e |= process(magic, argv[optind], wid);
-	}
-
-	if (magic)
-		magic_close(magic);
-	return e;
-}
-
-
-private struct magic_set *
-/*ARGSUSED*/
-load(const char *magicfile, int flags)
-{
-	struct magic_set *magic = magic_open(flags);
-	if (magic == NULL) {
-		(void)fprintf(stderr, "%s: %s\n", progname, strerror(errno));
-		return NULL;
-	}
-	if (magic_load(magic, magicfile) == -1) {
-		(void)fprintf(stderr, "%s: %s\n",
-		    progname, magic_error(magic));
-		magic_close(magic);
-		return NULL;
-	}
-	return magic;
-}
-
-/*
- * unwrap -- read a file of filenames, do each one.
- */
-private int
-unwrap(struct magic_set *ms, const char *fn)
-{
-	char buf[MAXPATHLEN];
-	FILE *f;
-	int wid = 0, cwid;
-	int e = 0;
-
-	if (strcmp("-", fn) == 0) {
-		f = stdin;
-		wid = 1;
-	} else {
-		if ((f = fopen(fn, "r")) == NULL) {
-			(void)fprintf(stderr, "%s: Cannot open `%s' (%s).\n",
-			    progname, fn, strerror(errno));
-			return 1;
-		}
-
-		while (fgets(buf, sizeof(buf), f) != NULL) {
-			buf[strcspn(buf, "\n")] = '\0';
-			cwid = file_mbswidth(buf);
-			if (cwid > wid)
-				wid = cwid;
-		}
-
-		rewind(f);
-	}
-
-	while (fgets(buf, sizeof(buf), f) != NULL) {
-		buf[strcspn(buf, "\n")] = '\0';
-		e |= process(ms, buf, wid);
-		if(nobuffer)
-			(void)fflush(stdout);
-	}
-
-	(void)fclose(f);
-	return e;
-}
-
-/*
- * Called for each input file on the command line (or in a list of files)
- */
-private int
-process(struct magic_set *ms, const char *inname, int wid)
-{
-	const char *type;
-	int std_in = strcmp(inname, "-") == 0;
-
-	if (wid > 0 && !bflag) {
-		(void)printf("%s", std_in ? "/dev/stdin" : inname);
-		if (nulsep)
-			(void)putc('\0', stdout);
-		(void)printf("%s", separator);
-		(void)printf("%*s ",
-		    (int) (nopad ? 0 : (wid - file_mbswidth(inname))), "");
-	}
-
-	type = magic_file(ms, std_in ? NULL : inname);
-	if (type == NULL) {
-		(void)printf("ERROR: %s\n", magic_error(ms));
-		return 1;
-	} else {
-		(void)printf("%s\n", type);
-		return 0;
-	}
-}
-
-size_t
-file_mbswidth(const char *s)
-{
-#if defined(HAVE_WCHAR_H) && defined(HAVE_MBRTOWC) && defined(HAVE_WCWIDTH)
-	size_t bytesconsumed, old_n, n, width = 0;
-	mbstate_t state;
-	wchar_t nextchar;
-	(void)memset(&state, 0, sizeof(mbstate_t));
-	old_n = n = strlen(s);
-
-	while (n > 0) {
-		bytesconsumed = mbrtowc(&nextchar, s, n, &state);
-		if (bytesconsumed == (size_t)(-1) ||
-		    bytesconsumed == (size_t)(-2)) {
-			/* Something went wrong, return something reasonable */
-			return old_n;
-		}
-		if (s[0] == '\n') {
-			/*
-			 * do what strlen() would do, so that caller
-			 * is always right
-			 */
-			width++;
-		} else
-			width += wcwidth(nextchar);
-
-		s += bytesconsumed, n -= bytesconsumed;
-	}
-	return width;
-#else
-	return strlen(s);
-#endif
-}
-
-private void
-usage(void)
-{
-	(void)fprintf(stderr, USAGE, progname, progname, progname);
-	exit(1);
-}
-
-private void
-help(void)
-{
-	(void)fputs(
-"Usage: file [OPTION...] [FILE...]\n"
-"Determine type of FILEs.\n"
-"\n", stderr);
-#define OPT(shortname, longname, opt, doc)      \
-	fprintf(stderr, "  -%c, --" longname doc, shortname);
-#define OPT_LONGONLY(longname, opt, doc)        \
-	fprintf(stderr, "      --" longname doc);
-#include "file_opts.h"
-#undef OPT
-#undef OPT_LONGONLY
-	exit(0);
-}

Deleted: trunk/contrib/file/file.h
===================================================================
--- trunk/contrib/file/file.h	2014-06-30 11:58:41 UTC (rev 6698)
+++ trunk/contrib/file/file.h	2014-06-30 11:58:43 UTC (rev 6699)
@@ -1,490 +0,0 @@
-/*
- * Copyright (c) Ian F. Darwin 1986-1995.
- * Software written by Ian F. Darwin and others;
- * maintained 1995-present by Christos Zoulas and others.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice immediately at the beginning of the file, without modification,
- *    this list of conditions, and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-/*
- * file.h - definitions for file(1) program
- * @(#)$File: file.h,v 1.130 2011/01/04 19:29:32 rrt Exp $
- */
-
-#ifndef __file_h__
-#define __file_h__
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#ifdef WIN32
-  #ifdef _WIN64
-    #define SIZE_T_FORMAT "I64"
-  #else
-    #define SIZE_T_FORMAT ""
-  #endif
-  #define INT64_T_FORMAT "I64"
-#else
-  #define SIZE_T_FORMAT "z"
-  #define INT64_T_FORMAT "ll"
-#endif
-
-#include <stdio.h>	/* Include that here, to make sure __P gets defined */
-#include <errno.h>
-#include <fcntl.h>	/* For open and flags */
-#ifdef HAVE_STDINT_H
-#ifndef __STDC_LIMIT_MACROS
-#define __STDC_LIMIT_MACROS
-#endif
-#include <stdint.h>
-#endif
-#ifdef HAVE_INTTYPES_H
-#include <inttypes.h>
-#endif
-#include <regex.h>
-#include <sys/types.h>
-#include <sys/param.h>
-/* Do this here and now, because struct stat gets re-defined on solaris */
-#include <sys/stat.h>
-#include <stdarg.h>
-
-#define ENABLE_CONDITIONALS
-
-#ifndef MAGIC
-#define MAGIC "/etc/magic"
-#endif
-
-#if defined(__EMX__) || defined (WIN32)
-#define PATHSEP	';'
-#else
-#define PATHSEP	':'
-#endif
-
-#define private static
-#ifndef protected
-#define protected
-#endif
-#define public
-
-#ifndef __GNUC_PREREQ__
-#ifdef __GNUC__
-#define	__GNUC_PREREQ__(x, y)						\
-	((__GNUC__ == (x) && __GNUC_MINOR__ >= (y)) ||			\
-	 (__GNUC__ > (x)))
-#else
-#define	__GNUC_PREREQ__(x, y)	0
-#endif
-#endif
-
-#ifndef __GNUC__
-#ifndef __attribute__
-#define __attribute__(a)
-#endif
-#endif
-
-#ifndef MIN
-#define	MIN(a,b)	(((a) < (b)) ? (a) : (b))
-#endif
-
-#ifndef MAX
-#define	MAX(a,b)	(((a) > (b)) ? (a) : (b))
-#endif
-
-#ifndef HOWMANY
-# define HOWMANY (256 * 1024)	/* how much of the file to look at */
-#endif
-#define MAXMAGIS 8192		/* max entries in any one magic file
-				   or directory */
-#define MAXDESC	64		/* max leng of text description/MIME type */
-#define MAXstring 64		/* max leng of "string" types */
-
-#define MAGICNO		0xF11E041C
-#define VERSIONNO	8
-#define FILE_MAGICSIZE	232
-
-#define	FILE_LOAD	0
-#define FILE_CHECK	1
-#define FILE_COMPILE	2
-#define FILE_LIST	3
-
-union VALUETYPE {
-	uint8_t b;
-	uint16_t h;
-	uint32_t l;
-	uint64_t q;
-	uint8_t hs[2];	/* 2 bytes of a fixed-endian "short" */
-	uint8_t hl[4];	/* 4 bytes of a fixed-endian "long" */
-	uint8_t hq[8];	/* 8 bytes of a fixed-endian "quad" */
-	char s[MAXstring];	/* the search string or regex pattern */
-	unsigned char us[MAXstring];
-	float f;
-	double d;
-};
-
-struct magic {
-	/* Word 1 */
-	uint16_t cont_level;	/* level of ">" */
-	uint8_t flag;
-#define INDIR		0x01	/* if '(...)' appears */
-#define OFFADD		0x02	/* if '>&' or '>...(&' appears */
-#define INDIROFFADD	0x04	/* if '>&(' appears */
-#define UNSIGNED	0x08	/* comparison is unsigned */
-#define NOSPACE		0x10	/* suppress space character before output */
-#define BINTEST		0x20	/* test is for a binary type (set only
-				   for top-level tests) */
-#define TEXTTEST	0x40	/* for passing to file_softmagic */
-
-	uint8_t factor;
-
-	/* Word 2 */
-	uint8_t reln;		/* relation (0=eq, '>'=gt, etc) */
-	uint8_t vallen;		/* length of string value, if any */
-	uint8_t type;		/* comparison type (FILE_*) */
-	uint8_t in_type;	/* type of indirection */
-#define 			FILE_INVALID	0
-#define 			FILE_BYTE	1
-#define				FILE_SHORT	2
-#define				FILE_DEFAULT	3
-#define				FILE_LONG	4
-#define				FILE_STRING	5
-#define				FILE_DATE	6
-#define				FILE_BESHORT	7
-#define				FILE_BELONG	8
-#define				FILE_BEDATE	9
-#define				FILE_LESHORT	10
-#define				FILE_LELONG	11
-#define				FILE_LEDATE	12
-#define				FILE_PSTRING	13
-#define				FILE_LDATE	14
-#define				FILE_BELDATE	15
-#define				FILE_LELDATE	16
-#define				FILE_REGEX	17
-#define				FILE_BESTRING16	18
-#define				FILE_LESTRING16	19
-#define				FILE_SEARCH	20
-#define				FILE_MEDATE	21
-#define				FILE_MELDATE	22
-#define				FILE_MELONG	23
-#define				FILE_QUAD	24
-#define				FILE_LEQUAD	25
-#define				FILE_BEQUAD	26
-#define				FILE_QDATE	27
-#define				FILE_LEQDATE	28
-#define				FILE_BEQDATE	29
-#define				FILE_QLDATE	30
-#define				FILE_LEQLDATE	31
-#define				FILE_BEQLDATE	32
-#define				FILE_FLOAT	33
-#define				FILE_BEFLOAT	34
-#define				FILE_LEFLOAT	35
-#define				FILE_DOUBLE	36
-#define				FILE_BEDOUBLE	37
-#define				FILE_LEDOUBLE	38
-#define				FILE_BEID3	39
-#define				FILE_LEID3	40
-#define				FILE_INDIRECT	41
-#define				FILE_NAMES_SIZE	42/* size of array to contain all names */
-
-#define IS_STRING(t) \
-	((t) == FILE_STRING || \
-	 (t) == FILE_PSTRING || \
-	 (t) == FILE_BESTRING16 || \
-	 (t) == FILE_LESTRING16 || \
-	 (t) == FILE_REGEX || \
-	 (t) == FILE_SEARCH || \
-	 (t) == FILE_DEFAULT)
-
-#define FILE_FMT_NONE 0
-#define FILE_FMT_NUM  1 /* "cduxXi" */
-#define FILE_FMT_STR  2 /* "s" */
-#define FILE_FMT_QUAD 3 /* "ll" */
-#define FILE_FMT_FLOAT 4 /* "eEfFgG" */
-#define FILE_FMT_DOUBLE 5 /* "eEfFgG" */
-
-	/* Word 3 */
-	uint8_t in_op;		/* operator for indirection */
-	uint8_t mask_op;	/* operator for mask */
-#ifdef ENABLE_CONDITIONALS
-	uint8_t cond;		/* conditional type */
-#else
-	uint8_t dummy;
-#endif
-	uint8_t factor_op;
-#define		FILE_FACTOR_OP_PLUS	'+'
-#define		FILE_FACTOR_OP_MINUS	'-'
-#define		FILE_FACTOR_OP_TIMES	'*'
-#define		FILE_FACTOR_OP_DIV	'/'
-#define		FILE_FACTOR_OP_NONE	'\0'
-
-#define				FILE_OPS	"&|^+-*/%"
-#define				FILE_OPAND	0
-#define				FILE_OPOR	1
-#define				FILE_OPXOR	2
-#define				FILE_OPADD	3
-#define				FILE_OPMINUS	4
-#define				FILE_OPMULTIPLY	5
-#define				FILE_OPDIVIDE	6
-#define				FILE_OPMODULO	7
-#define				FILE_OPS_MASK	0x07 /* mask for above ops */
-#define				FILE_UNUSED_1	0x08
-#define				FILE_UNUSED_2	0x10
-#define				FILE_UNUSED_3	0x20
-#define				FILE_OPINVERSE	0x40
-#define				FILE_OPINDIRECT	0x80
-
-#ifdef ENABLE_CONDITIONALS
-#define				COND_NONE	0
-#define				COND_IF		1
-#define				COND_ELIF	2
-#define				COND_ELSE	3
-#endif /* ENABLE_CONDITIONALS */
-
-	/* Word 4 */
-	uint32_t offset;	/* offset to magic number */
-	/* Word 5 */
-	int32_t in_offset;	/* offset from indirection */
-	/* Word 6 */
-	uint32_t lineno;	/* line number in magic file */
-	/* Word 7,8 */
-	union {
-		uint64_t _mask;	/* for use with numeric and date types */
-		struct {
-			uint32_t _count;	/* repeat/line count */
-			uint32_t _flags;	/* modifier flags */
-		} _s;		/* for use with string types */
-	} _u;
-#define num_mask _u._mask
-#define str_range _u._s._count
-#define str_flags _u._s._flags
-	/* Words 9-16 */
-	union VALUETYPE value;	/* either number or string */
-	/* Words 17-32 */
-	char desc[MAXDESC];	/* description */
-	/* Words 33-48 */
-	char mimetype[MAXDESC]; /* MIME type */
-	/* Words 49-50 */
-	char apple[8];
-};
-
-#define BIT(A)   (1 << (A))
-#define STRING_COMPACT_WHITESPACE		BIT(0)
-#define STRING_COMPACT_OPTIONAL_WHITESPACE	BIT(1)
-#define STRING_IGNORE_LOWERCASE			BIT(2)
-#define STRING_IGNORE_UPPERCASE			BIT(3)
-#define REGEX_OFFSET_START			BIT(4)
-#define STRING_TEXTTEST				BIT(5)
-#define STRING_BINTEST				BIT(6)
-#define PSTRING_1_BE				BIT(7)
-#define PSTRING_1_LE				BIT(7)
-#define PSTRING_2_BE				BIT(8)
-#define PSTRING_2_LE				BIT(9)
-#define PSTRING_4_BE				BIT(10)
-#define PSTRING_4_LE				BIT(11)
-#define PSTRING_LEN	\
-    (PSTRING_1_BE|PSTRING_2_LE|PSTRING_2_BE|PSTRING_4_LE|PSTRING_4_BE)
-#define PSTRING_LENGTH_INCLUDES_ITSELF		BIT(12)
-#define CHAR_COMPACT_WHITESPACE			'W'
-#define CHAR_COMPACT_OPTIONAL_WHITESPACE	'w'
-#define CHAR_IGNORE_LOWERCASE			'c'
-#define CHAR_IGNORE_UPPERCASE			'C'
-#define CHAR_REGEX_OFFSET_START			's'
-#define CHAR_TEXTTEST				't'
-#define CHAR_BINTEST				'b'
-#define CHAR_PSTRING_1_BE			'B'
-#define CHAR_PSTRING_1_LE			'B'
-#define CHAR_PSTRING_2_BE			'H'
-#define CHAR_PSTRING_2_LE			'h'
-#define CHAR_PSTRING_4_BE			'L'
-#define CHAR_PSTRING_4_LE			'l'
-#define CHAR_PSTRING_LENGTH_INCLUDES_ITSELF     'J'
-#define STRING_IGNORE_CASE		(STRING_IGNORE_LOWERCASE|STRING_IGNORE_UPPERCASE)
-#define STRING_DEFAULT_RANGE		100
-
-
-/* list of magic entries */
-struct mlist {
-	struct magic *magic;		/* array of magic entries */
-	uint32_t nmagic;			/* number of entries in array */
-	int mapped;  /* allocation type: 0 => apprentice_file
-		      *                  1 => apprentice_map + malloc
-		      *                  2 => apprentice_map + mmap */
-	struct mlist *next, *prev;
-};
-
-#ifdef __cplusplus
-#define CAST(T, b)	static_cast<T>(b)
-#else
-#define CAST(T, b)	(T)(b)
-#endif
-
-struct level_info {
-	int32_t off;
-	int got_match;
-#ifdef ENABLE_CONDITIONALS
-	int last_match;
-	int last_cond;	/* used for error checking by parse() */
-#endif
-};
-struct magic_set {
-	struct mlist *mlist;
-	struct cont {
-		size_t len;
-		struct level_info *li;
-	} c;
-	struct out {
-		char *buf;		/* Accumulation buffer */
-		char *pbuf;		/* Printable buffer */
-	} o;
-	uint32_t offset;
-	int error;
-	int flags;			/* Control magic tests. */
-	int event_flags;		/* Note things that happened. */
-#define 		EVENT_HAD_ERR		0x01
-	const char *file;
-	size_t line;			/* current magic line number */
-
-	/* data for searches */
-	struct {
-		const char *s;		/* start of search in original source */
-		size_t s_len;		/* length of search region */
-		size_t offset;		/* starting offset in source: XXX - should this be off_t? */
-		size_t rm_len;		/* match length */
-	} search;
-
-	/* FIXME: Make the string dynamically allocated so that e.g.
-	   strings matched in files can be longer than MAXstring */
-	union VALUETYPE ms_value;	/* either number or string */
-};
-
-/* Type for Unicode characters */
-typedef unsigned long unichar;
-
-struct stat;
-protected const char *file_fmttime(uint32_t, int);
-protected int file_buffer(struct magic_set *, int, const char *, const void *,
-    size_t);
-protected int file_fsmagic(struct magic_set *, const char *, struct stat *);
-protected int file_pipe2file(struct magic_set *, int, const void *, size_t);
-protected int file_vprintf(struct magic_set *, const char *, va_list);
-protected int file_printf(struct magic_set *, const char *, ...)
-    __attribute__((__format__(__printf__, 2, 3)));
-protected int file_reset(struct magic_set *);
-protected int file_tryelf(struct magic_set *, int, const unsigned char *,
-    size_t);
-protected int file_trycdf(struct magic_set *, int, const unsigned char *,
-    size_t);
-#if HAVE_FORK
-protected int file_zmagic(struct magic_set *, int, const char *,
-    const unsigned char *, size_t);
-#endif
-protected int file_ascmagic(struct magic_set *, const unsigned char *, size_t);
-protected int file_ascmagic_with_encoding(struct magic_set *,
-    const unsigned char *, size_t, unichar *, size_t, const char *,
-    const char *);
-protected int file_encoding(struct magic_set *, const unsigned char *, size_t,
-    unichar **, size_t *, const char **, const char **, const char **);
-protected int file_is_tar(struct magic_set *, const unsigned char *, size_t);
-protected int file_softmagic(struct magic_set *, const unsigned char *, size_t,
-    int);
-protected struct mlist *file_apprentice(struct magic_set *, const char *, int);
-protected uint64_t file_signextend(struct magic_set *, struct magic *,
-    uint64_t);
-protected void file_delmagic(struct magic *, int type, size_t entries);
-protected void file_badread(struct magic_set *);
-protected void file_badseek(struct magic_set *);
-protected void file_oomem(struct magic_set *, size_t);
-protected void file_error(struct magic_set *, int, const char *, ...)
-    __attribute__((__format__(__printf__, 3, 4)));
-protected void file_magerror(struct magic_set *, const char *, ...)
-    __attribute__((__format__(__printf__, 2, 3)));
-protected void file_magwarn(struct magic_set *, const char *, ...)
-    __attribute__((__format__(__printf__, 2, 3)));
-protected void file_mdump(struct magic *);
-protected void file_showstr(FILE *, const char *, size_t);
-protected size_t file_mbswidth(const char *);
-protected const char *file_getbuffer(struct magic_set *);
-protected ssize_t sread(int, void *, size_t, int);
-protected int file_check_mem(struct magic_set *, unsigned int);
-protected int file_looks_utf8(const unsigned char *, size_t, unichar *,
-    size_t *);
-protected size_t file_pstring_length_size(const struct magic *);
-protected size_t file_pstring_get_length(const struct magic *, const char *);
-#ifdef __EMX__
-protected int file_os2_apptype(struct magic_set *, const char *, const void *,
-    size_t);
-#endif /* __EMX__ */
-
-
-#ifndef COMPILE_ONLY
-extern const char *file_names[];
-extern const size_t file_nnames;
-#endif
-
-#ifndef HAVE_STRERROR
-extern int sys_nerr;
-extern char *sys_errlist[];
-#define strerror(e) \
-	(((e) >= 0 && (e) < sys_nerr) ? sys_errlist[(e)] : "Unknown error")
-#endif
-
-#ifndef HAVE_STRTOUL
-#define strtoul(a, b, c)	strtol(a, b, c)
-#endif
-
-#ifndef HAVE_VASPRINTF
-int vasprintf(char **, const char *, va_list);
-#endif
-#ifndef HAVE_ASPRINTF
-int asprintf(char **ptr, const char *format_string, ...);
-#endif
-
-#ifndef HAVE_STRLCPY
-size_t strlcpy(char *dst, const char *src, size_t siz);
-#endif
-#ifndef HAVE_STRLCAT
-size_t strlcat(char *dst, const char *src, size_t siz);
-#endif
-
-#if defined(HAVE_MMAP) && defined(HAVE_SYS_MMAN_H) && !defined(QUICK)
-#define QUICK
-#endif
-
-#ifndef O_BINARY
-#define O_BINARY	0
-#endif
-
-#ifndef __cplusplus
-#if defined(__GNUC__) && (__GNUC__ >= 3)
-#define FILE_RCSID(id) \
-static const char rcsid[] __attribute__((__used__)) = id;
-#else
-#define FILE_RCSID(id) \
-static const char *rcsid(const char *p) { \
-	return rcsid(p = id); \
-}
-#endif
-#else
-#define FILE_RCSID(id)
-#endif
-
-#endif /* __file_h__ */

Deleted: trunk/contrib/file/file.man
===================================================================
--- trunk/contrib/file/file.man	2014-06-30 11:58:41 UTC (rev 6698)
+++ trunk/contrib/file/file.man	2014-06-30 11:58:43 UTC (rev 6699)
@@ -1,571 +0,0 @@
-.\" $File: file.man,v 1.87 2010/11/05 20:51:38 christos Exp $
-.Dd July 23, 2010
-.Dt FILE __CSECTION__
-.Os
-.Sh NAME
-.Nm file
-.Nd determine file type
-.Sh SYNOPSIS
-.Nm
-.Bk -words
-.Op Fl bchiklLNnprsvz0
-.Op Fl -apple
-.Op Fl -mime-encoding
-.Op Fl -mime-type
-.Op Fl e Ar testname
-.Op Fl F Ar separator
-.Op Fl f Ar namefile
-.Op Fl m Ar magicfiles
-.Ar
-.Ek -words
-.Nm
-.Fl C
-.Op Fl m Ar magicfiles
-.Nm
-.Op Fl -help
-.Sh DESCRIPTION
-This manual page documents version __VERSION__ of the
-.Nm
-command.
-.Pp
-.Nm
-tests each argument in an attempt to classify it.
-There are three sets of tests, performed in this order:
-filesystem tests, magic tests, and language tests.
-The
-.Em first
-test that succeeds causes the file type to be printed.
-.Pp
-The type printed will usually contain one of the words
-.Em text
-(the file contains only
-printing characters and a few common control
-characters and is probably safe to read on an
-.Dv ASCII
-terminal),
-.Em executable
-(the file contains the result of compiling a program
-in a form understandable to some
-.Dv UNIX
-kernel or another),
-or
-.Em data
-meaning anything else (data is usually
-.Sq binary
-or non-printable).
-Exceptions are well-known file formats (core files, tar archives)
-that are known to contain binary data.
-When modifying magic files or the program itself, make sure to
-.Em "preserve these keywords" .
-Users depend on knowing that all the readable files in a directory
-have the word
-.Sq text
-printed.
-Don't do as Berkeley did and change
-.Sq shell commands text
-to
-.Sq shell script .
-.Pp
-The filesystem tests are based on examining the return from a
-.Xr stat 2
-system call.
-The program checks to see if the file is empty,
-or if it's some sort of special file.
-Any known file types appropriate to the system you are running on
-(sockets, symbolic links, or named pipes (FIFOs) on those systems that
-implement them)
-are intuited if they are defined in
-the system header file
-.In sys/stat.h .
-.Pp
-The magic tests are used to check for files with data in
-particular fixed formats.
-The canonical example of this is a binary executable (compiled program)
-.Dv a.out
-file, whose format is defined in
-.In elf.h ,
-.In a.out.h
-and possibly
-.In exec.h
-in the standard include directory.
-These files have a
-.Sq "magic number"
-stored in a particular place
-near the beginning of the file that tells the
-.Dv UNIX operating system
-that the file is a binary executable, and which of several types thereof.
-The concept of a
-.Sq "magic"
-has been applied by extension to data files.
-Any file with some invariant identifier at a small fixed
-offset into the file can usually be described in this way.
-The information identifying these files is read from the compiled
-magic file
-.Pa __MAGIC__.mgc ,
-or the files in the directory
-.Pa __MAGIC__
-if the compiled file does not exist.
-In addition, if
-.Pa $HOME/.magic.mgc
-or
-.Pa $HOME/.magic
-exists, it will be used in preference to the system magic files.
-.Pp
-If a file does not match any of the entries in the magic file,
-it is examined to see if it seems to be a text file.
-ASCII, ISO-8859-x, non-ISO 8-bit extended-ASCII character sets
-(such as those used on Macintosh and IBM PC systems),
-UTF-8-encoded Unicode, UTF-16-encoded Unicode, and EBCDIC
-character sets can be distinguished by the different
-ranges and sequences of bytes that constitute printable text
-in each set.
-If a file passes any of these tests, its character set is reported.
-ASCII, ISO-8859-x, UTF-8, and extended-ASCII files are identified
-as
-.Sq text
-because they will be mostly readable on nearly any terminal;
-UTF-16 and EBCDIC are only
-.Sq character data
-because, while
-they contain text, it is text that will require translation
-before it can be read.
-In addition,
-.Nm
-will attempt to determine other characteristics of text-type files.
-If the lines of a file are terminated by CR, CRLF, or NEL, instead
-of the Unix-standard LF, this will be reported.
-Files that contain embedded escape sequences or overstriking
-will also be identified.
-.Pp
-Once
-.Nm
-has determined the character set used in a text-type file,
-it will
-attempt to determine in what language the file is written.
-The language tests look for particular strings (cf.
-.In names.h
-) that can appear anywhere in the first few blocks of a file.
-For example, the keyword
-.Em .br
-indicates that the file is most likely a
-.Xr troff 1
-input file, just as the keyword
-.Em struct
-indicates a C program.
-These tests are less reliable than the previous
-two groups, so they are performed last.
-The language test routines also test for some miscellany
-(such as
-.Xr tar 1
-archives).
-.Pp
-Any file that cannot be identified as having been written
-in any of the character sets listed above is simply said to be
-.Sq data .
-.Sh OPTIONS
-.Bl -tag -width indent
-.It Fl b , -brief
-Do not prepend filenames to output lines (brief mode).
-.It Fl C , -compile
-Write a
-.Pa magic.mgc
-output file that contains a pre-parsed version of the magic file or directory.
-.It Fl c , -checking-printout
-Cause a checking printout of the parsed form of the magic file.
-This is usually used in conjunction with the
-.Fl m
-flag to debug a new magic file before installing it.
-.It Fl e , -exclude Ar testname
-Exclude the test named in
-.Ar testname
-from the list of tests made to determine the file type.
-Valid test names are:
-.Bl -tag -width compress
-.It apptype
-.Dv EMX
-application type (only on EMX).
-.It ascii
-Various types of text files (this test will try to guess the text encoding, irrespective of the setting of the
-.Sq encoding
-option).
-.It encoding
-Different text encodings for soft magic tests.
-.It tokens
-Looks for known tokens inside text files.
-.It cdf
-Prints details of Compound Document Files.
-.It compress
-Checks for, and looks inside, compressed files.
-.It elf
-Prints ELF file details.
-.It soft
-Consults magic files.
-.It tar
-Examines tar files.
-.El
-.It Fl F , -separator Ar separator
-Use the specified string as the separator between the filename and the
-file result returned.
-Defaults to
-.Sq \&: .
-.It Fl f , -files-from Ar namefile
-Read the names of the files to be examined from
-.Ar namefile
-(one per line)
-before the argument list.
-Either
-.Ar namefile
-or at least one filename argument must be present;
-to test the standard input, use
-.Sq -
-as a filename argument.
-.It Fl h , -no-dereference
-option causes symlinks not to be followed
-(on systems that support symbolic links).
-This is the default if the environment variable
-.Dv POSIXLY_CORRECT
-is not defined.
-.It Fl i , -mime
-Causes the file command to output mime type strings rather than the more
-traditional human readable ones.
-Thus it may say
-.Sq text/plain; charset=us-ascii
-rather than
-.Sq ASCII text .
-In order for this option to work, file changes the way
-it handles files recognized by the command itself (such as many of the
-text file types, directories etc), and makes use of an alternative
-.Sq magic
-file.
-(See the FILES section, below).
-.It Fl -mime-type , -mime-encoding
-Like
-.Fl i ,
-but print only the specified element(s).
-.It Fl k , -keep-going
-Don't stop at the first match, keep going.
-Subsequent matches will be
-have the string
-.Sq "\[rs]012\- "
-prepended.
-(If you want a newline, see the
-.Sq "\-r"
-option.)
-.It Fl l , -list
-Print information about the strength of each magic pattern.
-.It Fl L , -dereference
-option causes symlinks to be followed, as the like-named option in
-.Xr ls 1
-(on systems that support symbolic links).
-This is the default if the environment variable
-.Dv POSIXLY_CORRECT
-is defined.
-.It Fl l
-Shows sorted patterns list in the order which is used for the matching.
-.It Fl m , -magic-file Ar magicfiles
-Specify an alternate list of files and directories containing magic.
-This can be a single item, or a colon-separated list.
-If a compiled magic file is found alongside a file or directory, it will be used instead.
-.It Fl N , -no-pad
-Don't pad filenames so that they align in the output.
-.It Fl n , -no-buffer
-Force stdout to be flushed after checking each file.
-This is only useful if checking a list of files.
-It is intended to be used by programs that want filetype output from a pipe.
-.It Fl p , -preserve-date
-On systems that support
-.Xr utime 2
-or
-.Xr utimes 2 ,
-attempt to preserve the access time of files analyzed, to pretend that
-.Nm
-never read them.
-.It Fl r , -raw
-Don't translate unprintable characters to \eooo.
-Normally
-.Nm
-translates unprintable characters to their octal representation.
-.It Fl s , -special-files
-Normally,
-.Nm
-only attempts to read and determine the type of argument files which
-.Xr stat 2
-reports are ordinary files.
-This prevents problems, because reading special files may have peculiar
-consequences.
-Specifying the
-.Fl s
-option causes
-.Nm
-to also read argument files which are block or character special files.
-This is useful for determining the filesystem types of the data in raw
-disk partitions, which are block special files.
-This option also causes
-.Nm
-to disregard the file size as reported by
-.Xr stat 2
-since on some systems it reports a zero size for raw disk partitions.
-.It Fl v , -version
-Print the version of the program and exit.
-.It Fl z , -uncompress
-Try to look inside compressed files.
-.It Fl 0 , -print0
-Output a null character
-.Sq \e0
-after the end of the filename.
-Nice to
-.Xr cut 1
-the output.
-This does not affect the separator which is still printed.
-.It Fl -help
-Print a help message and exit.
-.El
-.Sh FILES
-.Bl -tag -width __MAGIC__.mgc -compact
-.It Pa __MAGIC__.mgc
-Default compiled list of magic.
-.It Pa __MAGIC__
-Directory containing default magic files.
-.El
-.Sh ENVIRONMENT
-The environment variable
-.Dv MAGIC
-can be used to set the default magic file name.
-If that variable is set, then
-.Nm
-will not attempt to open
-.Pa $HOME/.magic .
-.Nm
-adds
-.Sq .mgc
-to the value of this variable as appropriate.
-However,
-.Pa file
-has to exist in order for
-.Pa file.mime
-to be considered.
-The environment variable
-.Dv POSIXLY_CORRECT
-controls (on systems that support symbolic links), whether
-.Nm
-will attempt to follow symlinks or not.
-If set, then
-.Nm
-follows symlink, otherwise it does not.
-This is also controlled by the
-.Fl L
-and
-.Fl h
-options.
-.Sh SEE ALSO
-.Xr magic __FSECTION__ ,
-.Xr strings 1 ,
-.Xr od 1 ,
-.Xr hexdump 1 ,
-.Xr file 1posix
-.Sh STANDARDS CONFORMANCE
-This program is believed to exceed the System V Interface Definition
-of FILE(CMD), as near as one can determine from the vague language
-contained therein.
-Its behavior is mostly compatible with the System V program of the same name.
-This version knows more magic, however, so it will produce
-different (albeit more accurate) output in many cases.
-.\" URL: http://www.opengroup.org/onlinepubs/009695399/utilities/file.html
-.Pp
-The one significant difference
-between this version and System V
-is that this version treats any white space
-as a delimiter, so that spaces in pattern strings must be escaped.
-For example,
-.Bd -literal -offset indent
->10	string	language impress\ 	(imPRESS data)
-.Ed
-.Pp
-in an existing magic file would have to be changed to
-.Bd -literal -offset indent
->10	string	language\e impress	(imPRESS data)
-.Ed
-.Pp
-In addition, in this version, if a pattern string contains a backslash,
-it must be escaped.
-For example
-.Bd -literal -offset indent
-0	string		\ebegindata	Andrew Toolkit document
-.Ed
-.Pp
-in an existing magic file would have to be changed to
-.Bd -literal -offset indent
-0	string		\e\ebegindata	Andrew Toolkit document
-.Ed
-.Pp
-SunOS releases 3.2 and later from Sun Microsystems include a
-.Nm
-command derived from the System V one, but with some extensions.
-My version differs from Sun's only in minor ways.
-It includes the extension of the
-.Sq &
-operator, used as,
-for example,
-.Bd -literal -offset indent
->16	long&0x7fffffff	>0		not stripped
-.Ed
-.Sh MAGIC DIRECTORY
-The magic file entries have been collected from various sources,
-mainly USENET, and contributed by various authors.
-Christos Zoulas (address below) will collect additional
-or corrected magic file entries.
-A consolidation of magic file entries
-will be distributed periodically.
-.Pp
-The order of entries in the magic file is significant.
-Depending on what system you are using, the order that
-they are put together may be incorrect.
-If your old
-.Nm
-command uses a magic file,
-keep the old magic file around for comparison purposes
-(rename it to
-.Pa __MAGIC__.orig ).
-.Sh EXAMPLES
-.Bd -literal -offset indent
-$ file file.c file /dev/{wd0a,hda}
-file.c:   C program text
-file:     ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV),
-	  dynamically linked (uses shared libs), stripped
-/dev/wd0a: block special (0/0)
-/dev/hda: block special (3/0)
-
-$ file -s /dev/wd0{b,d}
-/dev/wd0b: data
-/dev/wd0d: x86 boot sector
-
-$ file -s /dev/hda{,1,2,3,4,5,6,7,8,9,10}
-/dev/hda:   x86 boot sector
-/dev/hda1:  Linux/i386 ext2 filesystem
-/dev/hda2:  x86 boot sector
-/dev/hda3:  x86 boot sector, extended partition table
-/dev/hda4:  Linux/i386 ext2 filesystem
-/dev/hda5:  Linux/i386 swap file
-/dev/hda6:  Linux/i386 swap file
-/dev/hda7:  Linux/i386 swap file
-/dev/hda8:  Linux/i386 swap file
-/dev/hda9:  empty
-/dev/hda10: empty
-
-$ file -i file.c file /dev/{wd0a,hda}
-file.c:      text/x-c
-file:        application/x-executable
-/dev/hda:    application/x-not-regular-file
-/dev/wd0a:   application/x-not-regular-file
-
-.Ed
-.Sh HISTORY
-There has been a
-.Nm
-command in every
-.Dv UNIX since at least Research Version 4
-(man page dated November, 1973).
-The System V version introduced one significant major change:
-the external list of magic types.
-This slowed the program down slightly but made it a lot more flexible.
-.Pp
-This program, based on the System V version,
-was written by Ian Darwin <ian at darwinsys.com>
-without looking at anybody else's source code.
-.Pp
-John Gilmore revised the code extensively, making it better than
-the first version.
-Geoff Collyer found several inadequacies
-and provided some magic file entries.
-Contributions by the `&' operator by Rob McMahon, cudcv at warwick.ac.uk, 1989.
-.Pp
-Guy Harris, guy at netapp.com, made many changes from 1993 to the present.
-.Pp
-Primary development and maintenance from 1990 to the present by
-Christos Zoulas (christos at astron.com).
-.Pp
-Altered by Chris Lowth, chris at lowth.com, 2000:
-Handle the
-.Fl i
-option to output mime type strings, using an alternative
-magic file and internal logic.
-.Pp
-Altered by Eric Fischer (enf at pobox.com), July, 2000,
-to identify character codes and attempt to identify the languages
-of non-ASCII files.
-.Pp
-Altered by Reuben Thomas (rrt at sc3d.org), 2007-2009, to improve MIME
-support and merge MIME and non-MIME magic, support directories as well
-as files of magic, apply many bug fixes, update and fix a lot of magic,
-and improve the build system.
-.Pp
-The list of contributors to the
-.Sq magic
-directory (magic files)
-is too long to include here.
-You know who you are; thank you.
-Many contributors are listed in the source files.
-.Sh LEGAL NOTICE
-Copyright (c) Ian F. Darwin, Toronto, Canada, 1986-1999.
-Covered by the standard Berkeley Software Distribution copyright; see the file
-COPYING in the source distribution.
-.Pp
-The files
-.Dv tar.h
-and
-.Dv is_tar.c
-were written by John Gilmore from his public-domain
-.Xr tar 1
-program, and are not covered by the above license.
-.Sh BUGS
-.Pp
-Please report bugs and send patches to the bug tracker at
-.Pa http://bugs.gw.com/
-or the mailing list at
-.Aq file at mx.gw.com .
-.Pp
-.Nm
-uses several algorithms that favor speed over accuracy,
-thus it can be misled about the contents of
-text
-files.
-.Pp
-The support for text files (primarily for programming languages)
-is simplistic, inefficient and requires recompilation to update.
-.Pp
-The list of keywords in
-.Dv ascmagic
-probably belongs in the Magic file.
-This could be done by using some keyword like
-.Sq *
-for the offset value.
-.Pp
-Complain about conflicts in the magic file entries.
-Make a rule that the magic entries sort based on file offset rather
-than position within the magic file?
-.Pp
-The program should provide a way to give an estimate
-of
-.Sq how good
-a guess is.
-We end up removing guesses (e.g.
-.Sq From\
-as first 5 chars of file) because
-they are not as good as other guesses (e.g.
-.Sq Newsgroups:
-versus
-.Sq Return-Path:
-).
-Still, if the others don't pan out, it should be possible to use the
-first guess.
-.Pp
-This manual page, and particularly this section, is too long.
-.Sh RETURN CODE
-.Nm
-returns 0 on success, and non-zero on error.
-.Sh AVAILABILITY
-You can obtain the original author's latest version by anonymous FTP
-on
-.Dv ftp.astron.com
-in the directory
-.Dv /pub/file/file-X.YZ.tar.gz

Deleted: trunk/contrib/file/file_opts.h
===================================================================
--- trunk/contrib/file/file_opts.h	2014-06-30 11:58:41 UTC (rev 6698)
+++ trunk/contrib/file/file_opts.h	2014-06-30 11:58:43 UTC (rev 6699)
@@ -1,50 +0,0 @@
-/*
- * Table of command-line options
- *
- * The first column specifies the short name, if any, or 0 if none.
- * The second column specifies the long name.
- * The third column specifies whether it takes a parameter.
- * The fourth column is the documentation.
- *
- * N.B. The long options' order must correspond to the code in file.c,
- * and OPTSTRING must be kept up-to-date with the short options.
- * Pay particular attention to the numbers of long-only options in the
- * switch statement!
- */
-
-OPT_LONGONLY("help", 0, "                 display this help and exit\n")
-OPT('v', "version", 0, "              output version information and exit\n")
-OPT('m', "magic-file", 1, " LIST      use LIST as a colon-separated list of magic\n"
-    "                               number files\n")
-OPT('z', "uncompress", 0, "           try to look inside compressed files\n")
-OPT('b', "brief", 0, "                do not prepend filenames to output lines\n")
-OPT('c', "checking-printout", 0, "    print the parsed form of the magic file, use in\n"
-    "                               conjunction with -m to debug a new magic file\n"
-    "                               before installing it\n")
-OPT('e', "exclude", 1, " TEST         exclude TEST from the list of test to be\n"
-    "                               performed for file. Valid tests are:\n"
-    "                               ascii, apptype, compress, elf, soft, tar, tokens, troff\n")
-OPT('f', "files-from", 1, " FILE      read the filenames to be examined from FILE\n")
-OPT('F', "separator", 1, " STRING     use string as separator instead of `:'\n")
-OPT('i', "mime", 0, "                 output MIME type strings (--mime-type and\n"
-    "                               --mime-encoding)\n")
-OPT_LONGONLY("apple", 0, "                output the Apple CREATOR/TYPE\n")
-OPT_LONGONLY("mime-type", 0, "            output the MIME type\n")
-OPT_LONGONLY("mime-encoding", 0, "        output the MIME encoding\n")
-OPT('k', "keep-going", 0, "           don't stop at the first match\n")
-#ifdef S_IFLNK
-OPT('l', "list", 0, "          list magic strength\n")
-OPT('L', "dereference", 0, "          follow symlinks (default)\n")
-OPT('h', "no-dereference", 0, "       don't follow symlinks\n")
-#endif
-OPT('n', "no-buffer", 0, "            do not buffer output\n")
-OPT('N', "no-pad", 0, "               do not pad output\n")
-OPT('0', "print0", 0, "               terminate filenames with ASCII NUL\n")
-#if defined(HAVE_UTIME) || defined(HAVE_UTIMES)
-OPT('p', "preserve-date", 0, "        preserve access times on files\n")
-#endif
-OPT('r', "raw", 0, "                  don't translate unprintable chars to \\ooo\n")
-OPT('s', "special-files", 0, "        treat special (block/char devices) files as\n"
-    "                             ordinary ones\n")
-OPT('C', "compile", 0, "              compile file specified by -m\n")
-OPT('d', "debug", 0, "                print debugging messages\n")

Deleted: trunk/contrib/file/fsmagic.c
===================================================================
--- trunk/contrib/file/fsmagic.c	2014-06-30 11:58:41 UTC (rev 6698)
+++ trunk/contrib/file/fsmagic.c	2014-06-30 11:58:43 UTC (rev 6699)
@@ -1,364 +0,0 @@
-/*
- * Copyright (c) Ian F. Darwin 1986-1995.
- * Software written by Ian F. Darwin and others;
- * maintained 1995-present by Christos Zoulas and others.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice immediately at the beginning of the file, without modification,
- *    this list of conditions, and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *  
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-/*
- * fsmagic - magic based on filesystem info - directory, special files, etc.
- */
-
-#include "file.h"
-
-#ifndef	lint
-FILE_RCSID("@(#)$File: fsmagic.c,v 1.62 2010/09/20 20:16:08 rrt Exp $")
-#endif	/* lint */
-
-#include "magic.h"
-#include <string.h>
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#include <stdlib.h>
-/* Since major is a function on SVR4, we cannot use `ifndef major'.  */
-#ifdef MAJOR_IN_MKDEV
-# include <sys/mkdev.h>
-# define HAVE_MAJOR
-#endif
-#ifdef MAJOR_IN_SYSMACROS
-# include <sys/sysmacros.h>
-# define HAVE_MAJOR
-#endif
-#ifdef major			/* Might be defined in sys/types.h.  */
-# define HAVE_MAJOR
-#endif
-  
-#ifndef HAVE_MAJOR
-# define major(dev)  (((dev) >> 8) & 0xff)
-# define minor(dev)  ((dev) & 0xff)
-#endif
-#undef HAVE_MAJOR
-#ifdef	S_IFLNK
-private int
-bad_link(struct magic_set *ms, int err, char *buf)
-{
-	const char *errfmt;
-	int mime = ms->flags & MAGIC_MIME;
-	if ((mime & MAGIC_MIME_TYPE) &&
-	    file_printf(ms, "application/x-symlink")
-	    == -1)
-		return -1;
-	else if (!mime) {
-		if (err == ELOOP)
-			errfmt = "symbolic link in a loop";
-		else
-			errfmt = "broken symbolic link to `%s'";
-		if (ms->flags & MAGIC_ERROR) {
-			file_error(ms, err, errfmt, buf);
-			return -1;
-		} 
-		if (file_printf(ms, errfmt, buf) == -1)
-			return -1;
-	}
-	return 1;
-}
-#endif
-private int
-handle_mime(struct magic_set *ms, int mime, const char *str)
-{
-	if ((mime & MAGIC_MIME_TYPE)) {
-		if (file_printf(ms, "application/%s", str) == -1)
-			return -1;
-		if ((mime & MAGIC_MIME_ENCODING) && file_printf(ms,
-		    "; charset=") == -1)
-			return -1;
-	}
-	if ((mime & MAGIC_MIME_ENCODING) && file_printf(ms, "binary") == -1)
-		return -1;
-	return 0;
-}
-
-protected int
-file_fsmagic(struct magic_set *ms, const char *fn, struct stat *sb)
-{
-	int ret = 0;
-	int mime = ms->flags & MAGIC_MIME;
-#ifdef	S_IFLNK
-	char buf[BUFSIZ+4];
-	ssize_t nch;
-	struct stat tstatbuf;
-#endif
-
-	if (ms->flags & MAGIC_APPLE)
-		return 0;
-	if (fn == NULL)
-		return 0;
-
-	/*
-	 * Fstat is cheaper but fails for files you don't have read perms on.
-	 * On 4.2BSD and similar systems, use lstat() to identify symlinks.
-	 */
-#ifdef	S_IFLNK
-	if ((ms->flags & MAGIC_SYMLINK) == 0)
-		ret = lstat(fn, sb);
-	else
-#endif
-	ret = stat(fn, sb);	/* don't merge into if; see "ret =" above */
-
-	if (ret) {
-		if (ms->flags & MAGIC_ERROR) {
-			file_error(ms, errno, "cannot stat `%s'", fn);
-			return -1;
-		}
-		if (file_printf(ms, "cannot open `%s' (%s)",
-		    fn, strerror(errno)) == -1)
-			return -1;
-		ms->event_flags |= EVENT_HAD_ERR;
-		return -1;
-	}
-
-	if (!mime) {
-#ifdef S_ISUID
-		if (sb->st_mode & S_ISUID) 
-			if (file_printf(ms, "setuid ") == -1)
-				return -1;
-#endif
-#ifdef S_ISGID
-		if (sb->st_mode & S_ISGID) 
-			if (file_printf(ms, "setgid ") == -1)
-				return -1;
-#endif
-#ifdef S_ISVTX
-		if (sb->st_mode & S_ISVTX) 
-			if (file_printf(ms, "sticky ") == -1)
-				return -1;
-#endif
-	}
-	
-	switch (sb->st_mode & S_IFMT) {
-	case S_IFDIR:
-		if (mime) {
-			if (handle_mime(ms, mime, "x-directory") == -1)
-				return -1;
-		} else if (file_printf(ms, "directory") == -1)
-			return -1;
-		return 1;
-#ifdef S_IFCHR
-	case S_IFCHR:
-		/* 
-		 * If -s has been specified, treat character special files
-		 * like ordinary files.  Otherwise, just report that they
-		 * are block special files and go on to the next file.
-		 */
-		if ((ms->flags & MAGIC_DEVICES) != 0)
-			break;
-		if (mime) {
-			if (handle_mime(ms, mime, "x-character-device") == -1)
-				return -1;
-		} else {
-#ifdef HAVE_STAT_ST_RDEV
-# ifdef dv_unit
-			if (file_printf(ms, "character special (%d/%d/%d)",
-			    major(sb->st_rdev), dv_unit(sb->st_rdev),
-					dv_subunit(sb->st_rdev)) == -1)
-				return -1;
-# else
-			if (file_printf(ms, "character special (%ld/%ld)",
-			    (long)major(sb->st_rdev), (long)minor(sb->st_rdev))
-			    == -1)
-				return -1;
-# endif
-#else
-			if (file_printf(ms, "character special") == -1)
-				return -1;
-#endif
-		}
-		return 1;
-#endif
-#ifdef S_IFBLK
-	case S_IFBLK:
-		/* 
-		 * If -s has been specified, treat block special files
-		 * like ordinary files.  Otherwise, just report that they
-		 * are block special files and go on to the next file.
-		 */
-		if ((ms->flags & MAGIC_DEVICES) != 0)
-			break;
-		if (mime) {
-			if (handle_mime(ms, mime, "x-block-device") == -1)
-				return -1;
-		} else {
-#ifdef HAVE_STAT_ST_RDEV
-# ifdef dv_unit
-			if (file_printf(ms, "block special (%d/%d/%d)",
-					major(sb->st_rdev), dv_unit(sb->st_rdev),
-					dv_subunit(sb->st_rdev)) == -1)
-				return -1;
-# else
-			if (file_printf(ms, "block special (%ld/%ld)",
-					(long)major(sb->st_rdev), (long)minor(sb->st_rdev)) == -1)
-				return -1;
-# endif
-#else
-			if (file_printf(ms, "block special") == -1)
-				return -1;
-#endif
-		}
-		return 1;
-#endif
-	/* TODO add code to handle V7 MUX and Blit MUX files */
-#ifdef	S_IFIFO
-	case S_IFIFO:
-		if((ms->flags & MAGIC_DEVICES) != 0)
-			break;
-		if (mime) {
-			if (handle_mime(ms, mime, "x-fifo") == -1)
-				return -1;
-		} else if (file_printf(ms, "fifo (named pipe)") == -1)
-			return -1;
-		return 1;
-#endif
-#ifdef	S_IFDOOR
-	case S_IFDOOR:
-		if (mime) {
-			if (handle_mime(ms, mime, "x-door") == -1)
-				return -1;
-		} else if (file_printf(ms, "door") == -1)
-			return -1;
-		return 1;
-#endif
-#ifdef	S_IFLNK
-	case S_IFLNK:
-		if ((nch = readlink(fn, buf, BUFSIZ-1)) <= 0) {
-			if (ms->flags & MAGIC_ERROR) {
-			    file_error(ms, errno, "unreadable symlink `%s'",
-				fn);
-			    return -1;
-			}
-			if (mime) {
-				if (handle_mime(ms, mime, "x-symlink") == -1)
-					return -1;
-			} else if (file_printf(ms,
-			    "unreadable symlink `%s' (%s)", fn,
-			    strerror(errno)) == -1)
-				return -1;
-			return 1;
-		}
-		buf[nch] = '\0';	/* readlink(2) does not do this */
-
-		/* If broken symlink, say so and quit early. */
-		if (*buf == '/') {
-			if (stat(buf, &tstatbuf) < 0)
-				return bad_link(ms, errno, buf);
-		} else {
-			char *tmp;
-			char buf2[BUFSIZ+BUFSIZ+4];
-
-			if ((tmp = strrchr(fn,  '/')) == NULL) {
-				tmp = buf; /* in current directory anyway */
-			} else {
-				if (tmp - fn + 1 > BUFSIZ) {
-					if (ms->flags & MAGIC_ERROR) {
-						file_error(ms, 0, 
-						    "path too long: `%s'", buf);
-						return -1;
-					}
-					if (mime) {
-						if (handle_mime(ms, mime,
-						    "x-path-too-long") == -1)
-							return -1;
-					} else if (file_printf(ms,
-					    "path too long: `%s'", fn) == -1)
-						return -1;
-					return 1;
-				}
-				/* take dir part */
-				(void)strlcpy(buf2, fn, sizeof buf2);
-				buf2[tmp - fn + 1] = '\0';
-				/* plus (rel) link */
-				(void)strlcat(buf2, buf, sizeof buf2);
-				tmp = buf2;
-			}
-			if (stat(tmp, &tstatbuf) < 0)
-				return bad_link(ms, errno, buf);
-		}
-
-		/* Otherwise, handle it. */
-		if ((ms->flags & MAGIC_SYMLINK) != 0) {
-			const char *p;
-			ms->flags &= MAGIC_SYMLINK;
-			p = magic_file(ms, buf);
-			ms->flags |= MAGIC_SYMLINK;
-			return p != NULL ? 1 : -1;
-		} else { /* just print what it points to */
-			if (mime) {
-				if (handle_mime(ms, mime, "x-symlink") == -1)
-					return -1;
-			} else if (file_printf(ms, "symbolic link to `%s'",
-			    buf) == -1)
-				return -1;
-		}
-		return 1;
-#endif
-#ifdef	S_IFSOCK
-#ifndef __COHERENT__
-	case S_IFSOCK:
-		if (mime) {
-			if (handle_mime(ms, mime, "x-socket") == -1)
-				return -1;
-		} else if (file_printf(ms, "socket") == -1)
-			return -1;
-		return 1;
-#endif
-#endif
-	case S_IFREG:
-		break;
-	default:
-		file_error(ms, 0, "invalid mode 0%o", sb->st_mode);
-		return -1;
-		/*NOTREACHED*/
-	}
-
-	/*
-	 * regular file, check next possibility
-	 *
-	 * If stat() tells us the file has zero length, report here that
-	 * the file is empty, so we can skip all the work of opening and 
-	 * reading the file.
-	 * But if the -s option has been given, we skip this optimization,
-	 * since on some systems, stat() reports zero size for raw disk
-	 * partitions.  (If the block special device really has zero length,
-	 * the fact that it is empty will be detected and reported correctly
-	 * when we read the file.)
-	 */
-	if ((ms->flags & MAGIC_DEVICES) == 0 && sb->st_size == 0) {
-		if (mime) {
-			if (handle_mime(ms, mime, "x-empty") == -1)
-				return -1;
-		} else if (file_printf(ms, "empty") == -1)
-			return -1;
-		return 1;
-	}
-	return 0;
-}

Deleted: trunk/contrib/file/funcs.c
===================================================================
--- trunk/contrib/file/funcs.c	2014-06-30 11:58:41 UTC (rev 6698)
+++ trunk/contrib/file/funcs.c	2014-06-30 11:58:43 UTC (rev 6699)
@@ -1,427 +0,0 @@
-/*
- * Copyright (c) Christos Zoulas 2003.
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice immediately at the beginning of the file, without modification,
- *    this list of conditions, and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-#include "file.h"
-
-#ifndef	lint
-FILE_RCSID("@(#)$File: funcs.c,v 1.55 2010/07/21 16:47:17 christos Exp $")
-#endif	/* lint */
-
-#include "magic.h"
-#include <stdarg.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-#if defined(HAVE_WCHAR_H)
-#include <wchar.h>
-#endif
-#if defined(HAVE_WCTYPE_H)
-#include <wctype.h>
-#endif
-#if defined(HAVE_LIMITS_H)
-#include <limits.h>
-#endif
-
-#ifndef SIZE_MAX
-#define SIZE_MAX	((size_t)~0)
-#endif
-
-/*
- * Like printf, only we append to a buffer.
- */
-protected int
-file_vprintf(struct magic_set *ms, const char *fmt, va_list ap)
-{
-	int len;
-	char *buf, *newstr;
-
-	len = vasprintf(&buf, fmt, ap);
-	if (len < 0)
-		goto out;
-
-	if (ms->o.buf != NULL) {
-		len = asprintf(&newstr, "%s%s", ms->o.buf, buf);
-		free(buf);
-		if (len < 0)
-			goto out;
-		free(ms->o.buf);
-		buf = newstr;
-	}
-	ms->o.buf = buf;
-	return 0;
-out:
-	file_error(ms, errno, "vasprintf failed");
-	return -1;
-}
-
-protected int
-file_printf(struct magic_set *ms, const char *fmt, ...)
-{
-	int rv;
-	va_list ap;
-
-	va_start(ap, fmt);
-	rv = file_vprintf(ms, fmt, ap);
-	va_end(ap);
-	return rv;
-}
-
-/*
- * error - print best error message possible
- */
-/*VARARGS*/
-private void
-file_error_core(struct magic_set *ms, int error, const char *f, va_list va,
-    size_t lineno)
-{
-	/* Only the first error is ok */
-	if (ms->event_flags & EVENT_HAD_ERR)
-		return;
-	if (lineno != 0) {
-		free(ms->o.buf);
-		ms->o.buf = NULL;
-		file_printf(ms, "line %" SIZE_T_FORMAT "u: ", lineno);
-	}
-	file_vprintf(ms, f, va);
-	if (error > 0)
-		file_printf(ms, " (%s)", strerror(error));
-	ms->event_flags |= EVENT_HAD_ERR;
-	ms->error = error;
-}
-
-/*VARARGS*/
-protected void
-file_error(struct magic_set *ms, int error, const char *f, ...)
-{
-	va_list va;
-	va_start(va, f);
-	file_error_core(ms, error, f, va, 0);
-	va_end(va);
-}
-
-/*
- * Print an error with magic line number.
- */
-/*VARARGS*/
-protected void
-file_magerror(struct magic_set *ms, const char *f, ...)
-{
-	va_list va;
-	va_start(va, f);
-	file_error_core(ms, 0, f, va, ms->line);
-	va_end(va);
-}
-
-protected void
-file_oomem(struct magic_set *ms, size_t len)
-{
-	file_error(ms, errno, "cannot allocate %" SIZE_T_FORMAT "u bytes",
-	    len);
-}
-
-protected void
-file_badseek(struct magic_set *ms)
-{
-	file_error(ms, errno, "error seeking");
-}
-
-protected void
-file_badread(struct magic_set *ms)
-{
-	file_error(ms, errno, "error reading");
-}
-
-#ifndef COMPILE_ONLY
-protected int
-file_buffer(struct magic_set *ms, int fd, const char *inname __attribute__ ((unused)),
-    const void *buf, size_t nb)
-{
-	int m = 0, rv = 0, looks_text = 0;
-	int mime = ms->flags & MAGIC_MIME;
-	const unsigned char *ubuf = CAST(const unsigned char *, buf);
-	unichar *u8buf = NULL;
-	size_t ulen;
-	const char *code = NULL;
-	const char *code_mime = "binary";
-	const char *type = NULL;
-
-
-
-	if (nb == 0) {
-		if ((!mime || (mime & MAGIC_MIME_TYPE)) &&
-		    file_printf(ms, mime ? "application/x-empty" :
-		    "empty") == -1)
-			return -1;
-		return 1;
-	} else if (nb == 1) {
-		if ((!mime || (mime & MAGIC_MIME_TYPE)) &&
-		    file_printf(ms, mime ? "application/octet-stream" :
-		    "very short file (no magic)") == -1)
-			return -1;
-		return 1;
-	}
-
-	if ((ms->flags & MAGIC_NO_CHECK_ENCODING) == 0) {
-		looks_text = file_encoding(ms, ubuf, nb, &u8buf, &ulen,
-		    &code, &code_mime, &type);
-	}
-
-#ifdef __EMX__
-	if ((ms->flags & MAGIC_NO_CHECK_APPTYPE) == 0 && inname) {
-		switch (file_os2_apptype(ms, inname, buf, nb)) {
-		case -1:
-			return -1;
-		case 0:
-			break;
-		default:
-			return 1;
-		}
-	}
-#endif
-#if HAVE_FORK
-	/* try compression stuff */
-	if ((ms->flags & MAGIC_NO_CHECK_COMPRESS) == 0)
-		if ((m = file_zmagic(ms, fd, inname, ubuf, nb)) != 0) {
-			if ((ms->flags & MAGIC_DEBUG) != 0)
-				(void)fprintf(stderr, "zmagic %d\n", m);
-			goto done;
-		}
-#endif
-	/* Check if we have a tar file */
-	if ((ms->flags & MAGIC_NO_CHECK_TAR) == 0)
-		if ((m = file_is_tar(ms, ubuf, nb)) != 0) {
-			if ((ms->flags & MAGIC_DEBUG) != 0)
-				(void)fprintf(stderr, "tar %d\n", m);
-			goto done;
-		}
-
-	/* Check if we have a CDF file */
-	if ((ms->flags & MAGIC_NO_CHECK_CDF) == 0)
-		if ((m = file_trycdf(ms, fd, ubuf, nb)) != 0) {
-			if ((ms->flags & MAGIC_DEBUG) != 0)
-				(void)fprintf(stderr, "cdf %d\n", m);
-			goto done;
-		}
-
-	/* try soft magic tests */
-	if ((ms->flags & MAGIC_NO_CHECK_SOFT) == 0)
-		if ((m = file_softmagic(ms, ubuf, nb, BINTEST)) != 0) {
-			if ((ms->flags & MAGIC_DEBUG) != 0)
-				(void)fprintf(stderr, "softmagic %d\n", m);
-#ifdef BUILTIN_ELF
-			if ((ms->flags & MAGIC_NO_CHECK_ELF) == 0 && m == 1 &&
-			    nb > 5 && fd != -1) {
-				/*
-				 * We matched something in the file, so this
-				 * *might* be an ELF file, and the file is at
-				 * least 5 bytes long, so if it's an ELF file
-				 * it has at least one byte past the ELF magic
-				 * number - try extracting information from the
-				 * ELF headers that cannot easily * be
-				 * extracted with rules in the magic file.
-				 */
-				if ((m = file_tryelf(ms, fd, ubuf, nb)) != 0)
-					if ((ms->flags & MAGIC_DEBUG) != 0)
-						(void)fprintf(stderr,
-						    "elf %d\n", m);
-			}
-#endif
-			goto done;
-		}
-
-	/* try text properties (and possibly text tokens) */
-	if ((ms->flags & MAGIC_NO_CHECK_TEXT) == 0) {
-
-		if ((m = file_ascmagic(ms, ubuf, nb)) != 0) {
-			if ((ms->flags & MAGIC_DEBUG) != 0)
-				(void)fprintf(stderr, "ascmagic %d\n", m);
-			goto done;
-		}
-
-		/* try to discover text encoding */
-		if ((ms->flags & MAGIC_NO_CHECK_ENCODING) == 0) {
-			if (looks_text == 0)
-				if ((m = file_ascmagic_with_encoding( ms, ubuf,
-				    nb, u8buf, ulen, code, type)) != 0) {
-					if ((ms->flags & MAGIC_DEBUG) != 0)
-						(void)fprintf(stderr,
-						    "ascmagic/enc %d\n", m);
-					goto done;
-				}
-		}
-	}
-
-	/* give up */
-	m = 1;
-	if ((!mime || (mime & MAGIC_MIME_TYPE)) &&
-	    file_printf(ms, mime ? "application/octet-stream" : "data") == -1) {
-	    rv = -1;
-	}
- done:
-	if ((ms->flags & MAGIC_MIME_ENCODING) != 0) {
-		if (ms->flags & MAGIC_MIME_TYPE)
-			if (file_printf(ms, "; charset=") == -1)
-				rv = -1;
-		if (file_printf(ms, "%s", code_mime) == -1)
-			rv = -1;
-	}
-	if (u8buf)
-		free(u8buf);
-	if (rv)
-		return rv;
-
-	return m;
-}
-#endif
-
-protected int
-file_reset(struct magic_set *ms)
-{
-	if (ms->mlist == NULL) {
-		file_error(ms, 0, "no magic files loaded");
-		return -1;
-	}
-	if (ms->o.buf) {
-		free(ms->o.buf);
-		ms->o.buf = NULL;
-	}
-	if (ms->o.pbuf) {
-		free(ms->o.pbuf);
-		ms->o.pbuf = NULL;
-	}
-	ms->event_flags &= ~EVENT_HAD_ERR;
-	ms->error = -1;
-	return 0;
-}
-
-#define OCTALIFY(n, o)	\
-	/*LINTED*/ \
-	(void)(*(n)++ = '\\', \
-	*(n)++ = (((uint32_t)*(o) >> 6) & 3) + '0', \
-	*(n)++ = (((uint32_t)*(o) >> 3) & 7) + '0', \
-	*(n)++ = (((uint32_t)*(o) >> 0) & 7) + '0', \
-	(o)++)
-
-protected const char *
-file_getbuffer(struct magic_set *ms)
-{
-	char *pbuf, *op, *np;
-	size_t psize, len;
-
-	if (ms->event_flags & EVENT_HAD_ERR)
-		return NULL;
-
-	if (ms->flags & MAGIC_RAW)
-		return ms->o.buf;
-
-	if (ms->o.buf == NULL)
-		return NULL;
-
-	/* * 4 is for octal representation, + 1 is for NUL */
-	len = strlen(ms->o.buf);
-	if (len > (SIZE_MAX - 1) / 4) {
-		file_oomem(ms, len);
-		return NULL;
-	}
-	psize = len * 4 + 1;
-	if ((pbuf = CAST(char *, realloc(ms->o.pbuf, psize))) == NULL) {
-		file_oomem(ms, psize);
-		return NULL;
-	}
-	ms->o.pbuf = pbuf;
-
-#if defined(HAVE_WCHAR_H) && defined(HAVE_MBRTOWC) && defined(HAVE_WCWIDTH)
-	{
-		mbstate_t state;
-		wchar_t nextchar;
-		int mb_conv = 1;
-		size_t bytesconsumed;
-		char *eop;
-		(void)memset(&state, 0, sizeof(mbstate_t));
-
-		np = ms->o.pbuf;
-		op = ms->o.buf;
-		eop = op + len;
-
-		while (op < eop) {
-			bytesconsumed = mbrtowc(&nextchar, op,
-			    (size_t)(eop - op), &state);
-			if (bytesconsumed == (size_t)(-1) ||
-			    bytesconsumed == (size_t)(-2)) {
-				mb_conv = 0;
-				break;
-			}
-
-			if (iswprint(nextchar)) {
-				(void)memcpy(np, op, bytesconsumed);
-				op += bytesconsumed;
-				np += bytesconsumed;
-			} else {
-				while (bytesconsumed-- > 0)
-					OCTALIFY(np, op);
-			}
-		}
-		*np = '\0';
-
-		/* Parsing succeeded as a multi-byte sequence */
-		if (mb_conv != 0)
-			return ms->o.pbuf;
-	}
-#endif
-
-	for (np = ms->o.pbuf, op = ms->o.buf; *op; op++) {
-		if (isprint((unsigned char)*op)) {
-			*np++ = *op;
-		} else {
-			OCTALIFY(np, op);
-		}
-	}
-	*np = '\0';
-	return ms->o.pbuf;
-}
-
-protected int
-file_check_mem(struct magic_set *ms, unsigned int level)
-{
-	size_t len;
-
-	if (level >= ms->c.len) {
-		len = (ms->c.len += 20) * sizeof(*ms->c.li);
-		ms->c.li = CAST(struct level_info *, (ms->c.li == NULL) ?
-		    malloc(len) :
-		    realloc(ms->c.li, len));
-		if (ms->c.li == NULL) {
-			file_oomem(ms, len);
-			return -1;
-		}
-	}
-	ms->c.li[level].got_match = 0;
-#ifdef ENABLE_CONDITIONALS
-	ms->c.li[level].last_match = 0;
-	ms->c.li[level].last_cond = COND_NONE;
-#endif /* ENABLE_CONDITIONALS */
-	return 0;
-}

Deleted: trunk/contrib/file/getopt_long.c
===================================================================
--- trunk/contrib/file/getopt_long.c	2014-06-30 11:58:41 UTC (rev 6698)
+++ trunk/contrib/file/getopt_long.c	2014-06-30 11:58:43 UTC (rev 6699)
@@ -1,498 +0,0 @@
-/*	$NetBSD: getopt_long.c,v 1.21.4.1 2008/01/09 01:34:14 matt Exp $	*/
-
-/*-
- * Copyright (c) 2000 The NetBSD Foundation, Inc.
- * All rights reserved.
- *
- * This code is derived from software contributed to The NetBSD Foundation
- * by Dieter Baron and Thomas Klausner.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
- * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "file.h"
-
-#ifndef	lint
-FILE_RCSID("@(#)$File: getopt_long.c,v 1.6 2009/02/13 18:48:05 christos Exp $")
-#endif	/* lint */
-
-#include <assert.h>
-#ifdef HAVE_ERR_H
-#include <err.h>
-#else
-#define warnx printf
-#endif
-#include <errno.h>
-#if defined(HAVE_GETOPT_H) && defined(HAVE_STRUCT_OPTION)
-#include <getopt.h>
-#else
-#include "mygetopt.h"
-#endif
-#include <stdlib.h>
-#include <string.h>
-
-#define REPLACE_GETOPT
-
-#ifndef _DIAGASSERT
-#define _DIAGASSERT assert
-#endif
-
-#ifdef REPLACE_GETOPT
-#ifdef __weak_alias
-__weak_alias(getopt,_getopt)
-#endif
-int	opterr = 1;		/* if error message should be printed */
-int	optind = 1;		/* index into parent argv vector */
-int	optopt = '?';		/* character checked for validity */
-int	optreset;		/* reset getopt */
-char    *optarg;		/* argument associated with option */
-#elif HAVE_NBTOOL_CONFIG_H && !HAVE_DECL_OPTRESET
-static int optreset;
-#endif
-
-#ifdef __weak_alias
-__weak_alias(getopt_long,_getopt_long)
-#endif
-
-#define IGNORE_FIRST	(*options == '-' || *options == '+')
-#define PRINT_ERROR	((opterr) && ((*options != ':') \
-				      || (IGNORE_FIRST && options[1] != ':')))
-#define IS_POSIXLY_CORRECT (getenv("POSIXLY_CORRECT") != NULL)
-#define PERMUTE         (!IS_POSIXLY_CORRECT && !IGNORE_FIRST)
-/* XXX: GNU ignores PC if *options == '-' */
-#define IN_ORDER        (!IS_POSIXLY_CORRECT && *options == '-')
-
-/* return values */
-#define	BADCH	(int)'?'
-#define	BADARG		((IGNORE_FIRST && options[1] == ':') \
-			 || (*options == ':') ? (int)':' : (int)'?')
-#define INORDER (int)1
-
-#define	EMSG	""
-
-static int getopt_internal(int, char **, const char *);
-static int gcd(int, int);
-static void permute_args(int, int, int, char **);
-
-static const char *place = EMSG; /* option letter processing */
-
-/* XXX: set optreset to 1 rather than these two */
-static int nonopt_start = -1; /* first non option argument (for permute) */
-static int nonopt_end = -1;   /* first option after non options (for permute) */
-
-/* Error messages */
-static const char recargchar[] = "option requires an argument -- %c";
-static const char recargstring[] = "option requires an argument -- %s";
-static const char ambig[] = "ambiguous option -- %.*s";
-static const char noarg[] = "option doesn't take an argument -- %.*s";
-static const char illoptchar[] = "unknown option -- %c";
-static const char illoptstring[] = "unknown option -- %s";
-
-
-/*
- * Compute the greatest common divisor of a and b.
- */
-static int
-gcd(a, b)
-	int a;
-	int b;
-{
-	int c;
-
-	c = a % b;
-	while (c != 0) {
-		a = b;
-		b = c;
-		c = a % b;
-	}
-	   
-	return b;
-}
-
-/*
- * Exchange the block from nonopt_start to nonopt_end with the block
- * from nonopt_end to opt_end (keeping the same order of arguments
- * in each block).
- */
-static void
-permute_args(panonopt_start, panonopt_end, opt_end, nargv)
-	int panonopt_start;
-	int panonopt_end;
-	int opt_end;
-	char **nargv;
-{
-	int cstart, cyclelen, i, j, ncycle, nnonopts, nopts, pos;
-	char *swap;
-
-	_DIAGASSERT(nargv != NULL);
-
-	/*
-	 * compute lengths of blocks and number and size of cycles
-	 */
-	nnonopts = panonopt_end - panonopt_start;
-	nopts = opt_end - panonopt_end;
-	ncycle = gcd(nnonopts, nopts);
-	cyclelen = (opt_end - panonopt_start) / ncycle;
-
-	for (i = 0; i < ncycle; i++) {
-		cstart = panonopt_end+i;
-		pos = cstart;
-		for (j = 0; j < cyclelen; j++) {
-			if (pos >= panonopt_end)
-				pos -= nnonopts;
-			else
-				pos += nopts;
-			swap = nargv[pos];
-			nargv[pos] = nargv[cstart];
-			nargv[cstart] = swap;
-		}
-	}
-}
-
-/*
- * getopt_internal --
- *	Parse argc/argv argument vector.  Called by user level routines.
- *  Returns -2 if -- is found (can be long option or end of options marker).
- */
-static int
-getopt_internal(nargc, nargv, options)
-	int nargc;
-	char **nargv;
-	const char *options;
-{
-	char *oli;				/* option letter list index */
-	int optchar;
-
-	_DIAGASSERT(nargv != NULL);
-	_DIAGASSERT(options != NULL);
-
-	optarg = NULL;
-
-	/*
-	 * XXX Some programs (like rsyncd) expect to be able to
-	 * XXX re-initialize optind to 0 and have getopt_long(3)
-	 * XXX properly function again.  Work around this braindamage.
-	 */
-	if (optind == 0)
-		optind = 1;
-
-	if (optreset)
-		nonopt_start = nonopt_end = -1;
-start:
-	if (optreset || !*place) {		/* update scanning pointer */
-		optreset = 0;
-		if (optind >= nargc) {          /* end of argument vector */
-			place = EMSG;
-			if (nonopt_end != -1) {
-				/* do permutation, if we have to */
-				permute_args(nonopt_start, nonopt_end,
-				    optind, nargv);
-				optind -= nonopt_end - nonopt_start;
-			}
-			else if (nonopt_start != -1) {
-				/*
-				 * If we skipped non-options, set optind
-				 * to the first of them.
-				 */
-				optind = nonopt_start;
-			}
-			nonopt_start = nonopt_end = -1;
-			return -1;
-		}
-		if ((*(place = nargv[optind]) != '-')
-		    || (place[1] == '\0')) {    /* found non-option */
-			place = EMSG;
-			if (IN_ORDER) {
-				/*
-				 * GNU extension: 
-				 * return non-option as argument to option 1
-				 */
-				optarg = nargv[optind++];
-				return INORDER;
-			}
-			if (!PERMUTE) {
-				/*
-				 * if no permutation wanted, stop parsing
-				 * at first non-option
-				 */
-				return -1;
-			}
-			/* do permutation */
-			if (nonopt_start == -1)
-				nonopt_start = optind;
-			else if (nonopt_end != -1) {
-				permute_args(nonopt_start, nonopt_end,
-				    optind, nargv);
-				nonopt_start = optind -
-				    (nonopt_end - nonopt_start);
-				nonopt_end = -1;
-			}
-			optind++;
-			/* process next argument */
-			goto start;
-		}
-		if (nonopt_start != -1 && nonopt_end == -1)
-			nonopt_end = optind;
-		if (place[1] && *++place == '-') {	/* found "--" */
-			place++;
-			return -2;
-		}
-	}
-	if ((optchar = (int)*place++) == (int)':' ||
-	    (oli = strchr(options + (IGNORE_FIRST ? 1 : 0), optchar)) == NULL) {
-		/* option letter unknown or ':' */
-		if (!*place)
-			++optind;
-		if (PRINT_ERROR)
-			warnx(illoptchar, optchar);
-		optopt = optchar;
-		return BADCH;
-	}
-	if (optchar == 'W' && oli[1] == ';') {		/* -W long-option */
-		/* XXX: what if no long options provided (called by getopt)? */
-		if (*place) 
-			return -2;
-
-		if (++optind >= nargc) {	/* no arg */
-			place = EMSG;
-			if (PRINT_ERROR)
-				warnx(recargchar, optchar);
-			optopt = optchar;
-			return BADARG;
-		} else				/* white space */
-			place = nargv[optind];
-		/*
-		 * Handle -W arg the same as --arg (which causes getopt to
-		 * stop parsing).
-		 */
-		return -2;
-	}
-	if (*++oli != ':') {			/* doesn't take argument */
-		if (!*place)
-			++optind;
-	} else {				/* takes (optional) argument */
-		optarg = NULL;
-		if (*place)			/* no white space */
-			optarg = (char *)place;
-		/* XXX: disable test for :: if PC? (GNU doesn't) */
-		else if (oli[1] != ':') {	/* arg not optional */
-			if (++optind >= nargc) {	/* no arg */
-				place = EMSG;
-				if (PRINT_ERROR)
-					warnx(recargchar, optchar);
-				optopt = optchar;
-				return BADARG;
-			} else
-				optarg = nargv[optind];
-		}
-		place = EMSG;
-		++optind;
-	}
-	/* dump back option letter */
-	return optchar;
-}
-
-#ifdef REPLACE_GETOPT
-/*
- * getopt --
- *	Parse argc/argv argument vector.
- *
- * [eventually this will replace the real getopt]
- */
-int
-getopt(nargc, nargv, options)
-	int nargc;
-	char * const *nargv;
-	const char *options;
-{
-	int retval;
-
-	_DIAGASSERT(nargv != NULL);
-	_DIAGASSERT(options != NULL);
-
-	retval = getopt_internal(nargc, (char **)nargv, options);
-	if (retval == -2) {
-		++optind;
-		/*
-		 * We found an option (--), so if we skipped non-options,
-		 * we have to permute.
-		 */
-		if (nonopt_end != -1) {
-			permute_args(nonopt_start, nonopt_end, optind,
-				     (char **)nargv);
-			optind -= nonopt_end - nonopt_start;
-		}
-		nonopt_start = nonopt_end = -1;
-		retval = -1;
-	}
-	return retval;
-}
-#endif
-
-/*
- * getopt_long --
- *	Parse argc/argv argument vector.
- */
-int
-getopt_long(nargc, nargv, options, long_options, idx)
-	int nargc;
-	char * const *nargv;
-	const char *options;
-	const struct option *long_options;
-	int *idx;
-{
-	int retval;
-
-#define IDENTICAL_INTERPRETATION(_x, _y)				\
-	(long_options[(_x)].has_arg == long_options[(_y)].has_arg &&	\
-	 long_options[(_x)].flag == long_options[(_y)].flag &&		\
-	 long_options[(_x)].val == long_options[(_y)].val)
-
-	_DIAGASSERT(nargv != NULL);
-	_DIAGASSERT(options != NULL);
-	_DIAGASSERT(long_options != NULL);
-	/* idx may be NULL */
-
-	retval = getopt_internal(nargc, (char **)nargv, options);
-	if (retval == -2) {
-		char *current_argv, *has_equal;
-		size_t current_argv_len;
-		int i, ambiguous, match;
-
-		current_argv = (char *)place;
-		match = -1;
-		ambiguous = 0;
-
-		optind++;
-		place = EMSG;
-
-		if (*current_argv == '\0') {		/* found "--" */
-			/*
-			 * We found an option (--), so if we skipped
-			 * non-options, we have to permute.
-			 */
-			if (nonopt_end != -1) {
-				permute_args(nonopt_start, nonopt_end,
-					     optind, (char **)nargv);
-				optind -= nonopt_end - nonopt_start;
-			}
-			nonopt_start = nonopt_end = -1;
-			return -1;
-		}
-		if ((has_equal = strchr(current_argv, '=')) != NULL) {
-			/* argument found (--option=arg) */
-			current_argv_len = has_equal - current_argv;
-			has_equal++;
-		} else
-			current_argv_len = strlen(current_argv);
-	    
-		for (i = 0; long_options[i].name; i++) {
-			/* find matching long option */
-			if (strncmp(current_argv, long_options[i].name,
-			    current_argv_len))
-				continue;
-
-			if (strlen(long_options[i].name) ==
-			    (unsigned)current_argv_len) {
-				/* exact match */
-				match = i;
-				ambiguous = 0;
-				break;
-			}
-			if (match == -1)		/* partial match */
-				match = i;
-			else if (!IDENTICAL_INTERPRETATION(i, match))
-				ambiguous = 1;
-		}
-		if (ambiguous) {
-			/* ambiguous abbreviation */
-			if (PRINT_ERROR)
-				warnx(ambig, (int)current_argv_len,
-				     current_argv);
-			optopt = 0;
-			return BADCH;
-		}
-		if (match != -1) {			/* option found */
-		        if (long_options[match].has_arg == no_argument
-			    && has_equal) {
-				if (PRINT_ERROR)
-					warnx(noarg, (int)current_argv_len,
-					     current_argv);
-				/*
-				 * XXX: GNU sets optopt to val regardless of
-				 * flag
-				 */
-				if (long_options[match].flag == NULL)
-					optopt = long_options[match].val;
-				else
-					optopt = 0;
-				return BADARG;
-			}
-			if (long_options[match].has_arg == required_argument ||
-			    long_options[match].has_arg == optional_argument) {
-				if (has_equal)
-					optarg = has_equal;
-				else if (long_options[match].has_arg ==
-				    required_argument) {
-					/*
-					 * optional argument doesn't use
-					 * next nargv
-					 */
-					optarg = nargv[optind++];
-				}
-			}
-			if ((long_options[match].has_arg == required_argument)
-			    && (optarg == NULL)) {
-				/*
-				 * Missing argument; leading ':'
-				 * indicates no error should be generated
-				 */
-				if (PRINT_ERROR)
-					warnx(recargstring, current_argv);
-				/*
-				 * XXX: GNU sets optopt to val regardless
-				 * of flag
-				 */
-				if (long_options[match].flag == NULL)
-					optopt = long_options[match].val;
-				else
-					optopt = 0;
-				--optind;
-				return BADARG;
-			}
-		} else {			/* unknown option */
-			if (PRINT_ERROR)
-				warnx(illoptstring, current_argv);
-			optopt = 0;
-			return BADCH;
-		}
-		if (long_options[match].flag) {
-			*long_options[match].flag = long_options[match].val;
-			retval = 0;
-		} else 
-			retval = long_options[match].val;
-		if (idx)
-			*idx = match;
-	}
-	return retval;
-#undef IDENTICAL_INTERPRETATION
-}

Deleted: trunk/contrib/file/is_tar.c
===================================================================
--- trunk/contrib/file/is_tar.c	2014-06-30 11:58:41 UTC (rev 6698)
+++ trunk/contrib/file/is_tar.c	2014-06-30 11:58:43 UTC (rev 6699)
@@ -1,152 +0,0 @@
-/*
- * Copyright (c) Ian F. Darwin 1986-1995.
- * Software written by Ian F. Darwin and others;
- * maintained 1995-present by Christos Zoulas and others.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice immediately at the beginning of the file, without modification,
- *    this list of conditions, and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-/*
- * is_tar() -- figure out whether file is a tar archive.
- *
- * Stolen (by the author!) from the public domain tar program:
- * Public Domain version written 26 Aug 1985 John Gilmore (ihnp4!hoptoad!gnu).
- *
- * @(#)list.c 1.18 9/23/86 Public Domain - gnu
- *
- * Comments changed and some code/comments reformatted
- * for file command by Ian Darwin.
- */
-
-#include "file.h"
-
-#ifndef lint
-FILE_RCSID("@(#)$File: is_tar.c,v 1.37 2010/11/30 14:58:53 rrt Exp $")
-#endif
-
-#include "magic.h"
-#include <string.h>
-#include <ctype.h>
-#include "tar.h"
-
-#define	isodigit(c)	( ((c) >= '0') && ((c) <= '7') )
-
-private int is_tar(const unsigned char *, size_t);
-private int from_oct(int, const char *);	/* Decode octal number */
-
-static const char tartype[][32] = {
-	"tar archive",
-	"POSIX tar archive",
-	"POSIX tar archive (GNU)",
-};
-
-protected int
-file_is_tar(struct magic_set *ms, const unsigned char *buf, size_t nbytes)
-{
-	/*
-	 * Do the tar test first, because if the first file in the tar
-	 * archive starts with a dot, we can confuse it with an nroff file.
-	 */
-	int tar;
-	int mime = ms->flags & MAGIC_MIME;
-
-	if ((ms->flags & MAGIC_APPLE) != 0)
-		return 0;
-
-	tar = is_tar(buf, nbytes);
-	if (tar < 1 || tar > 3)
-		return 0;
-
-	if (file_printf(ms, "%s", mime ? "application/x-tar" :
-	    tartype[tar - 1]) == -1)
-		return -1;
-	return 1;
-}
-
-/*
- * Return
- *	0 if the checksum is bad (i.e., probably not a tar archive),
- *	1 for old UNIX tar file,
- *	2 for Unix Std (POSIX) tar file,
- *	3 for GNU tar file.
- */
-private int
-is_tar(const unsigned char *buf, size_t nbytes)
-{
-	const union record *header = (const union record *)(const void *)buf;
-	int	i;
-	int	sum, recsum;
-	const unsigned char	*p;
-
-	if (nbytes < sizeof(union record))
-		return 0;
-
-	recsum = from_oct(8,  header->header.chksum);
-
-	sum = 0;
-	p = header->charptr;
-	for (i = sizeof(union record); --i >= 0;)
-		sum += *p++;
-
-	/* Adjust checksum to count the "chksum" field as blanks. */
-	for (i = sizeof(header->header.chksum); --i >= 0;)
-		sum -= header->header.chksum[i];
-	sum += ' ' * sizeof header->header.chksum;
-
-	if (sum != recsum)
-		return 0;	/* Not a tar archive */
-
-	if (strcmp(header->header.magic, GNUTMAGIC) == 0)
-		return 3;		/* GNU Unix Standard tar archive */
-	if (strcmp(header->header.magic, TMAGIC) == 0)
-		return 2;		/* Unix Standard tar archive */
-
-	return 1;			/* Old fashioned tar archive */
-}
-
-
-/*
- * Quick and dirty octal conversion.
- *
- * Result is -1 if the field is invalid (all blank, or non-octal).
- */
-private int
-from_oct(int digs, const char *where)
-{
-	int	value;
-
-	while (isspace((unsigned char)*where)) {	/* Skip spaces */
-		where++;
-		if (--digs <= 0)
-			return -1;		/* All blank field */
-	}
-	value = 0;
-	while (digs > 0 && isodigit(*where)) {	/* Scan til non-octal */
-		value = (value << 3) | (*where++ - '0');
-		--digs;
-	}
-
-	if (digs > 0 && *where && !isspace((unsigned char)*where))
-		return -1;			/* Ended on non-(space/NUL) */
-
-	return value;
-}

Deleted: trunk/contrib/file/libmagic.man
===================================================================
--- trunk/contrib/file/libmagic.man	2014-06-30 11:58:41 UTC (rev 6698)
+++ trunk/contrib/file/libmagic.man	2014-06-30 11:58:43 UTC (rev 6699)
@@ -1,262 +0,0 @@
-.\" $File: libmagic.man,v 1.23 2011/01/14 21:59:17 rrt Exp $
-.\"
-.\" Copyright (c) Christos Zoulas 2003.
-.\" All Rights Reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\"    notice immediately at the beginning of the file, without modification,
-.\"    this list of conditions, and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\"    notice, this list of conditions and the following disclaimer in the
-.\"    documentation and/or other materials provided with the distribution.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
-.\" ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-.\" SUCH DAMAGE.
-.\"
-.Dd January 14, 2011
-.Dt LIBMAGIC 3
-.Os
-.Sh NAME
-.Nm magic_open ,
-.Nm magic_close ,
-.Nm magic_error ,
-.Nm magic_descriptor ,
-.Nm magic_buffer ,
-.Nm magic_setflags ,
-.Nm magic_check ,
-.Nm magic_compile ,
-.Nm magic_load
-.Nd Magic number recognition library.
-.Sh LIBRARY
-.Lb libmagic
-.Sh SYNOPSIS
-.In magic.h
-.Ft magic_t
-.Fn magic_open "int flags"
-.Ft void
-.Fn magic_close "magic_t cookie"
-.Ft const char *
-.Fn magic_error "magic_t cookie"
-.Ft int
-.Fn magic_errno "magic_t cookie"
-.Ft const char *
-.Fn magic_descriptor "magic_t cookie, "int fd"
-.Ft const char *
-.Fn magic_file "magic_t cookie, const char *filename"
-.Ft const char *
-.Fn magic_buffer "magic_t cookie, const void *buffer, size_t length"
-.Ft int
-.Fn magic_setflags "magic_t cookie, int flags"
-.Ft int
-.Fn magic_check "magic_t cookie, const char *filename"
-.Ft int
-.Fn magic_compile "magic_t cookie, const char *filename"
-.Ft int
-.Fn magic_load "magic_t cookie, const char *filename"
-.Sh DESCRIPTION
-These functions
-operate on the magic database file
-which is described
-in
-.Xr magic __FSECTION__ .
-.Pp
-The function
-.Fn magic_open
-creates a magic cookie pointer and returns it. It returns NULL if
-there was an error allocating the magic cookie. The
-.Ar flags
-argument specifies how the other magic functions should behave:
-.Bl -tag -width MAGIC_COMPRESS
-.It Dv MAGIC_NONE
-No special handling.
-.It Dv MAGIC_DEBUG
-Print debugging messages to stderr.
-.It Dv MAGIC_SYMLINK
-If the file queried is a symlink, follow it.
-.It Dv MAGIC_COMPRESS
-If the file is compressed, unpack it and look at the contents.
-.It Dv MAGIC_DEVICES
-If the file is a block or character special device, then open the device
-and try to look in its contents.
-.It Dv MAGIC_MIME_TYPE
-Return a MIME type string, instead of a textual description.
-.It Dv MAGIC_MIME_ENCODING
-Return a MIME encoding, instead of a textual description.
-.It Dv MAGIC_MIME
-A shorthand for MAGIC_MIME_TYPE | MAGIC_MIME_ENCODING.
-.It Dv MAGIC_CONTINUE
-Return all matches, not just the first.
-.It Dv MAGIC_CHECK
-Check the magic database for consistency and print warnings to stderr.
-.It Dv MAGIC_PRESERVE_ATIME
-On systems that support
-.Xr utime 2
-or
-.Xr utimes 2 ,
-attempt to preserve the access time of files analysed.
-.It Dv MAGIC_RAW
-Don't translate unprintable characters to a \eooo octal representation.
-.It Dv MAGIC_ERROR
-Treat operating system errors while trying to open files and follow symlinks
-as real errors, instead of printing them in the magic buffer.
-.It Dv MAGIC_APPLE
-Return the Apple creator and type.
-.It Dv MAGIC_NO_CHECK_APPTYPE
-Don't check for
-.Dv EMX
-application type (only on EMX).
-.It Dv MAGIC_NO_CHECK_CDF
-Don't get extra information on MS Composite Document Files.
-.It Dv MAGIC_NO_CHECK_COMPRESS
-Don't look inside compressed files.
-.It Dv MAGIC_NO_CHECK_ELF
-Don't print ELF details.
-.It Dv NO_CHECK_ENCODING
-Don't check text encodings.
-.It Dv MAGIC_NO_CHECK_SOFT
-Don't consult magic files.
-.It Dv MAGIC_NO_CHECK_TAR
-Don't examine tar files.
-.It Dv MAGIC_NO_CHECK_TEXT
-Don't check for various types of text files.
-.It Dv MAGIC_NO_CHECK_TOKENS
-Don't look for known tokens inside ascii files.
-.El
-.Pp
-The
-.Fn magic_close
-function closes the
-.Xr magic __FSECTION__
-database and deallocates any resources used.
-.Pp
-The
-.Fn magic_error
-function returns a textual explanation of the last error, or NULL if there was
-no error.
-.Pp
-The
-.Fn magic_errno
-function returns the last operating system error number
-.Pq Xr errno 2
-that was encountered by a system call.
-.Pp
-The
-.Fn magic_file
-function returns a textual description of the contents of the
-.Ar filename
-argument, or NULL if an error occurred.
-If the
-.Ar filename
-is NULL, then stdin is used.
-.Pp
-The
-.Fn magic_descriptor
-function returns a textual description of the contents of the
-.Ar fd
-argument, or NULL if an error occurred.
-.Pp
-The
-.Fn magic_buffer
-function returns a textual description of the contents of the
-.Ar buffer
-argument with
-.Ar length
-bytes size.
-.Pp
-The
-.Fn magic_setflags
-function sets the
-.Ar flags
-described above. Note that using both MIME flags together can also
-return extra information on the charset.
-.Pp
-The
-.Fn magic_check
-function can be used to check the validity of entries in the colon
-separated database files passed in as
-.Ar filename ,
-or NULL for the default database. It returns 0 on success and -1 on
-failure.
-.Pp
-The
-.Fn magic_compile
-function can be used to compile the the colon
-separated list of database files passed in as
-.Ar filename ,
-or NULL for the default database. It returns 0 on success and -1 on
-failure. The compiled files created are named from the
-.Xr basename 1
-of each file argument with
-.Dq .mgc
-appended to it.
-.Pp
-The
-.Fn magic_load
-function must be used to load the the colon
-separated list of database files passed in as
-.Ar filename ,
-or NULL for the default database file
-before any magic queries can performed.
-.Pp
-The default database file is named by the MAGIC environment variable.  If
-that variable is not set, the default database file name is __MAGIC__.
-.Fn magic_load
-adds
-.Dq .mgc
-to the database filename as appropriate.
-.Sh RETURN VALUES
-The function
-.Fn magic_open
-returns a magic cookie on success and NULL on failure setting errno to
-an appropriate value. It will set errno to EINVAL if an unsupported
-value for flags was given.
-The
-.Fn magic_load ,
-.Fn magic_compile ,
-and
-.Fn magic_check
-functions return 0 on success and -1 on failure.
-The
-.Fn magic_file ,
-and
-.Fn magic_buffer
-functions return a string on success and NULL on failure. The
-.Fn magic_error
-function returns a textual description of the errors of the above
-functions, or NULL if there was no error.
-Finally,
-.Fn magic_setflags
-returns -1 on systems that don't support
-.Xr utime 2 ,
-or
-.Xr utimes 2
-when
-.Dv MAGIC_PRESERVE_ATIME
-is set.
-.Sh FILES
-.Bl -tag -width __MAGIC__.mgc -compact
-.It Pa __MAGIC__
-The non-compiled default magic database.
-.It Pa __MAGIC__.mgc
-The compiled default magic database.
-.El
-.Sh SEE ALSO
-.Xr file __CSECTION__ ,
-.Xr magic __FSECTION__
-.Sh AUTHORS
-M\xE5ns Rullg\xE5rd Initial libmagic implementation,
-and configuration.
-.br
-Christos Zoulas API cleanup, error code and allocation handling.

Deleted: trunk/contrib/file/magic.c
===================================================================
--- trunk/contrib/file/magic.c	2014-06-30 11:58:41 UTC (rev 6698)
+++ trunk/contrib/file/magic.c	2014-06-30 11:58:43 UTC (rev 6699)
@@ -1,500 +0,0 @@
-/*
- * Copyright (c) Christos Zoulas 2003.
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice immediately at the beginning of the file, without modification,
- *    this list of conditions, and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifdef WIN32
-#include <windows.h>
-#include <shlwapi.h>
-#endif
-
-#include "file.h"
-
-#ifndef	lint
-FILE_RCSID("@(#)$File: magic.c,v 1.69 2010/09/20 14:14:49 christos Exp $")
-#endif	/* lint */
-
-#include "magic.h"
-
-#include <stdlib.h>
-#include <unistd.h>
-#include <string.h>
-#ifdef QUICK
-#include <sys/mman.h>
-#endif
-#ifdef HAVE_LIMITS_H
-#include <limits.h>	/* for PIPE_BUF */
-#endif
-
-#if defined(HAVE_UTIMES)
-# include <sys/time.h>
-#elif defined(HAVE_UTIME)
-# if defined(HAVE_SYS_UTIME_H)
-#  include <sys/utime.h>
-# elif defined(HAVE_UTIME_H)
-#  include <utime.h>
-# endif
-#endif
-
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>	/* for read() */
-#endif
-
-#include "patchlevel.h"
-
-#ifndef PIPE_BUF
-/* Get the PIPE_BUF from pathconf */
-#ifdef _PC_PIPE_BUF
-#define PIPE_BUF pathconf(".", _PC_PIPE_BUF)
-#else
-#define PIPE_BUF 512
-#endif
-#endif
-
-private void free_mlist(struct mlist *);
-private void close_and_restore(const struct magic_set *, const char *, int,
-    const struct stat *);
-private int unreadable_info(struct magic_set *, mode_t, const char *);
-private const char* get_default_magic(void);
-#ifndef COMPILE_ONLY
-private const char *file_or_fd(struct magic_set *, const char *, int);
-#endif
-
-#ifndef	STDIN_FILENO
-#define	STDIN_FILENO	0
-#endif
-
-#ifdef WIN32
-BOOL WINAPI DllMain(HINSTANCE hinstDLL,
-    DWORD fdwReason __attribute__((__unused__)),
-    LPVOID lpvReserved __attribute__((__unused__)));
-
-CHAR dllpath[MAX_PATH + 1] = { 0 };
-
-BOOL WINAPI DllMain(HINSTANCE hinstDLL,
-    DWORD fdwReason __attribute__((__unused__)),
-    LPVOID lpvReserved __attribute__((__unused__)))
-{
-	if (dllpath[0] == 0 &&
-	    GetModuleFileNameA(hinstDLL, dllpath, MAX_PATH) != 0)
-		PathRemoveFileSpecA(dllpath);
-	return TRUE;
-}
-#endif
-
-private const char *
-get_default_magic(void)
-{
-	static const char hmagic[] = "/.magic/magic.mgc";
-	static char default_magic[2 * MAXPATHLEN + 2];
-	char *home;
-	char hmagicpath[MAXPATHLEN + 1] = { 0 };
-
-#ifndef WIN32
-	if ((home = getenv("HOME")) == NULL)
-		return MAGIC;
-
-	(void)snprintf(hmagicpath, sizeof(hmagicpath), "%s%s", home, hmagic);
-
-	if (access(hmagicpath, R_OK) == -1)
-		return MAGIC;
-
-	(void)snprintf(default_magic, sizeof(default_magic), "%s:%s",
-	    hmagicpath, MAGIC);
-#else
-	char *hmagicp = hmagicpath;
-	char tmppath[MAXPATHLEN + 1] = { 0 };
-	char *hmagicend = &hmagicpath[sizeof(hmagicpath) - 1];
-	static const char pathsep[] = { PATHSEP, '\0' };
-
-#define APPENDPATH() \
-	if (access(tmppath, R_OK) != -1)
-		hmagicp += snprintf(hmagicp, hmagicend - hmagicp, \
-		    "%s%s", hmagicp == hmagicpath ? "" : pathsep, tmppath)
-	/* First, try to get user-specific magic file */
-	if ((home = getenv("LOCALAPPDATA")) == NULL) {
-		if ((home = getenv("USERPROFILE")) != NULL)
-			(void)snprintf(tmppath, sizeof(tmppath),
-			    "%s/Local Settings/Application Data%s", home,
-			    hmagic);
-	} else {
-		(void)snprintf(tmppath, sizeof(tmppath), "%s%s",
-		    home, hmagic);
-	}
-	if (tmppath[0] != '\0') {
-		APPENDPATH();
-	}
-
-	/* Second, try to get a magic file from Common Files */
-	if ((home = getenv("COMMONPROGRAMFILES")) != NULL) {
-		(void)snprintf(tmppath, sizeof(tmppath), "%s%s", home, hmagic);
-		APPENDPATH();
-	}
-
-
-	/* Third, try to get magic file relative to dll location */
-	if (dllpath[0] != 0) {
-		if (strlen(dllpath) > 3 &&
-		    stricmp(&dllpath[strlen(dllpath) - 3], "bin") == 0) {
-			(void)snprintf(tmppath, sizeof(tmppath),
-			    "%s/../share/misc/magic.mgc", dllpath);
-			APPENDPATH();
-		} else {
-			(void)snprintf(tmppath, sizeof(tmppath),
-			    "%s/share/misc/magic.mgc", dllpath);
-			APPENDPATH()
-			else {
-				(void)snprintf(tmppath, sizeof(tmppath),
-				    "%s/magic.mgc", dllpath);
-				APPENDPATH();
-			}
-		}
-	}
-
-	/* Don't put MAGIC constant - it likely points to a file within MSys
-	tree */
-	(void)strlcpy(default_magic, hmagicpath, sizeof(default_magic));
-#endif
-
-	return default_magic;
-}
-
-public const char *
-magic_getpath(const char *magicfile, int action)
-{
-	if (magicfile != NULL)
-		return magicfile;
-
-	magicfile = getenv("MAGIC");
-	if (magicfile != NULL)
-		return magicfile;
-
-	return action == FILE_LOAD ? get_default_magic() : MAGIC;
-}
-
-public struct magic_set *
-magic_open(int flags)
-{
-	struct magic_set *ms;
-	size_t len;
-
-	if ((ms = CAST(struct magic_set *, calloc((size_t)1,
-	    sizeof(struct magic_set)))) == NULL)
-		return NULL;
-
-	if (magic_setflags(ms, flags) == -1) {
-		errno = EINVAL;
-		goto free;
-	}
-
-	ms->o.buf = ms->o.pbuf = NULL;
-	len = (ms->c.len = 10) * sizeof(*ms->c.li);
-
-	if ((ms->c.li = CAST(struct level_info *, malloc(len))) == NULL)
-		goto free;
-
-	ms->event_flags = 0;
-	ms->error = -1;
-	ms->mlist = NULL;
-	ms->file = "unknown";
-	ms->line = 0;
-	return ms;
-free:
-	free(ms);
-	return NULL;
-}
-
-private void
-free_mlist(struct mlist *mlist)
-{
-	struct mlist *ml;
-
-	if (mlist == NULL)
-		return;
-
-	for (ml = mlist->next; ml != mlist;) {
-		struct mlist *next = ml->next;
-		struct magic *mg = ml->magic;
-		file_delmagic(mg, ml->mapped, ml->nmagic);
-		free(ml);
-		ml = next;
-	}
-	free(ml);
-}
-
-private int
-unreadable_info(struct magic_set *ms, mode_t md, const char *file)
-{
-	/* We cannot open it, but we were able to stat it. */
-	if (access(file, W_OK) == 0)
-		if (file_printf(ms, "writable, ") == -1)
-			return -1;
-	if (access(file, X_OK) == 0)
-		if (file_printf(ms, "executable, ") == -1)
-			return -1;
-	if (S_ISREG(md))
-		if (file_printf(ms, "regular file, ") == -1)
-			return -1;
-	if (file_printf(ms, "no read permission") == -1)
-		return -1;
-	return 0;
-}
-
-public void
-magic_close(struct magic_set *ms)
-{
-	free_mlist(ms->mlist);
-	free(ms->o.pbuf);
-	free(ms->o.buf);
-	free(ms->c.li);
-	free(ms);
-}
-
-/*
- * load a magic file
- */
-public int
-magic_load(struct magic_set *ms, const char *magicfile)
-{
-	struct mlist *ml = file_apprentice(ms, magicfile, FILE_LOAD);
-	if (ml) {
-		free_mlist(ms->mlist);
-		ms->mlist = ml;
-		return 0;
-	}
-	return -1;
-}
-
-public int
-magic_compile(struct magic_set *ms, const char *magicfile)
-{
-	struct mlist *ml = file_apprentice(ms, magicfile, FILE_COMPILE);
-	free_mlist(ml);
-	return ml ? 0 : -1;
-}
-
-public int
-magic_check(struct magic_set *ms, const char *magicfile)
-{
-	struct mlist *ml = file_apprentice(ms, magicfile, FILE_CHECK);
-	free_mlist(ml);
-	return ml ? 0 : -1;
-}
-
-public int
-magic_list(struct magic_set *ms, const char *magicfile)
-{
-	struct mlist *ml = file_apprentice(ms, magicfile, FILE_LIST);
-	free_mlist(ml);
-	return ml ? 0 : -1;
-}
-
-private void
-close_and_restore(const struct magic_set *ms, const char *name, int fd,
-    const struct stat *sb)
-{
-	if (fd == STDIN_FILENO)
-		return;
-	(void) close(fd);
-
-	if ((ms->flags & MAGIC_PRESERVE_ATIME) != 0) {
-		/*
-		 * Try to restore access, modification times if read it.
-		 * This is really *bad* because it will modify the status
-		 * time of the file... And of course this will affect
-		 * backup programs
-		 */
-#ifdef HAVE_UTIMES
-		struct timeval  utsbuf[2];
-		(void)memset(utsbuf, 0, sizeof(utsbuf));
-		utsbuf[0].tv_sec = sb->st_atime;
-		utsbuf[1].tv_sec = sb->st_mtime;
-
-		(void) utimes(name, utsbuf); /* don't care if loses */
-#elif defined(HAVE_UTIME_H) || defined(HAVE_SYS_UTIME_H)
-		struct utimbuf  utbuf;
-
-		(void)memset(&utbuf, 0, sizeof(utbuf));
-		utbuf.actime = sb->st_atime;
-		utbuf.modtime = sb->st_mtime;
-		(void) utime(name, &utbuf); /* don't care if loses */
-#endif
-	}
-}
-
-#ifndef COMPILE_ONLY
-
-/*
- * find type of descriptor
- */
-public const char *
-magic_descriptor(struct magic_set *ms, int fd)
-{
-	return file_or_fd(ms, NULL, fd);
-}
-
-/*
- * find type of named file
- */
-public const char *
-magic_file(struct magic_set *ms, const char *inname)
-{
-	return file_or_fd(ms, inname, STDIN_FILENO);
-}
-
-private const char *
-file_or_fd(struct magic_set *ms, const char *inname, int fd)
-{
-	int	rv = -1;
-	unsigned char *buf;
-	struct stat	sb;
-	ssize_t nbytes = 0;	/* number of bytes read from a datafile */
-	int	ispipe = 0;
-
-	/*
-	 * one extra for terminating '\0', and
-	 * some overlapping space for matches near EOF
-	 */
-#define SLOP (1 + sizeof(union VALUETYPE))
-	if ((buf = CAST(unsigned char *, malloc(HOWMANY + SLOP))) == NULL)
-		return NULL;
-
-	if (file_reset(ms) == -1)
-		goto done;
-
-	switch (file_fsmagic(ms, inname, &sb)) {
-	case -1:		/* error */
-		goto done;
-	case 0:			/* nothing found */
-		break;
-	default:		/* matched it and printed type */
-		rv = 0;
-		goto done;
-	}
-
-	if (inname == NULL) {
-		if (fstat(fd, &sb) == 0 && S_ISFIFO(sb.st_mode))
-			ispipe = 1;
-	} else {
-		int flags = O_RDONLY|O_BINARY;
-
-		if (stat(inname, &sb) == 0 && S_ISFIFO(sb.st_mode)) {
-#ifdef O_NONBLOCK
-			flags |= O_NONBLOCK;
-#endif
-			ispipe = 1;
-		}
-
-		errno = 0;
-		if ((fd = open(inname, flags)) < 0) {
-			if (unreadable_info(ms, sb.st_mode, inname) == -1)
-				goto done;
-			rv = 0;
-			goto done;
-		}
-#ifdef O_NONBLOCK
-		if ((flags = fcntl(fd, F_GETFL)) != -1) {
-			flags &= ~O_NONBLOCK;
-			(void)fcntl(fd, F_SETFL, flags);
-		}
-#endif
-	}
-
-	/*
-	 * try looking at the first HOWMANY bytes
-	 */
-	if (ispipe) {
-		ssize_t r = 0;
-
-		while ((r = sread(fd, (void *)&buf[nbytes],
-		    (size_t)(HOWMANY - nbytes), 1)) > 0) {
-			nbytes += r;
-			if (r < PIPE_BUF) break;
-		}
-
-		if (nbytes == 0) {
-			/* We can not read it, but we were able to stat it. */
-			if (unreadable_info(ms, sb.st_mode, inname) == -1)
-				goto done;
-			rv = 0;
-			goto done;
-		}
-
-	} else {
-		if ((nbytes = read(fd, (char *)buf, HOWMANY)) == -1) {
-			file_error(ms, errno, "cannot read `%s'", inname);
-			goto done;
-		}
-	}
-
-	(void)memset(buf + nbytes, 0, SLOP); /* NUL terminate */
-	if (file_buffer(ms, fd, inname, buf, (size_t)nbytes) == -1)
-		goto done;
-	rv = 0;
-done:
-	free(buf);
-	close_and_restore(ms, inname, fd, &sb);
-	return rv == 0 ? file_getbuffer(ms) : NULL;
-}
-
-
-public const char *
-magic_buffer(struct magic_set *ms, const void *buf, size_t nb)
-{
-	if (file_reset(ms) == -1)
-		return NULL;
-	/*
-	 * The main work is done here!
-	 * We have the file name and/or the data buffer to be identified.
-	 */
-	if (file_buffer(ms, -1, NULL, buf, nb) == -1) {
-		return NULL;
-	}
-	return file_getbuffer(ms);
-}
-#endif
-
-public const char *
-magic_error(struct magic_set *ms)
-{
-	return (ms->event_flags & EVENT_HAD_ERR) ? ms->o.buf : NULL;
-}
-
-public int
-magic_errno(struct magic_set *ms)
-{
-	return (ms->event_flags & EVENT_HAD_ERR) ? ms->error : 0;
-}
-
-public int
-magic_setflags(struct magic_set *ms, int flags)
-{
-#if !defined(HAVE_UTIME) && !defined(HAVE_UTIMES)
-	if (flags & MAGIC_PRESERVE_ATIME)
-		return -1;
-#endif
-	ms->flags = flags;
-	return 0;
-}

Deleted: trunk/contrib/file/magic.h
===================================================================
--- trunk/contrib/file/magic.h	2014-06-30 11:58:41 UTC (rev 6698)
+++ trunk/contrib/file/magic.h	2014-06-30 11:58:43 UTC (rev 6699)
@@ -1,94 +0,0 @@
-/*
- * Copyright (c) Christos Zoulas 2003.
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice immediately at the beginning of the file, without modification,
- *    this list of conditions, and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-#ifndef _MAGIC_H
-#define _MAGIC_H
-
-#include <sys/types.h>
-
-#define	MAGIC_NONE		0x000000 /* No flags */
-#define	MAGIC_DEBUG		0x000001 /* Turn on debugging */
-#define	MAGIC_SYMLINK		0x000002 /* Follow symlinks */
-#define	MAGIC_COMPRESS		0x000004 /* Check inside compressed files */
-#define	MAGIC_DEVICES		0x000008 /* Look at the contents of devices */
-#define	MAGIC_MIME_TYPE		0x000010 /* Return the MIME type */
-#define	MAGIC_CONTINUE		0x000020 /* Return all matches */
-#define	MAGIC_CHECK		0x000040 /* Print warnings to stderr */
-#define	MAGIC_PRESERVE_ATIME	0x000080 /* Restore access time on exit */
-#define	MAGIC_RAW		0x000100 /* Don't translate unprintable chars */
-#define	MAGIC_ERROR		0x000200 /* Handle ENOENT etc as real errors */
-#define	MAGIC_MIME_ENCODING	0x000400 /* Return the MIME encoding */
-#define MAGIC_MIME		(MAGIC_MIME_TYPE|MAGIC_MIME_ENCODING)
-#define	MAGIC_APPLE		0x000800 /* Return the Apple creator and type */
-
-#define	MAGIC_NO_CHECK_COMPRESS	0x001000 /* Don't check for compressed files */
-#define	MAGIC_NO_CHECK_TAR	0x002000 /* Don't check for tar files */
-#define	MAGIC_NO_CHECK_SOFT	0x004000 /* Don't check magic entries */
-#define	MAGIC_NO_CHECK_APPTYPE	0x008000 /* Don't check application type */
-#define	MAGIC_NO_CHECK_ELF	0x010000 /* Don't check for elf details */
-#define	MAGIC_NO_CHECK_TEXT	0x020000 /* Don't check for text files */
-#define	MAGIC_NO_CHECK_CDF	0x040000 /* Don't check for cdf files */
-#define	MAGIC_NO_CHECK_TOKENS	0x100000 /* Don't check tokens */
-#define MAGIC_NO_CHECK_ENCODING 0x200000 /* Don't check text encodings */
-
-/* No built-in tests; only consult the magic file */
-#define MAGIC_NO_CHECK_BUILTIN	0x3fb000
-
-/* Defined for backwards compatibility (renamed) */
-#define	MAGIC_NO_CHECK_ASCII	MAGIC_NO_CHECK_TEXT
-
-/* Defined for backwards compatibility; do nothing */
-#define	MAGIC_NO_CHECK_FORTRAN	0x000000 /* Don't check ascii/fortran */
-#define	MAGIC_NO_CHECK_TROFF	0x000000 /* Don't check ascii/troff */
-
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-typedef struct magic_set *magic_t;
-magic_t magic_open(int);
-void magic_close(magic_t);
-
-const char *magic_getpath(const char *, int);
-const char *magic_file(magic_t, const char *);
-const char *magic_descriptor(magic_t, int);
-const char *magic_buffer(magic_t, const void *, size_t);
-
-const char *magic_error(magic_t);
-int magic_setflags(magic_t, int);
-
-int magic_load(magic_t, const char *);
-int magic_compile(magic_t, const char *);
-int magic_check(magic_t, const char *);
-int magic_list(magic_t, const char *);
-int magic_errno(magic_t);
-
-#ifdef __cplusplus
-};
-#endif
-
-#endif /* _MAGIC_H */

Deleted: trunk/contrib/file/magic.man
===================================================================
--- trunk/contrib/file/magic.man	2014-06-30 11:58:41 UTC (rev 6698)
+++ trunk/contrib/file/magic.man	2014-06-30 11:58:43 UTC (rev 6699)
@@ -1,543 +0,0 @@
-.\" $File: magic.man,v 1.66 2011/01/06 23:54:41 rrt Exp $
-.Dd August 30, 2008
-.Dt MAGIC __FSECTION__
-.Os
-.\" install as magic.4 on USG, magic.5 on V7, Berkeley and Linux systems.
-.Sh NAME
-.Nm magic
-.Nd file command's magic pattern file
-.Sh DESCRIPTION
-This manual page documents the format of the magic file as
-used by the
-.Xr file __CSECTION__
-command, version __VERSION__.
-The
-.Xr file __CSECTION__
-command identifies the type of a file using,
-among other tests,
-a test for whether the file contains certain
-.Dq "magic patterns" .
-The file
-.Pa __MAGIC__
-specifies what patterns are to be tested for, what message or
-MIME type to print if a particular pattern is found,
-and additional information to extract from the file.
-.Pp
-Each line of the file specifies a test to be performed.
-A test compares the data starting at a particular offset
-in the file with a byte value, a string or a numeric value.
-If the test succeeds, a message is printed.
-The line consists of the following fields:
-.Bl -tag -width ".Dv message"
-.It Dv offset
-A number specifying the offset, in bytes, into the file of the data
-which is to be tested.
-.It Dv type
-The type of the data to be tested.
-The possible values are:
-.Bl -tag -width ".Dv lestring16"
-.It Dv byte
-A one-byte value.
-.It Dv short
-A two-byte value in this machine's native byte order.
-.It Dv long
-A four-byte value in this machine's native byte order.
-.It Dv quad
-An eight-byte value in this machine's native byte order.
-.It Dv float
-A 32-bit single precision IEEE floating point number in this machine's native byte order.
-.It Dv double
-A 64-bit double precision IEEE floating point number in this machine's native byte order.
-.It Dv string
-A string of bytes.
-The string type specification can be optionally followed
-by /[Bbc]*.
-The
-.Dq B
-flag compacts whitespace in the target, which must
-contain at least one whitespace character.
-If the magic has
-.Dv n
-consecutive blanks, the target needs at least
-.Dv n
-consecutive blanks to match.
-The
-.Dq b
-flag treats every blank in the target as an optional blank.
-Finally the
-.Dq c
-flag, specifies case insensitive matching: lowercase
-characters in the magic match both lower and upper case characters in the
-target, whereas upper case characters in the magic only match uppercase
-characters in the target.
-.It Dv pstring
-A Pascal-style string where the first byte/short/int is interpreted as the an
-unsigned length.
-The length defaults to byte and can be specified as a modifier.
-The following modifiers are supported:
-.Bl -tag -compact -width B
-.It B
-A byte length (default).
-.It H
-A 2 byte big endian length.
-.It h
-A 2 byte big little length.
-.It L
-A 4 byte big endian length.
-.It l
-A 4 byte big little length.
-.It J
-The length includes itself in its count.
-.El
-The string is not NUL terminated.
-.Dq J
-is used rather than the more
-valuable
-.Dq I
-because this type of length is a feature of the JPEG
-format.
-.It Dv date
-A four-byte value interpreted as a UNIX date.
-.It Dv qdate
-A eight-byte value interpreted as a UNIX date.
-.It Dv ldate
-A four-byte value interpreted as a UNIX-style date, but interpreted as
-local time rather than UTC.
-.It Dv qldate
-An eight-byte value interpreted as a UNIX-style date, but interpreted as
-local time rather than UTC.
-.It Dv beid3
-A 32-bit ID3 length in big-endian byte order.
-.It Dv beshort
-A two-byte value in big-endian byte order.
-.It Dv belong
-A four-byte value in big-endian byte order.
-.It Dv bequad
-An eight-byte value in big-endian byte order.
-.It Dv befloat
-A 32-bit single precision IEEE floating point number in big-endian byte order.
-.It Dv bedouble
-A 64-bit double precision IEEE floating point number in big-endian byte order.
-.It Dv bedate
-A four-byte value in big-endian byte order,
-interpreted as a Unix date.
-.It Dv beqdate
-An eight-byte value in big-endian byte order,
-interpreted as a Unix date.
-.It Dv beldate
-A four-byte value in big-endian byte order,
-interpreted as a UNIX-style date, but interpreted as local time rather
-than UTC.
-.It Dv beqldate
-An eight-byte value in big-endian byte order,
-interpreted as a UNIX-style date, but interpreted as local time rather
-than UTC.
-.It Dv bestring16
-A two-byte unicode (UCS16) string in big-endian byte order.
-.It Dv leid3
-A 32-bit ID3 length in little-endian byte order.
-.It Dv leshort
-A two-byte value in little-endian byte order.
-.It Dv lelong
-A four-byte value in little-endian byte order.
-.It Dv lequad
-An eight-byte value in little-endian byte order.
-.It Dv lefloat
-A 32-bit single precision IEEE floating point number in little-endian byte order.
-.It Dv ledouble
-A 64-bit double precision IEEE floating point number in little-endian byte order.
-.It Dv ledate
-A four-byte value in little-endian byte order,
-interpreted as a UNIX date.
-.It Dv leqdate
-An eight-byte value in little-endian byte order,
-interpreted as a UNIX date.
-.It Dv leldate
-A four-byte value in little-endian byte order,
-interpreted as a UNIX-style date, but interpreted as local time rather
-than UTC.
-.It Dv leqldate
-An eight-byte value in little-endian byte order,
-interpreted as a UNIX-style date, but interpreted as local time rather
-than UTC.
-.It Dv lestring16
-A two-byte unicode (UCS16) string in little-endian byte order.
-.It Dv melong
-A four-byte value in middle-endian (PDP-11) byte order.
-.It Dv medate
-A four-byte value in middle-endian (PDP-11) byte order,
-interpreted as a UNIX date.
-.It Dv meldate
-A four-byte value in middle-endian (PDP-11) byte order,
-interpreted as a UNIX-style date, but interpreted as local time rather
-than UTC.
-.It Dv indirect
-Starting at the given offset, consult the magic database again.
-.It Dv regex
-A regular expression match in extended POSIX regular expression syntax
-(like egrep). Regular expressions can take exponential time to
-process, and their performance is hard to predict, so their use is
-discouraged. When used in production environments, their performance
-should be carefully checked. The type specification can be optionally
-followed by
-.Dv /[c][s] .
-The
-.Dq c
-flag makes the match case insensitive, while the
-.Dq s
-flag update the offset to the start offset of the match, rather than the end.
-The regular expression is tested against line
-.Dv N + 1
-onwards, where
-.Dv N
-is the given offset.
-Line endings are assumed to be in the machine's native format.
-.Dv ^
-and
-.Dv $
-match the beginning and end of individual lines, respectively,
-not beginning and end of file.
-.It Dv search
-A literal string search starting at the given offset. The same
-modifier flags can be used as for string patterns. The modifier flags
-(if any) must be followed by
-.Dv /number
-the range, that is, the number of positions at which the match will be
-attempted, starting from the start offset. This is suitable for
-searching larger binary expressions with variable offsets, using
-.Dv \e
-escapes for special characters. The offset works as for regex.
-.It Dv default
-This is intended to be used with the test
-.Em x
-(which is always true) and a message that is to be used if there are
-no other matches.
-.El
-.Pp
-Each top-level magic pattern (see below for an explanation of levels)
-is classified as text or binary according to the types used. Types
-.Dq regex
-and
-.Dq search
-are classified as text tests, unless non-printable characters are used
-in the pattern. All other tests are classified as binary. A top-level
-pattern is considered to be a test text when all its patterns are text
-patterns; otherwise, it is considered to be a binary pattern. When
-matching a file, binary patterns are tried first; if no match is
-found, and the file looks like text, then its encoding is determined
-and the text patterns are tried.
-.Pp
-The numeric types may optionally be followed by
-.Dv \*[Am]
-and a numeric value,
-to specify that the value is to be AND'ed with the
-numeric value before any comparisons are done.
-Prepending a
-.Dv u
-to the type indicates that ordered comparisons should be unsigned.
-.It Dv test
-The value to be compared with the value from the file.
-If the type is
-numeric, this value
-is specified in C form; if it is a string, it is specified as a C string
-with the usual escapes permitted (e.g. \en for new-line).
-.Pp
-Numeric values
-may be preceded by a character indicating the operation to be performed.
-It may be
-.Dv = ,
-to specify that the value from the file must equal the specified value,
-.Dv \*[Lt] ,
-to specify that the value from the file must be less than the specified
-value,
-.Dv \*[Gt] ,
-to specify that the value from the file must be greater than the specified
-value,
-.Dv \*[Am] ,
-to specify that the value from the file must have set all of the bits
-that are set in the specified value,
-.Dv ^ ,
-to specify that the value from the file must have clear any of the bits
-that are set in the specified value, or
-.Dv ~ ,
-the value specified after is negated before tested.
-.Dv x ,
-to specify that any value will match.
-If the character is omitted, it is assumed to be
-.Dv = .
-Operators
-.Dv \*[Am] ,
-.Dv ^ ,
-and
-.Dv ~
-don't work with floats and doubles.
-The operator
-.Dv !\&
-specifies that the line matches if the test does
-.Em not
-succeed.
-.Pp
-Numeric values are specified in C form; e.g.
-.Dv 13
-is decimal,
-.Dv 013
-is octal, and
-.Dv 0x13
-is hexadecimal.
-.Pp
-For string values, the string from the
-file must match the specified string.
-The operators
-.Dv = ,
-.Dv \*[Lt]
-and
-.Dv \*[Gt]
-(but not
-.Dv \*[Am] )
-can be applied to strings.
-The length used for matching is that of the string argument
-in the magic file.
-This means that a line can match any non-empty string (usually used to
-then print the string), with
-.Em \*[Gt]\e0
-(because all non-empty strings are greater than the empty string).
-.Pp
-The special test
-.Em x
-always evaluates to true.
-.It Dv message
-The message to be printed if the comparison succeeds.
-If the string contains a
-.Xr printf 3
-format specification, the value from the file (with any specified masking
-performed) is printed using the message as the format string.
-If the string begins with
-.Dq \eb ,
-the message printed is the remainder of the string with no whitespace
-added before it: multiple matches are normally separated by a single
-space.
-.El
-.Pp
-An APPLE 4+4 character APPLE creator and type can be specified as:
-.Bd -literal -offset indent
-!:apple	CREATYPE
-.Ed
-.Pp
-A MIME type is given on a separate line, which must be the next
-non-blank or comment line after the magic line that identifies the
-file type, and has the following format:
-.Bd -literal -offset indent
-!:mime	MIMETYPE
-.Ed
-.Pp
-i.e. the literal string
-.Dq !:mime
-followed by the MIME type.
-.Pp
-An optional strength can be supplied on a separate line which refers to
-the current magic description using the following format:
-.Bd -literal -offset indent
-!:strength OP VALUE
-.Ed
-.Pp
-The operand
-.Dv OP
-can be:
-.Dv + ,
-.Dv - ,
-.Dv * ,
-or
-.Dv /
-and
-.Dv VALUE
-is a constant between 0 and 255.
-This constant is applied using the specified operand
-to the currently computed default magic strength.
-.Pp
-Some file formats contain additional information which is to be printed
-along with the file type or need additional tests to determine the true
-file type.
-These additional tests are introduced by one or more
-.Em \*[Gt]
-characters preceding the offset.
-The number of
-.Em \*[Gt]
-on the line indicates the level of the test; a line with no
-.Em \*[Gt]
-at the beginning is considered to be at level 0.
-Tests are arranged in a tree-like hierarchy:
-if the test on a line at level
-.Em n
-succeeds, all following tests at level
-.Em n+1
-are performed, and the messages printed if the tests succeed, until a line
-with level
-.Em n
-(or less) appears.
-For more complex files, one can use empty messages to get just the
-"if/then" effect, in the following way:
-.Bd -literal -offset indent
-0      string   MZ
-\*[Gt]0x18  leshort  \*[Lt]0x40   MS-DOS executable
-\*[Gt]0x18  leshort  \*[Gt]0x3f   extended PC executable (e.g., MS Windows)
-.Ed
-.Pp
-Offsets do not need to be constant, but can also be read from the file
-being examined.
-If the first character following the last
-.Em \*[Gt]
-is a
-.Em \&(
-then the string after the parenthesis is interpreted as an indirect offset.
-That means that the number after the parenthesis is used as an offset in
-the file.
-The value at that offset is read, and is used again as an offset
-in the file.
-Indirect offsets are of the form:
-.Em (( x [.[bislBISL]][+\-][ y ]) .
-The value of
-.Em x
-is used as an offset in the file.
-A byte, id3 length, short or long is read at that offset depending on the
-.Em [bislBISLm]
-type specifier.
-The capitalized types interpret the number as a big endian
-value, whereas the small letter versions interpret the number as a little
-endian value;
-the
-.Em m
-type interprets the number as a middle endian (PDP-11) value.
-To that number the value of
-.Em y
-is added and the result is used as an offset in the file.
-The default type if one is not specified is long.
-.Pp
-That way variable length structures can be examined:
-.Bd -literal -offset indent
-# MS Windows executables are also valid MS-DOS executables
-0           string  MZ
-\*[Gt]0x18       leshort \*[Lt]0x40   MZ executable (MS-DOS)
-# skip the whole block below if it is not an extended executable
-\*[Gt]0x18       leshort \*[Gt]0x3f
-\*[Gt]\*[Gt](0x3c.l)  string  PE\e0\e0  PE executable (MS-Windows)
-\*[Gt]\*[Gt](0x3c.l)  string  LX\e0\e0  LX executable (OS/2)
-.Ed
-.Pp
-This strategy of examining has a drawback: You must make sure that
-you eventually print something, or users may get empty output (like, when
-there is neither PE\e0\e0 nor LE\e0\e0 in the above example)
-.Pp
-If this indirect offset cannot be used directly, simple calculations are
-possible: appending
-.Em [+-*/%\*[Am]|^]number
-inside parentheses allows one to modify
-the value read from the file before it is used as an offset:
-.Bd -literal -offset indent
-# MS Windows executables are also valid MS-DOS executables
-0           string  MZ
-# sometimes, the value at 0x18 is less that 0x40 but there's still an
-# extended executable, simply appended to the file
-\*[Gt]0x18       leshort \*[Lt]0x40
-\*[Gt]\*[Gt](4.s*512) leshort 0x014c  COFF executable (MS-DOS, DJGPP)
-\*[Gt]\*[Gt](4.s*512) leshort !0x014c MZ executable (MS-DOS)
-.Ed
-.Pp
-Sometimes you do not know the exact offset as this depends on the length or
-position (when indirection was used before) of preceding fields.
-You can specify an offset relative to the end of the last up-level
-field using
-.Sq \*[Am]
-as a prefix to the offset:
-.Bd -literal -offset indent
-0           string  MZ
-\*[Gt]0x18       leshort \*[Gt]0x3f
-\*[Gt]\*[Gt](0x3c.l)  string  PE\e0\e0    PE executable (MS-Windows)
-# immediately following the PE signature is the CPU type
-\*[Gt]\*[Gt]\*[Gt]\*[Am]0       leshort 0x14c     for Intel 80386
-\*[Gt]\*[Gt]\*[Gt]\*[Am]0       leshort 0x184     for DEC Alpha
-.Ed
-.Pp
-Indirect and relative offsets can be combined:
-.Bd -literal -offset indent
-0             string  MZ
-\*[Gt]0x18         leshort \*[Lt]0x40
-\*[Gt]\*[Gt](4.s*512)   leshort !0x014c MZ executable (MS-DOS)
-# if it's not COFF, go back 512 bytes and add the offset taken
-# from byte 2/3, which is yet another way of finding the start
-# of the extended executable
-\*[Gt]\*[Gt]\*[Gt]\*[Am](2.s-514) string  LE      LE executable (MS Windows VxD driver)
-.Ed
-.Pp
-Or the other way around:
-.Bd -literal -offset indent
-0                 string  MZ
-\*[Gt]0x18             leshort \*[Gt]0x3f
-\*[Gt]\*[Gt](0x3c.l)        string  LE\e0\e0  LE executable (MS-Windows)
-# at offset 0x80 (-4, since relative offsets start at the end
-# of the up-level match) inside the LE header, we find the absolute
-# offset to the code area, where we look for a specific signature
-\*[Gt]\*[Gt]\*[Gt](\*[Am]0x7c.l+0x26) string  UPX     \eb, UPX compressed
-.Ed
-.Pp
-Or even both!
-.Bd -literal -offset indent
-0                string  MZ
-\*[Gt]0x18            leshort \*[Gt]0x3f
-\*[Gt]\*[Gt](0x3c.l)       string  LE\e0\e0 LE executable (MS-Windows)
-# at offset 0x58 inside the LE header, we find the relative offset
-# to a data area where we look for a specific signature
-\*[Gt]\*[Gt]\*[Gt]\*[Am](\*[Am]0x54.l-3)  string  UNACE  \eb, ACE self-extracting archive
-.Ed
-.Pp
-Finally, if you have to deal with offset/length pairs in your file, even the
-second value in a parenthesized expression can be taken from the file itself,
-using another set of parentheses.
-Note that this additional indirect offset is always relative to the
-start of the main indirect offset.
-.Bd -literal -offset indent
-0                 string       MZ
-\*[Gt]0x18             leshort      \*[Gt]0x3f
-\*[Gt]\*[Gt](0x3c.l)        string       PE\e0\e0 PE executable (MS-Windows)
-# search for the PE section called ".idata"...
-\*[Gt]\*[Gt]\*[Gt]\*[Am]0xf4          search/0x140 .idata
-# ...and go to the end of it, calculated from start+length;
-# these are located 14 and 10 bytes after the section name
-\*[Gt]\*[Gt]\*[Gt]\*[Gt](\*[Am]0xe.l+(-4)) string       PK\e3\e4 \eb, ZIP self-extracting archive
-.Ed
-.Sh SEE ALSO
-.Xr file __CSECTION__
-\- the command that reads this file.
-.Sh BUGS
-The formats
-.Dv long ,
-.Dv belong ,
-.Dv lelong ,
-.Dv melong ,
-.Dv short ,
-.Dv beshort ,
-.Dv leshort ,
-.Dv date ,
-.Dv bedate ,
-.Dv medate ,
-.Dv ledate ,
-.Dv beldate ,
-.Dv leldate ,
-and
-.Dv meldate
-are system-dependent; perhaps they should be specified as a number
-of bytes (2B, 4B, etc),
-since the files being recognized typically come from
-a system on which the lengths are invariant.
-.\"
-.\" From: guy at sun.uucp (Guy Harris)
-.\" Newsgroups: net.bugs.usg
-.\" Subject: /etc/magic's format isn't well documented
-.\" Message-ID: <2752 at sun.uucp>
-.\" Date: 3 Sep 85 08:19:07 GMT
-.\" Organization: Sun Microsystems, Inc.
-.\" Lines: 136
-.\"
-.\" Here's a manual page for the format accepted by the "file" made by adding
-.\" the changes I posted to the S5R2 version.
-.\"
-.\" Modified for Ian Darwin's version of the file command.

Deleted: trunk/contrib/file/mygetopt.h
===================================================================
--- trunk/contrib/file/mygetopt.h	2014-06-30 11:58:41 UTC (rev 6698)
+++ trunk/contrib/file/mygetopt.h	2014-06-30 11:58:43 UTC (rev 6699)
@@ -1,68 +0,0 @@
-/*	$NetBSD: getopt.h,v 1.8 2007/11/06 19:21:18 christos Exp $	*/
-
-/*-
- * Copyright (c) 2000 The NetBSD Foundation, Inc.
- * All rights reserved.
- *
- * This code is derived from software contributed to The NetBSD Foundation
- * by Dieter Baron and Thomas Klausner.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *        This product includes software developed by the NetBSD
- *        Foundation, Inc. and its contributors.
- * 4. Neither the name of The NetBSD Foundation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
- * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef _GETOPT_H_
-#define _GETOPT_H_
-
-#include <unistd.h>
-
-/*
- * Gnu like getopt_long() and BSD4.4 getsubopt()/optreset extensions
- */
-#define no_argument        0
-#define required_argument  1
-#define optional_argument  2
-
-struct option {
-	/* name of long option */
-	const char *name;
-	/*
-	 * one of no_argument, required_argument, and optional_argument:
-	 * whether option takes an argument
-	 */
-	int has_arg;
-	/* if not NULL, set *flag to val when option found */
-	int *flag;
-	/* if flag not NULL, value to set *flag to; else return value */
-	int val;
-};
-
-int getopt_long(int, char * const *, const char *,
-    const struct option *, int *);
- 
-#endif /* !_GETOPT_H_ */

Deleted: trunk/contrib/file/names.h
===================================================================
--- trunk/contrib/file/names.h	2014-06-30 11:58:41 UTC (rev 6698)
+++ trunk/contrib/file/names.h	2014-06-30 11:58:43 UTC (rev 6699)
@@ -1,176 +0,0 @@
-/*
- * Copyright (c) Ian F. Darwin 1986-1995.
- * Software written by Ian F. Darwin and others;
- * maintained 1995-present by Christos Zoulas and others.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice immediately at the beginning of the file, without modification,
- *    this list of conditions, and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *  
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-/*
- * Names.h - names and types used by ascmagic in file(1).
- * These tokens are here because they can appear anywhere in
- * the first HOWMANY bytes, while tokens in MAGIC must
- * appear at fixed offsets into the file. Don't make HOWMANY
- * too high unless you have a very fast CPU.
- *
- * $File: names.h,v 1.33 2010/10/08 21:58:44 christos Exp $
- */
-
-/*
-	modified by Chris Lowth - 9 April 2000
-	to add mime type strings to the types table.
-*/
-
-/* these types are used to index the table 'types': keep em in sync! */
-#define	L_C	0		/* first and foremost on UNIX */
-#define	L_CC	1		/* Bjarne's postincrement */
-#define	L_MAKE	2		/* Makefiles */
-#define	L_PLI	3		/* PL/1 */
-#define	L_MACH	4		/* some kinda assembler */
-#define	L_ENG	5		/* English */
-#define	L_PAS	6		/* Pascal */
-#define	L_MAIL	7		/* Electronic mail */
-#define	L_NEWS	8		/* Usenet Netnews */
-#define	L_JAVA	9		/* Java code */
-#define	L_HTML	10		/* HTML */
-#define	L_BCPL	11		/* BCPL */
-#define	L_M4	12		/* M4 */
-#define	L_PO	13		/* PO */
-
-static const struct {
-	char human[48];
-	char mime[16];
-} types[] = {
-	{ "C program",					"text/x-c", },
-	{ "C++ program",				"text/x-c++" },
-	{ "make commands",				"text/x-makefile" },
-	{ "PL/1 program",				"text/x-pl1" },
-	{ "assembler program",				"text/x-asm" },
-	{ "English",					"text/plain" },
-	{ "Pascal program",				"text/x-pascal" },
-	{ "mail",					"text/x-mail" },
-	{ "news",					"text/x-news" },
-	{ "Java program",				"text/x-java" },
-	{ "HTML document",				"text/html", },
-	{ "BCPL program",				"text/x-bcpl" },
-	{ "M4 macro language pre-processor",		"text/x-m4" },
-	{ "PO (gettext message catalogue)",             "text/x-po" },
-	{ "cannot happen error on names.h/types",	"error/x-error" }
-};
-
-/*
- * XXX - how should we distinguish Java from C++?
- * The trick used in a Debian snapshot, of having "extends" or "implements"
- * as tags for Java, doesn't work very well, given that those keywords
- * are often preceded by "class", which flags it as C++.
- *
- * Perhaps we need to be able to say
- *
- *	If "class" then
- *
- *		if "extends" or "implements" then
- *			Java
- *		else
- *			C++
- *	endif
- *
- * Or should we use other keywords, such as "package" or "import"?
- * Unfortunately, Ada95 uses "package", and Modula-3 uses "import",
- * although I infer from the language spec at
- *
- *	http://www.research.digital.com/SRC/m3defn/html/m3.html
- *
- * that Modula-3 uses "IMPORT" rather than "import", i.e. it must be
- * in all caps.
- *
- * So, for now, we go with "import".  We must put it before the C++
- * stuff, so that we don't misidentify Java as C++.  Not using "package"
- * means we won't identify stuff that defines a package but imports
- * nothing; hopefully, very little Java code imports nothing (one of the
- * reasons for doing OO programming is to import as much as possible
- * and write only what you need to, right?).
- *
- * Unfortunately, "import" may cause us to misidentify English text
- * as Java, as it comes after "the" and "The".  Perhaps we need a fancier
- * heuristic to identify Java?
- */
-static const struct names {
-	char name[14];
-	unsigned char type;
-	unsigned char score;
-
-} names[] = {
-	/* These must be sorted by eye for optimal hit rate */
-	/* Add to this list only after substantial meditation */
-	{"msgid",	L_PO, 1 },
-	{"dnl",		L_M4, 2 },
-	{"import",	L_JAVA, 2 },
-	{"\"libhdr\"",	L_BCPL, 2 },
-	{"\"LIBHDR\"",	L_BCPL, 2 },
-	{"//",		L_CC, 2 },
-	{"template",	L_CC, 1 },
-	{"virtual",	L_CC, 1 },
-	{"class",	L_CC, 2 },
-	{"public:",	L_CC, 2 },
-	{"private:",	L_CC, 2 },
-	{"/*",		L_C, 2 },	/* must precede "The", "the", etc. */
-	{"#include",	L_C, 2 },
-	{"char",	L_C, 2 },
-	{"The",		L_ENG, 2 },
-	{"the",		L_ENG, 2 },
-	{"double",	L_C, 1 },
-	{"extern",	L_C, 2 },
-	{"float",	L_C, 1 },
-	{"struct",	L_C, 1 },
-	{"union",	L_C, 1 },
-	{"main(",	L_C, 2 },
-	{"CFLAGS",	L_MAKE, 2 },
-	{"LDFLAGS",	L_MAKE, 2 },
-	{"all:",	L_MAKE, 2 },
-	{".PRECIOUS",	L_MAKE, 2 },
-	{".ascii",	L_MACH, 2 },
-	{".asciiz",	L_MACH, 2 },
-	{".byte",	L_MACH, 2 },
-	{".even",	L_MACH, 2 },
-	{".globl",	L_MACH, 2 },
-	{".text",	L_MACH, 2 },
-	{"clr",		L_MACH, 2 },
-	{"(input,",	L_PAS, 2 },
-	{"program",	L_PAS, 1 },
-	{"record",	L_PAS, 1 },
-	{"dcl",		L_PLI, 2 },
-	{"Received:",	L_MAIL, 2 },
-	{">From",	L_MAIL, 2 },
-	{"Return-Path:",L_MAIL, 2 },
-	{"Cc:",		L_MAIL, 2 },
-	{"Newsgroups:",	L_NEWS, 2 },
-	{"Path:",	L_NEWS, 2 },
-	{"Organization:",L_NEWS, 2 },
-	{"href=",	L_HTML, 2 },
-	{"HREF=",	L_HTML, 2 },
-	{"<body",	L_HTML, 2 },
-	{"<BODY",	L_HTML, 2 },
-	{"<html",	L_HTML, 2 },
-	{"<HTML",	L_HTML, 2 },
-	{"<!--",	L_HTML, 2 },
-};
-#define NNAMES (sizeof(names)/sizeof(struct names))

Deleted: trunk/contrib/file/readelf.h
===================================================================
--- trunk/contrib/file/readelf.h	2014-06-30 11:58:41 UTC (rev 6698)
+++ trunk/contrib/file/readelf.h	2014-06-30 11:58:43 UTC (rev 6699)
@@ -1,312 +0,0 @@
-/*
- * Copyright (c) Christos Zoulas 2003.
- * All Rights Reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice immediately at the beginning of the file, without modification,
- *    this list of conditions, and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *  
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-/*
- * @(#)Id: readelf.h,v 1.9 2002/05/16 18:45:56 christos Exp
- *
- * Provide elf data structures for non-elf machines, allowing file
- * non-elf hosts to determine if an elf binary is stripped.
- * Note: cobbled from the linux header file, with modifications
- */
-#ifndef __fake_elf_h__
-#define __fake_elf_h__
-
-#if HAVE_STDINT_H
-#include <stdint.h>
-#endif
-
-typedef uint32_t	Elf32_Addr;
-typedef uint32_t	Elf32_Off;
-typedef uint16_t	Elf32_Half;
-typedef uint32_t	Elf32_Word;
-typedef uint8_t		Elf32_Char;
-
-#if SIZEOF_LONG_LONG != 8
-#define USE_ARRAY_FOR_64BIT_TYPES
-typedef	uint32_t 	Elf64_Addr[2];
-typedef	uint32_t 	Elf64_Off[2];
-typedef uint32_t 	Elf64_Xword[2];
-#else
-#undef USE_ARRAY_FOR_64BIT_TYPES
-typedef	uint64_t 	Elf64_Addr;
-typedef	uint64_t 	Elf64_Off;
-typedef uint64_t 	Elf64_Xword;
-#endif
-typedef uint16_t	Elf64_Half;
-typedef uint32_t	Elf64_Word;
-typedef uint8_t		Elf64_Char;
-
-#define EI_NIDENT	16
-
-typedef struct {
-    Elf32_Char	e_ident[EI_NIDENT];
-    Elf32_Half	e_type;
-    Elf32_Half	e_machine;
-    Elf32_Word	e_version;
-    Elf32_Addr	e_entry;  /* Entry point */
-    Elf32_Off	e_phoff;
-    Elf32_Off	e_shoff;
-    Elf32_Word	e_flags;
-    Elf32_Half	e_ehsize;
-    Elf32_Half	e_phentsize;
-    Elf32_Half	e_phnum;
-    Elf32_Half	e_shentsize;
-    Elf32_Half	e_shnum;
-    Elf32_Half	e_shstrndx;
-} Elf32_Ehdr;
-
-typedef struct {
-    Elf64_Char	e_ident[EI_NIDENT];
-    Elf64_Half	e_type;
-    Elf64_Half	e_machine;
-    Elf64_Word	e_version;
-    Elf64_Addr	e_entry;  /* Entry point */
-    Elf64_Off	e_phoff;
-    Elf64_Off	e_shoff;
-    Elf64_Word	e_flags;
-    Elf64_Half	e_ehsize;
-    Elf64_Half	e_phentsize;
-    Elf64_Half	e_phnum;
-    Elf64_Half	e_shentsize;
-    Elf64_Half	e_shnum;
-    Elf64_Half	e_shstrndx;
-} Elf64_Ehdr;
-
-/* e_type */
-#define ET_REL		1
-#define ET_EXEC		2
-#define ET_DYN		3
-#define ET_CORE		4
-
-/* e_machine (used only for SunOS 5.x hardware capabilities) */
-#define	EM_SPARC	2
-#define	EM_386		3
-#define	EM_SPARC32PLUS	18
-#define	EM_SPARCV9	43
-#define	EM_IA_64	50
-#define	EM_AMD64	62
-
-/* sh_type */
-#define SHT_SYMTAB	2
-#define SHT_NOTE	7
-#define SHT_DYNSYM	11
-#define SHT_SUNW_cap	0x6ffffff5	/* SunOS 5.x hw/sw capabilites */
-
-/* elf type */
-#define ELFDATANONE	0		/* e_ident[EI_DATA] */
-#define ELFDATA2LSB	1
-#define ELFDATA2MSB	2
-
-/* elf class */
-#define ELFCLASSNONE	0
-#define ELFCLASS32	1
-#define ELFCLASS64	2
-
-/* magic number */
-#define	EI_MAG0		0		/* e_ident[] indexes */
-#define	EI_MAG1		1
-#define	EI_MAG2		2
-#define	EI_MAG3		3
-#define	EI_CLASS	4
-#define	EI_DATA		5
-#define	EI_VERSION	6
-#define	EI_PAD		7
-
-#define	ELFMAG0		0x7f		/* EI_MAG */
-#define	ELFMAG1		'E'
-#define	ELFMAG2		'L'
-#define	ELFMAG3		'F'
-#define	ELFMAG		"\177ELF"
-
-#define	OLFMAG1		'O'
-#define	OLFMAG		"\177OLF"
-
-typedef struct {
-    Elf32_Word	p_type;
-    Elf32_Off	p_offset;
-    Elf32_Addr	p_vaddr;
-    Elf32_Addr	p_paddr;
-    Elf32_Word	p_filesz;
-    Elf32_Word	p_memsz;
-    Elf32_Word	p_flags;
-    Elf32_Word	p_align;
-} Elf32_Phdr;
-
-typedef struct {
-    Elf64_Word	p_type;
-    Elf64_Word	p_flags;
-    Elf64_Off	p_offset;
-    Elf64_Addr	p_vaddr;
-    Elf64_Addr	p_paddr;
-    Elf64_Xword	p_filesz;
-    Elf64_Xword	p_memsz;
-    Elf64_Xword	p_align;
-} Elf64_Phdr;
-
-#define	PT_NULL		0		/* p_type */
-#define	PT_LOAD		1
-#define	PT_DYNAMIC	2
-#define	PT_INTERP	3
-#define	PT_NOTE		4
-#define	PT_SHLIB	5
-#define	PT_PHDR		6
-#define	PT_NUM		7
-
-typedef struct {
-    Elf32_Word	sh_name;
-    Elf32_Word	sh_type;
-    Elf32_Word	sh_flags;
-    Elf32_Addr	sh_addr;
-    Elf32_Off	sh_offset;
-    Elf32_Word	sh_size;
-    Elf32_Word	sh_link;
-    Elf32_Word	sh_info;
-    Elf32_Word	sh_addralign;
-    Elf32_Word	sh_entsize;
-} Elf32_Shdr;
-
-typedef struct {
-    Elf64_Word	sh_name;
-    Elf64_Word	sh_type;
-    Elf64_Off	sh_flags;
-    Elf64_Addr	sh_addr;
-    Elf64_Off	sh_offset;
-    Elf64_Off	sh_size;
-    Elf64_Word	sh_link;
-    Elf64_Word	sh_info;
-    Elf64_Off	sh_addralign;
-    Elf64_Off	sh_entsize;
-} Elf64_Shdr;
-
-#define	NT_NETBSD_CORE_PROCINFO		1
-
-/* Note header in a PT_NOTE section */
-typedef struct elf_note {
-    Elf32_Word	n_namesz;	/* Name size */
-    Elf32_Word	n_descsz;	/* Content size */
-    Elf32_Word	n_type;		/* Content type */
-} Elf32_Nhdr;
-
-typedef struct {
-    Elf64_Word	n_namesz;
-    Elf64_Word	n_descsz;
-    Elf64_Word	n_type;
-} Elf64_Nhdr;
-
-/* Notes used in ET_CORE */
-#define	NT_PRSTATUS	1
-#define	NT_PRFPREG	2
-#define	NT_PRPSINFO	3
-#define	NT_PRXREG	4
-#define NT_TASKSTRUCT	4
-#define	NT_PLATFORM	5
-#define	NT_AUXV		6
-
-/* Note types used in executables */
-/* NetBSD executables (name = "NetBSD") */
-#define NT_NETBSD_VERSION	1
-#define NT_NETBSD_EMULATION	2
-#define NT_FREEBSD_VERSION	1
-#define NT_OPENBSD_VERSION	1
-#define NT_DRAGONFLY_VERSION	1
-/* GNU executables (name = "GNU") */
-#define NT_GNU_VERSION		1
-
-/* GNU OS tags */
-#define GNU_OS_LINUX	0
-#define GNU_OS_HURD	1
-#define GNU_OS_SOLARIS	2
-#define GNU_OS_KFREEBSD	3
-#define GNU_OS_KNETBSD	4
-
-/* SunOS 5.x hardware/software capabilities */
-typedef struct {
-	Elf32_Word	c_tag;
-	union {
-		Elf32_Word	c_val;
-		Elf32_Addr	c_ptr;
-	} c_un;
-} Elf32_Cap;
-
-typedef struct {
-	Elf64_Xword	c_tag;
-	union {
-		Elf64_Xword	c_val;
-		Elf64_Addr	c_ptr;
-	} c_un;
-} Elf64_Cap;
-
-/* SunOS 5.x hardware/software capability tags */
-#define	CA_SUNW_NULL	0
-#define	CA_SUNW_HW_1	1
-#define	CA_SUNW_SF_1	2
-
-/* SunOS 5.x software capabilities */
-#define	SF1_SUNW_FPKNWN	0x01
-#define	SF1_SUNW_FPUSED	0x02
-#define	SF1_SUNW_MASK	0x03
-
-/* SunOS 5.x hardware capabilities: sparc */
-#define	AV_SPARC_MUL32		0x0001
-#define	AV_SPARC_DIV32		0x0002
-#define	AV_SPARC_FSMULD		0x0004
-#define	AV_SPARC_V8PLUS		0x0008
-#define	AV_SPARC_POPC		0x0010
-#define	AV_SPARC_VIS		0x0020
-#define	AV_SPARC_VIS2		0x0040
-#define	AV_SPARC_ASI_BLK_INIT	0x0080
-#define	AV_SPARC_FMAF		0x0100
-#define	AV_SPARC_FJFMAU		0x4000
-#define	AV_SPARC_IMA		0x8000
-
-/* SunOS 5.x hardware capabilities: 386 */
-#define	AV_386_FPU		0x00000001
-#define	AV_386_TSC		0x00000002
-#define	AV_386_CX8		0x00000004
-#define	AV_386_SEP		0x00000008
-#define	AV_386_AMD_SYSC		0x00000010
-#define	AV_386_CMOV		0x00000020
-#define	AV_386_MMX		0x00000040
-#define	AV_386_AMD_MMX		0x00000080
-#define	AV_386_AMD_3DNow	0x00000100
-#define	AV_386_AMD_3DNowx	0x00000200
-#define	AV_386_FXSR		0x00000400
-#define	AV_386_SSE		0x00000800
-#define	AV_386_SSE2		0x00001000
-#define	AV_386_PAUSE		0x00002000
-#define	AV_386_SSE3		0x00004000
-#define	AV_386_MON		0x00008000
-#define	AV_386_CX16		0x00010000
-#define	AV_386_AHF		0x00020000
-#define	AV_386_TSCP		0x00040000
-#define	AV_386_AMD_SSE4A	0x00080000
-#define	AV_386_POPCNT		0x00100000
-#define	AV_386_AMD_LZCNT	0x00200000
-#define	AV_386_SSSE3		0x00400000
-#define	AV_386_SSE4_1		0x00800000
-#define	AV_386_SSE4_2		0x01000000
-
-#endif



More information about the Midnightbsd-cvs mailing list