diff Isolated/ALmixer_RWops.h @ 38:71b465ff0622

Added support files.
author Eric Wing <ewing@anscamobile.com>
date Thu, 28 Apr 2011 16:22:30 -0700
parents
children 208a9ed20087
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Isolated/ALmixer_RWops.h	Thu Apr 28 16:22:30 2011 -0700
@@ -0,0 +1,117 @@
+#ifndef ALMIXER_RWOPS
+#define ALMIXER_RWOPS
+
+	#if defined(_WIN32)
+		#if defined(ALMIXER_RWOPS_BUILD_LIBRARY)
+			#define ALMIXER_RWOPS_DECLSPEC __declspec(dllexport)
+		#else
+			#define ALMIXER_RWOPS_DECLSPEC __declspec(dllimport)
+		#endif
+	#else
+		#if defined(ALMIXER_RWOPS_BUILD_LIBRARY)
+			#if defined (__GNUC__) && __GNUC__ >= 4
+				#define ALMIXER_RWOPS_DECLSPEC __attribute__((visibility("default")))
+			#else
+				#define ALMIXER_RWOPS_DECLSPEC
+			#endif
+		#else
+			#define ALMIXER_RWOPS_DECLSPEC
+		#endif
+	#endif
+
+	#if defined(_WIN32)
+		#define ALMIXER_RWOPS_CALL __cdecl
+	#else
+		#define ALMIXER_RWOPS_CALL
+	#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+	/* Trying to keep compatibility with SDL_RWops,
+	 * but I don't plan on reimplementing everything.
+	 */
+	#include <stdio.h>
+	#include <stddef.h>
+	/* The 'type' parameter needs to be 32-bits to match SDL_RWops.
+	 * <stdint.h> has been problematic for Visual Studio for years.
+	 * It appears that Visual Studio 2010 finally includes this.
+	 */
+	#include <stdint.h>
+	typedef struct ALmixer_RWops 
+	{
+		/** Seek to 'offset' relative to whence, one of stdio's whence values:
+		 *	SEEK_SET, SEEK_CUR, SEEK_END
+		 *  Returns the final offset in the data source.
+		 *  (Note this is different than stdio's seek. This returns ftell.)
+		 */
+		int (ALMIXER_RWOPS_CALL *seek)(struct ALmixer_RWops* the_context, long offset, int whence);
+
+		/** Read up to 'nitems' objects each of size 'size' from the data
+		 *  source to the area pointed at by 'ptr'.
+		 *  Returns the number of objects read, or -1 if the read failed.
+		 */
+		size_t (ALMIXER_RWOPS_CALL *read)(struct ALmixer_RWops* the_context, void* ptr, size_t size, size_t nitems);
+
+		/** Write exactly 'nitems' objects each of size 'size' from the area
+		 *  pointed at by 'ptr' to data source.
+		 *  Returns 'num', or -1 if the write failed.
+		 */
+		size_t (ALMIXER_RWOPS_CALL *write)(struct ALmixer_RWops* the_context, const void* ptr, size_t size, size_t nitems);
+
+		/** Close and free an allocated ALmixer_RWops structure */
+		int (ALMIXER_RWOPS_CALL *close)(struct ALmixer_RWops* the_context);
+
+		/* type Needs to be a 32-bit to be compatible with SDL */
+		uint32_t type;
+		union 
+		{
+#if defined(__WIN32__) && !defined(__SYMBIAN32__)
+			/* Chances are that I will not implement this path.
+			 * But I want the padding to be the same as SDL.
+			 */
+			struct 
+			{
+				int   append;
+				void *h;
+				struct
+				{
+					void *data;
+					int size;
+					int left;
+				} buffer;
+			} win32io;
+#endif
+	    	struct 
+			{
+				int autoclose;
+	 			FILE* fp;
+	    	} stdio;
+	   		struct 
+			{
+				unsigned char* base;
+			 	unsigned char* here;
+				unsigned char* stop;
+			} mem;
+		  	struct 
+			{
+				void* data1;
+	    	} unknown;
+		} hidden;
+	} ALmixer_RWops;
+
+	extern ALMIXER_RWOPS_DECLSPEC ALmixer_RWops* ALMIXER_RWOPS_CALL ALmixer_RWFromFile(const char* file_name, const char* file_mode);
+	extern ALMIXER_RWOPS_DECLSPEC ALmixer_RWops* ALMIXER_RWOPS_CALL ALmixer_RWFromFP(FILE* file_pointer, char autoclose_flag);
+
+#define ALmixer_RWseek(rwops, offset, whence) (rwops)->seek(rwops, offset, whence)
+#define ALmixer_RWtell(rwops) (rwops)->seek(rwops, 0, SEEK_CUR)
+#define ALmixer_RWread(rwops, ptr, size, nitems) (rwops)->read(rwops, ptr, size, nitems)
+	
+/* Ends C function definitions when using C++ */
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+