home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Professional / OS2PRO194.ISO / os2 / editor / less / pipe.c < prev    next >
C/C++ Source or Header  |  1994-01-31  |  3KB  |  124 lines

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <io.h>
  4. #include <string.h>
  5.  
  6. #include <extlib.h>
  7.  
  8. typedef enum { unopened = 0, reading, writing } pipemode;
  9.  
  10. static struct
  11. {
  12.     char *name;
  13.     char *command;
  14.     pipemode pmode;
  15. }
  16. pipes[_NFILE];
  17.  
  18. static FILE *dos_popen(char *command, char *mode)
  19. {
  20.     FILE *current;
  21.     char name[128];
  22.     char *tmp = getenv("TMP");
  23.     int cur;
  24.     pipemode curmode;
  25.  
  26.     /*
  27.     ** decide on mode.
  28.     */
  29.     if(strchr(mode, 'r') != NULL)
  30.         curmode = reading;
  31.     else if(strchr(mode, 'w') != NULL)
  32.         curmode = writing;
  33.     else
  34.         return NULL;
  35.  
  36.     /*
  37.     ** get a name to use.
  38.     */
  39.  
  40.     strcpy(name, tmp ? tmp : "\\");
  41.     if ( name[strlen(name) - 1] != '\\' )
  42.       strcat(name, "\\");
  43.     strcat(name, "piXXXXXX");
  44.     mktemp(name);
  45.  
  46.     /*
  47.     ** If we're reading, just call system to get a file filled with
  48.     ** output.
  49.     */
  50.     if(curmode == reading)
  51.     {
  52.         char cmd[256];
  53.         sprintf(cmd,"%s > %s", command, name);
  54.         system(cmd);
  55.  
  56.         if((current = fopen(name, mode)) == NULL)
  57.             return NULL;
  58.     }
  59.     else
  60.     {
  61.         if((current = fopen(name, mode)) == NULL)
  62.             return NULL;
  63.     }
  64.  
  65.     cur = fileno(current);
  66.     pipes[cur].name = strdup(name);
  67.     pipes[cur].command = strdup(command);
  68.     pipes[cur].pmode = curmode;
  69.  
  70.     return current;
  71. }
  72.  
  73. static int dos_pclose(FILE * current)
  74. {
  75.     int cur = fileno(current), rval;
  76.     char command[256];
  77.  
  78.     /*
  79.     ** check for an open file.
  80.     */
  81.     if(pipes[cur].pmode == unopened)
  82.         return -1;
  83.  
  84.     if(pipes[cur].pmode == reading)
  85.     {
  86.         /*
  87.         ** input pipes are just files we're done with.
  88.         */
  89.         rval = fclose(current);
  90.         unlink(pipes[cur].name);
  91.     }
  92.     else
  93.     {
  94.         /*
  95.         ** output pipes are temporary files we have
  96.         ** to cram down the throats of programs.
  97.         */
  98.         fclose(current);
  99.         sprintf(command,"%s < %s", pipes[cur].command, pipes[cur].name);
  100.         rval = system(command);
  101.         unlink(pipes[cur].name);
  102.     }
  103.  
  104.     /*
  105.     ** clean up current pipe.
  106.     */
  107.     free(pipes[cur].name);
  108.     free(pipes[cur].command);
  109.     pipes[cur].pmode = unopened;
  110.  
  111.     return rval;
  112. }
  113.  
  114.  
  115. FILE *popen(char *cmd, char *mode)
  116. {
  117.   return (_osmode == DOS_MODE) ? dos_popen(cmd, mode) : _popen(cmd, mode);
  118. }
  119.  
  120. int pclose(FILE *ptr)
  121. {
  122.   return (_osmode == DOS_MODE) ? dos_pclose(ptr) : _pclose(ptr);
  123. }
  124.