jik@Athena.MIT.EDU (Jonathan I. Kamens) (05/05/89)
The following is patch number two to the Athena delete software package posted in comp.sources.unix. It fixes some problems with wildcard matching and the handling of current-working-directory searching, and fixes a small bug in expunge which caused it to ask about the status of some files twice. Further, I have stopped assuming that '.' and '..' will always be the first two entries in every directory. Jonathan Kamens USnail: MIT Project Athena 410 Memorial Drive, No. 223F jik@Athena.MIT.EDU Cambridge, MA 02139-4318 Office: 617-253-4261 Home: 617-225-8218 #! /bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh <file", e.g.. If this archive is complete, you # will see the following message at the end: # "End of shell archive." # Contents: delete.patch2 # Wrapped by jik@pit-manager on Thu May 4 14:58:25 1989 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'delete.patch2' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'delete.patch2'\" else echo shar: Extracting \"'delete.patch2'\" \(12677 characters\) sed "s/^X//" >'delete.patch2' <<'END_OF_FILE' X*** /tmp/,RCSt1015809 Thu May 4 14:35:45 1989 X--- Makefile Thu May 4 14:06:17 1989 X*************** X*** 5,11 **** X # X # $Source: /mit/jik/src/delete/RCS/Makefile,v $ X # $Author: jik $ X! # $Header: Makefile,v 1.8 89/03/27 12:03:33 jik Exp $ X # X X DESTDIR = X--- 5,11 ---- X # X # $Source: /mit/jik/src/delete/RCS/Makefile,v $ X # $Author: jik $ X! # $Header: Makefile,v 1.9 89/05/04 14:05:48 jik Exp $ X # X X DESTDIR = X*************** X*** 15,20 **** X--- 15,25 ---- X CFLAGS = -O X SRCS = delete.c undelete.c directories.c pattern.c util.c expunge.c \ X lsdel.c col.c X+ INCS = col.h delete.h directories.h expunge.h lsdel.h mit-copyright.h\ X+ pattern.h undelete.h util.h X+ MANS = man1 man1/delete.1 man1/expunge.1 man1/lsdel.1 man1/purge.1\ X+ man1/undelete.1 X+ ARCHIVE = README Makefile MANIFEST PATCHLEVEL $(SRCS) $(INCS) $(MANS) X X all: $(TARGETS) X X*************** X*** 61,66 **** X--- 66,112 ---- X #alias s step X #alias n next X #load lsdel.c util.c directories.c pattern.c col.c X+ X+ tar: $(ARCHIVE) X+ @echo "Checking to see if everything's checked in...." X+ @for i in $(ARCHIVE) ;\ X+ do \ X+ if [ -w $$i ] ; then \ X+ echo "$$i isn't checked in. Check it in before making"; \ X+ echo "an archive."; \ X+ exit 1; \ X+ fi ; \ X+ exit 0; \ X+ done X+ tar cvf - $(ARCHIVE) | compress > delete.tar.Z X+ X+ shar: $(ARCHIVE) X+ @echo "Checking to see if everything's checked in...." X+ @for i in $(ARCHIVE) ;\ X+ do \ X+ if [ -w $$i ] ; then \ X+ echo "$$i isn't checked in. Check it in before making"; \ X+ echo "an archive."; \ X+ exit 1; \ X+ fi ; \ X+ exit 0; \ X+ done X+ makekit -oMANIFEST -h2 MANIFEST $(ARCHIVE) X+ X+ patch: $(ARCHIVE) X+ @echo "Checking to see if everything's checked in...." X+ @for i in $(ARCHIVE) ;\ X+ do \ X+ if [ -w $$i ] ; then \ X+ echo "$$i isn't checked in. Check it in before making"; \ X+ echo "an archive."; \ X+ exit 1; \ X+ fi ; \ X+ exit 0; \ X+ done X+ makepatch $(ARCHIVE) X+ mv patch delete.patch`cat PATCHLEVEL` X+ shar delete.patch`cat PATCHLEVEL` > delete.patch`cat PATCHLEVEL`.shar X X clean: X -rm -f *~ *.bak *.o delete undelete lsdel expunge purge X*** /dev/null Thu May 4 14:54:50 1989 X--- PATCHLEVEL Thu May 4 14:31:31 1989 X*************** X*** 0 **** X--- 1 ---- X+ 2 X*** /tmp/,RCSt1015851 Thu May 4 14:40:41 1989 X--- pattern.c Thu May 4 14:23:31 1989 X*************** X*** 11,17 **** X */ X X #if (!defined(lint) && !defined(SABER)) X! static char rcsid_pattern_c[] = "$Header: pattern.c,v 1.8 89/03/27 12:07:48 jik Exp $"; X #endif X X #include <stdio.h> X--- 11,17 ---- X */ X X #if (!defined(lint) && !defined(SABER)) X! static char rcsid_pattern_c[] = "$Header: pattern.c,v 1.9 89/05/04 14:21:39 jik Exp $"; X #endif X X #include <stdio.h> X*************** X*** 207,218 **** X if (! dirp) X return(found); X X- readdir(dirp); readdir(dirp); /* get rid of . and .. */ X- X strcpy(first, reg_firstpart(expression, rest)); X re_comp(first); X X for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp)) { X if (re_exec(dp->d_name) && *rest) { X strcpy(new, append(base, dp->d_name)); X next = find_deleted_matches(new, rest, &num_next); X--- 207,218 ---- X if (! dirp) X return(found); X X strcpy(first, reg_firstpart(expression, rest)); X re_comp(first); X X for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp)) { X+ if (is_dotfile(dp->d_name)) /* skip dot files */ X+ continue; X if (re_exec(dp->d_name) && *rest) { X strcpy(new, append(base, dp->d_name)); X next = find_deleted_matches(new, rest, &num_next); X*************** X*** 265,270 **** X--- 265,272 ---- X strcpy(first, reg_firstpart(expression, rest)); X X for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp)) { X+ if (is_dotfile(dp->d_name)) X+ continue; X re_comp(first); X if (re_exec(dp->d_name)) { X if (*rest) { X*************** X*** 321,329 **** X if (! dirp) X return(found); X X- readdir(dirp); readdir(dirp); /* get rid of . and .. */ X- X for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp)) { X strcpy(newname, append(base, dp->d_name)); X found = add_str(found, found_num, newname); X found_num++; X--- 323,331 ---- X if (! dirp) X return(found); X X for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp)) { X+ if (is_dotfile(dp->d_name)) X+ continue; X strcpy(newname, append(base, dp->d_name)); X found = add_str(found, found_num, newname); X found_num++; X*************** X*** 362,370 **** X if (! dirp) X return(found); X X- readdir(dirp); readdir(dirp); /* get rid of . and .. */ X- X for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp)) { X strcpy(newname, append(base, dp->d_name)); X X if (is_deleted(dp->d_name)) { X--- 364,373 ---- X if (! dirp) X return(found); X X for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp)) { X+ if (is_dotfile(dp->d_name)) X+ continue; X+ X strcpy(newname, append(base, dp->d_name)); X X if (is_deleted(dp->d_name)) { X*************** X*** 408,416 **** X if (! dirp) X return(found); X X- readdir(dirp); readdir(dirp); /* get rid of . and .. */ X- X for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp)) { X found = add_str(found, num, append(base, dp->d_name)); X num += 1; X } X--- 411,419 ---- X if (! dirp) X return(found); X X for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp)) { X+ if (is_dotfile(dp->d_name)) X+ continue; X found = add_str(found, num, append(base, dp->d_name)); X num += 1; X } X*************** X*** 440,448 **** X if (! dirp) X return(found); X X- readdir(dirp); readdir(dirp); /* get rid of . and .. */ X- X for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp)) { X if (is_deleted(dp->d_name)) { X found = add_str(found, num, append(base, dp->d_name)); X num += 1; X--- 443,451 ---- X if (! dirp) X return(found); X X for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp)) { X+ if (is_dotfile(dp->d_name)) X+ continue; X if (is_deleted(dp->d_name)) { X found = add_str(found, num, append(base, dp->d_name)); X num += 1; X*************** X*** 479,487 **** X if (! dirp) X return(found); X X- readdir(dirp); readdir(dirp); /* get rid of . and .. */ X- X for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp)) { X if (is_deleted(dp->d_name)) { X strcpy(newname, append(base, dp->d_name)); X found = add_str(found, num, newname); X--- 482,490 ---- X if (! dirp) X return(found); X X for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp)) { X+ if (is_dotfile(dp->d_name)) X+ continue; X if (is_deleted(dp->d_name)) { X strcpy(newname, append(base, dp->d_name)); X found = add_str(found, num, newname); X*** /tmp/,RCSt1015862 Thu May 4 14:41:29 1989 X--- util.c Thu May 4 14:28:40 1989 X*************** X*** 11,17 **** X */ X X #if (!defined(lint) && !defined(SABER)) X! static char rcsid_util_c[] = "$Header: util.c,v 1.7 89/03/27 12:08:34 jik Exp $"; X #endif X X #include <stdio.h> X--- 11,17 ---- X */ X X #if (!defined(lint) && !defined(SABER)) X! static char rcsid_util_c[] = "$Header: util.c,v 1.8 89/05/04 14:28:11 jik Exp $"; X #endif X X #include <stdio.h> X*************** X*** 84,106 **** X } X X X- is_dotfile(filename) X- char *filename; X- { X- return (! (strcmp(filename, ".") && strcmp(filename, ".."))); X- } X- X- X- X- int is_deleted(filename) X- char *filename; X- { X- return(! strncmp(filename, ".#", 2)); X- } X- X- X- X- X /* X * NOTE: Append uses a static array, so its return value must be X * copied immediately. X--- 84,89 ---- X*** /tmp/,RCSt1015869 Thu May 4 14:42:24 1989 X--- expunge.c Thu May 4 14:12:05 1989 X*************** X*** 11,17 **** X */ X X #if (!defined(lint) && !defined(SABER)) X! static char rcsid_expunge_c[] = "$Header: expunge.c,v 1.8 89/04/06 23:25:20 jik Exp $"; X #endif X X /* X--- 11,17 ---- X */ X X #if (!defined(lint) && !defined(SABER)) X! static char rcsid_expunge_c[] = "$Header: expunge.c,v 1.9 89/05/04 14:10:54 jik Exp $"; X #endif X X /* X*************** X*** 185,191 **** X } X else { X start_dir = ""; X! file_re = parse_pattern(files[num - 1]); X } X if (! file_re) X return(ERROR_MASK); X--- 185,194 ---- X } X else { X start_dir = ""; X! if ((*files[num - 1] == '.') && (! *(files[num - 1] + 1))) X! file_re = parse_pattern("*"); X! else X! file_re = parse_pattern(files[num - 1]); X } X if (! file_re) X return(ERROR_MASK); X*************** X*** 247,256 **** X { X int status = 0; X X! if ((leaf->specified) && ((leaf->specs.st_mode & S_IFMT) == S_IFDIR)) X status = do_directory_expunge(leaf); X! /* the "do_directory_expunge" really only asks the user if he */ X! /* wants to expunge the directory, it doesn't do any deleting. */ X if (! status) { X if (leaf->dirs) X status |= expunge_specified(leaf->dirs); X--- 250,269 ---- X { X int status = 0; X X! if ((leaf->specified) && ((leaf->specs.st_mode & S_IFMT) == S_IFDIR)) { X status = do_directory_expunge(leaf); X! /* the "do_directory_expunge" really only asks the user if he */ X! /* wants to expunge the directory, it doesn't do any deleting. */ X! } X! /* "But wait," you're saying to yourself as you ponder this code, */ X! /* "Why isn't this next if statement included inside the if */ X! /* statement above, since they both refer to directories." Well, */ X! /* I wondered about the same thing a week after I wrote the code. */ X! /* Keep in mind that a directory passed to this function may not */ X! /* be specified, but some of its children may be. Therefore, we */ X! /* have to recursively descend even unspecified directories to */ X! /* find specified files, hence this is outside of the if */ X! /* statement above. */ X if (! status) { X if (leaf->dirs) X status |= expunge_specified(leaf->dirs); X*************** X*** 257,263 **** X if (leaf->files) X status |= expunge_specified(leaf->files); X } X! if (leaf->specified) X status |= really_do_expunge(leaf); X if (leaf->next) X status |= expunge_specified(leaf->next); X--- 270,276 ---- X if (leaf->files) X status |= expunge_specified(leaf->files); X } X! if ((leaf->specified) && (! status)) X status |= really_do_expunge(leaf); X if (leaf->next) X status |= expunge_specified(leaf->next); X*** /tmp/,RCSt1015882 Thu May 4 14:43:25 1989 X--- lsdel.c Thu May 4 14:18:38 1989 X*************** X*** 11,17 **** X */ X X #if (!defined(lint) && !defined(SABER)) X! static char rcsid_lsdel_c[] = "$Header: lsdel.c,v 1.4 89/03/27 12:07:13 jik Exp $"; X #endif X X #include <stdio.h> X--- 11,17 ---- X */ X X #if (!defined(lint) && !defined(SABER)) X! static char rcsid_lsdel_c[] = "$Header: lsdel.c,v 1.5 89/05/04 14:18:18 jik Exp $"; X #endif X X #include <stdio.h> X*************** X*** 115,121 **** X } X else { X start_dir = ""; X! file_re = parse_pattern(args[num - 1]); X } X if (! file_re) X return(ERROR_MASK); X--- 115,124 ---- X } X else { X start_dir = ""; X! if ((*args[num - 1] == '.') && (! *(args[num - 1] + 1))) X! file_re = parse_pattern("*"); X! else X! file_re = parse_pattern(args[num - 1]); X } X if (! file_re) X return(ERROR_MASK); X*** /tmp/,RCSt1016005 Thu May 4 14:53:53 1989 X--- util.h Thu May 4 14:29:45 1989 X*************** X*** 1,7 **** X /* X * $Source: /mit/jik/src/delete/RCS/util.h,v $ X * $Author: jik $ X! * $Header: util.h,v 1.4 89/03/27 12:08:41 jik Exp $ X * X * This file is part of a package including delete, undelete, X * lsdel, expunge and purge. The software suite is meant as a X--- 1,7 ---- X /* X * $Source: /mit/jik/src/delete/RCS/util.h,v $ X * $Author: jik $ X! * $Header: util.h,v 1.5 89/05/04 14:29:19 jik Exp $ X * X * This file is part of a package including delete, undelete, X * lsdel, expunge and purge. The software suite is meant as a X*************** X*** 19,21 **** X--- 19,28 ---- X char *reg_firstpart(); X char *strindex(); X char *strrindex(); X+ X+ #define is_dotfile(A) ((*A == '.') && \ X+ ((*(A + 1) == '\0') || \ X+ ((*(A + 1) == '.') && \ X+ (*(A + 2) == '\0')))) X+ X+ #define is_deleted(A) ((*A == '.') && (*(A + 1) == '#')) END_OF_FILE if test 12677 -ne `wc -c <'delete.patch2'`; then echo shar: \"'delete.patch2'\" unpacked with wrong size! fi # end of 'delete.patch2' fi echo shar: End of shell archive. exit 0