find: fix handling of -prune
recursive_actions: uppercase flag constants
diff --git a/findutils/find.c b/findutils/find.c
index 4312025..3eea53d 100644
--- a/findutils/find.c
+++ b/findutils/find.c
@@ -70,7 +70,7 @@
 USE_FEATURE_FIND_MMIN(  ACTS(mmin,  char mmin_char; unsigned mmin_mins;))
 USE_FEATURE_FIND_NEWER( ACTS(newer, time_t newer_mtime;))
 USE_FEATURE_FIND_INUM(  ACTS(inum,  ino_t inode_num;))
-USE_FEATURE_FIND_EXEC(  ACTS(exec,  char **exec_argv; unsigned int *subst_count; int exec_argc;))
+USE_FEATURE_FIND_EXEC(  ACTS(exec,  char **exec_argv; unsigned *subst_count; int exec_argc;))
 USE_FEATURE_FIND_USER(  ACTS(user,  uid_t uid;))
 USE_FEATURE_FIND_GROUP( ACTS(group, gid_t gid;))
 USE_FEATURE_FIND_PAREN( ACTS(paren, action ***subexpr;))
@@ -79,12 +79,12 @@
 
 static action ***actions;
 static bool need_print = 1;
-static int recurse_flags = action_recurse;
+static int recurse_flags = ACTION_RECURSE;
 
 #if ENABLE_FEATURE_FIND_EXEC
-static unsigned int count_subst(const char *str)
+static unsigned count_subst(const char *str)
 {
-	unsigned int count = 0;
+	unsigned count = 0;
 	while ((str = strstr(str, "{}"))) {
 		count++;
 		str++;
@@ -93,7 +93,7 @@
 }
 
 
-static char* subst(const char *src, unsigned int count, const char* filename)
+static char* subst(const char *src, unsigned count, const char* filename)
 {
 	char *buf, *dst, *end;
 	size_t flen = strlen(filename);
@@ -111,6 +111,10 @@
 }
 #endif
 
+/* Return values of ACTFs ('action functions') are a bit mask:
+ * bit 1=1: prune (use SKIP constant for setting it)
+ * bit 0=1: matched successfully (TRUE)
+ */
 
 static int exec_actions(action ***appp, const char *fileName, struct stat *statbuf)
 {
@@ -121,24 +125,24 @@
 
 	cur_group = -1;
 	while ((app = appp[++cur_group])) {
+		/* We invert TRUE bit (bit 0). Now 1 there means 'failure'.
+		 * and bitwise OR in "rc |= TRUE ^ ap->f()" will:
+		 * (1) make SKIP bit stick; and (2) detect 'failure' */
+		rc = 0; /* 'success' so far */
 		cur_action = -1;
 		while (1) {
 			ap = app[++cur_action];
-			if (!ap) {
-				/* all actions in group were successful */
-				return rc;
-			}
-			rc = ap->f(fileName, statbuf, ap);
+			if (!ap) /* all actions in group were successful */
+				return rc ^ TRUE;
+			rc |= TRUE ^ ap->f(fileName, statbuf, ap);
 #if ENABLE_FEATURE_FIND_NOT
-			if (ap->invert) rc = !rc;
+			if (ap->invert) rc ^= TRUE;
 #endif
-			if (!rc) {
-				/* current group failed, try next */
+			if (rc & TRUE) /* current group failed, try next */
 				break;
-			}
 		}
 	}
-	return rc;
+	return rc ^ TRUE; /* straighten things out */
 }
 
 
@@ -147,8 +151,16 @@
 	const char *tmp = strrchr(fileName, '/');
 	if (tmp == NULL)
 		tmp = fileName;
-	else
+	else {
 		tmp++;
+		if (!*tmp) { /* "foo/bar/". Oh no... go back to 'b' */
+			tmp--;
+			while (tmp != fileName && *--tmp != '/')
+				continue;
+			if (*tmp == '/')
+				tmp++;
+		}
+	}
 	return fnmatch(ap->pattern, tmp, FNM_PERIOD) == 0;
 }
 #if ENABLE_FEATURE_FIND_TYPE
