diff options
author | Stephen Fisher <sfisher@sdf.org> | 2014-12-22 13:50:10 -0700 |
---|---|---|
committer | Stephen Fisher <sfisher@sdf.org> | 2014-12-23 00:22:23 +0000 |
commit | 3d62d2c396aa016d97f788205978f4fdba2d4d4b (patch) | |
tree | 161f97d511c7449b0caf17ab87edef4b0280a573 /wsutil | |
parent | 59b4ab53fcf08db3daa7461b463ca47e83e55079 (diff) | |
download | wireshark-3d62d2c396aa016d97f788205978f4fdba2d4d4b.tar.gz wireshark-3d62d2c396aa016d97f788205978f4fdba2d4d4b.tar.bz2 wireshark-3d62d2c396aa016d97f788205978f4fdba2d4d4b.zip |
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>
Diffstat (limited to 'wsutil')
-rw-r--r-- | wsutil/Makefile.am | 3 | ||||
-rw-r--r-- | wsutil/popcount.c | 42 | ||||
-rw-r--r-- | wsutil/popcount.h | 32 |
3 files changed, 77 insertions, 0 deletions
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 <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 +} 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 <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__ */ + |