From e862eacf7e076495bb1859c5e10dc426761dbde0 Mon Sep 17 00:00:00 2001 From: DeaDDooMER Date: Tue, 6 Apr 2021 08:28:00 +0300 Subject: [PATCH] files: add abstract streams --- src/CMakeLists.txt | 4 +- src/common/files.c | 95 ++++++++++++++++++++++++++++++++++++++++++++ src/common/files.h | 25 ++++++++++++ src/common/streams.c | 46 +++++++++++++++++++++ src/common/streams.h | 30 ++++++++++++++ 5 files changed, 199 insertions(+), 1 deletion(-) create mode 100644 src/common/files.c create mode 100644 src/common/files.h create mode 100644 src/common/streams.c create mode 100644 src/common/streams.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 65b4196..b7929db 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -34,6 +34,7 @@ set(D2D_SDLMIXER_ROOT ${D2D_GAME_ROOT}/sdlmixer) set(D2D_OPENAL_ROOT ${D2D_GAME_ROOT}/openal) set(D2D_STUBSOUND_ROOT ${D2D_GAME_ROOT}/stubsnd) set(D2D_LIBCP866_ROOT ${D2D_GAME_ROOT}/libs/cp866) +set(D2D_COMMON_ROOT ${D2D_GAME_ROOT}/common) aux_source_directory(${D2D_GAME_ROOT} D2D_GAME_SRC) aux_source_directory(${D2D_SDL_ROOT} D2D_SDL_SRC) @@ -47,6 +48,7 @@ aux_source_directory(${D2D_SDLMIXER_ROOT} D2D_SDLMIXER_SRC) aux_source_directory(${D2D_OPENAL_ROOT} D2D_OPENAL_SRC) aux_source_directory(${D2D_STUBSOUND_ROOT} D2D_STUBSOUND_SRC) aux_source_directory(${D2D_LIBCP866_ROOT} D2D_LIBCP866_SRC) +aux_source_directory(${D2D_COMMON_ROOT} D2D_COMMON_SRC) if(WITH_SDL) if(D2D_FOR_EMSCRIPTEN) @@ -149,7 +151,7 @@ message(STATUS "SYSTEM: " "${SYSTEM_DRIVER}") message(STATUS "RENDER: " "${RENDER_DRIVER}") message(STATUS "SOUND: " "${SOUND_DRIVER}") -set(D2D_USED_SRC ${D2D_GAME_SRC} ${D2D_SYSTEM_SRC} ${D2D_RENDER_SRC} ${D2D_SOUND_SRC} ${D2D_LIBCP866_SRC}) +set(D2D_USED_SRC ${D2D_GAME_SRC} ${D2D_SYSTEM_SRC} ${D2D_RENDER_SRC} ${D2D_SOUND_SRC} ${D2D_LIBCP866_SRC} ${D2D_COMMON_SRC}) set(D2D_USED_INCLUDE_DIR "${D2D_GAME_ROOT}" "${D2D_SYSTEM_INCLUDE_DIR}" "${D2D_RENDER_INCLUDE_DIR}" "${D2D_SOUND_INCLUDE_DIR}" "${D2D_LIBCP866_ROOT}") set(D2D_USED_LIBRARY "${D2D_SYSTEM_LIBRARY}" "${D2D_RENDER_LIBRARY}" "${D2D_SOUND_LIBRARY}") #message(STATUS "USED SRC: ${D2D_USED_SRC}") diff --git a/src/common/files.c b/src/common/files.c new file mode 100644 index 0000000..7443ca7 --- /dev/null +++ b/src/common/files.c @@ -0,0 +1,95 @@ +#include "files.h" + +#include +#include +#include + +static void FILE_Reader_SetPos (Reader *r, int pos) { + FILE_Reader *rd = (FILE_Reader*)r; + assert(rd != NULL); + assert(rd->fp != NULL); + assert(pos >= 0); + int res = fseek(rd->fp, pos, SEEK_SET); + assert(res == 0); // fail +} + +static void FILE_Reader_Read (Reader *r, void *data, size_t size, size_t n) { + FILE_Reader *rd = (FILE_Reader*)r; + assert(rd != NULL); + assert(rd->fp != NULL); + size_t res = fread(data, size, n, rd->fp); + assert(res == n); // fail +} + +void FILE_AssignReader (FILE_Reader *r, FILE *fp) { + assert(r != NULL); + assert(fp != NULL); + r->base.setpos = FILE_Reader_SetPos; + r->base.read = FILE_Reader_Read; + r->fp = fp; +} + +int FILE_OpenReader (FILE_Reader *r, const char *name) { + assert(r != NULL); + assert(name != NULL); + FILE *fp = fopen(name, "rb"); + if (fp) { + FILE_AssignReader(r, fp); + } + return fp != NULL; +} + +void FILE_CloseReader (FILE_Reader *r) { + assert(r != NULL); + if (r->fp != NULL) { + fclose(r->fp); + } + r->base.setpos = NULL; + r->base.read = NULL; + r->fp = NULL; +} + +static void FILE_Writer_SetPos (Writer *w, int pos) { + FILE_Writer *wr = (FILE_Writer*)w; + assert(wr != NULL); + assert(wr->fp != NULL); + assert(pos >= 0); + int res = fseek(wr->fp, pos, SEEK_SET); + assert(res == 0); // fail +} + +static void FILE_Writer_Write (Writer *w, const void *data, size_t size, size_t n) { + FILE_Writer *wr = (FILE_Writer*)w; + assert(wr != NULL); + assert(wr->fp != NULL); + size_t res = fwrite(data, size, n, wr->fp); + assert(res == n); // fail +} + +void FILE_AssignWriter (FILE_Writer *w, FILE *fp) { + assert(w != NULL); + assert(fp != NULL); + w->base.setpos = FILE_Writer_SetPos; + w->base.write = FILE_Writer_Write; + w->fp = fp; +} + +int FILE_OpenWriter (FILE_Writer *w, const char *name) { + assert(w != NULL); + assert(name != NULL); + FILE *fp = fopen(name, "wb"); + if (fp) { + FILE_AssignWriter(w, fp); + } + return fp != NULL; +} + +void FILE_CloseWriter (FILE_Writer *w) { + assert(w != NULL); + if (w->fp != NULL) { + fclose(w->fp); + } + w->base.setpos = NULL; + w->base.write = NULL; + w->fp = NULL; +} diff --git a/src/common/files.h b/src/common/files.h new file mode 100644 index 0000000..9145902 --- /dev/null +++ b/src/common/files.h @@ -0,0 +1,25 @@ +#ifndef COMMON_FILES_H_INCLUDED +#define COMMON_FILES_H_INCLUDED + +#include +#include "streams.h" + +typedef struct FILE_Reader { + Reader base; + FILE *fp; +} FILE_Reader; + +typedef struct FILE_Writer { + Writer base; + FILE *fp; +} FILE_Writer; + +void FILE_AssignReader (FILE_Reader *r, FILE *fp); +int FILE_OpenReader (FILE_Reader *r, const char *name); +void FILE_CloseReader (FILE_Reader *r); + +void FILE_AssignWriter (FILE_Writer *w, FILE *fp); +int FILE_OpenWriter (FILE_Writer *w, const char *name); +void FILE_CloseWriter (FILE_Writer *w); + +#endif /* COMMON_FILES_H_INCLUDED */ \ No newline at end of file diff --git a/src/common/streams.c b/src/common/streams.c new file mode 100644 index 0000000..615274c --- /dev/null +++ b/src/common/streams.c @@ -0,0 +1,46 @@ +#include "streams.h" + +#include +#include + +#include "misc.h" // endianness conversion + +void stream_read (void *data, size_t size, size_t n, Reader *r) { + r->read(r, data, size, n); +} + +int8_t stream_read8 (Reader *r) { + int8_t x; + r->read(r, &x, 1, 1); + return x; +} + +int16_t stream_read16 (Reader *r) { + int16_t x; + r->read(r, &x, 2, 1); + return short2host(x); +} + +int32_t stream_read32 (Reader *r) { + int32_t x; + r->read(r, &x, 4, 1); + return int2host(x); +} + +void stream_write (const void *data, size_t size, size_t n, Writer *w) { + w->write(w, data, size, n); +} + +void stream_write8 (int8_t x, Writer *w) { + w->write(w, &x, 1, 1); +} + +void stream_write16 (int16_t x, Writer *w) { + int16_t y = short2host(x); + w->write(w, &y, 2, 1); +} + +void stream_write32 (int32_t x, Writer *w) { + int32_t y = int2host(x); + w->write(w, &y, 4, 1); +} diff --git a/src/common/streams.h b/src/common/streams.h new file mode 100644 index 0000000..5013641 --- /dev/null +++ b/src/common/streams.h @@ -0,0 +1,30 @@ +#ifndef COMMON_STREAMS_H_INCLUDED +#define COMMON_STREAMS_H_INCLUDED + +#include +#include + +typedef struct Reader Reader; +typedef struct Writer Writer; + +struct Reader { + void (*setpos)(Reader *r, int pos); + void (*read)(Reader *r, void *data, size_t size, size_t n); +}; + +struct Writer { + void (*setpos)(Writer *w, int pos); + void (*write)(Writer *w, const void *data, size_t size, size_t n); +}; + +void stream_read (void *data, size_t size, size_t n, Reader *f); +int8_t stream_read8 (Reader *f); +int16_t stream_read16 (Reader *f); +int32_t stream_read32 (Reader *f); + +void stream_write (const void *data, size_t size, size_t n, Writer *w); +void stream_write8 (int8_t x, Writer *w); +void stream_write16 (int16_t x, Writer *w); +void stream_write32 (int32_t x, Writer *w); + +#endif /* COMMON_STREAMS_H_INCLUDED */ \ No newline at end of file -- 2.29.2