All pastes #1018306 Raw Edit

Stuff

public diff v1 · immutable
#1018306 ·published 2008-05-14 20:05 UTC
rendered paste body
--- /home/xavier/rpmvercmp.c	2008-05-14 21:29:29.000000000 +0200+++ temp.c	2008-05-14 21:54:54.000000000 +0200@@ -1,12 +1,21 @@-int rpmvercmp(const char * a, const char * b)+int SYMEXPORT alpm_pkg_vercmp(const char *a, const char *b) { 	char oldch1, oldch2;-	char abuf[strlen(a)+1], bbuf[strlen(b)+1];+	char abuf[64], bbuf[64]; 	char *str1 = abuf, *str2 = bbuf; 	char * one, * two; 	int rc; 	int isnum; +	ALPM_LOG_FUNC;++	/* libalpm added code. ensure our strings are not null */+	if (!a) {+		if (!b) return 0;+		return -1;+	}+	if (!b) return 1;+ 	/* easy comparison to see if versions are identical */ 	if (!strcmp(a, b)) return 0; @@ -18,8 +27,8 @@  	/* loop through each version segment of str1 and str2 and compare them */ 	while (*one && *two) {-		while (*one && !risalnum(*one)) one++;-		while (*two && !risalnum(*two)) two++;+		while (*one && !isalnum((int)*one)) one++;+		while (*two && !isalnum((int)*two)) two++;  		/* If we ran to the end of either, we are finished with the loop */ 		if (!(*one && *two)) break;@@ -30,13 +39,13 @@ 		/* grab first completely alpha or completely numeric segment */ 		/* leave one and two pointing to the start of the alpha or numeric */ 		/* segment and walk str1 and str2 to end of segment */-		if (risdigit(*str1)) {-			while (*str1 && risdigit(*str1)) str1++;-			while (*str2 && risdigit(*str2)) str2++;+		if (isdigit((int)*str1)) {+			while (*str1 && isdigit((int)*str1)) str1++;+			while (*str2 && isdigit((int)*str2)) str2++; 			isnum = 1; 		} else {-			while (*str1 && risalpha(*str1)) str1++;-			while (*str2 && risalpha(*str2)) str2++;+			while (*str1 && isalpha((int)*str1)) str1++;+			while (*str2 && isalpha((int)*str2)) str2++; 			isnum = 0; 		} @@ -86,10 +95,14 @@ 	}  	/* this catches the case where all numeric and alpha segments have */-	/* compared identically but the segment sepparating characters were */+	/* compared identically but the segment separating characters were */ 	/* different */ 	if ((!*one) && (!*two)) return 0; +	/* libalpm added code. one version string may have a pkgrel number, the+	 * other may not. unless both have them, we ignore it and return 0. */+	if( (*one && *one == '-') || (*two && *two == '-')) return 0;+ 	/* whichever version still has characters left over wins */ 	if (!*one) return -1; else return 1; }