#ifndef _FPCRTL_H_
#define _FPCRTL_H_

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <math.h>

#include "SysUtils.h"
#include "system.h"
#include "misc.h"
#include "fileio.h"
#include "pmath.h"

#define fpcrtl_memcpy                       memcpy

#define luapas_lua_gettop                   lua_gettop
#define luapas_lua_close                    lua_close
#define luapas_lua_createtable              lua_createtable
#define luapas_lua_error                    lua_error
#define luapas_lua_gc                       lua_gc
#define luapas_lua_getfield                 lua_getfield
#define luapas_lua_objlen                   lua_objlen
#define luapas_lua_call                     lua_call
#define luapas_lua_pcall                    lua_pcall
#define luapas_lua_pushboolean              lua_pushboolean
#define luapas_lua_pushcclosure             lua_pushcclosure
#define luapas_lua_pushinteger              lua_pushinteger
#define luapas_lua_pushnil                  lua_pushnil
#define luapas_lua_pushnumber               lua_pushnumber
#define luapas_lua_pushlstring              lua_pushlstring
#define luapas_lua_pushstring               lua_pushstring
#define luapas_lua_pushvalue                lua_pushvalue
#define luapas_lua_rawgeti                  lua_rawgeti
#define luapas_lua_setfield                 lua_setfield
#define luapas_lua_settop                   lua_settop
#define luapas_lua_toboolean                lua_toboolean
#define luapas_lua_tointeger                lua_tointeger
#define luapas_lua_tolstring                lua_tolstring
#define luapas_lua_tonumber                 lua_tonumber
#define luapas_lua_type                     lua_type
#define luapas_lua_typename                 lua_typename
#define luapas_luaL_argerror                luaL_argerror
#define luapas_luaL_checkinteger            luaL_checkinteger
#define luapas_luaL_checklstring            luaL_checklstring
#define luapas_luaL_loadfile                luaL_loadfile
#define luapas_luaL_loadstring              luaL_loadstring
#define luapas_luaL_newstate                luaL_newstate
#define luapas_luaL_optinteger              luaL_optinteger
#define luapas_luaL_optlstring              luaL_optlstring
#define luapas_luaL_prepbuffer              luaL_prepbuffer
#define luapas_luaL_ref                     luaL_ref
#define luapas_luaL_unref                   luaL_unref
#define luapas_luaopen_base                 luaopen_base
#define luapas_luaopen_math                 luaopen_math
#define luapas_luaopen_string               luaopen_string
#define luapas_luaopen_table                luaopen_table
#define luapas_lua_load                     lua_load

#define sdlh_IMG_Load                       IMG_Load
#define sdlh_IMG_Load_RW                    IMG_Load_RW

