Browse Source

Using bitwise operations to convert case for character 256 to 311.

David Piuva 2 months ago
parent
commit
d890e6f25d
2 changed files with 12 additions and 6 deletions
  1. 10 6
      Source/DFPSR/api/stringAPI.cpp
  2. 2 0
      Source/test/tests/StringTest.cpp

+ 10 - 6
Source/DFPSR/api/stringAPI.cpp

@@ -115,24 +115,28 @@ bool dsr::string_caseInsensitiveMatch(const ReadableString& a, const ReadableStr
 }
 
 DsrChar dsr::character_upperCase(DsrChar character) {
-	if (U'a' <= character && character <= U'z') { // a (97) to z (122)
+	if (U'a' <= character && character <= U'z') { // a (97) to z (122) Ascii
 		return character - (U'a' - U'A');
-	} else if (U'à' <= character && character <= U'ö') { // à (224) to ö (246)
+	} else if (U'à' <= character && character <= U'ö') { // à (224) to ö (246) Latin-1
 		return character - (U'à' - U'À');
-	} else if (U'ø' <= character && character <= U'þ') { // ø (248) to þ (254)
+	} else if (U'ø' <= character && character <= U'þ') { // ø (248) to þ (254) Latin-1
 		return character - (U'ø' - U'Ø');
+	} else if (U'Ā' <= character && character <= U'ķ') { // Ā (256) to ķ (311)
+		return character & ~DsrChar(1);
 	} else {
 		return character;
 	}
 }
 
 DsrChar dsr::character_lowerCase(DsrChar character) {
-	if (U'A' <= character && character <= U'Z') { // A (65) to Z (90)
+	if (U'A' <= character && character <= U'Z') { // A (65) to Z (90) Ascii
 		return character + (U'a' - U'A');
-	} else if (U'À' <= character && character <= U'Ö') { // À (192) to Ö (214)
+	} else if (U'À' <= character && character <= U'Ö') { // À (192) to Ö (214) Latin-1
 		return character + (U'à' - U'À');
-	} else if (U'Ø' <= character && character <= U'Þ') { // Ø (216) to Þ (222)
+	} else if (U'Ø' <= character && character <= U'Þ') { // Ø (216) to Þ (222) Latin-1
 		return character + (U'ø' - U'Ø');
+	} else if (U'Ā' <= character && character <= U'ķ') { // Ā (256) to ķ (311)
+		return character | DsrChar(1);
 	} else {
 		return character;
 	}

+ 2 - 0
Source/test/tests/StringTest.cpp

@@ -188,6 +188,7 @@ START_TEST(String)
 	ASSERT_EQUAL(dsr::string_upperCase(U"!%& abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ"), U"!%& ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ");
 	ASSERT_EQUAL(dsr::string_upperCase(U"àáâãäåæçèéêëìíîïðñòóôõöÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ"), U"ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ");
 	ASSERT_EQUAL(dsr::string_upperCase(U"øùúûüýþØÙÚÛÜÝÞ"), U"ØÙÚÛÜÝÞØÙÚÛÜÝÞ");
+	ASSERT_EQUAL(dsr::string_upperCase(U"āăąćĉċčďđēĕėęěĝğġģĥħĩīĭįıijĵķ ĸ ĀĂĄĆĈĊČĎĐĒĔĖĘĚĜĞĠĢĤĦĨĪĬĮİIJĴĶ"), U"ĀĂĄĆĈĊČĎĐĒĔĖĘĚĜĞĠĢĤĦĨĪĬĮİIJĴĶ ĸ ĀĂĄĆĈĊČĎĐĒĔĖĘĚĜĞĠĢĤĦĨĪĬĮİIJĴĶ");
 	// Lower case
 	ASSERT_EQUAL(dsr::string_lowerCase(U"a"), U"a");
 	ASSERT_EQUAL(dsr::string_lowerCase(U"aB"), U"ab");
@@ -198,6 +199,7 @@ START_TEST(String)
 	ASSERT_EQUAL(dsr::string_lowerCase(U"!%& abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ"), U"!%& abcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz");
 	ASSERT_EQUAL(dsr::string_lowerCase(U"àáâãäåæçèéêëìíîïðñòóôõöÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ"), U"àáâãäåæçèéêëìíîïðñòóôõöàáâãäåæçèéêëìíîïðñòóôõö");
 	ASSERT_EQUAL(dsr::string_lowerCase(U"øùúûüýþØÙÚÛÜÝÞ"), U"øùúûüýþøùúûüýþ");
+	ASSERT_EQUAL(dsr::string_lowerCase(U"āăąćĉċčďđēĕėęěĝğġģĥħĩīĭįıijĵķ ĸ ĀĂĄĆĈĊČĎĐĒĔĖĘĚĜĞĠĢĤĦĨĪĬĮİIJĴĶ"), U"āăąćĉċčďđēĕėęěĝğġģĥħĩīĭįıijĵķ ĸ āăąćĉċčďđēĕėęěĝğġģĥħĩīĭįıijĵķ");
 	// White space removal by pointing to a section of the original input
 	ASSERT_EQUAL(dsr::string_removeOuterWhiteSpace(U" "), U"");
 	ASSERT_EQUAL(dsr::string_removeOuterWhiteSpace(U"  abc  "), U"abc");