debugger
This commit is contained in:
parent
a84cbb2a17
commit
84114f0665
15 changed files with 3179 additions and 0 deletions
159
src/cmd/db/output.c
Normal file
159
src/cmd/db/output.c
Normal file
|
|
@ -0,0 +1,159 @@
|
|||
/*
|
||||
*
|
||||
* 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);
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue