From c3de6ef38fb5778773be70da6e99017c4d52ddfc Mon Sep 17 00:00:00 2001 From: Hans Leidekker Date: Tue, 19 Oct 2004 23:53:26 +0000 Subject: [PATCH] Add ffs() to porting library, needed by MinGW. --- configure | 2 ++ configure.ac | 1 + dlls/itss/chm_lib.c | 1 + include/config.h.in | 3 ++ include/wine/port.h | 5 ++++ libs/port/Makefile.in | 1 + libs/port/ffs.c | 64 +++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 77 insertions(+) create mode 100644 libs/port/ffs.c diff --git a/configure b/configure index c8648d4b255..d553b1a026e 100755 --- a/configure +++ b/configure @@ -16146,6 +16146,7 @@ fi + for ac_func in \ @@ -16161,6 +16162,7 @@ for ac_func in \ chsize \ clone \ epoll_create \ + ffs \ finite \ fork \ fpclass \ diff --git a/configure.ac b/configure.ac index 5e958101d82..7028730eab9 100644 --- a/configure.ac +++ b/configure.ac @@ -1076,6 +1076,7 @@ AC_CHECK_FUNCS(\ chsize \ clone \ epoll_create \ + ffs \ finite \ fork \ fpclass \ diff --git a/dlls/itss/chm_lib.c b/dlls/itss/chm_lib.c index e6526a8412b..7020153ac39 100644 --- a/dlls/itss/chm_lib.c +++ b/dlls/itss/chm_lib.c @@ -46,6 +46,7 @@ ***************************************************************************/ #include "config.h" +#include "wine/port.h" #include #include diff --git a/include/config.h.in b/include/config.h.in index 2ac53c42bb2..a1dbecad701 100644 --- a/include/config.h.in +++ b/include/config.h.in @@ -83,6 +83,9 @@ /* Define to 1 if you have the `epoll_create' function. */ #undef HAVE_EPOLL_CREATE +/* Define to 1 if you have the `ffs' function. */ +#undef HAVE_FFS + /* Define to 1 if you have the `finite' function. */ #undef HAVE_FINITE diff --git a/include/wine/port.h b/include/wine/port.h index 0cf862889e2..32f2ec2a0b1 100644 --- a/include/wine/port.h +++ b/include/wine/port.h @@ -282,6 +282,10 @@ extern int getopt_long_only (int ___argc, char *const *___argv, const struct option *__longopts, int *__longind); #endif /* HAVE_GETOPT_LONG */ +#ifndef HAVE_FFS +int ffs( int x ); +#endif + #ifndef HAVE_FUTIMES struct timeval; int futimes(int fd, const struct timeval tv[2]); @@ -431,6 +435,7 @@ extern long interlocked_xchg_add( long *dest, long incr ); #define __WINE_NOT_PORTABLE(func) func##_is_not_portable func##_is_not_portable +#define ffs __WINE_NOT_PORTABLE(ffs) #define fstatvfs __WINE_NOT_PORTABLE(fstatvfs) #define futimes __WINE_NOT_PORTABLE(futimes) #define getopt_long __WINE_NOT_PORTABLE(getopt_long) diff --git a/libs/port/Makefile.in b/libs/port/Makefile.in index 388da078922..b61e7c73b4a 100644 --- a/libs/port/Makefile.in +++ b/libs/port/Makefile.in @@ -7,6 +7,7 @@ VPATH = @srcdir@ MODULE = libwine_port.a C_SRCS = \ + ffs.c \ fstatvfs.c \ futimes.c \ getopt.c \ diff --git a/libs/port/ffs.c b/libs/port/ffs.c new file mode 100644 index 00000000000..556e68c2ee0 --- /dev/null +++ b/libs/port/ffs.c @@ -0,0 +1,64 @@ +/* + * ffs function + * + * Copyright 2004 Hans Leidekker + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "config.h" +#include "wine/port.h" + +#ifndef HAVE_FFS +int ffs( int x ) +{ + unsigned int y = (unsigned int)x; + + if (y & 0x00000001) return 1; + if (y & 0x00000002) return 2; + if (y & 0x00000004) return 3; + if (y & 0x00000008) return 4; + if (y & 0x00000010) return 5; + if (y & 0x00000020) return 6; + if (y & 0x00000040) return 7; + if (y & 0x00000080) return 8; + if (y & 0x00000100) return 9; + if (y & 0x00000200) return 10; + if (y & 0x00000400) return 11; + if (y & 0x00000800) return 12; + if (y & 0x00001000) return 13; + if (y & 0x00002000) return 14; + if (y & 0x00004000) return 15; + if (y & 0x00008000) return 16; + if (y & 0x00010000) return 17; + if (y & 0x00020000) return 18; + if (y & 0x00040000) return 19; + if (y & 0x00080000) return 20; + if (y & 0x00100000) return 21; + if (y & 0x00200000) return 22; + if (y & 0x00400000) return 23; + if (y & 0x00800000) return 24; + if (y & 0x01000000) return 25; + if (y & 0x02000000) return 26; + if (y & 0x04000000) return 27; + if (y & 0x08000000) return 28; + if (y & 0x10000000) return 29; + if (y & 0x20000000) return 30; + if (y & 0x40000000) return 31; + if (y & 0x80000000) return 32; + + return 0; +} +#endif /* HAVE_FFS */