Mail Archives: djgpp/1999/10/26/10:13:48
On Tue, 12 Oct 1999, Juan Manuel Guerrero, Student, FB05 wrote:
> When decompressing a tgz-file with an entry of the form:
> libg++-1.2.3/libg++/readme.g++
> the program performs the substitution:
> ++ --> plus.
> It should be clear that this substitution must be applied to all
> occuriences of "++" and not only to the first as the program does.
Thanks for the report and the patches.
I corrected the problem in DJTAR a bit differently; see the patch below.
The corrected version will be in DJGPP v2.03.
--- src/utils/djtar/djtar.c~1 Tue Aug 24 16:03:00 1999
+++ src/utils/djtar/djtar.c Fri Oct 15 10:58:38 1999
@@ -1,3 +1,4 @@
+/* Copyright (C) 1999 DJ Delorie, see COPYING.DJ for details */
/* Copyright (C) 1998 DJ Delorie, see COPYING.DJ for details */
/* Copyright (C) 1997 DJ Delorie, see COPYING.DJ for details */
/* Copyright (C) 1996 DJ Delorie, see COPYING.DJ for details */
@@ -6,6 +7,7 @@
#include <unistd.h>
#include <limits.h>
#include <errno.h>
+#include <ctype.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <io.h>
@@ -297,34 +299,40 @@ get_new_name(char *name_to_change, int *
changed_name = get_entry(name_to_change);
if (*should_be_written && !to_stdout && NO_LFN(changed_name))
{
- info = strstr(changed_name, ".info-");
- if (info)
+ static char info_[] = ".info-";
+ info = strstr(changed_name, info_);
+ if (info && isdigit(info[sizeof(info_)-1]))
{
strcpy(new, changed_name);
- info = strstr(new, ".info-");
- strcpy(info+2, info+6);
+ info = strstr(new, info_);
+ strcpy(info+2, info+sizeof(info_)-1);
fprintf(log_out, "[ changing %s to %s ]\n", changed_name, new);
}
else
{
- char *tgz = strstr(changed_name, ".tar.gz");
- if (tgz)
+ static char _tar_gz[] = ".tar.gz", _tgz[] = ".tgz";
+ char *tgz = strstr(changed_name, _tar_gz);
+ if (tgz && tgz[sizeof(_tar_gz)-1] == '\0')
{
strcpy(new, changed_name);
- tgz = strstr(new, ".tar.gz");
- strcpy(tgz, ".tgz");
- strcat(tgz, tgz+7);
+ tgz += new - changed_name;
+ strcpy(tgz, _tgz);
fprintf(log_out, "[ changing %s to %s ]\n", changed_name, new);
}
else
{
- char *plus = strstr(changed_name, "++"), *plus2;
+ static char xx[] = "++";
+ register char *plus = strstr(changed_name, xx);
if (plus)
{
strcpy(new, changed_name);
- plus2 = strstr(new, "++");
- strcpy(plus2, "plus");
- strcpy(plus2+4, plus+2);
+ plus += new - changed_name;
+ while (plus)
+ {
+ *plus++ = 'x';
+ *plus++ = 'x';
+ plus = strstr(plus, xx);
+ }
fprintf(log_out, "[ changing %s to %s ]\n", changed_name, new);
}
else
--- src/utils/utils.t~0 Tue Jun 1 09:23:16 1999
+++ src/utils/utils.tex Fri Oct 15 11:10:34 1999
@@ -153,14 +153,15 @@
@code{djtar} performs a number of file name conversions in an attempt
to make the files fit into MS-DOS's restricted file names. Any file
-ending in @file{.info-N} becomes @file{.iN}. Any file ending in
-@file{.tar.gz} becomes @file{.tgz}. Any file with @file{++} becomes
-@file{plus}. Any leading dots are changed to underscores (but current
-and parent directories, @file{./} and @file{../} are left alone). Any
-remaining multiple dots are changed to dashes, unless the part before the
-dot is shorter than 3 characters and there are more than 1 dot in the
-filename, in which case the dot also becomes an underscore. As a result,
-e.g., @file{.foo.a.b} becomes @file{_foo.a-b}, and @file{sh.lex.c} becomes
+ending in @file{.info- AT var{n}}, where @var{n} is a number, becomes
+@file{.i AT var{n}}. Any file ending in @file{.tar.gz} becomes
+@file{.tgz}. Any @file{++} string within a file name becomes @file{xx}.
+Any leading dots are changed to underscores (but current and parent
+directories, @file{./} and @file{../} are left alone). Any remaining
+multiple dots are changed to dashes, unless the part before the dot is
+shorter than 3 characters and there are more than 1 dot in the filename,
+in which case the dot also becomes an underscore. As a result, e.g.,
+@file{.foo.a.b} becomes @file{_foo.a-b}, and @file{sh.lex.c} becomes
@file{sh_lex.c}.
While @code{djtar} is running, if it cannot successfully perform an
- Raw text -