summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/fnv_hash.h25
-rw-r--r--include/proto.h1
-rw-r--r--mbbsd/read.c3
-rw-r--r--mbbsd/stuff.c6
4 files changed, 33 insertions, 2 deletions
diff --git a/include/fnv_hash.h b/include/fnv_hash.h
index 837fd66c..c85b3c27 100644
--- a/include/fnv_hash.h
+++ b/include/fnv_hash.h
@@ -70,6 +70,31 @@ fnv1a_32_strcase(const char *str, Fnv32_t hval)
return hval;
}
+static __inline Fnv32_t
+fnv1a_32_dbcs_strcase(const char *str, Fnv32_t hval)
+{
+ const unsigned char *s = (const unsigned char *)str;
+ Fnv32_t c;
+ char isDBCS = 0;
+
+ while ((c = *s++) != 0) {
+ if (isDBCS)
+ {
+ // 2nd DBCS
+ isDBCS = 0;
+ } else {
+ // ASCII?
+ if ( c < 0x80)
+ c = toupper(c);
+ else
+ isDBCS = 1;
+ }
+ hval ^= c;
+ hval *= FNV_32_PRIME;
+ }
+ return hval;
+}
+
static __inline Fnv64_t
fnv_64_buf(const void *buf, size_t len, Fnv64_t hval)
{
diff --git a/include/proto.h b/include/proto.h
index 3f80eacc..41012158 100644
--- a/include/proto.h
+++ b/include/proto.h
@@ -811,6 +811,7 @@ int Goodbye(void);
/* toolkit */
unsigned StringHash(const char *s);
+unsigned DBCS_StringHash(const char *s);
/* passwd */
int passwd_init(void);
diff --git a/mbbsd/read.c b/mbbsd/read.c
index eb58e360..9e1dbb14 100644
--- a/mbbsd/read.c
+++ b/mbbsd/read.c
@@ -1,6 +1,5 @@
/* $Id$ */
#include "bbs.h"
-#include "fnv_hash.h"
static int headers_size;
static fileheader_t *headers = NULL;
@@ -221,7 +220,7 @@ getkeep(const char *s, int def_topline, int def_cursline)
static struct keepsome preserv_keepblock;
static struct keepsome *keeplist = &preserv_keepblock;
struct keeploc_t *p;
- unsigned int key=fnv1a_32_str(s, FNV1_32_INIT);
+ unsigned key=DBCS_StringHash(s);
int i;
if (def_cursline >= 0) {
diff --git a/mbbsd/stuff.c b/mbbsd/stuff.c
index 4e5fd8cb..19049c8b 100644
--- a/mbbsd/stuff.c
+++ b/mbbsd/stuff.c
@@ -961,6 +961,12 @@ StringHash(const char *s)
return fnv1a_32_strcase(s, FNV1_32_INIT);
}
+unsigned
+DBCS_StringHash(const char *s)
+{
+ return fnv1a_32_dbcs_strcase(s, FNV1_32_INIT);
+}
+
inline int *intbsearch(int key, const int *base0, int nmemb)
{
/* §ï¦Û /usr/src/lib/libc/stdlib/bsearch.c ,