From 3d62d2c396aa016d97f788205978f4fdba2d4d4b Mon Sep 17 00:00:00 2001 From: Stephen Fisher Date: Mon, 22 Dec 2014 13:50:10 -0700 Subject: [PATCH] Move popcount() to an optionally built part of wsutil for systems that provide their own popcount(). Change-Id: Ic26f3b50cf0bd2b4af0d42e9c27488ebbac1ab33 Reviewed-on: https://code.wireshark.org/review/5998 Petri-Dish: Stephen Fisher Reviewed-by: Stephen Fisher --- configure.ac | 8 +++++++ epan/dissectors/packet-x11.c | 19 ++++------------ wsutil/Makefile.am | 3 +++ wsutil/popcount.c | 42 ++++++++++++++++++++++++++++++++++++ wsutil/popcount.h | 32 +++++++++++++++++++++++++++ 5 files changed, 89 insertions(+), 15 deletions(-) create mode 100644 wsutil/popcount.c create mode 100644 wsutil/popcount.h diff --git a/configure.ac b/configure.ac index 8fa43242f2..86fb03f8f4 100644 --- a/configure.ac +++ b/configure.ac @@ -2750,6 +2750,14 @@ AC_CHECK_FUNC(strptime, STRPTIME_LO="strptime.lo") AC_SUBST(STRPTIME_LO) +AC_CHECK_FUNC(popcount, + [ + POPCOUNT_LO="" + AC_DEFINE(HAVE_POPCOUNT, 1, [Define if you have the popcount function.]) + ], + POPCOUNT_LO="popcount.lo") +AC_SUBST(POPCOUNT_LO) + AC_CHECK_FUNCS(getprotobynumber gethostbyname2) AC_CHECK_FUNCS(issetugid) AC_CHECK_FUNCS(mmap mprotect sysconf) diff --git a/epan/dissectors/packet-x11.c b/epan/dissectors/packet-x11.c index b4950ea2cf..6edcde7d21 100644 --- a/epan/dissectors/packet-x11.c +++ b/epan/dissectors/packet-x11.c @@ -61,6 +61,10 @@ #include "packet-x11-keysymdef.h" #include "packet-x11.h" +#ifndef HAVE_POPCOUNT +# include "wsutil/popcount.h" +#endif + void proto_register_x11(void); void proto_reg_handoff_x11(void); @@ -3203,21 +3207,6 @@ static void set_handler(const char *name, void (*func)(tvbuff_t *tvb, packet_inf g_hash_table_insert(reply_table, (gpointer)name, (gpointer)reply_info); } -static int popcount(unsigned int mask) -{ -#if (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) - /* GCC 3.4 or newer */ - return __builtin_popcount(mask); -#else - /* HACKMEM 169 */ - unsigned long y; - - y = (mask >> 1) &033333333333; - y = mask - y - ((y >>1) & 033333333333); - return (((y + (y >> 3)) & 030707070707) % 077); -#endif -} - #include "x11-extension-errors.h" #include "x11-extension-implementation.h" diff --git a/wsutil/Makefile.am b/wsutil/Makefile.am index 8401e45b08..8e160fd969 100644 --- a/wsutil/Makefile.am +++ b/wsutil/Makefile.am @@ -36,6 +36,7 @@ wsutil_optional_objects = \ @INET_ATON_LO@ \ @INET_NTOP_LO@ \ @INET_PTON_LO@ \ + @POPCOUNT_LO@ \ @STRPTIME_LO@ if SSE42_SUPPORTED @@ -79,6 +80,8 @@ EXTRA_libwsutil_la_SOURCES= \ inet_ntop.c \ inet_pton.c \ inet_v6defs.h \ + popcount.c \ + popcount.h \ strptime.c \ strptime.h \ wsgetopt.c \ diff --git a/wsutil/popcount.c b/wsutil/popcount.c new file mode 100644 index 0000000000..04a0ade032 --- /dev/null +++ b/wsutil/popcount.c @@ -0,0 +1,42 @@ +/* popcount.c + * + * popcount() replacement function for systems that don't provide their own. + * + * Wireshark - Network traffic analyzer + * By Gerald Combs + * Copyright 1998 Gerald Combs + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "config.h" + +#include "wsutil/popcount.h" + +int +popcount(unsigned int mask) +{ +#if (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) + /* GCC 3.4 or newer */ + return __builtin_popcount(mask); +#else + /* HACKMEM 169 */ + unsigned long y; + + y = (mask >> 1) &033333333333; + y = mask - y - ((y >>1) & 033333333333); + return (((y + (y >> 3)) & 030707070707) % 077); +#endif +} diff --git a/wsutil/popcount.h b/wsutil/popcount.h new file mode 100644 index 0000000000..b58708f629 --- /dev/null +++ b/wsutil/popcount.h @@ -0,0 +1,32 @@ +/* popcount.h + * + * Wireshark - Network traffic analyzer + * By Gerald Combs + * Copyright 1998 Gerald Combs + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#ifndef __POPCOUNT_H__ +#define __POPCOUNT_H__ + +#include "config.h" + +#include "ws_symbol_export.h" + +WS_DLL_PUBLIC int popcount(unsigned int mask); + +#endif /* __POPCOUNT_H__ */ +