/** @file
  CompareMem() implementation.

  Copyright (c) 2006, Intel Corporation<BR>
  All rights reserved. This program and the accompanying materials
  are licensed and made available under the terms and conditions of the BSD License
  which accompanies this distribution.  The full text of the license may be found at
  http://opensource.org/licenses/bsd-license.php

  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.

  Module Name:  CompareMemWrapper.c

  The following BaseMemoryLib instances share the same version of this file:

    BaseMemoryLib
    BaseMemoryLibMmx
    BaseMemoryLibSse2
    BaseMemoryLibRepStr
    PeiMemoryLib
    UefiMemoryLib

**/

#include "MemLibInternals.h"

/**
  Compares two memory buffers of a given length.

  This function compares Length bytes of SourceBuffer to Length bytes of
  DestinationBuffer. If all Length bytes of the two buffers are identical, then
  0 is returned. Otherwise, the value returned is the first mismatched byte in
  SourceBuffer subtracted from the first mismatched byte in DestinationBuffer.

  If DestinationBuffer is NULL and Length > 0, then ASSERT().
  If SourceBuffer is NULL and Length > 0, then ASSERT().
  If Length is greater than (MAX_ADDRESS - DestinationBuffer + 1), then
  ASSERT().
  If Length is greater than (MAX_ADDRESS - SourceBuffer + 1), then ASSERT().

  @param  DestinationBuffer First memory buffer
  @param  SourceBuffer      Second memory buffer
  @param  Length            Length of DestinationBuffer and SourceBuffer memory
                            regions to compare

  @retval 0         if DestinationBuffer == SourceBuffer
  @retval Non-zero  if DestinationBuffer != SourceBuffer

**/
INTN
EFIAPI
CompareMem (
  IN      CONST VOID                *DestinationBuffer,
  IN      CONST VOID                *SourceBuffer,
  IN      UINTN                     Length
  )
{
  ASSERT (DestinationBuffer != NULL);
  ASSERT (SourceBuffer != NULL);
  ASSERT (Length <= MAX_ADDRESS - (UINTN)DestinationBuffer + 1);
  ASSERT (Length <= MAX_ADDRESS - (UINTN)SourceBuffer + 1);
  if (Length == 0) {
    return 0;
  }
  return InternalMemCompareMem (DestinationBuffer, SourceBuffer, Length);
}
