summaryrefslogtreecommitdiff
path: root/ipl/procs/gdl.icn
diff options
context:
space:
mode:
Diffstat (limited to 'ipl/procs/gdl.icn')
-rw-r--r--ipl/procs/gdl.icn143
1 files changed, 143 insertions, 0 deletions
diff --git a/ipl/procs/gdl.icn b/ipl/procs/gdl.icn
new file mode 100644
index 0000000..57aa0e8
--- /dev/null
+++ b/ipl/procs/gdl.icn
@@ -0,0 +1,143 @@
+############################################################################
+#
+# File: gdl.icn
+#
+# Subject: Procedures to get directory lists
+#
+# Author: Richard L. Goerwitz
+#
+# Date: May 2, 2001
+#
+############################################################################
+#
+# This file is in the public domain.
+#
+############################################################################
+#
+# Version: 1.3
+#
+############################################################################
+#
+# Gdl returns a list containing everything in a directory (whose name
+# must be passed as an argument to gdl). Nothing fancy. I use this file
+# as a template, modifying the procedures according to the needs of the
+# program in which they are used.
+#
+############################################################################
+#
+# Requires: UNIX or MS-DOS
+#
+############################################################################
+
+
+procedure gdl(dir)
+
+ local getdir
+ getdir := set_getdir_by_os()
+ return getdir(dir)
+
+end
+
+
+
+procedure set_getdir_by_os()
+
+ # Decide how to get a directory, based on whether we are running
+ # under Unix or MS-DOS.
+
+ if find("UNIX", &features)
+ then return unix_get_dir
+ else if find("MS-DOS", &features)
+ then return msdos_get_dir
+ else stop("Your operating system is not (yet) supported.")
+
+end
+
+
+
+procedure msdos_get_dir(dir)
+
+ # Returns a sorted list of all filenames (full paths included) in
+ # directory "dir." The list is sorted. Fails on invalid or empty
+ # directory. Aborts if temp file cannot be opened.
+ #
+ # Temp files can be directed to one or another directory either by
+ # manually setting the variable temp_dir below, or by setting the
+ # value of the environment variable TEMPDIR to an appropriate
+ # directory name.
+
+ local in_dir, filename_list, line, temp_name, filename
+ static temp_dir
+ initial {
+ temp_dir :=
+ (trim(map(getenv("TEMPDIR"), "/", "\\"), '\\') || "\\") |
+ ".\\"
+ }
+
+ # Get name of tempfile to be used.
+ temp_name := get_dos_tempname(temp_dir) |
+ stop("No more available tempfile names!")
+
+ # Make sure we have an unambiguous directory name, with backslashes
+ # instead of Unix-like forward slashes.
+ dir := trim(map(dir, "/", "\\"), '\\')
+
+ # Put dir listing into a temp file.
+ system("dir "||dir||" > "||temp_name)
+
+ # Put tempfile entries into a list, removing blank- and
+ # space-initial lines. Exclude directories (i.e. return file
+ # names only).
+ in_dir := open(temp_name,"r") |
+ stop("Can't open temp file in directory ",temp_dir,".")
+ filename_list := list()
+ every filename := ("" ~== !in_dir) do {
+ match(" ",filename) | find(" <DIR>", filename) & next
+ # Exclude our own tempfiles (may not always be appropriate).
+ filename ?:= trim(trim(tab(10)) || "." || tab(13), '. ')
+ put(filename_list, map(dir || filename))
+ }
+
+ # Clean up.
+ close(in_dir) & remove(temp_name)
+
+ # Check to be sure we actually managed to read some files.
+ if *filename_list = 0 then fail
+ else return sort(filename_list)
+
+end
+
+
+
+procedure get_dos_tempname(dir)
+ local temp_name, temp_file
+
+ # Don't clobber existing files. Get a unique temp file name for
+ # use as a temporary storage site.
+
+ every temp_name := dir || "icondir." || right(string(1 to 999),3,"0") do {
+ temp_file := open(temp_name,"r") | break
+ close(temp_file)
+ }
+ return \temp_name
+
+end
+
+
+
+procedure unix_get_dir(dir)
+ local filename_list, in_dir, filename
+
+ dir := trim(dir, '/') || "/"
+ filename_list := list()
+ in_dir := open("/bin/ls -F "||dir, "pr")
+ every filename := ("" ~== !in_dir) do {
+ match("/",filename,*filename) & next
+ put(filename_list, trim(dir || filename, '*'))
+ }
+ close(in_dir)
+
+ if *filename_list = 0 then fail
+ else return filename_list
+
+end