--- ray/src/common/popen.c 1992/09/08 09:08:02 2.1 +++ ray/src/common/popen.c 1992/11/04 12:59:17 2.4 @@ -27,14 +27,16 @@ popen(cmd, mode) /* open command for reading or writi register char *cmd; char *mode; { - extern FILE *fopen(); - extern char *malloc(), *mktemp(), *strcpy(); - static int fnum = 0; + extern char *malloc(), *strcpy(); FILE *fp; char *newcmd, *fname; register char *cp, *cp2 = NULL; int quote = '\0', paren = 0; + while (isspace(*cmd)) + cmd++; + if (!*cmd) + return(NULL); fname = malloc(TEMPLEN+1); newcmd = malloc(TEMPLEN+6+strlen(cmd)); if (fname == NULL | newcmd == NULL) @@ -43,13 +45,30 @@ char *mode; /* build our command */ for (cp = newcmd; ; cmd++) { switch (*cmd) { - case '"': case '\'': + case '"': if (!quote) quote = *cmd; else if (quote == *cmd) quote = '\0'; +#ifdef MSDOS + else + break; + *cp++ = '"'; /* double quotes only */ + continue; + case '\\': + if (!quote && cmd[1] == '\n') { + *cp++ = ' '; + cmd++; + continue; + } + cmd++; break; +#else + break; + case '\\': + *cp++ = *cmd++; + break; case '(': if (!quote) paren++; @@ -58,19 +77,18 @@ char *mode; if (!quote && paren) paren--; break; - case '\\': - if (!quote && cmd[1] == '\n') { - *cp++ = ' '; - cmd++; - continue; - } - *cp++ = *cmd++; - break; - case '|': case ';': +#endif + case '|': if (!quote && !paren && cp2 == NULL) cp2 = fname; break; + case ' ': + case '\t': + if (!quote) + while (isspace(cmd[1])) + cmd++; + break; case '\n': case '\0': if (cp2 == NULL) @@ -78,7 +96,7 @@ char *mode; break; } if (cp2 == fname && *mode == 'w') { /* add input file */ - *cp++ = ' '; *cp++ = '<'; *cp++ = ' '; + *cp++ = ' '; *cp++ = '<'; while (*cp2) *cp++ = *cp2++; *cp++ = ' '; @@ -90,7 +108,7 @@ char *mode; if (*mode == 'r') { /* add output file */ while (isspace(cp[-1]) || cp[-1] == ';') cp--; - *cp++ = ' '; *cp++ = '>'; *cp++ = ' '; + *cp++ = ' '; *cp++ = '>'; while (*cp2) *cp++ = *cp2++; *cp = '\0'; @@ -102,8 +120,8 @@ char *mode; return(NULL); } if (fileno(fp) >= NFILE) { - fputs("popen: too many open files\n", stderr); - exit(1); + eputs("popen: too many open files\n"); + quit(1); } pips[fileno(fp)].f = fname; if (*mode == 'r') {