+ while (*argv) {
+ char *arg = argv[0];
+ char *arg1 = argv[1];
+ /* --- Operators --- */
+ if (strcmp(arg, "-a") == 0
+ USE_DESKTOP(|| strcmp(arg, "-and") == 0)
+ ) {
+ /* no special handling required */
+ }
+ else if (strcmp(arg, "-o") == 0
+ USE_DESKTOP(|| strcmp(arg, "-or") == 0)
+ ) {
+ /* start new OR group */
+ cur_group++;
+ appp = xrealloc(appp, (cur_group+2) * sizeof(*appp));
+ appp[cur_group] = NULL;
+ appp[cur_group+1] = NULL;
+ cur_action = 0;
+ }
+
+ /* --- Tests and actions --- */
+ else if (strcmp(arg, "-print") == 0) {
+ need_print = 0;
+ (void) ALLOC_ACTION(print);
+ }
+#if ENABLE_FEATURE_FIND_PRINT0
+ else if (strcmp(arg, "-print0") == 0) {
+ need_print = 0;
+ (void) ALLOC_ACTION(print0);
+ }
+#endif
+ else if (strcmp(arg, "-name") == 0) {
+ action_name *ap;
+ if (!*++argv)
+ bb_error_msg_and_die(bb_msg_requires_arg, arg);
+ ap = ALLOC_ACTION(name);
+ ap->pattern = arg1;
+ }
+#if ENABLE_FEATURE_FIND_TYPE
+ else if (strcmp(arg, "-type") == 0) {
+ action_type *ap;
+ if (!*++argv)
+ bb_error_msg_and_die(bb_msg_requires_arg, arg);
+ ap = ALLOC_ACTION(type);
+ ap->type_mask = find_type(arg1);
+ }
+#endif
+#if ENABLE_FEATURE_FIND_PERM
+/* TODO:
+ * -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.
+ */
+ else if (strcmp(arg, "-perm") == 0) {
+ action_perm *ap;
+ if (!*++argv)
+ bb_error_msg_and_die(bb_msg_requires_arg, arg);
+ ap = ALLOC_ACTION(perm);
+ ap->perm_mask = xstrtol_range(arg1, 8, 0, 07777);
+ ap->perm_char = arg1[0];
+ if (ap->perm_char == '-')
+ ap->perm_mask = -ap->perm_mask;
+ }
+#endif
+#if ENABLE_FEATURE_FIND_MTIME
+ else if (strcmp(arg, "-mtime") == 0) {
+ action_mtime *ap;
+ if (!*++argv)
+ bb_error_msg_and_die(bb_msg_requires_arg, arg);
+ ap = ALLOC_ACTION(mtime);
+ ap->mtime_days = xatol(arg1);
+ ap->mtime_char = arg1[0];
+ if (ap->mtime_char == '-')
+ ap->mtime_days = -ap->mtime_days;
+ }
+#endif
+#if ENABLE_FEATURE_FIND_MMIN
+ else if (strcmp(arg, "-mmin") == 0) {
+ action_mmin *ap;
+ if (!*++argv)
+ bb_error_msg_and_die(bb_msg_requires_arg, arg);
+ ap = ALLOC_ACTION(mmin);
+ ap->mmin_mins = xatol(arg1);
+ ap->mmin_char = arg1[0];
+ if (ap->mmin_char == '-')
+ ap->mmin_mins = -ap->mmin_mins;
+ }
+#endif
+#if ENABLE_FEATURE_FIND_NEWER
+ else if (strcmp(arg, "-newer") == 0) {
+ action_newer *ap;
+ struct stat stat_newer;
+ if (!*++argv)
+ bb_error_msg_and_die(bb_msg_requires_arg, arg);
+ xstat(arg1, &stat_newer);
+ ap = ALLOC_ACTION(newer);
+ ap->newer_mtime = stat_newer.st_mtime;
+ }
+#endif
+#if ENABLE_FEATURE_FIND_INUM
+ else if (strcmp(arg, "-inum") == 0) {
+ action_inum *ap;
+ if (!*++argv)
+ bb_error_msg_and_die(bb_msg_requires_arg, arg);
+ ap = ALLOC_ACTION(inum);
+ ap->inode_num = xatoul(arg1);
+ }
+#endif
+#if ENABLE_FEATURE_FIND_EXEC
+ else if (strcmp(arg, "-exec") == 0) {
+ int i;
+ action_exec *ap;
+ need_print = 0;
+ ap = ALLOC_ACTION(exec);
+ ap->exec_argv = ++argv; /* first arg after -exec */
+ ap->exec_argc = 0;
+ while (1) {
+ if (!*argv) /* did not see ';' till end */
+ bb_error_msg_and_die(bb_msg_requires_arg, arg);
+ if (one_char(argv[0], ';'))
+ break;
+ argv++;
+ ap->exec_argc++;
+ }
+ if (ap->exec_argc == 0)
+ bb_error_msg_and_die(bb_msg_requires_arg, arg);
+ ap->subst_count = xmalloc(ap->exec_argc * sizeof(int));
+ i = ap->exec_argc;
+ while (i--)
+ ap->subst_count[i] = count_subst(ap->exec_argv[i]);
+ }
+#endif
+#if ENABLE_DESKTOP
+ else if (one_char(arg, '(')) {
+ action_paren *ap;
+ char **endarg;
+ int nested = 1;
+
+ endarg = argv;
+ while (1) {
+ if (!*++endarg)
+ bb_error_msg_and_die("unpaired '('");
+ if (one_char(*endarg, '('))
+ nested++;
+ else if (one_char(*endarg, ')') && !--nested) {
+ *endarg = NULL;
+ break;
+ }
+ }
+ ap = ALLOC_ACTION(paren);
+ ap->subexpr = parse_params(argv + 1);
+ *endarg = ")"; /* restore NULLed parameter */
+ argv = endarg;
+ }
+ else if (strcmp(arg, "-prune") == 0) {
+ (void) ALLOC_ACTION(prune);
+ }
+#endif
+ else
+ bb_show_usage();
+ argv++;
+ }
+
+ return appp;
+#undef ALLOC_ACTION