From 553e011320798af097e8de95a1e2a1d2ed6a1a3e Mon Sep 17 00:00:00 2001 From: Peter Stephenson Date: Sun, 21 Jan 2007 22:47:36 +0000 Subject: 23118: improve sorting to make it work with locales --- Src/Zle/compcore.c | 7 ++++--- Src/Zle/computil.c | 2 +- Src/Zle/zle_tricky.c | 20 +++++++++----------- 3 files changed, 14 insertions(+), 15 deletions(-) (limited to 'Src/Zle') diff --git a/Src/Zle/compcore.c b/Src/Zle/compcore.c index 2259db01a..3e4f690f3 100644 --- a/Src/Zle/compcore.c +++ b/Src/Zle/compcore.c @@ -3028,7 +3028,7 @@ matchcmp(Cmatch *a, Cmatch *b) if ((*b)->disp && !((*b)->flags & CMF_MORDER)) return 1; - return strbpcmp(&((*a)->str), &((*b)->str)); + return zstrbcmp((*a)->str, (*b)->str); } /* This tests whether two matches are equal (would produce the same @@ -3077,8 +3077,9 @@ makearray(LinkList l, int type, int flags, int *np, int *nlp, int *llp) char **ap, **bp, **cp; /* Now sort the array (it contains strings). */ - qsort((void *) rp, n, sizeof(char *), - (int (*) _((const void *, const void *)))strbpcmp); + strmetasort((char **)rp, SORTIT_IGNORING_BACKSLASHES | + (isset(NUMERICGLOBSORT) ? SORTIT_NUMERICALLY : 0), + NULL); /* And delete the ones that occur more than once. */ for (ap = cp = (char **) rp; *ap; ap++) { diff --git a/Src/Zle/computil.c b/Src/Zle/computil.c index ce70dee72..1dbefa589 100644 --- a/Src/Zle/computil.c +++ b/Src/Zle/computil.c @@ -213,7 +213,7 @@ cd_calc() static int cd_sort(const void *a, const void *b) { - return strpcmp(&(*((Cdstr *) a))->sortstr, &(*((Cdstr *) b))->sortstr); + return zstrpcmp((*((Cdstr *) a))->sortstr, (*((Cdstr *) b))->sortstr, 0); } static int diff --git a/Src/Zle/zle_tricky.c b/Src/Zle/zle_tricky.c index 1393027f7..845f74bc5 100644 --- a/Src/Zle/zle_tricky.c +++ b/Src/Zle/zle_tricky.c @@ -2100,28 +2100,26 @@ sfxlen(char *s, char *t) } #endif -/* This is strcmp with ignoring backslashes. */ +/* This is zstrcmp with ignoring backslashes. */ /**/ mod_export int -strbpcmp(char **aa, char **bb) +zstrbcmp(const char *a, const char *b) { - char *a = *aa, *b = *bb; + const char *astart = a; while (*a && *b) { if (*a == '\\') a++; if (*b == '\\') b++; - if (*a != *b) + if (*a != *b || !*a) break; - if (*a) - a++; - if (*b) - b++; + a++; + b++; } if (isset(NUMERICGLOBSORT) && (idigit(*a) || idigit(*b))) { - for (; a > *aa && idigit(a[-1]); a--, b--); + for (; a > astart && idigit(a[-1]); a--, b--); if (idigit(*a) && idigit(*b)) { while (*a == '0') a++; @@ -2310,8 +2308,8 @@ listlist(LinkList l) *p = (char *) getdata(node); *p = NULL; - qsort((void *) data, num, sizeof(char *), - (int (*) _((const void *, const void *))) strbpcmp); + strmetasort((char **)data, SORTIT_IGNORING_BACKSLASHES | + (isset(NUMERICGLOBSORT) ? SORTIT_NUMERICALLY : 0), NULL); for (p = data, lenp = lens; *p; p++, lenp++) { len = *lenp = ZMB_nicewidth(*p) + 2; -- cgit 1.4.1