コード例 #1
0
ファイル: symtab.c プロジェクト: mbref/gcc-microblaze
hashnode
ht_lookup_with_hash (cpp_hash_table *table, const unsigned char *str,
                     size_t len, unsigned int hash,
                     enum ht_lookup_option insert)
{
    unsigned int hash2;
    unsigned int index;
    unsigned int deleted_index = table->nslots;
    size_t sizemask;
    hashnode node;

    sizemask = table->nslots - 1;
    index = hash & sizemask;
    table->searches++;

    node = table->entries[index];

    if (node != NULL)
    {
        if (node == DELETED)
            deleted_index = index;
        else if (node->hash_value == hash
                 && HT_LEN (node) == (unsigned int) len
                 && !memcmp (HT_STR (node), str, len))
            return node;

        /* hash2 must be odd, so we're guaranteed to visit every possible
        location in the table during rehashing.  */
        hash2 = ((hash * 17) & sizemask) | 1;

        for (;;)
        {
            table->collisions++;
            index = (index + hash2) & sizemask;
            node = table->entries[index];
            if (node == NULL)
                break;

            if (node == DELETED)
            {
                if (deleted_index != table->nslots)
                    deleted_index = index;
            }
            else if (node->hash_value == hash
                     && HT_LEN (node) == (unsigned int) len
                     && !memcmp (HT_STR (node), str, len))
                return node;
        }
    }

    if (insert == HT_NO_INSERT)
        return NULL;

    /* We prefer to overwrite the first deleted slot we saw.  */
    if (deleted_index != table->nslots)
        index = deleted_index;

    node = (*table->alloc_node) (table);
    table->entries[index] = node;

    HT_LEN (node) = (unsigned int) len;
    node->hash_value = hash;

    if (table->alloc_subobject)
    {
        char *chars = (char *) table->alloc_subobject (len + 1);
        memcpy (chars, str, len);
        chars[len] = '\0';
        HT_STR (node) = (const unsigned char *) chars;
    }
    else
        HT_STR (node) = (const unsigned char *) obstack_copy0 (&table->stack,
                        str, len);

    if (++table->nelements * 4 >= table->nslots * 3)
        /* Must expand the string table.  */
        ht_expand (table);

    return node;
}
コード例 #2
0
hashnode
ht_lookup_with_hash (hash_table *table, const unsigned char *str,
                     size_t len, unsigned int hash,
                     enum ht_lookup_option insert)
{
  unsigned int hash2;
  unsigned int index;
  size_t sizemask;
  hashnode node;

  sizemask = table->nslots - 1;
  index = hash & sizemask;
  table->searches++;

  node = table->entries[index];
 
  if (node != NULL)
    {
      if (node->hash_value == hash
          && HT_LEN (node) == (unsigned int) len
          && !memcmp (HT_STR (node), str, len))
        {
          if (insert == HT_ALLOCED)
            /* The string we search for was placed at the end of the
               obstack.  Release it.  */
            obstack_free (&table->stack, (void *) str);
          return node;
        }

      /* hash2 must be odd, so we're guaranteed to visit every possible
         location in the table during rehashing.  */
      hash2 = ((hash * 17) & sizemask) | 1;

      for (;;)
        {
          table->collisions++;
          index = (index + hash2) & sizemask;
          node = table->entries[index];
          if (node == NULL)
            break;

          if (node->hash_value == hash
              && HT_LEN (node) == (unsigned int) len
              && !memcmp (HT_STR (node), str, len))
            {
              if (insert == HT_ALLOCED)
              /* The string we search for was placed at the end of the
                 obstack.  Release it.  */
                obstack_free (&table->stack, (void *) str);
              return node;
            }
        }
    }

  if (insert == HT_NO_INSERT)
    return NULL;

  node = (*table->alloc_node) (table);
  table->entries[index] = node;

  HT_LEN (node) = (unsigned int) len;
  node->hash_value = hash;
  if (insert == HT_ALLOC)
    HT_STR (node) = (const unsigned char *) obstack_copy0 (&table->stack,
                                                           str, len);
  else
    HT_STR (node) = str;

  if (++table->nelements * 4 >= table->nslots * 3)
    /* Must expand the string table.  */
    ht_expand (table);

  return node;
}