[comp.lang.icon] MS-DOS file generator

Paul_Abrahams%Wayne-MTS@UM.CC.UMICH.EDU (09/25/90)

 
In response to Richard's request, here is the MS-DOS file generator that I
posted quite a while ago.  I haven't even looked at it for over a year, but
I don't suppose it has rusted.
 
It would be nice if there were some repository for tidbits like this, but I
guess the Icon project has enough else to do.
 
Paul Abrahams
abrahams%wayne-mts@um.cc.umich.edu
 
====================================================================
# get_filename(pfn) accepts a DOS filename possibly containing wildcards.
# The filename can also include a drive letter and path.
# If the filename ends in "\" or ":", "*.*" is appended.
# The result sequence is a sequence of the filenames corresponding to pfn.
 
procedure get_filename(pfn)
	local asciiz, fnr, prefix, k, name
	local ds, dx, result, fnloc, string_block
#get Disk Transfer Address; filename locn is 30 beyond that
	result := Int86([16r21, 16r2f00] ||| list(7,0))
	fnloc := 16 * result[8] + result[3]+ 30
# get the generalized filename
	fnr := reverse(pfn)
	k := upto("\\:", fnr) | *fnr + 1
	prefix := reverse(fnr[k:0])
	name := "" ~== reverse(fnr[1:k]) | "*.*"
# Get the first file in the sequence
	asciiz := prefix || name || "\x00"
	Poke(string_block := GetSpace(*asciiz), asciiz)
	ds := string_block / 16
	dx := string_block % 16
	result := Int86([16r21, 16r4e00, 0, 0, dx, 0, 0, 0, ds])
	case result[2] of {
		0 : {}
		18 : fail
		default : stop("i/o error ", result[2])
		}
	suspend prefix || extract_name(fnloc)
# Get the remaining files in the sequence
	while Int86([16r21, 16r4f00, 0, 0, 0, 0, 0, 0, 0])[2] = 0 do
		suspend prefix || extract_name(fnloc)
end
 
procedure extract_name(fnloc)
	local asciiz
	asciiz := Peek(fnloc, 13)
	return asciiz[1:upto("\x00", asciiz)]
end