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


type CountStreamDriver
  field Link:Stream s
  field Int read_counter write_counter
  field Int read_remain 
# Copyright  Hubert Tonneau  hubert.tonneau@pliant.cx
#
# This program is free software; you can redistribute it and
# modify it under the terms of the GNU General Public Licens
# as published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be us
# but WITHOUT ANY WARRANTY; without even the implied warrant
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See 
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public 
# version 2 along with this program; if not, write to the Fr
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 


type CountStreamDriver
  field Link:Stream s
  field Int read_counter write_counter
  field Int read_remain 
  field Int read_unit write_unit
  field Float read_cps write_cps
StreamDriver maybe CountStreamDriver


method drv read buf mini maxi -> red
  oarg_rw CountStreamDriver drv ; arg Address buf ; arg Int 
  var Int remain := shunt drv:read_remain<>undefined drv:rea
  if remain=0
    return 0
  if drv:s:stream_read_cur<>drv:s:stream_read_stop
StreamDriver maybe CountStreamDriver


method drv read buf mini maxi -> red
  oarg_rw CountStreamDriver drv ; arg Address buf ; arg Int 
  var Int remain := shunt drv:read_remain<>undefined drv:rea
  if remain=0
    return 0
  if drv:s:stream_read_cur<>drv:s:stream_read_stop
    drv:s read_available (var Address adr) red (min maxi rem
    drv:s read_available (var Address adr) red (min (min maxi drv:read_unit) remain)
    memory_copy adr buf red
  else
    red := 0
  if red<(min mini remain)
    red += drv:s:stream_driver read (buf translate Byte red)
  drv read_counter += red
  if drv:read_remain<>undefined
    drv read_remain -= red
    memory_copy adr buf red
  else
    red := 0
  if red<(min mini remain)
    red += drv:s:stream_driver read (buf translate Byte red)
  drv read_counter += red
  if drv:read_remain<>undefined
    drv read_remain -= red
  if drv:read_cps<>undefined
    sleep red/drv:read_cps


method drv write buf mini maxi -> written
  oarg_rw CountStreamDriver drv ; arg Address buf ; arg Int 
  if drv:s:stream_write_cur<>drv:s:stream_write_buf
    drv:s flush anytime


method drv write buf mini maxi -> written
  oarg_rw CountStreamDriver drv ; arg Address buf ; arg Int 
  if drv:s:stream_write_cur<>drv:s:stream_write_buf
    drv:s flush anytime
  written := drv:s:stream_driver write buf mini maxi
  written := drv:s:stream_driver write buf (min mini drv:write_unit) (min maxi drv:write_unit)
  drv write_counter += written
  drv write_counter += written
  if drv:write_cps<>undefined
    sleep written/drv:write_cps



method fs open name options flags stream support -> status
  oarg_rw CountFileSystem fs ; arg Str name options ; arg In
  var Link:Stream s
  if exists:support
    s :> support
  else
    var Link:Stream s :> new Stream
    s open name options (flags .and. in+out+safe)
    if s=failure
      return failure
  var Link:CountStreamDriver drv :> new CountStreamDriver
  drv s :> s
  drv read_counter := 0
  drv write_counter := 0
  drv read_remain := options option "size" Int



method fs open name options flags stream support -> status
  oarg_rw CountFileSystem fs ; arg Str name options ; arg In
  var Link:Stream s
  if exists:support
    s :> support
  else
    var Link:Stream s :> new Stream
    s open name options (flags .and. in+out+safe)
    if s=failure
      return failure
  var Link:CountStreamDriver drv :> new CountStreamDriver
  drv s :> s
  drv read_counter := 0
  drv write_counter := 0
  drv read_remain := options option "size" Int
  drv read_unit := options option "read_unit" Int 2^30
  drv write_unit := options option "write_unit" Int 2^30
  drv read_cps := options option "read_cps" Float
  drv write_cps := options option "write_cps" Float
  stream stream_driver :> drv
  status := success



  stream stream_driver :> drv
  status := success