From 164d6782e47f0e495a444fa8db83fdce17837b3b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Henrik=20Grubbstr=C3=B6m=20=28Grubba=29?=
 <grubba@grubba.org>
Date: Sat, 20 Mar 1999 17:23:29 +0100
Subject: [PATCH] Improved case_info table packing density.

Rev: bin/make_ci.pike:1.3
Rev: src/builtin_functions.c:1.161
Rev: src/dummy_ci.h:1.2
---
 bin/make_ci.pike        | 25 ++++++++++++++-----------
 src/builtin_functions.c | 20 ++++++++++----------
 src/dummy_ci.h          |  4 ++--
 3 files changed, 26 insertions(+), 23 deletions(-)

diff --git a/bin/make_ci.pike b/bin/make_ci.pike
index fc693e87e3..4ad1ad4f0b 100644
--- a/bin/make_ci.pike
+++ b/bin/make_ci.pike
@@ -1,5 +1,5 @@
 /*
- * $Id: make_ci.pike,v 1.2 1999/03/20 02:56:34 grubba Exp $
+ * $Id: make_ci.pike,v 1.3 1999/03/20 16:23:26 grubba Exp $
  *
  * Creates the file case_info.h
  *
@@ -7,8 +7,8 @@
  */
 
 #define CIM_NONE	0	/* Case-less */
-#define CIM_UPPER	1	/* Upper-case, lower-case in data */
-#define CIM_LOWER	2	/* Lower-case, upper-case in data */
+#define CIM_UPPERDELTA	1	/* Upper-case, delta to lower-case in data */
+#define CIM_LOWERDELTA	2	/* Lower-case, -delta to upper-case in data */
 #define CIM_CASEBIT	3	/* Some case, case bit in data */
 #define CIM_CASEBITOFF	4	/* Same as above, but also offset by data */
 
@@ -38,7 +38,7 @@ int main(int argc, array(string) argv)
     int d;
     if (sizeof(info[13])) {
       // Upper-case char
-      mode = CIM_UPPER;
+      mode = CIM_UPPERDELTA;
       sscanf(info[13], "%04x", d);
       int delta = d - char;
       if (!(delta & (delta - 1)) && (delta > 0)) {
@@ -47,11 +47,11 @@ int main(int argc, array(string) argv)
 	} else {
 	  mode = CIM_CASEBITOFF;
 	}
-	d = delta;
       }
+      d = delta;
     } else if (sizeof(info[14])) {
       // Lower-case char
-      mode = CIM_LOWER;
+      mode = CIM_LOWERDELTA;
       sscanf(info[14], "%04x", d);
       int delta = char - d;
       if (!(delta & (delta - 1)) && (delta > 0)) {
@@ -60,8 +60,8 @@ int main(int argc, array(string) argv)
 	} else {
 	  mode = CIM_CASEBITOFF;
 	}
-	d = delta;
       }