#ifndef EMSCRIPTEN
#define sdlh_Mix_AllocateChannels           Mix_AllocateChannels
#define sdlh_Mix_CloseAudio                 Mix_CloseAudio
#define sdlh_Mix_FadeInChannelTimed         Mix_FadeInChannelTimed
#define sdlh_Mix_FadeInMusic                Mix_FadeInMusic
#define sdlh_Mix_FadeOutChannel             Mix_FadeOutChannel
#define sdlh_Mix_FreeChunk                  Mix_FreeChunk
#define sdlh_Mix_FreeMusic                  Mix_FreeMusic
#define sdlh_Mix_HaltChannel                Mix_HaltChannel
#define sdlh_Mix_HaltMusic                  Mix_HaltMusic
#define sdlh_Mix_LoadMUS                    Mix_LoadMUS
#define sdlh_Mix_LoadMUS_RW                 Mix_LoadMUS_RW
#define sdlh_Mix_LoadWAV_RW                 Mix_LoadWAV_RW
#define sdlh_Mix_OpenAudio                  Mix_OpenAudio
#define sdlh_Mix_PauseMusic                 Mix_PauseMusic
#define sdlh_Mix_PlayChannelTimed           Mix_PlayChannelTimed
#define sdlh_Mix_Playing                    Mix_Playing
#define sdlh_Mix_ResumeMusic                Mix_ResumeMusic
#define sdlh_Mix_Volume                     Mix_Volume
#define sdlh_Mix_VolumeMusic                Mix_VolumeMusic
#else
#define sdlh_Mix_AllocateChannels           stub_Mix_AllocateChannels
#define sdlh_Mix_CloseAudio                 stub_Mix_CloseAudio
#define sdlh_Mix_FadeInChannelTimed         stub_Mix_FadeInChannelTimed
#define sdlh_Mix_FadeInMusic                stub_Mix_FadeInMusic
#define sdlh_Mix_FadeOutChannel             stub_Mix_FadeOutChannel
#define sdlh_Mix_FreeChunk                  stub_Mix_FreeChunk
#define sdlh_Mix_FreeMusic                  stub_Mix_FreeMusic
#define sdlh_Mix_HaltChannel                stub_Mix_HaltChannel
#define sdlh_Mix_HaltMusic                  stub_Mix_HaltMusic
#define sdlh_Mix_LoadMUS                    stub_Mix_LoadMUS
#define sdlh_Mix_LoadMUS_RW                 stub_Mix_LoadMUS_RW
#define sdlh_Mix_LoadWAV_RW                 stub_Mix_LoadWAV_RW
#define sdlh_Mix_OpenAudio                  stub_Mix_OpenAudio
#define sdlh_Mix_PauseMusic                 stub_Mix_PauseMusic
#define sdlh_Mix_PlayChannelTimed           stub_Mix_PlayChannelTimed
#define sdlh_Mix_Playing                    stub_Mix_Playing
#define sdlh_Mix_ResumeMusic                stub_Mix_ResumeMusic
#define sdlh_Mix_Volume                     stub_Mix_Volume
#define sdlh_Mix_VolumeMusic                stub_Mix_VolumeMusic
#endif

