diff --git a/bin/make_ci.pike b/bin/make_ci.pike index fc693e87e34d98a421f9983e222badd7259db685..4ad1ad4f0b12523c3cdeff6a802894f2e5aa3048 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 c4858072209884065836916198d214083759c05d..1613ae3201fda4458b862312fa085856f3e271e1 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 9d29a75e359550e5e94c938f6597fa17bb214260..3cb68ef7d31c6ea5ee91fc9c69007ab13ade3495 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, },