//  Comparison function for legal paragraph numbers.

/*
	This function can be used as a callback sort function to 
	sort a listview column containing 	legal paragraph numbers, 
	1.0, 1.1, 1.1.1 etc.
	
	Function returns an integer value as follows:
	
		s1 == s2, returns 0
		s1 > s2, returns 1
		s2 > s1, returns -1
		
	If either of the parameters are not correctly formatted
	legal paragraph numbers then the function returns 0.
	
	If you are using this function elsewhere, i.e. not as a listView
	callback, then it can be be changed to return another number on error, 
	say 2, 	by altering the return statement immediatly after the 
	lastError command.
	
	This function relies on the fact that intOf() will return
	an ingeter if the first part of the string can be interpreted
	as an integer, regardless of the remainder, which is ignored.
	
	i.e. intOf("1.2") returns 1.
	
	If the integers being compared are equal, the the function
	recurses with the remainder of the string.
	
	isValidInt() cannot be used to check the string before calling
	intOf() because it will return false unless the whole string
	can be interpreted as an integer.
	
	i.e. isValidInt("1.2") returns false.
	
	Instead, calls to intOf() are surrounded by a noError...lastError
	construct to capture bad parameters.

	Tony Goodman
*/

int legalCompare(string s1, string s2)
{
	int i1 = 0
	int i2 = 0
	
	noError
	
	i1 = intOf(s1)
	i2 = intOf(s2)
	
	if (lastError != "")
	{
		return(0)
	}
	
	if (i1 > i2)
	{
		return(1)
	}
	else if (i2 > i1)
	{
		return(-1)
	}
	else
	{
		if (length(s1) > length(i1 ""))
		{
			if (length(s2) > length(i2 ""))
			{
				return(doSortLegal(s1[length(i1 "") + 1:], s2[length(i2 "") + 1:]))
			}

			return(1)
		}
		else if (length(s2) > length(i2 ""))
		{
			return(-1)
		}
		
		return(0)
	}
	
	return(0)
}

sitemap