From 44b27022588dd2c1fe495e305ea1e26187805619 Mon Sep 17 00:00:00 2001 From: Werner Koch Date: Thu, 4 Nov 2010 08:16:57 +0000 Subject: [PATCH] More changes for W32CE with MSC. --- THANKS | 3 +- contrib/ChangeLog | 5 + contrib/conf-w32ce-msc/build.mk | 8 +- src/ChangeLog | 8 ++ src/export.c | 1 + src/memrchr.c | 212 -------------------------------- src/w32-ce.h | 7 +- 7 files changed, 23 insertions(+), 221 deletions(-) delete mode 100644 src/memrchr.c diff --git a/THANKS b/THANKS index 7d112b0..41aebc8 100644 --- a/THANKS +++ b/THANKS @@ -17,12 +17,13 @@ Jose C. Garc Mark Mutz mutz@kde.org Miguel Coca mcoca@gnu.org Noel Torres envite@rolamasao.org +Patrick Spendrin patrick.spendrin@kdab.com Stéphane Corthésy stephane@sente.ch Timo Schulz twoaday@freakmail.de Tommy Reynolds reynolds@redhat.com - Copyright 2001, 2002, 2004 g10 Code GmbH + Copyright 2001, 2002, 2004, 2010 g10 Code GmbH This file is free software; as a special exception the author gives unlimited permission to copy and/or distribute it, with or without diff --git a/contrib/ChangeLog b/contrib/ChangeLog index ccee494..40e528a 100644 --- a/contrib/ChangeLog +++ b/contrib/ChangeLog @@ -1,3 +1,8 @@ +2010-11-04 Werner Koch + + * conf-w32ce-msc/build.mk (copy-built-source): Revert last + change. Does not work with W32CE where MSC defines it in except.h. + 2010-11-03 Werner Koch * conf-w32ce-msc/build.mk (copy-built-source): Create dummy sehmap.h. diff --git a/contrib/conf-w32ce-msc/build.mk b/contrib/conf-w32ce-msc/build.mk index 70cae83..74e7ff7 100755 --- a/contrib/conf-w32ce-msc/build.mk +++ b/contrib/conf-w32ce-msc/build.mk @@ -219,19 +219,13 @@ copy-static-source: cd ../contrib/conf-w32ce-msc ; \ cp -t $(targetsrc)/gpgme/src $(conf_sources) -# We create a dummy sehmap.h which will be included first due to -I. . -# For some reasons sehmap.h is included by MSC for WindowsCE and -# introduces a macro "leave" which conflicts of our use of "leave" for -# a label (leave and enter are pretty common names for pro- and epilog -# code). copy-built-source: @if [ ! -f ./gpgme.h ]; then \ echo "Please build using ./autogen.sh --build-w32ce first"; \ exit 1; \ fi cp -t $(targetsrc)/gpgme/src $(built_sources) - echo '/* Dummy replacement for useless header. */' \ - > $(targetsrc)/gpgme/src/sehmap.h + echo '/* Dummy io.h header. */' > $(targetsrc)/gpgme/src/io.h copy-source: copy-static-source copy-built-source diff --git a/src/ChangeLog b/src/ChangeLog index 53de1f5..f4e0e7d 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,11 @@ +2010-11-04 Werner Koch + + * w32-ce.h [_MSC_VER && W32CE]: Undef leave. + * export.c: Include util.h so that we get the above undef. + + * memrchr.c: Remove. Used to be a replacement function required + by the formerly included assuan code. + 2010-11-03 Werner Koch * debug.c (_gpgme_debug) [W32CE]: Replace locatime by GetLocalTime. diff --git a/src/export.c b/src/export.c index 59463ef..42f5597 100644 --- a/src/export.c +++ b/src/export.c @@ -25,6 +25,7 @@ #include #include "gpgme.h" +#include "util.h" #include "debug.h" #include "context.h" #include "ops.h" diff --git a/src/memrchr.c b/src/memrchr.c deleted file mode 100644 index 16ed6ac..0000000 --- a/src/memrchr.c +++ /dev/null @@ -1,212 +0,0 @@ -/* memrchr -- find the last occurrence of a byte in a memory block - Copyright (C) 1991, 93, 96, 97, 99, 2000 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Based on strlen implementation by Torbjorn Granlund (tege@sics.se), - with help from Dan Sahlin (dan@sics.se) and - commentary by Jim Blandy (jimb@ai.mit.edu); - adaptation to memchr suggested by Dick Karpinski (dick@cca.ucsf.edu), - and implemented by Roland McGrath (roland@ai.mit.edu). - - The GNU C 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. - - The GNU C 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 the GNU C Library; if not, write to the Free - Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307 USA. */ - -#include - -#ifdef HAVE_CONFIG_H -# include -#endif - -#undef __ptr_t -#if defined __cplusplus || (defined __STDC__ && __STDC__) -# define __ptr_t void * -#else /* Not C++ or ANSI C. */ -# define __ptr_t char * -#endif /* C++ or ANSI C. */ - -#if defined _LIBC -# include -# include -#else -# define reg_char char -#endif - -#if defined HAVE_LIMITS_H || defined _LIBC -# include -#endif - -#define LONG_MAX_32_BITS 2147483647 - -#ifndef LONG_MAX -# define LONG_MAX LONG_MAX_32_BITS -#endif - -#ifdef HAVE_SYS_TYPES_H -# include -#endif - -#undef __memrchr -#undef memrchr - -#ifndef weak_alias -# define __memrchr memrchr -#endif - -/* Search no more than N bytes of S for C. */ -__ptr_t -__memrchr (s, c_in, n) - const __ptr_t s; - int c_in; - size_t n; -{ - const unsigned char *char_ptr; - const unsigned long int *longword_ptr; - unsigned long int longword, magic_bits, charmask; - unsigned reg_char c; - - c = (unsigned char) c_in; - - /* Handle the last few characters by reading one character at a time. - Do this until CHAR_PTR is aligned on a longword boundary. */ - for (char_ptr = (const unsigned char *) s + n; - n > 0 && ((unsigned long int) char_ptr - & (sizeof (longword) - 1)) != 0; - --n) - if (*--char_ptr == c) - return (__ptr_t) char_ptr; - - /* All these elucidatory comments refer to 4-byte longwords, - but the theory applies equally well to 8-byte longwords. */ - - longword_ptr = (const unsigned long int *) char_ptr; - - /* Bits 31, 24, 16, and 8 of this number are zero. Call these bits - the "holes." Note that there is a hole just to the left of - each byte, with an extra at the end: - - bits: 01111110 11111110 11111110 11111111 - bytes: AAAAAAAA BBBBBBBB CCCCCCCC DDDDDDDD - - The 1-bits make sure that carries propagate to the next 0-bit. - The 0-bits provide holes for carries to fall into. */ - - if (sizeof (longword) != 4 && sizeof (longword) != 8) - abort (); - -#if LONG_MAX <= LONG_MAX_32_BITS - magic_bits = 0x7efefeff; -#else - magic_bits = ((unsigned long int) 0x7efefefe << 32) | 0xfefefeff; -#endif - - /* Set up a longword, each of whose bytes is C. */ - charmask = c | (c << 8); - charmask |= charmask << 16; -#if LONG_MAX > LONG_MAX_32_BITS - charmask |= charmask << 32; -#endif - - /* Instead of the traditional loop which tests each character, - we will test a longword at a time. The tricky part is testing - if *any of the four* bytes in the longword in question are zero. */ - while (n >= sizeof (longword)) - { - /* We tentatively exit the loop if adding MAGIC_BITS to - LONGWORD fails to change any of the hole bits of LONGWORD. - - 1) Is this safe? Will it catch all the zero bytes? - Suppose there is a byte with all zeros. Any carry bits - propagating from its left will fall into the hole at its - least significant bit and stop. Since there will be no - carry from its most significant bit, the LSB of the - byte to the left will be unchanged, and the zero will be - detected. - - 2) Is this worthwhile? Will it ignore everything except - zero bytes? Suppose every byte of LONGWORD has a bit set - somewhere. There will be a carry into bit 8. If bit 8 - is set, this will carry into bit 16. If bit 8 is clear, - one of bits 9-15 must be set, so there will be a carry - into bit 16. Similarly, there will be a carry into bit - 24. If one of bits 24-30 is set, there will be a carry - into bit 31, so all of the hole bits will be changed. - - The one misfire occurs when bits 24-30 are clear and bit - 31 is set; in this case, the hole at bit 31 is not - changed. If we had access to the processor carry flag, - we could close this loophole by putting the fourth hole - at bit 32! - - So it ignores everything except 128's, when they're aligned - properly. - - 3) But wait! Aren't we looking for C, not zero? - Good point. So what we do is XOR LONGWORD with a longword, - each of whose bytes is C. This turns each byte that is C - into a zero. */ - - longword = *--longword_ptr ^ charmask; - - /* Add MAGIC_BITS to LONGWORD. */ - if ((((longword + magic_bits) - - /* Set those bits that were unchanged by the addition. */ - ^ ~longword) - - /* Look at only the hole bits. If any of the hole bits - are unchanged, most likely one of the bytes was a - zero. */ - & ~magic_bits) != 0) - { - /* Which of the bytes was C? If none of them were, it was - a misfire; continue the search. */ - - const unsigned char *cp = (const unsigned char *) longword_ptr; - -#if LONG_MAX > 2147483647 - if (cp[7] == c) - return (__ptr_t) &cp[7]; - if (cp[6] == c) - return (__ptr_t) &cp[6]; - if (cp[5] == c) - return (__ptr_t) &cp[5]; - if (cp[4] == c) - return (__ptr_t) &cp[4]; -#endif - if (cp[3] == c) - return (__ptr_t) &cp[3]; - if (cp[2] == c) - return (__ptr_t) &cp[2]; - if (cp[1] == c) - return (__ptr_t) &cp[1]; - if (cp[0] == c) - return (__ptr_t) cp; - } - - n -= sizeof (longword); - } - - char_ptr = (const unsigned char *) longword_ptr; - - while (n-- > 0) - { - if (*--char_ptr == c) - return (__ptr_t) char_ptr; - } - - return 0; -} -#ifdef weak_alias -weak_alias (__memrchr, memrchr) -#endif diff --git a/src/w32-ce.h b/src/w32-ce.h index 9be361f..fafaa06 100644 --- a/src/w32-ce.h +++ b/src/w32-ce.h @@ -75,6 +75,11 @@ void *_gpgme_wince_bsearch (const void *key, const void *base, int (*compar) (const void *, const void *)); #define bsearch(a,b,c,d,e) _gpgme_wince_bsearch ((a),(b),(c),(d),(e)) - +/* Remove the redefined __leave keyword. It is defined by MSC for W32 + in excpt.h and not in sehmap.h as for the plain windows + version. */ +#if defined(_MSC_VER) && defined(HAVE_W32CE_SYSTEM) +# undef leave +#endif #endif /* GPGME_W32_CE_H */ -- 2.26.2