changeset 6147:d4e0c197e979 v7.4.411

updated for version 7.4.411 Problem: "foo bar" sorts before "foo" with sort(). (John Little) Solution: Avoid putting quotes around strings before comparing them.
author Bram Moolenaar <bram@vim.org>
date Fri, 22 Aug 2014 13:13:27 +0200
parents 7af530381fec
children aeafe78fc869
files src/eval.c src/version.c
diffstat 2 files changed, 29 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/src/eval.c
+++ b/src/eval.c
@@ -17382,16 +17382,38 @@ item_compare(s1, s2)
     const void	*s2;
 {
     sortItem_T  *si1, *si2;
+    typval_T	*tv1, *tv2;
     char_u	*p1, *p2;
-    char_u	*tofree1, *tofree2;
+    char_u	*tofree1 = NULL, *tofree2 = NULL;
     int		res;
     char_u	numbuf1[NUMBUFLEN];
     char_u	numbuf2[NUMBUFLEN];
 
     si1 = (sortItem_T *)s1;
     si2 = (sortItem_T *)s2;
-    p1 = tv2string(&si1->item->li_tv, &tofree1, numbuf1, 0);
-    p2 = tv2string(&si2->item->li_tv, &tofree2, numbuf2, 0);
+    tv1 = &si1->item->li_tv;
+    tv2 = &si2->item->li_tv;
+    /* tv2string() puts quotes around a string and allocates memory.  Don't do
+     * that for string variables. Use a single quote when comparing with a
+     * non-string to do what the docs promise. */
+    if (tv1->v_type == VAR_STRING)
+    {
+	if (tv2->v_type != VAR_STRING || item_compare_numeric)
+	    p1 = (char_u *)"'";
+	else
+	    p1 = tv1->vval.v_string;
+    }
+    else
+	p1 = tv2string(tv1, &tofree1, numbuf1, 0);
+    if (tv2->v_type == VAR_STRING)
+    {
+	if (tv1->v_type != VAR_STRING || item_compare_numeric)
+	    p2 = (char_u *)"'";
+	else
+	    p2 = tv2->vval.v_string;
+    }
+    else
+	p2 = tv2string(tv2, &tofree2, numbuf2, 0);
     if (p1 == NULL)
 	p1 = (char_u *)"";
     if (p2 == NULL)
@@ -17411,8 +17433,8 @@ item_compare(s1, s2)
 	res = n1 == n2 ? 0 : n1 > n2 ? 1 : -1;
     }
 
-    /* When the result would be zero, compare the pointers themselves.  Makes
-     * the sort stable. */
+    /* When the result would be zero, compare the item indexes.  Makes the
+     * sort stable. */
     if (res == 0 && !item_compare_keep_zero)
 	res = si1->idx > si2->idx ? 1 : -1;
 
--- a/src/version.c
+++ b/src/version.c
@@ -742,6 +742,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    411,
+/**/
     410,
 /**/
     409,