Patch title: Release 94 bulk changes
Abstract:
File: /pliant/graphic/filter/io.pli
Key:
    Removed line
    Added line
   
abstract
  [Reading and writing a Pliant image from or to a file.]


module "/pliant/language/compiler.pli"
module "/pliant/language/stream.pli"
module "/pliant/admin/file.pli"
module "prototype.pli"
module "all.pli"
module "/pliant/graphic/image/prototype.pli"
module "/pliant/language/context.pli"
module "/pliant/graphic/misc/mtbuffer.pli"
abstract
  [Reading and writing a Pliant image from or to a file.]


module "/pliant/language/compiler.pli"
module "/pliant/language/stream.pli"
module "/pliant/admin/file.pli"
module "prototype.pli"
module "all.pli"
module "/pliant/graphic/image/prototype.pli"
module "/pliant/language/context.pli"
module "/pliant/graphic/misc/mtbuffer.pli"
module "/pliant/appli/database.pli"
module "/pliant/storage/database.pli"


method p load stream options -> status
  oarg_rw ImagePrototype p ; arg_rw Stream stream ; arg Str 
  var Link:ImageReadFilter f :> image_read_filter (options o
  if not exists:f
    return (failure "There is no filter for "+stream:name+" 


method p load stream options -> status
  oarg_rw ImagePrototype p ; arg_rw Stream stream ; arg Str 
  var Link:ImageReadFilter f :> image_read_filter (options o
  if not exists:f
    return (failure "There is no filter for "+stream:name+" 
  status := f open stream options (var ImagePrototype h)
  part open "load image "+(entry_type addressof:f):name+" open"
    status := f open stream options (var ImagePrototype h)
  if status=failure
    return
  if (p setup h options)=failure
    return failure:"Cannot setup image"
  p options := h options
  var Address buffer := null
  part read_lines "load image "+(entry_type addressof:f):nam
    for (var Int y) 0 p:size_y-1
      part line "line "+string:y+"/"+(string p:size_y)
        if stream=failure
          status := failure "Image input stream is broken"
          leave read_lines
        if trace and 100*y\p:size_y<>100*(y-1)\p:size_y
          console stream:name " " (string 100*y\p:size_y) "%
        var Address adr := p write_map 0 y p:size_x p:size_x
        if adr<>null
          if (f readline adr)=failure
            status := failure "Failed to read mapped line "+
            p write_unmap 0 y count adr
            leave read_lines
          p write_unmap 0 y count adr
        else
          if buffer=null
            buffer := memory_allocate p:line_size addressof:
          if (f readline buffer)=failure
            status := failure "Failed to read line "+(string
            leave read_lines
          p write 0 y p:size_x buffer
  if buffer<>null
    memory_free buffer
  if status=failure
    return
  if (p setup h options)=failure
    return failure:"Cannot setup image"
  p options := h options
  var Address buffer := null
  part read_lines "load image "+(entry_type addressof:f):nam
    for (var Int y) 0 p:size_y-1
      part line "line "+string:y+"/"+(string p:size_y)
        if stream=failure
          status := failure "Image input stream is broken"
          leave read_lines
        if trace and 100*y\p:size_y<>100*(y-1)\p:size_y
          console stream:name " " (string 100*y\p:size_y) "%
        var Address adr := p write_map 0 y p:size_x p:size_x
        if adr<>null
          if (f readline adr)=failure
            status := failure "Failed to read mapped line "+
            p write_unmap 0 y count adr
            leave read_lines
          p write_unmap 0 y count adr
        else
          if buffer=null
            buffer := memory_allocate p:line_size addressof:
          if (f readline buffer)=failure
            status := failure "Failed to read line "+(string
            leave read_lines
          p write 0 y p:size_x buffer
  if buffer<>null
    memory_free buffer
  if f:close=failure
    if status=success
      status := failure "Failed to close the image input fil
  part close "load image "+(entry_type addressof:f):name+" close"
    if f:close=failure
      if status=success
        status := failure "Failed to close the image input file"
  if trace
    console (repeat stream:name:len+7 " ") "[cr]"


method p save stream options -> status
  oarg_rw ImagePrototype p ; arg_rw Stream stream ; arg Str 
  var Link:ImageWriteFilter f :> image_write_filter (options
  if not exists:f
    return (failure "There is no filter for "+stream:name+" 
  var ImagePrototype h := image_prototype p:x0 p:y0 p:x1 p:y
  h options := p options
  if trace
    console (repeat stream:name:len+7 " ") "[cr]"


method p save stream options -> status
  oarg_rw ImagePrototype p ; arg_rw Stream stream ; arg Str 
  var Link:ImageWriteFilter f :> image_write_filter (options
  if not exists:f
    return (failure "There is no filter for "+stream:name+" 
  var ImagePrototype h := image_prototype p:x0 p:y0 p:x1 p:y
  h options := p options
  status := f open stream options h
  part open "save image "+(entry_type addressof:f):name+" open"
    status := f open stream options h
  if status=failure
    return
  if status=failure
    return
  var Int burst := options option "burst" Int
  if burst=undefined and (options option "burst") and proces
    burst := processor_count
  var Int burst := options option "burst" Int (shunt (options option "burst") processor_count undefined)
  var Str cflag := options option "continue_flag" Str
  var Str cflag := options option "continue_flag" Str
  if burst=defined and burst>1
  if burst<>undefined and burst>1
    (var MtBuffer buffers) size := p line_size
    part burst_write_lines "burst "+string:burst+" save imag
      parallel threads burst
        for (var Int y) 0 p:size_y-1
          if cflag:len>0 and (cflag pmap Bool)<>true
            status := failure "Interrupted"
          if status=success
            if trace and 100*y\p:size_y<>100*(y-1)\p:size_y
              console stream:name " " (string 100*y\p:size_y
            var Address buffer
            task
              share p f buffers
              buffer := buffers allocate
              part read_line "burst read line "+string:y+"/"
                p read 0 y p:size_x buffer
            post
              part write_line "burst write line "+string:y+"
                if (f writeline buffer)=failure
                  status := failure "Failed to write line "+
              buffers free buffer               
              if stream=failure
                status := failure "Image output stream is br
  else
    var Address buffer := null
    part write_lines "save image "+(entry_type addressof:f):
      for (var Int y) 0 p:size_y-1
        if cflag:len>0 and (cflag pmap Bool)<>true
          status := failure "Interrupted"
        if status=failure
          leave write_lines
        part line "line "+string:y+"/"+(string p:size_y)
          if trace and 100*y\p:size_y<>100*(y-1)\p:size_y
            console stream:name " " (string 100*y\p:size_y) 
          var Address adr := p read_map 0 y p:size_x p:size_
          if adr<>null
            if (f writeline adr)=failure
              status := failure "Failed to write mapped line
            p read_unmap 0 y count adr
          else
            if buffer=null
              buffer := memory_allocate p:line_size addresso
            p read 0 y p:size_x buffer
            if (f writeline buffer)=failure
              status := failure "Failed to write line "+(str
          if stream=failure
            status := failure "Image output stream is broken
    if buffer<>null
      memory_free buffer
    (var MtBuffer buffers) size := p line_size
    part burst_write_lines "burst "+string:burst+" save imag
      parallel threads burst
        for (var Int y) 0 p:size_y-1
          if cflag:len>0 and (cflag pmap Bool)<>true
            status := failure "Interrupted"
          if status=success
            if trace and 100*y\p:size_y<>100*(y-1)\p:size_y
              console stream:name " " (string 100*y\p:size_y
            var Address buffer
            task
              share p f buffers
              buffer := buffers allocate
              part read_line "burst read line "+string:y+"/"
                p read 0 y p:size_x buffer
            post
              part write_line "burst write line "+string:y+"
                if (f writeline buffer)=failure
                  status := failure "Failed to write line "+
              buffers free buffer               
              if stream=failure
                status := failure "Image output stream is br
  else
    var Address buffer := null
    part write_lines "save image "+(entry_type addressof:f):
      for (var Int y) 0 p:size_y-1
        if cflag:len>0 and (cflag pmap Bool)<>true
          status := failure "Interrupted"
        if status=failure
          leave write_lines
        part line "line "+string:y+"/"+(string p:size_y)
          if trace and 100*y\p:size_y<>100*(y-1)\p:size_y
            console stream:name " " (string 100*y\p:size_y) 
          var Address adr := p read_map 0 y p:size_x p:size_
          if adr<>null
            if (f writeline adr)=failure
              status := failure "Failed to write mapped line
            p read_unmap 0 y count adr
          else
            if buffer=null
              buffer := memory_allocate p:line_size addresso
            p read 0 y p:size_x buffer
            if (f writeline buffer)=failure
              status := failure "Failed to write line "+(str
          if stream=failure
            status := failure "Image output stream is broken
    if buffer<>null
      memory_free buffer
  var ExtendedStatus cs := f close
  part close "save image "+(entry_type addressof:f):name+" close"
    var ExtendedStatus cs := f close
  if cs=failure and status=success
    status := cs
  if trace
    console (repeat stream:name:len+7 " ") "[cr]"


  if cs=failure and status=success
    status := cs
  if trace
    console (repeat stream:name:len+7 " ") "[cr]"