Charles.Forsyth20060303a828770d19 years agoHistory
77 lines · 1.5 KB · Brainfuck
RawDownload
implement Touch; include "sys.m";	sys: Sys; include "draw.m"; include "daytime.m";	daytime: Daytime; include "arg.m"; stderr: ref Sys->FD; Touch: module{	init: fn(ctxt: ref Draw->Context, argl: list of string);}; init(nil: ref Draw->Context, args: list of string){	sys = load Sys Sys->PATH;	stderr = sys->fildes(2);	force := 1;	status := 0;	daytime = load Daytime Daytime->PATH;	if(daytime == nil)		cantload(Daytime->PATH);	arg := load Arg Arg->PATH;	if(arg == nil)		cantload(Arg->PATH);	arg->init(args);	arg->setusage("touch [-c] [-t time] file ...");	now := daytime->now();	while((c := arg->opt()) != 0)		case c {		't' =>		now = int arg->earg();		'c' =>	force = 0;		* =>	arg->usage();		}	args = arg->argv();	arg = nil;	if(args == nil)		arg->usage();	for(; args != nil; args = tl args)		status += touch(force, hd args, now);	if(status)		raise "fail:touch";} cantload(s: string){	sys->fprint(stderr, "touch: can't load %s: %r\n", s);	raise "fail:load";} touch(force: int, name: string, now: int): int{	dir := sys->nulldir;	dir.mtime = now;	(rc, nil) := sys->stat(name);	if(rc >= 0){		if(sys->wstat(name, dir) >= 0)			return 0;		force = 0;	# we don't want to create it: it's there, we just can't wstat it	}	if(force == 0) {		sys->fprint(stderr, "touch: %s: cannot change time: %r\n", name);		return 1;	}	if((fd := sys->create(name, Sys->OREAD|Sys->OEXCL, 8r666)) == nil) {		sys->fprint(stderr, "touch: %s: cannot create: %r\n", name);		return 1;	}	sys->fwstat(fd, dir);	return 0;}