--- ray/src/common/popen.c 1992/09/08 09:08:02 2.1 +++ ray/src/common/popen.c 2003/02/22 02:07:22 2.5 @@ -1,14 +1,70 @@ -/* Copyright (c) 1992 Regents of the University of California */ - #ifndef lint -static char SCCSid[] = "$SunId$ LBL"; +static const char RCSid[] = "$Id: popen.c,v 2.5 2003/02/22 02:07:22 greg Exp $"; #endif - /* * popen() and pclose() calls for systems without pipe facilities */ +/* ==================================================================== + * The Radiance Software License, Version 1.0 + * + * Copyright (c) 1990 - 2002 The Regents of the University of California, + * through Lawrence Berkeley National Laboratory. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes Radiance software + * (http://radsite.lbl.gov/) + * developed by the Lawrence Berkeley National Laboratory + * (http://www.lbl.gov/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Radiance," "Lawrence Berkeley National Laboratory" + * and "The Regents of the University of California" must + * not be used to endorse or promote products derived from this + * software without prior written permission. For written + * permission, please contact radiance@radsite.lbl.gov. + * + * 5. Products derived from this software may not be called "Radiance", + * nor may "Radiance" appear in their name, without prior written + * permission of Lawrence Berkeley National Laboratory. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL Lawrence Berkeley National Laboratory OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of Lawrence Berkeley National Laboratory. For more + * information on Lawrence Berkeley National Laboratory, please see + * . + */ + #include +#include +#include #include #include "paths.h" @@ -27,29 +83,47 @@ 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; FILE *fp; char *newcmd, *fname; register char *cp, *cp2 = NULL; int quote = '\0', paren = 0; - fname = malloc(TEMPLEN+1); - newcmd = malloc(TEMPLEN+6+strlen(cmd)); + while (isspace(*cmd)) + cmd++; + if (!*cmd) + return(NULL); + fname = (char *)malloc(TEMPLEN+1); + newcmd = (char *)malloc(TEMPLEN+6+strlen(cmd)); if (fname == NULL | newcmd == NULL) return(NULL); mktemp(strcpy(fname,TEMPLATE)); /* 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 +132,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 +151,7 @@ char *mode; break; } if (cp2 == fname && *mode == 'w') { /* add input file */ - *cp++ = ' '; *cp++ = '<'; *cp++ = ' '; + *cp++ = ' '; *cp++ = '<'; while (*cp2) *cp++ = *cp2++; *cp++ = ' '; @@ -90,7 +163,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 +175,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') {