+
+ /* --- If necessary, translate `%'-escapes --- */
+
+ if (opt_flags & optFlag_percent) {
+ char **pp, **qq;
+
+ for (pp = argv + 1, qq = av; *pp; pp++, qq++) {
+ if (strchr(*pp, '%') == 0)
+ *qq = *pp;
+ else {
+ char *p;
+ char *q = *pp;
+ for (p = *pp; *p; p++) {
+ if (*p == '%') {
+ DPUTM(&d, q, p - q);
+ p++;
+ switch (*p) {
+ case 0:
+ DPUTC(&d, '%');
+ goto done_arg;
+ case '%':
+ DPUTC(&d, '%');
+ break;
+ case 'a':
+ dstr_puts(&d, e->arch);
+ break;
+ case 'h':
+ dstr_puts(&d, e->flags & archFlag_home ?
+ u.nodename : e->host);
+ break;
+ case 'P':
+ dstr_puts(&d, PREFIX);
+ break;
+ case 'p':
+ dstr_puts(&d, sw.package);
+ break;
+ case 'v':
+ dstr_puts(&d, sw.version);
+ break;
+ case 'u':
+ dstr_puts(&d, sw.maintainer);
+ break;
+ default:
+ DPUTC(&d, '%');
+ DPUTC(&d, *p);
+ break;
+ }
+ q = p + 1;
+ }
+ }
+ DPUTM(&d, q, p - q);
+ done_arg:
+ DPUTZ(&d);
+ *qq = xstrdup(d.buf);
+ DRESET(&d);
+ }
+ }
+ *qq++ = 0;
+ }
+
+ /* --- Start a new process off --- */
+