PipeStream.st
author claus
Fri, 16 Jul 1993 11:39:45 +0200
changeset 1 a27a279701f8
child 2 6526dde5f3ac
permissions -rw-r--r--
Initial revision
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
     1
"
a27a279701f8 Initial revision
claus
parents:
diff changeset
     2
 COPYRIGHT (c) 1989-93 by Claus Gittinger
a27a279701f8 Initial revision
claus
parents:
diff changeset
     3
              All Rights Reserved
a27a279701f8 Initial revision
claus
parents:
diff changeset
     4
a27a279701f8 Initial revision
claus
parents:
diff changeset
     5
 This software is furnished under a license and may be used
a27a279701f8 Initial revision
claus
parents:
diff changeset
     6
 only in accordance with the terms of that license and with the
a27a279701f8 Initial revision
claus
parents:
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
a27a279701f8 Initial revision
claus
parents:
diff changeset
     8
 be provided or otherwise made available to, or used by, any
a27a279701f8 Initial revision
claus
parents:
diff changeset
     9
 other person.  No title to or ownership of the software is
a27a279701f8 Initial revision
claus
parents:
diff changeset
    10
 hereby transferred.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    11
"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    12
a27a279701f8 Initial revision
claus
parents:
diff changeset
    13
NonPositionableExternalStream subclass:#PipeStream
a27a279701f8 Initial revision
claus
parents:
diff changeset
    14
       instanceVariableNames:''
a27a279701f8 Initial revision
claus
parents:
diff changeset
    15
       classVariableNames:''
a27a279701f8 Initial revision
claus
parents:
diff changeset
    16
       poolDictionaries:''
a27a279701f8 Initial revision
claus
parents:
diff changeset
    17
       category:'Streams-External'
a27a279701f8 Initial revision
claus
parents:
diff changeset
    18
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    19
a27a279701f8 Initial revision
claus
parents:
diff changeset
    20
PipeStream comment:'
a27a279701f8 Initial revision
claus
parents:
diff changeset
    21
a27a279701f8 Initial revision
claus
parents:
diff changeset
    22
COPYRIGHT (c) 1989-93 by Claus Gittinger
a27a279701f8 Initial revision
claus
parents:
diff changeset
    23
              All Rights Reserved
a27a279701f8 Initial revision
claus
parents:
diff changeset
    24
a27a279701f8 Initial revision
claus
parents:
diff changeset
    25
%W% %E%
a27a279701f8 Initial revision
claus
parents:
diff changeset
    26
'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    27
a27a279701f8 Initial revision
claus
parents:
diff changeset
    28
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
    29
#include <stdio.h>
a27a279701f8 Initial revision
claus
parents:
diff changeset
    30
#ifndef transputer
a27a279701f8 Initial revision
claus
parents:
diff changeset
    31
# include <sys/types.h>
a27a279701f8 Initial revision
claus
parents:
diff changeset
    32
# include <sys/stat.h>
a27a279701f8 Initial revision
claus
parents:
diff changeset
    33
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
    34
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
    35
a27a279701f8 Initial revision
claus
parents:
diff changeset
    36
!PipeStream class methodsFor:'instance creation'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    37
a27a279701f8 Initial revision
claus
parents:
diff changeset
    38
writingTo:command
a27a279701f8 Initial revision
claus
parents:
diff changeset
    39
    "create and return a new pipeStream which can write to the unix command
a27a279701f8 Initial revision
claus
parents:
diff changeset
    40
     given by command."
a27a279701f8 Initial revision
claus
parents:
diff changeset
    41
a27a279701f8 Initial revision
claus
parents:
diff changeset
    42
    ^ (self basicNew) writingTo:command
a27a279701f8 Initial revision
claus
parents:
diff changeset
    43
a27a279701f8 Initial revision
claus
parents:
diff changeset
    44
    "PipeStream writingTo:'sort'"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    45
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    46
a27a279701f8 Initial revision
claus
parents:
diff changeset
    47
readingFrom:command
a27a279701f8 Initial revision
claus
parents:
diff changeset
    48
    "create and return a new pipeStream which can read from the unix command
a27a279701f8 Initial revision
claus
parents:
diff changeset
    49
     given by command."
a27a279701f8 Initial revision
claus
parents:
diff changeset
    50
a27a279701f8 Initial revision
claus
parents:
diff changeset
    51
    ^ (self basicNew) readingFrom:command
a27a279701f8 Initial revision
claus
parents:
diff changeset
    52
a27a279701f8 Initial revision
claus
parents:
diff changeset
    53
    "PipeStream readingFrom:'ls'"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    54
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
    55
a27a279701f8 Initial revision
claus
parents:
diff changeset
    56
!PipeStream methodsFor:'instance release'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    57
a27a279701f8 Initial revision
claus
parents:
diff changeset
    58
closeFile
a27a279701f8 Initial revision
claus
parents:
diff changeset
    59
    "low level close - redefined since we close a pipe here"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    60
a27a279701f8 Initial revision
claus
parents:
diff changeset
    61
