diff options
author | Arnold D. Robbins <arnold@skeeve.com> | 2010-07-16 12:27:41 +0300 |
---|---|---|
committer | Arnold D. Robbins <arnold@skeeve.com> | 2010-07-16 12:27:41 +0300 |
commit | 61bb57af53ebe916d2db6e3585d4fc7ac1d99b92 (patch) | |
tree | 2bfc4e5b127618d286f57a87d416702131b1b01d /pc/popen.c | |
parent | 0a9ae0c89481db540e1b817a63cc6c793a62c90d (diff) | |
download | egawk-61bb57af53ebe916d2db6e3585d4fc7ac1d99b92.tar.gz egawk-61bb57af53ebe916d2db6e3585d4fc7ac1d99b92.tar.bz2 egawk-61bb57af53ebe916d2db6e3585d4fc7ac1d99b92.zip |
Move to gawk-2.15.3.
Diffstat (limited to 'pc/popen.c')
-rw-r--r-- | pc/popen.c | 202 |
1 files changed, 112 insertions, 90 deletions
@@ -1,90 +1,112 @@ -#include <stdio.h> -#include "popen.h" -#include <io.h> -#include <string.h> -#include <process.h> - -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 <stdlib.h>
+#include <io.h>
+#include <string.h>
+#include <process.h>
+
+#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;
+}
|