Patch title: Release 93 bulk changes
Abstract:
File: /language/stream/filebase2.pli
Key:
    Removed line
    Added line
# 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.

scope "/pliant/language/stream/" "/pliant/language/" "/pliant/admin/"
module "ring.pli"
module "/pliant/language/type/set/index.pli"

constant dropit "[0]"

function file_list path options flg fs -> fileinfo
  arg Str path options ; arg Int flg ; oarg_rw FileSystem fs ; arg Array:FileInfo fileinfo
  var List files ; var Pointer:Arrow c
  var Int flags := flg .or. (shunt (flg .and. recursive)<>0 and (flg .and. linkrecursive)=0 extended 0) .or. (shunt (flg .and. nolinks)<>0 extended 0)
  var Int supported_flags := fs list path options flags files
  if (flags .and. recursive+linkrecursive)<>0 and (supported_flags .and. recursive+linkrecursive)=0
    c :> files first
    while c<>null
      check (addressof entry_type:c)=addressof:FileInfo
      var Pointer:FileInfo f :> c map FileInfo
      if f:is_directory and ( (flags .and. linkrecursive)<>0 or not f:is_link )
      if f:is_directory and f:status=success and ( (flags .and. linkrecursive)<>0 or not f:is_link )
        fs list f:name options (flags .and. .not. (cast recursive Int)) files
      c :> files next c
  var Int nfiles := 0
  var Int ndirs := 0
  c :> files first
  while c<>null
    check (addressof entry_type:c)=addressof:FileInfo
    var Pointer:FileInfo f :> c map FileInfo
    if (flg .and. relative)<>0
      if (f:name 0 path:len)=path
        f name := f:name path:len f:name:len
      else
        f name := ""
        f name := dropit
    if (flg .and. nolinks)<>0 and f:is_link
      f name := ""
      f name := dropit
    if (flg .and. level_flags)<standard
      f size := undefined
      f datetime := undefined
    if (flg .and. level_flags)<extended
      f options := ""
    if f:name=""
    if f:name=dropit
      void  
    eif f:is_directory
      ndirs += 1
    else
      nfiles += 1
    c :> files next c
  fileinfo size := nfiles + (shunt (flags .and. directories)<>0 ndirs 0)
  var Int i := 0
  if (flags .and. sorted)<>0
    var (Index Str Arrow) index
    c :> files first
    while c<>null
      index insert (c map FileInfo):name c
      c :> files next c
    files := var List empty_list
    var Pointer:Arrow c :> index first
    while exists:c
      files append c
      c :> index next c
  c :> files first
  while c<>null
    check (addressof entry_type:c)=addressof:FileInfo
    var Pointer:FileInfo f :> c map FileInfo
    if f:name=""
    if f:name=dropit
      void
    eif f:is_directory
      if (flags .and. directories)<>0
        f status := defined
        # f status := defined
        f size := undefined
        if (flags .and. level_flags)<standard
          f datetime := undefined
        if (flags .and. level_flags)<extended
          f options := ""
        fileinfo i := f ; i += 1
    else
      f status := defined
      # f status := defined
      if (flags .and. level_flags)<standard
        f size := undefined
        f datetime := undefined
      if (flags .and. level_flags)<extended
        f options := ""
      fileinfo i := f ; i += 1
    c :> files next c
  check i=fileinfo:size
(the_function file_list Str Str Int FileSystem -> Array:FileInfo) extra_module :> the_module "/pliant/language/stream/listmode.pli"

function file_list path flags -> fileinfo
  arg Str path ; arg Int flags ; arg Array:FileInfo fileinfo
  fileinfo := file_list path "" flags pliant_default_file_system
(the_function file_list Str Int -> Array:FileInfo) extra_module :> the_module "/pliant/language/stream/listmode.pli"


function file_query filename options flags -> info
  arg Str filename options ; arg Int flags ; arg FileInfo info
  info size := undefined
  info datetime := undefined
  info options := ""
  info name := filename
  info status := pliant_default_file_system query filename options flags info
  if (flags .and. level_flags)<standard
    info size := undefined
    info datetime := undefined
  if (flags .and. level_flags)<extended
    info options := ""
(the_function file_query Str Str Int -> FileInfo) extra_module :> the_module "/pliant/language/stream/listmode.pli"

function file_query filename flags -> info
  arg Str filename ; arg Int flags ; arg FileInfo info
  info := file_query filename "" flags
(the_function file_query Str Int -> FileInfo) extra_module :> the_module "/pliant/language/stream/listmode.pli"


export file_list file_query