/** @file
  Root include file of C runtime library to support building the third-party
  libfdt library.

  Copyright (c) 2023, Intel Corporation. All rights reserved.<BR>
  SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#ifndef FDT_LIB_SUPPORT_H_
#define FDT_LIB_SUPPORT_H_

#include <Base.h>
#include <Library/BaseLib.h>
#include <Library/BaseMemoryLib.h>

typedef UINT8    uint8_t;
typedef UINT16   uint16_t;
typedef INT32    int32_t;
typedef UINT32   uint32_t;
typedef UINT64   uint64_t;
typedef UINTN    uintptr_t;
typedef UINTN    size_t;
typedef BOOLEAN  bool;

#define true   (1 == 1)
#define false  (1 == 0)

//
// Definitions for global constants used by libfdt library routines
//
#define INT_MAX     0x7FFFFFFF           /* Maximum (signed) int value */
#define INT32_MAX   0x7FFFFFFF           /* Maximum (signed) int32 value */
#define UINT32_MAX  0xFFFFFFFF           /* Maximum unsigned int32 value */

//
// Function prototypes of libfdt Library routines
//
void *
memset     (
  void *,
  int,
  size_t
  );

int
memcmp      (
  const void *,
  const void *,
  size_t
  );

int
strcmp      (
  const char *,
  const char *
  );

char *
strchr     (
  const char *,
  int
  );

char *
fdt_strrchr    (
  const char *,
  int
  );

unsigned long
fdt_strtoul     (
  const char *,
  char **,
  int
  );

char *
strcpy (
  char        *strDest,
  const char  *strSource
  );

//
// Macros that directly map functions to BaseLib, BaseMemoryLib, and DebugLib functions
//
#define memcpy(dest, source, count)         CopyMem(dest,source, (UINTN)(count))
#define memset(dest, ch, count)             SetMem(dest, (UINTN)(count),(UINT8)(ch))
#define memchr(buf, ch, count)              ScanMem8(buf, (UINTN)(count),(UINT8)ch)
#define memcmp(buf1, buf2, count)           (int)(CompareMem(buf1, buf2, (UINTN)(count)))
#define memmove(dest, source, count)        CopyMem(dest, source, (UINTN)(count))
#define strlen(str)                         (size_t)(AsciiStrLen(str))
#define strnlen(str, count)                 (size_t)(AsciiStrnLenS(str, count))
#define strncpy(strDest, strSource, count)  AsciiStrnCpyS(strDest, MAX_STRING_SIZE, strSource, (UINTN)count)
#define strcat(strDest, strSource)          AsciiStrCatS(strDest, MAX_STRING_SIZE, strSource)
#define strchr(str, ch)                     ScanMem8(str, AsciiStrSize (str), (UINT8)ch)
#define strcmp(string1, string2, count)     (int)(AsciiStrCmp(string1, string2))
#define strncmp(string1, string2, count)    (int)(AsciiStrnCmp(string1, string2, (UINTN)(count)))
#define strrchr(str, ch)                    fdt_strrchr(str, ch)
#define strtoul(ptr, end_ptr, base)         fdt_strtoul(ptr, end_ptr, base)

#endif /* FDT_LIB_SUPPORT_H_ */
