/**
 * This file has no copyright assigned and is placed in the Public Domain.
 * This file is part of the w64 mingw-runtime package.
 * No warranty is given; refer to the file DISCLAIMER within this package.
 */
#include <windows.h>
#include <stdio.h>
#include <io.h>
#include <stdlib.h>

#define ZEROBLOCKSIZE 512
static int __mingw_fseek_called;

int
__mingw_fseek (FILE *fp, int offset, int whence)
{
# undef fseek 
  __mingw_fseek_called = 1;
  return fseek (fp, offset, whence);
}

int
__mingw_fseeko64 (FILE *fp, long offset, int whence)
{
# undef fseeko64
  __mingw_fseek_called = 1;
  return fseeko64 (fp, offset, whence);
}

size_t
__mingw_fwrite (const void *buffer, size_t size, size_t count, FILE *fp)
{
# undef fwrite 
  if ((_osver & 0x8000) &&  __mingw_fseek_called)
    {
      ULARGE_INTEGER actual_length;
      LARGE_INTEGER current_position = {{0LL}};
      __mingw_fseek_called = 0;
      fflush (fp);
      actual_length.LowPart = GetFileSize ((HANDLE) _get_osfhandle (fileno (fp)), 
					   &actual_length.HighPart);
      if (actual_length.LowPart == 0xFFFFFFFF 
          && GetLastError() != NO_ERROR )
        return -1;
      current_position.LowPart = SetFilePointer ((HANDLE) _get_osfhandle (fileno (fp)),
                                         	 current_position.LowPart,
					 	 &current_position.HighPart,
						 FILE_CURRENT);
      if (current_position.LowPart == 0xFFFFFFFF 
          && GetLastError() != NO_ERROR )
        return -1;

#ifdef DEBUG
      printf ("__mingw_fwrite: current %I64u, actual %I64u\n", 
	      current_position.QuadPart, actual_length.QuadPart);
#endif /* DEBUG */
      if (current_position.QuadPart > actual_length.QuadPart)
	{
	  static char __mingw_zeros[ZEROBLOCKSIZE];
	  long long numleft;

	  SetFilePointer ((HANDLE) _get_osfhandle (fileno (fp)), 
	                  0, 0, FILE_END);
	  numleft = current_position.QuadPart - actual_length.QuadPart;

#ifdef DEBUG
	  printf ("__mingw_fwrite: Seeking %I64d bytes past end\n", numleft);
#endif /* DEBUG */
	  while (numleft > 0LL)
	    {
	      DWORD nzeros = (numleft > ZEROBLOCKSIZE)
	                     ? ZEROBLOCKSIZE : numleft;
	      DWORD written;
	      if (! WriteFile ((HANDLE) _get_osfhandle (fileno (fp)),
	                       __mingw_zeros, nzeros, &written, NULL))
	        {
		  /* Best we can hope for, or at least DJ says so. */
	          SetFilePointer ((HANDLE) _get_osfhandle (fileno (fp)), 
	                          0, 0, FILE_BEGIN);
		  return -1;
		}
	      if (written < nzeros)
	        {
		  /* Likewise. */
	          SetFilePointer ((HANDLE) _get_osfhandle (fileno (fp)), 
	                          0, 0, FILE_BEGIN);
		  return -1;
		}

	      numleft -= written;
	    }
	    FlushFileBuffers ((HANDLE) _get_osfhandle (fileno (fp)));
	}
    }
  return fwrite (buffer, size, count, fp);
}
