/* An SLstring is required */ unsigned long _pSLstring_get_hash (SLstr_Type *s) { SLstring_Type *sls; if (s[0] == 0) return _pSLstring_hash ((unsigned char*)s, (unsigned char *)s); if (s[1] == 0) return _pSLstring_hash ((unsigned char *)s, (unsigned char *)s+1); sls = (SLstring_Type *) (s - offsetof(SLstring_Type,bytes[0])); return sls->hash; }
static unsigned long compute_hash (SLsmg_Char_Type *c, unsigned int n) { SLsmg_Char_Type *cmin, *cmax; int is_blank = 2; cmin = c; cmax = c + n; if (SLsmg_Scroll_Hash_Border > 0) { cmax -= SLsmg_Scroll_Hash_Border; cmin += SLsmg_Scroll_Hash_Border; } c = cmin; while ((c < cmax) && is_blank) { if ((c->wchars[0] != 32) || (c->nchars != 1)) is_blank--; c++; } if (is_blank) return 0; return _pSLstring_hash ((unsigned char *)cmin, (unsigned char *)cmax); }
/* This routine may be passed NULL-- it is not an error. */ void SLang_free_slstring (char *s) { unsigned long hash; unsigned int len; #if SLANG_OPTIMIZE_FOR_SPEED Cached_String_Type *cs; #endif if (s == NULL) return; #if SLANG_OPTIMIZE_FOR_SPEED cs = GET_CACHED_STRING(s); if (cs->str == s) { SLstring_Type *sls = cs->sls; if (sls->ref_count <= 1) { #if SLANG_OPTIMIZE_FOR_SPEED cs->sls = NULL; cs->str = Deleted_String; #endif free_sls_string (sls); } else sls->ref_count -= 1; return; } #endif if ((len = strlen (s)) < 2) return; hash = _pSLstring_hash ((unsigned char *)s, (unsigned char *) s + len); free_long_string (s, hash); }
unsigned long _pSLcompute_string_hash (SLCONST char *s) { #if SLANG_OPTIMIZE_FOR_SPEED Cached_String_Type *cs; cs = GET_CACHED_STRING(s); if (cs->str == s) return cs->sls->hash; #endif return _pSLstring_hash ((unsigned char *) s, (unsigned char *) s + strlen (s)); }
/* s cannot be NULL */ _INLINE_ static SLstr_Type *create_nstring (SLCONST char *s, unsigned int len, unsigned long *hash_ptr) { unsigned long hash; if (len < 2) return create_short_string (s, len); hash = _pSLstring_hash ((unsigned char *) s, (unsigned char *) (s + len)); *hash_ptr = hash; return create_long_string (s, len, hash); }
char *_pSLstring_make_hashed_string (SLCONST char *s, unsigned int len, unsigned long *hashptr) { unsigned long hash; if (s == NULL) return NULL; hash = _pSLstring_hash ((unsigned char *) s, (unsigned char *) s + len); *hashptr = hash; if (len < 2) return create_short_string (s, len); return create_long_string (s, len, hash); }
/* frees s upon error */ char *_pSLcreate_via_alloced_slstring (char *s, unsigned int len) { unsigned long hash; SLstring_Type *sls; if (s == NULL) return NULL; if (len < 2) { char *s1 = create_short_string (s, len); _pSLunallocate_slstring (s, len); return s1; } /* s is not going to be in the cache because when it was malloced, its * value was unknown. This simplifies the coding. */ hash = _pSLstring_hash ((unsigned char *)s, (unsigned char *)s + len); sls = find_string (s, len, hash); if (sls != NULL) { sls->ref_count++; _pSLunallocate_slstring (s, len); s = sls->bytes; #if SLANG_OPTIMIZE_FOR_SPEED cache_string (sls); #endif return s; } sls = (SLstring_Type *) (s - offsetof(SLstring_Type,bytes[0])); sls->ref_count = 1; sls->hash = hash; #if SLANG_OPTIMIZE_FOR_SPEED cache_string (sls); #endif hash = MAP_HASH_TO_INDEX(hash); sls->next = String_Hash_Table [(unsigned int)hash]; String_Hash_Table [(unsigned int)hash] = sls; return s; }