summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard M. Stallman <rms@gnu.org>1996-04-01 20:38:35 +0000
committerRichard M. Stallman <rms@gnu.org>1996-04-01 20:38:35 +0000
commit4c71158fcef488fc563af835de01e25474b5804c (patch)
treec66ee378b269ce629d5a471feb45d2a2b526f7d6
parent30c8afbe162854d7262b1f53af64690b40684f17 (diff)
downloademacs-4c71158fcef488fc563af835de01e25474b5804c.tar.gz
(absolutefn) [DOS_NT]: Support Novell drives whose drive
letter isn't an alphabetic character. (main) [DOS_NT]: Use binary mode on redirected `stdout'. (process_file) [DOS_NT]: Convert all slashes to forward style. (absolute_filename) [DOS_NT]: Emit error message for relative paths with a drive letter. (absolute_filename) [DOS_NT]: Handle absolute pathnames with DOS/NT drive letters which try to reference the parent of the root. (absolute_dirname) [DOS_NT]: Convert all slashes to forward style. info, and don't record undo info for the conversion.
-rw-r--r--lib-src/etags.c57
1 files changed, 51 insertions, 6 deletions
diff --git a/lib-src/etags.c b/lib-src/etags.c
index 5e6b7990d1c..77975c625aa 100644
--- a/lib-src/etags.c
+++ b/lib-src/etags.c
@@ -41,6 +41,7 @@ char pot_etags_version[] = "@(#) pot revision number is 11.59";
#endif
#ifdef MSDOS
+# include <string.h>
# include <fcntl.h>
# include <sys/param.h>
#endif /* MSDOS */
@@ -114,7 +115,7 @@ extern int errno;
#ifdef DOS_NT
# define absolutefn(fn) (fn[0] == '/' \
- || (isalpha (fn[0]) && fn[1] == ':' && fn[2] == '/'))
+ || (fn[1] == ':' && fn[2] == '/'))
#else
# define absolutefn(fn) (fn[0] == '/')
#endif
@@ -874,7 +875,15 @@ main (argc, argv)
if (!CTAGS)
{
if (streq (tagfile, "-"))
- tagf = stdout;
+ {
+ tagf = stdout;
+#ifdef DOS_NT
+ /* Switch redirected `stdout' to binary mode (setting `_fmode'
+ doesn't take effect until after `stdout' is already open), */
+ if (!isatty (fileno (stdout)))
+ setmode (fileno (stdout), O_BINARY);
+#endif /* DOS_NT */
+ }
else
tagf = fopen (tagfile, append_to_tagfile ? "a" : "w");
if (tagf == NULL)
@@ -1060,6 +1069,17 @@ process_file (file)
{
struct stat stat_buf;
FILE *inf;
+#ifdef DOS_NT
+ /* The rest of the program can't grok `\\'-style slashes. */
+ char *p = file;
+
+ while (*p)
+ {
+ if (*p == '\\')
+ *p = '/';
+ ++p;
+ }
+#endif
if (stat (file, &stat_buf) == 0 && !S_ISREG (stat_buf.st_mode))
{
@@ -4299,10 +4319,12 @@ etags_getcwd ()
getwd (path);
p = path;
while (*p)
- if (*p == '\\')
- *p++ = '/';
- else
- *p++ = lowcase (*p);
+ {
+ if (*p == '\\')
+ *p++ = '/';
+ else
+ *p++ = lowcase (*p);
+ }
return strdup (path);
#else /* not DOS_NT */
@@ -4382,6 +4404,12 @@ absolute_filename (file, cwd)
if (absolutefn (file))
res = concat (file, "", "");
+#ifdef DOS_NT
+ /* We don't support non-absolute filenames with a drive
+ letter, like `d:NAME' (it's too much hassle). */
+ else if (file[1] == ':')
+ fatal ("%s: relative filenames with drive letters not supported", file);
+#endif
else
res = concat (cwd, file, "");
@@ -4402,6 +4430,13 @@ absolute_filename (file, cwd)
{
strcpy (cp, slashp + 3);
}
+#ifdef DOS_NT
+ /* Under MSDOS and NT we get `d:/NAME' as absolute
+ filename, so the luser could say `d:/../NAME'.
+ We silently treat this as `d:/NAME'. */
+ else if (cp[1] == ':')
+ strcpy (cp + 3, slashp + 4);
+#endif
else /* else (cp == res) */
{
if (slashp[3] != '\0')
@@ -4434,6 +4469,16 @@ absolute_dirname (file, cwd)
{
char *slashp, *res;
char save;
+#ifdef DOS_NT
+ char *p = file;
+
+ while (*p)
+ {
+ if (*p == '\\')
+ *p = '/';
+ ++p;
+ }
+#endif
slashp = etags_strrchr (file, '/');
if (slashp == NULL)