Index: versekey.cpp
===================================================================
RCS file: /cvsroot/sword/sword/src/keys/versekey.cpp,v
retrieving revision 1.2
diff -u -3 -p -r1.2 versekey.cpp
--- versekey.cpp	21 Aug 2002 13:00:48 -0000	1.2
+++ versekey.cpp	25 Aug 2002 21:49:09 -0000
@@ -311,36 +311,52 @@ void VerseKey::freshtext() const
 int VerseKey::getBookAbbrev(const char *iabbr)
 {
     int loop, diff, abLen, min, max, target, retVal = -1;
+    int doUpper = 1;
 
-    char *abbr = 0;
+    char *abbr;
+    
+ restart:
+    abbr = 0;
+    stdstr(&abbr, iabbr);
+    strstrip(abbr);
+    if (doUpper) {
+      toupperstr(abbr);
+    }    
+    abLen = strlen(abbr);
+    
+    if (abLen) {
+      min = 0;
+      //		max = abbrevsCnt - 1;
+      max = abbrevsCnt;
+      while(1) {
+	target = min + ((max - min) / 2);
+	diff = strncmp(abbr, abbrevs[target].ab, abLen);
+	if ((!diff)||(target >= max)||(target <= min))
+	  break;
+	if (diff > 0)
+	  min = target;
+	else	
+	  max = target;
+      }
+      for (; target > 0; target--) {
+	if (strncmp(abbr, abbrevs[target-1].ab, abLen))
+	  break;
+      }
+      retVal = (!diff) ? abbrevs[target].book : -1;
+    }
 
-	stdstr(&abbr, iabbr);
-	strstrip(abbr);
-	toupperstr(abbr);
-	abLen = strlen(abbr);
-
-	if (abLen) {
-		min = 0;
-//		max = abbrevsCnt - 1;
-		max = abbrevsCnt;
-		while(1) {
-			target = min + ((max - min) / 2);
-			diff = strncmp(abbr, abbrevs[target].ab, abLen);
-			if ((!diff)||(target >= max)||(target <= min))
-				break;
-			if (diff > 0)
-				min = target;
-			else	max = target;
-		}
-		for (; target > 0; target--) {
-			if (strncmp(abbr, abbrevs[target-1].ab, abLen))
-				break;
-		}
-			
-		retVal = (!diff) ? abbrevs[target].book : -1;
-	}
-	delete [] abbr;
-	return retVal;
+	
+    // this is an ugly hack to help handling incorrect toupperstr()
+    // function for some locales. But locale need to have 
+    // entry like
+    // full_book_name=62, see for example ru.conf
+    if (retVal == -1 && doUpper) {
+      delete [] abbr;
+      doUpper = 0;
+      goto restart;
+    }
+    delete [] abbr;
+    return retVal;
 }
 
 /******************************************************************************
