diff options
| author | Magnus Auvinen <magnus.auvinen@gmail.com> | 2007-08-22 07:52:33 +0000 |
|---|---|---|
| committer | Magnus Auvinen <magnus.auvinen@gmail.com> | 2007-08-22 07:52:33 +0000 |
| commit | 8b3c16e6152a527f9aec1a88a9eed74119de7000 (patch) | |
| tree | f0bde5cea15e696e42cade06a3b12ff6b13acc57 /src/engine/external/glfw/lib/stream.c | |
| parent | 9899666a7ce6679a3b9667ab09f615f4d0769c16 (diff) | |
| download | zcatch-8b3c16e6152a527f9aec1a88a9eed74119de7000.tar.gz zcatch-8b3c16e6152a527f9aec1a88a9eed74119de7000.zip | |
major engine cleanup. dependency on baselib removed. engine is now C code (not ansi tho). some other cruft removed aswell
Diffstat (limited to 'src/engine/external/glfw/lib/stream.c')
| -rw-r--r-- | src/engine/external/glfw/lib/stream.c | 194 |
1 files changed, 194 insertions, 0 deletions
diff --git a/src/engine/external/glfw/lib/stream.c b/src/engine/external/glfw/lib/stream.c new file mode 100644 index 00000000..34f75c85 --- /dev/null +++ b/src/engine/external/glfw/lib/stream.c @@ -0,0 +1,194 @@ +//======================================================================== +// GLFW - An OpenGL framework +// File: stream.c +// Platform: Any +// API version: 2.6 +// WWW: http://glfw.sourceforge.net +//------------------------------------------------------------------------ +// Copyright (c) 2002-2006 Camilla Berglund +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would +// be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, and must not +// be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source +// distribution. +// +//======================================================================== + + +#include "internal.h" + + +//======================================================================== +// Opens a GLFW stream with a file +//======================================================================== + +int _glfwOpenFileStream( _GLFWstream *stream, const char* name, const char* mode ) +{ + memset( stream, 0, sizeof(_GLFWstream) ); + + stream->File = fopen( name, mode ); + if( stream->File == NULL ) + { + return GL_FALSE; + } + + return GL_TRUE; +} + + +//======================================================================== +// Opens a GLFW stream with a memory block +//======================================================================== + +int _glfwOpenBufferStream( _GLFWstream *stream, void *data, long size ) +{ + memset( stream, 0, sizeof(_GLFWstream) ); + + stream->Data = data; + stream->Size = size; + return GL_TRUE; +} + + +//======================================================================== +// Reads data from a GLFW stream +//======================================================================== + +long _glfwReadStream( _GLFWstream *stream, void *data, long size ) +{ + if( stream->File != NULL ) + { + return fread( data, 1, size, stream->File ); + } + + if( stream->Data != NULL ) + { + // Check for EOF + if( stream->Position == stream->Size ) + { + return 0; + } + + // Clamp read size to available data + if( stream->Position + size > stream->Size ) + { + size = stream->Size - stream->Position; + } + + // Perform data read + memcpy( data, (unsigned char*) stream->Data + stream->Position, size ); + stream->Position += size; + return size; + } + + return 0; +} + + +//======================================================================== +// Returns the current position of a GLFW stream +//======================================================================== + +long _glfwTellStream( _GLFWstream *stream ) +{ + if( stream->File != NULL ) + { + return ftell( stream->File ); + } + + if( stream->Data != NULL ) + { + return stream->Position; + } + + return 0; +} + + +//======================================================================== +// Sets the current position of a GLFW stream +//======================================================================== + +int _glfwSeekStream( _GLFWstream *stream, long offset, int whence ) +{ + long position; + + if( stream->File != NULL ) + { + if( fseek( stream->File, offset, whence ) != 0 ) + { + return GL_FALSE; + } + + return GL_TRUE; + } + + if( stream->Data != NULL ) + { + position = offset; + + // Handle whence parameter + if( whence == SEEK_CUR ) + { + position += stream->Position; + } + else if( whence == SEEK_END ) + { + position += stream->Size; + } + else if( whence != SEEK_SET ) + { + return GL_FALSE; + } + + // Clamp offset to buffer bounds and apply it + if( position > stream->Size ) + { + stream->Position = stream->Size; + } + else if( position < 0 ) + { + stream->Position = 0; + } + else + { + stream->Position = position; + } + + return GL_TRUE; + } + + return GL_FALSE; +} + + +//======================================================================== +// Closes a GLFW stream +//======================================================================== + +void _glfwCloseStream( _GLFWstream *stream ) +{ + if( stream->File != NULL ) + { + fclose( stream->File ); + } + + // Nothing to be done about (user allocated) memory blocks + + memset( stream, 0, sizeof(_GLFWstream) ); +} + |