/** @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>
  Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. All rights reserved.<BR>
  SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#pragma once

#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;

#if defined __STDC_VERSION__ && __STDC_VERSION__ > 201710L
/* bool, true and false are keywords.  */
#else
typedef BOOLEAN bool;
#define true   (1 == 1)
#define false  (1 == 0)
#endif

//
// 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
  );

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 strchr(str, ch)               ScanMem8(str, AsciiStrSize (str), (UINT8)ch)
#define strrchr(str, ch)              fdt_strrchr(str, ch)
#define strtoul(ptr, end_ptr, base)   fdt_strtoul(ptr, end_ptr, base)
