TurboC2.0 Patches to fix backup name generation
Prereq: 5
*** tcpatlev.h Tue Aug 07 08:31:10 1990
--- tcpatlev.new Tue Aug 07 12:09:15 1990
***************
*** 1,1 ****
! #define TCPATCHLEVEL 5
--- 1,1 ----
! #define TCPATCHLEVEL 6
*** readme Tue Aug 07 08:31:10 1990
--- readme.new Tue Aug 07 12:13:20 1990
***************
*** 198,200 ****
--- 198,221 ----
was snarfed from an old edition of lharc and is more limited than the fancy
one I posted but it works just fine with patch (it does stdin redirection
from the invocation of the spawned COMMAND.COM - quite foolproof).
+
+
+ *** OFFICIAL PATCHLEVEL 12, TurboC2.0 PATCHLEVEL 6
+
+ From: ward@sneezy.cs.wisc.edu (Mike Ward)
+ Date: Tue, 07 Aug 90 12:13:00 EST
+
+ The problem is that to generate a backup name the program simply appends
+ the suffix (or prepends the prefix). This doesn't go over too well under
+ MSDOS.
+
+ I modified this procedure to know about file name/extension limits for the
+ append case (prepend still messed up). The code now appends only the first
+ char of the suffix (hopefully this will be the whole suffix), and if the
+ file name is still no good, it starts appending version digits/letters.
+ For example:
+
+ filexyz.sou -> filexyzs.ou~ -> ilexyzso.u~0 -> ilexyzso.u~1 ->
+ ilexyzso.u~2 -> ... -> ilexyzso.u~9 -> ilexyzso.u~A ->
+ ilexyzso.u~B -> ... -> ilexyzso.u~Z -> lexyzsou.~0A -> ...
+
*** util.c Tue Aug 07 10:46:34 1990
--- util.new Tue Aug 07 13:15:38 1990
***************
*** 15,20 ****
--- 15,117 ----
#include "INTERN.h"
#include "util.h"
+ #ifdef TURBOC20
+ #include
+ /* fnappend : Append first char of bext to a MSDOS file name.
+ * bext should not start with a letter or digit.
+ */
+
+ void
+ fnappend(fspec,bext)
+ char *fspec, *bext;
+ {
+ char *fnmex;
+ char fname[MAXFILE];
+ char fext[MAXEXT];
+ int i,j;
+ int fnlen;
+ int felen;
+
+ /* fnmex should point to first char of file name/extension
+ * (not path or drive)
+ */
+ fnmex = fspec + strlen(fspec);
+ while ((fnmex!=fspec) && (strchr("/\\:",*(fnmex-1))==NULL)) {
+ fnmex--;
+ }
+
+ /* get file name and length */
+ for (fnlen=i=0; fnmex[i] && fnmex[i]!= '.' && i 2345678A.BCX
+ * full file ext: 1234567.ABC -> 1234567A.BCX
+ * other: 12345678.AB -> 12345678.ABX
+ */
+ if ((fnlen == MAXFILE-1) && (felen == MAXEXT-2)) {
+ sprintf(fnmex,"%s%c.%s%c",fname+1,fext[0],fext+1,*bext);
+ } else if (felen == MAXEXT-2) {
+ sprintf(fnmex,"%s%c.%s%c",fname,fext[0],fext+1,*bext);
+ } else {
+ sprintf(fnmex,"%s.%s%c",fname,fext,*bext);
+ }
+ }
+
+
+ /* fninc : increment/add last char of/to fspec.
+ * used with fappend (call fnappend once, then fninc many times
+ */
+
+ void
+ fninc(fspec)
+ char *fspec;
+ {
+ char *cp;
+ int lastp,lastc;
+
+ lastc = fspec[lastp = strlen(fspec)-1];
+ if (strchr("012345678ABCDEFGHIJKLMNOPQRSTUVWXY",lastc) != NULL) {
+ fspec[lastp]++;
+ } else if (lastc == '9') {
+ fspec[lastp] = 'A';
+ } else if (lastc == 'Z') {
+ for (cp=&fspec[lastp]; *cp=='Z' || *cp=='.'; cp--) {
+ if (*cp == 'Z') {
+ *cp = '0';
+ }
+ }
+ if (strchr("012345678ABCDEFGHIJKLMNOPQRSTUVWXY",*cp) != NULL) {
+ (*cp)++;
+ } else if (*cp == '9') {
+ *cp = 'A';
+ } else {
+ if (*(cp+1) == '.') cp++;
+ *(cp+1) = '1';
+ fnappend(fspec,"0");
+ }
+ } else {
+ fnappend(fspec,"0");
+ }
+ }
+ #endif
+
+
/* Rename a file, copying it if necessary. */
int
***************
*** 44,65 ****
}
if (origprae) {
! Strcpy (bakname, origprae);
! Strcat(bakname, to);
} else {
! Strcpy(bakname, to);
! Strcat(bakname, origext?origext:ORIGEXT);
}
if (stat(to, &filestat) >= 0) { /* output file exists */
- #ifdef TURBOC20
short to_device = filestat.st_dev;
short to_mode = filestat.st_mode;
long to_size = filestat.st_size;
long to_time = filestat.st_mtime;
#else
dev_t to_device = filestat.st_dev;
ino_t to_inode = filestat.st_ino;
- #endif
char *simplename = bakname;
for (s=bakname; *s; s++) {
--- 141,175 ----
}
if (origprae) {
! Strcpy (bakname, origprae);
! Strcat(bakname, to);
} else {
! Strcpy(bakname, to);
! #ifdef TURBOC20
! fnappend(bakname, origext?origext:ORIGEXT);
}
+
if (stat(to, &filestat) >= 0) { /* output file exists */
short to_device = filestat.st_dev;
short to_mode = filestat.st_mode;
long to_size = filestat.st_size;
long to_time = filestat.st_mtime;
+
+ /* find a backup name that is not the same file */
+ while (stat(bakname, &filestat) >= 0 &&
+ to_device == filestat.st_dev &&
+ to_mode == filestat.st_mode &&
+ to_size == filestat.st_size &&
+ to_time == filestat.st_mtime
+ ) {
+ fninc(bakname);
+ }
#else
+ Strcat(bakname, origext?origext:ORIGEXT);
+ }
+ if (stat(to, &filestat) >= 0) { /* output file exists */
dev_t to_device = filestat.st_dev;
ino_t to_inode = filestat.st_ino;
char *simplename = bakname;
for (s=bakname; *s; s++) {
***************
*** 69,81 ****
/* find a backup name that is not the same file */
while (stat(bakname, &filestat) >= 0 &&
to_device == filestat.st_dev &&
- #ifdef TURBOC20
- to_mode == filestat.st_mode &&
- to_size == filestat.st_size &&
- to_time == filestat.st_mtime
- #else
to_inode == filestat.st_ino
- #endif
) {
for (s=simplename; *s && !islower(*s); s++) ;
if (*s)
--- 179,185 ----
***************
*** 83,88 ****
--- 187,193 ----
else
Strcpy(simplename, simplename+1);
}
+ #endif
while (unlink(bakname) >= 0) ; /* while() is for benefit of Eunice */
#ifdef DEBUGGING
if (debug & 4)