From 996dae7f1aefc245cf6c43ae29f6ccaea6066c2e Mon Sep 17 00:00:00 2001
From: Jerome Duval <jerome.duval@gmail.com>
Date: Sun, 17 May 2015 18:03:50 +0000
Subject: Haiku patch


diff --git a/SConstruct b/SConstruct
index afdb48f..5637922 100644
--- a/SConstruct
+++ b/SConstruct
@@ -102,8 +102,8 @@ else:
 		env.Append(CCFLAGS=['-O3'])
 		env.Append(CPPFLAGS=['-O3'])
 		
-	env.Append(CPPFLAGS=['-Wall', '-Wno-deprecated', '-pedantic', '-Wno-long-long', '-pipe', '-pthread'])
-	env.Append(CCFLAGS=['-Wall', '-Wno-deprecated', '-pedantic', '-Wno-long-long', '-pipe', '-pthread'])
+	env.Append(CPPFLAGS=['-Wall', '-Wno-deprecated', '-pedantic', '-Wno-long-long', '-pipe'])
+	env.Append(CCFLAGS=['-Wall', '-Wno-deprecated', '-pedantic', '-Wno-long-long', '-pipe'])
 
 
 conf_env = env.Clone()
@@ -154,7 +154,10 @@ if sys.platform == 'win32':
 		Exit(1)
 
 if sys.platform != 'win32':
-	have_sse = conf.CheckLibWithHeader('m', "xmmintrin.h", 'c', '_mm_set_ss(1.0f);', False)
+	if sys.platform != 'haiku1':
+		have_sse = conf.CheckLibWithHeader('m', "xmmintrin.h", 'c', '_mm_set_ss(1.0f);', False)
+	else:
+		have_sse = True
 else: 
 	have_sse = conf.CheckLibWithHeader('kernel32', "xmmintrin.h", 'c', '_mm_set_ss(1.0f);', False) # hackish lib :(
 
diff --git a/clunk/SConscript b/clunk/SConscript
index d528be8..4211daf 100644
--- a/clunk/SConscript
+++ b/clunk/SConscript
@@ -17,7 +17,8 @@ clunk_libs = ['SDL']
 
 if sys.platform != 'win32':
 	env.Append(LINKFLAGS=['-Wl,-rpath,'+ lib_dir])
-	clunk_libs.append('m')
+	if sys.platform != 'haiku1':
+		clunk_libs.append('m')
 
 env.MergeFlags(sdl_cflags, sdl_libs)
 
diff --git a/clunk/source.cpp b/clunk/source.cpp
index d7829c8..64bfc5a 100644
--- a/clunk/source.cpp
+++ b/clunk/source.cpp
@@ -27,7 +27,7 @@
 #include <assert.h>
 #include "clunk_assert.h"
 
-#if defined _MSC_VER || __APPLE__ || __FreeBSD__
+#if defined _MSC_VER || __APPLE__ || __FreeBSD__ || __HAIKU__
 #	define pow10f(x) powf(10.0f, (x))
 #	define log2f(x) (logf(x) / M_LN2)
 #endif
diff --git a/engine/luaxx/state.cpp b/engine/luaxx/state.cpp
index 4bd218d..8ac233d 100644
--- a/engine/luaxx/state.cpp
+++ b/engine/luaxx/state.cpp
@@ -5,6 +5,10 @@
 #include <assert.h>
 #include "mrt/chunk.h"
 
+#ifndef lua_open
+#define lua_open()	luaL_newstate() 
+#endif
+
 using namespace luaxx;
 /*
 static void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) {
@@ -59,7 +63,7 @@ static const char * chunk_reader(lua_State *L, void *data, size_t *size) {
 void State::load(const std::string &fname, const mrt::Chunk &data) {
 	//throw_ex(("implement me[%s]", fname.c_str()));
 	reader_state x(data);
-	int err = lua_load(state, chunk_reader, &x, fname.c_str());
+	int err = lua_load(state, chunk_reader, &x, fname.c_str(), NULL);
 	check_error(state, err);
 }
 
diff --git a/engine/sl08/sl08.h b/engine/sl08/sl08.h
index dd06f9e..92fc8dd 100644
--- a/engine/sl08/sl08.h
+++ b/engine/sl08/sl08.h
@@ -22,6 +22,7 @@
 /* DO NOT MODIFY THIS FILE: IT'S AUTOGENERATED */ 
 
 #include <list>
