From a4bfcbd8d9ad9c56995fa4a6736480fc11ce1bd4 Mon Sep 17 00:00:00 2001
From: Andreas Karlsson <andreas@proxel.se>
Date: Fri, 20 Dec 2024 02:00:33 +0100
Subject: [PATCH v1 2/2] Reduce code duplication in ICU case mapping code

---
 src/backend/utils/adt/pg_locale_icu.c | 74 ++++++++++-----------------
 1 file changed, 26 insertions(+), 48 deletions(-)

diff --git a/src/backend/utils/adt/pg_locale_icu.c b/src/backend/utils/adt/pg_locale_icu.c
index eea6f48f6c3..905b2308fbd 100644
--- a/src/backend/utils/adt/pg_locale_icu.c
+++ b/src/backend/utils/adt/pg_locale_icu.c
@@ -101,6 +101,9 @@ static size_t icu_from_uchar(char *dest, size_t destsize,
 							 const UChar *buff_uchar, int32_t len_uchar);
 static void icu_set_collation_attributes(UCollator *collator, const char *loc,
 										 UErrorCode *status);
+static int32_t icu_convert_case_no_utf8(ICU_Convert_Func func, char *dest,
+										size_t destsize, const char *src,
+										ssize_t srclen, pg_locale_t locale);
 static int32_t icu_convert_case_uchar(ICU_Convert_Func func, pg_locale_t mylocale,
 									  UChar **buff_dest, UChar *buff_source,
 									  int32_t len_source);
@@ -371,22 +374,7 @@ strlower_icu(char *dest, size_t destsize, const char *src, ssize_t srclen,
 		return needed;
 	}
 	else
-	{
-		int32_t		len_uchar;
-		int32_t		len_conv;
-		UChar	   *buff_uchar;
-		UChar	   *buff_conv;
-		size_t		result_len;
-
-		len_uchar = icu_to_uchar(&buff_uchar, src, srclen);
-		len_conv = icu_convert_case_uchar(u_strToLower, locale, &buff_conv,
-										  buff_uchar, len_uchar);
-		result_len = icu_from_uchar(dest, destsize, buff_conv, len_conv);
-		pfree(buff_uchar);
-		pfree(buff_conv);
-
-		return result_len;
-	}
+		return icu_convert_case_no_utf8(u_strToLower, dest, destsize, src, srclen, locale);
 }
 
 size_t
@@ -413,22 +401,7 @@ strtitle_icu(char *dest, size_t destsize, const char *src, ssize_t srclen,
 		return needed;
 	}
 	else
-	{
-		int32_t		len_uchar;
-		int32_t		len_conv;
-		UChar	   *buff_uchar;
-		UChar	   *buff_conv;
-		size_t		result_len;
-
-		len_uchar = icu_to_uchar(&buff_uchar, src, srclen);
-		len_conv = icu_convert_case_uchar(u_strToTitle_default_BI, locale, &buff_conv,
-										  buff_uchar, len_uchar);
-		result_len = icu_from_uchar(dest, destsize, buff_conv, len_conv);
-		pfree(buff_uchar);
-		pfree(buff_conv);
-
-		return result_len;
-	}
+		return icu_convert_case_no_utf8(u_strToTitle_default_BI, dest, destsize, src, srclen, locale);
 }
 
 size_t
@@ -455,22 +428,7 @@ strupper_icu(char *dest, size_t destsize, const char *src, ssize_t srclen,
 		return needed;
 	}
 	else
-	{
-		int32_t		len_uchar;
-		int32_t		len_conv;
-		UChar	   *buff_uchar;
-		UChar	   *buff_conv;
-		size_t		result_len;
-
-		len_uchar = icu_to_uchar(&buff_uchar, src, srclen);
-		len_conv = icu_convert_case_uchar(u_strToUpper, locale, &buff_conv,
-										  buff_uchar, len_uchar);
-		result_len = icu_from_uchar(dest, destsize, buff_conv, len_conv);
-		pfree(buff_uchar);
-		pfree(buff_conv);
-
-		return result_len;
-	}
+		return icu_convert_case_no_utf8(u_strToUpper, dest, destsize, src, srclen, locale);
 }
 
 /*
@@ -665,6 +623,26 @@ icu_from_uchar(char *dest, size_t destsize, const UChar *buff_uchar, int32_t len
 	return len_result;
 }
 
+static int32_t
+icu_convert_case_no_utf8(ICU_Convert_Func func, char *dest, size_t destsize,
+						 const char *src, ssize_t srclen, pg_locale_t locale)
+{
+	int32_t		len_uchar;
+	int32_t		len_conv;
+	UChar	   *buff_uchar;
+	UChar	   *buff_conv;
+	size_t		result_len;
+
+	len_uchar = icu_to_uchar(&buff_uchar, src, srclen);
+	len_conv = icu_convert_case_uchar(func, locale, &buff_conv,
+									  buff_uchar, len_uchar);
+	result_len = icu_from_uchar(dest, destsize, buff_conv, len_conv);
+	pfree(buff_uchar);
+	pfree(buff_conv);
+
+	return result_len;
+}
+
 static int32_t
 icu_convert_case_uchar(ICU_Convert_Func func, pg_locale_t mylocale,
 					   UChar **buff_dest, UChar *buff_source, int32_t len_source)
-- 
2.45.2

