Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: PATCH: Re: Broken completion with UTF-8 description

On Thu, 21 Sep 2006 21:04:17 +0400
Andrey Borzenkov <arvidjaar@xxxxxxxxxx> wrote:
>  static int
>  cd_sort(const void *a, const void *b)
>  {
> - -    return strcmp((*((Cdstr *) a))->str, (*((Cdstr *) b))->str);
> +    char *as = ztrdup((*((Cdstr *) a))->str);
> +    int aslen = strlen(as);
> +    char *bs = ztrdup((*((Cdstr *) b))->str);
> +    int bslen = strlen(bs);
> +    int ret;
> +
> +    unmetafy(as, &ret);
> +    unmetafy(bs, &ret);
> +    ret = strpcmp(&as, &bs);
> +    zfree(as, aslen);
> +    zfree(bs, bslen);
> +    return ret;
>  }

Looking in more detail, cd_sort is passed as an argument to qsort(), so
it may be called many times while sorting the arguments.  It's therefore
probably better to do the conversion in the caller, of which there's
only one at line 270, i.e. the str elements of the values in the array
grps should be copied to an array of unmetafied strings, and then simply
call strpcmp() in cd_sort.  In fact, since you're doing a copy anyway
you could probably convert the array to a format where you can pass
strpcmp() as the final argument and eliminate cd_sort() altogether.

That ought to improve your speed problem quite a bit.

Peter Stephenson <p.w.stephenson@xxxxxxxxxxxx>
Web page now at http://homepage.ntlworld.com/p.w.stephenson/

Messages sorted by: Reverse Date, Date, Thread, Author