/** @file
  Hash table operations.

Copyright (c) 2005 - 2015, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#include "Fat.h"

/**

  Get hash value for long name.

  @param  LongNameString        - The long name string to be hashed.

  @return HashValue.

**/
STATIC
UINT32
FatHashLongName (
  IN CHAR16   *LongNameString
  )
{
  UINT32  HashValue;
  CHAR16  UpCasedLongFileName[EFI_PATH_STRING_LENGTH];
  StrnCpyS (
    UpCasedLongFileName,
    ARRAY_SIZE (UpCasedLongFileName),
    LongNameString,
    ARRAY_SIZE (UpCasedLongFileName) - 1
    );
  FatStrUpr (UpCasedLongFileName);
  gBS->CalculateCrc32 (UpCasedLongFileName, StrSize (UpCasedLongFileName), &HashValue);
  return (HashValue & HASH_TABLE_MASK);
}

/**

  Get hash value for short name.

  @param  ShortNameString       - The short name string to be hashed.

  @return HashValue

**/
STATIC
UINT32
FatHashShortName (
  IN CHAR8   *ShortNameString
  )
{
  UINT32  HashValue;
  gBS->CalculateCrc32 (ShortNameString, FAT_NAME_LEN, &HashValue);
  return (HashValue & HASH_TABLE_MASK);
}

/**

  Search the long name hash table for the directory entry.

  @param  ODir                  - The directory to be searched.
  @param  LongNameString        - The long name string to search.

  @return The previous long name hash node of the directory entry.

**/
FAT_DIRENT **
FatLongNameHashSearch (
  IN FAT_ODIR       *ODir,
  IN CHAR16         *LongNameString
  )
{
  FAT_DIRENT  **PreviousHashNode;
  for (PreviousHashNode   = &ODir->LongNameHashTable[FatHashLongName (LongNameString)];
       *PreviousHashNode != NULL;
       PreviousHashNode   = &(*PreviousHashNode)->LongNameForwardLink
      ) {
    if (FatStriCmp (LongNameString, (*PreviousHashNode)->FileString) == 0) {
      break;
    }
  }

  return PreviousHashNode;
}

/**

  Search the short name hash table for the directory entry.

  @param  ODir                  - The directory to be searched.
  @param  ShortNameString       - The short name string to search.

  @return The previous short name hash node of the directory entry.

**/
FAT_DIRENT **
FatShortNameHashSearch (
  IN FAT_ODIR      *ODir,
  IN CHAR8         *ShortNameString
  )
{
  FAT_DIRENT  **PreviousHashNode;
  for (PreviousHashNode   = &ODir->ShortNameHashTable[FatHashShortName (ShortNameString)];
       *PreviousHashNode != NULL;
       PreviousHashNode   = &(*PreviousHashNode)->ShortNameForwardLink
      ) {
    if (CompareMem (ShortNameString, (*PreviousHashNode)->Entry.FileName, FAT_NAME_LEN) == 0) {
      break;
    }
  }

  return PreviousHashNode;
}

/**

  Insert directory entry to hash table.

  @param  ODir                  - The parent directory.
  @param  DirEnt                - The directory entry node.

**/
VOID
FatInsertToHashTable (
  IN FAT_ODIR     *ODir,
  IN FAT_DIRENT   *DirEnt
  )
{
  FAT_DIRENT  **HashTable;
  UINT32      HashTableIndex;

  //
  // Insert hash table index for short name
  //
  HashTableIndex                = FatHashShortName (DirEnt->Entry.FileName);
  HashTable                     = ODir->ShortNameHashTable;
  DirEnt->ShortNameForwardLink  = HashTable[HashTableIndex];
  HashTable[HashTableIndex]     = DirEnt;
  //
  // Insert hash table index for long name
  //
  HashTableIndex                = FatHashLongName (DirEnt->FileString);
  HashTable                     = ODir->LongNameHashTable;
  DirEnt->LongNameForwardLink   = HashTable[HashTableIndex];
  HashTable[HashTableIndex]     = DirEnt;
}

/**

  Delete directory entry from hash table.

  @param  ODir                  - The parent directory.
  @param  DirEnt                - The directory entry node.

**/
VOID
FatDeleteFromHashTable (
  IN FAT_ODIR     *ODir,
  IN FAT_DIRENT   *DirEnt
  )
{
  *FatShortNameHashSearch (ODir, DirEnt->Entry.FileName) = DirEnt->ShortNameForwardLink;
  *FatLongNameHashSearch (ODir, DirEnt->FileString)      = DirEnt->LongNameForwardLink;
}
