From 118cf5e36a7f90d4a9dae015f029f35fe06fccf0 Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Tue, 5 Nov 2013 08:00:26 +0100 Subject: [PATCH] rio: eleminate temporary allocations before frinsert() and in namecomplete() frinsert() shouldnt modify the runes passed and the buffer isnt going to be modified my us during the call so removing the temporary copies. namecomplete() makes utf-8 copies of the rune strings so theres no need to copy the runes. --- sys/src/cmd/rio/wind.c | 26 +++++++++----------------- 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/sys/src/cmd/rio/wind.c b/sys/src/cmd/rio/wind.c index 3497275d2..97e494ea3 100644 --- a/sys/src/cmd/rio/wind.c +++ b/sys/src/cmd/rio/wind.c @@ -569,11 +569,9 @@ namecomplete(Window *w) if(w->q0nr && w->r[w->q0]>' ') /* must be at end of word */ return; nstr = windfilewidth(w, w->q0, TRUE); - str = runemalloc(nstr); - runemove(str, w->r+(w->q0-nstr), nstr); + str = w->r+(w->q0-nstr); npath = windfilewidth(w, w->q0-nstr, FALSE); - path = runemalloc(npath); - runemove(path, w->r+(w->q0-nstr-npath), npath); + path = w->r+(w->q0-nstr-npath); /* is path rooted? if not, we need to make it relative to window path */ if(npath>0 && path[0]=='/') @@ -585,6 +583,8 @@ namecomplete(Window *w) root = w->dir; dir = smprint("%s/%.*S", root, npath, path); } + if(dir == nil) + return; /* run in background, winctl will collect the result on w->complete chan */ job = emalloc(sizeof *job); @@ -593,9 +593,6 @@ namecomplete(Window *w) job->win = w; incref(w); proccreate(completeproc, job, STACK); - - free(path); - free(str); } void @@ -1640,10 +1637,8 @@ wsetorigin(Window *w, uint org, int exact) fixup = 1; /* frdelete can leave end of last line in wrong selection mode; it doesn't know what follows */ }else if(a<0 && -anchars){ n = w->org - org; - r = runemalloc(n); - runemove(r, w->r+org, n); + r = w->r+org; frinsert(w, r, r+n, 0); - free(r); }else frdelete(w, 0, w->nchars); w->org = org; @@ -1764,16 +1759,14 @@ wfill(Window *w) Rune *rp; int i, n, m, nl; - if(w->lastlinefull) - return; - rp = malloc(messagesize); - do{ + while(w->lastlinefull == FALSE){ n = w->nr-(w->org+w->nchars); if(n == 0) break; if(n > 2000) /* educated guess at reasonable amount */ n = 2000; - runemove(rp, w->r+(w->org+w->nchars), n); + rp = w->r+(w->org+w->nchars); + /* * it's expensive to frinsert more than we need, so * count newlines. @@ -1788,8 +1781,7 @@ wfill(Window *w) } } frinsert(w, rp, rp+i, w->nchars); - }while(w->lastlinefull == FALSE); - free(rp); + } } char*