Patch title: Release 92 bulk changes
Abstract:
File: /graphic/filter/prototype.pli
Key:
    Removed line
    Added line
abstract
  [Prototypes for various files format drivers]

# 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 "/pliant/language/compiler.pli"
module "/pliant/language/stream.pli"
module "/pliant/language/stream/openmode.pli"
submodule "/pliant/graphic/image/prototype.pli"

public


type ImageReadFilter
  void

method f open stream options p -> status
  oarg_rw ImageReadFilter f ; arg_rw Stream stream ; arg Str options ; arg_w ImagePrototype p ; arg ExtendedStatus status
  generic
  status := failure "Generic image read open filter called"

method f readline adr -> status
  oarg_rw ImageReadFilter f ; arg Address adr ; arg Status status
  generic
  status := failure

method f close -> status
  oarg_rw ImageReadFilter f ; arg ExtendedStatus status
  generic
  status := failure "Generic image read close filter called"

method f query filename options h -> status
  oarg_rw ImageReadFilter f ; arg Str filename options ; arg_w ImagePrototype h ; arg ExtendedStatus status
  generic
  status := (var Stream s) open filename options in+safe
  if status=success
    status := f open s options h
    if status=success
      f close


type ImageWriteFilter
  void

method f open stream options h -> status
  oarg_rw ImageWriteFilter f ; arg_rw Stream stream ; arg Str options ; arg ImagePrototype h ; arg ExtendedStatus status
  generic
  status := failure "Generic image write open filter called"

method f writeline adr -> status
  oarg_rw ImageWriteFilter f ; arg Address adr ; arg Status status
  generic
  status := failure

method f close -> status
  oarg_rw ImageWriteFilter f ; arg ExtendedStatus status
  generic
  status := failure "Generic image write close filter called"


private

gvar Dictionary image_read_filters # extension -> type
gvar Dictionary image_read_seek
gvar Dictionary image_write_filters # extension -> type
gvar Dictionary image_write_seek

function image_record_filters ext read_filter write_filter
  arg Str ext ; arg Type read_filter write_filter
function image_record_filters ext read_filter read_seek write_filter write_seek
  arg Str ext ; arg Type read_filter write_filter ; arg CBool read_seek write_seek
  if read_filter<>Void
    image_read_filters insert ext true addressof:read_filter
    if read_seek
      image_read_seek insert ext true addressof:void
  if write_filter<>Void
    image_write_filters insert ext true addressof:write_filter
    if write_seek
      image_write_seek insert ext true addressof:void

function image_read_filter filename -> f
  arg Str filename ; arg Link:ImageReadFilter f
  var Str ext := filename
  ext := ext (ext search_last "/" -1)+1 ext:len
  ext := ext (ext search "." ext:len) ext:len
  var Pointer:Arrow c :> image_read_filters first ext
  if c=null
    console "There is no read filter for " ext eol
    f :> null map ImageReadFilter
    return
  f :> entry_new:(c map Type) map ImageReadFilter
 
function image_read_flags filename -> flags
  arg Str filename ; arg Int flags
  var Str ext := filename
  ext := ext (ext search_last "/" -1)+1 ext:len
  ext := ext (ext search "." ext:len) ext:len
  flags := shunt (image_read_seek first ext)<>null seek 0
 
function image_write_filter filename -> f
  arg Str filename ; arg Link:ImageWriteFilter f
  var Str ext := filename
  ext := ext (ext search_last "/" -1)+1 ext:len
  ext := ext (ext search "." ext:len) ext:len
  var Pointer:Arrow c :> image_write_filters first ext
  if c=null
    console "There is no write filter for " ext eol
    f :> null map ImageWriteFilter
    return
  f :> entry_new:(c map Type) map ImageWriteFilter
 
export image_record_filters image_read_filter image_write_filter
function image_write_flags filename -> flags
  arg Str filename ; arg Int flags
  var Str ext := filename
  ext := ext (ext search_last "/" -1)+1 ext:len
  ext := ext (ext search "." ext:len) ext:len
  flags := shunt (image_write_seek first ext)<>null seek 0
 
export image_record_filters
export image_read_filter image_read_flags
export image_write_filter image_write_flags