Patch title: Release 93 bulk changes
Abstract:
File: /language/stream/memory.pli
Key:
    Removed line
    Added line
   
module "ring.pli"
module "/pliant/admin/file.pli"


type MemoryStreamDriver
  field Address buffer
  field Int size
  field CBool allocated
  field Int offset
StreamDriver maybe MemoryStreamDriver

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

method m write buf mini maxi -> written
  arg_rw MemoryStreamDriver m ; arg Address buf ; arg Int mini maxi written
  written := min m:size-m:offset maxi
  memory_copy buf (m:buffer translate Byte m:offset) written
  m offset += written

method m query command stream answer -> status
  oarg_rw MemoryStreamDriver m ; arg Str command ; arg_rw Stream stream ; arg_w Str answer ; arg ExtendedStatus status
  status := failure
  if command="seek"
    answer := string m:offset+((cast stream:stream_read_cur Int).-.(cast stream:stream_read_stop Int))+((cast stream:stream_write_cur Int).-.(cast stream:stream_write_buf Int))
    status := success

method m configure command stream -> status
  arg_rw MemoryStreamDriver m ; arg Str command ; arg_rw Stream stream ; arg ExtendedStatus status
  status := failure
  if (command parse word:"seek" (var Int pos))
    if (stream:stream_flags .and. out)<>0
      stream flush anytime
    stream stream_read_cur := stream stream_read_stop
    m offset := pos
    status := success

method m close -> status
  arg_rw MemoryStreamDriver m ; arg ExtendedStatus status
  if m:allocated
    memory_free m:buffer
  status := success


type MemoryFileSystem
  void
FileSystem maybe MemoryFileSystem

method mfs open name options flags stream support -> status
  oarg_rw MemoryFileSystem mfs ; arg Str name options ; arg Int flags ; arg_rw Stream stream support ; arg ExtendedStatus status
  if (name parse "/" (var Int buffer) "/" (var Int size) "/" (var Bool allocated))
    var Link:MemoryStreamDriver m :> new MemoryStreamDriver
    m buffer := cast buffer Address
    m size := size
    m allocated := allocated
    m offset := 0
    stream stream_driver :> m
  eif (name parse (var Int size))
    var Link:MemoryStreamDriver m :> new MemoryStreamDriver
    m buffer := memory_allocate size addressof:m
    m size := size
    m allocated := true
    m offset := 0
    stream stream_driver :> m
  else
    status := failure "incorrect name"

gvar MemoryFileSystem memory_file_system
pliant_multi_file_system mount "memory:" "" "" memory_file_system