+#include <cstddef>
 
 #ifndef NULL
 #define NULL            ((void*) 0)
@@ -117,7 +118,7 @@ namespace sl08 {
 			inline slot0 () : object(NULL), func(NULL) {}
 			inline slot0 (object_type *object, func_t func) : object(object), func(func) {}
 			inline void assign(object_type *o, func_t f) { object = o; func = f; }
-			inline void assign(object_type *o, func_t f, signal_type &signal_ref) { object = o; func = f; connect(signal_ref); }
+			inline void assign(object_type *o, func_t f, signal_type &signal_ref) { object = o; func = f; this->connect(signal_ref); }
 	
 			inline void operator() () const { 
 				(object->*func) (); 
@@ -271,7 +272,7 @@ namespace sl08 {
 			inline slot1(object_type *object, func_t func, signal_type * signal = NULL) : object(object), func(func) {}
 
 			inline void assign(object_type *o, func_t f) { object = o; func = f; }
-			inline void assign(object_type *o, func_t f, signal_type &signal_ref = NULL) { object = o; func = f; connect(signal_ref); }
+			inline void assign(object_type *o, func_t f, signal_type &signal_ref = NULL) { object = o; func = f; this->connect(signal_ref); }
 	
 			inline return_type operator() (arg1_type a1) const { 
 				return (object->*func) (a1) ;
@@ -292,7 +293,7 @@ namespace sl08 {
 			inline slot1 () : object(NULL), func(NULL) {}
 			inline slot1 (object_type *object, func_t func) : object(object), func(func) {}
 			inline void assign(object_type *o, func_t f) { object = o; func = f; }
-			inline void assign(object_type *o, func_t f, signal_type &signal_ref) { object = o; func = f; connect(signal_ref); }
+			inline void assign(object_type *o, func_t f, signal_type &signal_ref) { object = o; func = f; this->connect(signal_ref); }
 	
 			inline void operator() (arg1_type a1) const { 
 				(object->*func) (a1); 
@@ -446,7 +447,7 @@ namespace sl08 {
 			inline slot2(object_type *object, func_t func, signal_type * signal = NULL) : object(object), func(func) {}
 
 			inline void assign(object_type *o, func_t f) { object = o; func = f; }
-			inline void assign(object_type *o, func_t f, signal_type &signal_ref = NULL) { object = o; func = f; connect(signal_ref); }
+			inline void assign(object_type *o, func_t f, signal_type &signal_ref = NULL) { object = o; func = f; this->connect(signal_ref); }
 	
 			inline return_type operator() (arg1_type a1, arg2_type a2) const { 
 				return (object->*func) (a1, a2) ;
@@ -467,7 +468,7 @@ namespace sl08 {
 			inline slot2 () : object(NULL), func(NULL) {}
 			inline slot2 (object_type *object, func_t func) : object(object), func(func) {}
 			inline void assign(object_type *o, func_t f) { object = o; func = f; }
-			inline void assign(object_type *o, func_t f, signal_type &signal_ref) { object = o; func = f; connect(signal_ref); }
+			inline void assign(object_type *o, func_t f, signal_type &signal_ref) { object = o; func = f; this->connect(signal_ref); }
 	
 			inline void operator() (arg1_type a1, arg2_type a2) const { 
 				(object->*func) (a1, a2); 
@@ -621,7 +622,7 @@ namespace sl08 {
 			inline slot3(object_type *object, func_t func, signal_type * signal = NULL) : object(object), func(func) {}
 
 			inline void assign(object_type *o, func_t f) { object = o; func = f; }
-			inline void assign(object_type *o, func_t f, signal_type &signal_ref = NULL) { object = o; func = f; connect(signal_ref); }
+			inline void assign(object_type *o, func_t f, signal_type &signal_ref = NULL) { object = o; func = f; this->connect(signal_ref); }
 	
 			inline return_type operator() (arg1_type a1, arg2_type a2, arg3_type a3) const { 
 				return (object->*func) (a1, a2, a3) ;
@@ -642,7 +643,7 @@ namespace sl08 {
 			inline slot3 () : object(NULL), func(NULL) {}
 			inline slot3 (object_type *object, func_t func) : object(object), func(func) {}
 			inline void assign(object_type *o, func_t f) { object = o; func = f; }
-			inline void assign(object_type *o, func_t f, signal_type &signal_ref) { object = o; func = f; connect(signal_ref); }
+			inline void assign(object_type *o, func_t f, signal_type &signal_ref) { object = o; func = f; this->connect(signal_ref); }
 	
 			inline void operator() (arg1_type a1, arg2_type a2, arg3_type a3) const { 
 				(object->*func) (a1, a2, a3); 
@@ -796,7 +797,7 @@ namespace sl08 {
 			inline slot4(object_type *object, func_t func, signal_type * signal = NULL) : object(object), func(func) {}
 
 			inline void assign(object_type *o, func_t f) { object = o; func = f; }
-			inline void assign(object_type *o, func_t f, signal_type &signal_ref = NULL) { object = o; func = f; connect(signal_ref); }
+			inline void assign(object_type *o, func_t f, signal_type &signal_ref = NULL) { object = o; func = f; this->connect(signal_ref); }
 	
 			inline return_type operator() (arg1_type a1, arg2_type a2, arg3_type a3, arg4_type a4) const { 
 				return (object->*func) (a1, a2, a3, a4) ;
@@ -817,7 +818,7 @@ namespace sl08 {
 			inline slot4 () : object(NULL), func(NULL) {}
 			inline slot4 (object_type *object, func_t func) : object(object), func(func) {}
 			inline void assign(object_type *o, func_t f) { object = o; func = f; }
-			inline void assign(object_type *o, func_t f, signal_type &signal_ref) { object = o; func = f; connect(signal_ref); }
+			inline void assign(object_type *o, func_t f, signal_type &signal_ref) { object = o; func = f; this->connect(signal_ref); }
 	
 			inline void operator() (arg1_type a1, arg2_type a2, arg3_type a3, arg4_type a4) const { 
 				(object->*func) (a1, a2, a3, a4); 
@@ -971,7 +972,7 @@ namespace sl08 {
 			inline slot5(object_type *object, func_t func, signal_type * signal = NULL) : object(object), func(func) {}
 
 			inline void assign(object_type *o, func_t f) { object = o; func = f; }
-			inline void assign(object_type *o, func_t f, signal_type &signal_ref = NULL) { object = o; func = f; connect(signal_ref); }
+			inline void assign(object_type *o, func_t f, signal_type &signal_ref = NULL) { object = o; func = f; this->connect(signal_ref); }
 	
 			inline return_type operator() (arg1_type a1, arg2_type a2, arg3_type a3, arg4_type a4, arg5_type a5) const { 
 				return (object->*func) (a1, a2, a3, a4, a5) ;
@@ -992,7 +993,7 @@ namespace sl08 {
 			inline slot5 () : object(NULL), func(NULL) {}
 			inline slot5 (object_type *object, func_t func) : object(object), func(func) {}
 			inline void assign(object_type *o, func_t f) { object = o; func = f; }
-			inline void assign(object_type *o, func_t f, signal_type &signal_ref) { object = o; func = f; connect(signal_ref); }
+			inline void assign(object_type *o, func_t f, signal_type &signal_ref) { object = o; func = f; this->connect(signal_ref); }
 	
 			inline void operator() (arg1_type a1, arg2_type a2, arg3_type a3, arg4_type a4, arg5_type a5) const { 
 				(object->*func) (a1, a2, a3, a4, a5); 
diff --git a/math/range_list.h b/math/range_list.h
index 4d73341..c47fc13 100644
--- a/math/range_list.h
+++ b/math/range_list.h
@@ -53,14 +53,14 @@ public:
 			return;
 		}
 	
-		typename parent_type::iterator i = lower_bound(value);
+		typename parent_type::iterator i = this->lower_bound(value);
 		if (i != parent_type::end()) {
 			if (i->first == value)
 				return;
 
 			if (value + 1 == i->first) {
 				T e = i->second;
-				erase(i);
+				this->erase(i);
 				i = parent_type::insert(typename parent_type::value_type(value, e)).first; //expand beginning
 				i = pack_left(i);
 			}
diff --git a/mrt/SConscript b/mrt/SConscript
index 2660d69..8b59e3b 100644
--- a/mrt/SConscript
+++ b/mrt/SConscript
@@ -10,6 +10,8 @@ libs = ['expat', 'z']
 if sys.platform == "win32":
 	libs.append('Ws2_32')
 	libs.append('shell32')
+if sys.platform == "haiku1":
+	libs.append('bnetapi')
 
 mrt = env.SharedLibrary('mrt', \
 	['exception.cpp', 'fmt.cpp', 'ioexception.cpp', 'logger.cpp', 'chunk.cpp', 'random.cpp', 
diff --git a/mrt/sys_socket.cpp b/mrt/sys_socket.cpp
index 4212a76..f276894 100644
--- a/mrt/sys_socket.cpp
+++ b/mrt/sys_socket.cpp
@@ -34,6 +34,7 @@
 
 #include <assert.h>
 #include <stdlib.h>
+#include <sys/time.h>
 
 using namespace mrt;
 
diff --git a/mrt/udp_socket.cpp b/mrt/udp_socket.cpp
index 19c2756..d352f5d 100644
--- a/mrt/udp_socket.cpp
+++ b/mrt/udp_socket.cpp
@@ -37,6 +37,8 @@
 #	include <netinet/ip.h> /* superset of previous */
 #	include <arpa/inet.h>
 #	include <netdb.h>
+#define _BSD_SOURCE
+#	include <ifaddrs.h>
 #endif              
 
 
diff --git a/sdlx/SConscript b/sdlx/SConscript
index ede453b..dd8bc93 100644
--- a/sdlx/SConscript
+++ b/sdlx/SConscript
@@ -19,11 +19,12 @@ if sys.platform != "win32":
 	#c_map_env.Append(CXXFLAGS=['-fforce-addr', '-fprefetch-loop-arrays'])
 	c_map = c_map_env.SharedObject('c_map.cpp')
 	#libs.append('GL')
-	libs.append('rt')
-	libs.append('X11')
+	if sys.platform != "haiku1":
+		libs.append('rt')
+		libs.append('X11')
 
-	env.Append(LINKFLAGS=['-Wl,-rpath,'+ lib_dir])
-	env.Append(LINKFLAGS=['-Wl,-rpath-link,build/' + env['mode'] + '/mrt'])
+		env.Append(LINKFLAGS=['-Wl,-rpath,'+ lib_dir])
+		env.Append(LINKFLAGS=['-Wl,-rpath-link,build/' + env['mode'] + '/mrt'])
 else: 
 	c_map = env.SharedObject('c_map.cpp')
 	libs.append('opengl32')
diff --git a/sdlx/system.cpp b/sdlx/system.cpp
index c239b53..1afab0c 100644
--- a/sdlx/system.cpp
+++ b/sdlx/system.cpp
@@ -41,6 +41,8 @@ static void WIN_FlushMessageQueue()
 }
 #elif defined __APPLE__
 	//nothing here
+#elif defined __HAIKU__
+	//nothing here
 #else
 #	include <X11/X.h>
 #	include <X11/Xutil.h>
@@ -134,7 +136,7 @@ TRY {
 	DestroyWindow(hwnd);
 	WIN_FlushMessageQueue();
 #endif
-#if !defined(_WINDOWS) && !defined(__APPLE__)
+#if !defined(_WINDOWS) && !defined(__APPLE__) && !defined(__HAIKU__)
 	int errorBase, eventBase; 
 	
 	if (SDL_GL_LoadLibrary(NULL) != 0) {
-- 
1.8.3.4


From 16a043a288475be461646ba5d4fd76205b148177 Mon Sep 17 00:00:00 2001
From: Jerome Duval <jerome.duval@gmail.com>
Date: Sun, 17 May 2015 21:20:06 +0000
Subject: Settings directory


diff --git a/mrt/directory.cpp b/mrt/directory.cpp
index dfc672f..bdfafe6 100644
--- a/mrt/directory.cpp
+++ b/mrt/directory.cpp
@@ -21,6 +21,10 @@
 #include <errno.h>
 #include <stdlib.h>
 
+#ifdef __HAIKU__
+	#include <FindDirectory.h>
+#endif
+
 using namespace mrt;
 
 Directory::Directory() : _handle(0) {}
@@ -195,7 +199,13 @@ const std::string Directory::get_home() {
 }
 
 const std::string Directory::get_app_dir(const std::string &name, const std::string &shortname) {
+#ifdef __HAIKU__
+	char settingsPath[PATH_MAX];
+	find_directory(B_USER_SETTINGS_DIRECTORY, -1, false, settingsPath, sizeof(settingsPath));
+	std::string path = settingsPath + "/" + shortname;
+#else
 	std::string path = get_home() + "/." + shortname;
+#endif
 	mrt::Directory dir;
 	try {
 		dir.create(path);
-- 
1.8.3.4

