Blame test/fts.awk

Packit Service f629e6
@load "filefuncs"
Packit Service f629e6
Packit Service f629e6
BEGIN {
Packit Service f629e6
	Level = 0
Packit Service f629e6
Packit Service f629e6
	os = ""
Packit Service f629e6
	if (ENVIRON["AWKLIBPATH"] == "sys$disk:[-]") {
Packit Service f629e6
		os = "VMS"
Packit Service f629e6
		system("create/dir/prot=o:rwed [.d1]")
Packit Service f629e6
		system("create/dir/prot=o:rwed [.d2]")
Packit Service f629e6
		system("copy fts.awk [.d1]f1")
Packit Service f629e6
		system("copy fts.awk [.d1]f2")
Packit Service f629e6
		system("copy fts.awk [.d2]f1")
Packit Service f629e6
		system("copy fts.awk [.d2]f2")
Packit Service f629e6
	} else {
Packit Service f629e6
		system("rm -fr d1 d2")
Packit Service f629e6
		system("mkdir d1 d2 ; touch d1/f1 d1/f2 d2/f1 d2/f2")
Packit Service f629e6
	}
Packit Service f629e6
	pathlist[1] = "d1"
Packit Service f629e6
	pathlist[2] = "d2"
Packit Service f629e6
	flags = FTS_PHYSICAL
Packit Service f629e6
	fts(pathlist, flags, data)
Packit Service f629e6
Packit Service f629e6
	output = "fts.ok"
Packit Service f629e6
	traverse(data)
Packit Service f629e6
	close(output)
Packit Service f629e6
Packit Service f629e6
	ftswalk(pathlist, data2)
Packit Service f629e6
	output = "_fts"
Packit Service f629e6
	traverse(data2)
Packit Service f629e6
	close(output)
Packit Service f629e6
Packit Service f629e6
	if (os == "VMS") {
Packit Service f629e6
		system("delete [.d1]*.*;*")
Packit Service f629e6
		system("delete [.d2]*.*;*")
Packit Service f629e6
		system("delete d1.dir;*")
Packit Service f629e6
		system("delete d2.dir;*")
Packit Service f629e6
	} else {
Packit Service f629e6
		system("rm -fr d1 d2")
Packit Service f629e6
	}
Packit Service f629e6
}
Packit Service f629e6
Packit Service f629e6
function indent(        i)
Packit Service f629e6
{
Packit Service f629e6
	for (i = 1; i <= Level; i++)
Packit Service f629e6
		printf("\t") > output
Packit Service f629e6
}
Packit Service f629e6
Packit Service f629e6
function sort_traverse(data,	sorted, i)
Packit Service f629e6
{
Packit Service f629e6
	asorti(data, sorted)
Packit Service f629e6
	for (i = 1; i in sorted; i++) {
Packit Service f629e6
		# 5/2015: skip for atime, since there can
Packit Service f629e6
		# occasionally be small differences.
Packit Service f629e6
		if (sorted[i] == "atime")
Packit Service f629e6
			continue
Packit Service f629e6
Packit Service f629e6
		indent()
Packit Service f629e6
		printf("%s --> %s\n", sorted[i], data[sorted[i]]) > output
Packit Service f629e6
	}
Packit Service f629e6
}
Packit Service f629e6
Packit Service f629e6
function traverse(data,         i)
Packit Service f629e6
{
Packit Service f629e6
	for (i in data) {
Packit Service f629e6
		if (isarray(data[i])) {
Packit Service f629e6
			indent()
Packit Service f629e6
			printf("%s:\n", i) > output
Packit Service f629e6
Packit Service f629e6
			Level++
Packit Service f629e6
			if (("mtime" in data[i]) && ! isarray(data[i]["mtime"])) {
Packit Service f629e6
				sort_traverse(data[i])
Packit Service f629e6
			} else {
Packit Service f629e6
				traverse(data[i])
Packit Service f629e6
			}
Packit Service f629e6
			Level--
Packit Service f629e6
#		} else {
Packit Service f629e6
#			JUNK = 1
Packit Service f629e6
#			if (i != "atime") {
Packit Service f629e6
#				# 4/2015: skip for atime, since there can
Packit Service f629e6
#				# occasionally be small differences.
Packit Service f629e6
#				indent()
Packit Service f629e6
#				printf("%s --> %s\n", i, data[i]) > output
Packit Service f629e6
#			}
Packit Service f629e6
		}
Packit Service f629e6
	}
Packit Service f629e6
}
Packit Service f629e6
Packit Service f629e6
Packit Service f629e6
function ftswalk(pathlist, data,	i, toppath)
Packit Service f629e6
{
Packit Service f629e6
	delete data
Packit Service f629e6
	for (i = 1; i in pathlist; i++) {
Packit Service f629e6
		toppath = pathlist[i]
Packit Service f629e6
		data[toppath]["junk"]++	# create array
Packit Service f629e6
		delete data[toppath]["junk"]
Packit Service f629e6
		process(pathlist[i], data)
Packit Service f629e6
	}
Packit Service f629e6
}
Packit Service f629e6
Packit Service f629e6
# enter process with pathname, array for that path already created but
Packit Service f629e6
# empty
Packit Service f629e6
Packit Service f629e6
function process(pathname, data_array,
Packit Service f629e6
		stat_data, i, direntry, command, shortname)	# locals
Packit Service f629e6
{
Packit Service f629e6
	stat(pathname, stat_data)
Packit Service f629e6
	if (stat_data["type"] == "file") {
Packit Service f629e6
		shortname = strrstr(pathname, "/")
Packit Service f629e6
		data_array["path"] = pathname
Packit Service f629e6
		for (i in stat_data) {
Packit Service f629e6
			if (i == "name")
Packit Service f629e6
				data_array["stat"][i] = shortname
Packit Service f629e6
			else
Packit Service f629e6
				data_array["stat"][i] = stat_data[i]
Packit Service f629e6
		}
Packit Service f629e6
Packit Service f629e6
		return
Packit Service f629e6
	}
Packit Service f629e6
Packit Service f629e6
	# stuff for a directory
Packit Service f629e6
Packit Service f629e6
	data_array[pathname]["."]["path"] = pathname
Packit Service f629e6
	for (i in stat_data)
Packit Service f629e6
		data_array[pathname]["."]["stat"][i] = stat_data[i]
Packit Service f629e6
Packit Service f629e6
	os = ""
Packit Service f629e6
	if (ENVIRON["AWKLIBPATH"] == "sys$disk:[-]") {
Packit Service f629e6
		os = "VMS"
Packit Service f629e6
		# Command in next section not valid on VMS.
Packit Service f629e6
		return
Packit Service f629e6
	}
Packit Service f629e6
Packit Service f629e6
	command = ("ls -f " pathname)
Packit Service f629e6
	while ((command | getline direntry) > 0) {
Packit Service f629e6
		if (direntry == "." || direntry == "..")
Packit Service f629e6
			continue
Packit Service f629e6
		data_array[pathname][direntry]["junk"]++
Packit Service f629e6
		delete data_array[pathname][direntry]["junk"]
Packit Service f629e6
		process(pathname "/" direntry,
Packit Service f629e6
			data_array[pathname][direntry])
Packit Service f629e6
	}
Packit Service f629e6
	close(command)
Packit Service f629e6
}
Packit Service f629e6
Packit Service f629e6
function strrstr(string, delim,		ind)
Packit Service f629e6
{
Packit Service f629e6
	if ((ind = index(string, delim)) == 0)
Packit Service f629e6
		return string
Packit Service f629e6
Packit Service f629e6
	do {
Packit Service f629e6
		string = substr(string, ind + 1)
Packit Service f629e6
	} while ((ind = index(string, delim)) > 0)
Packit Service f629e6
Packit Service f629e6
	return string
Packit Service f629e6
}