#define sdlh_SDL_free                       SDL_free
#define sdlh_SDL_ConvertSurface             SDL_ConvertSurface
#define sdlh_SDL_CreateRGBSurface           SDL_CreateRGBSurface
#define sdlh_SDL_CreateThread               SDL_CreateThread
#define sdlh_SDL_Delay                      SDL_Delay
#define sdlh_SDL_EnableKeyRepeat            SDL_EnableKeyRepeat
#define sdlh_SDL_EnableUNICODE              SDL_EnableUNICODE
#define sdlh_SDL_FillRect                   SDL_FillRect
#define sdlh_SDL_FreeSurface                SDL_FreeSurface
#define sdlh_SDL_GetError                   SDL_GetError
#define sdlh_SDL_GetKeyName                 SDL_GetKeyName
#define sdlh_SDL_GetKeyboardState           SDL_GetKeyboardState
#define sdlh_SDL_GetMouseState              SDL_GetMouseState
#define sdlh_SDL_GetRGBA                    SDL_GetRGBA
#define sdlh_SDL_GetTicks                   SDL_GetTicks
#define sdlh_SDL_GL_SetAttribute            SDL_GL_SetAttribute
#define sdlh_SDL_GL_SwapBuffers             SDL_GL_SwapBuffers
#define sdlh_SDL_Init                       SDL_Init
#define sdlh_SDL_InitSubSystem              SDL_InitSubSystem
#define sdlh_SDL_JoystickClose              SDL_JoystickClose
#define sdlh_SDL_JoystickEventState         SDL_JoystickEventState
#define sdlh_SDL_JoystickName               SDL_JoystickName
#define sdlh_SDL_JoystickNumAxes            SDL_JoystickNumAxes
#define sdlh_SDL_JoystickNumButtons         SDL_JoystickNumButtons
#define sdlh_SDL_JoystickNumHats            SDL_JoystickNumHats
#define sdlh_SDL_JoystickOpen               SDL_JoystickOpen
#define sdlh_SDL_LockSurface                SDL_LockSurface
#define sdlh_SDL_MapRGB                     SDL_MapRGB
#define sdlh_SDL_MapRGBA                    SDL_MapRGBA
#define sdlh_SDL_NumJoysticks               SDL_NumJoysticks
#define sdlh_SDL_PeepEvents                 SDL_PeepEvents
#define sdlh_SDL_PumpEvents                 SDL_PumpEvents
#define sdlh_SDL_Quit                       SDL_Quit
#define sdlh_SDL_RWFromFile                 SDL_RWFromFile
#define sdlh_SDL_SetColorKey                SDL_SetColorKey
#define sdlh_SDL_SetVideoMode               SDL_SetVideoMode
#define sdlh_SDL_WaitThread                 SDL_WaitThread
#define sdlh_SDL_CreateMutex                SDL_CreateMutex
#define sdlh_SDL_DestroyMutex               SDL_DestroyMutex
#define sdlh_SDL_LockMutex                  SDL_LockMutex
#define sdlh_SDL_UnlockMutex                SDL_UnlockMutex
#ifndef EMSCRIPTEN
#define sdlh_SDL_ShowCursor                 SDL_ShowCursor
#else
#define sdlh_SDL_ShowCursor                 SDL_ShowCursor_patch
#endif
#define sdlh_SDL_UnlockSurface              SDL_UnlockSurface
#define sdlh_SDL_UpperBlit                  SDL_UpperBlit
#define sdlh_SDL_VideoDriverName            SDL_VideoDriverName
#define sdlh_SDL_WarpMouse                  SDL_WarpMouse
#define sdlh_SDL_WM_SetCaption              SDL_WM_SetCaption
#define sdlh_SDL_WM_SetIcon                 SDL_WM_SetIcon
#define sdlh_SDLNet_AddSocket               SDLNet_AddSocket
#define sdlh_SDLNet_AllocSocketSet          SDLNet_AllocSocketSet
#define sdlh_SDLNet_CheckSockets            SDLNet_CheckSockets
#define sdlh_SDLNet_FreeSocketSet           SDLNet_FreeSocketSet
#define sdlh_SDLNet_Init                    SDLNet_Init
#define sdlh_SDLNet_Quit                    SDLNet_Quit
#define sdlh_SDLNet_ResolveHost             SDLNet_ResolveHost
#define sdlh_SDLNet_TCP_Close               SDLNet_TCP_Close
#define sdlh_SDLNet_TCP_Open                SDLNet_TCP_Open
#define sdlh_SDLNet_TCP_Recv                SDLNet_TCP_Recv
#define sdlh_SDLNet_TCP_Send                SDLNet_TCP_Send
#define sdlh_TTF_Init                       TTF_Init
#define sdlh_TTF_OpenFont                   TTF_OpenFont
#define sdlh_TTF_OpenFontRW                 TTF_OpenFontRW
#define sdlh_TTF_Quit                       TTF_Quit
#define sdlh_TTF_RenderUTF8_Blended         TTF_RenderUTF8_Blended
#define sdlh_TTF_RenderUTF8_Solid           TTF_RenderUTF8_Solid
#define sdlh_TTF_SetFontStyle               TTF_SetFontStyle
#define sdlh_TTF_SizeUTF8                   TTF_SizeUTF8

#define uphysfslayer_physfsReaderSetBuffer  physfsReaderSetBuffer
#define uphysfslayer_physfsReader           physfsReader
#define uphysfslayer_hedgewarsMountPackage  hedgewarsMountPackage
#define uphysfslayer_hedgewarsMountPackages hedgewarsMountPackages

#define uphysfslayer_PHYSFSRWOPS_openRead   PHYSFSRWOPS_openRead
#define uphysfslayer_PHYSFSRWOPS_openWrite  PHYSFSRWOPS_openWrite

#define _strconcat                          fpcrtl_strconcat
#define _strappend                          fpcrtl_strappend
#define _strprepend                         fpcrtl_strprepend
#define _strcompare                         fpcrtl_strcompare
#define _strncompare                        fpcrtl_strncompare
#define _strcomparec                        fpcrtl_strcomparec
#define _chrconcat                          fpcrtl_chrconcat
#define _pchar                              fpcrtl_pchar
#define _strconcatA                         fpcrtl_strconcatA
#define _strncompareA                       fpcrtl_strncompareA
#define _strappendA                         fpcrtl_strappendA

// hooks are implemented in javascript
void start_hook(void);
void mainloop_hook(void);
void clear_filelist_hook(void);
void add_file_hook(const char* ptr);
void idb_loader_hook();
void showcursor_hook();
void hidecursor_hook();
void drawworld_init_hook();
#endif
