>From f261f9bb71d1bead6639de9e4a33b6d6916b33e1 Mon Sep 17 00:00:00 2001
From: Vladimir Sedach <vas@oneofus.la>
Date: Sun, 3 May 2020 17:56:37 -0700
Subject: [PATCH 2/2] character.d: Fixed ecl_string_case Unicode handling

---
 CHANGELOG                    |  3 +++
 src/c/character.d            | 14 +++++++-------
 src/c/printer/write_symbol.d |  4 +---
 3 files changed, 11 insertions(+), 10 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index f6d611b4..a8049c07 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -28,6 +28,9 @@
     parameter given to configure script).

 * Pending changes since 20.4.24
+** Issues fixed
+- Compiling Unicode symbol names with :INVERT READTABLE-CASE
+- Pathname functions :CASE :COMMON argument with Unicode pathnames
 * 20.4.24 changes since 16.1.3
 ** Announcement
 Dear Community,
diff --git a/src/c/character.d b/src/c/character.d
index a69b6e4b..fa0b0bf8 100644
--- a/src/c/character.d
+++ b/src/c/character.d
@@ -99,23 +99,23 @@ cl_both_case_p(cl_object c)
 int
 ecl_string_case(cl_object s)
 {
+  /* Returns 1 if string is all uppercase, -1 if all lowercase, and 0 if mixed case */
   int upcase;
   cl_index i;
-  ecl_base_char *text;
-
+
   switch (ecl_t_of(s)) {
 #ifdef ECL_UNICODE
   case t_string:
-    s = si_coerce_to_base_string(s);
 #endif
   case t_base_string:
-    text = (ecl_base_char*)s->base_string.self;
-    for (i = 0, upcase = 0; i < s->base_string.dim; i++) {
-      if (ecl_upper_case_p(text[i])) {
+    for (i = 0, upcase = 0; i < s->base_string.fillp; i++) {
+      ecl_character c = ecl_char(s, i);
+
+      if (ecl_upper_case_p(c)) {
         if (upcase < 0)
           return 0;
         upcase = +1;
-      } else if (ecl_lower_case_p(text[i])) {
+      } else if (ecl_lower_case_p(c)) {
         if (upcase > 0)
           return 0;
         upcase = -1;
diff --git a/src/c/printer/write_symbol.d b/src/c/printer/write_symbol.d
index a39bab97..ab4c05e0 100644
--- a/src/c/printer/write_symbol.d
+++ b/src/c/printer/write_symbol.d
@@ -62,8 +62,6 @@ potential_number_p(cl_object s, int base)
   return some_digit;
 }

-#define needs_to_be_inverted(s) (ecl_string_case(s) != 0)
-
 static bool
 all_dots(cl_object s)
 {
@@ -119,7 +117,7 @@ write_symbol_string(cl_object s, int action, cl_object print_case,
   cl_index i;
   bool capitalize;
   if (action == ecl_case_invert) {
-    if (!needs_to_be_inverted(s))
+    if (ecl_string_case(s) == 0)
       action = ecl_case_preserve;
   }
   cl_object buffer = si_get_buffer_string();
--
2.20.1

