Patch title: Release 96 bulk changes
Abstract:
File: /pliant/language/stream/blob.pli
Key:
    Removed line
    Added line
module "ring.pli"
module "/pliant/language/type/misc/blob.pli"

constant tiny_buffer_size 256


type BlobStreamDriver
  field Pointer:Blob blob
  field Int offset
  field Int limit
StreamDriver maybe BlobStreamDriver

method m read buf mini maxi -> red
  arg_rw BlobStreamDriver m ; arg Address buf ; arg Int mini maxi red
  red := min m:blob:size-m:offset maxi
  memory_copy (m:blob:content translate Byte m:offset) buf red
  m offset += red

method m write buf mini maxi -> written
  arg_rw BlobStreamDriver m ; arg Address buf ; arg Int mini maxi written
  var Int offset := m:blob size
  written := shunt m:limit<>undefined (min m:limit-offset maxi) maxi
  m:blob size += written
  memory_copy buf (m:blob:content translate Byte offset) written

method m close -> status
  arg_rw BlobStreamDriver m ; arg ExtendedStatus status
  status := success


method s open b options flags -> status
  arg_rw Stream s ; arg_rw Blob b ; arg Str options ; arg Int flags ; arg ExtendedStatus status
  s close
  s name := "blob"
  if (flags .and. in+out+append)=in
    var Link:BlobStreamDriver drv :> new BlobStreamDriver
    drv blob :> b
    drv offset := 0
    s stream_driver :> drv
    s stream_flags := flags
    s stream_read_buf_size := tiny_buffer_size
    s stream_read_buf := memory_allocate s:stream_read_buf_size addressof:s
    s stream_read_cur := s stream_read_buf
    s stream_read_stop := s stream_read_buf
    s stream_write_buf_size := 0
    status := success
  eif (flags .and. in+out+append)=out or (flags .and. in+out+append)=append
    if (flags .and. in+out+append)=out
      b size := 0
    var Link:BlobStreamDriver drv :> new BlobStreamDriver
    drv blob :> b
    drv limit := options option "limit" Int undefined
    s stream_driver :> drv
    s stream_flags := flags
    s stream_write_buf_size := tiny_buffer_size
    s stream_write_buf := memory_allocate s:stream_write_buf_size addressof:s
    s stream_write_cur := s stream_write_buf
    s stream_write_stop := s:stream_write_buf translate Byte s:stream_write_buf_size
    s stream_read_buf_size := 0
    status := success
  else
    return failure:"unsupported open mode"
(the_function '. open' Stream Blob Str Int -> ExtendedStatus) extra_module :> the_module "/pliant/language/stream/openmode.pli"

method s open b flags -> status
  arg_rw Stream s ; arg_rw Blob b ; arg Int flags ; arg ExtendedStatus status
  status := s open b "" flags
(the_function '. open' Stream Blob Int -> ExtendedStatus) extra_module :> the_module "/pliant/language/stream/openmode.pli"

export '. open'