| @@ -228,24 +228,32 @@ int Net::load_param(FILE* fp) | |||||
| return 0; | 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_list args; | ||||
| va_start(args, format); | 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); | 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) | int Net::load_param_mem(const char* _mem) | ||||
| { | { | ||||
| #if _MSC_VER | |||||
| int _internal_nconsumed; | |||||
| #endif | |||||
| int magic = 0; | int magic = 0; | ||||
| const char* mem = _mem; | const char* mem = _mem; | ||||
| mem_sscanf(mem, "%d", &magic); | mem_sscanf(mem, "%d", &magic); | ||||
| @@ -174,24 +174,32 @@ int ParamDict::load_param(FILE* fp) | |||||
| return 0; | 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_list args; | ||||
| va_start(args, format); | 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); | 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) | int ParamDict::load_param_mem(const char*& mem) | ||||
| { | { | ||||
| #if _MSC_VER | |||||
| int _internal_nconsumed; | |||||
| #endif | |||||
| clear(); | clear(); | ||||
| // 0=100 1=1.250000 -23303=5,0.1,0.2,0.4,0.8,1.0 | // 0=100 1=1.250000 -23303=5,0.1,0.2,0.4,0.8,1.0 | ||||