Go to most recent revision | Details | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line |
|---|---|---|---|
| 1 | pmbaty | 1 | /* |
| 2 | Simple DirectMedia Layer |
||
| 3 | Copyright (C) 1997-2017 Sam Lantinga <slouken@libsdl.org> |
||
| 4 | |||
| 5 | This software is provided 'as-is', without any express or implied |
||
| 6 | warranty. In no event will the authors be held liable for any damages |
||
| 7 | arising from the use of this software. |
||
| 8 | |||
| 9 | Permission is granted to anyone to use this software for any purpose, |
||
| 10 | including commercial applications, and to alter it and redistribute it |
||
| 11 | freely, subject to the following restrictions: |
||
| 12 | |||
| 13 | 1. The origin of this software must not be misrepresented; you must not |
||
| 14 | claim that you wrote the original software. If you use this software |
||
| 15 | in a product, an acknowledgment in the product documentation would be |
||
| 16 | appreciated but is not required. |
||
| 17 | 2. Altered source versions must be plainly marked as such, and must not be |
||
| 18 | misrepresented as being the original software. |
||
| 19 | 3. This notice may not be removed or altered from any source distribution. |
||
| 20 | */ |
||
| 21 | |||
| 22 | /** |
||
| 23 | * \file SDL_rwops.h |
||
| 24 | * |
||
| 25 | * This file provides a general interface for SDL to read and write |
||
| 26 | * data streams. It can easily be extended to files, memory, etc. |
||
| 27 | */ |
||
| 28 | |||
| 29 | #ifndef SDL_rwops_h_ |
||
| 30 | #define SDL_rwops_h_ |
||
| 31 | |||
| 32 | #include "SDL_stdinc.h" |
||
| 33 | #include "SDL_error.h" |
||
| 34 | |||
| 35 | #include "begin_code.h" |
||
| 36 | /* Set up for C function definitions, even when using C++ */ |
||
| 37 | #ifdef __cplusplus |
||
| 38 | extern "C" { |
||
| 39 | #endif |
||
| 40 | |||
| 41 | /* RWops Types */ |
||
| 42 | #define SDL_RWOPS_UNKNOWN 0U /**< Unknown stream type */ |
||
| 43 | #define SDL_RWOPS_WINFILE 1U /**< Win32 file */ |
||
| 44 | #define SDL_RWOPS_STDFILE 2U /**< Stdio file */ |
||
| 45 | #define SDL_RWOPS_JNIFILE 3U /**< Android asset */ |
||
| 46 | #define SDL_RWOPS_MEMORY 4U /**< Memory stream */ |
||
| 47 | #define SDL_RWOPS_MEMORY_RO 5U /**< Read-Only memory stream */ |
||
| 48 | |||
| 49 | /** |
||
| 50 | * This is the read/write operation structure -- very basic. |
||
| 51 | */ |
||
| 52 | typedef struct SDL_RWops |
||
| 53 | { |
||
| 54 | /** |
||
| 55 | * Return the size of the file in this rwops, or -1 if unknown |
||
| 56 | */ |
||
| 57 | Sint64 (SDLCALL * size) (struct SDL_RWops * context); |
||
| 58 | |||
| 59 | /** |
||
| 60 | * Seek to \c offset relative to \c whence, one of stdio's whence values: |
||
| 61 | * RW_SEEK_SET, RW_SEEK_CUR, RW_SEEK_END |
||
| 62 | * |
||
| 63 | * \return the final offset in the data stream, or -1 on error. |
||
| 64 | */ |
||
| 65 | Sint64 (SDLCALL * seek) (struct SDL_RWops * context, Sint64 offset, |
||
| 66 | int whence); |
||
| 67 | |||
| 68 | /** |
||
| 69 | * Read up to \c maxnum objects each of size \c size from the data |
||
| 70 | * stream to the area pointed at by \c ptr. |
||
| 71 | * |
||
| 72 | * \return the number of objects read, or 0 at error or end of file. |
||
| 73 | */ |
||
| 74 | size_t (SDLCALL * read) (struct SDL_RWops * context, void *ptr, |
||
| 75 | size_t size, size_t maxnum); |
||
| 76 | |||
| 77 | /** |
||
| 78 | * Write exactly \c num objects each of size \c size from the area |
||
| 79 | * pointed at by \c ptr to data stream. |
||
| 80 | * |
||
| 81 | * \return the number of objects written, or 0 at error or end of file. |
||
| 82 | */ |
||
| 83 | size_t (SDLCALL * write) (struct SDL_RWops * context, const void *ptr, |
||
| 84 | size_t size, size_t num); |
||
| 85 | |||
| 86 | /** |
||
| 87 | * Close and free an allocated SDL_RWops structure. |
||
| 88 | * |
||
| 89 | * \return 0 if successful or -1 on write error when flushing data. |
||
| 90 | */ |
||
| 91 | int (SDLCALL * close) (struct SDL_RWops * context); |
||
| 92 | |||
| 93 | Uint32 type; |
||
| 94 | union |
||
| 95 | { |
||
| 96 | #if defined(__ANDROID__) |
||
| 97 | struct |
||
| 98 | { |
||
| 99 | void *fileNameRef; |
||
| 100 | void *inputStreamRef; |
||
| 101 | void *readableByteChannelRef; |
||
| 102 | void *readMethod; |
||
| 103 | void *assetFileDescriptorRef; |
||
| 104 | long position; |
||
| 105 | long size; |
||
| 106 | long offset; |
||
| 107 | int fd; |
||
| 108 | } androidio; |
||
| 109 | #elif defined(__WIN32__) |
||
| 110 | struct |
||
| 111 | { |
||
| 112 | SDL_bool append; |
||
| 113 | void *h; |
||
| 114 | struct |
||
| 115 | { |
||
| 116 | void *data; |
||
| 117 | size_t size; |
||
| 118 | size_t left; |
||
| 119 | } buffer; |
||
| 120 | } windowsio; |
||
| 121 | #endif |
||
| 122 | |||
| 123 | #ifdef HAVE_STDIO_H |
||
| 124 | struct |
||
| 125 | { |
||
| 126 | SDL_bool autoclose; |
||
| 127 | FILE *fp; |
||
| 128 | } stdio; |
||
| 129 | #endif |
||
| 130 | struct |
||
| 131 | { |
||
| 132 | Uint8 *base; |
||
| 133 | Uint8 *here; |
||
| 134 | Uint8 *stop; |
||
| 135 | } mem; |
||
| 136 | struct |
||
| 137 | { |
||
| 138 | void *data1; |
||
| 139 | void *data2; |
||
| 140 | } unknown; |
||
| 141 | } hidden; |
||
| 142 | |||
| 143 | } SDL_RWops; |
||
| 144 | |||
| 145 | |||
| 146 | /** |
||
| 147 | * \name RWFrom functions |
||
| 148 | * |
||
| 149 | * Functions to create SDL_RWops structures from various data streams. |
||
| 150 | */ |
||
| 151 | /* @{ */ |
||
| 152 | |||
| 153 | extern DECLSPEC SDL_RWops *SDLCALL SDL_RWFromFile(const char *file, |
||
| 154 | const char *mode); |
||
| 155 | |||
| 156 | #ifdef HAVE_STDIO_H |
||
| 157 | extern DECLSPEC SDL_RWops *SDLCALL SDL_RWFromFP(FILE * fp, |
||
| 158 | SDL_bool autoclose); |
||
| 159 | #else |
||
| 160 | extern DECLSPEC SDL_RWops *SDLCALL SDL_RWFromFP(void * fp, |
||
| 161 | SDL_bool autoclose); |
||
| 162 | #endif |
||
| 163 | |||
| 164 | extern DECLSPEC SDL_RWops *SDLCALL SDL_RWFromMem(void *mem, int size); |
||
| 165 | extern DECLSPEC SDL_RWops *SDLCALL SDL_RWFromConstMem(const void *mem, |
||
| 166 | int size); |
||
| 167 | |||
| 168 | /* @} *//* RWFrom functions */ |
||
| 169 | |||
| 170 | |||
| 171 | extern DECLSPEC SDL_RWops *SDLCALL SDL_AllocRW(void); |
||
| 172 | extern DECLSPEC void SDLCALL SDL_FreeRW(SDL_RWops * area); |
||
| 173 | |||
| 174 | #define RW_SEEK_SET 0 /**< Seek from the beginning of data */ |
||
| 175 | #define RW_SEEK_CUR 1 /**< Seek relative to current read point */ |
||
| 176 | #define RW_SEEK_END 2 /**< Seek relative to the end of data */ |
||
| 177 | |||
| 178 | /** |
||
| 179 | * \name Read/write macros |
||
| 180 | * |
||
| 181 | * Macros to easily read and write from an SDL_RWops structure. |
||
| 182 | */ |
||
| 183 | /* @{ */ |
||
| 184 | #define SDL_RWsize(ctx) (ctx)->size(ctx) |
||
| 185 | #define SDL_RWseek(ctx, offset, whence) (ctx)->seek(ctx, offset, whence) |
||
| 186 | #define SDL_RWtell(ctx) (ctx)->seek(ctx, 0, RW_SEEK_CUR) |
||
| 187 | #define SDL_RWread(ctx, ptr, size, n) (ctx)->read(ctx, ptr, size, n) |
||
| 188 | #define SDL_RWwrite(ctx, ptr, size, n) (ctx)->write(ctx, ptr, size, n) |
||
| 189 | #define SDL_RWclose(ctx) (ctx)->close(ctx) |
||
| 190 | /* @} *//* Read/write macros */ |
||
| 191 | |||
| 192 | |||
| 193 | /** |
||
| 194 | * Load all the data from an SDL data stream. |
||
| 195 | * |
||
| 196 | * The data is allocated with a zero byte at the end (null terminated) |
||
| 197 | * |
||
| 198 | * If \c datasize is not NULL, it is filled with the size of the data read. |
||
| 199 | * |
||
| 200 | * If \c freesrc is non-zero, the stream will be closed after being read. |
||
| 201 | * |
||
| 202 | * The data should be freed with SDL_free(). |
||
| 203 | * |
||
| 204 | * \return the data, or NULL if there was an error. |
||
| 205 | */ |
||
| 206 | extern DECLSPEC void *SDLCALL SDL_LoadFile_RW(SDL_RWops * src, size_t *datasize, |
||
| 207 | int freesrc); |
||
| 208 | |||
| 209 | /** |
||
| 210 | * Load an entire file. |
||
| 211 | * |
||
| 212 | * Convenience macro. |
||
| 213 | */ |
||
| 214 | #define SDL_LoadFile(file, datasize) SDL_LoadFile_RW(SDL_RWFromFile(file, "rb"), datasize, 1) |
||
| 215 | |||
| 216 | /** |
||
| 217 | * \name Read endian functions |
||
| 218 | * |
||
| 219 | * Read an item of the specified endianness and return in native format. |
||
| 220 | */ |
||
| 221 | /* @{ */ |
||
| 222 | extern DECLSPEC Uint8 SDLCALL SDL_ReadU8(SDL_RWops * src); |
||
| 223 | extern DECLSPEC Uint16 SDLCALL SDL_ReadLE16(SDL_RWops * src); |
||
| 224 | extern DECLSPEC Uint16 SDLCALL SDL_ReadBE16(SDL_RWops * src); |
||
| 225 | extern DECLSPEC Uint32 SDLCALL SDL_ReadLE32(SDL_RWops * src); |
||
| 226 | extern DECLSPEC Uint32 SDLCALL SDL_ReadBE32(SDL_RWops * src); |
||
| 227 | extern DECLSPEC Uint64 SDLCALL SDL_ReadLE64(SDL_RWops * src); |
||
| 228 | extern DECLSPEC Uint64 SDLCALL SDL_ReadBE64(SDL_RWops * src); |
||
| 229 | /* @} *//* Read endian functions */ |
||
| 230 | |||
| 231 | /** |
||
| 232 | * \name Write endian functions |
||
| 233 | * |
||
| 234 | * Write an item of native format to the specified endianness. |
||
| 235 | */ |
||
| 236 | /* @{ */ |
||
| 237 | extern DECLSPEC size_t SDLCALL SDL_WriteU8(SDL_RWops * dst, Uint8 value); |
||
| 238 | extern DECLSPEC size_t SDLCALL SDL_WriteLE16(SDL_RWops * dst, Uint16 value); |
||
| 239 | extern DECLSPEC size_t SDLCALL SDL_WriteBE16(SDL_RWops * dst, Uint16 value); |
||
| 240 | extern DECLSPEC size_t SDLCALL SDL_WriteLE32(SDL_RWops * dst, Uint32 value); |
||
| 241 | extern DECLSPEC size_t SDLCALL SDL_WriteBE32(SDL_RWops * dst, Uint32 value); |
||
| 242 | extern DECLSPEC size_t SDLCALL SDL_WriteLE64(SDL_RWops * dst, Uint64 value); |
||
| 243 | extern DECLSPEC size_t SDLCALL SDL_WriteBE64(SDL_RWops * dst, Uint64 value); |
||
| 244 | /* @} *//* Write endian functions */ |
||
| 245 | |||
| 246 | /* Ends C function definitions when using C++ */ |
||
| 247 | #ifdef __cplusplus |
||
| 248 | } |
||
| 249 | #endif |
||
| 250 | #include "close_code.h" |
||
| 251 | |||
| 252 | #endif /* SDL_rwops_h_ */ |
||
| 253 | |||
| 254 | /* vi: set ts=4 sw=4 expandtab: */ |