]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/db/output.c
merge
[plan9front.git] / sys / src / cmd / db / output.c
1 /*
2  *
3  *      debugger
4  *
5  */
6
7 #include "defs.h"
8 #include "fns.h"
9
10 int     printcol = 0;
11 int     infile = STDIN;
12 int     maxpos = MAXPOS;
13
14 Biobuf  stdout;
15
16 void
17 printc(int c)
18 {
19         dprint("%c", c);
20 }
21
22 /* was move to next f1-sized tab stop; now just print a tab */
23 int
24 tconv(Fmt *f)
25 {
26         return fmtstrcpy(f, "\t");
27 }
28
29 void
30 flushbuf(void)
31 {
32         if (printcol != 0)
33                 printc(EOR);
34 }
35
36 void
37 prints(char *s)
38 {
39         dprint("%s",s);
40 }
41
42 void
43 newline(void)
44 {
45         printc(EOR);
46 }
47
48 #define MAXIFD  5
49 struct {
50         int     fd;
51         int     r9;
52 } istack[MAXIFD];
53 int     ifiledepth;
54
55 void
56 iclose(int stack, int err)
57 {
58         if (err) {
59                 if (infile) {
60                         close(infile);
61                         infile=STDIN;
62                 }
63                 while (--ifiledepth >= 0)
64                         if (istack[ifiledepth].fd)
65                                 close(istack[ifiledepth].fd);
66                 ifiledepth = 0;
67         } else if (stack == 0) {
68                 if (infile) {
69                         close(infile);
70                         infile=STDIN;
71                 }
72         } else if (stack > 0) {
73                 if (ifiledepth >= MAXIFD)
74                         error("$<< nested too deeply");
75                 istack[ifiledepth].fd = infile;
76                 ifiledepth++;
77                 infile = STDIN;
78         } else {
79                 if (infile) {
80                         close(infile); 
81                         infile=STDIN;
82                 }
83                 if (ifiledepth > 0) {
84                         infile = istack[--ifiledepth].fd;
85                 }
86         }
87 }
88
89 void
90 oclose(void)
91 {
92         flushbuf();
93         Bterm(&stdout);
94         Binit(&stdout, 1, OWRITE);
95 }
96
97 void
98 redirout(char *file)
99 {
100         int fd;
101
102         if (file == 0){
103                 oclose();
104                 return;
105         }
106         flushbuf();
107         if ((fd = open(file, 1)) >= 0)
108                 seek(fd, 0L, 2);
109         else if ((fd = create(file, 1, 0666)) < 0)
110                 error("cannot create");
111         Bterm(&stdout);
112         Binit(&stdout, fd, OWRITE);
113 }
114
115 void
116 endline(void)
117 {
118
119         if (maxpos <= printcol)
120                 newline();
121 }
122
123 void
124 flush(void)
125 {
126         Bflush(&stdout);
127 }
128
129 int
130 dprint(char *fmt, ...)
131 {
132         int n, w;
133         char *p;
134         char buf[4096];
135         Rune r;
136         va_list arg;
137
138         if(mkfault)
139                 return -1;
140         va_start(arg, fmt);
141         n = vseprint(buf, buf+sizeof buf, fmt, arg) - buf;
142         va_end(arg);
143 //Bprint(&stdout, "[%s]", fmt);
144         Bwrite(&stdout, buf, n);
145         for(p=buf; *p; p+=w){
146                 w = chartorune(&r, p);
147                 if(r == '\n')
148                         printcol = 0;
149                 else
150                         printcol++;
151         }
152         return n;
153 }
154
155 void
156 outputinit(void)
157 {
158         Binit(&stdout, 1, OWRITE);
159         fmtinstall('t', tconv);
160 }