[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: some dumb questions

> scrambling parts of ls.b, grep.b and du.b

The way I mirror changes from the main Inferno source tree to various
outlying development computers uses a similar tool, reproduced below.
You can adapt it to your own needs or even add a "find" user interface,
if that's what you want.  My main point is that I personally find it
clean enough to invoke programs from other programs that I don't resort
as quickly to a shell script as I did in Unix.

Best wishes, Eric

# variant of "du -nt|grep" for excluding selected directories and files
# Copyright (c) 1996 Bell Laboratories. All Rights Reserved.
implement dux;
include "sys.m";
	sys: Sys;
	print, sprint: import sys;
include "draw.m";
include "lib.m";
	readdir: Readdir;
include "regex.m";
	regex: Regex;
dux: module{
	init:	fn(nil: ref Draw->Context, arg: list of string);

Error(mess: string){
	sys->fprint(sys->fildes(2),"dux: %s: %r\n",mess);

init(ctxt: ref Draw->Context, nil: list of string){
	sys = load Sys Sys->PATH;
	readdir = load Readdir Readdir->PATH;
	regex = load Regex Regex->PATH;

	# get top-level directories and exclude a few
	xpat := "^(bin|chan|cmd|dev|ftp|keydb|net|nvfs|os|prog|usr|utils)$";
	exclude := regex->compile(xpat);
	if(exclude==nil) Error(sprint("bad pattern for regex: %s",xpat));
 	(de, nde) := readdir->init(".",readdir->NAME);
	dirs: list of string;
	for(i:=nde-1; i>=0; i--){
		s := de[i].name;
		(matchl,nil) := regex->execute(exclude,s);
			dirs = s :: dirs;

	# use /tmp, since Inferno pipes are being worked on.
	tmpname := "/tmp/dux"+string ((sys->millisec()/10)%99999);
	tmp := sys->create(tmpname,sys->OWRITE,8r664);
	if(tmp==nil) Error(sprint("can't create %s",tmpname));

	waitfd := sys->open("#p/"+string sys->pctl(0, nil)+"/wait",sys->OREAD);
	spawn du(ctxt,dirs,tmp);
	sys->read(waitfd,array[1] of byte,1);

	xpat = tmpname+" |^services/webget/webget.log|"+
		"\\.(dis|sbl|obj|lib|exe|pdb|ilk|a[58kv]|[ao58kv]) |"+
		"/([58kv].out|acid) |^appl/.*\\.s ";
	grep := load dux "/dis/grep.dis";

	tmp = nil;
		Error(sprint("can't rm %s",tmpname));

du(ctxt:ref Draw->Context, dirs:list of string, tmp:ref sys->FD){
	# the second arg of pctl recently changed to list of int.
	du := load dux "/dis/du.dis";