The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include "ppport.h"

#ifndef aTHX_
#define aTHX_
#endif

#include <SDL.h>

#ifdef HAVE_SDL_NET
#include <SDL_net.h>

#ifndef SDL_NET_MAJOR_VERSION
#define SDL_NET_MAJOR_VERSION	0
#endif

#ifndef SDL_NET_MINOR_VERSION
#define SDL_NET_MINOR_VERSION	0
#endif

#ifndef SDL_NET_PATCHLEVEL
#define SDL_NET_PATCHLEVEL	0
#endif

/* This macro can be used to fill a version structure with the compile-time
 * version of the SDL_net library.
 */
#ifndef SDL_NET_VERSION

#define SDL_NET_VERSION(X)              \
{                                       \
	(X)->major = SDL_NET_MAJOR_VERSION; \
	(X)->minor = SDL_NET_MINOR_VERSION; \
	(X)->patch = SDL_NET_PATCHLEVEL;    \
}
#endif

#endif


MODULE = SDL::Net 	PACKAGE = SDL::Net    PREFIX = net_

int
net_big_endian ()
	CODE:
		RETVAL = (SDL_BYTEORDER == SDL_BIG_ENDIAN);
	OUTPUT:
		RETVAL

#ifdef HAVE_SDL_NET

const SDL_version *
net_linked_version()
	PREINIT:
		char* CLASS = "SDL::Version";
	CODE:
		SDL_version *linked_version = safemalloc( sizeof( SDL_version) );
		SDL_NET_VERSION(linked_version);
		
		RETVAL = linked_version;
	OUTPUT:
		RETVAL

int
net_init ()
	CODE:
		RETVAL = SDLNet_Init();
	OUTPUT:
		RETVAL

void
net_quit ()
	CODE:
		SDLNet_Quit();

const char*
net_resolve_IP ( address )
	IPaddress *address
	CODE:
		RETVAL = SDLNet_ResolveIP(address);
	OUTPUT:
		RETVAL

int
net_resolve_host ( address, host, port )
	IPaddress *address
	const char *host
	Uint16 port
	CODE:
		RETVAL = SDLNet_ResolveHost(address,host,port);
	OUTPUT:
		RETVAL
	

UDPpacket*
net_alloc_packet ( size )
	int size
	CODE:
		RETVAL = SDLNet_AllocPacket(size);
	OUTPUT:
		RETVAL

UDPpacket**
net_alloc_packetV ( howmany, size )
	int howmany
	int size
	CODE:
		RETVAL = SDLNet_AllocPacketV(howmany,size);
	OUTPUT:
		RETVAL

int
net_resize_packet ( packet, newsize )
	UDPpacket *packet
	int newsize
	CODE:
		RETVAL = SDLNet_ResizePacket(packet,newsize);
	OUTPUT:
		RETVAL

void
net_free_packet ( packet )
	UDPpacket *packet
	CODE:
		SDLNet_FreePacket(packet);

void
net_free_packetV ( packet )
	UDPpacket **packet
	CODE:
		SDLNet_FreePacketV(packet);


SDLNet_SocketSet
net_alloc_socket_set ( maxsockets )
	int maxsockets
	CODE:
		RETVAL = SDLNet_AllocSocketSet(maxsockets);
	OUTPUT:
		RETVAL

int
net_check_sockets ( set, timeout )
	SDLNet_SocketSet set
	Uint32 timeout
	CODE:
		RETVAL = SDLNet_CheckSockets(set,timeout);
	OUTPUT:
		RETVAL

int
net_socket_ready ( sock )
	SDLNet_GenericSocket sock
	CODE:
		RETVAL = SDLNet_SocketReady(sock);
	OUTPUT:
		RETVAL

void
net_free_socket_set ( set )
	SDLNet_SocketSet set
	CODE:
		SDLNet_FreeSocketSet(set);

void
net_write16 ( value, area )
	Uint16 value
	void *area
	CODE:
		SDLNet_Write16(value,area);

void
net_write32 ( value, area )
	Uint32 value
	void *area
	CODE:
		SDLNet_Write32(value,area);
	
Uint16
net_read16 ( area )
	void *area
	CODE:
		RETVAL = SDLNet_Read16(area);
	OUTPUT:
		RETVAL

Uint32
net_read32 ( area )
	void *area
	CODE:
		RETVAL = SDLNet_Read32(area);
	OUTPUT:
		RETVAL

#endif