#include <assert.h>
#include <malloc.h>
#include <stdint.h>
#include <stdio.h>
#include <string.h>

/* mingw-w64 headers */
#include "libtest.h"

#define TEST(xfail, a, b, msg, ...) do { \
  if ((a) != (b)) { \
    fprintf(stderr, "%s:%d: ", __FILE__, __LINE__); \
    fprintf(stderr, msg, ##__VA_ARGS__); \
    fputc('\n', stderr); \
      if (!xfail) { \
        return 1; \
      } \
  } \
} while (0)

#define TEST_MEM(xfail, ptr, byte, size, msg, ...) do { \
  size_t i; \
  for (i = 0; i < size; i++) { \
    if (((unsigned char *)ptr)[i] != (unsigned char)byte) { \
      fprintf(stderr, "%s:%d: ", __FILE__, __LINE__); \
      fprintf(stderr, msg, ##__VA_ARGS__); \
      fputc('\n', stderr); \
      if (!xfail) { \
        return 1; \
      } \
    } \
  } \
} while (0)

#ifndef BROKEN_REALLOC_SHRINK
#if defined(__aarch64__)
/* On aarch64, with both UCRT and msvcrt.dll, an _aligned_realloc that attempts
 * to shrink the allocation, ends up not shrinking it in practice, leading to
 * failures in some of these tests. Ignore those test failures. This is
 * observed on both Windows 10 rev 19041 and Windows 11 rev 22000 and 22631.
 *
 * This issue has been reported upstream at
 * https://developercommunity.visualstudio.com/t/ARM64-_aligned_recalloc-fails-to-zero-in/10954724.
 */
#define BROKEN_REALLOC_SHRINK 1
#else
#define BROKEN_REALLOC_SHRINK 0
#endif
#endif

