static void call_diff_setup (const char *prog, int argc, char * const *argv) { int i; /* clean out any malloc'ed values from call_diff_argv */ run_arg_free_p (call_diff_argc, call_diff_argv); call_diff_argc = 0; /* put each word into call_diff_argv, allocating it as we go */ call_diff_add_arg (prog); for (i = 0; i < argc; i++) call_diff_add_arg (argv[i]); }
/* VARARGS */ void run_setup (const char *prog) { char *run_prog; char *buf, *d, *s; size_t length; size_t doff; char inquotes; int dolastarg; /* clean out any malloc'ed values from run_argv */ run_arg_free_p (run_argc, run_argv); run_argc = 0; run_prog = xstrdup (prog); s = run_prog; d = buf = NULL; length = 0; dolastarg = 1; inquotes = '\0'; doff = d - buf; expand_string(&buf, &length, doff + 1); d = buf + doff; while ((*d = *s++) != '\0') { switch (*d) { case '\\': if (*s) *d = *s++; d++; break; case '"': case '\'': if (inquotes == *d) inquotes = '\0'; else inquotes = *d; break; case ' ': case '\t': if (inquotes) d++; else { *d = '\0'; run_add_arg (buf); d = buf; while (isspace(*s)) s++; if (!*s) dolastarg = 0; } break; default: d++; break; } doff = d - buf; expand_string(&buf, &length, doff + 1); d = buf + doff; } if (dolastarg) run_add_arg (buf); /* put each word into run_argv, allocating it as we go */ if (buf) free (buf); free (run_prog); }