Commit 1f83c3e5 authored by Eli Zaretskii's avatar Eli Zaretskii

Fix etags reading of compressed files

* lib-src/etags.c (O_CLOEXEC) [WINDOWSNT]: Define.
Include fcntl.h, for O_CLOEXEC.
(process_file_name): Don't use 'popen', whose streams cannot be
rewound.  Instead, uncompress the file to a temporary file,
created by 'etags_mktmp', and read from that as usual.
(etags_mktmp): New function.

* test/etags/ETAGS.good_1:
* test/etags/ETAGS.good_2:
* test/etags/ETAGS.good_3:
* test/etags/ETAGS.good_4:
* test/etags/ETAGS.good_5: Update to be consistent with latest
changes in etags.c regarding reading compressed files.
parent b8e18b63
......@@ -116,6 +116,7 @@ char pot_etags_version[] = "@(#) pot revision number is 17.38.1.4";
# undef HAVE_NTGUI
# undef DOS_NT
# define DOS_NT
# define O_CLOEXEC O_NOINHERIT
#endif /* WINDOWSNT */
#include <unistd.h>
......@@ -125,6 +126,7 @@ char pot_etags_version[] = "@(#) pot revision number is 17.38.1.4";
#include <sysstdio.h>
#include <ctype.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <binary-io.h>
......@@ -336,6 +338,7 @@ static char *absolute_filename (char *, char *);
static char *absolute_dirname (char *, char *);
static bool filename_is_absolute (char *f);
static void canonicalize_filename (char *);
static char *etags_mktmp (void);
static void linebuffer_init (linebuffer *);
static void linebuffer_setlen (linebuffer *, int);
static void *xmalloc (size_t);
......@@ -1437,7 +1440,7 @@ process_file_name (char *file, language *lang)
fdesc *fdp;
compressor *compr;
char *compressed_name, *uncompressed_name;
char *ext, *real_name;
char *ext, *real_name, *tmp_name;
int retval;
canonicalize_filename (file);
......@@ -1522,9 +1525,20 @@ process_file_name (char *file, language *lang)
}
if (real_name == compressed_name)
{
char *cmd = concat (compr->command, " ", real_name);
inf = popen (cmd, "r" FOPEN_BINARY);
free (cmd);
tmp_name = etags_mktmp ();
if (!tmp_name)
inf = NULL;
else
{
char *cmd1 = concat (compr->command, " ", real_name);
char *cmd = concat (cmd1, " > ", tmp_name);
free (cmd1);
if (system (cmd) == -1)
inf = NULL;
else
inf = fopen (tmp_name, "r" FOPEN_BINARY);
free (cmd);
}
}
else
inf = fopen (real_name, "r" FOPEN_BINARY);
......@@ -1536,10 +1550,12 @@ process_file_name (char *file, language *lang)
process_file (inf, uncompressed_name, lang);
retval = fclose (inf);
if (real_name == compressed_name)
retval = pclose (inf);
else
retval = fclose (inf);
{
remove (tmp_name);
free (tmp_name);
}
if (retval < 0)
pfatal (file);
......@@ -1707,9 +1723,6 @@ find_entries (FILE *inf)
}
}
/* We rewind here, even if inf may be a pipe. We fail if the
length of the first line is longer than the pipe block size,
which is unlikely. */
rewind (inf);
/* Else try to guess the language given the case insensitive file name. */
......@@ -1734,8 +1747,6 @@ find_entries (FILE *inf)
if (old_last_node == last_node)
/* No Fortran entries found. Try C. */
{
/* We do not tag if rewind fails.
Only the file name will be recorded in the tags file. */
rewind (inf);
curfdp->lang = get_language_from_langname (cplusplus ? "c++" : "c");
find_entries (inf);
......@@ -5015,8 +5026,6 @@ TEX_mode (FILE *inf)
TEX_opgrp = '<';
TEX_clgrp = '>';
}
/* If the input file is compressed, inf is a pipe, and rewind may fail.
No attempt is made to correct the situation. */
rewind (inf);
}
......@@ -6344,6 +6353,51 @@ etags_getcwd (void)
return path;
}
/* Return a newly allocated string containing a name of a temporary file. */
static char *
etags_mktmp (void)
{
const char *tmpdir = getenv ("TMPDIR");
const char *slash = "/";
#if MSDOS || defined (DOS_NT)
if (!tmpdir)
tmpdir = getenv ("TEMP");
if (!tmpdir)
tmpdir = getenv ("TMP");
if (!tmpdir)
tmpdir = ".";
if (tmpdir[strlen (tmpdir) - 1] == '/'
|| tmpdir[strlen (tmpdir) - 1] == '\\')
slash = "";
#else
if (!tmpdir)
tmpdir = "/tmp";
if (tmpdir[strlen (tmpdir) - 1] == '/')
slash = "";
#endif
char *templt = concat (tmpdir, slash, "etXXXXXX");
int fd = mkostemp (templt, O_CLOEXEC);
if (fd < 0)
{
free (templt);
templt = NULL;
}
else
close (fd);
#if defined (DOS_NT)
/* The file name will be used in shell redirection, so it needs to have
DOS-style backslashes, or else the Windows shell will barf. */
char *p;
for (p = templt; *p; p++)
if (*p == '/')
*p = '\\';
#endif
return templt;
}
/* Return a newly allocated string containing the file name of FILE
relative to the absolute directory DIR (which should end with a slash). */
static char *
......
......@@ -2243,12 +2243,12 @@ f-src/entry.strange_suffix,172
& intensity1(577,12231
character*(*) function foo(579,12307
f-src/entry.strange,171
LOGICAL FUNCTION PRTPKG 2,2
ENTRY SETPRT 193,3793
ENTRY MSGSEL 394,8405
& intensity1(576,12158
character*(*) function foo(578,12234
f-src/entry.strange,172
LOGICAL FUNCTION PRTPKG 3,75
ENTRY SETPRT 194,3866
ENTRY MSGSEL 395,8478
& intensity1(577,12231
character*(*) function foo(579,12307
forth-src/test-forth.fth,408
: a-forth-word 20,301
......
......@@ -2810,12 +2810,12 @@ f-src/entry.strange_suffix,172
& intensity1(577,12231
character*(*) function foo(579,12307
f-src/entry.strange,171
LOGICAL FUNCTION PRTPKG 2,2
ENTRY SETPRT 193,3793
ENTRY MSGSEL 394,8405
& intensity1(576,12158
character*(*) function foo(578,12234
f-src/entry.strange,172
LOGICAL FUNCTION PRTPKG 3,75
ENTRY SETPRT 194,3866
ENTRY MSGSEL 395,8478
& intensity1(577,12231
character*(*) function foo(579,12307
forth-src/test-forth.fth,408
: a-forth-word 20,301
......
......@@ -2560,12 +2560,12 @@ f-src/entry.strange_suffix,172
& intensity1(577,12231
character*(*) function foo(579,12307
f-src/entry.strange,171
LOGICAL FUNCTION PRTPKG 2,2
ENTRY SETPRT 193,3793
ENTRY MSGSEL 394,8405
& intensity1(576,12158
character*(*) function foo(578,12234
f-src/entry.strange,172
LOGICAL FUNCTION PRTPKG 3,75
ENTRY SETPRT 194,3866
ENTRY MSGSEL 395,8478
& intensity1(577,12231
character*(*) function foo(579,12307
forth-src/test-forth.fth,408
: a-forth-word 20,301
......
......@@ -2407,12 +2407,12 @@ f-src/entry.strange_suffix,172
& intensity1(577,12231
character*(*) function foo(579,12307
f-src/entry.strange,171
LOGICAL FUNCTION PRTPKG 2,2
ENTRY SETPRT 193,3793
ENTRY MSGSEL 394,8405
& intensity1(576,12158
character*(*) function foo(578,12234
f-src/entry.strange,172
LOGICAL FUNCTION PRTPKG 3,75
ENTRY SETPRT 194,3866
ENTRY MSGSEL 395,8478
& intensity1(577,12231
character*(*) function foo(579,12307
forth-src/test-forth.fth,408
: a-forth-word 20,301
......
......@@ -3291,12 +3291,12 @@ f-src/entry.strange_suffix,172
& intensity1(577,12231
character*(*) function foo(579,12307
f-src/entry.strange,171
LOGICAL FUNCTION PRTPKG 2,2
ENTRY SETPRT 193,3793
ENTRY MSGSEL 394,8405
& intensity1(576,12158
character*(*) function foo(578,12234
f-src/entry.strange,172
LOGICAL FUNCTION PRTPKG 3,75
ENTRY SETPRT 194,3866
ENTRY MSGSEL 395,8478
& intensity1(577,12231
character*(*) function foo(579,12307
forth-src/test-forth.fth,408
: a-forth-word 20,301
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment