[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [19961] trunk/blender/source/blender: Bugfix #18637

Ton Roosendaal ton at blender.org
Tue Apr 28 19:25:50 CEST 2009


Revision: 19961
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=19961
Author:   ton
Date:     2009-04-28 19:25:50 +0200 (Tue, 28 Apr 2009)

Log Message:
-----------
Bugfix #18637

Sorting of files didn't take numbers into account propertly, so it
ordered files like;

10.jpg
300.jpg
89.jpg
9.jpg

Quite simple to solve, almost moved report to the 'todo', but too
fun to leave this. :)

function name is BLI_natstrcmp() "natural string compare".

Modified Paths:
--------------
    trunk/blender/source/blender/blenlib/BLI_blenlib.h
    trunk/blender/source/blender/blenlib/intern/storage.c
    trunk/blender/source/blender/blenlib/intern/util.c
    trunk/blender/source/blender/src/filesel.c

Modified: trunk/blender/source/blender/blenlib/BLI_blenlib.h
===================================================================
--- trunk/blender/source/blender/blenlib/BLI_blenlib.h	2009-04-28 15:28:02 UTC (rev 19960)
+++ trunk/blender/source/blender/blenlib/BLI_blenlib.h	2009-04-28 17:25:50 UTC (rev 19961)
@@ -387,6 +387,7 @@
 char *BLI_strcasestr(const char *s, const char *find);
 int BLI_strcasecmp(const char *s1, const char *s2);
 int BLI_strncasecmp(const char *s1, const char *s2, int n);
+int BLI_natstrcmp(const char *s1, const char *s2);
 void BLI_timestr(double _time, char *str); /* time var is global */
 
 /** 

Modified: trunk/blender/source/blender/blenlib/intern/storage.c
===================================================================
--- trunk/blender/source/blender/blenlib/intern/storage.c	2009-04-28 15:28:02 UTC (rev 19960)
+++ trunk/blender/source/blender/blenlib/intern/storage.c	2009-04-28 17:25:50 UTC (rev 19961)
@@ -153,7 +153,7 @@
 	if( strcmp(entry2->relname, ".")==0 ) return (1);
 	if( strcmp(entry1->relname, "..")==0 ) return (-1);
 	
-	return (BLI_strcasecmp(entry1->relname,entry2->relname));
+	return (BLI_natstrcmp(entry1->relname,entry2->relname));
 }
 
 

Modified: trunk/blender/source/blender/blenlib/intern/util.c
===================================================================
--- trunk/blender/source/blender/blenlib/intern/util.c	2009-04-28 15:28:02 UTC (rev 19960)
+++ trunk/blender/source/blender/blenlib/intern/util.c	2009-04-28 17:25:50 UTC (rev 19961)
@@ -1985,7 +1985,56 @@
 	return 0;
 }
 
+/* natural string compare, keeping numbers in order */
+int BLI_natstrcmp(const char *s1, const char *s2)
+{
+	int d1= 0, d2= 0;
+	
+	/* if both chars are numeric, to a strtol().
+	   then increase string deltas as long they are 
+	   numeric, else do a tolower and char compare */
+	
+	while(1) {
+		char c1 = tolower(s1[d1]);
+		char c2 = tolower(s2[d2]);
+		
+		if( isdigit(c1) && isdigit(c2) ) {
+			int val1, val2;
+			
+			val1= (int)strtol(s1+d1, (char **)NULL, 10);
+			val2= (int)strtol(s2+d2, (char **)NULL, 10);
+			
+			if (val1<val2) {
+				return -1;
+			} else if (val1>val2) {
+				return 1;
+			}
+			d1++;
+			while( isdigit(s1[d1]) )
+				d1++;
+			d2++;
+			while( isdigit(s2[d2]) )
+				d2++;
+			
+			c1 = tolower(s1[d1]);
+			c2 = tolower(s2[d2]);
+		}
+		
+		if (c1<c2) {
+			return -1;
+		} else if (c1>c2) {
+			return 1;
+		} else if (c1==0) {
+			break;
+		}
+		d1++;
+		d2++;
+	}
+	
+}
 
+
+
 #ifdef WITH_ICONV
 #include "iconv.h"
 #include "localcharset.h"

Modified: trunk/blender/source/blender/src/filesel.c
===================================================================
--- trunk/blender/source/blender/src/filesel.c	2009-04-28 15:28:02 UTC (rev 19960)
+++ trunk/blender/source/blender/src/filesel.c	2009-04-28 17:25:50 UTC (rev 19961)
@@ -196,7 +196,7 @@
 	if( strcmp(entry2->relname, ".")==0 ) return (1);
 	if( strcmp(entry1->relname, "..")==0 ) return (-1);
 	
-	return (BLI_strcasecmp(entry1->relname,entry2->relname));
+	return (BLI_natstrcmp(entry1->relname,entry2->relname));
 }
 
 static int compare_date(const void *a1, const void *a2)	





More information about the Bf-blender-cvs mailing list