diff --git a/storm/option/Option.cpp b/storm/option/Option.cpp new file mode 100644 index 0000000..0bd2927 --- /dev/null +++ b/storm/option/Option.cpp @@ -0,0 +1,108 @@ +#include "storm/option/Option.hpp" +#include "storm/option/Options.hpp" +#include "storm/Error.hpp" + +int32_t StormSetOption(int32_t optname, const void* optval, uint32_t optlen) { + SErrSetLastError(ERROR_INVALID_PARAMETER); + if (!optval) { + return 0; + } + + uint32_t val; + + switch (optname) { + case 1: + if (optlen != 4) { + return 0; + } + g_opt.serrleaksilentwarning = *static_cast(optval); + SErrSetLastError(0); + return 1; + case 2: + val = *static_cast(optval); + if (optlen != 4 || !val || (val ^ (val - 1)) != 2 * val - 1) { + return 0; + } + g_opt.wavechunksize = val; + SErrSetLastError(0); + return 1; + case 3: + if (optlen != 4) { + return 0; + } + g_opt.smemleaksilentwarning = *static_cast(optval); + SErrSetLastError(0); + return 1; + case 4: + if (optlen != 4) { + return 0; + } + g_opt.opt0C = *static_cast(optval); + SErrSetLastError(0); + return 1; + case 5: + if (optlen != 4) { + return 0; + } + g_opt.opt10 = *static_cast(optval); + SErrSetLastError(0); + return 1; + case 6: + if (optlen != 8) { + return 0; + } + s_alloccount = static_cast(optval)[0]; + s_freecount = static_cast(optval)[1]; + SErrSetLastError(0); + return 1; + case 7: + if (optlen != 4) { + return 0; + } + g_opt.opt14 = *static_cast(optval); + SErrSetLastError(0); + return 1; + case 9: + if (optlen != 4) { + return 0; + } + g_opt.opt18 = *static_cast(optval) != 0; + SErrSetLastError(0); + return 1; + case 10: + if (optlen != 4) { + return 0; + } + g_opt.opt1C = *static_cast(optval) != 0; + SErrSetLastError(0); + return 1; + case 11: + if (optlen != 4) { + return 0; + } + g_opt.sregunicode = *static_cast(optval) != 0; + SErrSetLastError(0); + return 1; + case 12: + if (optlen != 4) { + return 0; + } + g_opt.opt24 = *static_cast(optval) != 0; + SErrSetLastError(0); + return 1; + case 13: + if (optlen != 4) { + return 0; + } + g_opt.opt28 = *static_cast(optval) != 0; + SErrSetLastError(0); + return 1; + default: + return 0; + } +} + +int32_t StormGetOption(int32_t optname, void* optval, uint32_t* optlen) { + // TODO + return 0; +} diff --git a/storm/option/Option.hpp b/storm/option/Option.hpp new file mode 100644 index 0000000..8f80873 --- /dev/null +++ b/storm/option/Option.hpp @@ -0,0 +1,10 @@ +#ifndef STORM_OPTION_OPTION_HPP +#define STORM_OPTION_OPTION_HPP + +#include + +int32_t StormSetOption(int32_t optname, const void* optval, uint32_t optlen); + +int32_t StormGetOption(int32_t optname, void* optval, uint32_t* optlen); + +#endif diff --git a/storm/option/Options.cpp b/storm/option/Options.cpp new file mode 100644 index 0000000..9fea6d9 --- /dev/null +++ b/storm/option/Options.cpp @@ -0,0 +1,6 @@ +#include "storm/option/Options.hpp" + +STORMOPTIONS g_opt; + +uint32_t s_alloccount; +uint32_t s_freecount; diff --git a/storm/option/Options.hpp b/storm/option/Options.hpp new file mode 100644 index 0000000..32325c2 --- /dev/null +++ b/storm/option/Options.hpp @@ -0,0 +1,25 @@ +#ifndef STORM_OPTION_OPTIONS_HPP +#define STORM_OPTION_OPTIONS_HPP + +#include + +struct STORMOPTIONS { + int32_t smemleaksilentwarning; + int32_t serrleaksilentwarning; + uint32_t wavechunksize; + int32_t opt0C; + int32_t opt10; + int32_t opt14; + int32_t opt18; + int32_t opt1C; + int32_t sregunicode; + int32_t opt24; + int32_t opt28; +}; + +extern STORMOPTIONS g_opt; + +extern uint32_t s_alloccount; +extern uint32_t s_freecount; + +#endif