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