-#if ENABLE_USE_PORTABLE_CODE
- char **argv = alloca(sizeof(char*) * (ap->exec_argc + 1));
-#else /* gcc 4.3.1 generates smaller code: */
- char *argv[ap->exec_argc + 1];
-#endif
- for (i = 0; i < ap->exec_argc; i++)
- argv[i] = subst(ap->exec_argv[i], ap->subst_count[i], fileName);
- argv[i] = NULL; /* terminate the list */
+# if ENABLE_FEATURE_FIND_EXEC_PLUS
+ int size = ap->exec_argc + ap->filelist_idx + 1;
+# else
+ int size = ap->exec_argc + 1;
+# endif
+# if ENABLE_USE_PORTABLE_CODE
+ char **argv = alloca(sizeof(char*) * size);
+# else /* gcc 4.3.1 generates smaller code: */
+ char *argv[size];
+# endif
+ char **pp = argv;
+
+ for (i = 0; i < ap->exec_argc; i++) {
+ const char *arg = ap->exec_argv[i];
+
+# if ENABLE_FEATURE_FIND_EXEC_PLUS
+ if (ap->filelist) {
+ /* Handling "-exec +"
+ * Only one exec_argv[i] has substitution in it.
+ * Expand that one exec_argv[i] into file list.
+ */
+ if (ap->subst_count[i] == 0) {
+ *pp++ = xstrdup(arg);
+ } else {
+ int j = 0;
+ while (ap->filelist[j]) {
+ /* 2nd arg here should be ap->subst_count[i], but it is always 1: */
+ *pp++ = xmalloc_substitute_string(arg, 1, "{}", ap->filelist[j]);
+ free(ap->filelist[j]);
+ j++;
+ }
+ }
+ } else
+# endif
+ {
+ /* Handling "-exec ;" */
+ *pp++ = xmalloc_substitute_string(arg, ap->subst_count[i], "{}", fileName);
+ }
+ }
+ *pp = NULL; /* terminate the list */
+
+# if ENABLE_FEATURE_FIND_EXEC_PLUS
+ if (ap->filelist) {
+ ap->filelist[0] = NULL;
+ ap->filelist_idx = 0;
+ ap->file_len = 0;
+ }
+# endif