119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* Description of GNU message catalog format: string hashing function.
219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   Copyright (C) 1995, 1997-1998, 2000-2003 Free Software Foundation, Inc.
319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   This program is free software; you can redistribute it and/or modify it
519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   under the terms of the GNU Library General Public License as published
619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   by the Free Software Foundation; either version 2, or (at your option)
719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   any later version.
819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   This program is distributed in the hope that it will be useful,
1019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   but WITHOUT ANY WARRANTY; without even the implied warranty of
1119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
1219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   Library General Public License for more details.
1319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
1419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   You should have received a copy of the GNU Library General Public
1519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   License along with this program; if not, write to the Free Software
1619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
1719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   USA.  */
1819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
1919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* @@ end of prolog @@ */
2019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
2119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* We assume to have `unsigned long int' value with at least 32 bits.  */
2219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#define HASHWORDBITS 32
2319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
2419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
2519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* Defines the so called `hashpjw' function by P.J. Weinberger
2619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   [see Aho/Sethi/Ullman, COMPILERS: Principles, Techniques and Tools,
2719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   1986, 1987 Bell Telephone Laboratories, Inc.]  */
2819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic inline unsigned long int
2919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projecthash_string (const char *str_param)
3019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
3119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  unsigned long int hval, g;
3219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  const char *str = str_param;
3319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
3419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  /* Compute the hash value for the given string.  */
3519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  hval = 0;
3619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  while (*str != '\0')
3719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    {
3819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      hval <<= 4;
3919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      hval += (unsigned char) *str++;
4019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      g = hval & ((unsigned long int) 0xf << (HASHWORDBITS - 4));
4119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      if (g != 0)
4219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	{
4319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  hval ^= g >> (HASHWORDBITS - 8);
4419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  hval ^= g;
4519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
4619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    }
4719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  return hval;
4819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
49