Blame


1 84b1cb73 2003-09-30 devnull #include <u.h>
2 84b1cb73 2003-09-30 devnull #include <libc.h>
3 84b1cb73 2003-09-30 devnull #include <draw.h>
4 84b1cb73 2003-09-30 devnull #include <thread.h>
5 84b1cb73 2003-09-30 devnull #include <mouse.h>
6 84b1cb73 2003-09-30 devnull #include <cursor.h>
7 84b1cb73 2003-09-30 devnull #include <keyboard.h>
8 84b1cb73 2003-09-30 devnull #include <frame.h>
9 84b1cb73 2003-09-30 devnull #include "flayer.h"
10 84b1cb73 2003-09-30 devnull #include "samterm.h"
11 84b1cb73 2003-09-30 devnull
12 84b1cb73 2003-09-30 devnull uchar **name; /* first byte is ' ' or '\'': modified state */
13 84b1cb73 2003-09-30 devnull Text **text; /* pointer to Text associated with file */
14 84b1cb73 2003-09-30 devnull ushort *tag; /* text[i].tag, even if text[i] not defined */
15 84b1cb73 2003-09-30 devnull int nname;
16 84b1cb73 2003-09-30 devnull int mname;
17 84b1cb73 2003-09-30 devnull int mw;
18 84b1cb73 2003-09-30 devnull
19 84b1cb73 2003-09-30 devnull char *genmenu3(int);
20 84b1cb73 2003-09-30 devnull char *genmenu2(int);
21 84b1cb73 2003-09-30 devnull char *genmenu2c(int);
22 84b1cb73 2003-09-30 devnull
23 84b1cb73 2003-09-30 devnull enum Menu2
24 84b1cb73 2003-09-30 devnull {
25 84b1cb73 2003-09-30 devnull Cut,
26 84b1cb73 2003-09-30 devnull Paste,
27 84b1cb73 2003-09-30 devnull Snarf,
28 84b1cb73 2003-09-30 devnull Plumb,
29 84b1cb73 2003-09-30 devnull Look,
30 84b1cb73 2003-09-30 devnull Exch,
31 84b1cb73 2003-09-30 devnull Search,
32 84b1cb73 2003-09-30 devnull NMENU2 = Search,
33 84b1cb73 2003-09-30 devnull Send = Search,
34 84b1cb73 2003-09-30 devnull NMENU2C
35 84b1cb73 2003-09-30 devnull };
36 84b1cb73 2003-09-30 devnull
37 84b1cb73 2003-09-30 devnull enum Menu3
38 84b1cb73 2003-09-30 devnull {
39 84b1cb73 2003-09-30 devnull New,
40 84b1cb73 2003-09-30 devnull Zerox,
41 84b1cb73 2003-09-30 devnull Resize,
42 84b1cb73 2003-09-30 devnull Close,
43 84b1cb73 2003-09-30 devnull Write,
44 84b1cb73 2003-09-30 devnull NMENU3
45 84b1cb73 2003-09-30 devnull };
46 84b1cb73 2003-09-30 devnull
47 84b1cb73 2003-09-30 devnull char *menu2str[] = {
48 84b1cb73 2003-09-30 devnull "cut",
49 84b1cb73 2003-09-30 devnull "paste",
50 84b1cb73 2003-09-30 devnull "snarf",
51 84b1cb73 2003-09-30 devnull "plumb",
52 84b1cb73 2003-09-30 devnull "look",
53 84b1cb73 2003-09-30 devnull "<rio>",
54 84b1cb73 2003-09-30 devnull 0, /* storage for last pattern */
55 84b1cb73 2003-09-30 devnull };
56 84b1cb73 2003-09-30 devnull
57 84b1cb73 2003-09-30 devnull char *menu3str[] = {
58 84b1cb73 2003-09-30 devnull "new",
59 84b1cb73 2003-09-30 devnull "zerox",
60 84b1cb73 2003-09-30 devnull "resize",
61 84b1cb73 2003-09-30 devnull "close",
62 cbeb0b26 2006-04-01 devnull "write"
63 84b1cb73 2003-09-30 devnull };
64 84b1cb73 2003-09-30 devnull
65 84b1cb73 2003-09-30 devnull Menu menu2 = {0, genmenu2};
66 84b1cb73 2003-09-30 devnull Menu menu2c ={0, genmenu2c};
67 84b1cb73 2003-09-30 devnull Menu menu3 = {0, genmenu3};
68 84b1cb73 2003-09-30 devnull
69 84b1cb73 2003-09-30 devnull void
70 84b1cb73 2003-09-30 devnull menu2hit(void)
71 84b1cb73 2003-09-30 devnull {
72 84b1cb73 2003-09-30 devnull Text *t=(Text *)which->user1;
73 84b1cb73 2003-09-30 devnull int w = which-t->l;
74 84b1cb73 2003-09-30 devnull int m;
75 84b1cb73 2003-09-30 devnull
76 84b1cb73 2003-09-30 devnull if(hversion==0 || plumbfd<0)
77 84b1cb73 2003-09-30 devnull menu2str[Plumb] = "(plumb)";
78 84b1cb73 2003-09-30 devnull m = menuhit(2, mousectl, t==&cmd? &menu2c : &menu2, nil);
79 84b1cb73 2003-09-30 devnull if(hostlock || t->lock)
80 84b1cb73 2003-09-30 devnull return;
81 84b1cb73 2003-09-30 devnull
82 84b1cb73 2003-09-30 devnull switch(m){
83 84b1cb73 2003-09-30 devnull case Cut:
84 84b1cb73 2003-09-30 devnull cut(t, w, 1, 1);
85 84b1cb73 2003-09-30 devnull break;
86 84b1cb73 2003-09-30 devnull
87 84b1cb73 2003-09-30 devnull case Paste:
88 84b1cb73 2003-09-30 devnull paste(t, w);
89 84b1cb73 2003-09-30 devnull break;
90 84b1cb73 2003-09-30 devnull
91 84b1cb73 2003-09-30 devnull case Snarf:
92 84b1cb73 2003-09-30 devnull snarf(t, w);
93 84b1cb73 2003-09-30 devnull break;
94 84b1cb73 2003-09-30 devnull
95 84b1cb73 2003-09-30 devnull case Plumb:
96 84b1cb73 2003-09-30 devnull if(hversion > 0)
97 84b1cb73 2003-09-30 devnull outTsll(Tplumb, t->tag, which->p0, which->p1);
98 84b1cb73 2003-09-30 devnull break;
99 84b1cb73 2003-09-30 devnull
100 84b1cb73 2003-09-30 devnull case Exch:
101 84b1cb73 2003-09-30 devnull snarf(t, w);
102 84b1cb73 2003-09-30 devnull outT0(Tstartsnarf);
103 84b1cb73 2003-09-30 devnull setlock();
104 84b1cb73 2003-09-30 devnull break;
105 84b1cb73 2003-09-30 devnull
106 84b1cb73 2003-09-30 devnull case Look:
107 84b1cb73 2003-09-30 devnull outTsll(Tlook, t->tag, which->p0, which->p1);
108 84b1cb73 2003-09-30 devnull setlock();
109 84b1cb73 2003-09-30 devnull break;
110 84b1cb73 2003-09-30 devnull
111 84b1cb73 2003-09-30 devnull case Search:
112 84b1cb73 2003-09-30 devnull outcmd();
113 84b1cb73 2003-09-30 devnull if(t==&cmd)
114 84b1cb73 2003-09-30 devnull outTsll(Tsend, 0 /*ignored*/, which->p0, which->p1);
115 84b1cb73 2003-09-30 devnull else
116 84b1cb73 2003-09-30 devnull outT0(Tsearch);
117 84b1cb73 2003-09-30 devnull setlock();
118 84b1cb73 2003-09-30 devnull break;
119 84b1cb73 2003-09-30 devnull }
120 84b1cb73 2003-09-30 devnull }
121 84b1cb73 2003-09-30 devnull
122 84b1cb73 2003-09-30 devnull void
123 84b1cb73 2003-09-30 devnull menu3hit(void)
124 84b1cb73 2003-09-30 devnull {
125 84b1cb73 2003-09-30 devnull Rectangle r;
126 84b1cb73 2003-09-30 devnull Flayer *l;
127 84b1cb73 2003-09-30 devnull int m, i;
128 84b1cb73 2003-09-30 devnull Text *t;
129 84b1cb73 2003-09-30 devnull
130 84b1cb73 2003-09-30 devnull mw = -1;
131 84b1cb73 2003-09-30 devnull m = menuhit(3, mousectl, &menu3, nil);
132 84b1cb73 2003-09-30 devnull switch(m){
133 84b1cb73 2003-09-30 devnull case -1:
134 84b1cb73 2003-09-30 devnull break;
135 84b1cb73 2003-09-30 devnull
136 84b1cb73 2003-09-30 devnull case New:
137 84b1cb73 2003-09-30 devnull if(!hostlock)
138 84b1cb73 2003-09-30 devnull sweeptext(1, 0);
139 84b1cb73 2003-09-30 devnull break;
140 84b1cb73 2003-09-30 devnull
141 84b1cb73 2003-09-30 devnull case Zerox:
142 84b1cb73 2003-09-30 devnull case Resize:
143 84b1cb73 2003-09-30 devnull if(!hostlock){
144 84b1cb73 2003-09-30 devnull setcursor(mousectl, &bullseye);
145 84b1cb73 2003-09-30 devnull buttons(Down);
146 84b1cb73 2003-09-30 devnull if((mousep->buttons&4) && (l = flwhich(mousep->xy)) && getr(&r))
147 84b1cb73 2003-09-30 devnull duplicate(l, r, l->f.font, m==Resize);
148 84b1cb73 2003-09-30 devnull else
149 84b1cb73 2003-09-30 devnull setcursor(mousectl, cursor);
150 84b1cb73 2003-09-30 devnull buttons(Up);
151 84b1cb73 2003-09-30 devnull }
152 84b1cb73 2003-09-30 devnull break;
153 84b1cb73 2003-09-30 devnull
154 84b1cb73 2003-09-30 devnull case Close:
155 84b1cb73 2003-09-30 devnull if(!hostlock){
156 84b1cb73 2003-09-30 devnull setcursor(mousectl, &bullseye);
157 84b1cb73 2003-09-30 devnull buttons(Down);
158 84b1cb73 2003-09-30 devnull if((mousep->buttons&4) && (l = flwhich(mousep->xy)) && !hostlock){
159 84b1cb73 2003-09-30 devnull t=(Text *)l->user1;
160 84b1cb73 2003-09-30 devnull if (t->nwin>1)
161 84b1cb73 2003-09-30 devnull closeup(l);
162 84b1cb73 2003-09-30 devnull else if(t!=&cmd) {
163 84b1cb73 2003-09-30 devnull outTs(Tclose, t->tag);
164 84b1cb73 2003-09-30 devnull setlock();
165 84b1cb73 2003-09-30 devnull }
166 84b1cb73 2003-09-30 devnull }
167 84b1cb73 2003-09-30 devnull setcursor(mousectl, cursor);
168 84b1cb73 2003-09-30 devnull buttons(Up);
169 84b1cb73 2003-09-30 devnull }
170 84b1cb73 2003-09-30 devnull break;
171 84b1cb73 2003-09-30 devnull
172 84b1cb73 2003-09-30 devnull case Write:
173 84b1cb73 2003-09-30 devnull if(!hostlock){
174 84b1cb73 2003-09-30 devnull setcursor(mousectl, &bullseye);
175 84b1cb73 2003-09-30 devnull buttons(Down);
176 84b1cb73 2003-09-30 devnull if((mousep->buttons&4) && (l = flwhich(mousep->xy))){
177 84b1cb73 2003-09-30 devnull outTs(Twrite, ((Text *)l->user1)->tag);
178 84b1cb73 2003-09-30 devnull setlock();
179 84b1cb73 2003-09-30 devnull }else
180 84b1cb73 2003-09-30 devnull setcursor(mousectl, cursor);
181 84b1cb73 2003-09-30 devnull buttons(Up);
182 84b1cb73 2003-09-30 devnull }
183 84b1cb73 2003-09-30 devnull break;
184 84b1cb73 2003-09-30 devnull
185 84b1cb73 2003-09-30 devnull default:
186 84b1cb73 2003-09-30 devnull if(t = text[m-NMENU3]){
187 84b1cb73 2003-09-30 devnull i = t->front;
188 84b1cb73 2003-09-30 devnull if(t->nwin==0 || t->l[i].textfn==0)
189 84b1cb73 2003-09-30 devnull return; /* not ready yet; try again later */
190 84b1cb73 2003-09-30 devnull if(t->nwin>1 && which==&t->l[i])
191 84b1cb73 2003-09-30 devnull do
192 84b1cb73 2003-09-30 devnull if(++i==NL)
193 84b1cb73 2003-09-30 devnull i = 0;
194 84b1cb73 2003-09-30 devnull while(i!=t->front && t->l[i].textfn==0);
195 84b1cb73 2003-09-30 devnull current(&t->l[i]);
196 84b1cb73 2003-09-30 devnull }else if(!hostlock)
197 84b1cb73 2003-09-30 devnull sweeptext(0, tag[m-NMENU3]);
198 84b1cb73 2003-09-30 devnull break;
199 84b1cb73 2003-09-30 devnull }
200 84b1cb73 2003-09-30 devnull }
201 84b1cb73 2003-09-30 devnull
202 84b1cb73 2003-09-30 devnull
203 84b1cb73 2003-09-30 devnull Text *
204 84b1cb73 2003-09-30 devnull sweeptext(int new, int tag)
205 84b1cb73 2003-09-30 devnull {
206 84b1cb73 2003-09-30 devnull Rectangle r;
207 84b1cb73 2003-09-30 devnull Text *t;
208 84b1cb73 2003-09-30 devnull
209 84b1cb73 2003-09-30 devnull if(getr(&r) && (t = malloc(sizeof(Text)))){
210 84b1cb73 2003-09-30 devnull memset((void*)t, 0, sizeof(Text));
211 84b1cb73 2003-09-30 devnull current((Flayer *)0);
212 84b1cb73 2003-09-30 devnull flnew(&t->l[0], gettext, 0, (char *)t);
213 84b1cb73 2003-09-30 devnull flinit(&t->l[0], r, font, maincols); /*bnl*/
214 84b1cb73 2003-09-30 devnull t->nwin = 1;
215 84b1cb73 2003-09-30 devnull rinit(&t->rasp);
216 84b1cb73 2003-09-30 devnull if(new)
217 84b1cb73 2003-09-30 devnull startnewfile(Tstartnewfile, t);
218 84b1cb73 2003-09-30 devnull else{
219 84b1cb73 2003-09-30 devnull rinit(&t->rasp);
220 84b1cb73 2003-09-30 devnull t->tag = tag;
221 84b1cb73 2003-09-30 devnull startfile(t);
222 84b1cb73 2003-09-30 devnull }
223 84b1cb73 2003-09-30 devnull return t;
224 84b1cb73 2003-09-30 devnull }
225 84b1cb73 2003-09-30 devnull return 0;
226 84b1cb73 2003-09-30 devnull }
227 84b1cb73 2003-09-30 devnull
228 84b1cb73 2003-09-30 devnull int
229 84b1cb73 2003-09-30 devnull whichmenu(int tg)
230 84b1cb73 2003-09-30 devnull {
231 84b1cb73 2003-09-30 devnull int i;
232 84b1cb73 2003-09-30 devnull
233 84b1cb73 2003-09-30 devnull for(i=0; i<nname; i++)
234 84b1cb73 2003-09-30 devnull if(tag[i] == tg)
235 84b1cb73 2003-09-30 devnull return i;
236 84b1cb73 2003-09-30 devnull return -1;
237 84b1cb73 2003-09-30 devnull }
238 84b1cb73 2003-09-30 devnull
239 84b1cb73 2003-09-30 devnull void
240 84b1cb73 2003-09-30 devnull menuins(int n, uchar *s, Text *t, int m, int tg)
241 84b1cb73 2003-09-30 devnull {
242 84b1cb73 2003-09-30 devnull int i;
243 84b1cb73 2003-09-30 devnull
244 84b1cb73 2003-09-30 devnull if(nname == mname){
245 84b1cb73 2003-09-30 devnull if(mname == 0)
246 84b1cb73 2003-09-30 devnull mname = 32;
247 84b1cb73 2003-09-30 devnull else
248 84b1cb73 2003-09-30 devnull mname *= 2;
249 84b1cb73 2003-09-30 devnull name = realloc(name, sizeof(name[0])*mname);
250 84b1cb73 2003-09-30 devnull text = realloc(text, sizeof(text[0])*mname);
251 84b1cb73 2003-09-30 devnull tag = realloc(tag, sizeof(tag[0])*mname);
252 84b1cb73 2003-09-30 devnull if(name==nil || text==nil || tag==nil)
253 84b1cb73 2003-09-30 devnull panic("realloc");
254 84b1cb73 2003-09-30 devnull }
255 84b1cb73 2003-09-30 devnull for(i=nname; i>n; --i)
256 84b1cb73 2003-09-30 devnull name[i]=name[i-1], text[i]=text[i-1], tag[i]=tag[i-1];
257 84b1cb73 2003-09-30 devnull text[n] = t;
258 84b1cb73 2003-09-30 devnull tag[n] = tg;
259 84b1cb73 2003-09-30 devnull name[n] = alloc(strlen((char*)s)+2);
260 84b1cb73 2003-09-30 devnull name[n][0] = m;
261 84b1cb73 2003-09-30 devnull strcpy((char*)name[n]+1, (char*)s);
262 84b1cb73 2003-09-30 devnull nname++;
263 84b1cb73 2003-09-30 devnull menu3.lasthit = n+NMENU3;
264 84b1cb73 2003-09-30 devnull }
265 84b1cb73 2003-09-30 devnull
266 84b1cb73 2003-09-30 devnull void
267 84b1cb73 2003-09-30 devnull menudel(int n)
268 84b1cb73 2003-09-30 devnull {
269 84b1cb73 2003-09-30 devnull int i;
270 84b1cb73 2003-09-30 devnull
271 84b1cb73 2003-09-30 devnull if(nname==0 || n>=nname || text[n])
272 84b1cb73 2003-09-30 devnull panic("menudel");
273 84b1cb73 2003-09-30 devnull free(name[n]);
274 84b1cb73 2003-09-30 devnull --nname;
275 84b1cb73 2003-09-30 devnull for(i = n; i<nname; i++)
276 84b1cb73 2003-09-30 devnull name[i]=name[i+1], text[i]=text[i+1], tag[i]=tag[i+1];
277 84b1cb73 2003-09-30 devnull }
278 84b1cb73 2003-09-30 devnull
279 84b1cb73 2003-09-30 devnull void
280 84b1cb73 2003-09-30 devnull setpat(char *s)
281 84b1cb73 2003-09-30 devnull {
282 84b1cb73 2003-09-30 devnull static char pat[17];
283 84b1cb73 2003-09-30 devnull
284 84b1cb73 2003-09-30 devnull pat[0] = '/';
285 84b1cb73 2003-09-30 devnull strncpy(pat+1, s, 15);
286 84b1cb73 2003-09-30 devnull menu2str[Search] = pat;
287 84b1cb73 2003-09-30 devnull }
288 84b1cb73 2003-09-30 devnull
289 84b1cb73 2003-09-30 devnull #define NBUF 64
290 84b1cb73 2003-09-30 devnull static uchar buf[NBUF*UTFmax]={' ', ' ', ' ', ' '};
291 84b1cb73 2003-09-30 devnull
292 84b1cb73 2003-09-30 devnull char *
293 84b1cb73 2003-09-30 devnull paren(char *s)
294 84b1cb73 2003-09-30 devnull {
295 84b1cb73 2003-09-30 devnull uchar *t = buf;
296 84b1cb73 2003-09-30 devnull
297 84b1cb73 2003-09-30 devnull *t++ = '(';
298 84b1cb73 2003-09-30 devnull do; while(*t++ = *s++);
299 84b1cb73 2003-09-30 devnull t[-1] = ')';
300 84b1cb73 2003-09-30 devnull *t = 0;
301 84b1cb73 2003-09-30 devnull return (char *)buf;
302 84b1cb73 2003-09-30 devnull }
303 84b1cb73 2003-09-30 devnull char*
304 84b1cb73 2003-09-30 devnull genmenu2(int n)
305 84b1cb73 2003-09-30 devnull {
306 84b1cb73 2003-09-30 devnull Text *t=(Text *)which->user1;
307 84b1cb73 2003-09-30 devnull char *p;
308 84b1cb73 2003-09-30 devnull if(n>=NMENU2+(menu2str[Search]!=0))
309 84b1cb73 2003-09-30 devnull return 0;
310 84b1cb73 2003-09-30 devnull p = menu2str[n];
311 84b1cb73 2003-09-30 devnull if(!hostlock && !t->lock || n==Search || n==Look)
312 84b1cb73 2003-09-30 devnull return p;
313 84b1cb73 2003-09-30 devnull return paren(p);
314 84b1cb73 2003-09-30 devnull }
315 84b1cb73 2003-09-30 devnull char*
316 84b1cb73 2003-09-30 devnull genmenu2c(int n)
317 84b1cb73 2003-09-30 devnull {
318 84b1cb73 2003-09-30 devnull Text *t=(Text *)which->user1;
319 84b1cb73 2003-09-30 devnull char *p;
320 84b1cb73 2003-09-30 devnull if(n >= NMENU2C)
321 84b1cb73 2003-09-30 devnull return 0;
322 84b1cb73 2003-09-30 devnull if(n == Send)
323 84b1cb73 2003-09-30 devnull p="send";
324 84b1cb73 2003-09-30 devnull else
325 84b1cb73 2003-09-30 devnull p = menu2str[n];
326 84b1cb73 2003-09-30 devnull if(!hostlock && !t->lock)
327 84b1cb73 2003-09-30 devnull return p;
328 84b1cb73 2003-09-30 devnull return paren(p);
329 84b1cb73 2003-09-30 devnull }
330 84b1cb73 2003-09-30 devnull char *
331 84b1cb73 2003-09-30 devnull genmenu3(int n)
332 84b1cb73 2003-09-30 devnull {
333 84b1cb73 2003-09-30 devnull Text *t;
334 84b1cb73 2003-09-30 devnull int c, i, k, l, w;
335 84b1cb73 2003-09-30 devnull Rune r;
336 84b1cb73 2003-09-30 devnull char *p;
337 84b1cb73 2003-09-30 devnull
338 84b1cb73 2003-09-30 devnull if(n >= NMENU3+nname)
339 84b1cb73 2003-09-30 devnull return 0;
340 84b1cb73 2003-09-30 devnull if(n < NMENU3){
341 84b1cb73 2003-09-30 devnull p = menu3str[n];
342 84b1cb73 2003-09-30 devnull if(hostlock)
343 84b1cb73 2003-09-30 devnull p = paren(p);
344 84b1cb73 2003-09-30 devnull return p;
345 84b1cb73 2003-09-30 devnull }
346 84b1cb73 2003-09-30 devnull n -= NMENU3;
347 84b1cb73 2003-09-30 devnull if(n == 0) /* unless we've been fooled, this is cmd */
348 84b1cb73 2003-09-30 devnull return (char *)&name[n][1];
349 84b1cb73 2003-09-30 devnull if(mw == -1){
350 84b1cb73 2003-09-30 devnull mw = 7; /* strlen("~~sam~~"); */
351 84b1cb73 2003-09-30 devnull for(i=1; i<nname; i++){
352 84b1cb73 2003-09-30 devnull w = utflen((char*)name[i]+1)+4; /* include "'+. " */
353 84b1cb73 2003-09-30 devnull if(w > mw)
354 84b1cb73 2003-09-30 devnull mw = w;
355 84b1cb73 2003-09-30 devnull }
356 84b1cb73 2003-09-30 devnull }
357 84b1cb73 2003-09-30 devnull if(mw > NBUF)
358 84b1cb73 2003-09-30 devnull mw = NBUF;
359 84b1cb73 2003-09-30 devnull t = text[n];
360 84b1cb73 2003-09-30 devnull buf[0] = name[n][0];
361 84b1cb73 2003-09-30 devnull buf[1] = '-';
362 84b1cb73 2003-09-30 devnull buf[2] = ' ';
363 84b1cb73 2003-09-30 devnull buf[3] = ' ';
364 84b1cb73 2003-09-30 devnull if(t){
365 84b1cb73 2003-09-30 devnull if(t->nwin == 1)
366 84b1cb73 2003-09-30 devnull buf[1] = '+';
367 84b1cb73 2003-09-30 devnull else if(t->nwin > 1)
368 84b1cb73 2003-09-30 devnull buf[1] = '*';
369 84b1cb73 2003-09-30 devnull if(work && t==(Text *)work->user1) {
370 84b1cb73 2003-09-30 devnull buf[2]= '.';
371 84b1cb73 2003-09-30 devnull if(modified)
372 84b1cb73 2003-09-30 devnull buf[0] = '\'';
373 84b1cb73 2003-09-30 devnull }
374 84b1cb73 2003-09-30 devnull }
375 84b1cb73 2003-09-30 devnull l = utflen((char*)name[n]+1);
376 84b1cb73 2003-09-30 devnull if(l > NBUF-4-2){
377 84b1cb73 2003-09-30 devnull i = 4;
378 84b1cb73 2003-09-30 devnull k = 1;
379 84b1cb73 2003-09-30 devnull while(i < NBUF/2){
380 84b1cb73 2003-09-30 devnull k += chartorune(&r, (char*)name[n]+k);
381 84b1cb73 2003-09-30 devnull i++;
382 84b1cb73 2003-09-30 devnull }
383 84b1cb73 2003-09-30 devnull c = name[n][k];
384 84b1cb73 2003-09-30 devnull name[n][k] = 0;
385 84b1cb73 2003-09-30 devnull strcpy((char*)buf+4, (char*)name[n]+1);
386 84b1cb73 2003-09-30 devnull name[n][k] = c;
387 84b1cb73 2003-09-30 devnull strcat((char*)buf, "...");
388 84b1cb73 2003-09-30 devnull while((l-i) >= NBUF/2-4){
389 84b1cb73 2003-09-30 devnull k += chartorune(&r, (char*)name[n]+k);
390 84b1cb73 2003-09-30 devnull i++;
391 84b1cb73 2003-09-30 devnull }
392 84b1cb73 2003-09-30 devnull strcat((char*)buf, (char*)name[n]+k);
393 84b1cb73 2003-09-30 devnull }else
394 84b1cb73 2003-09-30 devnull strcpy((char*)buf+4, (char*)name[n]+1);
395 84b1cb73 2003-09-30 devnull i = utflen((char*)buf);
396 84b1cb73 2003-09-30 devnull k = strlen((char*)buf);
397 84b1cb73 2003-09-30 devnull while(i<mw && k<sizeof buf-1){
398 84b1cb73 2003-09-30 devnull buf[k++] = ' ';
399 84b1cb73 2003-09-30 devnull i++;
400 84b1cb73 2003-09-30 devnull }
401 84b1cb73 2003-09-30 devnull buf[k] = 0;
402 84b1cb73 2003-09-30 devnull return (char *)buf;
403 84b1cb73 2003-09-30 devnull }