/*
port.h -- Portability Layer for Windows types
Copyright (C) 2015 Alibek Omarov

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.
*/

#pragma once
#ifndef PORT_H
#define PORT_H

#include "build.h"

#if !XASH_WIN32
	#if XASH_APPLE
		#include <sys/syslimits.h>
		#define OS_LIB_EXT "dylib"
		#define OPEN_COMMAND "open"
	#else
		#define OS_LIB_EXT "so"
		#define OPEN_COMMAND "xdg-open"
	#endif
	#define OS_LIB_PREFIX "lib"
	#define VGUI_SUPPORT_DLL "libvgui_support." OS_LIB_EXT

	// Windows-specific
	#define __cdecl
	#define __stdcall
	#define _inline	static inline
	#define FORCEINLINE inline __attribute__((always_inline))

	#if XASH_POSIX
		#include <unistd.h>
		#if XASH_NSWITCH
			#define SOLDER_LIBDL_COMPAT
			#include <solder.h>
		#elif XASH_PSVITA
			#define VRTLD_LIBDL_COMPAT
			#include <vrtld.h>
			#define O_BINARY 0
		#else
			#include <dlfcn.h>
			#define HAVE_DUP
			#define O_BINARY 0
		#endif
		#define O_TEXT 0
		#define _mkdir( x ) mkdir( x, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH )
	#endif

	typedef void* HANDLE;
	typedef void* HINSTANCE;

	typedef struct tagPOINT
	{
		int x, y;
	} POINT;
#else // WIN32
	#ifdef __MINGW32__
		#define _inline static inline
		#define FORCEINLINE inline __attribute__((always_inline))
	#else
		#define FORCEINLINE __forceinline
	#endif

	#define open _open
	#define read _read
	#define alloca _alloca

	#define HSPRITE WINAPI_HSPRITE
		#define WIN32_LEAN_AND_MEAN
		#include <winsock2.h>
		#include <windows.h>
	#undef HSPRITE

	#define OS_LIB_PREFIX ""
	#define OS_LIB_EXT "dll"
	#define VGUI_SUPPORT_DLL "../vgui_support." OS_LIB_EXT
	#define HAVE_DUP
#endif //WIN32

#ifndef XASH_LOW_MEMORY
#define XASH_LOW_MEMORY 0
#endif

#include <stdlib.h>
#include <string.h>
#include <limits.h>

#if defined XASH_SDL && !defined REF_DLL
#include <SDL.h>
#endif

#endif // PORT_H