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
# modify it under the terms of the GNU General Public Licens
# as published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be us
# but WITHOUT ANY WARRANTY; without even the implied warrant
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See 
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public 
# version 2 along with this program; if not, write to the Fr
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 


# Copyright  Hubert Tonneau  hubert.tonneau@pliant.cx
#
# This program is free software; you can redistribute it and
# modify it under the terms of the GNU General Public Licens
# as published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be us
# but WITHOUT ANY WARRANTY; without even the implied warrant
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See 
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public 
# version 2 along with this program; if not, write to the Fr
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 


constant dropit "[0]"

function file_list path options flg fs -> fileinfo
  arg Str path options ; arg Int flg ; oarg_rw FileSystem fs
  var List files ; var Pointer:Arrow c
  var Int flags := flg .or. (shunt (flg .and. recursive)<>0 
  var Int supported_flags := fs list path options flags file
  if (flags .and. recursive+linkrecursive)<>0 and (supported
    c :> files first
    while c<>null
      check (addressof entry_type:c)=addressof:FileInfo
      var Pointer:FileInfo f :> c map FileInfo

function file_list path options flg fs -> fileinfo
  arg Str path options ; arg Int flg ; oarg_rw FileSystem fs
  var List files ; var Pointer:Arrow c
  var Int flags := flg .or. (shunt (flg .and. recursive)<>0 
  var Int supported_flags := fs list path options flags file
  if (flags .and. recursive+linkrecursive)<>0 and (supported
    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
      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 recu
      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
        fs list f:name options (flags .and. .not. (cast recu
      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
    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 (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)
  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
      void  
    eif f:is_directory
      ndirs += 1
    else
      nfiles += 1
    c :> files next c
  fileinfo size := nfiles + (shunt (flags .and. directories)
  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
      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 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:File


export file_list file_query
      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:File


export file_list file_query