+ /* Get the parameters. */
+ while (*p && i < argv_len) {
+ tilde_candidate = 0;
+
+ /* Parameters which start with quotes or pipes are treated
+ * specially. Bare parameters are delimited by whitespace.
+ */
+ if (*p == '"') {
+ p++;
+ len = strcspn (p, "\"");
+ if (p[len] == '\0') {
+ fprintf (stderr, _("%s: unterminated double quote\n"), program_name);
+ pcmd.status = -1;
+ return pcmd;
+ }
+ if (p[len+1] && (p[len+1] != ' ' && p[len+1] != '\t')) {
+ fprintf (stderr,
+ _("%s: command arguments not separated by whitespace\n"),
+ program_name);
+ pcmd.status = -1;
+ return pcmd;
+ }
+ p[len] = '\0';
+ pend = p[len+1] ? &p[len+2] : &p[len+1];
+ } else if (*p == '\'') {
+ p++;
+ len = strcspn (p, "'");
+ if (p[len] == '\0') {
+ fprintf (stderr, _("%s: unterminated single quote\n"), program_name);
+ pcmd.status = -1;
+ return pcmd;
+ }
+ if (p[len+1] && (p[len+1] != ' ' && p[len+1] != '\t')) {
+ fprintf (stderr,
+ _("%s: command arguments not separated by whitespace\n"),
+ program_name);
+ pcmd.status = -1;
+ return pcmd;
+ }
+ p[len] = '\0';
+ pend = p[len+1] ? &p[len+2] : &p[len+1];
+ } else if (*p == '|') {
+ *p = '\0';
+ pcmd.pipe = p+1;
+ continue;
+ } else if (*p != ' ' && *p != '\t') {
+ /* If the first character is a ~ then note that this parameter
+ * is a candidate for ~username expansion. NB this does not
+ * apply to quoted parameters.