Ejemplo n.º 1
0
/* 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;
}
Ejemplo n.º 2
0
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);
}
Ejemplo n.º 3
0
/* 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);
}
Ejemplo n.º 4
0
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));
}
Ejemplo n.º 5
0
/* 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);
}
Ejemplo n.º 6
0
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);
}
Ejemplo n.º 7
0
/* 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;
}