From f2859177d31a5f8bb14281baf43c30c5880d9eb6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fredrik=20H=C3=BCbinette=20=28Hubbe=29?= <hubbe@hubbe.net>
Date: Tue, 9 Mar 1999 18:41:18 -0800
Subject: [PATCH] hash patched

Rev: src/builtin_functions.c:1.154
Rev: src/pike_memory.c:1.34
Rev: src/pike_memory.h:1.10
---
 src/builtin_functions.c | 25 +++++++++++++++++++++++--
 src/pike_memory.c       | 19 ++++++++++++++++++-
 src/pike_memory.h       |  5 ++++-
 3 files changed, 45 insertions(+), 4 deletions(-)

diff --git a/src/builtin_functions.c b/src/builtin_functions.c
index 628e5ccd2f..7a3fe5ecba 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.153 1999/02/28 17:07:40 grubba Exp $");
+RCSID("$Id: builtin_functions.c,v 1.154 1999/03/10 02:41:15 hubbe Exp $");
 #include "interpret.h"
 #include "svalue.h"
 #include "pike_macros.h"
@@ -94,7 +94,28 @@ void f_hash(INT32 args)
     PIKE_ERROR("hash", "Too few arguments.\n", sp, 0);
   if(sp[-args].type != T_STRING)
     PIKE_ERROR("hash", "Bad argument 1.\n", sp, args);
-  i=hashstr((unsigned char *)sp[-args].u.string->str,100);
+
+  switch(sp[-args].u.string->size_shift)
+  {
+    case 0:
+      i=hashstr((unsigned char *)sp[-args].u.string->str,100);
+      break;
+
+    case 1:
+      i=simple_hashmem((unsigned char *)sp[-args].u.string->str,
+		       sp[-args].u.string->len << 1,
+		       200);
+      break;
+
+    case 2:
+      i=simple_hashmem((unsigned char *)sp[-args].u.string->str,
+		       sp[-args].u.string->len << 2,
+		       400);
+      break;
+
+    default:
+      fatal("Foo!\n");
+  }
   
   if(args > 1)
   {
diff --git a/src/pike_memory.c b/src/pike_memory.c
index 6600c7b1d2..607fc0eec9 100644
--- a/src/pike_memory.c
+++ b/src/pike_memory.c
@@ -10,7 +10,7 @@
 #include "pike_macros.h"
 #include "gc.h"
 
-RCSID("$Id: pike_memory.c,v 1.33 1999/03/05 02:15:02 hubbe Exp $");
+RCSID("$Id: pike_memory.c,v 1.34 1999/03/10 02:41:17 hubbe Exp $");
 
 /* strdup() is used by several modules, so let's provide it */
 #ifndef HAVE_STRDUP
@@ -242,6 +242,23 @@ unsigned INT32 hashstr(const unsigned char *str,INT32 maxn)
   return ret;
 }
 
+unsigned INT32 simple_hashmem(const unsigned char *str,INT32 len, INT32 maxn)
+{
+  unsigned INT32 ret,c;
+  
+  ret=len*92873743;
+
+  len=MINIMUM(maxn,len);
+  for(; len>=0; len--)
+  {
+    c=str++[0];
+    ret ^= ( ret << 4 ) + c ;
+    ret &= 0x7fffffff;
+  }
+
+  return ret;
+}
+
 
 /*
  * a quick memory search function.
diff --git a/src/pike_memory.h b/src/pike_memory.h
index a976141dc1..142079081f 100644
--- a/src/pike_memory.h
+++ b/src/pike_memory.h
@@ -5,7 +5,7 @@
 \*/
 
 /*
- * $Id: pike_memory.h,v 1.9 1999/02/27 21:53:44 grubba Exp $
+ * $Id: pike_memory.h,v 1.10 1999/03/10 02:41:18 hubbe Exp $
  */
 #ifndef MEMORY_H
 #define MEMORY_H
@@ -60,6 +60,7 @@ struct generic_mem_searcher
 #define MEMCHR0 MEMCHR
 
 /* Prototypes begin here */
+char *strdup(const char *str);
 int pcharp_memcmp(PCHARP a, PCHARP b, int sz);
 INLINE p_wchar1 *MEMCHR1(p_wchar1 *p,p_wchar1 c,INT32 e);
 INLINE p_wchar2 *MEMCHR2(p_wchar2 *p,p_wchar2 c,INT32 e);
@@ -68,6 +69,7 @@ void reverse(char *memory, INT32 nitems, INT32 size);
 void reorder(char *memory, INT32 nitems, INT32 size,INT32 *order);
 unsigned INT32 hashmem(const unsigned char *a,INT32 len,INT32 mlen);
 unsigned INT32 hashstr(const unsigned char *str,INT32 maxn);
+unsigned INT32 simple_hashmem(const unsigned char *str,INT32 len, INT32 maxn);
 void init_memsearch(struct mem_searcher *s,
 		    char *needle,
 		    SIZE_T needlelen,
@@ -94,6 +96,7 @@ void memfill(char *to,
 	     char *from,
 	     INT32 fromlen,
 	     INT32 offset);
+
 /* Prototypes end here */
 
 #undef BLOCK_ALLOC
-- 
GitLab