11 #include <drift/dslcore.h>
12 #include <drift/rwops.h>
13 #include <drift/GenLib.h>
15 int64 file_read(
void * buf, int64 size,
DSL_FILE * fp) {
16 return fread(buf,1,size,fp->fp);
19 int64 file_write(
void * buf, int64 size,
DSL_FILE * fp) {
20 return fwrite(buf,1,size,fp->fp);
23 bool file_seek(
DSL_FILE * fp, int64 pos,
int whence) {
24 return (
fseek64(fp->fp, pos, whence) == 0);
32 return (fflush(fp->fp) == 0);
36 return (feof(fp->fp) != 0);
43 do_close = opt->autoclose;
46 if (do_close) { fclose(fp->fp); }
51 FILE * fp = fopen(fn, mode);
52 if (fp == NULL) {
return NULL; }
57 ret->
read = file_read;
58 ret->
write = file_write;
59 ret->
seek = file_seek;
60 ret->
tell = file_tell;
61 ret->flush = file_flush;
63 ret->
close = file_close;
72 ret->
read = file_read;
73 ret->
write = file_write;
74 ret->
seek = file_seek;
75 ret->
tell = file_tell;
76 ret->flush = file_flush;
78 ret->
close = file_close;
81 opt->autoclose = autoclose;
95 int64 mem_read(
void * buf, int64 size,
DSL_FILE * fp) {
97 if (size + mem->offset > mem->size) {
98 size = mem->size - mem->offset;
100 if (mem->offset >= mem->size || size <= 0) {
return 0; }
102 memcpy(buf, mem->mem + mem->offset, size);
108 int64 mem_write(
void * buf, int64 size,
DSL_FILE * fp) {
111 if (size + mem->offset > mem->size) {
112 size = mem->size - mem->offset;
114 if (mem->offset >= mem->size || size <= 0) {
return 0; }
116 memcpy(mem->mem + mem->offset, buf, size);
121 bool mem_seek(
DSL_FILE * fp, int64 pos,
int mode) {
131 mem->offset = mem->size + pos;
137 if (mem->offset > mem->size) {
138 mem->offset = mem->size;
140 if (mem->offset < 0) {
161 return (mem->offset >= mem->size);
172 mem->mem = (uint8 *)dsl_malloc(size);
174 memset(mem->mem,0,size);
177 ret->
read = mem_read;
178 ret->
write = mem_write;
179 ret->
seek = mem_seek;
180 ret->
tell = mem_tell;
182 ret->flush = mem_flush;
183 ret->
close = mem_close;
195 ret->
read = mem_read;
196 ret->
write = mem_write;
197 ret->
seek = mem_seek;
198 ret->
tell = mem_tell;
200 ret->flush = mem_flush;
201 ret->
close = mem_close;
213 int64 buf_read(
void * buf, int64 size,
DSL_FILE * fp) {
215 if (size + mem->offset > mem->buf->len) {
216 size = mem->buf->len - mem->offset;
218 if (mem->offset >= mem->buf->len || size <= 0) {
return 0; }
220 memcpy(buf, mem->buf->udata + mem->offset, size);
226 int64 buf_write(
void * buf, int64 size,
DSL_FILE * fp) {
229 if (size <= 0) {
return 0; }
231 int64 newoff = mem->offset + size;
232 if (newoff > mem->buf->len) {
236 memcpy(mem->buf->udata + mem->offset, buf, size);
237 mem->offset = newoff;
241 bool buf_seek(
DSL_FILE * fp, int64 pos,
int mode) {
251 mem->offset = mem->buf->len + pos;
257 if (mem->offset > mem->buf->len) {
258 mem->offset = mem->buf->len;
260 if (mem->offset < 0) {
282 return (mem->offset >= mem->buf->len);
302 ret->
read = buf_read;
303 ret->
write = buf_write;
304 ret->
seek = buf_seek;
305 ret->
tell = buf_tell;
307 ret->flush = buf_flush;
308 ret->
close = buf_close;
319 mem->offset = buf->len;
321 mem->offset = offset;
324 ret->
read = buf_read;
325 ret->
write = buf_write;
326 ret->
seek = buf_seek;
327 ret->
tell = buf_tell;
329 ret->flush = buf_flush;
330 ret->
close = buf_close;
DSL_API void DSL_CC buffer_init(DSL_BUFFER *buf, bool useMutex=false)
Initialize the buffer, optionally with a mutex protecting it. If you don't use the mutex you need to ...
DSL_API void DSL_CC buffer_free(DSL_BUFFER *buf)
Free the buffer when you are done with it.
DSL_API void DSL_CC buffer_resize(DSL_BUFFER *buf, int64 len)
Resize the buffer, if the length is longer then the existing data the added byte values are undefined...
DSL_API void DSL_CC dsl_free(void *ptr)
DSL_API int64 DSL_CC ftell64(FILE *fp)
Cross-platform 64-bit ftell.
DSL_API int64 DSL_CC fseek64(FILE *fp, int64 offset, int whence)
Cross-platform 64-bit fseek.
DSL_FILE *DSL_CC RW_ConvertBuffer(DSL_BUFFER *buf, int64 offset)
DSL_FILE *DSL_CC RW_ConvertFile(FILE *fp, bool autoclose)
DSL_FILE *DSL_CC RW_OpenFile(const char *fn, const char *mode)
DSL_FILE *DSL_CC RW_OpenBuffer(DSL_BUFFER **pbuf)
DSL_FILE *DSL_CC RW_ConvertMemory(uint8 *buf, int64 size)
DSL_FILE *DSL_CC RW_OpenMemory(int64 size)
int64(* write)(void *buf, int64 size, DSL_FILE *fp)
void(* close)(DSL_FILE *fp)
bool(* seek)(DSL_FILE *fp, int64 pos, int mode)
int64(* read)(void *buf, int64 size, DSL_FILE *fp)
bool(* eof)(DSL_FILE *fp)
int64(* tell)(DSL_FILE *fp)