[comp.sources.bugs] Athena delete patch number 2

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