diff --git a/CMakeLists.txt b/CMakeLists.txt index b41fb439..e92141d0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1001,6 +1001,7 @@ set(cxx-sources client.hpp clock.hpp command.hpp + compat.hpp condition_variable.hpp config.hpp ctx.hpp diff --git a/Makefile.am b/Makefile.am index 528df3f6..79255a85 100755 --- a/Makefile.am +++ b/Makefile.am @@ -33,6 +33,7 @@ src_libzmq_la_SOURCES = \ src/clock.cpp \ src/clock.hpp \ src/command.hpp \ + src/compat.hpp \ src/condition_variable.hpp \ src/config.hpp \ src/ctx.cpp \ diff --git a/builds/gyp/project.gyp b/builds/gyp/project.gyp index a89366c0..f06100e9 100644 --- a/builds/gyp/project.gyp +++ b/builds/gyp/project.gyp @@ -74,6 +74,7 @@ '../../src/clock.cpp', '../../src/clock.hpp', '../../src/command.hpp', + '../../src/compat.hpp', '../../src/condition_variable.hpp', '../../src/config.hpp', '../../src/ctx.cpp', diff --git a/src/compat.hpp b/src/compat.hpp new file mode 100644 index 00000000..7c7a8927 --- /dev/null +++ b/src/compat.hpp @@ -0,0 +1,73 @@ +/* + Copyright (c) 2020 Contributors as noted in the AUTHORS file + + This file is part of libzmq, the ZeroMQ core engine in C++. + + libzmq is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License (LGPL) as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + As a special exception, the Contributors give you permission to link + this library with independent modules to produce an executable, + regardless of the license terms of these independent modules, and to + copy and distribute the resulting executable under terms of your choice, + provided that you also meet, for each linked independent module, the + terms and conditions of the license of that module. An independent + module is a module which is not derived from or based on this library. + If you modify this library, you must extend this exception to your + version of the library. + + libzmq is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . +*/ + +#ifndef __ZMQ_COMPAT_HPP_INCLUDED__ +#define __ZMQ_COMPAT_HPP_INCLUDED__ + +#include "precompiled.hpp" +#include + +#ifdef ZMQ_HAVE_WINDOWS +#define strcasecmp _stricmp +#define strtok_r strtok_s +#else +#ifdef ZMQ_HAVE_LIBBSD +#include +#elif !defined(ZMQ_HAVE_STRLCPY) +static inline size_t +strlcpy (char *dest_, const char *src_, const size_t dest_size_) +{ + size_t remain = dest_size_; + for (; remain && *src_; --remain, ++src_, ++dest_) { + *dest_ = *src_; + } + return dest_size_ - remain; +} +#endif +template +static inline int strcpy_s (char (&dest_)[size], const char *const src_) +{ + const size_t res = strlcpy (dest_, src_, size); + return res >= size ? ERANGE : 0; +} +#endif + +#ifndef HAVE_STRNLEN +static inline size_t strnlen (const char *s, size_t len) +{ + for (size_t i = 0; i < len; i++) { + if (s[i] == '\0') + return i + 1; + } + + return len; +} +#endif + +#endif diff --git a/src/ipc_address.cpp b/src/ipc_address.cpp index 4325b439..f1f56516 100644 --- a/src/ipc_address.cpp +++ b/src/ipc_address.cpp @@ -28,6 +28,7 @@ */ #include "precompiled.hpp" +#include "compat.hpp" #include "ipc_address.hpp" #if defined ZMQ_HAVE_IPC @@ -36,18 +37,6 @@ #include -#ifndef HAVE_STRNLEN -static size_t strnlen (const char *s, size_t len) -{ - for (size_t i = 0; i < len; i++) { - if (s[i] == '\0') - return i + 1; - } - - return len; -} -#endif - zmq::ipc_address_t::ipc_address_t () { memset (&_address, 0, sizeof _address); diff --git a/src/msg.cpp b/src/msg.cpp index 23148523..2116d1e4 100644 --- a/src/msg.cpp +++ b/src/msg.cpp @@ -28,6 +28,7 @@ */ #include "precompiled.hpp" +#include "compat.hpp" #include "macros.hpp" #include "msg.hpp" diff --git a/src/ws_engine.cpp b/src/ws_engine.cpp index 07e4d1d7..b67dc35e 100644 --- a/src/ws_engine.cpp +++ b/src/ws_engine.cpp @@ -54,6 +54,7 @@ along with this program. If not, see . #include +#include "compat.hpp" #include "tcp.hpp" #include "ws_engine.hpp" #include "session_base.hpp" @@ -71,30 +72,6 @@ along with this program. If not, see . #include "curve_server.hpp" #endif -#ifdef ZMQ_HAVE_WINDOWS -#define strcasecmp _stricmp -#define strtok_r strtok_s -#else -#ifdef ZMQ_HAVE_LIBBSD -#include -#elif !defined(ZMQ_HAVE_STRLCPY) -static size_t strlcpy (char *dest_, const char *src_, const size_t dest_size_) -{ - size_t remain = dest_size_; - for (; remain && *src_; --remain, ++src_, ++dest_) { - *dest_ = *src_; - } - return dest_size_ - remain; -} -#endif -template -static int strcpy_s (char (&dest_)[size], const char *const src_) -{ - const size_t res = strlcpy (dest_, src_, size); - return res >= size ? ERANGE : 0; -} -#endif - // OSX uses a different name for this socket option #ifndef IPV6_ADD_MEMBERSHIP #define IPV6_ADD_MEMBERSHIP IPV6_JOIN_GROUP