Charles.Forsyth20060303a828770d19 years agoHistory
184 lines · 3.3 KB · Brainfuck
RawDownload
implement Tcs; include "sys.m";include "draw.m";include "arg.m";include "bufio.m";include "convcs.m"; Tcs : module {	init : fn (nil : ref Draw->Context, args : list of string);}; sys : Sys;convcs : Convcs;bufio : Bufio; Iobuf : import bufio; stderr : ref Sys->FD; usage(){	sys->fprint(stderr, "tcs [-C configfile] [-l] [-f ics] [-t ocs] file ...\n");	raise "fail:usage";} init(nil : ref Draw->Context, args : list of string){	sys = load Sys Sys->PATH;	stderr = sys->fildes(2);	if ((arg := load Arg Arg->PATH) == nil)		badmodule(Arg->PATH);	if ((bufio = load Bufio Bufio->PATH) == nil)		badmodule(Bufio->PATH);	if ((convcs = load Convcs Convcs->PATH) == nil)		badmodule(Convcs->PATH); 	arg->init(args);	lflag, vflag : int = 0;	ics, ocs : string = "utf8";	csfile := "";	while ((c := arg->opt()) != 0) {		case c {		'C' =>			csfile = arg->arg();		'f' =>			ics = arg->arg();		'l' =>			lflag = 1;		't' =>			ocs = arg->arg();		'v' =>			vflag = 1;		* =>			usage();		}	}	file := arg->arg(); 	out := bufio->fopen(sys->fildes(1), Sys->OWRITE);	err := convcs->init(csfile);	if (err != nil) {		sys->fprint(stderr, "convcs: %s\n", err);		raise "fail:init";	} 	if (lflag) {		if (file != nil)			dumpaliases(out, file, vflag);		else			dumpconvs(out, vflag);		return;	}		stob : Stob;	btos : Btos;	(stob, err) = convcs->getstob(ocs);	if (err != nil) {		sys->fprint(stderr, "%s: %s\n", ocs, err);		raise "fail:badarg";	}	(btos, err) = convcs->getbtos(ics);	if (err != nil) {		sys->fprint(stderr, "%s: %s\n", ics, err);		raise "fail:badarg";	} 	fd := sys->fildes(0);	if (file != nil)		fd = open(file); 	inbuf := array [Sys->ATOMICIO] of byte;	start := 0;	while (fd != nil) {		btoss : Convcs->State = nil;		stobs : Convcs->State = nil; 		while ((n := sys->read(fd, inbuf[start:], len inbuf - start)) > 0) {			s := "";			nc := 0;			outbuf : array of byte = nil;			(btoss, s, nc) = btos->btos(btoss, inbuf[0:n], -1);			if (s != nil)				(stobs, outbuf) = stob->stob(stobs, s);			if (outbuf != nil) {				out.write(outbuf, len outbuf);			}			# copy down unconverted part of buffer			start = n - nc;			if (start && nc)				inbuf[:] = inbuf[nc:n];		} 		out.flush();		file = arg->arg();		if (file == nil)			break;		fd = open(file);	}} badmodule(s : string){	sys->fprint(stderr, "cannot load module %s: %r\n", s);	raise "fail:init";} dumpconvs(out : ref Iobuf, verbose : int){	first := 1;	for (csl := convcs->enumcs(); csl != nil; csl = tl csl) {		(name, desc, mode) := hd csl;		if (!verbose) {			if (!first)				out.putc(' ');			out.puts(name);		} else {			ms := "";			case mode {			Convcs->BTOS =>				ms = "(from)";			Convcs->STOB =>				ms = "(to)";			}			out.puts(sys->sprint("%s%s\t%s\n", name, ms, desc));		}		first = 0;	}	if (!verbose)		out.putc('\n');	out.flush();} dumpaliases(out : ref Iobuf, cs : string, verbose : int){	(desc, asl) := convcs->aliases(cs);	if (asl == nil) {		sys->fprint(stderr, "%s\n", desc);		return;	} 	if (verbose) {		out.puts(desc);		out.putc('\n');	}	first := 1;	for (; asl != nil; asl = tl asl) {		a := hd asl;		if (!first)			out.putc(' ');		out.puts(a);		first = 0;	}	out.putc('\n');	out.flush();} open(path : string) : ref Sys->FD{	fd := sys->open(path, Bufio->OREAD);	if (fd == nil)		sys->fprint(stderr, "cannot open %s: %r\n", path);	return fd;}