mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			49 lines
		
	
	
		
			986 B
		
	
	
	
		
			Brainfuck
		
	
	
	
	
	
			
		
		
	
	
			49 lines
		
	
	
		
			986 B
		
	
	
	
		
			Brainfuck
		
	
	
	
	
	
implement Cat;
 | 
						|
 | 
						|
include "sys.m";
 | 
						|
	sys: Sys;
 | 
						|
 | 
						|
include "draw.m";
 | 
						|
 | 
						|
Cat: module
 | 
						|
{
 | 
						|
	init:	fn(ctxt: ref Draw->Context, argv: list of string);
 | 
						|
};
 | 
						|
 | 
						|
stdout: ref Sys->FD;
 | 
						|
 | 
						|
init(nil: ref Draw->Context, args: list of string)
 | 
						|
{
 | 
						|
	sys = load Sys Sys->PATH;
 | 
						|
	stdout = sys->fildes(1);
 | 
						|
	args = tl args;
 | 
						|
	if(args == nil)
 | 
						|
		args = "-" :: nil;
 | 
						|
	for(; args != nil; args = tl args){
 | 
						|
		file := hd args;
 | 
						|
		if(file != "-"){
 | 
						|
			fd := sys->open(file, Sys->OREAD);
 | 
						|
			if(fd == nil){
 | 
						|
				sys->fprint(sys->fildes(2), "cat: cannot open %s: %r\n", file);
 | 
						|
				raise "fail:bad open";
 | 
						|
			}
 | 
						|
			cat(fd, file);
 | 
						|
		}else
 | 
						|
			cat(sys->fildes(0), "<stdin>");
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
cat(fd: ref Sys->FD, file: string)
 | 
						|
{
 | 
						|
	buf := array[Sys->ATOMICIO] of byte;
 | 
						|
	while((n := sys->read(fd, buf, len buf)) > 0)
 | 
						|
		if(sys->write(stdout, buf, n) < n) {
 | 
						|
			sys->fprint(sys->fildes(2), "cat: write error: %r\n");
 | 
						|
			raise "fail:write error";
 | 
						|
		}
 | 
						|
	if(n < 0) {
 | 
						|
		sys->fprint(sys->fildes(2), "cat: error reading %s: %r\n", file);
 | 
						|
		raise "fail:read error";
 | 
						|
	}
 | 
						|
}
 |