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 <sfisher@sdf.org>
Reviewed-by: Stephen Fisher <sfisher@sdf.org>
This commit is contained in:
Stephen Fisher 2014-12-22 13:50:10 -07:00
parent 59b4ab53fc
commit 3d62d2c396
5 changed files with 89 additions and 15 deletions

View File

@ -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)

View File

@ -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"

View File

@ -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 \

42
wsutil/popcount.c Normal file
View File

@ -0,0 +1,42 @@
/* popcount.c
*
* popcount() replacement function for systems that don't provide their own.
*
* Wireshark - Network traffic analyzer
* By Gerald Combs <gerald@wireshark.org>
* 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
}

32
wsutil/popcount.h Normal file
View File

@ -0,0 +1,32 @@
/* popcount.h
*
* Wireshark - Network traffic analyzer
* By Gerald Combs <gerald@wireshark.org>
* 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__ */