From 61bb57af53ebe916d2db6e3585d4fc7ac1d99b92 Mon Sep 17 00:00:00 2001 From: "Arnold D. Robbins" Date: Fri, 16 Jul 2010 12:27:41 +0300 Subject: Move to gawk-2.15.3. --- pc/popen.c | 202 ++++++++++++++++++++++++++++++++++--------------------------- 1 file changed, 112 insertions(+), 90 deletions(-) (limited to 'pc/popen.c') diff --git a/pc/popen.c b/pc/popen.c index 48952c22..cdb54a0a 100644 --- a/pc/popen.c +++ b/pc/popen.c @@ -1,90 +1,112 @@ -#include -#include "popen.h" -#include -#include -#include - -static char template[] = "piXXXXXX"; -typedef enum { unopened = 0, reading, writing } pipemode; -static -struct { - char *command; - char *name; - pipemode pmode; -} pipes[_NFILE]; - -FILE * -popen( char *command, char *mode ) { - FILE *current; - char *name; - int cur; - pipemode curmode; - /* - ** decide on mode. - */ - if(strcmp(mode,"r") == 0) - curmode = reading; - else if(strcmp(mode,"w") == 0) - curmode = writing; - else - return NULL; - /* - ** get a name to use. - */ - if((name = tempnam(".","pip"))==NULL) - return NULL; - /* - ** If we're reading, just call system to get a file filled with - ** output. - */ - if(curmode == reading) { - char cmd[256]; - sprintf(cmd,"%s > %s",command,name); - system(cmd); - if((current = fopen(name,"r")) == NULL) - return NULL; - } else { - if((current = fopen(name,"w")) == NULL) - return NULL; - } - cur = fileno(current); - pipes[cur].name = name; - pipes[cur].pmode = curmode; - pipes[cur].command = strdup(command); - return current; -} - -int -pclose( FILE * current) { - int cur = fileno(current),rval; - /* - ** check for an open file. - */ - if(pipes[cur].pmode == unopened) - return -1; - if(pipes[cur].pmode == reading) { - /* - ** input pipes are just files we're done with. - */ - rval = fclose(current); - unlink(pipes[cur].name); - } else { - /* - ** output pipes are temporary files we have - ** to cram down the throats of programs. - */ - char command[256]; - fclose(current); - sprintf(command,"%s < %s",pipes[cur].command,pipes[cur].name); - rval = system(command); - unlink(pipes[cur].name); - } - /* - ** clean up current pipe. - */ - pipes[cur].pmode = unopened; - free(pipes[cur].name); - free(pipes[cur].command); - return rval; -} - +#include "popen.h" +#include +#include +#include +#include + +#ifdef OS2 +#ifdef _MSC_VER +#define popen(c,m) _popen(c,m) +#define pclose(f) _pclose(f) +#endif +#endif + +#ifndef _NFILE +#define _NFILE 40 +#endif + +static char template[] = "piXXXXXX"; +typedef enum { unopened = 0, reading, writing } pipemode; +static +struct { + char *command; + char *name; + pipemode pmode; +} pipes[_NFILE]; + +FILE * +os_popen( char *command, char *mode ) { + FILE *current; + char *name; + int cur; + pipemode curmode; + +#if defined(OS2) && (_MSC_VER != 510) + if (_osmode == OS2_MODE) + return(popen(command, mode)); +#endif + + /* + ** decide on mode. + */ + if(strcmp(mode,"r") == 0) + curmode = reading; + else if(strcmp(mode,"w") == 0) + curmode = writing; + else + return NULL; + /* + ** get a name to use. + */ + if((name = tempnam(".","pip"))==NULL) + return NULL; + /* + ** If we're reading, just call system to get a file filled with + ** output. + */ + if(curmode == reading) { + char cmd[256]; + sprintf(cmd,"%s > %s",command,name); + system(cmd); + if((current = fopen(name,"r")) == NULL) + return NULL; + } else { + if((current = fopen(name,"w")) == NULL) + return NULL; + } + cur = fileno(current); + pipes[cur].name = name; + pipes[cur].pmode = curmode; + pipes[cur].command = strdup(command); + return current; +} + +int +os_pclose( FILE * current) { + int cur = fileno(current),rval; + +#if defined(OS2) && (_MSC_VER != 510) + if (_osmode == OS2_MODE) + return(pclose(current)); +#endif + + /* + ** check for an open file. + */ + if(pipes[cur].pmode == unopened) + return -1; + if(pipes[cur].pmode == reading) { + /* + ** input pipes are just files we're done with. + */ + rval = fclose(current); + unlink(pipes[cur].name); + } else { + /* + ** output pipes are temporary files we have + ** to cram down the throats of programs. + */ + char command[256]; + fclose(current); + sprintf(command,"%s < %s",pipes[cur].command,pipes[cur].name); + rval = system(command); + unlink(pipes[cur].name); + } + /* + ** clean up current pipe. + */ + pipes[cur].pmode = unopened; + free(pipes[cur].name); + free(pipes[cur].command); + return rval; +} -- cgit v1.2.3