/* | |
* | |
* 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); | |
} |