summaryrefslogtreecommitdiff
path: root/srfi/srfi-14.c
diff options
context:
space:
mode:
authorMartin Grabmüller <mgrabmue@cs.tu-berlin.de>2001-07-16 15:47:02 +0000
committerMartin Grabmüller <mgrabmue@cs.tu-berlin.de>2001-07-16 15:47:02 +0000
commitcebf3d62d915cb73ca5cc6b99e3fa006c4d0a15a (patch)
treec5b85d80ae3881dacada5b15454b9ca9b821743d /srfi/srfi-14.c
parent63bcad1964527df2d658035766467b2f782fb043 (diff)
downloadguile-cebf3d62d915cb73ca5cc6b99e3fa006c4d0a15a.tar.gz
* srfi-14.c: Allocate correct memory size for charsets (32 bytes),
use this value for initializing and comparing charsets. (scm_char_set_hash): Use ``better'' hash algorithm which produces more values.
Diffstat (limited to 'srfi/srfi-14.c')
-rw-r--r--srfi/srfi-14.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/srfi/srfi-14.c b/srfi/srfi-14.c
index 685ee89bc..878349158 100644
--- a/srfi/srfi-14.c
+++ b/srfi/srfi-14.c
@@ -94,8 +94,8 @@ make_char_set (const char * func_name)
{
long * p;
- p = scm_must_malloc (SCM_CHARSET_SIZE, func_name);
- memset (p, 0, SCM_CHARSET_SIZE);
+ p = scm_must_malloc (SCM_CHARSET_SIZE / sizeof (char), func_name);
+ memset (p, 0, SCM_CHARSET_SIZE / sizeof (char));
SCM_RETURN_NEWSMOB (scm_tc16_charset, p);
}
@@ -131,7 +131,8 @@ SCM_DEFINE (scm_char_set_eq, "char-set=", 0, 0, 1,
csi_data = (long *) SCM_SMOB_DATA (csi);
if (cs1_data == NULL)
cs1_data = csi_data;
- else if (memcmp (cs1_data, csi_data, SCM_CHARSET_SIZE) != 0)
+ else if (memcmp (cs1_data, csi_data,
+ SCM_CHARSET_SIZE / sizeof (char)) != 0)
return SCM_BOOL_F;
char_sets = SCM_CDR (char_sets);
}
@@ -204,7 +205,8 @@ SCM_DEFINE (scm_char_set_hash, "char-set-hash", 1, 1, 0,
p = (long *) SCM_SMOB_DATA (cs);
for (k = 0; k < SCM_CHARSET_SIZE / sizeof (long); k++)
{
- val = p[k] ^ val;
+ if (p[k] != 0)
+ val = p[k] + (val << 1);
}
return SCM_MAKINUM (val % bnd);
}
@@ -1368,7 +1370,7 @@ scm_c_init_srfi_14 (void)
if (!initialized)
{
scm_tc16_charset = scm_make_smob_type ("character-set",
- SCM_CHARSET_SIZE * sizeof (long));
+ SCM_CHARSET_SIZE / sizeof (char));
scm_set_smob_free (scm_tc16_charset, charset_free);
scm_set_smob_print (scm_tc16_charset, charset_print);
initialized = 1;