| /* | 
 |  * | 
 |  *	debugger | 
 |  * | 
 |  */ | 
 |  | 
 | #include "defs.h" | 
 | #include "fns.h" | 
 |  | 
 | int	printcol = 0; | 
 | int	infile = STDIN; | 
 | int	maxpos = MAXPOS; | 
 |  | 
 | Biobuf	bstdout; | 
 |  | 
 | void | 
 | printc(int c) | 
 | { | 
 | 	dprint("%c", c); | 
 | } | 
 |  | 
 | /* was move to next f1-sized tab stop; now just print a tab */ | 
 | int | 
 | tconv(Fmt *f) | 
 | { | 
 | 	return fmtstrcpy(f, "\t"); | 
 | } | 
 |  | 
 | void | 
 | flushbuf(void) | 
 | { | 
 |  	if (printcol != 0) | 
 | 		printc(EOR); | 
 | } | 
 |  | 
 | void | 
 | prints(char *s) | 
 | { | 
 | 	dprint("%s",s); | 
 | } | 
 |  | 
 | void | 
 | newline(void) | 
 | { | 
 | 	printc(EOR); | 
 | } | 
 |  | 
 | #define	MAXIFD	5 | 
 | struct { | 
 | 	int	fd; | 
 | 	int	r9; | 
 | } istack[MAXIFD]; | 
 | int	ifiledepth; | 
 |  | 
 | void | 
 | iclose(int stack, int err) | 
 | { | 
 | 	if (err) { | 
 | 		if (infile) { | 
 | 			close(infile); | 
 | 			infile=STDIN; | 
 | 		} | 
 | 		while (--ifiledepth >= 0) | 
 | 			if (istack[ifiledepth].fd) | 
 | 				close(istack[ifiledepth].fd); | 
 | 		ifiledepth = 0; | 
 | 	} else if (stack == 0) { | 
 | 		if (infile) { | 
 | 			close(infile); | 
 | 			infile=STDIN; | 
 | 		} | 
 | 	} else if (stack > 0) { | 
 | 		if (ifiledepth >= MAXIFD) | 
 | 			error("$<< nested too deeply"); | 
 | 		istack[ifiledepth].fd = infile; | 
 | 		ifiledepth++; | 
 | 		infile = STDIN; | 
 | 	} else { | 
 | 		if (infile) { | 
 | 			close(infile);  | 
 | 			infile=STDIN; | 
 | 		} | 
 | 		if (ifiledepth > 0) { | 
 | 			infile = istack[--ifiledepth].fd; | 
 | 		} | 
 | 	} | 
 | } | 
 |  | 
 | void | 
 | oclose(void) | 
 | { | 
 | 	flushbuf(); | 
 | 	Bterm(&bstdout); | 
 | 	Binit(&bstdout, 1, OWRITE); | 
 | } | 
 |  | 
 | void | 
 | redirout(char *file) | 
 | { | 
 | 	int fd; | 
 |  | 
 | 	if (file == 0){ | 
 | 		oclose(); | 
 | 		return; | 
 | 	} | 
 | 	flushbuf(); | 
 | 	if ((fd = open(file, 1)) >= 0) | 
 | 		seek(fd, 0L, 2); | 
 | 	else if ((fd = create(file, 1, 0666)) < 0) | 
 | 		error("cannot create"); | 
 | 	Bterm(&bstdout); | 
 | 	Binit(&bstdout, fd, OWRITE); | 
 | } | 
 |  | 
 | void | 
 | endline(void) | 
 | { | 
 |  | 
 | 	if (maxpos <= printcol) | 
 | 		newline(); | 
 | } | 
 |  | 
 | void | 
 | flush(void) | 
 | { | 
 | 	Bflush(&bstdout); | 
 | } | 
 |  | 
 | int | 
 | dprint(char *fmt, ...) | 
 | { | 
 | 	int n, w; | 
 | 	char *p; | 
 |  	char buf[4096]; | 
 | 	Rune r; | 
 | 	va_list arg; | 
 |  | 
 | 	if(mkfault) | 
 | 		return -1; | 
 | 	va_start(arg, fmt); | 
 | 	n = vseprint(buf, buf+sizeof buf, fmt, arg) - buf; | 
 | 	va_end(arg); | 
 | 	Bwrite(&bstdout, buf, n); | 
 | 	for(p=buf; *p; p+=w){ | 
 | 		w = chartorune(&r, p); | 
 | 		if(r == '\n') | 
 | 			printcol = 0; | 
 | 		else | 
 | 			printcol++; | 
 | 	} | 
 | 	return n; | 
 | } | 
 |  | 
 | void | 
 | outputinit(void) | 
 | { | 
 | 	Binit(&bstdout, 1, OWRITE); | 
 | 	fmtinstall('t', tconv); | 
 | } |