mirror of
https://github.com/9fans/plan9port.git
synced 2025-01-15 11:20:03 +00:00
160 lines
1.9 KiB
C
160 lines
1.9 KiB
C
|
/*
|
||
|
*
|
||
|
* 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);
|
||
|
}
|