Patch title: Release 89 bulk changes
Abstract:
File: /language/stream/multiplexer.pli
Key:
    Removed line
    Added line
   
# Copyright  Hubert Tonneau  hubert.tonneau@pliant.cx
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License version 2
# as published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# version 2 along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

module "ring.pli"


type MultiplexerStreamDriver
  field (Array Link:Stream) s
StreamDriver maybe MultiplexerStreamDriver


method drv read buf mini maxi -> red
  oarg_rw MultiplexerStreamDriver drv ; arg Address buf ; arg Int mini maxi red
  var Link:Stream s :> drv:s 0
  if s:stream_read_cur<>s:stream_read_stop
    s read_available (var Address adr) red maxi
    memory_copy adr buf red
  else
    red := 0
  if red<mini
    red += s:stream_driver read (buf translate Byte red) mini-red maxi-red


method drv write buf mini maxi -> written
  oarg_rw MultiplexerStreamDriver drv ; arg Address buf ; arg Int mini maxi written
  for (var Int i) 0 drv:s:size-1
    drv:s:i raw_write buf maxi
  written := maxi


method drv flush level -> status
  oarg_rw MultiplexerStreamDriver drv ; arg Int level ; arg Status status
  status := success
  for (var Int i) 0 drv:s:size-1
    drv:s:i flush level


method drv query command stream answer -> status
  oarg_rw MultiplexerStreamDriver drv ; arg Str command ; arg_rw Stream stream ; arg_w Str answer ; arg ExtendedStatus status 
  status := drv:s:0:stream_driver query command drv:s:0 answer


method drv configure command stream -> status
  oarg_rw MultiplexerStreamDriver drv ; arg Str command ; arg_rw Stream stream ; arg ExtendedStatus status
  status := drv:s:0:stream_driver configure command drv:s:0


#----------------------------------------------------------------


type MultiplexerFileSystem
  void
FileSystem maybe MultiplexerFileSystem

method fs query filename options flags info -> status
  arg_rw MultiplexerFileSystem fs ; arg Str filename options ; arg Int flags ; arg_rw FileInfo info ; arg ExtendedStatus status
  if (filename parse (var Str first) any)
    status := pliant_multi_file_system query first options flags info
  else
    status := failure "empty multiplexer"

method fs configure filename options command -> status
  arg_rw MultiplexerFileSystem fs ; arg Str filename options command ; arg ExtendedStatus status
  if (filename parse (var Str first) any)
    status := pliant_multi_file_system configure first options command
  else
    status := failure "empty multiplexer"

method fs open name options flags stream support -> status
  oarg_rw MultiplexerFileSystem fs ; arg Str name options ; arg Int flags ; arg_rw Stream stream support ; arg ExtendedStatus status
  var Link:MultiplexerStreamDriver drv :> new MultiplexerStreamDriver
  var Str all := name
  while (all parse (var Str first) any:(var Str remain))
    var Link:Stream s :> new Stream
    s open first options flags
    drv s += s
    all := remain
  if drv:s:size=0
    return failure
  stream stream_driver :> drv
  status := success


gvar MultiplexerFileSystem multiplexer_file_system
pliant_multi_file_system mount "multiplexer:" "" multiplexer_file_system