xref: /inferno-os/libtk/tmark.c (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
1*37da2899SCharles.Forsyth #include "lib9.h"
2*37da2899SCharles.Forsyth #include "draw.h"
3*37da2899SCharles.Forsyth #include "tk.h"
4*37da2899SCharles.Forsyth #include "textw.h"
5*37da2899SCharles.Forsyth 
6*37da2899SCharles.Forsyth #define istring u.string
7*37da2899SCharles.Forsyth #define iwin u.win
8*37da2899SCharles.Forsyth #define imark u.mark
9*37da2899SCharles.Forsyth #define iline u.line
10*37da2899SCharles.Forsyth 
11*37da2899SCharles.Forsyth static char* tktmarkgravity(Tk*, char*, char**);
12*37da2899SCharles.Forsyth static char* tktmarknames(Tk*, char*, char**);
13*37da2899SCharles.Forsyth static char* tktmarknext(Tk*, char*, char**);
14*37da2899SCharles.Forsyth static char* tktmarkprevious(Tk*, char*, char**);
15*37da2899SCharles.Forsyth static char* tktmarkset(Tk*, char*, char**);
16*37da2899SCharles.Forsyth static char* tktmarkunset(Tk*, char*, char**);
17*37da2899SCharles.Forsyth 
18*37da2899SCharles.Forsyth TkCmdtab
19*37da2899SCharles.Forsyth tktmarkcmd[] =
20*37da2899SCharles.Forsyth {
21*37da2899SCharles.Forsyth 	"gravity",		tktmarkgravity,
22*37da2899SCharles.Forsyth 	"names",		tktmarknames,
23*37da2899SCharles.Forsyth 	"next",		tktmarknext,
24*37da2899SCharles.Forsyth 	"previous",	tktmarkprevious,
25*37da2899SCharles.Forsyth 	"set",		tktmarkset,
26*37da2899SCharles.Forsyth 	"unset",		tktmarkunset,
27*37da2899SCharles.Forsyth 	nil
28*37da2899SCharles.Forsyth };
29*37da2899SCharles.Forsyth 
30*37da2899SCharles.Forsyth char*
tktaddmarkinfo(TkText * tkt,char * name,TkTmarkinfo ** ret)31*37da2899SCharles.Forsyth tktaddmarkinfo(TkText *tkt, char *name, TkTmarkinfo **ret)
32*37da2899SCharles.Forsyth {
33*37da2899SCharles.Forsyth 	TkTmarkinfo *mi;
34*37da2899SCharles.Forsyth 
35*37da2899SCharles.Forsyth 	mi = malloc(sizeof(TkTmarkinfo));
36*37da2899SCharles.Forsyth 	if(mi == nil)
37*37da2899SCharles.Forsyth 		return TkNomem;
38*37da2899SCharles.Forsyth 
39*37da2899SCharles.Forsyth 	mi->name = strdup(name);
40*37da2899SCharles.Forsyth 	if(mi->name == nil) {
41*37da2899SCharles.Forsyth 		free(mi);
42*37da2899SCharles.Forsyth 		return TkNomem;
43*37da2899SCharles.Forsyth 	}
44*37da2899SCharles.Forsyth 	mi->gravity = Tkright;
45*37da2899SCharles.Forsyth 	mi->cur = nil;
46*37da2899SCharles.Forsyth 	mi->next = tkt->marks;
47*37da2899SCharles.Forsyth 	tkt->marks = mi;
48*37da2899SCharles.Forsyth 	*ret = mi;
49*37da2899SCharles.Forsyth 	return nil;
50*37da2899SCharles.Forsyth }
51*37da2899SCharles.Forsyth 
52*37da2899SCharles.Forsyth void
tktfreemarks(TkTmarkinfo * m)53*37da2899SCharles.Forsyth tktfreemarks(TkTmarkinfo *m)
54*37da2899SCharles.Forsyth {
55*37da2899SCharles.Forsyth 	TkTmarkinfo *n;
56*37da2899SCharles.Forsyth 
57*37da2899SCharles.Forsyth 	while(m != nil) {
58*37da2899SCharles.Forsyth 		n = m->next;
59*37da2899SCharles.Forsyth 		free(m->name);
60*37da2899SCharles.Forsyth 		free(m);
61*37da2899SCharles.Forsyth 		m = n;
62*37da2899SCharles.Forsyth 	}
63*37da2899SCharles.Forsyth }
64*37da2899SCharles.Forsyth 
65*37da2899SCharles.Forsyth TkTmarkinfo *
tktfindmark(TkTmarkinfo * m,char * name)66*37da2899SCharles.Forsyth tktfindmark(TkTmarkinfo *m, char *name)
67*37da2899SCharles.Forsyth {
68*37da2899SCharles.Forsyth 	while(m != nil) {
69*37da2899SCharles.Forsyth 		if(strcmp(m->name, name) == 0)
70*37da2899SCharles.Forsyth 			return m;
71*37da2899SCharles.Forsyth 		m = m->next;
72*37da2899SCharles.Forsyth 	}
73*37da2899SCharles.Forsyth 	return nil;
74*37da2899SCharles.Forsyth }
75*37da2899SCharles.Forsyth 
76*37da2899SCharles.Forsyth int
tktmarkind(Tk * tk,char * name,TkTindex * ans)77*37da2899SCharles.Forsyth tktmarkind(Tk *tk, char *name, TkTindex *ans)
78*37da2899SCharles.Forsyth {
79*37da2899SCharles.Forsyth 	TkTmarkinfo *mk;
80*37da2899SCharles.Forsyth 	TkText *tkt = TKobj(TkText, tk);
81*37da2899SCharles.Forsyth 
82*37da2899SCharles.Forsyth 	if(strcmp(name, "current") == 0) {
83*37da2899SCharles.Forsyth 		tktxyind(tk, tkt->current.x, tkt->current.y, ans);
84*37da2899SCharles.Forsyth 		return 1;
85*37da2899SCharles.Forsyth 	}
86*37da2899SCharles.Forsyth 
87*37da2899SCharles.Forsyth 	mk = tktfindmark(tkt->marks, name);
88*37da2899SCharles.Forsyth 	if(mk == nil || mk->cur == nil)
89*37da2899SCharles.Forsyth 		return 0;
90*37da2899SCharles.Forsyth 
91*37da2899SCharles.Forsyth 	ans->item = mk->cur;
92*37da2899SCharles.Forsyth 	ans->line = tktitemline(ans->item);
93*37da2899SCharles.Forsyth 	ans->pos = 0;
94*37da2899SCharles.Forsyth 	return 1;
95*37da2899SCharles.Forsyth }
96*37da2899SCharles.Forsyth 
97*37da2899SCharles.Forsyth char*
tktmarkparse(Tk * tk,char ** parg,TkTmarkinfo ** ret)98*37da2899SCharles.Forsyth tktmarkparse(Tk *tk, char **parg, TkTmarkinfo **ret)
99*37da2899SCharles.Forsyth {
100*37da2899SCharles.Forsyth 	char *e, *buf;
101*37da2899SCharles.Forsyth 	TkText *tkt = TKobj(TkText, tk);
102*37da2899SCharles.Forsyth 
103*37da2899SCharles.Forsyth 	buf = mallocz(Tkmaxitem, 0);
104*37da2899SCharles.Forsyth 	if(buf == nil)
105*37da2899SCharles.Forsyth 		return TkNomem;
106*37da2899SCharles.Forsyth 
107*37da2899SCharles.Forsyth 	*parg = tkword(tk->env->top, *parg, buf, buf+Tkmaxitem, nil);
108*37da2899SCharles.Forsyth 	if(*buf == '\0') {
109*37da2899SCharles.Forsyth 		free(buf);
110*37da2899SCharles.Forsyth 		return TkOparg;
111*37da2899SCharles.Forsyth 	}
112*37da2899SCharles.Forsyth 
113*37da2899SCharles.Forsyth 	*ret = tktfindmark(tkt->marks, buf);
114*37da2899SCharles.Forsyth 	if(*ret == nil) {
115*37da2899SCharles.Forsyth 		e = tktaddmarkinfo(tkt, buf, ret);
116*37da2899SCharles.Forsyth 		if(e != nil) {
117*37da2899SCharles.Forsyth 			free(buf);
118*37da2899SCharles.Forsyth 			return e;
119*37da2899SCharles.Forsyth 		}
120*37da2899SCharles.Forsyth 	}
121*37da2899SCharles.Forsyth 	free(buf);
122*37da2899SCharles.Forsyth 
123*37da2899SCharles.Forsyth 	return nil;
124*37da2899SCharles.Forsyth }
125*37da2899SCharles.Forsyth 
126*37da2899SCharles.Forsyth /*
127*37da2899SCharles.Forsyth  * Insert mark before ixnew, first removing it from old place, if any.
128*37da2899SCharles.Forsyth  * Make sure ixnew continues to point after mark.
129*37da2899SCharles.Forsyth  */
130*37da2899SCharles.Forsyth char*
tktmarkmove(Tk * tk,TkTmarkinfo * m,TkTindex * ixnew)131*37da2899SCharles.Forsyth tktmarkmove(Tk *tk, TkTmarkinfo *m, TkTindex *ixnew)
132*37da2899SCharles.Forsyth {
133*37da2899SCharles.Forsyth 	char *e;
134*37da2899SCharles.Forsyth 	int deleted, split;
135*37da2899SCharles.Forsyth 	TkTitem *i;
136*37da2899SCharles.Forsyth 	TkTindex ix, pix;
137*37da2899SCharles.Forsyth 	TkText *tkt = TKobj(TkText, tk);
138*37da2899SCharles.Forsyth 
139*37da2899SCharles.Forsyth 	deleted = 0;
140*37da2899SCharles.Forsyth 	if(m->cur != nil) {
141*37da2899SCharles.Forsyth 		if(m->cur == ixnew->item)
142*37da2899SCharles.Forsyth 			return nil;
143*37da2899SCharles.Forsyth 		ix.item = m->cur;
144*37da2899SCharles.Forsyth 		ix.line = tktitemline(m->cur);
145*37da2899SCharles.Forsyth 		ix.pos = 0;
146*37da2899SCharles.Forsyth 		tktremitem(tkt, &ix);
147*37da2899SCharles.Forsyth 		deleted = 1;
148*37da2899SCharles.Forsyth 	}
149*37da2899SCharles.Forsyth 
150*37da2899SCharles.Forsyth 	/* XXX - Tad: memory leak on 'i' if something fails later? */
151*37da2899SCharles.Forsyth 	e = tktnewitem(TkTmark, 0, &i);
152*37da2899SCharles.Forsyth 	if(e != nil)
153*37da2899SCharles.Forsyth 		return e;
154*37da2899SCharles.Forsyth 
155*37da2899SCharles.Forsyth 	i->imark = m;
156*37da2899SCharles.Forsyth 	m->cur = i;
157*37da2899SCharles.Forsyth 
158*37da2899SCharles.Forsyth 	/* keep adjacent marks sorted: all rights, then all lefts */
159*37da2899SCharles.Forsyth 	if(m->gravity == Tkright) {
160*37da2899SCharles.Forsyth 		while(ixnew->item->kind == TkTmark && ixnew->item->imark->gravity == Tkleft)
161*37da2899SCharles.Forsyth 			if(!tktadjustind(tkt, TkTbyitem, ixnew))
162*37da2899SCharles.Forsyth 				break;
163*37da2899SCharles.Forsyth 	}
164*37da2899SCharles.Forsyth 	else {
165*37da2899SCharles.Forsyth 		for(;;) {
166*37da2899SCharles.Forsyth 			pix = *ixnew;
167*37da2899SCharles.Forsyth 			if(!tktadjustind(tkt, TkTbyitemback, &pix))
168*37da2899SCharles.Forsyth 				break;
169*37da2899SCharles.Forsyth 			if(pix.item->kind == TkTmark && pix.item->imark->gravity == Tkright)
170*37da2899SCharles.Forsyth 				*ixnew = pix;
171*37da2899SCharles.Forsyth 			else
172*37da2899SCharles.Forsyth 				break;
173*37da2899SCharles.Forsyth 		}
174*37da2899SCharles.Forsyth 	}
175*37da2899SCharles.Forsyth 
176*37da2899SCharles.Forsyth 	split = (ixnew->pos > 0);
177*37da2899SCharles.Forsyth 	e = tktsplititem(ixnew);
178*37da2899SCharles.Forsyth 	if(e != nil)
179*37da2899SCharles.Forsyth 		return e;
180*37da2899SCharles.Forsyth 
181*37da2899SCharles.Forsyth 	e = tktiteminsert(tkt, ixnew, i);
182*37da2899SCharles.Forsyth 	if(e != nil)
183*37da2899SCharles.Forsyth 		return nil;
184*37da2899SCharles.Forsyth 
185*37da2899SCharles.Forsyth 	if(strcmp(m->name, "insert") == 0 || split) {
186*37da2899SCharles.Forsyth 		if(deleted && ix.line != ixnew->line) {
187*37da2899SCharles.Forsyth 			tktfixgeom(tk, tktprevwrapline(tk, ix.line), ix.line, 0);
188*37da2899SCharles.Forsyth 			/*
189*37da2899SCharles.Forsyth 			 * this is ok only because tktfixgeom cannot
190*37da2899SCharles.Forsyth 			 * free mark items, and we know that i is a mark item.
191*37da2899SCharles.Forsyth 			 */
192*37da2899SCharles.Forsyth 			ixnew->item = i;
193*37da2899SCharles.Forsyth 			ixnew->line = tktitemline(i);
194*37da2899SCharles.Forsyth 			ixnew->pos = 0;
195*37da2899SCharles.Forsyth 		}
196*37da2899SCharles.Forsyth 		tktfixgeom(tk, tktprevwrapline(tk, ixnew->line), ixnew->line, 0);
197*37da2899SCharles.Forsyth 		tktextsize(tk, 1);
198*37da2899SCharles.Forsyth 	}
199*37da2899SCharles.Forsyth 
200*37da2899SCharles.Forsyth 	ixnew->item = i;
201*37da2899SCharles.Forsyth 	ixnew->line = tktitemline(i);
202*37da2899SCharles.Forsyth 	ixnew->pos = 0;
203*37da2899SCharles.Forsyth 	return nil;
204*37da2899SCharles.Forsyth }
205*37da2899SCharles.Forsyth 
206*37da2899SCharles.Forsyth /* Text Mark Commands (+ means implemented)
207*37da2899SCharles.Forsyth 	+gravity
208*37da2899SCharles.Forsyth 	+names
209*37da2899SCharles.Forsyth 	+next
210*37da2899SCharles.Forsyth 	+previous
211*37da2899SCharles.Forsyth 	+set
212*37da2899SCharles.Forsyth 	+unset
213*37da2899SCharles.Forsyth */
214*37da2899SCharles.Forsyth 
215*37da2899SCharles.Forsyth static char*
tktmarkgravity(Tk * tk,char * arg,char ** val)216*37da2899SCharles.Forsyth tktmarkgravity(Tk *tk, char *arg, char **val)
217*37da2899SCharles.Forsyth {
218*37da2899SCharles.Forsyth 	char *e;
219*37da2899SCharles.Forsyth 	TkTmarkinfo *m;
220*37da2899SCharles.Forsyth 	char *buf;
221*37da2899SCharles.Forsyth 
222*37da2899SCharles.Forsyth 	e = tktmarkparse(tk, &arg, &m);
223*37da2899SCharles.Forsyth 	if(e != nil)
224*37da2899SCharles.Forsyth 		return e;
225*37da2899SCharles.Forsyth 
226*37da2899SCharles.Forsyth 	if(*arg == '\0')
227*37da2899SCharles.Forsyth 		return tkvalue(val, (m->gravity & Tkleft)? "left" : "right");
228*37da2899SCharles.Forsyth 	else {
229*37da2899SCharles.Forsyth 		buf = mallocz(Tkmaxitem, 0);
230*37da2899SCharles.Forsyth 		if(buf == nil)
231*37da2899SCharles.Forsyth 			return TkNomem;
232*37da2899SCharles.Forsyth 		tkword(tk->env->top, arg, buf, buf+Tkmaxitem, nil);
233*37da2899SCharles.Forsyth 		if(strcmp(buf, "left") == 0)
234*37da2899SCharles.Forsyth 			m->gravity = Tkleft;
235*37da2899SCharles.Forsyth 		else
236*37da2899SCharles.Forsyth 		if(strcmp(buf, "right") == 0)
237*37da2899SCharles.Forsyth 			m->gravity = Tkright;
238*37da2899SCharles.Forsyth 		else {
239*37da2899SCharles.Forsyth 			free(buf);
240*37da2899SCharles.Forsyth 			return TkBadcm;
241*37da2899SCharles.Forsyth 		}
242*37da2899SCharles.Forsyth 		free(buf);
243*37da2899SCharles.Forsyth 	}
244*37da2899SCharles.Forsyth 	return nil;
245*37da2899SCharles.Forsyth }
246*37da2899SCharles.Forsyth 
247*37da2899SCharles.Forsyth static char*
tktmarknames(Tk * tk,char * arg,char ** val)248*37da2899SCharles.Forsyth tktmarknames(Tk *tk, char *arg, char **val)
249*37da2899SCharles.Forsyth {
250*37da2899SCharles.Forsyth 	char *r, *fmt;
251*37da2899SCharles.Forsyth 	TkTmarkinfo *m;
252*37da2899SCharles.Forsyth 	TkText *tkt = TKobj(TkText, tk);
253*37da2899SCharles.Forsyth 
254*37da2899SCharles.Forsyth 	USED(arg);
255*37da2899SCharles.Forsyth 
256*37da2899SCharles.Forsyth 	fmt = "%s";
257*37da2899SCharles.Forsyth 	for(m = tkt->marks; m != nil; m = m->next) {
258*37da2899SCharles.Forsyth 		r = tkvalue(val, fmt, m->name);
259*37da2899SCharles.Forsyth 		if(r != nil)
260*37da2899SCharles.Forsyth 			return r;
261*37da2899SCharles.Forsyth 		fmt = " %s";
262*37da2899SCharles.Forsyth 	}
263*37da2899SCharles.Forsyth 	return nil;
264*37da2899SCharles.Forsyth }
265*37da2899SCharles.Forsyth 
266*37da2899SCharles.Forsyth static char*
tktmarknext(Tk * tk,char * arg,char ** val)267*37da2899SCharles.Forsyth tktmarknext(Tk *tk, char *arg, char **val)
268*37da2899SCharles.Forsyth {
269*37da2899SCharles.Forsyth 	char *e;
270*37da2899SCharles.Forsyth 	TkTmarkinfo *mix;
271*37da2899SCharles.Forsyth 	TkTindex ix, ixend;
272*37da2899SCharles.Forsyth 	TkText *tkt = TKobj(TkText, tk);
273*37da2899SCharles.Forsyth 
274*37da2899SCharles.Forsyth 	/* special behavior if specified index is a mark name */
275*37da2899SCharles.Forsyth 	mix = tktfindmark(tkt->marks, arg);
276*37da2899SCharles.Forsyth 
277*37da2899SCharles.Forsyth 	e = tktindparse(tk, &arg, &ix);
278*37da2899SCharles.Forsyth 	if(e != nil)
279*37da2899SCharles.Forsyth 		return e;
280*37da2899SCharles.Forsyth 
281*37da2899SCharles.Forsyth 	if(mix != nil)
282*37da2899SCharles.Forsyth 		tktadjustind(tkt, TkTbyitem, &ix);
283*37da2899SCharles.Forsyth 
284*37da2899SCharles.Forsyth 	/* special behavior if index is 'end' */
285*37da2899SCharles.Forsyth 	tktendind(tkt, &ixend);
286*37da2899SCharles.Forsyth 	if(tktindcompare(tkt, &ix, TkEq, &ixend)) {
287*37da2899SCharles.Forsyth 		do {
288*37da2899SCharles.Forsyth 			tktadjustind(tkt, TkTbyitemback, &ix);
289*37da2899SCharles.Forsyth 		} while(ix.item->kind == TkTmark);
290*37da2899SCharles.Forsyth 	}
291*37da2899SCharles.Forsyth 
292*37da2899SCharles.Forsyth 	do {
293*37da2899SCharles.Forsyth 		if(ix.item->kind == TkTmark)
294*37da2899SCharles.Forsyth 			return tkvalue(val, "%s", ix.item->imark->name);
295*37da2899SCharles.Forsyth 
296*37da2899SCharles.Forsyth 	} while(tktadjustind(tkt, TkTbyitem, &ix));
297*37da2899SCharles.Forsyth 
298*37da2899SCharles.Forsyth 	return nil;
299*37da2899SCharles.Forsyth }
300*37da2899SCharles.Forsyth 
301*37da2899SCharles.Forsyth static char*
tktmarkprevious(Tk * tk,char * arg,char ** val)302*37da2899SCharles.Forsyth tktmarkprevious(Tk *tk, char *arg, char **val)
303*37da2899SCharles.Forsyth {
304*37da2899SCharles.Forsyth 	char *e;
305*37da2899SCharles.Forsyth 	TkTindex ix;
306*37da2899SCharles.Forsyth 	TkText *tkt = TKobj(TkText, tk);
307*37da2899SCharles.Forsyth 
308*37da2899SCharles.Forsyth 	e = tktindparse(tk, &arg, &ix);
309*37da2899SCharles.Forsyth 	if(e != nil)
310*37da2899SCharles.Forsyth 		return e;
311*37da2899SCharles.Forsyth 
312*37da2899SCharles.Forsyth 	while(tktadjustind(tkt, TkTbyitemback, &ix)) {
313*37da2899SCharles.Forsyth 		if(ix.item->kind == TkTmark)
314*37da2899SCharles.Forsyth 			return tkvalue(val, "%s", ix.item->imark->name);
315*37da2899SCharles.Forsyth 	}
316*37da2899SCharles.Forsyth 
317*37da2899SCharles.Forsyth 	return nil;
318*37da2899SCharles.Forsyth }
319*37da2899SCharles.Forsyth 
320*37da2899SCharles.Forsyth /* XXX - Tad: possible memory leak here */
321*37da2899SCharles.Forsyth static char*
tktmarkset(Tk * tk,char * arg,char ** val)322*37da2899SCharles.Forsyth tktmarkset(Tk *tk, char *arg, char **val)
323*37da2899SCharles.Forsyth {
324*37da2899SCharles.Forsyth 	char *e;
325*37da2899SCharles.Forsyth 	TkTmarkinfo *m;
326*37da2899SCharles.Forsyth 	TkTindex ixnew;
327*37da2899SCharles.Forsyth 
328*37da2899SCharles.Forsyth 	USED(val);
329*37da2899SCharles.Forsyth 
330*37da2899SCharles.Forsyth 	e = tktmarkparse(tk, &arg, &m);
331*37da2899SCharles.Forsyth 	if(e != nil)
332*37da2899SCharles.Forsyth 		return e;
333*37da2899SCharles.Forsyth 	e = tktindparse(tk, &arg, &ixnew);
334*37da2899SCharles.Forsyth 	if(e != nil)
335*37da2899SCharles.Forsyth 		return e;
336*37da2899SCharles.Forsyth 
337*37da2899SCharles.Forsyth 	return tktmarkmove(tk, m, &ixnew);
338*37da2899SCharles.Forsyth }
339*37da2899SCharles.Forsyth 
340*37da2899SCharles.Forsyth static char*
tktmarkunset(Tk * tk,char * arg,char ** val)341*37da2899SCharles.Forsyth tktmarkunset(Tk *tk, char *arg, char **val)
342*37da2899SCharles.Forsyth {
343*37da2899SCharles.Forsyth 	TkText *tkt;
344*37da2899SCharles.Forsyth 	TkTmarkinfo *m, **p;
345*37da2899SCharles.Forsyth 	TkTindex ix;
346*37da2899SCharles.Forsyth 	char *e;
347*37da2899SCharles.Forsyth 	int resize;
348*37da2899SCharles.Forsyth 
349*37da2899SCharles.Forsyth 	USED(val);
350*37da2899SCharles.Forsyth 
351*37da2899SCharles.Forsyth 	tkt = TKobj(TkText, tk);
352*37da2899SCharles.Forsyth 
353*37da2899SCharles.Forsyth 	e = tktmarkparse(tk, &arg, &m);
354*37da2899SCharles.Forsyth 	if(e != nil)
355*37da2899SCharles.Forsyth 		return e;
356*37da2899SCharles.Forsyth 
357*37da2899SCharles.Forsyth 	resize = 0;
358*37da2899SCharles.Forsyth 	while(m != nil) {
359*37da2899SCharles.Forsyth 		if(strcmp(m->name, "insert") == 0 || strcmp(m->name, "current") == 0)
360*37da2899SCharles.Forsyth 			return TkBadvl;
361*37da2899SCharles.Forsyth 
362*37da2899SCharles.Forsyth 		if(m->cur != nil) {
363*37da2899SCharles.Forsyth 			ix.item = m->cur;
364*37da2899SCharles.Forsyth 			ix.line = tktitemline(m->cur);
365*37da2899SCharles.Forsyth 			ix.pos = 0;
366*37da2899SCharles.Forsyth 			tktremitem(tkt, &ix);
367*37da2899SCharles.Forsyth 			tktfixgeom(tk, tktprevwrapline(tk, ix.line), ix.line, 0);
368*37da2899SCharles.Forsyth 			resize = 1;
369*37da2899SCharles.Forsyth 		}
370*37da2899SCharles.Forsyth 
371*37da2899SCharles.Forsyth 		for(p = &tkt->marks; *p != nil; p = &(*p)->next) {
372*37da2899SCharles.Forsyth 			if(*p == m) {
373*37da2899SCharles.Forsyth 				*p = m->next;
374*37da2899SCharles.Forsyth 				break;
375*37da2899SCharles.Forsyth 			}
376*37da2899SCharles.Forsyth 		}
377*37da2899SCharles.Forsyth 		m->next = nil;
378*37da2899SCharles.Forsyth 		tktfreemarks(m);
379*37da2899SCharles.Forsyth 
380*37da2899SCharles.Forsyth 		if(*arg != '\0') {
381*37da2899SCharles.Forsyth 			e = tktmarkparse(tk, &arg, &m);
382*37da2899SCharles.Forsyth 			if(e != nil)
383*37da2899SCharles.Forsyth 				return e;
384*37da2899SCharles.Forsyth 		}
385*37da2899SCharles.Forsyth 		else
386*37da2899SCharles.Forsyth 			m = nil;
387*37da2899SCharles.Forsyth 	}
388*37da2899SCharles.Forsyth 	if (resize)
389*37da2899SCharles.Forsyth 		tktextsize(tk, 1);
390*37da2899SCharles.Forsyth 	return nil;
391*37da2899SCharles.Forsyth }
392*37da2899SCharles.Forsyth 
393