From 591a6c90e758ca2bf7c9c96e7ee6c8c83ffdd5ee Mon Sep 17 00:00:00 2001
From: Ruud Overeem <overeem@astron.nl>
Date: Thu, 17 Jul 2008 11:31:24 +0000
Subject: [PATCH] Bug 1047: StringToBool also accepts Yes and No. Changed
 compactedArrayString so that it can handle already compacted arrays also.
 Updated test programs.

---
 LCS/Common/src/StringUtil.cc       | 75 +++++++++++++++++++-----------
 LCS/Common/test/tStringUtil.cc     | 11 +++++
 LCS/Common/test/tStringUtil.stdout | 10 ++++
 3 files changed, 68 insertions(+), 28 deletions(-)

diff --git a/LCS/Common/src/StringUtil.cc b/LCS/Common/src/StringUtil.cc
index 9d9eb132b7f..a7339e947ca 100644
--- a/LCS/Common/src/StringUtil.cc
+++ b/LCS/Common/src/StringUtil.cc
@@ -142,10 +142,10 @@ string	toLower(string str)
 bool	StringToBool(const string& aString) throw(Exception)
 {
 	char	firstChar = aString.c_str()[0];
-	if ((firstChar == 't') || (firstChar == 'T') || (firstChar == '1'))
+	if ((firstChar == 't') || (firstChar == 'T') || (firstChar == '1') || (firstChar == 'Y') || (firstChar == 'y'))
 		return (true);
 
-	if ((firstChar == 'f') || (firstChar == 'F') || (firstChar == '0'))
+	if ((firstChar == 'f') || (firstChar == 'F') || (firstChar == '0') || (firstChar == 'N') || (firstChar == 'n'))
 		return (false);
 
 	THROW (Exception, aString + " is not a boolean value");
@@ -252,7 +252,7 @@ double	StringToDouble(const string& aString, const char* fmt) throw(Exception)
 // ----------------------- ATTENTION !!!----------------------------------
 // This routine has been copied to the Navigator software
 // (MAC/Navigator/scripts/libs/nav_usr/CS1/CS1_Common.ctl)
-// if you change anything struktural change the Navigator part also please
+// if you change anything structural change the Navigator part also please
 // -----------------------------------------------------------------------
 
 string compactedArrayString(const string&	orgStr)
@@ -272,11 +272,18 @@ string compactedArrayString(const string&	orgStr)
 	if (firstDigit == string::npos) {	// no digits? then return org string
 		return (orgStr);
 	}
-	string	elemName(strVector[0].substr(0,firstDigit));
-	string	scanMask(elemName+"%ld");
-	string	outMask (formatString("%s%%0%dld", elemName.c_str(), 
-											strVector[0].length() - elemName.length()));
+	// construct masks for scanning and formatting.
+	string	elemName	 (strVector[0].substr(0,firstDigit));
+	string	scanMask	 (elemName+"%ld");
+	string	rangeScanMask(scanMask+".."+scanMask);
+	bool	rangeElem 	 (strVector[0].find("..",0) != string::npos);
+	int		numberLength (strVector[0].length() - elemName.length());
+	if (rangeElem) {
+		numberLength = (numberLength-2)/2;
+	}
+	string	outMask 	 (formatString("%s%%0%dld", elemName.c_str(), numberLength));
 
+	// process all elements in the vector.
 	string 	result("[");
 	long 	prevValue(-2);
 	bool	firstElem(true);
@@ -285,44 +292,56 @@ string compactedArrayString(const string&	orgStr)
 	int		nrElems(strVector.size());
 	for (int idx = 0; idx < nrElems; idx++) {
 		long	value;
+		long	lastValue;
 		if (sscanf(strVector[idx].c_str(), scanMask.c_str(), &value) != 1) {
 			LOG_DEBUG_STR("Element " << strVector[idx] << " does not match mask " 
-						<< scanMask << ". Returning orignal string");
+						<< scanMask << ". Returning orignal string.");
 			return (orgStr);
 		}
 
-		if (value == prevValue+1) {		// contiquous numbering?
-			elemsInRange++;
-			prevValue = value;
+		// check for already compacted elements.
+		rangeElem = (strVector[idx].find("..",0) != string::npos);
+		if (rangeElem && (sscanf(strVector[idx].c_str(), rangeScanMask.c_str(), &value, &lastValue) != 2)) {
+			LOG_DEBUG_STR("RangeElement " << strVector[idx] << " does not match mask " 
+						<< rangeScanMask << ". Returning orignal string.");
+			return (orgStr);
+		}
+			
+		// contiquous numbering?
+		if (value == prevValue+1) {
+			elemsInRange += rangeElem ? (lastValue-value+1) : 1;
+			prevValue    =  rangeElem ? lastValue : value;
 			if (idx < nrElems-1) {		// when elements left
 				continue;
 			}
 			endOfArray = true;
 		}
 
-		// broken range
-		if (firstElem) {
+		// list not contiguous anymore, write results we collected
+		if (firstElem) {				// don't start with a comma.
 			result += formatString(outMask.c_str(), value);
-			firstElem = false;
+		}
+
+		if (elemsInRange == 1) {
+			result += "," + formatString(outMask.c_str(), value);
 		}
 		else {
-			if (elemsInRange == 1) {
-				result += "," + formatString(outMask.c_str(), value);
+			if (elemsInRange == 2) {		// don't compact xx03,xx04 to xx03..xx04
+				result += "," + formatString(outMask.c_str(), prevValue);
 			}
-			else {
-				if (elemsInRange == 2) {
-					result += "," + formatString(outMask.c_str(), prevValue);
-				}
-				else {
-					result += ".." + formatString(outMask.c_str(), prevValue);
-				}
-				if (!endOfArray) {
-					result += "," + formatString(outMask.c_str(), value);
+			else if (elemsInRange > 2) {
+				result += ".." + formatString(outMask.c_str(), prevValue);
+			}
+			if (!firstElem && !endOfArray) {
+				result += "," + formatString(outMask.c_str(), value);
+				if (rangeElem) {
+					result += ".." + formatString(outMask.c_str(), lastValue);
 				}
 			}
 		}
-		elemsInRange = 1;
-		prevValue    = value;
+		elemsInRange = rangeElem ? (lastValue-value+1) : 1;
+		prevValue    = rangeElem ? lastValue : value;
+		firstElem 	 = false;
 	}
 
 	return (result+"]");
@@ -338,7 +357,7 @@ string compactedArrayString(const string&	orgStr)
 // ----------------------- ATTENTION !!!----------------------------------
 // This routine has been copied to the Navigator software
 // (MAC/Navigator/scripts/libs/nav_usr/CS1/CS1_Common.ctl)
-// if you change anything struktural change the Navigator part also please
+// if you change anything structural change the Navigator part also please
 // -----------------------------------------------------------------------
 
 string expandedArrayString(const string&	orgStr)
diff --git a/LCS/Common/test/tStringUtil.cc b/LCS/Common/test/tStringUtil.cc
index bbf48a2f75e..d685ee2c3c3 100644
--- a/LCS/Common/test/tStringUtil.cc
+++ b/LCS/Common/test/tStringUtil.cc
@@ -202,6 +202,17 @@ bool testCompactArray()
 	DO_COMPACT_TEST("[22,23,23,25,30,31,30,31]");
 	DO_COMPACT_TEST("[22,23,23,25,30,31,30,31,31]");
 	DO_COMPACT_TEST("[22,23,23,23,23,23,25,30,31,30,31,31]");
+
+	DO_COMPACT_TEST("[23..28]");
+	DO_COMPACT_TEST("[22,23..28]");
+	DO_COMPACT_TEST("[22,23..28,29]");
+	DO_COMPACT_TEST("[21,23..28,29]");
+	DO_COMPACT_TEST("[21,23..28,30]");
+	DO_COMPACT_TEST("[23..28,30..32]");
+	DO_COMPACT_TEST("[23..28,29..32]");
+	DO_COMPACT_TEST("[23..28,29,30..32]");
+	DO_COMPACT_TEST("[23..26,29,30..32]");
+	DO_COMPACT_TEST("[23..26,27,30..32]");
   } catch(Exception& e) {
 	LOG_ERROR_STR(e);
 	return (false);
diff --git a/LCS/Common/test/tStringUtil.stdout b/LCS/Common/test/tStringUtil.stdout
index 06493907944..ad6c70acd6d 100644
--- a/LCS/Common/test/tStringUtil.stdout
+++ b/LCS/Common/test/tStringUtil.stdout
@@ -79,6 +79,16 @@ toString(double(M_PI*1e12),"%+08.12g") = +3.14159265359e+12
 [22,23,23,25,30,31,30,31] ==> [22,23,23,25,30,31,30,31]
 [22,23,23,25,30,31,30,31,31] ==> [22,23,23,25,30,31,30,31,31]
 [22,23,23,23,23,23,25,30,31,30,31,31] ==> [22,23,23,23,23,23,25,30,31,30,31,31]
+[23..28] ==> [23..28]
+[22,23..28] ==> [22..28]
+[22,23..28,29] ==> [22..29]
+[21,23..28,29] ==> [21,23..29]
+[21,23..28,30] ==> [21,23..28,30]
+[23..28,30..32] ==> [23..28,30..32]
+[23..28,29..32] ==> [23..32]
+[23..28,29,30..32] ==> [23..32]
+[23..26,29,30..32] ==> [23..26,29..32]
+[23..26,27,30..32] ==> [23..27,30..32]
 
 *** Testing expanding of Array-strings ***
 [ a,b,c ] ==> [ a,b,c ]
-- 
GitLab