%{  /* NOCONTEXT */
a27a279701f8 Initial revision
claus
parents:
diff changeset
    62
#ifndef transputer
a27a279701f8 Initial revision
claus
parents:
diff changeset
    63
    pclose(MKFD(_INST(filePointer)));
a27a279701f8 Initial revision
claus
parents:
diff changeset
    64
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
    65
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
    66
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
    67
a27a279701f8 Initial revision
claus
parents:
diff changeset
    68
!PipeStream methodsFor:'private'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    69
a27a279701f8 Initial revision
claus
parents:
diff changeset
    70
openPipeFor:commandString withMode:mode
a27a279701f8 Initial revision
claus
parents:
diff changeset
    71
    "open a pipe to commandString; mode may be 'r' or 'w'"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    72
a27a279701f8 Initial revision
claus
parents:
diff changeset
    73
    |retVal|
a27a279701f8 Initial revision
claus
parents:
diff changeset
    74
a27a279701f8 Initial revision
claus
parents:
diff changeset
    75
    unBuffered := true.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    76
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
    77
#ifndef transputer
a27a279701f8 Initial revision
claus
parents:
diff changeset
    78
    {
a27a279701f8 Initial revision
claus
parents:
diff changeset
    79
        FILE *f;
a27a279701f8 Initial revision
claus
parents:
diff changeset
    80
        extern OBJ ErrorNumber;
a27a279701f8 Initial revision
claus
parents:
diff changeset
    81
        extern errno;
a27a279701f8 Initial revision
claus
parents:
diff changeset
    82
a27a279701f8 Initial revision
claus
parents:
diff changeset
    83
        if (_isString(commandString) && _isString(mode)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
    84
            f = (FILE *)popen((char *) _stringVal(commandString),
a27a279701f8 Initial revision
claus
parents:
diff changeset
    85
			      (char *) _stringVal(mode));
a27a279701f8 Initial revision
claus
parents:
diff changeset
    86
            if (f == NULL) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
    87
                ErrorNumber = _MKSMALLINT(errno);
a27a279701f8 Initial revision
claus
parents:
diff changeset
    88
            } else {
a27a279701f8 Initial revision
claus
parents:
diff changeset
    89
                _INST(filePointer) = MKOBJ(f);
a27a279701f8 Initial revision
claus
parents:
diff changeset
    90
                retVal = self;
a27a279701f8 Initial revision
claus
parents:
diff changeset
    91
            }
a27a279701f8 Initial revision
claus
parents:
diff changeset
    92
        }
a27a279701f8 Initial revision
claus
parents:
diff changeset
    93
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
    94
#endif
a27a279701f8 Initial revision
claus
parents:
diff changeset
    95
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
    96
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    97
    retVal notNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
    98
        lobby register:self
a27a279701f8 Initial revision
claus
parents:
diff changeset
    99
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   100
    ^ retVal
a27a279701f8 Initial revision
claus
parents:
diff changeset
   101
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   102
a27a279701f8 Initial revision
claus
parents:
diff changeset
   103
readingFrom:command
a27a279701f8 Initial revision
claus
parents:
diff changeset
   104
    "setup the receiver to read from command"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   105
a27a279701f8 Initial revision
claus
parents:
diff changeset
   106
    self readonly.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   107
    ^ self openPipeFor:command withMode:'r'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   108
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   109
a27a279701f8 Initial revision
claus
parents:
diff changeset
   110
writingTo:command
a27a279701f8 Initial revision
claus
parents:
diff changeset
   111
    "setup the receiver to write to command"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   112
a27a279701f8 Initial revision
claus
parents:
diff changeset
   113
    self writeonly.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   114
    ^ self openPipeFor:command withMode:'w'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   115
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   116
a27a279701f8 Initial revision
claus
parents:
diff changeset
   117
!PipeStream methodsFor:'redefined basic'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   118
a27a279701f8 Initial revision
claus
parents:
diff changeset
   119
size
a27a279701f8 Initial revision
claus
parents:
diff changeset
   120
    "redefined since pipes have no size"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   121
a27a279701f8 Initial revision
claus
parents:
diff changeset
   122
    ^ self shouldNotImplement
a27a279701f8 Initial revision
claus
parents:
diff changeset
   123
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   124
a27a279701f8 Initial revision
claus
parents:
diff changeset
   125
position:newpos
a27a279701f8 Initial revision
claus
parents:
diff changeset
   126
    "redefined since pipes cannot be positioned"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   127
a27a279701f8 Initial revision
claus
parents:
diff changeset
   128
    ^ self shouldNotImplement
a27a279701f8 Initial revision
claus
parents:
diff changeset
   129
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   130
a27a279701f8 Initial revision
claus
parents:
diff changeset
   131
position
a27a279701f8 Initial revision
claus
parents:
diff changeset
   132
    "redefined since pipes have no position"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   133
a27a279701f8 Initial revision
claus
parents:
diff changeset
   134
    ^ self shouldNotImplement
a27a279701f8 Initial revision
claus
parents:
diff changeset
   135
! !