22 #define _LARGEFILE64_SOURCE 23 #include "../SDL_internal.h" 25 #if defined(__WIN32__) 26 #include "../core/windows/SDL_windows.h" 42 #include "../core/android/SDL_android.h" 47 #include "nacl_io/nacl_io.h" 54 #ifndef INVALID_SET_FILE_POINTER 55 #define INVALID_SET_FILE_POINTER 0xFFFFFFFF 58 #define READAHEAD_BUFFER_SIZE 1024 65 DWORD r_right, w_right;
66 DWORD must_exist, truncate;
87 || must_exist) ? GENERIC_READ : 0;
90 || truncate) ? GENERIC_WRITE : 0;
92 if (!r_right && !w_right)
102 SetErrorMode(SEM_NOOPENFILEERRORBOX | SEM_FAILCRITICALERRORS);
106 h = CreateFile(tstr, (w_right | r_right),
107 (w_right) ? 0 : FILE_SHARE_READ,
NULL,
108 (must_exist | truncate | a_mode),
109 FILE_ATTRIBUTE_NORMAL,
NULL);
114 SetErrorMode(old_error_mode);
116 if (h == INVALID_HANDLE_VALUE) {
134 return SDL_SetError(
"windows_file_size: invalid context/file not opened");
141 return size.QuadPart;
148 LARGE_INTEGER windowsoffset;
151 return SDL_SetError(
"windows_file_seek: invalid context/file not opened");
162 windowswhence = FILE_BEGIN;
165 windowswhence = FILE_CURRENT;
168 windowswhence = FILE_END;
171 return SDL_SetError(
"windows_file_seek: Unknown value for 'whence'");
174 windowsoffset.QuadPart =
offset;
175 if (!SetFilePointerEx(context->
hidden.
windowsio.h, windowsoffset, &windowsoffset, windowswhence)) {
178 return windowsoffset.QuadPart;
182 windows_file_read(
SDL_RWops * context,
void *
ptr,
size_t size,
size_t maxnum)
185 size_t total_read = 0;
189 total_need =
size * maxnum;
204 if (read_ahead == total_need) {
207 ptr = (
char *)
ptr + read_ahead;
208 total_need -= read_ahead;
209 total_read += read_ahead;
212 if (total_need < READAHEAD_BUFFER_SIZE) {
215 READAHEAD_BUFFER_SIZE, &byte_read,
NULL)) {
219 read_ahead =
SDL_min(total_need, (
int) byte_read);
223 total_read += read_ahead;
230 total_read += byte_read;
232 return (total_read /
size);
247 || total_bytes <= 0 || !
size)
260 INVALID_SET_FILE_POINTER) {
272 nwritten = byte_written /
size;
319 #elif defined(HAVE_FSEEKO) 320 if (fseeko(context->
hidden.
stdio.fp, (off_t)offset, whence) == 0) {
323 #elif defined(HAVE__FSEEKI64) 324 if (_fseeki64(context->
hidden.
stdio.fp, offset, whence) == 0) {
328 if (fseek(context->
hidden.
stdio.fp, offset, whence) == 0) {
341 if (nread == 0 && ferror(context->
hidden.
stdio.fp)) {
353 if (nwrote == 0 && ferror(context->
hidden.
stdio.fp)) {
402 if (newpos < context->hidden.mem.base) {
416 size_t mem_available;
418 total_bytes = (maxnum *
size);
419 if ((maxnum <= 0) || (size <= 0)
420 || ((total_bytes / maxnum) != (
size_t) size)) {
425 if (total_bytes > mem_available) {
426 total_bytes = mem_available;
432 return (total_bytes / size);
469 if (!file || !*file || !mode || !*mode) {
470 SDL_SetError(
"SDL_RWFromFile(): No file or no mode specified");
473 #if defined(__ANDROID__) 477 FILE *fp = fopen(file, mode);
490 fp = fopen(path, mode);
514 #elif defined(__WIN32__) 518 if (windows_file_open(rwops, file, mode) < 0) {
522 rwops->
size = windows_file_size;
523 rwops->
seek = windows_file_seek;
524 rwops->
read = windows_file_read;
525 rwops->
write = windows_file_write;
526 rwops->
close = windows_file_close;
532 FILE *fp = SDL_OpenFPFromBundleOrFallback(file, mode);
535 fopen_s(&fp, file, mode);
537 FILE *fp = fopen(file, mode);
560 rwops->
size = stdio_size;
561 rwops->
seek = stdio_seek;
562 rwops->
read = stdio_read;
563 rwops->
write = stdio_write;
564 rwops->
close = stdio_close;
724 return SDL_RWwrite(dst, &value,
sizeof (value), 1);
731 return SDL_RWwrite(dst, &swapped,
sizeof (swapped), 1);
738 return SDL_RWwrite(dst, &swapped,
sizeof (swapped), 1);
745 return SDL_RWwrite(dst, &swapped,
sizeof (swapped), 1);
752 return SDL_RWwrite(dst, &swapped,
sizeof (swapped), 1);
759 return SDL_RWwrite(dst, &swapped,
sizeof (swapped), 1);
766 return SDL_RWwrite(dst, &swapped,
sizeof (swapped), 1);
int Android_JNI_FileClose(SDL_RWops *ctx)
#define WIN_UTF8ToString(S)
Uint32 SDL_ReadBE32(SDL_RWops *src)
void SDL_FreeRW(SDL_RWops *area)
#define SDL_RWwrite(ctx, ptr, size, n)
set set set set set set set set set set set set set set set set set set set set *set set set macro pixldst op &r &cond WK op &r &cond WK op &r &cond WK else op &m &cond &ia op &r &cond WK else op &m &cond &ia elseif elseif else error unsupported base if elseif elseif else error unsupported unaligned pixldst unaligned endm macro pixst base base else pixldst base endif endm macro PF ptr
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
#define SDL_RWOPS_WINFILE
SDL_RWops * SDL_RWFromConstMem(const void *mem, int size)
#define SDL_RWread(ctx, ptr, size, n)
size_t(* write)(struct SDL_RWops *context, const void *ptr, size_t size, size_t num)
#define SDL_RWOPS_UNKNOWN
uint32_t Uint32
An unsigned 32-bit integer type.
#define SDL_InvalidParamError(param)
static size_t mem_writeconst(SDL_RWops *context, const void *ptr, size_t size, size_t num)
size_t SDL_WriteLE32(SDL_RWops *dst, Uint32 value)
static Sint64 mem_size(SDL_RWops *context)
uint64_t Uint64
An unsigned 64-bit integer type.
int Android_JNI_FileOpen(SDL_RWops *ctx, const char *fileName, const char *mode)
struct SDL_RWops::@10::@11 windowsio
struct SDL_RWops::@10::@13 mem
Uint64 SDL_ReadLE64(SDL_RWops *src)
struct SDL_RWops::@10::@12 stdio
Sint64(* seek)(struct SDL_RWops *context, Sint64 offset, int whence)
#define SDL_RWseek(ctx, offset, whence)
static size_t mem_write(SDL_RWops *context, const void *ptr, size_t size, size_t num)
Uint16 SDL_ReadBE16(SDL_RWops *src)
SDL_RWops * SDL_AllocRW(void)
size_t SDL_WriteBE16(SDL_RWops *dst, Uint16 value)
size_t SDL_WriteBE64(SDL_RWops *dst, Uint64 value)
SDL_RWops * SDL_RWFromFile(const char *file, const char *mode)
static int mem_close(SDL_RWops *context)
GLsizei const GLfloat * value
uint8_t Uint8
An unsigned 8-bit integer type.
#define SDL_stack_alloc(type, count)
int(* close)(struct SDL_RWops *context)
SDL_RWops * SDL_RWFromFP(void *fp, SDL_bool autoclose)
size_t Android_JNI_FileWrite(SDL_RWops *ctx, const void *buffer, size_t size, size_t num)
size_t SDL_WriteBE32(SDL_RWops *dst, Uint32 value)
static Sint64 mem_seek(SDL_RWops *context, Sint64 offset, int whence)
Uint32 SDL_ReadLE32(SDL_RWops *src)
size_t SDL_WriteLE64(SDL_RWops *dst, Uint64 value)
Sint64(* size)(struct SDL_RWops *context)
#define SDL_OutOfMemory()
SDL_RWops * SDL_RWFromMem(void *mem, int size)
int WIN_SetError(const char *prefix)
union SDL_RWops::@10 hidden
#define SDL_RWOPS_STDFILE
size_t Android_JNI_FileRead(SDL_RWops *ctx, void *buffer, size_t size, size_t maxnum)
#define SDL_RWOPS_MEMORY_RO
size_t SDL_WriteU8(SDL_RWops *dst, Uint8 value)
size_t(* read)(struct SDL_RWops *context, void *ptr, size_t size, size_t maxnum)
uint16_t Uint16
An unsigned 16-bit integer type.
Uint8 SDL_ReadU8(SDL_RWops *src)
GLsizei const GLchar *const * path
Uint64 SDL_ReadBE64(SDL_RWops *src)
int64_t Sint64
A signed 64-bit integer type.
#define SDL_stack_free(data)
size_t SDL_WriteLE16(SDL_RWops *dst, Uint16 value)
static size_t mem_read(SDL_RWops *context, void *ptr, size_t size, size_t maxnum)
#define SDL_AndroidGetInternalStoragePath
GLfloat GLfloat GLfloat GLfloat h
Sint64 Android_JNI_FileSeek(SDL_RWops *ctx, Sint64 offset, int whence)
Uint16 SDL_ReadLE16(SDL_RWops *src)
Sint64 Android_JNI_FileSize(SDL_RWops *ctx)
#define SDL_RWOPS_JNIFILE