project_files/Android-build/SDL-android-project/jni/SDL/src/file/SDL_rwops.c
changeset 6619 229b99faf580
child 10017 de822cd3df3a
equal deleted inserted replaced
6618:2d3232069c4b 6619:229b99faf580
       
     1 /*
       
     2   Simple DirectMedia Layer
       
     3   Copyright (C) 1997-2012 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 #include "SDL_config.h"
       
    22 
       
    23 /* This file provides a general interface for SDL to read and write
       
    24    data sources.  It can easily be extended to files, memory, etc.
       
    25 */
       
    26 
       
    27 #include "SDL_endian.h"
       
    28 #include "SDL_rwops.h"
       
    29 
       
    30 #ifdef __APPLE__
       
    31 #include "cocoa/SDL_rwopsbundlesupport.h"
       
    32 #endif /* __APPLE__ */
       
    33 
       
    34 #ifdef ANDROID
       
    35 #include "../core/android/SDL_android.h"
       
    36 #include <android/log.h>
       
    37 #endif
       
    38 
       
    39 #ifdef __NDS__
       
    40 /* include libfat headers for fatInitDefault(). */
       
    41 #include <fat.h>
       
    42 #endif /* __NDS__ */
       
    43 
       
    44 #ifdef __WIN32__
       
    45 
       
    46 /* Functions to read/write Win32 API file pointers */
       
    47 /* Will not use it on WinCE because stdio is buffered, it means
       
    48    faster, and all stdio functions anyway are embedded in coredll.dll - 
       
    49    the main wince dll*/
       
    50 
       
    51 #include "../core/windows/SDL_windows.h"
       
    52 
       
    53 #ifndef INVALID_SET_FILE_POINTER
       
    54 #define INVALID_SET_FILE_POINTER 0xFFFFFFFF
       
    55 #endif
       
    56 
       
    57 #define READAHEAD_BUFFER_SIZE	1024
       
    58 
       
    59 static int SDLCALL
       
    60 windows_file_open(SDL_RWops * context, const char *filename, const char *mode)
       
    61 {
       
    62 #ifndef _WIN32_WCE
       
    63     UINT old_error_mode;
       
    64 #endif
       
    65     HANDLE h;
       
    66     DWORD r_right, w_right;
       
    67     DWORD must_exist, truncate;
       
    68     int a_mode;
       
    69 
       
    70     if (!context)
       
    71         return -1;              /* failed (invalid call) */
       
    72 
       
    73     context->hidden.windowsio.h = INVALID_HANDLE_VALUE;   /* mark this as unusable */
       
    74     context->hidden.windowsio.buffer.data = NULL;
       
    75     context->hidden.windowsio.buffer.size = 0;
       
    76     context->hidden.windowsio.buffer.left = 0;
       
    77 
       
    78     /* "r" = reading, file must exist */
       
    79     /* "w" = writing, truncate existing, file may not exist */
       
    80     /* "r+"= reading or writing, file must exist            */
       
    81     /* "a" = writing, append file may not exist             */
       
    82     /* "a+"= append + read, file may not exist              */
       
    83     /* "w+" = read, write, truncate. file may not exist    */
       
    84 
       
    85     must_exist = (SDL_strchr(mode, 'r') != NULL) ? OPEN_EXISTING : 0;
       
    86     truncate = (SDL_strchr(mode, 'w') != NULL) ? CREATE_ALWAYS : 0;
       
    87     r_right = (SDL_strchr(mode, '+') != NULL
       
    88                || must_exist) ? GENERIC_READ : 0;
       
    89     a_mode = (SDL_strchr(mode, 'a') != NULL) ? OPEN_ALWAYS : 0;
       
    90     w_right = (a_mode || SDL_strchr(mode, '+')
       
    91                || truncate) ? GENERIC_WRITE : 0;
       
    92 
       
    93     if (!r_right && !w_right)   /* inconsistent mode */
       
    94         return -1;              /* failed (invalid call) */
       
    95 
       
    96     context->hidden.windowsio.buffer.data =
       
    97         (char *) SDL_malloc(READAHEAD_BUFFER_SIZE);
       
    98     if (!context->hidden.windowsio.buffer.data) {
       
    99         SDL_OutOfMemory();
       
   100         return -1;
       
   101     }
       
   102 #ifdef _WIN32_WCE
       
   103     {
       
   104         LPTSTR tstr = WIN_UTF8ToString(filename);
       
   105         h = CreateFile(tstr, (w_right | r_right),
       
   106                        (w_right) ? 0 : FILE_SHARE_READ, NULL,
       
   107                        (must_exist | truncate | a_mode),
       
   108                        FILE_ATTRIBUTE_NORMAL, NULL);
       
   109         SDL_free(tstr);
       
   110     }
       
   111 #else
       
   112     /* Do not open a dialog box if failure */
       
   113     old_error_mode =
       
   114         SetErrorMode(SEM_NOOPENFILEERRORBOX | SEM_FAILCRITICALERRORS);
       
   115 
       
   116     {
       
   117         LPTSTR tstr = WIN_UTF8ToString(filename);
       
   118         h = CreateFile(tstr, (w_right | r_right),
       
   119                        (w_right) ? 0 : FILE_SHARE_READ, NULL,
       
   120                        (must_exist | truncate | a_mode),
       
   121                        FILE_ATTRIBUTE_NORMAL, NULL);
       
   122         SDL_free(tstr);
       
   123     }
       
   124 
       
   125     /* restore old behavior */
       
   126     SetErrorMode(old_error_mode);
       
   127 #endif /* _WIN32_WCE */
       
   128 
       
   129     if (h == INVALID_HANDLE_VALUE) {
       
   130         SDL_free(context->hidden.windowsio.buffer.data);
       
   131         context->hidden.windowsio.buffer.data = NULL;
       
   132         SDL_SetError("Couldn't open %s", filename);
       
   133         return -2;              /* failed (CreateFile) */
       
   134     }
       
   135     context->hidden.windowsio.h = h;
       
   136     context->hidden.windowsio.append = a_mode ? SDL_TRUE : SDL_FALSE;
       
   137 
       
   138     return 0;                   /* ok */
       
   139 }
       
   140 
       
   141 static long SDLCALL
       
   142 windows_file_seek(SDL_RWops * context, long offset, int whence)
       
   143 {
       
   144     DWORD windowswhence;
       
   145     long file_pos;
       
   146 
       
   147     if (!context || context->hidden.windowsio.h == INVALID_HANDLE_VALUE) {
       
   148         SDL_SetError("windows_file_seek: invalid context/file not opened");
       
   149         return -1;
       
   150     }
       
   151 
       
   152     /* FIXME: We may be able to satisfy the seek within buffered data */
       
   153     if (whence == RW_SEEK_CUR && context->hidden.windowsio.buffer.left) {
       
   154         offset -= (long)context->hidden.windowsio.buffer.left;
       
   155     }
       
   156     context->hidden.windowsio.buffer.left = 0;
       
   157 
       
   158     switch (whence) {
       
   159     case RW_SEEK_SET:
       
   160         windowswhence = FILE_BEGIN;
       
   161         break;
       
   162     case RW_SEEK_CUR:
       
   163         windowswhence = FILE_CURRENT;
       
   164         break;
       
   165     case RW_SEEK_END:
       
   166         windowswhence = FILE_END;
       
   167         break;
       
   168     default:
       
   169         SDL_SetError("windows_file_seek: Unknown value for 'whence'");
       
   170         return -1;
       
   171     }
       
   172 
       
   173     file_pos =
       
   174         SetFilePointer(context->hidden.windowsio.h, offset, NULL, windowswhence);
       
   175 
       
   176     if (file_pos != INVALID_SET_FILE_POINTER)
       
   177         return file_pos;        /* success */
       
   178 
       
   179     SDL_Error(SDL_EFSEEK);
       
   180     return -1;                  /* error */
       
   181 }
       
   182 
       
   183 static size_t SDLCALL
       
   184 windows_file_read(SDL_RWops * context, void *ptr, size_t size, size_t maxnum)
       
   185 {
       
   186     size_t total_need;
       
   187     size_t total_read = 0;
       
   188     size_t read_ahead;
       
   189     DWORD byte_read;
       
   190 
       
   191     total_need = size * maxnum;
       
   192 
       
   193     if (!context || context->hidden.windowsio.h == INVALID_HANDLE_VALUE
       
   194         || !total_need)
       
   195         return 0;
       
   196 
       
   197     if (context->hidden.windowsio.buffer.left > 0) {
       
   198         void *data = (char *) context->hidden.windowsio.buffer.data +
       
   199             context->hidden.windowsio.buffer.size -
       
   200             context->hidden.windowsio.buffer.left;
       
   201         read_ahead =
       
   202             SDL_min(total_need, context->hidden.windowsio.buffer.left);
       
   203         SDL_memcpy(ptr, data, read_ahead);
       
   204         context->hidden.windowsio.buffer.left -= read_ahead;
       
   205 
       
   206         if (read_ahead == total_need) {
       
   207             return maxnum;
       
   208         }
       
   209         ptr = (char *) ptr + read_ahead;
       
   210         total_need -= read_ahead;
       
   211         total_read += read_ahead;
       
   212     }
       
   213 
       
   214     if (total_need < READAHEAD_BUFFER_SIZE) {
       
   215         if (!ReadFile
       
   216             (context->hidden.windowsio.h, context->hidden.windowsio.buffer.data,
       
   217              READAHEAD_BUFFER_SIZE, &byte_read, NULL)) {
       
   218             SDL_Error(SDL_EFREAD);
       
   219             return 0;
       
   220         }
       
   221         read_ahead = SDL_min(total_need, (int) byte_read);
       
   222         SDL_memcpy(ptr, context->hidden.windowsio.buffer.data, read_ahead);
       
   223         context->hidden.windowsio.buffer.size = byte_read;
       
   224         context->hidden.windowsio.buffer.left = byte_read - read_ahead;
       
   225         total_read += read_ahead;
       
   226     } else {
       
   227         if (!ReadFile
       
   228             (context->hidden.windowsio.h, ptr, (DWORD)total_need, &byte_read, NULL)) {
       
   229             SDL_Error(SDL_EFREAD);
       
   230             return 0;
       
   231         }
       
   232         total_read += byte_read;
       
   233     }
       
   234     return (total_read / size);
       
   235 }
       
   236 
       
   237 static size_t SDLCALL
       
   238 windows_file_write(SDL_RWops * context, const void *ptr, size_t size,
       
   239                  size_t num)
       
   240 {
       
   241 
       
   242     size_t total_bytes;
       
   243     DWORD byte_written;
       
   244     size_t nwritten;
       
   245 
       
   246     total_bytes = size * num;
       
   247 
       
   248     if (!context || context->hidden.windowsio.h == INVALID_HANDLE_VALUE
       
   249         || total_bytes <= 0 || !size)
       
   250         return 0;
       
   251 
       
   252     if (context->hidden.windowsio.buffer.left) {
       
   253         SetFilePointer(context->hidden.windowsio.h,
       
   254                        -(LONG)context->hidden.windowsio.buffer.left, NULL,
       
   255                        FILE_CURRENT);
       
   256         context->hidden.windowsio.buffer.left = 0;
       
   257     }
       
   258 
       
   259     /* if in append mode, we must go to the EOF before write */
       
   260     if (context->hidden.windowsio.append) {
       
   261         if (SetFilePointer(context->hidden.windowsio.h, 0L, NULL, FILE_END) ==
       
   262             INVALID_SET_FILE_POINTER) {
       
   263             SDL_Error(SDL_EFWRITE);
       
   264             return 0;
       
   265         }
       
   266     }
       
   267 
       
   268     if (!WriteFile
       
   269         (context->hidden.windowsio.h, ptr, (DWORD)total_bytes, &byte_written, NULL)) {
       
   270         SDL_Error(SDL_EFWRITE);
       
   271         return 0;
       
   272     }
       
   273 
       
   274     nwritten = byte_written / size;
       
   275     return nwritten;
       
   276 }
       
   277 
       
   278 static int SDLCALL
       
   279 windows_file_close(SDL_RWops * context)
       
   280 {
       
   281 
       
   282     if (context) {
       
   283         if (context->hidden.windowsio.h != INVALID_HANDLE_VALUE) {
       
   284             CloseHandle(context->hidden.windowsio.h);
       
   285             context->hidden.windowsio.h = INVALID_HANDLE_VALUE;   /* to be sure */
       
   286         }
       
   287         if (context->hidden.windowsio.buffer.data) {
       
   288             SDL_free(context->hidden.windowsio.buffer.data);
       
   289             context->hidden.windowsio.buffer.data = NULL;
       
   290         }
       
   291         SDL_FreeRW(context);
       
   292     }
       
   293     return (0);
       
   294 }
       
   295 #endif /* __WIN32__ */
       
   296 
       
   297 #ifdef HAVE_STDIO_H
       
   298 
       
   299 /* Functions to read/write stdio file pointers */
       
   300 
       
   301 static long SDLCALL
       
   302 stdio_seek(SDL_RWops * context, long offset, int whence)
       
   303 {
       
   304     if (fseek(context->hidden.stdio.fp, offset, whence) == 0) {
       
   305         return (ftell(context->hidden.stdio.fp));
       
   306     } else {
       
   307         SDL_Error(SDL_EFSEEK);
       
   308         return (-1);
       
   309     }
       
   310 }
       
   311 
       
   312 static size_t SDLCALL
       
   313 stdio_read(SDL_RWops * context, void *ptr, size_t size, size_t maxnum)
       
   314 {
       
   315     size_t nread;
       
   316 
       
   317     nread = fread(ptr, size, maxnum, context->hidden.stdio.fp);
       
   318     if (nread == 0 && ferror(context->hidden.stdio.fp)) {
       
   319         SDL_Error(SDL_EFREAD);
       
   320     }
       
   321     return (nread);
       
   322 }
       
   323 
       
   324 static size_t SDLCALL
       
   325 stdio_write(SDL_RWops * context, const void *ptr, size_t size, size_t num)
       
   326 {
       
   327     size_t nwrote;
       
   328 
       
   329     nwrote = fwrite(ptr, size, num, context->hidden.stdio.fp);
       
   330     if (nwrote == 0 && ferror(context->hidden.stdio.fp)) {
       
   331         SDL_Error(SDL_EFWRITE);
       
   332     }
       
   333     return (nwrote);
       
   334 }
       
   335 
       
   336 static int SDLCALL
       
   337 stdio_close(SDL_RWops * context)
       
   338 {
       
   339     int status = 0;
       
   340     if (context) {
       
   341         if (context->hidden.stdio.autoclose) {
       
   342             /* WARNING:  Check the return value here! */
       
   343             if (fclose(context->hidden.stdio.fp) != 0) {
       
   344                 SDL_Error(SDL_EFWRITE);
       
   345                 status = -1;
       
   346             }
       
   347         }
       
   348         SDL_FreeRW(context);
       
   349     }
       
   350     return status;
       
   351 }
       
   352 #endif /* !HAVE_STDIO_H */
       
   353 
       
   354 /* Functions to read/write memory pointers */
       
   355 
       
   356 static long SDLCALL
       
   357 mem_seek(SDL_RWops * context, long offset, int whence)
       
   358 {
       
   359     Uint8 *newpos;
       
   360 
       
   361     switch (whence) {
       
   362     case RW_SEEK_SET:
       
   363         newpos = context->hidden.mem.base + offset;
       
   364         break;
       
   365     case RW_SEEK_CUR:
       
   366         newpos = context->hidden.mem.here + offset;
       
   367         break;
       
   368     case RW_SEEK_END:
       
   369         newpos = context->hidden.mem.stop + offset;
       
   370         break;
       
   371     default:
       
   372         SDL_SetError("Unknown value for 'whence'");
       
   373         return (-1);
       
   374     }
       
   375     if (newpos < context->hidden.mem.base) {
       
   376         newpos = context->hidden.mem.base;
       
   377     }
       
   378     if (newpos > context->hidden.mem.stop) {
       
   379         newpos = context->hidden.mem.stop;
       
   380     }
       
   381     context->hidden.mem.here = newpos;
       
   382     return (long)(context->hidden.mem.here - context->hidden.mem.base);
       
   383 }
       
   384 
       
   385 static size_t SDLCALL
       
   386 mem_read(SDL_RWops * context, void *ptr, size_t size, size_t maxnum)
       
   387 {
       
   388     size_t total_bytes;
       
   389     size_t mem_available;
       
   390 
       
   391     total_bytes = (maxnum * size);
       
   392     if ((maxnum <= 0) || (size <= 0)
       
   393         || ((total_bytes / maxnum) != (size_t) size)) {
       
   394         return 0;
       
   395     }
       
   396 
       
   397     mem_available = (context->hidden.mem.stop - context->hidden.mem.here);
       
   398     if (total_bytes > mem_available) {
       
   399         total_bytes = mem_available;
       
   400     }
       
   401 
       
   402     SDL_memcpy(ptr, context->hidden.mem.here, total_bytes);
       
   403     context->hidden.mem.here += total_bytes;
       
   404 
       
   405     return (total_bytes / size);
       
   406 }
       
   407 
       
   408 static size_t SDLCALL
       
   409 mem_write(SDL_RWops * context, const void *ptr, size_t size, size_t num)
       
   410 {
       
   411     if ((context->hidden.mem.here + (num * size)) > context->hidden.mem.stop) {
       
   412         num = (context->hidden.mem.stop - context->hidden.mem.here) / size;
       
   413     }
       
   414     SDL_memcpy(context->hidden.mem.here, ptr, num * size);
       
   415     context->hidden.mem.here += num * size;
       
   416     return (num);
       
   417 }
       
   418 
       
   419 static size_t SDLCALL
       
   420 mem_writeconst(SDL_RWops * context, const void *ptr, size_t size, size_t num)
       
   421 {
       
   422     SDL_SetError("Can't write to read-only memory");
       
   423     return (-1);
       
   424 }
       
   425 
       
   426 static int SDLCALL
       
   427 mem_close(SDL_RWops * context)
       
   428 {
       
   429     if (context) {
       
   430         SDL_FreeRW(context);
       
   431     }
       
   432     return (0);
       
   433 }
       
   434 
       
   435 
       
   436 /* Functions to create SDL_RWops structures from various data sources */
       
   437 
       
   438 SDL_RWops *
       
   439 SDL_RWFromFile(const char *file, const char *mode)
       
   440 {
       
   441     SDL_RWops *rwops = NULL;
       
   442 #ifdef HAVE_STDIO_H
       
   443     FILE *fp = NULL;
       
   444 #endif
       
   445     if (!file || !*file || !mode || !*mode) {
       
   446         SDL_SetError("SDL_RWFromFile(): No file or no mode specified");
       
   447         return NULL;
       
   448     }
       
   449 #if defined(ANDROIDXELI) //Xeli: dont use the android assets, TODO create fallback system
       
   450     rwops = SDL_AllocRW();
       
   451     if (!rwops)
       
   452         return NULL;            /* SDL_SetError already setup by SDL_AllocRW() */
       
   453     if (Android_JNI_FileOpen(rwops, file, mode) < 0) {
       
   454         SDL_FreeRW(rwops);
       
   455         return NULL;
       
   456     }
       
   457     rwops->seek = Android_JNI_FileSeek;
       
   458     rwops->read = Android_JNI_FileRead;
       
   459     rwops->write = Android_JNI_FileWrite;
       
   460     rwops->close = Android_JNI_FileClose;
       
   461 
       
   462 #elif defined(__WIN32__)
       
   463     rwops = SDL_AllocRW();
       
   464     if (!rwops)
       
   465         return NULL;            /* SDL_SetError already setup by SDL_AllocRW() */
       
   466     if (windows_file_open(rwops, file, mode) < 0) {
       
   467         SDL_FreeRW(rwops);
       
   468         return NULL;
       
   469     }
       
   470     rwops->seek = windows_file_seek;
       
   471     rwops->read = windows_file_read;
       
   472     rwops->write = windows_file_write;
       
   473     rwops->close = windows_file_close;
       
   474 
       
   475 #elif HAVE_STDIO_H
       
   476 	#ifdef __APPLE__
       
   477 	fp = SDL_OpenFPFromBundleOrFallback(file, mode);
       
   478     #else
       
   479 	fp = fopen(file, mode);
       
   480 	#endif
       
   481 	if (fp == NULL) {
       
   482         SDL_SetError("Couldn't open %s", file);
       
   483     } else {
       
   484         rwops = SDL_RWFromFP(fp, 1);
       
   485     }
       
   486 #else
       
   487     SDL_SetError("SDL not compiled with stdio support");
       
   488 #endif /* !HAVE_STDIO_H */
       
   489 
       
   490     return (rwops);
       
   491 }
       
   492 
       
   493 #ifdef HAVE_STDIO_H
       
   494 SDL_RWops *
       
   495 SDL_RWFromFP(FILE * fp, SDL_bool autoclose)
       
   496 {
       
   497     SDL_RWops *rwops = NULL;
       
   498 
       
   499 #if 0
       
   500 /*#ifdef __NDS__*/
       
   501     /* set it up so we can use stdio file function */
       
   502     fatInitDefault();
       
   503     printf("called fatInitDefault()");
       
   504 #endif /* __NDS__ */
       
   505 
       
   506     rwops = SDL_AllocRW();
       
   507     if (rwops != NULL) {
       
   508         rwops->seek = stdio_seek;
       
   509         rwops->read = stdio_read;
       
   510         rwops->write = stdio_write;
       
   511         rwops->close = stdio_close;
       
   512         rwops->hidden.stdio.fp = fp;
       
   513         rwops->hidden.stdio.autoclose = autoclose;
       
   514     }
       
   515     return (rwops);
       
   516 }
       
   517 #else
       
   518 SDL_RWops *
       
   519 SDL_RWFromFP(void * fp, SDL_bool autoclose)
       
   520 {
       
   521     SDL_SetError("SDL not compiled with stdio support");
       
   522     return NULL;
       
   523 }
       
   524 #endif /* HAVE_STDIO_H */
       
   525 
       
   526 SDL_RWops *
       
   527 SDL_RWFromMem(void *mem, int size)
       
   528 {
       
   529     SDL_RWops *rwops;
       
   530 
       
   531     rwops = SDL_AllocRW();
       
   532     if (rwops != NULL) {
       
   533         rwops->seek = mem_seek;
       
   534         rwops->read = mem_read;
       
   535         rwops->write = mem_write;
       
   536         rwops->close = mem_close;
       
   537         rwops->hidden.mem.base = (Uint8 *) mem;
       
   538         rwops->hidden.mem.here = rwops->hidden.mem.base;
       
   539         rwops->hidden.mem.stop = rwops->hidden.mem.base + size;
       
   540     }
       
   541     return (rwops);
       
   542 }
       
   543 
       
   544 SDL_RWops *
       
   545 SDL_RWFromConstMem(const void *mem, int size)
       
   546 {
       
   547     SDL_RWops *rwops;
       
   548 
       
   549     rwops = SDL_AllocRW();
       
   550     if (rwops != NULL) {
       
   551         rwops->seek = mem_seek;
       
   552         rwops->read = mem_read;
       
   553         rwops->write = mem_writeconst;
       
   554         rwops->close = mem_close;
       
   555         rwops->hidden.mem.base = (Uint8 *) mem;
       
   556         rwops->hidden.mem.here = rwops->hidden.mem.base;
       
   557         rwops->hidden.mem.stop = rwops->hidden.mem.base + size;
       
   558     }
       
   559     return (rwops);
       
   560 }
       
   561 
       
   562 SDL_RWops *
       
   563 SDL_AllocRW(void)
       
   564 {
       
   565     SDL_RWops *area;
       
   566 
       
   567     area = (SDL_RWops *) SDL_malloc(sizeof *area);
       
   568     if (area == NULL) {
       
   569         SDL_OutOfMemory();
       
   570     }
       
   571     return (area);
       
   572 }
       
   573 
       
   574 void
       
   575 SDL_FreeRW(SDL_RWops * area)
       
   576 {
       
   577     SDL_free(area);
       
   578 }
       
   579 
       
   580 /* Functions for dynamically reading and writing endian-specific values */
       
   581 
       
   582 Uint16
       
   583 SDL_ReadLE16(SDL_RWops * src)
       
   584 {
       
   585     Uint16 value;
       
   586 
       
   587     SDL_RWread(src, &value, (sizeof value), 1);
       
   588     return (SDL_SwapLE16(value));
       
   589 }
       
   590 
       
   591 Uint16
       
   592 SDL_ReadBE16(SDL_RWops * src)
       
   593 {
       
   594     Uint16 value;
       
   595 
       
   596     SDL_RWread(src, &value, (sizeof value), 1);
       
   597     return (SDL_SwapBE16(value));
       
   598 }
       
   599 
       
   600 Uint32
       
   601 SDL_ReadLE32(SDL_RWops * src)
       
   602 {
       
   603     Uint32 value;
       
   604 
       
   605     SDL_RWread(src, &value, (sizeof value), 1);
       
   606     return (SDL_SwapLE32(value));
       
   607 }
       
   608 
       
   609 Uint32
       
   610 SDL_ReadBE32(SDL_RWops * src)
       
   611 {
       
   612     Uint32 value;
       
   613 
       
   614     SDL_RWread(src, &value, (sizeof value), 1);
       
   615     return (SDL_SwapBE32(value));
       
   616 }
       
   617 
       
   618 Uint64
       
   619 SDL_ReadLE64(SDL_RWops * src)
       
   620 {
       
   621     Uint64 value;
       
   622 
       
   623     SDL_RWread(src, &value, (sizeof value), 1);
       
   624     return (SDL_SwapLE64(value));
       
   625 }
       
   626 
       
   627 Uint64
       
   628 SDL_ReadBE64(SDL_RWops * src)
       
   629 {
       
   630     Uint64 value;
       
   631 
       
   632     SDL_RWread(src, &value, (sizeof value), 1);
       
   633     return (SDL_SwapBE64(value));
       
   634 }
       
   635 
       
   636 size_t
       
   637 SDL_WriteLE16(SDL_RWops * dst, Uint16 value)
       
   638 {
       
   639     value = SDL_SwapLE16(value);
       
   640     return (SDL_RWwrite(dst, &value, (sizeof value), 1));
       
   641 }
       
   642 
       
   643 size_t
       
   644 SDL_WriteBE16(SDL_RWops * dst, Uint16 value)
       
   645 {
       
   646     value = SDL_SwapBE16(value);
       
   647     return (SDL_RWwrite(dst, &value, (sizeof value), 1));
       
   648 }
       
   649 
       
   650 size_t
       
   651 SDL_WriteLE32(SDL_RWops * dst, Uint32 value)
       
   652 {
       
   653     value = SDL_SwapLE32(value);
       
   654     return (SDL_RWwrite(dst, &value, (sizeof value), 1));
       
   655 }
       
   656 
       
   657 size_t
       
   658 SDL_WriteBE32(SDL_RWops * dst, Uint32 value)
       
   659 {
       
   660     value = SDL_SwapBE32(value);
       
   661     return (SDL_RWwrite(dst, &value, (sizeof value), 1));
       
   662 }
       
   663 
       
   664 size_t
       
   665 SDL_WriteLE64(SDL_RWops * dst, Uint64 value)
       
   666 {
       
   667     value = SDL_SwapLE64(value);
       
   668     return (SDL_RWwrite(dst, &value, (sizeof value), 1));
       
   669 }
       
   670 
       
   671 size_t
       
   672 SDL_WriteBE64(SDL_RWops * dst, Uint64 value)
       
   673 {
       
   674     value = SDL_SwapBE64(value);
       
   675     return (SDL_RWwrite(dst, &value, (sizeof value), 1));
       
   676 }
       
   677 
       
   678 /* vi: set ts=4 sw=4 expandtab: */