+      d = delta;
     }
 
     if ((ci[-1][1] != mode) || (ci[-1][2] != d)) {
@@ -71,7 +71,9 @@ int main(int argc, array(string) argv)
   }
 
   write(sprintf("/*\n"
-		" * Created by $Id: make_ci.pike,v 1.2 1999/03/20 02:56:34 grubba Exp $ on %s"
+		" * Created by\n"
+		" * $Id: make_ci.pike,v 1.3 1999/03/20 16:23:26 grubba Exp $\n"
+		" * on %s"
 		" *\n"
 		" * Table used for looking up the case of\n"
 		" * Unicode characters.\n"
@@ -80,11 +82,12 @@ int main(int argc, array(string) argv)
 		" */\n\n", ctime(time())));
 
   foreach(ci, array(int) info) {
-    write(sprintf("{ 0x%04x, %s, 0x%04x, },\n",
+    write(sprintf("{ 0x%04x, %s, %s0x%04x, },\n",
 		  info[0],
-		  ({ "CIM_NONE", "CIM_UPPER", "CIM_LOWER",
+		  ({ "CIM_NONE", "CIM_UPPERDELTA", "CIM_LOWERDELTA",
 		     "CIM_CASEBIT", "CIM_CASEBITOFF" })[info[1]],
-		  info[2]));
+		  (info[2]<0)?"-":"",
+		  (info[2]<0)?-info[2]:info[2]));
   }
 
   exit(0);
diff --git a/src/builtin_functions.c b/src/builtin_functions.c
index c485807220..1613ae3201 100644
--- a/src/builtin_functions.c
+++ b/src/builtin_functions.c
@@ -5,7 +5,7 @@
 \*/
 /**/
 #include "global.h"
-RCSID("$Id: builtin_functions.c,v 1.160 1999/03/20 03:00:03 per Exp $");
+RCSID("$Id: builtin_functions.c,v 1.161 1999/03/20 16:23:27 grubba Exp $");
 #include "interpret.h"
 #include "svalue.h"
 #include "pike_macros.h"
@@ -159,8 +159,8 @@ struct case_info {
 };
 
 #define CIM_NONE	0	/* Case-less */
-#define CIM_UPPER	1	/* Upper-case, lower-case in data */
-#define CIM_LOWER	2	/* Lower-case, upper-case in data */
+#define CIM_UPPERDELTA	1	/* Upper-case, delta to lower-case in data */
+#define CIM_LOWERDELTA	2	/* Lower-case, -delta to upper-case in data */
 #define CIM_CASEBIT	3	/* Some case, case mask in data */
 #define CIM_CASEBITOFF	4	/* Same as above, but also offset by data */
 
@@ -203,9 +203,9 @@ static struct case_info *find_ci(int c)
     struct case_info *ci = find_ci(c); \
     if (ci) { \
       switch(ci->mode) { \
-      case CIM_NONE: case CIM_LOWER: break; \
-      case CIM_UPPER: C = ci->data; break; \
-      case CIM_CASEBIT: C |= ci->data; break; \
+      case CIM_NONE: case CIM_LOWERDELTA: break; \
+      case CIM_UPPERDELTA: C = c + ci->data; break; \
+      case CIM_CASEBIT: C = c | ci->data; break; \
       case CIM_CASEBITOFF: C = ((c - ci->data) | ci->data) + ci->data; break; \
       default: fatal("lower_case(): Unknown case_info mode: %d\n", ci->mode); \
     } \
@@ -217,9 +217,9 @@ static struct case_info *find_ci(int c)
     struct case_info *ci = find_ci(c); \
     if (ci) { \
       switch(ci->mode) { \
-      case CIM_NONE: case CIM_UPPER: break; \
-      case CIM_LOWER: C = ci->data; break; \
-      case CIM_CASEBIT: C &= ~ci->data; break; \
+      case CIM_NONE: case CIM_UPPERDELTA: break; \
+      case CIM_LOWERDELTA: C = c - ci->data; break; \
+      case CIM_CASEBIT: C = c & ~ci->data; break; \
       case CIM_CASEBITOFF: C = ((c - ci->data)& ~ci->data) + ci->data; break; \
       default: fatal("lower_case(): Unknown case_info mode: %d\n", ci->mode); \
     } \
@@ -274,7 +274,7 @@ void f_upper_case(INT32 args)
   get_all_args("upper_case",args,"%W",&orig);
 
   ret=begin_wide_shared_string(orig->len,orig->size_shift);
-  MEMCPY(ret->str, orig->str, orig->len);
+  MEMCPY(ret->str, orig->str, orig->len << orig->size_shift);
 
   i = orig->len;
 
diff --git a/src/dummy_ci.h b/src/dummy_ci.h
index 9d29a75e35..3cb68ef7d3 100644
--- a/src/dummy_ci.h
+++ b/src/dummy_ci.h
@@ -1,5 +1,5 @@
 /*
- * $Id: dummy_ci.h,v 1.1 1999/03/20 02:30:37 grubba Exp $
+ * $Id: dummy_ci.h,v 1.2 1999/03/20 16:23:29 grubba Exp $
  *
  * Fallback case_info file.
  * Only ISO-8859-1 in this one.
@@ -18,4 +18,4 @@
 { 0x00e0, CIM_CASEBIT, 0x0020, },
 { 0x00f7, CIM_NONE, 0x0000, },
 { 0x00f8, CIM_CASEBIT, 0x0020, },
-{ 0x00ff, CIM_LOWER, 0x0178, },
+{ 0x00ff, CIM_LOWERDELTA, -0x0079, },
-- 
GitLab