xref: /plan9/sys/src/cmd/db/output.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
13e12c5d1SDavid du Colombier /*
23e12c5d1SDavid du Colombier  *
33e12c5d1SDavid du Colombier  *	debugger
43e12c5d1SDavid du Colombier  *
53e12c5d1SDavid du Colombier  */
63e12c5d1SDavid du Colombier 
73e12c5d1SDavid du Colombier #include "defs.h"
83e12c5d1SDavid du Colombier #include "fns.h"
93e12c5d1SDavid du Colombier 
10*9a747e4fSDavid du Colombier int	printcol = 0;
113e12c5d1SDavid du Colombier int	infile = STDIN;
123e12c5d1SDavid du Colombier int	maxpos = MAXPOS;
133e12c5d1SDavid du Colombier 
143e12c5d1SDavid du Colombier Biobuf	stdout;
153e12c5d1SDavid du Colombier 
163e12c5d1SDavid du Colombier void
printc(int c)173e12c5d1SDavid du Colombier printc(int c)
183e12c5d1SDavid du Colombier {
193e12c5d1SDavid du Colombier 	dprint("%c", c);
203e12c5d1SDavid du Colombier }
213e12c5d1SDavid du Colombier 
22*9a747e4fSDavid du Colombier /* was move to next f1-sized tab stop; now just print a tab */
233e12c5d1SDavid du Colombier int
tconv(Fmt * f)24*9a747e4fSDavid du Colombier tconv(Fmt *f)
253e12c5d1SDavid du Colombier {
26*9a747e4fSDavid du Colombier 	return fmtstrcpy(f, "\t");
273e12c5d1SDavid du Colombier }
283e12c5d1SDavid du Colombier 
293e12c5d1SDavid du Colombier void
flushbuf(void)303e12c5d1SDavid du Colombier flushbuf(void)
313e12c5d1SDavid du Colombier {
323e12c5d1SDavid du Colombier  	if (printcol != 0)
333e12c5d1SDavid du Colombier 		printc(EOR);
343e12c5d1SDavid du Colombier }
353e12c5d1SDavid du Colombier 
363e12c5d1SDavid du Colombier void
prints(char * s)373e12c5d1SDavid du Colombier prints(char *s)
383e12c5d1SDavid du Colombier {
393e12c5d1SDavid du Colombier 	dprint("%s",s);
403e12c5d1SDavid du Colombier }
413e12c5d1SDavid du Colombier 
423e12c5d1SDavid du Colombier void
newline(void)433e12c5d1SDavid du Colombier newline(void)
443e12c5d1SDavid du Colombier {
453e12c5d1SDavid du Colombier 	printc(EOR);
463e12c5d1SDavid du Colombier }
473e12c5d1SDavid du Colombier 
483e12c5d1SDavid du Colombier #define	MAXIFD	5
493e12c5d1SDavid du Colombier struct {
503e12c5d1SDavid du Colombier 	int	fd;
513e12c5d1SDavid du Colombier 	int	r9;
523e12c5d1SDavid du Colombier } istack[MAXIFD];
533e12c5d1SDavid du Colombier int	ifiledepth;
543e12c5d1SDavid du Colombier 
553e12c5d1SDavid du Colombier void
iclose(int stack,int err)563e12c5d1SDavid du Colombier iclose(int stack, int err)
573e12c5d1SDavid du Colombier {
583e12c5d1SDavid du Colombier 	if (err) {
593e12c5d1SDavid du Colombier 		if (infile) {
603e12c5d1SDavid du Colombier 			close(infile);
613e12c5d1SDavid du Colombier 			infile=STDIN;
623e12c5d1SDavid du Colombier 		}
633e12c5d1SDavid du Colombier 		while (--ifiledepth >= 0)
643e12c5d1SDavid du Colombier 			if (istack[ifiledepth].fd)
653e12c5d1SDavid du Colombier 				close(istack[ifiledepth].fd);
663e12c5d1SDavid du Colombier 		ifiledepth = 0;
673e12c5d1SDavid du Colombier 	} else if (stack == 0) {
683e12c5d1SDavid du Colombier 		if (infile) {
693e12c5d1SDavid du Colombier 			close(infile);
703e12c5d1SDavid du Colombier 			infile=STDIN;
713e12c5d1SDavid du Colombier 		}
723e12c5d1SDavid du Colombier 	} else if (stack > 0) {
733e12c5d1SDavid du Colombier 		if (ifiledepth >= MAXIFD)
743e12c5d1SDavid du Colombier 			error("$<< nested too deeply");
753e12c5d1SDavid du Colombier 		istack[ifiledepth].fd = infile;
763e12c5d1SDavid du Colombier 		ifiledepth++;
773e12c5d1SDavid du Colombier 		infile = STDIN;
783e12c5d1SDavid du Colombier 	} else {
793e12c5d1SDavid du Colombier 		if (infile) {
803e12c5d1SDavid du Colombier 			close(infile);
813e12c5d1SDavid du Colombier 			infile=STDIN;
823e12c5d1SDavid du Colombier 		}
833e12c5d1SDavid du Colombier 		if (ifiledepth > 0) {
843e12c5d1SDavid du Colombier 			infile = istack[--ifiledepth].fd;
853e12c5d1SDavid du Colombier 		}
863e12c5d1SDavid du Colombier 	}
873e12c5d1SDavid du Colombier }
883e12c5d1SDavid du Colombier 
893e12c5d1SDavid du Colombier void
oclose(void)903e12c5d1SDavid du Colombier oclose(void)
913e12c5d1SDavid du Colombier {
923e12c5d1SDavid du Colombier 	flushbuf();
93219b2ee8SDavid du Colombier 	Bterm(&stdout);
943e12c5d1SDavid du Colombier 	Binit(&stdout, 1, OWRITE);
953e12c5d1SDavid du Colombier }
963e12c5d1SDavid du Colombier 
973e12c5d1SDavid du Colombier void
redirout(char * file)983e12c5d1SDavid du Colombier redirout(char *file)
993e12c5d1SDavid du Colombier {
1003e12c5d1SDavid du Colombier 	int fd;
1013e12c5d1SDavid du Colombier 
1023e12c5d1SDavid du Colombier 	if (file == 0){
1033e12c5d1SDavid du Colombier 		oclose();
1043e12c5d1SDavid du Colombier 		return;
1053e12c5d1SDavid du Colombier 	}
1063e12c5d1SDavid du Colombier 	flushbuf();
1073e12c5d1SDavid du Colombier 	if ((fd = open(file, 1)) >= 0)
1083e12c5d1SDavid du Colombier 		seek(fd, 0L, 2);
1093e12c5d1SDavid du Colombier 	else if ((fd = create(file, 1, 0666)) < 0)
1103e12c5d1SDavid du Colombier 		error("cannot create");
111219b2ee8SDavid du Colombier 	Bterm(&stdout);
1123e12c5d1SDavid du Colombier 	Binit(&stdout, fd, OWRITE);
1133e12c5d1SDavid du Colombier }
1143e12c5d1SDavid du Colombier 
1153e12c5d1SDavid du Colombier void
endline(void)1163e12c5d1SDavid du Colombier endline(void)
1173e12c5d1SDavid du Colombier {
1183e12c5d1SDavid du Colombier 
119*9a747e4fSDavid du Colombier 	if (maxpos <= printcol)
1203e12c5d1SDavid du Colombier 		newline();
1213e12c5d1SDavid du Colombier }
1223e12c5d1SDavid du Colombier 
1233e12c5d1SDavid du Colombier void
flush(void)1243e12c5d1SDavid du Colombier flush(void)
1253e12c5d1SDavid du Colombier {
1263e12c5d1SDavid du Colombier 	Bflush(&stdout);
1273e12c5d1SDavid du Colombier }
1283e12c5d1SDavid du Colombier 
1293e12c5d1SDavid du Colombier int
dprint(char * fmt,...)1303e12c5d1SDavid du Colombier dprint(char *fmt, ...)
1313e12c5d1SDavid du Colombier {
132*9a747e4fSDavid du Colombier 	int n, w;
133*9a747e4fSDavid du Colombier 	char *p;
134*9a747e4fSDavid du Colombier  	char buf[4096];
135*9a747e4fSDavid du Colombier 	Rune r;
1367dd7cddfSDavid du Colombier 	va_list arg;
1373e12c5d1SDavid du Colombier 
1383e12c5d1SDavid du Colombier 	if(mkfault)
1393e12c5d1SDavid du Colombier 		return -1;
1407dd7cddfSDavid du Colombier 	va_start(arg, fmt);
141*9a747e4fSDavid du Colombier 	n = vseprint(buf, buf+sizeof buf, fmt, arg) - buf;
1427dd7cddfSDavid du Colombier 	va_end(arg);
143*9a747e4fSDavid du Colombier //Bprint(&stdout, "[%s]", fmt);
144*9a747e4fSDavid du Colombier 	Bwrite(&stdout, buf, n);
145*9a747e4fSDavid du Colombier 	for(p=buf; *p; p+=w){
146*9a747e4fSDavid du Colombier 		w = chartorune(&r, p);
147*9a747e4fSDavid du Colombier 		if(r == '\n')
148*9a747e4fSDavid du Colombier 			printcol = 0;
149*9a747e4fSDavid du Colombier 		else
150*9a747e4fSDavid du Colombier 			printcol++;
151*9a747e4fSDavid du Colombier 	}
1523e12c5d1SDavid du Colombier 	return n;
1533e12c5d1SDavid du Colombier }
1543e12c5d1SDavid du Colombier 
1553e12c5d1SDavid du Colombier void
outputinit(void)1563e12c5d1SDavid du Colombier outputinit(void)
1573e12c5d1SDavid du Colombier {
1583e12c5d1SDavid du Colombier 	Binit(&stdout, 1, OWRITE);
1593e12c5d1SDavid du Colombier 	fmtinstall('t', tconv);
1603e12c5d1SDavid du Colombier }
161