@@ -269,7 +281,7 @@
  */
 ACTF(prune)
 {
-	return SKIP;
+	return SKIP + TRUE;
 }
 #endif
 
@@ -284,7 +296,7 @@
 static int fileAction(const char *fileName, struct stat *statbuf, void* junk, int depth)
 {
 	int i;
-#ifdef CONFIG_FEATURE_FIND_XDEV
+#if ENABLE_FEATURE_FIND_XDEV
 	if (S_ISDIR(statbuf->st_mode) && xdev_count) {
 		for (i = 0; i < xdev_count; i++) {
 			if (xdev_dev[i] != statbuf->st_dev)
@@ -294,11 +306,11 @@
 #endif
 	i = exec_actions(actions, fileName, statbuf);
 	/* Had no explicit -print[0] or -exec? then print */
-	if (i && need_print)
+	if ((i & TRUE) && need_print)
 		puts(fileName);
 	/* Cannot return 0: our caller, recursive_action(),
 	 * will perror() and skip dirs (if called on dir) */
-	return i == 0 ? TRUE : i;
+	return (i & SKIP) ? SKIP : TRUE;
 }
 
 
@@ -386,8 +398,8 @@
 	USE_FEATURE_FIND_GROUP( "-group" ,)
 	USE_FEATURE_FIND_DEPTH( "-depth" ,)
 	USE_FEATURE_FIND_PAREN( "("      ,)
-	USE_FEATURE_FIND_SIZE(  "-size" ,)
-	USE_FEATURE_FIND_PRUNE( "-prune"  ,)
+	USE_FEATURE_FIND_SIZE(  "-size"  ,)
+	USE_FEATURE_FIND_PRUNE( "-prune" ,)
 #if ENABLE_DESKTOP
 	                        "-and"   ,
 	                        "-or"    ,
@@ -486,8 +498,7 @@
 		}
 #endif
 #if ENABLE_FEATURE_FIND_PERM
-/* TODO:
- * -perm mode   File's permission bits are exactly mode (octal or symbolic).
+/* -perm mode   File's permission bits are exactly mode (octal or symbolic).
  *              Symbolic modes use mode 0 as a point of departure.
  * -perm -mode  All of the permission bits mode are set for the file.
  * -perm +mode  Any of the permission bits mode are set for the file.
@@ -554,7 +565,7 @@
 			ap->exec_argv = ++argv; /* first arg after -exec */
 			ap->exec_argc = 0;
 			while (1) {
-				if (!*argv) /* did not see ';' util end */
+				if (!*argv) /* did not see ';' until end */
 					bb_error_msg_and_die(bb_msg_requires_arg, arg);
 				if (LONE_CHAR(argv[0], ';'))
 					break;
@@ -593,7 +604,7 @@
 #endif
 #if ENABLE_FEATURE_FIND_DEPTH
 		else if (parm == PARM_depth) {
-			recurse_flags |= action_depthFirst;
+			recurse_flags |= ACTION_DEPTHFIRST;
 		}
 #endif
 #if ENABLE_FEATURE_FIND_PAREN
@@ -652,7 +663,6 @@
 		NULL
 	};
 
-	bool dereference = FALSE;
 	char *arg;
 	char **argp;
 	int i, firstopt, status = EXIT_SUCCESS;
@@ -684,7 +694,7 @@
 	while ((arg = argp[0])) {
 		i = index_in_str_array(options, arg);
 		if (i == 0) { /* -follow */
-			dereference = TRUE;
+			recurse_flags |= ACTION_FOLLOWLINKS;
 			argp[0] = (char*)"-a";
 		}
 #if ENABLE_FEATURE_FIND_XDEV
@@ -711,7 +721,7 @@
 
 	for (i = 1; i < firstopt; i++) {
 		if (!recursive_action(argv[i],
-				recurse_flags|(1<<dereference), /* flags */
+				recurse_flags,  /* flags */
 				fileAction,     /* file action */
 				fileAction,     /* dir action */
 				NULL,           /* user data */