int main() {
  void *ptr;
  size_t size;

  mingw_test_init ();

  /*
   * Surprisingly this malloc/_msize test is failing on msvcrt10.dll and msvcrt20.dll
   * because these two CRT libraries are buggy and return _msize rounded to even number.
   * So it means that also mingw-w64 _aligned_msize function (wrapper around _msize)
   * returns wrong value when using those two CRT libraries.
   */
#if __MSVCRT_VERSION__ >= 0x100 && __MSVCRT_VERSION__ <= 0x200
  return 77;
#endif


  ptr = malloc(231);
  assert(ptr != NULL);
  size = _msize(ptr);
  TEST(0, size, 231, "_msize: ptr 0x%p has incorrect size %lu", ptr, (unsigned long)size);
  free(ptr);


  ptr = malloc(1000);
  assert(ptr != NULL);

  size = _msize(ptr);
  TEST(0, size, 1000, "_msize: ptr 0x%p has incorrect size %lu", ptr, (unsigned long)size);

  memset(ptr, 0x01, 1000);

  ptr = _recalloc(ptr, 100, 1);
  assert(ptr != NULL);

  size = _msize(ptr);
  TEST(0, size, 100, "_msize: ptr 0x%p has incorrect size %lu", ptr, (unsigned long)size);

  ptr = _recalloc(ptr, 200, 1);
  assert(ptr != NULL);

  size = _msize(ptr);
  TEST(0, size, 200, "_msize: ptr 0x%p has incorrect size %lu", ptr, (unsigned long)size);

  TEST_MEM(0, ptr, 0x01, 100, "_recalloc: 0x%p has incorrect byte 0x%02x at %lu", ptr, ((unsigned char *)ptr)[i], (unsigned long)i);
  TEST_MEM(0, ptr+100, 0x00, 100, "_recalloc: 0x%p has incorrect byte 0x%02x at %lu", ptr, ((unsigned char *)ptr)[i+100], (unsigned long)i+100);

  free(ptr);


  ptr = _aligned_malloc(100, 128);
  assert(ptr != NULL);
  TEST(0, (uintptr_t)ptr % 128, 0, "_aligned_malloc: ptr 0x%p is not aligned", ptr);

  size = _aligned_msize(ptr, 128, 0);
  TEST(0, size, 100, "_aligned_msize: ptr 0x%p has incorrect size %lu", ptr, (unsigned long)size);

  memset(ptr, 0x01, 100);

  ptr = _aligned_realloc(ptr, 2000, 128);
  assert(ptr != NULL);
  TEST(0, (uintptr_t)ptr % 128, 0, "_aligned_realloc: ptr 0x%p is not aligned", ptr);

  size = _aligned_msize(ptr, 128, 0);
  TEST(0, size, 2000, "_aligned_msize: ptr 0x%p has incorrect size %lu", ptr, (unsigned long)size);

  TEST_MEM(0, ptr, 0x01, 100, "_aligned_realloc: 0x%p has incorrect byte 0x%02x at %lu", ptr, ((unsigned char *)ptr)[i], (unsigned long)i);

  memset(ptr, 0x02, 2000);

  ptr = _aligned_realloc(ptr, 10, 128);
  assert(ptr != NULL);
  TEST(0, (uintptr_t)ptr % 128, 0, "_aligned_realloc: ptr 0x%p is not aligned", ptr);

  size = _aligned_msize(ptr, 128, 0);
  TEST(BROKEN_REALLOC_SHRINK, size, 10, "_aligned_msize: ptr 0x%p has incorrect size %lu", ptr, (unsigned long)size);

  ptr = _aligned_recalloc(ptr, 20, 1, 128);
  assert(ptr != NULL);
  TEST(0, (uintptr_t)ptr % 128, 0, "_aligned_recalloc: ptr 0x%p is not aligned", ptr);

  size = _aligned_msize(ptr, 128, 0);
  TEST(BROKEN_REALLOC_SHRINK, size, 20, "_aligned_msize: ptr 0x%p has incorrect size %lu", ptr, (unsigned long)size);

  TEST_MEM(0, ptr, 0x02, 10, "_aligned_recalloc: 0x%p has incorrect byte 0x%02x at %lu", ptr, ((unsigned char *)ptr)[i], (unsigned long)i);
  TEST_MEM(BROKEN_REALLOC_SHRINK, ptr+10, 0x00, 10, "_aligned_recalloc: 0x%p has incorrect byte 0x%02x at %lu", ptr, ((unsigned char *)ptr)[i+10], (unsigned long)i+10);

  ptr = _aligned_recalloc(ptr, 3, 2, 128);
  assert(ptr != NULL);
  TEST(0, (uintptr_t)ptr % 128, 0, "_aligned_recalloc: ptr 0x%p is not aligned", ptr);

  TEST_MEM(0, ptr, 0x02, 6, "_aligned_recalloc: 0x%p has incorrect byte 0x%02x at %lu", ptr, ((unsigned char *)ptr)[i], (unsigned long)i);

  _aligned_free(ptr);


  ptr = _aligned_offset_malloc(300, 128, 7);
  TEST(0, (uintptr_t)(ptr+7) % 128, 0, "_aligned_offset_malloc: ptr 0x%p is not aligned", ptr);

  size = _aligned_msize(ptr, 128, 7);
  TEST(0, size, 300, "_aligned_msize: ptr 0x%p has incorrect size %lu", ptr, (unsigned long)size);

  ptr = _aligned_offset_realloc(ptr, 3000, 128, 7);
  assert(ptr != NULL);
  TEST(0, (uintptr_t)(ptr+7) % 128, 0, "_aligned_offset_realloc: ptr 0x%p is not aligned", ptr);

  size = _aligned_msize(ptr, 128, 7);
  TEST(0, size, 3000, "_aligned_msize: ptr 0x%p has incorrect size %lu", ptr, (unsigned long)size);

  memset(ptr, 0x01, 3000);

  ptr = _aligned_offset_recalloc(ptr, 100, 1, 128, 7);
  assert(ptr != NULL);
  TEST(0, (uintptr_t)(ptr+7) % 128, 0, "_aligned_offset_recalloc: ptr 0x%p is not aligned", ptr);

  size = _aligned_msize(ptr, 128, 7);
  TEST(BROKEN_REALLOC_SHRINK, size, 100, "_aligned_msize: ptr 0x%p has incorrect size %lu", ptr, (unsigned long)size);

  memset(ptr, 0x02, 100);

  ptr = _aligned_offset_recalloc(ptr, 110, 1, 128, 7);
  assert(ptr != NULL);
  TEST(0, (uintptr_t)(ptr+7) % 128, 0, "_aligned_offset_recalloc: ptr 0x%p is not aligned", ptr);

  size = _aligned_msize(ptr, 128, 7);
  TEST(BROKEN_REALLOC_SHRINK, size, 110, "_aligned_msize: ptr 0x%p has incorrect size %lu", ptr, (unsigned long)size);

  TEST_MEM(0, ptr, 0x02, 100, "_aligned_offset_recalloc: 0x%p has incorrect byte 0x%02x at %lu", ptr, ((unsigned char *)ptr)[i], (unsigned long)i);
  TEST_MEM(BROKEN_REALLOC_SHRINK, ptr+100, 0x00, 10, "_aligned_offset_recalloc: 0x%p has incorrect byte 0x%02x at %lu", ptr, ((unsigned char *)ptr)[i+100], (unsigned long)i+100);

  _aligned_free(ptr);


  return 0;
}
