home *** CD-ROM | disk | FTP | other *** search
- #include <stdio.h>
- #include <string.h>
- #include "ooglutil.h"
- #include <sys/signal.h>
-
- #define FBUFSIZ 1024
- #define INITSIZ 10
-
- /*-----------------------------------------------------------------------
- * Function: *ooglglob
- * Description: C-shell globbing
- * Args: *s: the string to glob
- * Returns: pointer to array of pointers to expanded strings; ends
- * with NULL
- * Author: mbp
- * Date: Tue Aug 25 12:42:21 1992
- * Notes: Invokes a subshell (/bin/csh) to do the work.
- * Caller should free the returned value by
- * first calling ooglblkfree() then free():
- *
- * char **g;
- * g = ooglglob(string);
- * ...
- * ooglblkfree(g);
- * free(g);
- */
- char **ooglglob(char *s)
- {
- FILE *fp;
- char cmd[FBUFSIZ];
- vvec vp;
- char *c;
- int status;
- /* Avoid NeXT pclose() bug: don't catch subprocess' SIGCHLD */
- void (*oldsigchld)() = signal(SIGCHLD, SIG_DFL);
-
- sprintf(cmd, "/bin/csh -f -c \"echo %s\" 2>&-", s);
- fp = popen(cmd, "r");
-
- VVINIT(vp, char *, INITSIZ);
- while (!feof(fp))
- if ((c=ftoken(fp, 2)) != NULL) *VVAPPEND(vp,char*) = strdup(c);
- *VVAPPEND(vp,char*) = NULL;
- vvtrim(&vp);
-
- status = pclose(fp);
- signal(SIGCHLD, oldsigchld);
- return VVEC(vp,char*);
- }
-
- ooglblkfree(av0)
- char **av0;
- {
- register char **av = av0;
- while (*av)
- free(*av++);
- }
-