Athena delete patch number 2
Jonathan I. Kamens
jik at Athena.MIT.EDU
Fri May 5 05:01:28 AEST 1989
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 at 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 at 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
More information about the Comp.sources.bugs
mailing list