From 4e68a29effbdf72c54f500274c22cf3036124331 Mon Sep 17 00:00:00 2001 From: nihuini Date: Tue, 16 Oct 2018 11:13:52 +0800 Subject: [PATCH] fix build on msvc, second try --- src/net.cpp | 22 +++++++++++++++------- src/paramdict.cpp | 22 +++++++++++++++------- 2 files changed, 30 insertions(+), 14 deletions(-) diff --git a/src/net.cpp b/src/net.cpp index bcc556f89..4e9e211f3 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -228,24 +228,32 @@ int Net::load_param(FILE* fp) return 0; } -static inline int mem_sscanf_pn(const char*& ptr, const char* format, ...) +#if _MSC_VER +static inline int mem_sscanf_with_n(int* _internal_nconsumed_ptr, const char*& ptr, const char* format, ...) { va_list args; va_start(args, format); - int nconsumed = 0; - int nscan = sscanf(ptr, format, args, &nconsumed); - ptr += nconsumed; + int _n = vsscanf(ptr, format, args); va_end(args); - return nconsumed > 0 ? nscan : 0; -} + ptr += *_internal_nconsumed_ptr; -#define mem_sscanf(ptr, format, ...) mem_sscanf_pn(ptr, format "%n", __VA_ARGS__) + return *_internal_nconsumed_ptr > 0 ? _n : 0; +} +#define mem_sscanf(ptr, format, ...) mem_sscanf_with_n(&_internal_nconsumed, ptr, format "%n", __VA_ARGS__, &_internal_nconsumed) +#else +// return value from macro requires gcc extension https://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html +#define mem_sscanf(ptr, format, ...) ({int _b=0; int _n = sscanf(ptr, format "%n", __VA_ARGS__, &_b); ptr+=_b;_b>0?_n:0;}) +#endif // _MSC_VER int Net::load_param_mem(const char* _mem) { +#if _MSC_VER + int _internal_nconsumed; +#endif + int magic = 0; const char* mem = _mem; mem_sscanf(mem, "%d", &magic); diff --git a/src/paramdict.cpp b/src/paramdict.cpp index 63dd8a6cd..12035d801 100644 --- a/src/paramdict.cpp +++ b/src/paramdict.cpp @@ -174,24 +174,32 @@ int ParamDict::load_param(FILE* fp) return 0; } -static inline int mem_sscanf_pn(const char*& ptr, const char* format, ...) +#if _MSC_VER +static inline int mem_sscanf_with_n(int* _internal_nconsumed_ptr, const char*& ptr, const char* format, ...) { va_list args; va_start(args, format); - int nconsumed = 0; - int nscan = sscanf(ptr, format, args, &nconsumed); - ptr += nconsumed; + int _n = vsscanf(ptr, format, args); va_end(args); - return nconsumed > 0 ? nscan : 0; -} + ptr += *_internal_nconsumed_ptr; -#define mem_sscanf(ptr, format, ...) mem_sscanf_pn(ptr, format "%n", __VA_ARGS__) + return *_internal_nconsumed_ptr > 0 ? _n : 0; +} +#define mem_sscanf(ptr, format, ...) mem_sscanf_with_n(&_internal_nconsumed, ptr, format "%n", __VA_ARGS__, &_internal_nconsumed) +#else +// return value from macro requires gcc extension https://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html +#define mem_sscanf(ptr, format, ...) ({int _b=0; int _n = sscanf(ptr, format "%n", __VA_ARGS__, &_b); ptr+=_b;_b>0?_n:0;}) +#endif // _MSC_VER int ParamDict::load_param_mem(const char*& mem) { +#if _MSC_VER + int _internal_nconsumed; +#endif + clear(); // 0=100 1=1.250000 -23303=5,0.1,0.2,0.4,0.8,1.0