Blame


1 4a4a7c3e 2004-04-25 devnull /*
2 4a4a7c3e 2004-04-25 devnull * mc - columnate
3 4a4a7c3e 2004-04-25 devnull *
4 4a4a7c3e 2004-04-25 devnull * mc[-][-LINEWIDTH][-t][file...]
5 4a4a7c3e 2004-04-25 devnull * - causes break on colon
6 4a4a7c3e 2004-04-25 devnull * -LINEWIDTH sets width of line in which to columnate(default 80)
7 4a4a7c3e 2004-04-25 devnull * -t suppresses expanding multiple blanks into tabs
8 4a4a7c3e 2004-04-25 devnull *
9 4a4a7c3e 2004-04-25 devnull */
10 4a4a7c3e 2004-04-25 devnull #include <u.h>
11 4a4a7c3e 2004-04-25 devnull #include <sys/ioctl.h>
12 5802b09e 2020-05-08 rsc #include <termios.h>
13 5802b09e 2020-05-08 rsc #ifdef HAS_SYS_TERMIOS
14 4a4a7c3e 2004-04-25 devnull #include <sys/termios.h>
15 5802b09e 2020-05-08 rsc #endif
16 4a4a7c3e 2004-04-25 devnull #include <libc.h>
17 4a4a7c3e 2004-04-25 devnull #include <draw.h>
18 4a4a7c3e 2004-04-25 devnull #include <bio.h>
19 4a4a7c3e 2004-04-25 devnull #include <fcall.h>
20 8cc98332 2005-01-04 devnull #include <9pclient.h>
21 4a4a7c3e 2004-04-25 devnull #include <thread.h>
22 4a4a7c3e 2004-04-25 devnull
23 4a4a7c3e 2004-04-25 devnull #define WIDTH 80
24 4a4a7c3e 2004-04-25 devnull #define TAB 4
25 4a4a7c3e 2004-04-25 devnull #define WORD_ALLOC_QUANTA 1024
26 4a4a7c3e 2004-04-25 devnull #define ALLOC_QUANTA 4096
27 4a4a7c3e 2004-04-25 devnull
28 4a4a7c3e 2004-04-25 devnull int wordsize(Rune*, int);
29 4a4a7c3e 2004-04-25 devnull int nexttab(int);
30 4a4a7c3e 2004-04-25 devnull
31 4a4a7c3e 2004-04-25 devnull int tabwid;
32 fb5ca0b9 2004-04-25 devnull int mintab = 1;
33 4a4a7c3e 2004-04-25 devnull int linewidth=WIDTH;
34 4a4a7c3e 2004-04-25 devnull int colonflag=0;
35 4a4a7c3e 2004-04-25 devnull int tabflag=0; /* -t flag turned off forever, except in acme */
36 4a4a7c3e 2004-04-25 devnull Rune *cbuf, *cbufp;
37 4a4a7c3e 2004-04-25 devnull Rune **word;
38 4a4a7c3e 2004-04-25 devnull int maxwidth=0;
39 4a4a7c3e 2004-04-25 devnull int nalloc=ALLOC_QUANTA;
40 4a4a7c3e 2004-04-25 devnull int nwalloc=WORD_ALLOC_QUANTA;
41 4a4a7c3e 2004-04-25 devnull int nchars=0;
42 4a4a7c3e 2004-04-25 devnull int nwords=0;
43 4a4a7c3e 2004-04-25 devnull Biobuf bin;
44 4a4a7c3e 2004-04-25 devnull Biobuf bout;
45 4a4a7c3e 2004-04-25 devnull
46 4a4a7c3e 2004-04-25 devnull void getwidth(void), readbuf(int), error(char *);
47 4a4a7c3e 2004-04-25 devnull void scanwords(void), columnate(void), morechars(void);
48 4a4a7c3e 2004-04-25 devnull
49 4a4a7c3e 2004-04-25 devnull void
50 4a4a7c3e 2004-04-25 devnull threadmain(int argc, char *argv[])
51 4a4a7c3e 2004-04-25 devnull {
52 4a4a7c3e 2004-04-25 devnull int i;
53 4a4a7c3e 2004-04-25 devnull int lineset;
54 4a4a7c3e 2004-04-25 devnull int ifd;
55 4a4a7c3e 2004-04-25 devnull
56 4a4a7c3e 2004-04-25 devnull lineset = 0;
57 4a4a7c3e 2004-04-25 devnull Binit(&bout, 1, OWRITE);
58 4a4a7c3e 2004-04-25 devnull while(argc > 1 && argv[1][0] == '-'){
59 4a4a7c3e 2004-04-25 devnull --argc; argv++;
60 4a4a7c3e 2004-04-25 devnull switch(argv[0][1]){
61 4a4a7c3e 2004-04-25 devnull case '\0':
62 4a4a7c3e 2004-04-25 devnull colonflag = 1;
63 4a4a7c3e 2004-04-25 devnull break;
64 4a4a7c3e 2004-04-25 devnull case 't':
65 4a4a7c3e 2004-04-25 devnull tabflag = 0;
66 4a4a7c3e 2004-04-25 devnull break;
67 4a4a7c3e 2004-04-25 devnull default:
68 4a4a7c3e 2004-04-25 devnull linewidth = atoi(&argv[0][1]);
69 4a4a7c3e 2004-04-25 devnull if(linewidth <= 1)
70 4a4a7c3e 2004-04-25 devnull linewidth = WIDTH;
71 4a4a7c3e 2004-04-25 devnull lineset = 1;
72 4a4a7c3e 2004-04-25 devnull break;
73 4a4a7c3e 2004-04-25 devnull }
74 4a4a7c3e 2004-04-25 devnull }
75 4a4a7c3e 2004-04-25 devnull if(lineset == 0)
76 4a4a7c3e 2004-04-25 devnull getwidth();
77 4a4a7c3e 2004-04-25 devnull cbuf = cbufp = malloc(ALLOC_QUANTA*(sizeof *cbuf));
78 4a4a7c3e 2004-04-25 devnull word = malloc(WORD_ALLOC_QUANTA*(sizeof *word));
79 4a4a7c3e 2004-04-25 devnull if(word == 0 || cbuf == 0)
80 4a4a7c3e 2004-04-25 devnull error("out of memory");
81 4a4a7c3e 2004-04-25 devnull if(argc == 1)
82 4a4a7c3e 2004-04-25 devnull readbuf(0);
83 4a4a7c3e 2004-04-25 devnull else{
84 4a4a7c3e 2004-04-25 devnull for(i = 1; i < argc; i++){
85 4a4a7c3e 2004-04-25 devnull if((ifd = open(*++argv, OREAD)) == -1)
86 4a4a7c3e 2004-04-25 devnull fprint(2, "mc: can't open %s (%r)\n", *argv);
87 4a4a7c3e 2004-04-25 devnull else{
88 4a4a7c3e 2004-04-25 devnull readbuf(ifd);
89 4a4a7c3e 2004-04-25 devnull Bflush(&bin);
90 4a4a7c3e 2004-04-25 devnull close(ifd);
91 4a4a7c3e 2004-04-25 devnull }
92 4a4a7c3e 2004-04-25 devnull }
93 4a4a7c3e 2004-04-25 devnull }
94 4a4a7c3e 2004-04-25 devnull columnate();
95 ecdecae3 2004-04-25 devnull Bflush(&bout);
96 8cc98332 2005-01-04 devnull threadexitsall(0);
97 4a4a7c3e 2004-04-25 devnull }
98 4a4a7c3e 2004-04-25 devnull void
99 4a4a7c3e 2004-04-25 devnull error(char *s)
100 4a4a7c3e 2004-04-25 devnull {
101 4a4a7c3e 2004-04-25 devnull fprint(2, "mc: %s\n", s);
102 8cc98332 2005-01-04 devnull threadexitsall(s);
103 4a4a7c3e 2004-04-25 devnull }
104 4a4a7c3e 2004-04-25 devnull void
105 4a4a7c3e 2004-04-25 devnull readbuf(int fd)
106 4a4a7c3e 2004-04-25 devnull {
107 4a4a7c3e 2004-04-25 devnull int lastwascolon = 0;
108 4a4a7c3e 2004-04-25 devnull long c;
109 4a4a7c3e 2004-04-25 devnull int linesiz = 0;
110 4a4a7c3e 2004-04-25 devnull
111 4a4a7c3e 2004-04-25 devnull Binit(&bin, fd, OREAD);
112 4a4a7c3e 2004-04-25 devnull do{
113 4a4a7c3e 2004-04-25 devnull if(nchars++ >= nalloc)
114 4a4a7c3e 2004-04-25 devnull morechars();
115 4a4a7c3e 2004-04-25 devnull *cbufp++ = c = Bgetrune(&bin);
116 4a4a7c3e 2004-04-25 devnull linesiz++;
117 4a4a7c3e 2004-04-25 devnull if(c == '\t') {
118 4a4a7c3e 2004-04-25 devnull cbufp[-1] = L' ';
119 4a4a7c3e 2004-04-25 devnull while(linesiz%TAB != 0) {
120 4a4a7c3e 2004-04-25 devnull if(nchars++ >= nalloc)
121 4a4a7c3e 2004-04-25 devnull morechars();
122 4a4a7c3e 2004-04-25 devnull *cbufp++ = L' ';
123 4a4a7c3e 2004-04-25 devnull linesiz++;
124 4a4a7c3e 2004-04-25 devnull }
125 4a4a7c3e 2004-04-25 devnull }
126 4a4a7c3e 2004-04-25 devnull if(colonflag && c == ':')
127 4a4a7c3e 2004-04-25 devnull lastwascolon++;
128 4a4a7c3e 2004-04-25 devnull else if(lastwascolon){
129 4a4a7c3e 2004-04-25 devnull if(c == '\n'){
130 4a4a7c3e 2004-04-25 devnull --nchars; /* skip newline */
131 4a4a7c3e 2004-04-25 devnull *cbufp = L'\0';
132 4a4a7c3e 2004-04-25 devnull while(nchars > 0 && cbuf[--nchars] != '\n')
133 4a4a7c3e 2004-04-25 devnull ;
134 4a4a7c3e 2004-04-25 devnull if(nchars)
135 4a4a7c3e 2004-04-25 devnull nchars++;
136 4a4a7c3e 2004-04-25 devnull columnate();
137 4a4a7c3e 2004-04-25 devnull if (nchars)
138 4a4a7c3e 2004-04-25 devnull Bputc(&bout, '\n');
139 4a4a7c3e 2004-04-25 devnull Bprint(&bout, "%S", cbuf+nchars);
140 4a4a7c3e 2004-04-25 devnull nchars = 0;
141 4a4a7c3e 2004-04-25 devnull cbufp = cbuf;
142 4a4a7c3e 2004-04-25 devnull }
143 4a4a7c3e 2004-04-25 devnull lastwascolon = 0;
144 4a4a7c3e 2004-04-25 devnull }
145 4a4a7c3e 2004-04-25 devnull if(c == '\n')
146 4a4a7c3e 2004-04-25 devnull linesiz = 0;
147 4a4a7c3e 2004-04-25 devnull }while(c >= 0);
148 4a4a7c3e 2004-04-25 devnull }
149 4a4a7c3e 2004-04-25 devnull void
150 4a4a7c3e 2004-04-25 devnull scanwords(void)
151 4a4a7c3e 2004-04-25 devnull {
152 4a4a7c3e 2004-04-25 devnull Rune *p, *q;
153 4a4a7c3e 2004-04-25 devnull int i, w;
154 4a4a7c3e 2004-04-25 devnull
155 4a4a7c3e 2004-04-25 devnull nwords=0;
156 4a4a7c3e 2004-04-25 devnull maxwidth=0;
157 4a4a7c3e 2004-04-25 devnull for(p = q = cbuf, i = 0; i < nchars; i++){
158 4a4a7c3e 2004-04-25 devnull if(*p++ == L'\n'){
159 4a4a7c3e 2004-04-25 devnull if(nwords >= nwalloc){
160 4a4a7c3e 2004-04-25 devnull nwalloc += WORD_ALLOC_QUANTA;
161 4a4a7c3e 2004-04-25 devnull if((word = realloc(word, nwalloc*sizeof(*word)))==0)
162 4a4a7c3e 2004-04-25 devnull error("out of memory");
163 4a4a7c3e 2004-04-25 devnull }
164 4a4a7c3e 2004-04-25 devnull word[nwords++] = q;
165 4a4a7c3e 2004-04-25 devnull p[-1] = L'\0';
166 4a4a7c3e 2004-04-25 devnull w = wordsize(q, p-q-1);
167 4a4a7c3e 2004-04-25 devnull if(w > maxwidth)
168 4a4a7c3e 2004-04-25 devnull maxwidth = w;
169 4a4a7c3e 2004-04-25 devnull q = p;
170 4a4a7c3e 2004-04-25 devnull }
171 4a4a7c3e 2004-04-25 devnull }
172 4a4a7c3e 2004-04-25 devnull }
173 4a4a7c3e 2004-04-25 devnull
174 4a4a7c3e 2004-04-25 devnull void
175 4a4a7c3e 2004-04-25 devnull columnate(void)
176 4a4a7c3e 2004-04-25 devnull {
177 4a4a7c3e 2004-04-25 devnull int i, j;
178 4a4a7c3e 2004-04-25 devnull int words_per_line;
179 4a4a7c3e 2004-04-25 devnull int nlines;
180 4a4a7c3e 2004-04-25 devnull int col;
181 4a4a7c3e 2004-04-25 devnull int endcol;
182 4a4a7c3e 2004-04-25 devnull
183 4a4a7c3e 2004-04-25 devnull
184 4a4a7c3e 2004-04-25 devnull scanwords();
185 4a4a7c3e 2004-04-25 devnull if(nwords==0)
186 4a4a7c3e 2004-04-25 devnull return;
187 4a4a7c3e 2004-04-25 devnull maxwidth = nexttab(maxwidth+mintab-1);
188 4a4a7c3e 2004-04-25 devnull words_per_line = linewidth/maxwidth;
189 4a4a7c3e 2004-04-25 devnull if(words_per_line <= 0)
190 4a4a7c3e 2004-04-25 devnull words_per_line = 1;
191 4a4a7c3e 2004-04-25 devnull nlines=(nwords+words_per_line-1)/words_per_line;
192 4a4a7c3e 2004-04-25 devnull for(i = 0; i < nlines; i++){
193 4a4a7c3e 2004-04-25 devnull col = endcol = 0;
194 4a4a7c3e 2004-04-25 devnull for(j = i; j < nwords; j += nlines){
195 4a4a7c3e 2004-04-25 devnull endcol += maxwidth;
196 4a4a7c3e 2004-04-25 devnull Bprint(&bout, "%S", word[j]);
197 4a4a7c3e 2004-04-25 devnull col += wordsize(word[j], runestrlen(word[j]));
198 4a4a7c3e 2004-04-25 devnull if(j+nlines < nwords){
199 4a4a7c3e 2004-04-25 devnull if(tabflag) {
200 4a4a7c3e 2004-04-25 devnull while(col < endcol){
201 4a4a7c3e 2004-04-25 devnull Bputc(&bout, '\t');
202 4a4a7c3e 2004-04-25 devnull col = nexttab(col);
203 4a4a7c3e 2004-04-25 devnull }
204 4a4a7c3e 2004-04-25 devnull }else{
205 4a4a7c3e 2004-04-25 devnull while(col < endcol){
206 4a4a7c3e 2004-04-25 devnull Bputc(&bout, ' ');
207 4a4a7c3e 2004-04-25 devnull col++;
208 4a4a7c3e 2004-04-25 devnull }
209 4a4a7c3e 2004-04-25 devnull }
210 4a4a7c3e 2004-04-25 devnull }
211 4a4a7c3e 2004-04-25 devnull }
212 4a4a7c3e 2004-04-25 devnull Bputc(&bout, '\n');
213 4a4a7c3e 2004-04-25 devnull }
214 4a4a7c3e 2004-04-25 devnull }
215 4a4a7c3e 2004-04-25 devnull
216 4a4a7c3e 2004-04-25 devnull int
217 4a4a7c3e 2004-04-25 devnull wordsize(Rune *w, int nw)
218 4a4a7c3e 2004-04-25 devnull {
219 4a4a7c3e 2004-04-25 devnull if(nw < 0)
220 4a4a7c3e 2004-04-25 devnull abort();
221 4a4a7c3e 2004-04-25 devnull if(font)
222 4a4a7c3e 2004-04-25 devnull return runestringnwidth(font, w, nw);
223 4a4a7c3e 2004-04-25 devnull return nw;
224 4a4a7c3e 2004-04-25 devnull }
225 4a4a7c3e 2004-04-25 devnull
226 4a4a7c3e 2004-04-25 devnull int
227 4a4a7c3e 2004-04-25 devnull nexttab(int col)
228 4a4a7c3e 2004-04-25 devnull {
229 4a4a7c3e 2004-04-25 devnull if(tabwid){
230 4a4a7c3e 2004-04-25 devnull col += tabwid;
231 4a4a7c3e 2004-04-25 devnull col -= col%tabwid;
232 4a4a7c3e 2004-04-25 devnull return col;
233 4a4a7c3e 2004-04-25 devnull }
234 fb5ca0b9 2004-04-25 devnull return col+1;
235 4a4a7c3e 2004-04-25 devnull }
236 4a4a7c3e 2004-04-25 devnull
237 4a4a7c3e 2004-04-25 devnull void
238 4a4a7c3e 2004-04-25 devnull morechars(void)
239 4a4a7c3e 2004-04-25 devnull {
240 4a4a7c3e 2004-04-25 devnull nalloc += ALLOC_QUANTA;
241 4a4a7c3e 2004-04-25 devnull if((cbuf = realloc(cbuf, nalloc*sizeof(*cbuf))) == 0)
242 4a4a7c3e 2004-04-25 devnull error("out of memory");
243 4a4a7c3e 2004-04-25 devnull cbufp = cbuf+nchars-1;
244 4a4a7c3e 2004-04-25 devnull }
245 4a4a7c3e 2004-04-25 devnull
246 4a4a7c3e 2004-04-25 devnull /*
247 4a4a7c3e 2004-04-25 devnull * These routines discover the width of the display.
248 4a4a7c3e 2004-04-25 devnull * It takes some work. If we do the easy calls to the
249 4a4a7c3e 2004-04-25 devnull * draw library, the screen flashes due to repainting
250 4a4a7c3e 2004-04-25 devnull * when mc exits.
251 4a4a7c3e 2004-04-25 devnull */
252 4a4a7c3e 2004-04-25 devnull int
253 4a4a7c3e 2004-04-25 devnull windowrect(struct winsize *ws)
254 4a4a7c3e 2004-04-25 devnull {
255 4a4a7c3e 2004-04-25 devnull int tty;
256 4a4a7c3e 2004-04-25 devnull
257 4a4a7c3e 2004-04-25 devnull if((tty = open("/dev/tty", OWRITE)) < 0)
258 4a4a7c3e 2004-04-25 devnull tty = 1;
259 4a4a7c3e 2004-04-25 devnull
260 4a4a7c3e 2004-04-25 devnull if(ioctl(tty, TIOCGWINSZ, ws) < 0){
261 4a4a7c3e 2004-04-25 devnull if(tty != 1)
262 4a4a7c3e 2004-04-25 devnull close(tty);
263 4a4a7c3e 2004-04-25 devnull return -1;
264 4a4a7c3e 2004-04-25 devnull }
265 4a4a7c3e 2004-04-25 devnull if(tty != 1)
266 4a4a7c3e 2004-04-25 devnull close(tty);
267 4a4a7c3e 2004-04-25 devnull return 0;
268 4a4a7c3e 2004-04-25 devnull }
269 4a4a7c3e 2004-04-25 devnull
270 4a4a7c3e 2004-04-25 devnull void
271 4a4a7c3e 2004-04-25 devnull getwidth(void)
272 4a4a7c3e 2004-04-25 devnull {
273 8cc98332 2005-01-04 devnull CFsys *fs;
274 96025b1e 2018-03-27 0intro char buf[500], *p, *q, *f[10], *fname;
275 96025b1e 2018-03-27 0intro int fd, n, nf, scale;
276 4a4a7c3e 2004-04-25 devnull struct winsize ws;
277 d296c18e 2017-01-06 rsc Font *f1;
278 4a4a7c3e 2004-04-25 devnull
279 4a4a7c3e 2004-04-25 devnull if((p = getenv("winid")) != nil){
280 4a4a7c3e 2004-04-25 devnull fs = nsmount("acme", "");
281 4a4a7c3e 2004-04-25 devnull if(fs == nil)
282 4a4a7c3e 2004-04-25 devnull return;
283 4a4a7c3e 2004-04-25 devnull snprint(buf, sizeof buf, "acme/%d/ctl", atoi(p));
284 4a4a7c3e 2004-04-25 devnull if((fd = fsopenfd(fs, buf, OREAD)) < 0)
285 4a4a7c3e 2004-04-25 devnull return;
286 4a4a7c3e 2004-04-25 devnull if((n=readn(fd, buf, sizeof buf-1)) <= 0)
287 4a4a7c3e 2004-04-25 devnull return;
288 4a4a7c3e 2004-04-25 devnull buf[n] = 0;
289 4a4a7c3e 2004-04-25 devnull if((nf=tokenize(buf, f, nelem(f))) < 7)
290 4a4a7c3e 2004-04-25 devnull return;
291 96025b1e 2018-03-27 0intro // hidpi font in stringwidth(3) will call scalesubfont,
292 96025b1e 2018-03-27 0intro // which aborts in bytesperline, due to unknow depth,
293 96025b1e 2018-03-27 0intro // without initdraw. We scale by ourselves.
294 96025b1e 2018-03-27 0intro scale = parsefontscale(f[6], &fname);
295 96025b1e 2018-03-27 0intro tabwid = 0;
296 96025b1e 2018-03-27 0intro if(nf >= 8 && (tabwid = atoi(f[7])/scale) == 0)
297 4a4a7c3e 2004-04-25 devnull return;
298 96025b1e 2018-03-27 0intro if((font = openfont(nil, fname)) == nil)
299 4a4a7c3e 2004-04-25 devnull return;
300 4a4a7c3e 2004-04-25 devnull mintab = stringwidth(font, "0");
301 4a4a7c3e 2004-04-25 devnull if(tabwid == 0)
302 4a4a7c3e 2004-04-25 devnull tabwid = mintab*4;
303 96025b1e 2018-03-27 0intro linewidth = atoi(f[5]) / scale;
304 4a4a7c3e 2004-04-25 devnull tabflag = 1;
305 4a4a7c3e 2004-04-25 devnull return;
306 4a4a7c3e 2004-04-25 devnull }
307 4a4a7c3e 2004-04-25 devnull
308 f5ae255c 2014-07-09 rsc if((p = getenv("termprog")) != nil && strcmp(p, "9term") == 0)
309 4a4a7c3e 2004-04-25 devnull if((p = getenv("font")) != nil)
310 4a4a7c3e 2004-04-25 devnull font = openfont(nil, p);
311 fb5ca0b9 2004-04-25 devnull
312 4a4a7c3e 2004-04-25 devnull if(windowrect(&ws) < 0)
313 4a4a7c3e 2004-04-25 devnull return;
314 fb5ca0b9 2004-04-25 devnull if(ws.ws_xpixel == 0)
315 4a4a7c3e 2004-04-25 devnull font = nil;
316 fb5ca0b9 2004-04-25 devnull if(font){
317 d296c18e 2017-01-06 rsc // 9term leaves "is this a hidpi display" in the low bit of the ypixel height.
318 d296c18e 2017-01-06 rsc if(ws.ws_ypixel&1) {
319 d296c18e 2017-01-06 rsc // need hidpi font.
320 d296c18e 2017-01-06 rsc // loadhifpi creates a font that crashes in stringwidth,
321 d296c18e 2017-01-06 rsc // for reasons i don't understand.
322 d296c18e 2017-01-06 rsc // do it ourselves
323 d296c18e 2017-01-06 rsc p = getenv("font");
324 d296c18e 2017-01-06 rsc q = strchr(p, ',');
325 d296c18e 2017-01-06 rsc f1 = nil;
326 d296c18e 2017-01-06 rsc if(q != nil)
327 d296c18e 2017-01-06 rsc f1 = openfont(nil, q+1);
328 d296c18e 2017-01-06 rsc if(f1 != nil)
329 d296c18e 2017-01-06 rsc font = f1;
330 d296c18e 2017-01-06 rsc else
331 d296c18e 2017-01-06 rsc ws.ws_xpixel /= 2;
332 d296c18e 2017-01-06 rsc }
333 fb5ca0b9 2004-04-25 devnull mintab = stringwidth(font, "0");
334 fb5ca0b9 2004-04-25 devnull if((p = getenv("tabstop")) != nil)
335 fb5ca0b9 2004-04-25 devnull tabwid = atoi(p)*mintab;
336 fb5ca0b9 2004-04-25 devnull else
337 fb5ca0b9 2004-04-25 devnull tabwid = 4*mintab;
338 fb5ca0b9 2004-04-25 devnull tabflag = 1;
339 fb5ca0b9 2004-04-25 devnull linewidth = ws.ws_xpixel;
340 fb5ca0b9 2004-04-25 devnull }else
341 fb5ca0b9 2004-04-25 devnull linewidth = ws.ws_col;
342 4a4a7c3e 2004-04-25 devnull }