]> granicus.if.org Git - php/commitdiff
Upgrade bundled libmagic to 5.03 (fixes CDF parsing related issues)
authorMikko Koppanen <mkoppanen@php.net>
Sat, 26 Dec 2009 15:00:21 +0000 (15:00 +0000)
committerMikko Koppanen <mkoppanen@php.net>
Sat, 26 Dec 2009 15:00:21 +0000 (15:00 +0000)
Clean up / remove whitespace differences to make next merge easier
Removed unnecessary files from trunk

18 files changed:
ext/fileinfo/libmagic/apprentice.c
ext/fileinfo/libmagic/apptype.c
ext/fileinfo/libmagic/ascmagic.c
ext/fileinfo/libmagic/cdf.c
ext/fileinfo/libmagic/cdf_time.c
ext/fileinfo/libmagic/compress.c
ext/fileinfo/libmagic/file.c [deleted file]
ext/fileinfo/libmagic/file.h
ext/fileinfo/libmagic/file_opts.h [deleted file]
ext/fileinfo/libmagic/funcs.c
ext/fileinfo/libmagic/getopt_long.c [deleted file]
ext/fileinfo/libmagic/is_tar.c
ext/fileinfo/libmagic/magic.c
ext/fileinfo/libmagic/magic.h
ext/fileinfo/libmagic/print.c
ext/fileinfo/libmagic/readcdf.c
ext/fileinfo/libmagic/readelf.c
ext/fileinfo/libmagic/softmagic.c

index dcea282038eb48e64b636c7b83db1130305584a2..030961aa6193850fe0f08e365ff6c25b77d5b44a 100644 (file)
@@ -34,7 +34,7 @@
 #include "file.h"
 
 #ifndef        lint
-FILE_RCSID("@(#)$File: apprentice.c,v 1.132 2008/03/28 18:19:30 christos Exp $")
+FILE_RCSID("@(#)$File: apprentice.c,v 1.151 2009/03/18 15:19:23 christos Exp $")
 #endif /* lint */
 
 #include "magic.h"
@@ -611,7 +611,11 @@ load_1(struct magic_set *ms, int action, const char *fn, int *errs,
        } else {
 
                /* read and parse this file */
+#if (PHP_MAJOR_VERSION < 6)
+               for (ms->line = 1; (line = php_stream_get_line(stream, buffer , BUFSIZ, &line_len)) != NULL; ms->line++) {
+#else          
                for (ms->line = 1; (line = php_stream_get_line(stream, ZSTR(buffer), BUFSIZ, &line_len)) != NULL; ms->line++) {
+#endif
                        if (line_len == 0) /* null line, garbage, etc */
                                continue;
 
@@ -853,9 +857,9 @@ file_signextend(struct magic_set *ms, struct magic *m, uint64_t v)
                case FILE_INDIRECT:
                        break;
                default:
-                       if (ms->flags & MAGIC_CHECK) {
-                           file_magwarn(ms, "cannot happen: m->type=%d\n", m->type);
-                       }
+                       if (ms->flags & MAGIC_CHECK)
+                           file_magwarn(ms, "cannot happen: m->type=%d\n",
+                                   m->type);
                        return ~0U;
                }
        }
@@ -1671,7 +1675,7 @@ check_format(struct magic_set *ms, struct magic *m)
                 */
                file_magwarn(ms, "Printf format `%c' is not valid for type "
                    "`%s' in description `%s'", *ptr ? *ptr : '?',
-            file_names[m->type], m->desc);
+                   file_names[m->type], m->desc);
                return -1;
        }
        
index 85136ed156401320b7c34141ab966d6328850351..31b8095e13bae8ead23f1ad5c304ea5d0df9a5a4 100644 (file)
 #include "file.h"
 
 #ifndef        lint
-FILE_RCSID("@(#)$File: apptype.c,v 1.7 2007/01/12 17:38:27 christos Exp $")
+FILE_RCSID("@(#)$File: apptype.c,v 1.11 2009/02/04 18:24:32 christos Exp $")
 #endif /* lint */
 
-
 #include <stdlib.h>
 #include <string.h>
 
index 4fee8a87b2ea75a2e651d7bbf1623f0cbd0dcbfc..e73b26fe9b67112494a56839f822f1e2605a34ba 100644 (file)
@@ -2,7 +2,7 @@
  * 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:
@@ -12,7 +12,7 @@
  * 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
@@ -36,7 +36,7 @@
 #include "file.h"
 
 #ifndef        lint
-FILE_RCSID("@(#)$File: ascmagic.c,v 1.62 2008/03/01 22:21:48 rrt Exp $")
+FILE_RCSID("@(#)$File: ascmagic.c,v 1.75 2009/02/03 20:27:51 christos Exp $")
 #endif /* lint */
 
 #include "magic.h"
@@ -66,14 +66,14 @@ 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;   
+       unichar *ubuf = NULL;
        size_t ulen;
        int rv = 1;
 
@@ -264,7 +264,7 @@ subtype_identified:
                        if (file_printf(ms, ", with") == -1)
                                goto done;
 
-                       if (n_crlf == 0 && n_cr == 0 && n_nel == 0 && n_lf == 0)                        {
+                       if (n_crlf == 0 && n_cr == 0 && n_nel == 0 && n_lf == 0) {
                                if (file_printf(ms, " no") == -1)
                                        goto done;
                        } else {
index eecfa1e45204cd143bf9715b6487789f86dcacea..a3b4a11fc0e27b4e5ec067ccb8f5f58fe8baab8b 100644 (file)
@@ -32,7 +32,7 @@
 #include "file.h"
 
 #ifndef lint
-FILE_RCSID("@(#)$File: cdf.c,v 1.17 2009/02/03 20:27:51 christos Exp $")
+FILE_RCSID("@(#)$File: cdf.c,v 1.30 2009/05/06 14:29:47 christos Exp $")
 #endif
 
 #include <assert.h>
@@ -237,6 +237,19 @@ cdf_unpack_dir(cdf_directory_t *d, char *buf)
        CDF_UNPACK(d->d_unused0);
 }
 
+static int
+cdf_check_stream_offset(const cdf_stream_t *sst, const void *p, size_t tail)
+{
+       const char *b = (const char *)sst->sst_tab;
+       const char *e = ((const char *)p) + tail;
+       if (e >= b && (size_t)(e - b) < sst->sst_dirlen * sst->sst_len)
+               return 0;
+       DPRINTF((stderr, "offset begin %p end %p %zu >= %zu\n", b, e,
+           (size_t)(e - b), 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)
 {
@@ -264,7 +277,6 @@ cdf_read(const cdf_info_t *info, off_t off, void *buf, size_t len)
        return (ssize_t)len;
 }
 
-
 int
 cdf_read_header(const cdf_info_t *info, cdf_header_t *h)
 {
@@ -332,15 +344,15 @@ cdf_read_sat(const cdf_info_t *info, cdf_header_t *h, cdf_sat_t *sat)
                        break;
 
 #define CDF_SEC_LIMIT (UINT32_MAX / (4 * ss))
-       if (h->h_num_sectors_in_master_sat > CDF_SEC_LIMIT ||
-           i > CDF_SEC_LIMIT / nsatpersec) {
+       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 %zu\n",
                    h->h_num_sectors_in_master_sat, i));
                errno = EFTYPE;
                return -1;
        }
 
-       sat->sat_len = h->h_num_sectors_in_master_sat + i * nsatpersec;
+       sat->sat_len = h->h_num_sectors_in_master_sat * nsatpersec + i;
        DPRINTF(("sat_len = %zu ss = %zu\n", sat->sat_len, ss));
        if ((sat->sat_tab = calloc(sat->sat_len, ss)) == NULL)
                return -1;
@@ -360,6 +372,8 @@ cdf_read_sat(const cdf_info_t *info, cdf_header_t *h, cdf_sat_t *sat)
 
        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;
@@ -371,10 +385,8 @@ cdf_read_sat(const cdf_info_t *info, cdf_header_t *h, cdf_sat_t *sat)
                }
                for (k = 0; k < nsatpersec; k++, i++) {
                        sec = CDF_TOLE4(msa[k]);
-                       if (sec < 0) {
-                               sat->sat_len = i;
-                               break;
-                       }
+                       if (sec < 0)
+                               goto out;
                        if (i >= sat->sat_len) {
                            DPRINTF(("Out of bounds reading MSA %u >= %u",
                                i, sat->sat_len));
@@ -390,6 +402,8 @@ cdf_read_sat(const cdf_info_t *info, cdf_header_t *h, cdf_sat_t *sat)
                }
                mid = CDF_TOLE4(msa[nsatpersec]);
        }
+out:
+       sat->sat_len = i;
        free(msa);
        return 0;
 out2:
@@ -478,7 +492,7 @@ cdf_read_short_sector_chain(const cdf_header_t *h,
        scn->sst_len = cdf_count_chain(ssat, sid, CDF_SEC_SIZE(h));
        scn->sst_dirlen = len;
 
-       if (scn->sst_len == (size_t)-1)
+       if (sst->sst_tab == NULL || scn->sst_len == (size_t)-1)
                return -1;
 
        scn->sst_tab = calloc(scn->sst_len, ss);
@@ -629,22 +643,21 @@ cdf_read_short_stream(const cdf_info_t *info, const cdf_header_t *h,
                        break;
 
        /* If the it is not there, just fake it; some docs don't have it */
-       if (i == dir->dir_len) {
-               scn->sst_tab = NULL;
-               scn->sst_len = 0;
-               return 0;
-       }
+       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) {
-               scn->sst_tab = NULL;
-               scn->sst_len = 0;
-               return 0;
-       }
+       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
@@ -697,15 +710,27 @@ cdf_read_property_info(const cdf_stream_t *sst, uint32_t offs,
        size_t i, o, nelements, j;
        cdf_property_info_t *inp;
 
+       if (offs > UINT32_MAX / 4) {
+               errno = EFTYPE;
+               goto out;
+       }
        shp = (const void *)((const char *)sst->sst_tab + offs);
+       if (cdf_check_stream_offset(sst, shp, sizeof(*shp)) == -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_LIM (UINT32_MAX / (4 * sizeof(*inp)))
-       if (sh.sh_properties > CDF_PROP_LIM)
+#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));
+       DPRINTF(("section len: %u properties %u\n", sh.sh_len,
+           sh.sh_properties));
        if (*maxcount) {
-               if (*maxcount > CDF_PROP_LIM)
+               if (*maxcount > CDF_PROP_LIMIT)
                        goto out;
                *maxcount += sh.sh_properties;
                inp = realloc(*info, *maxcount * sizeof(*inp));
@@ -720,6 +745,8 @@ cdf_read_property_info(const cdf_stream_t *sst, uint32_t offs,
        *count += sh.sh_properties;
        p = (const void *)((const char *)sst->sst_tab + offs + sizeof(sh));
        e = (const void *)(((const char *)shp) + sh.sh_len);
+       if (cdf_check_stream_offset(sst, e, 0) == -1)
+               goto out;
        for (i = 0; i < sh.sh_properties; i++) {
                q = (const uint32_t *)((const char *)p +
                    CDF_TOLE4(p[(i << 1) + 1])) - 2;
@@ -777,8 +804,8 @@ cdf_read_property_info(const cdf_stream_t *sst, uint32_t offs,
                case CDF_LENGTH32_STRING:
                        if (nelements > 1) {
                                size_t nelem = inp - *info;
-                               if (*maxcount > CDF_PROP_LIM
-                                   || nelements > CDF_PROP_LIM)
+                               if (*maxcount > CDF_PROP_LIMIT
+                                   || nelements > CDF_PROP_LIMIT)
                                        goto out;
                                *maxcount += nelements;
                                inp = realloc(*info, *maxcount * sizeof(*inp));
@@ -832,6 +859,9 @@ cdf_unpack_summary_info(const cdf_stream_t *sst, cdf_summary_info_header_t *ssi,
        const cdf_section_declaration_t *sd = (const void *)
            ((const char *)sst->sst_tab + CDF_SECTION_DECLARATION_OFFSET);
 
+       if (cdf_check_stream_offset(sst, si, sizeof(*si)) == -1 ||
+           cdf_check_stream_offset(sst, sd, sizeof(*sd)) == -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);
@@ -946,11 +976,13 @@ 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);
-       DUMP("%d", sec_size_p2);
-       DUMP("%d", short_sec_size_p2);
+       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);
@@ -1202,7 +1234,7 @@ main(int argc, char *argv[])
 #endif
 
 
-               if (cdf_read_summary_info(&inf, &h, &sat, &ssat, &sst, &dir,
+               if (cdf_read_summary_info(&info, &h, &sat, &ssat, &sst, &dir,
                    &scn) == -1)
                        err(1, "Cannot read summary info");
 #ifdef CDF_DEBUG
index ac416ea2fe2a30af61fbd2cfeb855208183f496f..36372966a78b5d69744c2b59611ad26f6ef88f01 100644 (file)
@@ -27,7 +27,7 @@
 #include "file.h"
 
 #ifndef lint
-FILE_RCSID("@(#)$File: cdf_time.c,v 1.5 2009/02/03 20:27:51 christos Exp $")
+FILE_RCSID("@(#)$File: cdf_time.c,v 1.6 2009/03/10 11:44:29 christos Exp $")
 #endif
 
 #include <time.h>
index 19ff67033b49ee6e1bfae1c5e038511099945304..de4de3401cd8a8569ae335d4cd9c6817e0bcfdbb 100644 (file)
@@ -36,7 +36,7 @@
 #include "file.h"
 
 #ifndef lint
-FILE_RCSID("@(#)$File: compress.c,v 1.56 2008/02/07 00:58:52 christos Exp $")
+FILE_RCSID("@(#)$File: compress.c,v 1.63 2009/03/23 14:21:51 christos Exp $")
 #endif
 
 #include "magic.h"
@@ -86,11 +86,8 @@ private const struct {
        { "\3757zXZ\0",6,{ "xz", "-cd", NULL }, 1 },            /* XZ Utils */
 };
 
-private size_t ncompr = sizeof(compr) / sizeof(compr[0]);
-
 #define NODATA ((size_t)~0)
 
-
 private ssize_t swrite(int, const void *, size_t);
 #ifdef PHP_FILEINFO_UNCOMPRESS
 private size_t uncompressbuf(struct magic_set *, int, size_t,
@@ -108,10 +105,13 @@ file_zmagic(struct magic_set *ms, int fd, const char *name,
        size_t i, nsz;
        int rv = 0;
        int mime = ms->flags & MAGIC_MIME;
+       size_t ncompr;
 
        if ((ms->flags & MAGIC_COMPRESS) == 0)
                return 0;
 
+       ncompr = sizeof(compr) / sizeof(compr[0]);
+
        for (i = 0; i < ncompr; i++) {
                if (nbytes < compr[i].maglen)
                        continue;
@@ -191,7 +191,6 @@ sread(int fd, void *buf, size_t n, int canbepipe)
        if ((canbepipe && (ioctl(fd, FIONREAD, &t) == -1)) || (t == 0)) {
 #ifdef FD_ZERO
                int cnt;
-
                for (cnt = 0;; cnt++) {
                        fd_set check;
                        struct timeval tout = {0, 100 * 1000};
@@ -493,7 +492,7 @@ err:
                (void)wait(NULL);
 #endif
                (void) close(fdin[0]);
-               
+           
                return n;
        }
 }
diff --git a/ext/fileinfo/libmagic/file.c b/ext/fileinfo/libmagic/file.c
deleted file mode 100644 (file)
index 89d1632..0000000
+++ /dev/null
@@ -1,481 +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"
-#include "magic.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/param.h> /* for MAXPATHLEN */
-#include <sys/stat.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
-
-#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
-
-#include <netinet/in.h>                /* for byte swapping */
-
-#include "patchlevel.h"
-
-#ifndef        lint
-FILE_RCSID("@(#)$File: file.c,v 1.119 2008/02/07 00:58:52 christos Exp $")
-#endif /* lint */
-
-
-#ifdef S_IFLNK
-#define SYMLINKFLAG "Lh"
-#else
-#define SYMLINKFLAG ""
-#endif
-
-# define USAGE  "Usage: %s [-bcik" SYMLINKFLAG "nNrsvz0] [-e test] [-f namefile] [-F separator] [-m magicfiles] file...\n       %s -C -m magicfiles\n"
-
-#ifndef MAXPATHLEN
-#define        MAXPATHLEN      512
-#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 *magicfile = 0;     /* where the magic is   */
-private const char *default_magicfile = MAGIC;
-private const char *separator = ":";   /* Default field separator      */
-
-private char *progname;                /* used throughout              */
-
-private struct magic_set *magic;
-
-private void unwrap(char *);
-private void usage(void);
-private void help(void);
-
-int main(int, char *[]);
-private void process(const char *, int);
-private void 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;
-       char *home, *usermagic;
-       struct stat sb;
-       static const char hmagic[] = "/.magic";
-#define OPTSTRING      "bcCde:f:F:hikLm:nNprsvz0"
-       int longindex;
-       static 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}
-};
-
-       static const struct {
-               const char *name;
-               int value;
-       } nv[] = {
-               { "apptype",    MAGIC_NO_CHECK_APPTYPE },
-               { "ascii",      MAGIC_NO_CHECK_ASCII },
-               { "compress",   MAGIC_NO_CHECK_COMPRESS },
-               { "elf",        MAGIC_NO_CHECK_ELF },
-               { "soft",       MAGIC_NO_CHECK_SOFT },
-               { "tar",        MAGIC_NO_CHECK_TAR },
-               { "tokens",     MAGIC_NO_CHECK_TOKENS },
-       };
-
-       /* 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];
-
-       magicfile = default_magicfile;
-       if ((usermagic = getenv("MAGIC")) != NULL)
-               magicfile = usermagic;
-       else
-               if ((home = getenv("HOME")) != NULL) {
-                       if ((usermagic = malloc(strlen(home)
-                           + sizeof(hmagic))) != NULL) {
-                               (void)strcpy(usermagic, home);
-                               (void)strcat(usermagic, hmagic);
-                               if (stat(usermagic, &sb)<0) 
-                                       free(usermagic);
-                               else
-                                       magicfile = usermagic;
-                       }
-               }
-
-#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_MIME_TYPE;
-                               break;
-                       case 11:
-                               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();
-                       load(magicfile, flags);
-                       unwrap(optarg);
-                       ++didsomefiles;
-                       break;
-               case 'F':
-                       separator = optarg;
-                       break;
-               case 'i':
-                       flags |= MAGIC_MIME;
-                       break;
-               case 'k':
-                       flags |= MAGIC_CONTINUE;
-                       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':
-                       (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();
-       }
-
-       switch(action) {
-       case FILE_CHECK:
-       case FILE_COMPILE:
-               magic = magic_open(flags|MAGIC_CHECK);
-               if (magic == NULL) {
-                       (void)fprintf(stderr, "%s: %s\n", progname,
-                           strerror(errno));
-                       return 1;
-               }
-               c = action == FILE_CHECK ? magic_check(magic, magicfile) :
-                   magic_compile(magic, magicfile);
-               if (c == -1) {
-                       (void)fprintf(stderr, "%s: %s\n", progname,
-                           magic_error(magic));
-                       return -1;
-               }
-               return 0;
-       default:
-               load(magicfile, flags);
-               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++)
-                       process(argv[optind], wid);
-       }
-
-       c = magic->haderr ? 1 : 0;
-       magic_close(magic);
-       return c;
-}
-
-
-private void
-/*ARGSUSED*/
-load(const char *m, int flags)
-{
-       if (magic || m == NULL)
-               return;
-       magic = magic_open(flags);
-       if (magic == NULL) {
-               (void)fprintf(stderr, "%s: %s\n", progname, strerror(errno));
-               exit(1);
-       }
-       if (magic_load(magic, magicfile) == -1) {
-               (void)fprintf(stderr, "%s: %s\n",
-                   progname, magic_error(magic));
-               exit(1);
-       }
-}
-
-/*
- * unwrap -- read a file of filenames, do each one.
- */
-private void
-unwrap(char *fn)
-{
-       char buf[MAXPATHLEN];
-       FILE *f;
-       int wid = 0, cwid;
-
-       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));
-                       exit(1);
-               }
-
-               while (fgets(buf, MAXPATHLEN, 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';
-               process(buf, wid);
-               if(nobuffer)
-                       (void)fflush(stdout);
-       }
-
-       (void)fclose(f);
-}
-
-/*
- * Called for each input file on the command line (or in a list of files)
- */
-private void
-process(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);
-               else
-                       (void)printf("%s", separator);
-               (void)printf("%*s ",
-                   (int) (nopad ? 0 : (wid - file_mbswidth(inname))), "");
-       }
-
-       type = magic_file(magic, std_in ? NULL : inname);
-       if (type == NULL)
-               (void)printf("ERROR: %s\n", magic_error(magic));
-       else
-               (void)printf("%s\n", type);
-}
-
-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);
-       (void)fputs("Try `file --help' for more information.\n", stderr);
-       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);
-}
index 58211f19253e6bf58a46de8e6c4e0ed498c0e4db..915602fa6fbb4eec7f586f837c08c4d88fd1094b 100644 (file)
@@ -2,7 +2,7 @@
  * 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:
@@ -12,7 +12,7 @@
  * 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
@@ -27,7 +27,7 @@
  */
 /*
  * file.h - definitions for file(1) program
- * @(#)$File: file.h,v 1.103 2008/03/01 22:21:49 rrt Exp $
+ * @(#)$File: file.h,v 1.119 2009/02/04 18:24:32 christos Exp $
  */
 
 #ifndef __file_h__
@@ -138,7 +138,7 @@ struct magic {
 #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) */
+                                  for top-level tests) */
 #define TEXTTEST       0       /* for passing to file_softmagic */
 
        uint8_t factor;
@@ -216,7 +216,7 @@ struct magic {
 #else
        uint8_t dummy;  
 #endif
-       uint8_t factor_op;      
+       uint8_t factor_op;
 #define                FILE_FACTOR_OP_PLUS     '+'
 #define                FILE_FACTOR_OP_MINUS    '-'
 #define                FILE_FACTOR_OP_TIMES    '*'
@@ -264,7 +264,7 @@ struct magic {
 #define str_range _u._s._count
 #define str_flags _u._s._flags
        /* Words 9-16 */
-       union VALUETYPE value; /* either number of string */
+       union VALUETYPE value;  /* either number or string */
        /* Words 17-24 */
        char desc[MAXDESC];     /* description */
        /* Words 25-32 */
@@ -312,7 +312,6 @@ struct level_info {
        int last_cond;  /* used for error checking by parse() */
 #endif
 };
-
 struct magic_set {
        struct mlist *mlist;
        struct cont {
diff --git a/ext/fileinfo/libmagic/file_opts.h b/ext/fileinfo/libmagic/file_opts.h
deleted file mode 100644 (file)
index 46bc08a..0000000
+++ /dev/null
@@ -1,48 +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("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', "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")
index f36f9b29aa71873e2b1d857dc8031d41196d2f23..3ca5408088be626d026d81ce23759a4d54a997d7 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * 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:
@@ -11,7 +11,7 @@
  * 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
@@ -27,7 +27,7 @@
 #include "file.h"
 
 #ifndef        lint
-FILE_RCSID("@(#)$File: funcs.c,v 1.39 2008/03/01 22:21:49 rrt Exp $")
+FILE_RCSID("@(#)$File: funcs.c,v 1.53 2009/04/07 11:07:00 christos Exp $")
 #endif /* lint */
 
 #include "magic.h"
@@ -392,7 +392,7 @@ file_getbuffer(struct magic_set *ms)
 
        for (np = ms->o.pbuf, op = ms->o.buf; *op; op++) {
                if (isprint((unsigned char)*op)) {
-                       *np++ = *op;    
+                       *np++ = *op;
                } else {
                        OCTALIFY(np, op);
                }
diff --git a/ext/fileinfo/libmagic/getopt_long.c b/ext/fileinfo/libmagic/getopt_long.c
deleted file mode 100644 (file)
index e6efd0f..0000000
+++ /dev/null
@@ -1,482 +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 <assert.h>
-#include <err.h>
-#include <errno.h>
-#include <getopt.h>
-#include <stdlib.h>
-#include <string.h>
-
-#define REPLACE_GETOPT
-
-#define _DIAGASSERT assert
-
-#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 __P((int, char **, const char *));
-static int gcd __P((int, int));
-static void permute_args __P((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
-}
index 9802877e8cf1236a615fed8df040b1388f55a7b7..f962edbd8ee345d61ae01c0b5779d197682224e1 100644 (file)
@@ -40,7 +40,7 @@
 #include "file.h"
 
 #ifndef lint
-FILE_RCSID("@(#)$File: is_tar.c,v 1.31 2008/02/04 20:51:17 christos Exp $")
+FILE_RCSID("@(#)$File: is_tar.c,v 1.36 2009/02/03 20:27:51 christos Exp $")
 #endif
 
 #include "magic.h"
index e573922faaa18390aa75f15f8b0e82d3e7371b64..849896bc837fb8cb591cc7f69931ac8f8bd02809 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * 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:
@@ -11,7 +11,7 @@
  * 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
@@ -28,7 +28,7 @@
 #include "file.h"
 
 #ifndef        lint
-FILE_RCSID("@(#)$File: magic.c,v 1.50 2008/02/19 00:58:59 rrt Exp $")
+FILE_RCSID("@(#)$File: magic.c,v 1.62 2009/03/20 21:25:41 christos Exp $")
 #endif /* lint */
 
 #include "magic.h"
@@ -68,7 +68,7 @@ FILE_RCSID("@(#)$File: magic.c,v 1.50 2008/02/19 00:58:59 rrt Exp $")
 
 #include "patchlevel.h"
 
-#ifndef PIPE_BUF 
+#ifndef PIPE_BUF
 /* Get the PIPE_BUF from pathconf */
 #ifdef _PC_PIPE_BUF
 #define PIPE_BUF pathconf(".", _PC_PIPE_BUF)
index 2e0fdc3921177e61fcc46b0ff244c9ab17573785..ba037921d36d7ef90d955568775b11dccdbc7308 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * 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:
@@ -11,7 +11,7 @@
  * 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
index acba041bcc4c5f986624fafa2f7fa14a48c5bb73..fd10126b1f5d70e166f4c05b3ef91e2e4a99b5bb 100644 (file)
@@ -34,7 +34,7 @@
 #include "file.h"
 
 #ifndef lint
-FILE_RCSID("@(#)$File: print.c,v 1.63 2008/02/17 19:28:54 rrt Exp $")
+FILE_RCSID("@(#)$File: print.c,v 1.66 2009/02/03 20:27:51 christos Exp $")
 #endif  /* lint */
 
 #include <string.h>
index cf7ee0be4f23a2ddb028de52aade4b0813bb589d..56d6504039dc45eb3016655ffda2c776fca7bb37 100644 (file)
@@ -26,7 +26,7 @@
 #include "file.h"
 
 #ifndef lint
-FILE_RCSID("@(#)$File: readcdf.c,v 1.11 2009/02/03 20:27:51 christos Exp $")
+FILE_RCSID("@(#)$File: readcdf.c,v 1.18 2009/05/06 20:48:22 christos Exp $")
 #endif
 
 #include <stdlib.h>
@@ -200,7 +200,7 @@ protected int
 file_trycdf(struct magic_set *ms, int fd, const unsigned char *buf,
     size_t nbytes)
 {
-       cdf_info_t info;        
+       cdf_info_t info;
        cdf_header_t h;
        cdf_sat_t sat, ssat;
        cdf_stream_t sst, scn;
@@ -244,7 +244,6 @@ file_trycdf(struct magic_set *ms, int fd, const unsigned char *buf,
                expn = "Cannot read short stream";
                goto out3;
        }
-
 #ifdef CDF_DEBUG
        cdf_dump_dir(&info, &h, &sat, &ssat, &sst, &dir);
 #endif
index 1e34b4b6e7e3aa4457935321cb1f237eb162f46e..5429b503b41c3b80900d937ab7e1fb512be51d12 100644 (file)
@@ -27,7 +27,7 @@
 #include "file.h"
 
 #ifndef lint
-FILE_RCSID("@(#)$File: readelf.c,v 1.73 2008/03/27 22:00:28 christos Exp $")
+FILE_RCSID("@(#)$File: readelf.c,v 1.81 2008/11/04 16:38:28 christos Exp $")
 #endif
 
 #ifdef BUILTIN_ELF
index 2dea6ab15a144f2ea361d8b43bb220e39c3f269c..0a06d00f8af1ab9b7c81b2aedccbf2cbb2d0f27f 100644 (file)
@@ -2,7 +2,7 @@
  * 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:
@@ -12,7 +12,7 @@
  * 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
@@ -32,7 +32,7 @@
 #include "file.h"
 
 #ifndef        lint
-FILE_RCSID("@(#)$File: softmagic.c,v 1.117 2008/03/01 22:21:49 rrt Exp $")
+FILE_RCSID("@(#)$File: softmagic.c,v 1.135 2009/03/27 22:42:49 christos Exp $")
 #endif /* lint */
 
 #include "magic.h"
@@ -149,7 +149,7 @@ match(struct magic_set *ms, struct magic *magic, uint32_t nmagic,
                default:
                        if (m->type == FILE_INDIRECT)
                                returnval = 1;
-
+                               
                        switch (magiccheck(ms, m)) {
                        case -1:
                                return -1;
@@ -163,7 +163,7 @@ match(struct magic_set *ms, struct magic *magic, uint32_t nmagic,
                        break;
                }
                if (flush) {
-                       /* 
+                       /*
                         * main entry didn't match,
                         * flush its continuations
                         */
@@ -188,7 +188,7 @@ match(struct magic_set *ms, struct magic *magic, uint32_t nmagic,
 
 
                if (print && mprint(ms, m) == -1)
-                                       return -1;
+                       return -1;
 
                ms->c.li[cont_level].off = moffset(ms, m);
 
@@ -227,7 +227,7 @@ match(struct magic_set *ms, struct magic *magic, uint32_t nmagic,
                                return -1;
                        case 0:
                                if (m->reln != '!')
-                               continue;
+                                       continue;
                                flush = 1;
                                break;
                        default:
@@ -305,11 +305,11 @@ match(struct magic_set *ms, struct magic *magic, uint32_t nmagic,
                if (printed_something) {
                        firstline = 0;
                        if (print)
-                       returnval = 1;
+                               returnval = 1;
                }
                if ((ms->flags & MAGIC_CONTINUE) == 0 && printed_something) {
                        return returnval; /* don't keep searching */
-               }                       
+               }
        }
        return returnval;  /* This is hit if -k is set or there is no match */
 }
@@ -377,7 +377,8 @@ mprint(struct magic_set *ms, struct magic *m)
                                return -1;
                        break;
                default:
-                       if (file_printf(ms, m->desc, (unsigned short) v) == -1)
+                       if (
+                           file_printf(ms, m->desc, (unsigned short) v) == -1)
                                return -1;
                        break;
                }
@@ -932,7 +933,7 @@ mcopy(struct magic_set *ms, union VALUETYPE *p, int type, int indir,
                        }
                        if (lines)
                                last = (const char *)s + nbytes;
-                       
+
                        ms->search.s = buf;
                        ms->search.s_len = last - buf;
                        ms->search.offset = offset;
@@ -945,10 +946,10 @@ mcopy(struct magic_set *ms, union VALUETYPE *p, int type, int indir,
                        const unsigned char *esrc = s + nbytes;
                        char *dst = p->s;
                        char *edst = &p->s[sizeof(p->s) - 1];
-                       
+
                        if (type == FILE_BESTRING16)
                                src++;
-                       
+
                        /* check for pointer overflow */
                        if (src < s) {
                                file_magerror(ms, "invalid offset %u in mcopy()",
@@ -1506,14 +1507,14 @@ mget(struct magic_set *ms, const unsigned char *s,
                if (nbytes < (offset + 1)) /* should alway be true */
                        return 0;
                break;
-               
+
        case FILE_SHORT:
        case FILE_BESHORT:
        case FILE_LESHORT:
                if (nbytes < (offset + 2))
                        return 0;
                break;
-               
+
        case FILE_LONG:
        case FILE_BELONG:
        case FILE_LELONG:
@@ -1532,7 +1533,7 @@ mget(struct magic_set *ms, const unsigned char *s,
                if (nbytes < (offset + 4))
                        return 0;
                break;
-               
+
        case FILE_DOUBLE:
        case FILE_BEDOUBLE:
        case FILE_LEDOUBLE:
@@ -1591,7 +1592,7 @@ file_strncmp(const char *s1, const char *s2, size_t len, uint32_t flags)
        if (0L == flags) { /* normal string: do it fast */
                while (len-- > 0)
                        if ((v = *b++ - *a++) != '\0')
-                               break; 
+                               break;
        }
        else { /* combine the others */
                while (len-- > 0) {
@@ -1605,8 +1606,8 @@ file_strncmp(const char *s1, const char *s2, size_t len, uint32_t flags)
                                if ((v = toupper(*b++) - *a++) != '\0')
                                        break;
                        }
-                       else if ((flags & STRING_COMPACT_BLANK) && 
-                           isspace(*a)) { 
+                       else if ((flags & STRING_COMPACT_BLANK) &&
+                           isspace(*a)) {
                                a++;
                                if (isspace(*b++)) {
                                        while (isspace(*b))
@@ -1761,23 +1762,23 @@ magiccheck(struct magic_set *ms, struct magic *m)
                case 'x':
                        matched = 1;
                        break;
-       
+
                case '!':
                        matched = fv != fl;
                        break;
-       
+
                case '=':
                        matched = fv == fl;
                        break;
-       
+
                case '>':
                        matched = fv > fl;
                        break;
-       
+
                case '<':
                        matched = fv < fl;
                        break;
-       
+
                default:
                        matched = 0;
                        file_magerror(ms, "cannot happen with float: invalid relation `%c'",
@@ -1795,23 +1796,23 @@ magiccheck(struct magic_set *ms, struct magic *m)
                case 'x':
                        matched = 1;
                        break;
-       
+
                case '!':
                        matched = dv != dl;
                        break;
-       
+
                case '=':
                        matched = dv == dl;
                        break;
-       
+
                case '>':
                        matched = dv > dl;
                        break;
-       
+
                case '<':
                        matched = dv < dl;
                        break;
-       
+
                default:
                        matched = 0;
                        file_magerror(ms, "cannot happen with double: invalid relation `%c'", m->reln);
@@ -1859,7 +1860,6 @@ magiccheck(struct magic_set *ms, struct magic *m)
                }
                break;
        }
-                       
        case FILE_REGEX: {
                zval *pattern;
                int options = 0;
@@ -1867,9 +1867,7 @@ magiccheck(struct magic_set *ms, struct magic *m)
                TSRMLS_FETCH();
                
                MAKE_STD_ZVAL(pattern);
-               Z_STRVAL_P(pattern) = (char *)m->value.s;
-               Z_STRLEN_P(pattern) = m->vallen;
-               Z_TYPE_P(pattern) = IS_STRING; 
+               ZVAL_STRINGL(pattern, (char *)m->value.s, m->vallen, 0);
        
                options |= PCRE_MULTILINE;
                
@@ -1878,8 +1876,14 @@ magiccheck(struct magic_set *ms, struct magic *m)
                }
                
                convert_libmagic_pattern(pattern, options);
-
+               
+#if (PHP_MAJOR_VERSION < 6)
+               if ((pce = pcre_get_compiled_regex_cache(Z_STRVAL_P(pattern), Z_STRLEN_P(pattern) TSRMLS_CC)) == NULL) {
+#else
                if ((pce = pcre_get_compiled_regex_cache(IS_STRING, Z_STRVAL_P(pattern), Z_STRLEN_P(pattern) TSRMLS_CC)) == NULL) {
+#endif
+                       zval_dtor(pattern);
+                       FREE_ZVAL(pattern);
                        return -1;
                } else {
                        /* pce now contains the compiled regex */
@@ -1894,16 +1898,19 @@ magiccheck(struct magic_set *ms, struct magic *m)
                        haystack = estrndup(ms->search.s, ms->search.s_len);
 
                        /* match v = 0, no match v = 1 */
+#if (PHP_MAJOR_VERSION < 6)
+                       php_pcre_match_impl(pce, haystack, ms->search.s_len, retval, subpats, 1, 1, PREG_OFFSET_CAPTURE, 0 TSRMLS_CC);
+#else                  
                        php_pcre_match_impl(pce, IS_STRING, haystack, ms->search.s_len, retval, subpats, 1, 1, PREG_OFFSET_CAPTURE, 0 TSRMLS_CC);
-                       
+#endif
                        /* Free haystack */
                        efree(haystack);
                        
                        if (Z_LVAL_P(retval) < 0) {
                                zval_ptr_dtor(&subpats);
                                FREE_ZVAL(retval);
-                               efree(Z_STRVAL_P(pattern));
-                               efree(pattern);
+                               zval_dtor(pattern);
+                               FREE_ZVAL(pattern);
                                return -1;
                        } else if ((Z_LVAL_P(retval) > 0) && (Z_TYPE_P(subpats) == IS_ARRAY)) {
                                
@@ -1991,8 +1998,8 @@ magiccheck(struct magic_set *ms, struct magic *m)
                                        } else {
                                                zval_ptr_dtor(&subpats);
                                                FREE_ZVAL(retval);
-                                               efree(Z_STRVAL_P(pattern));
-                                               efree(pattern);
+                                               zval_dtor(pattern);
+                                               FREE_ZVAL(pattern);
                                                return -1;
                                        }                                       
                                }
@@ -2004,8 +2011,8 @@ magiccheck(struct magic_set *ms, struct magic *m)
                        zval_ptr_dtor(&subpats);
                        FREE_ZVAL(retval);
                }
-               efree(Z_STRVAL_P(pattern));
-               efree(pattern);
+               zval_dtor(pattern);
+               FREE_ZVAL(pattern);
                break;  
        }
        case FILE_INDIRECT:
@@ -2123,7 +2130,7 @@ print_sep(struct magic_set *ms, int firstline)
        if (firstline)
                return 0;
        /*
-        * we found another match 
+        * we found another match
         * put a newline and '-' to do some simple formatting
         */
        return file_printf(ms, "\n- ");