|
|
1.1 ! root 1: /* This is part of libio/iostream, providing -*- C++ -*- input/output. ! 2: Copyright (C) 1993 Free Software Foundation ! 3: ! 4: This file is part of the GNU IO Library. This library is free ! 5: software; you can redistribute it and/or modify it under the ! 6: terms of the GNU General Public License as published by the ! 7: Free Software Foundation; either version 2, or (at your option) ! 8: any later version. ! 9: ! 10: This library is distributed in the hope that it will be useful, ! 11: but WITHOUT ANY WARRANTY; without even the implied warranty of ! 12: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ! 13: GNU General Public License for more details. ! 14: ! 15: You should have received a copy of the GNU General Public License ! 16: along with GNU CC; see the file COPYING. If not, write to ! 17: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. ! 18: ! 19: As a special exception, if you link this library with files ! 20: compiled with a GNU compiler to produce an executable, this does not cause ! 21: the resulting executable to be covered by the GNU General Public License. ! 22: This exception does not however invalidate any other reasons why ! 23: the executable file might be covered by the GNU General Public License. */ ! 24: ! 25: /* Written by Per Bothner ([email protected]). */ ! 26: ! 27: #ifdef __GNUG__ ! 28: #pragma implementation ! 29: #endif ! 30: #include "libioP.h" ! 31: #include <pfstream.h> ! 32: #include <procbuf.h> ! 33: ! 34: ipfstream::ipfstream(const char *name, int mode, int prot) ! 35: { ! 36: const char* p; ! 37: ! 38: // Look for '| command' (as used by ftp). ! 39: for (p = name; *p == ' ' || *p == '\t'; p++) ; ! 40: if (*p == '|') { ! 41: procbuf *pbuf = new procbuf(); ! 42: init(pbuf); ! 43: if (pbuf->open(p+1, mode)) ! 44: set(ios::badbit); ! 45: return; ! 46: } ! 47: ! 48: // Look for 'command |' ! 49: while (*p) p++; // Point to last ! 50: while (p[-1] == ' ' || p[-1] == '\t' || p[-1] == '\n') p--; ! 51: if (p[-1] == '|') { ! 52: // Must remove the final '|'. ! 53: p--; ! 54: #ifdef __GNUC__ ! 55: char command[p-name+1]; ! 56: #else ! 57: char *command = new char[p-name+1]; ! 58: #endif ! 59: memcpy(command, name, p-name); ! 60: command[p-name] = '\0'; ! 61: ! 62: procbuf *pbuf = new procbuf(); ! 63: if (pbuf->open(command, mode)) ! 64: set(ios::badbit); ! 65: #ifndef __GNUC__ ! 66: delete command; ! 67: #endif ! 68: return; ! 69: } ! 70: ! 71: init(new filebuf()); ! 72: if (!rdbuf()->open(name, mode, prot)) ! 73: set(ios::badbit); ! 74: } ! 75: ! 76: opfstream::opfstream(const char *name, int mode, int prot) ! 77: { ! 78: const char *p; ! 79: // Look for '| command'. ! 80: for (p = name; *p == ' ' || *p == '\t'; p++) ; ! 81: if (*p == '|') { ! 82: procbuf *pbuf = new procbuf(); ! 83: init(pbuf); ! 84: if (pbuf->open(p+1, mode)) ! 85: set(ios::badbit); ! 86: } ! 87: else { ! 88: init(new filebuf()); ! 89: if (!rdbuf()->open(name, mode, prot)) ! 90: set(ios::badbit); ! 91: } ! 92: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.