static void argv_grow (struct argv *a, const size_t add) { const size_t newargc = a->argc + add + 1; ASSERT (newargc > a->argc); argv_extend (a, adjust_power_of_2 (newargc)); }
void argv_printf_arglist (struct argv *a, const char *format, const unsigned int flags, va_list arglist) { struct gc_arena gc = gc_new (); char *term; const char *f = format; if (!(flags & APA_CAT)) argv_reset (a); argv_extend (a, 1); /* ensure trailing NULL */ while ((term = argv_term (&f)) != NULL) { if (term[0] == '%') { if (!strcmp (term, "%s")) { char *s = va_arg (arglist, char *); if (!s) s = ""; argv_append (a, string_alloc (s, NULL)); argv_system_str_append (a, s, true); } else if (!strcmp (term, "%sc")) { char *s = va_arg (arglist, char *); if (s) { int nparms; char *parms[MAX_PARMS+1]; int i; nparms = parse_line (s, parms, MAX_PARMS, "SCRIPT-ARGV", 0, D_ARGV_PARSE_CMD, &gc); if (nparms) { for (i = 0; i < nparms; ++i) argv_append (a, string_alloc (parms[i], NULL)); } else argv_append (a, string_alloc (s, NULL)); argv_system_str_append (a, s, false); } else { argv_append (a, string_alloc ("", NULL)); argv_system_str_append (a, "echo", false); } }
void argv_insert_one(ARGV *argvp, ssize_t where, const char *arg) { ssize_t pos; /* * Sanity check. */ if (where < 0 || where > argvp->argc) msg_panic("argv_insert_one bad position: %ld", (long) where); if (ARGV_SPACE_LEFT(argvp) <= 0) argv_extend(argvp); for (pos = argvp->argc; pos >= where; pos--) argvp->argv[pos + 1] = argvp->argv[pos]; argvp->argv[where] = mystrdup(arg); argvp->argc += 1; }
void argv_add(ARGV *argvp,...) { char *arg; va_list ap; /* * Make sure that always argvp->argc < argvp->len. */ #define ARGV_SPACE_LEFT(a) ((a)->len - (a)->argc - 1) va_start(ap, argvp); while ((arg = va_arg(ap, char *)) != 0) { if (ARGV_SPACE_LEFT(argvp) <= 0) argv_extend(argvp); argvp->argv[argvp->argc++] = mystrdup(arg); } va_end(ap); argvp->argv[argvp->argc] = 0; }
void argv_addn(ARGV *argvp,...) { char *arg; ssize_t len; va_list ap; /* * Make sure that always argvp->argc < argvp->len. */ va_start(ap, argvp); while ((arg = va_arg(ap, char *)) != 0) { if ((len = va_arg(ap, ssize_t)) < 0) msg_panic("argv_addn: bad string length %ld", (long) len); if (ARGV_SPACE_LEFT(argvp) <= 0) argv_extend(argvp); argvp->argv[argvp->argc++] = mystrndup(arg, len); } va_end(ap); argvp->argv[argvp->argc] = 0; }