File satsolver-mingw.diff of Package mingw64-libsatsolver

--- applayer/CMakeLists.txt
+++ applayer/CMakeLists.txt
@@ -12,7 +12,7 @@
 SET(libappsatsolver_HEADERS job.h applayer.h covenant.h decision.h dependency.h
       kinds.h problem.h relation.h solution.h step.h request.h ruleinfo.h xrepokey.h xsolvable.h)
 
-SET( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC -Wall -Werror" )
+SET( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall" )
 
 INSTALL(  FILES ${libappsatsolver_HEADERS} DESTINATION "${CMAKE_INSTALL_PREFIX}/include/satsolver" )
 INSTALL(TARGETS appsatsolver LIBRARY DESTINATION ${LIB_INSTALL_DIR} ARCHIVE DESTINATION ${LIB_INSTALL_DIR})
--- CMakeLists.txt
+++ CMakeLists.txt
@@ -131,15 +126,14 @@
 
 MESSAGE(STATUS "Looking modules in ${CMAKE_MODULE_PATH}")
 
-set ( CMAKE_C_FLAGS     "${CMAKE_C_FLAGS} -Werror -Wall" )
+set ( CMAKE_C_FLAGS     "${CMAKE_C_FLAGS} -Wall" )
 set ( CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS} -g -O3" )
 set ( CMAKE_C_FLAGS_DEBUG     "${CMAKE_C_FLAGS} -g3 -O0" )
 
 ADD_SUBDIRECTORY(src)
 ADD_SUBDIRECTORY(ext)
 ADD_SUBDIRECTORY(tools)
 ADD_SUBDIRECTORY(applayer)
-ADD_SUBDIRECTORY(examples)
 ADD_SUBDIRECTORY(doc)
 
 FIND_PACKAGE(SWIG)
--- ext/CMakeLists.txt
+++ ext/CMakeLists.txt
@@ -12,7 +12,5 @@
     repo_susetags.h repo_updateinfoxml.h repo_write.h repo_zyppdb.h
     tools_util.h repo_deb.h)
 
-SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
-
 INSTALL(FILES ${libsatsolverext_HEADERS} DESTINATION "${CMAKE_INSTALL_PREFIX}/include/satsolver")
 INSTALL(TARGETS satsolverext LIBRARY DESTINATION ${LIB_INSTALL_DIR} ARCHIVE DESTINATION ${LIB_INSTALL_DIR})
--- src/CMakeLists.txt
+++ src/CMakeLists.txt
@@ -15,7 +15,5 @@
     strpool.h dirpool.h knownid.h transaction.h rules.h problems.h
     chksum.h md5.h sha1.h sha2.h ${CMAKE_BINARY_DIR}/src/satversion.h)
 
-SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
-
 INSTALL(FILES ${libsatsolver_HEADERS} DESTINATION "${CMAKE_INSTALL_PREFIX}/include/satsolver")
 INSTALL(TARGETS satsolver LIBRARY DESTINATION ${LIB_INSTALL_DIR} ARCHIVE DESTINATION ${LIB_INSTALL_DIR})
--- src/poolvendor.c
+++ src/poolvendor.c
@@ -9,18 +9,389 @@
 #include <stdlib.h>
 #include <string.h>
 
-/* we need FNM_CASEFOLD */
-#ifndef _GNU_SOURCE
-#define _GNU_SOURCE
-#endif
-
-#include <fnmatch.h>
 
 #include "pool.h"
 #include "poolid.h"
 #include "poolvendor.h"
 #include "util.h"
 
+/* Copyright (C) 1991, 1992, 1993 Free Software Foundation, Inc.
+ *
+ * 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 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.
+ */
+
+/*
+ * Modified by the GTK+ Team and others 1997-2000.  See the AUTHORS
+ * file for a list of people on the GTK+ Team.  See the ChangeLog
+ * files for a list of changes.  These files are distributed with
+ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. 
+ */
+
+/*
+ * Stripped down, converted to UTF-8 and test cases added
+ *
+ *                    Owen Taylor, 13 December 2002;
+ */
+
+/*
+ * UTF-8 and GLib stuff removed for use in other code on Windows only
+ * using system codepage filenames, i.e. multi-byte strings.
+ *
+ *                    Tor Lillqvist 2009-12-01
+ */
+
+#include <stdlib.h>
+#include <wchar.h>
+#include <mbstring.h>
+
+#define IS_DIR_SEPARATOR(c) ((c)=='/' || (c)=='\\')
+
+static wchar_t
+get_char (const char **str)
+{
+  wchar_t c;
+  int nbytes;
+
+  nbytes = mbtowc (&c, *str, MB_CUR_MAX);
+
+  if (nbytes > 0)
+    *str += nbytes;
+  else
+    {
+      /* Just skip ahead a byte at a time on errors... */
+      (*str)++;
+      c = 0;
+    }
+
+  c = towlower (c);
+
+  return c;
+}
+
+static const char *
+strdirsep (const char *p)
+{
+  const char *slash = (const char *) _mbschr ((const unsigned char *) p, '/');
+  const char *backslash = (const char *) _mbschr ((const unsigned char *) p, '\\');
+
+  if (slash == NULL ||
+      (backslash != NULL && backslash < slash))
+    return backslash;
+
+  return slash;
+}
+
+/* Match STRING against the filename pattern PATTERN, returning zero if
+   it matches, nonzero if not.  */
+
+/* Match STRING against the filename pattern PATTERN, returning zero if
+ *  it matches, nonzero if not.
+ *
+ * This is special-cased as if this combinations of flags:
+ *
+ *   FNM_FILE_NAME   - always set
+ *   FNM_LEADING_DIR - never set
+ *   FNM_CASEFOLD    - always set as this is for Windows
+ */
+
+#define FNM_CASEFOLD 0
+
+static int
+fnmatch_intern (const char *pattern,
+		const char *string,
+		int         component_start,
+		int         no_leading_period)
+{
+  const char *p = pattern, *n = string;
+  
+  while (*p)
+    {
+      const char *last_n = n;
+      
+      wchar_t c = get_char (&p);
+      wchar_t nc = get_char (&n);
+      
+      switch (c)
+	{
+   	case '?':
+	  if (nc == '\0')
+	    return 0;
+	  else if (IS_DIR_SEPARATOR (nc))
+	    return 0;
+	  else if (nc == '.' && component_start && no_leading_period)
+	    return 0;
+	  break;
+	case '*':
+	  if (nc == '.' && component_start && no_leading_period)
+	    return 0;
+
+	  {
+	    const char *last_p = p;
+
+	    for (last_p = p, c = get_char (&p);
+		 c == '?' || c == '*';
+		 last_p = p, c = get_char (&p))
+	      {
+		if (c == '?')
+		  {
+		    if (nc == '\0')
+		      return 0;
+		    else if (IS_DIR_SEPARATOR(nc))
+		      return 0;
+		    else
+		      {
+			last_n = n; nc = get_char (&n);
+		      }
+		  }
+	      }
+
+	    /* If the pattern ends with wildcards, we have a
+	     * guaranteed match unless there is a dir separator
+	     * in the remainder of the string.
+	     */
+	    if (c == '\0')
+	      {
+		if (strdirsep (last_n) != NULL)
+		  return 0;
+		else
+		  return 1;
+	      }
+
+	    for (p = last_p; nc != '\0';)
+	      {
+		if ((c == '[' || nc == c) &&
+		    fnmatch_intern (p, last_n, component_start, no_leading_period))
+		  return 1;
+		
+		component_start = IS_DIR_SEPARATOR (nc);
+		last_n = n;
+		nc = get_char (&n);
+	      }
+		  
+	    return 0;
+	  }
+
+	case '[':
+	  {
+	    /* Nonzero if the sense of the character class is inverted.  */
+	    int not;
+
+	    if (nc == '\0' || IS_DIR_SEPARATOR (nc))
+	      return 0;
+
+	    if (nc == '.' && component_start && no_leading_period)
+	      return 0;
+
+	    not = (*p == '!' || *p == '^');
+	    if (not)
+	      ++p;
+
+	    c = get_char (&p);
+	    for (;;)
+	      {
+		register wchar_t cstart = c, cend = c;
+		if (c == '\0')
+		  /* [ (unterminated) loses.  */
+		  return 0;
+
+		c = get_char (&p);
+		
+		if (c == '-' && *p != ']')
+		  {
+		    cend = get_char (&p);
+		    if (cend == '\0')
+		      return 0;
+
+		    c = get_char (&p);
+		  }
+
+		if (nc >= cstart && nc <= cend)
+		  goto matched;
+
+		if (c == ']')
+		  break;
+	      }
+	    if (!not)
+	      return 0;
+	    break;
+
+	  matched:;
+	    /* Skip the rest of the [...] that already matched.  */
+	    /* XXX 1003.2d11 is unclear if was_escaped is right.  */
+	    while (c != ']')
+	      {
+		if (c == '\0')
+		  /* [... (unterminated) loses.  */
+		  return 0;
+
+		c = get_char (&p);
+	      }
+	    if (not)
+	      return 0;
+	  }
+	  break;
+
+	case '/':
+	case '\\':
+	  if (!IS_DIR_SEPARATOR (nc))
+	    return 0;
+	  break;
+
+	default:
+	  if (c != nc)
+	    return 0;
+	}
+
+      component_start = IS_DIR_SEPARATOR (nc);
+    }
+
+  if (*n == '\0')
+    return 1;
+
+  return 0;
+}
+
+static int
+fnmatch (const char *pattern,
+	      const char *string,
+	      int   no_leading_period)
+{
+  return fnmatch_intern (pattern, string, 1, no_leading_period);
+}
+
+#ifdef FNMATCH_TEST_CASES
+
+#include <stdio.h>
+
+#define TEST(pat, str, no_leading_period, result) \
+  do { \
+    int rc = fnmatch ((pat), (str), (no_leading_period)); \
+    if (rc != result) \
+      fprintf (stderr, "Wrong result from fnmatch (\"%s\", \"%s\", %d): %d, should be %d\n", \
+	       (pat), (str), (no_leading_period), rc, result); \
+  } while (0)
+
+int main (int argc, char **argv)
+{
+  TEST ("[a-]", "-", 1, 1);
+  
+  TEST ("a", "a", 1, 1);
+  TEST ("a", "b", 1, 0);
+
+  TEST ("a", "A", 1, 1);
+  TEST ("A", "a", 1, 1);
+
+  /* Test what ? matches */
+  TEST ("?", "a", 1, 1);
+  TEST ("?", ".", 1, 0);
+  TEST ("a?", "a.", 1, 1);
+  TEST ("a/?", "a/b", 1, 1);
+  TEST ("a\\?", "a\\b", 1, 1);
+  TEST ("a/?", "a\\b", 1, 1);
+  TEST ("a\\?", "a/b", 1, 1);
+  TEST ("a/?", "a/.", 1, 0);
+  TEST ("a\\?", "a\\.", 1, 0);
+  TEST ("a\\?", "a/.", 1, 0);
+  TEST ("a/?", "a\\.", 1, 0);
+  TEST ("?", "/", 1, 0);
+  TEST ("?", "\\", 1, 0);
+
+  /* Test what * matches */
+  TEST ("*", "a", 1, 1);
+  TEST ("*", ".", 1, 0);
+  TEST ("a*", "a.", 1, 1);
+  TEST ("a/*", "a/b", 1, 1);
+  TEST ("a\\*", "a\\b", 1, 1);
+  TEST ("a\\*", "a/b", 1, 1);
+  TEST ("a/*", "a\\b", 1, 1);
+  TEST ("a/*", "a/.", 1, 0);
+  TEST ("a\\*", "a\\.", 1, 0);
+  TEST ("a\\*", "a/.", 1, 0);
+  TEST ("a/*", "a\\.", 1, 0);
+  TEST ("*", "/", 1, 0);
+  TEST ("*", "\\", 1, 0);
+
+  /* Range tests */
+  TEST ("[ab]", "a", 1, 1);
+  TEST ("[AB]", "a", 1, 1);
+  TEST ("[ab]", "A", 1, 1);
+  TEST ("[ab]", "c", 1, 0);
+  TEST ("[^ab]", "a", 1, 0);
+  TEST ("[^AB]", "a", 1, 0);
+  TEST ("[^ab]", "A", 1, 0);
+  TEST ("[!ab]", "a", 1, 0);
+  TEST ("[^ab]", "c", 1, 1);
+  TEST ("[!ab]", "c", 1, 1);
+  TEST ("[a-c]", "b", 1, 1);
+  TEST ("[a-c]", "B", 1, 1);
+  TEST ("[A-C]", "b", 1, 1);
+  TEST ("[a-c]", "d", 1, 0);
+  TEST ("[a-]", "-", 1, 1);
+  TEST ("[]]", "]", 1, 1);
+  TEST ("[^]]", "a", 1, 1);
+  TEST ("[!]]", "a", 1, 1);
+
+  /* Various unclosed ranges */
+  TEST ("[ab", "a", 1, 0);
+  TEST ("[a-", "a", 1, 0);
+  TEST ("[ab", "c", 1, 0);
+  TEST ("[a-", "c", 1, 0);
+  TEST ("[^]", "a", 1, 0);
+
+  /* Ranges and special no-wildcard matches */
+  TEST ("[.]", ".", 1, 0);
+  TEST ("a[.]", "a.", 1, 1);
+  TEST ("a/[.]", "a/.", 1, 0);
+  TEST ("a\\[.]", "a\\.", 1, 0);
+  TEST ("a/[.]", "a\\.", 1, 0);
+  TEST ("[/]", "/", 1, 0);
+  TEST ("[/]", "\\", 1, 0);
+  TEST ("[^/]", "a", 1, 1);
+  
+  /* Basic tests of * (and combinations of * and ?) */
+  TEST ("a*b", "ab", 1, 1);
+  TEST ("a*B", "Ab", 1, 1);
+  TEST ("A*b", "aB", 1, 1);
+  TEST ("a*b", "axb", 1, 1);
+  TEST ("a*b", "axxb", 1, 1);
+  TEST ("a*b", "axXB", 1, 1);
+  TEST ("a**b", "ab", 1, 1);
+  TEST ("a**b", "axb", 1, 1);
+  TEST ("a**b", "axxb", 1, 1);
+  TEST ("a*?*b", "ab", 1, 0);
+  TEST ("a*?*b", "axb", 1, 1);
+  TEST ("a*?*b", "axxb", 1, 1);
+
+  /* Test of  *[range] */
+  TEST ("a*[cd]", "ac", 1, 1);
+  TEST ("a*[cd]", "axc", 1, 1);
+  TEST ("a*[cd]", "axx", 1, 0);
+
+  TEST ("a/[.]", "a/.", 1, 0);
+  TEST ("a\\[.]", "a\\.", 1, 0);
+  TEST ("a\\[.]", "a/.", 1, 0);
+  TEST ("a/[.]", "a\\.", 1, 0);
+  TEST ("a*[.]", "a/.", 1, 0);
+  TEST ("a*[.]", "a\\.", 1, 0);
+
+  return 0;
+}
+
+#endif /* FNMATCH_TEST_CASES */
+
 const char *vendors[] = {
   "!openSUSE Build Service*",
   "SUSE*",
--- src/repo.c
+++ src/repo.c
@@ -9,9 +9,7 @@
  * 
  */
 
-#define _GNU_SOURCE
 #include <string.h>
-#include <fnmatch.h>
 
 #include <stdio.h>
 #include <stdlib.h>
--- src/repodata.c
+++ src/repodata.c
@@ -9,9 +9,7 @@
  * different sets of keys and different sets of solvables
  */
 
-#define _GNU_SOURCE
 #include <string.h>
-#include <fnmatch.h>
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -34,6 +34,413 @@
 #include "repopack.h"
 #include "repopage.h"
 
+/* Copyright (C) 1991, 1992, 1993 Free Software Foundation, Inc.
+ *
+ * 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 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.
+ */
+
+/*
+ * Modified by the GTK+ Team and others 1997-2000.  See the AUTHORS
+ * file for a list of people on the GTK+ Team.  See the ChangeLog
+ * files for a list of changes.  These files are distributed with
+ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. 
+ */
+
+/*
+ * Stripped down, converted to UTF-8 and test cases added
+ *
+ *                    Owen Taylor, 13 December 2002;
+ */
+
+/*
+ * UTF-8 and GLib stuff removed for use in other code on Windows only
+ * using system codepage filenames, i.e. multi-byte strings.
+ *
+ *                    Tor Lillqvist 2009-12-01
+ */
+
+#include <stdlib.h>
+#include <wchar.h>
+#include <mbstring.h>
+
+#define IS_DIR_SEPARATOR(c) ((c)=='/' || (c)=='\\')
+
+static wchar_t
+get_char (const char **str)
+{
+  wchar_t c;
+  int nbytes;
+
+  nbytes = mbtowc (&c, *str, MB_CUR_MAX);
+
+  if (nbytes > 0)
+    *str += nbytes;
+  else
+    {
+      /* Just skip ahead a byte at a time on errors... */
+      (*str)++;
+      c = 0;
+    }
+
+  c = towlower (c);
+
+  return c;
+}
+
+static const char *
+strdirsep (const char *p)
+{
+  const char *slash = (const char *) _mbschr ((const unsigned char *) p, '/');
+  const char *backslash = (const char *) _mbschr ((const unsigned char *) p, '\\');
+
+  if (slash == NULL ||
+      (backslash != NULL && backslash < slash))
+    return backslash;
+
+  return slash;
+}
+
+/* Match STRING against the filename pattern PATTERN, returning zero if
+   it matches, nonzero if not.  */
+
+/* Match STRING against the filename pattern PATTERN, returning zero if
+ *  it matches, nonzero if not.
+ *
+ * This is special-cased as if this combinations of flags:
+ *
+ *   FNM_FILE_NAME   - always set
+ *   FNM_LEADING_DIR - never set
+ *   FNM_CASEFOLD    - always set as this is for Windows
+ */
+
+#define FNM_CASEFOLD 0
+
+static int
+fnmatch_intern (const char *pattern,
+		const char *string,
+		int         component_start,
+		int         no_leading_period)
+{
+  const char *p = pattern, *n = string;
+  
+  while (*p)
+    {
+      const char *last_n = n;
+      
+      wchar_t c = get_char (&p);
+      wchar_t nc = get_char (&n);
+      
+      switch (c)
+	{
+   	case '?':
+	  if (nc == '\0')
+	    return 0;
+	  else if (IS_DIR_SEPARATOR (nc))
+	    return 0;
+	  else if (nc == '.' && component_start && no_leading_period)
+	    return 0;
+	  break;
+	case '*':
+	  if (nc == '.' && component_start && no_leading_period)
+	    return 0;
+
+	  {
+	    const char *last_p = p;
+
+	    for (last_p = p, c = get_char (&p);
+		 c == '?' || c == '*';
+		 last_p = p, c = get_char (&p))
+	      {
+		if (c == '?')
+		  {
+		    if (nc == '\0')
+		      return 0;
+		    else if (IS_DIR_SEPARATOR(nc))
+		      return 0;
+		    else
+		      {
+			last_n = n; nc = get_char (&n);
+		      }
+		  }
+	      }
+
+	    /* If the pattern ends with wildcards, we have a
+	     * guaranteed match unless there is a dir separator
+	     * in the remainder of the string.
+	     */
+	    if (c == '\0')
+	      {
+		if (strdirsep (last_n) != NULL)
+		  return 0;
+		else
+		  return 1;
+	      }
+
+	    for (p = last_p; nc != '\0';)
+	      {
+		if ((c == '[' || nc == c) &&
+		    fnmatch_intern (p, last_n, component_start, no_leading_period))
+		  return 1;
+		
+		component_start = IS_DIR_SEPARATOR (nc);
+		last_n = n;
+		nc = get_char (&n);
+	      }
+		  
+	    return 0;
+	  }
+
+	case '[':
+	  {
+	    /* Nonzero if the sense of the character class is inverted.  */
+	    int not;
+
+	    if (nc == '\0' || IS_DIR_SEPARATOR (nc))
+	      return 0;
+
+	    if (nc == '.' && component_start && no_leading_period)
+	      return 0;
+
+	    not = (*p == '!' || *p == '^');
+	    if (not)
+	      ++p;
+
+	    c = get_char (&p);
+	    for (;;)
+	      {
+		register wchar_t cstart = c, cend = c;
+		if (c == '\0')
+		  /* [ (unterminated) loses.  */
+		  return 0;
+
+		c = get_char (&p);
+		
+		if (c == '-' && *p != ']')
+		  {
+		    cend = get_char (&p);
+		    if (cend == '\0')
+		      return 0;
+
+		    c = get_char (&p);
+		  }
+
+		if (nc >= cstart && nc <= cend)
+		  goto matched;
+
+		if (c == ']')
+		  break;
+	      }
+	    if (!not)
+	      return 0;
+	    break;
+
+	  matched:;
+	    /* Skip the rest of the [...] that already matched.  */
+	    /* XXX 1003.2d11 is unclear if was_escaped is right.  */
+	    while (c != ']')
+	      {
+		if (c == '\0')
+		  /* [... (unterminated) loses.  */
+		  return 0;
+
+		c = get_char (&p);
+	      }
+	    if (not)
+	      return 0;
+	  }
+	  break;
+
+	case '/':
+	case '\\':
+	  if (!IS_DIR_SEPARATOR (nc))
+	    return 0;
+	  break;
+
+	default:
+	  if (c != nc)
+	    return 0;
+	}
+
+      component_start = IS_DIR_SEPARATOR (nc);
+    }
+
+  if (*n == '\0')
+    return 1;
+
+  return 0;
+}
+
+static int
+fnmatch (const char *pattern,
+	      const char *string,
+	      int   no_leading_period)
+{
+  return fnmatch_intern (pattern, string, 1, no_leading_period);
+}
+
+#ifdef FNMATCH_TEST_CASES
+
+#include <stdio.h>
+
+#define TEST(pat, str, no_leading_period, result) \
+  do { \
+    int rc = fnmatch ((pat), (str), (no_leading_period)); \
+    if (rc != result) \
+      fprintf (stderr, "Wrong result from fnmatch (\"%s\", \"%s\", %d): %d, should be %d\n", \
+	       (pat), (str), (no_leading_period), rc, result); \
+  } while (0)
+
+int main (int argc, char **argv)
+{
+  TEST ("[a-]", "-", 1, 1);
+  
+  TEST ("a", "a", 1, 1);
+  TEST ("a", "b", 1, 0);
+
+  TEST ("a", "A", 1, 1);
+  TEST ("A", "a", 1, 1);
+
+  /* Test what ? matches */
+  TEST ("?", "a", 1, 1);
+  TEST ("?", ".", 1, 0);
+  TEST ("a?", "a.", 1, 1);
+  TEST ("a/?", "a/b", 1, 1);
+  TEST ("a\\?", "a\\b", 1, 1);
+  TEST ("a/?", "a\\b", 1, 1);
+  TEST ("a\\?", "a/b", 1, 1);
+  TEST ("a/?", "a/.", 1, 0);
+  TEST ("a\\?", "a\\.", 1, 0);
+  TEST ("a\\?", "a/.", 1, 0);
+  TEST ("a/?", "a\\.", 1, 0);
+  TEST ("?", "/", 1, 0);
+  TEST ("?", "\\", 1, 0);
+
+  /* Test what * matches */
+  TEST ("*", "a", 1, 1);
+  TEST ("*", ".", 1, 0);
+  TEST ("a*", "a.", 1, 1);
+  TEST ("a/*", "a/b", 1, 1);
+  TEST ("a\\*", "a\\b", 1, 1);
+  TEST ("a\\*", "a/b", 1, 1);
+  TEST ("a/*", "a\\b", 1, 1);
+  TEST ("a/*", "a/.", 1, 0);
+  TEST ("a\\*", "a\\.", 1, 0);
+  TEST ("a\\*", "a/.", 1, 0);
+  TEST ("a/*", "a\\.", 1, 0);
+  TEST ("*", "/", 1, 0);
+  TEST ("*", "\\", 1, 0);
+
+  /* Range tests */
+  TEST ("[ab]", "a", 1, 1);
+  TEST ("[AB]", "a", 1, 1);
+  TEST ("[ab]", "A", 1, 1);
+  TEST ("[ab]", "c", 1, 0);
+  TEST ("[^ab]", "a", 1, 0);
+  TEST ("[^AB]", "a", 1, 0);
+  TEST ("[^ab]", "A", 1, 0);
+  TEST ("[!ab]", "a", 1, 0);
+  TEST ("[^ab]", "c", 1, 1);
+  TEST ("[!ab]", "c", 1, 1);
+  TEST ("[a-c]", "b", 1, 1);
+  TEST ("[a-c]", "B", 1, 1);
+  TEST ("[A-C]", "b", 1, 1);
+  TEST ("[a-c]", "d", 1, 0);
+  TEST ("[a-]", "-", 1, 1);
+  TEST ("[]]", "]", 1, 1);
+  TEST ("[^]]", "a", 1, 1);
+  TEST ("[!]]", "a", 1, 1);
+
+  /* Various unclosed ranges */
+  TEST ("[ab", "a", 1, 0);
+  TEST ("[a-", "a", 1, 0);
+  TEST ("[ab", "c", 1, 0);
+  TEST ("[a-", "c", 1, 0);
+  TEST ("[^]", "a", 1, 0);
+
+  /* Ranges and special no-wildcard matches */
+  TEST ("[.]", ".", 1, 0);
+  TEST ("a[.]", "a.", 1, 1);
+  TEST ("a/[.]", "a/.", 1, 0);
+  TEST ("a\\[.]", "a\\.", 1, 0);
+  TEST ("a/[.]", "a\\.", 1, 0);
+  TEST ("[/]", "/", 1, 0);
+  TEST ("[/]", "\\", 1, 0);
+  TEST ("[^/]", "a", 1, 1);
+  
+  /* Basic tests of * (and combinations of * and ?) */
+  TEST ("a*b", "ab", 1, 1);
+  TEST ("a*B", "Ab", 1, 1);
+  TEST ("A*b", "aB", 1, 1);
+  TEST ("a*b", "axb", 1, 1);
+  TEST ("a*b", "axxb", 1, 1);
+  TEST ("a*b", "axXB", 1, 1);
+  TEST ("a**b", "ab", 1, 1);
+  TEST ("a**b", "axb", 1, 1);
+  TEST ("a**b", "axxb", 1, 1);
+  TEST ("a*?*b", "ab", 1, 0);
+  TEST ("a*?*b", "axb", 1, 1);
+  TEST ("a*?*b", "axxb", 1, 1);
+
+  /* Test of  *[range] */
+  TEST ("a*[cd]", "ac", 1, 1);
+  TEST ("a*[cd]", "axc", 1, 1);
+  TEST ("a*[cd]", "axx", 1, 0);
+
+  TEST ("a/[.]", "a/.", 1, 0);
+  TEST ("a\\[.]", "a\\.", 1, 0);
+  TEST ("a\\[.]", "a/.", 1, 0);
+  TEST ("a/[.]", "a\\.", 1, 0);
+  TEST ("a*[.]", "a/.", 1, 0);
+  TEST ("a*[.]", "a\\.", 1, 0);
+
+  return 0;
+}
+
+#endif /* FNMATCH_TEST_CASES */
+
+static const char *
+strchrnul (const char *s, int c)
+{
+  const char *match = strchr(s, c);
+  if (match != NULL)
+    return match;
+  return s + strlen (s);
+}
+
+static const char *
+strcasestr (const char *haystack, const char *needle)
+{
+  char *h = strdup (haystack);
+  char *n = strdup (needle);
+  const char *retval;
+  char *r;
+
+  _strlwr (h);
+  _strlwr (n);
+  r = strstr (h, n);
+  if (r == NULL)
+    retval = NULL;
+  else
+    retval = haystack + (r - h);
+  free (h);
+  free (n);
+
+  return retval;
+}
+
 extern unsigned int compress_buf (const unsigned char *in, unsigned int in_len,
 				  unsigned char *out, unsigned int out_len);
 extern unsigned int unchecked_decompress_buf (const unsigned char *in,
--- src/repopage.c
+++ src/repopage.c
@@ -9,19 +9,32 @@
 #include <unistd.h>
 #include <assert.h>
 #include <time.h>
+#include <stdint.h>
 
 #include "repo.h"
 #include "repopage.h"
 
 
 
 #define BLOCK_SIZE (65536*1)
 #if BLOCK_SIZE <= 65536
-typedef __uint16_t Ref;
+typedef uint16_t Ref;
 #else
-typedef __uint32_t Ref;
+typedef uint32_t Ref;
 #endif
 
+static ssize_t
+pread(int fd, void *buf, size_t count, off_t offset)
+{
+  ssize_t nbytes;
+  off_t oldpos = lseek (fd, SEEK_SET, offset);
+  if (oldpos == -1)
+    return -1;
+  nbytes = read (fd, buf, count);
+  lseek (fd, SEEK_SET, oldpos);
+  return nbytes;
+}
+
 /*
    The format is tailored for fast decompression (i.e. only byte based),
    and skewed to ASCII content (highest bit often not set):
--- src/sha1.c
+++ src/sha1.c
@@ -9,9 +9,11 @@
 
 #include <stdio.h>
 #include <string.h>
-#include <endian.h>
 #include "sha1.h"
 
+#define __BIG_ENDIAN 'B'
+#define __LITTLE_ENDIAN 'l'
+#define __BYTE_ORDER __LITTLE_ENDIAN
 
 static void SHA1_Transform(uint32_t state[5], const uint8_t buffer[64]);
 
--- src/sha2.c
+++ src/sha2.c
@@ -9,14 +9,14 @@
 #include <string.h>     /* memcpy()/memset() or bcopy()/bzero() */
 /* #include <assert.h> */   /* assert() */
 #include <stdio.h>
-#include <sysexits.h>
-#include <sys/uio.h>
 #include <unistd.h>
 #include <inttypes.h>
-#include <endian.h>
 
 #include "sha2.h"
 
+#define __BIG_ENDIAN 'B'
+#define __LITTLE_ENDIAN 'l'
+#define __BYTE_ORDER __LITTLE_ENDIAN
 
 /*
  * ASSERT NOTE:
--- src/util.c
+++ src/util.c
@@ -98,6 +98,202 @@
   return r - subtract;
 }
 
+#define I_AM_QSORT_R
+
+/*-
+ * Copyright (c) 1992, 1993
+ *	The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char sccsid[] = "@(#)qsort.c	8.1 (Berkeley) 6/4/93";
+#endif /* LIBC_SCCS and not lint */
+
+#include <stdlib.h>
+
+#ifdef I_AM_QSORT_R
+typedef int		 cmp_t(void *, const void *, const void *);
+#else
+typedef int		 cmp_t(const void *, const void *);
+#endif
+static inline char	*med3(char *, char *, char *, cmp_t *, void *);
+static inline void	 swapfunc(char *, char *, int, int);
+
+#define min(a, b)	(a) < (b) ? a : b
+
+/*
+ * Qsort routine from Bentley & McIlroy's "Engineering a Sort Function".
+ */
+#define swapcode(TYPE, parmi, parmj, n) { 		\
+	long i = (n) / sizeof (TYPE); 			\
+	TYPE *pi = (TYPE *) (parmi); 		\
+	TYPE *pj = (TYPE *) (parmj); 		\
+	do { 						\
+		TYPE	t = *pi;		\
+		*pi++ = *pj;				\
+		*pj++ = t;				\
+        } while (--i > 0);				\
+}
+
+#define SWAPINIT(a, es) swaptype = ((char *)a - (char *)0) % sizeof(long) || \
+	es % sizeof(long) ? 2 : es == sizeof(long)? 0 : 1;
+
+static inline void
+swapfunc(a, b, n, swaptype)
+	char *a, *b;
+	int n, swaptype;
+{
+	if(swaptype <= 1)
+		swapcode(long, a, b, n)
+	else
+		swapcode(char, a, b, n)
+}
+
+#define swap(a, b)					\
+	if (swaptype == 0) {				\
+		long t = *(long *)(a);			\
+		*(long *)(a) = *(long *)(b);		\
+		*(long *)(b) = t;			\
+	} else						\
+		swapfunc(a, b, es, swaptype)
+
+#define vecswap(a, b, n) 	if ((n) > 0) swapfunc(a, b, n, swaptype)
+
+#ifdef I_AM_QSORT_R
+#define	CMP(t, x, y) (cmp((t), (x), (y)))
+#else
+#define	CMP(t, x, y) (cmp((x), (y)))
+#endif
+
+static inline char *
+med3(char *a, char *b, char *c, cmp_t *cmp, void *thunk
+#ifndef I_AM_QSORT_R
+__unused
+#endif
+)
+{
+	return CMP(thunk, a, b) < 0 ?
+	       (CMP(thunk, b, c) < 0 ? b : (CMP(thunk, a, c) < 0 ? c : a ))
+              :(CMP(thunk, b, c) > 0 ? b : (CMP(thunk, a, c) < 0 ? a : c ));
+}
+
+#ifdef I_AM_QSORT_R
+static void
+qsort_r(void *a, size_t n, size_t es, cmp_t *cmp, void *thunk)
+#else
+#define thunk NULL
+void
+qsort(void *a, size_t n, size_t es, cmp_t *cmp)
+#endif
+{
+	char *pa, *pb, *pc, *pd, *pl, *pm, *pn;
+	size_t d, r;
+	int cmp_result;
+	int swaptype, swap_cnt;
+
+loop:	SWAPINIT(a, es);
+	swap_cnt = 0;
+	if (n < 7) {
+		for (pm = (char *)a + es; pm < (char *)a + n * es; pm += es)
+			for (pl = pm; 
+			     pl > (char *)a && CMP(thunk, pl - es, pl) > 0;
+			     pl -= es)
+				swap(pl, pl - es);
+		return;
+	}
+	pm = (char *)a + (n / 2) * es;
+	if (n > 7) {
+		pl = a;
+		pn = (char *)a + (n - 1) * es;
+		if (n > 40) {
+			d = (n / 8) * es;
+			pl = med3(pl, pl + d, pl + 2 * d, cmp, thunk);
+			pm = med3(pm - d, pm, pm + d, cmp, thunk);
+			pn = med3(pn - 2 * d, pn - d, pn, cmp, thunk);
+		}
+		pm = med3(pl, pm, pn, cmp, thunk);
+	}
+	swap(a, pm);
+	pa = pb = (char *)a + es;
+
+	pc = pd = (char *)a + (n - 1) * es;
+	for (;;) {
+		while (pb <= pc && (cmp_result = CMP(thunk, pb, a)) <= 0) {
+			if (cmp_result == 0) {
+				swap_cnt = 1;
+				swap(pa, pb);
+				pa += es;
+			}
+			pb += es;
+		}
+		while (pb <= pc && (cmp_result = CMP(thunk, pc, a)) >= 0) {
+			if (cmp_result == 0) {
+				swap_cnt = 1;
+				swap(pc, pd);
+				pd -= es;
+			}
+			pc -= es;
+		}
+		if (pb > pc)
+			break;
+		swap(pb, pc);
+		swap_cnt = 1;
+		pb += es;
+		pc -= es;
+	}
+	if (swap_cnt == 0) {  /* Switch to insertion sort */
+		for (pm = (char *)a + es; pm < (char *)a + n * es; pm += es)
+			for (pl = pm; 
+			     pl > (char *)a && CMP(thunk, pl - es, pl) > 0;
+			     pl -= es)
+				swap(pl, pl - es);
+		return;
+	}
+
+	pn = (char *)a + n * es;
+	r = min(pa - (char *)a, pb - pa);
+	vecswap(a, pb - r, r);
+	r = min(pd - pc, pn - pd - es);
+	vecswap(pb, pn - r, r);
+	if ((r = pb - pa) > es)
+#ifdef I_AM_QSORT_R
+		qsort_r(a, r / es, es, cmp, thunk);
+#else
+		qsort(a, r / es, es, cmp);
+#endif
+	if ((r = pd - pc) > es) {
+		/* Iterate rather than recurse to save stack space */
+		a = pn - r;
+		n = r / es;
+		goto loop;
+	}
+/*		qsort(pn - r, r / es, es, cmp);*/
+}
+
 /* bsd's qsort_r has different arguments, so we define our
    own version in case we need to do some clever mapping
  
--- ext/repo_rpmdb.c
+++ ext/repo_rpmdb.c
@@ -31,13 +31,11 @@
 #include <rpm/rpmdb.h>
 
 #ifndef DB_CREATE
-# ifdef FEDORA
-#  include <db4/db.h>
+# include <db.h>
-# else
-#  include <rpm/db.h>
-# endif
 #endif
 
+#define S_ISLNK(m) 0
+
 #include "pool.h"
 #include "repo.h"
 #include "hash.h"
@@ -2478,6 +2478,8 @@
 }
 
 
+#ifndef _WIN32
+
 static char *
 r64dec1(char *p, unsigned int *vp, int *eofp)
 {
@@ -3058,3 +3058,5 @@
   if (!(flags & REPO_NO_INTERNALIZE))
     repodata_internalize(data);
 }
+
+#endif
--- tools/CMakeLists.txt
+++ tools/CMakeLists.txt
@@ -5,57 +5,39 @@
 ADD_LIBRARY(toolstuff STATIC common_write.c)
 
 ADD_EXECUTABLE(rpmdb2solv rpmdb2solv.c)
-TARGET_LINK_LIBRARIES(rpmdb2solv toolstuff satsolverext satsolver ${RPMDB_LIBRARY} ${EXPAT_LIBRARY})
+TARGET_LINK_LIBRARIES(rpmdb2solv toolstuff satsolverext satsolver ${RPMDB_LIBRARY} ${EXPAT_LIBRARY} -ldb -lgnurx)
 
 ADD_EXECUTABLE(rpms2solv rpms2solv.c)
-TARGET_LINK_LIBRARIES(rpms2solv toolstuff satsolverext satsolver ${RPMDB_LIBRARY})
+TARGET_LINK_LIBRARIES(rpms2solv toolstuff satsolverext satsolver ${RPMDB_LIBRARY} -ldb -lgnurx)
 
-ADD_EXECUTABLE(rpmmd2solv rpmmd2solv.c)
-TARGET_LINK_LIBRARIES(rpmmd2solv toolstuff satsolverext satsolver ${EXPAT_LIBRARY} ${ZLIB_LIBRARY})
-
 ADD_EXECUTABLE(helix2solv helix2solv.c)
-TARGET_LINK_LIBRARIES(helix2solv toolstuff satsolverext satsolver ${EXPAT_LIBRARY})
+TARGET_LINK_LIBRARIES(helix2solv toolstuff satsolverext satsolver ${EXPAT_LIBRARY} -lgnurx)
 
-ADD_EXECUTABLE(susetags2solv susetags2solv.c)
-TARGET_LINK_LIBRARIES(susetags2solv toolstuff satsolverext satsolver ${ZLIB_LIBRARY})
-
 ADD_EXECUTABLE(updateinfoxml2solv updateinfoxml2solv.c)
-TARGET_LINK_LIBRARIES(updateinfoxml2solv toolstuff satsolverext satsolver ${EXPAT_LIBRARY})
+TARGET_LINK_LIBRARIES(updateinfoxml2solv toolstuff satsolverext satsolver ${EXPAT_LIBRARY} -lgnurx)
 
 ADD_EXECUTABLE(deltainfoxml2solv deltainfoxml2solv.c)
-TARGET_LINK_LIBRARIES(deltainfoxml2solv toolstuff satsolverext satsolver ${EXPAT_LIBRARY})
+TARGET_LINK_LIBRARIES(deltainfoxml2solv toolstuff satsolverext satsolver ${EXPAT_LIBRARY} -lgnurx)
 
 ADD_EXECUTABLE(repomdxml2solv repomdxml2solv.c)
-TARGET_LINK_LIBRARIES(repomdxml2solv toolstuff satsolverext satsolver ${EXPAT_LIBRARY})
+TARGET_LINK_LIBRARIES(repomdxml2solv toolstuff satsolverext satsolver ${EXPAT_LIBRARY} -ldb -lgnurx)
 
-ADD_EXECUTABLE(installcheck installcheck.c)
-TARGET_LINK_LIBRARIES(installcheck satsolverext satsolver ${EXPAT_LIBRARY} ${ZLIB_LIBRARY})
-
-ADD_EXECUTABLE(patchcheck patchcheck.c)
-TARGET_LINK_LIBRARIES(patchcheck satsolverext satsolver ${EXPAT_LIBRARY} ${ZLIB_LIBRARY})
-
 ADD_EXECUTABLE(dumpsolv dumpsolv.c )
-TARGET_LINK_LIBRARIES(dumpsolv satsolver)
+TARGET_LINK_LIBRARIES(dumpsolv satsolver -lgnurx)
 
 ADD_EXECUTABLE(mergesolv mergesolv.c )
-TARGET_LINK_LIBRARIES(mergesolv toolstuff satsolverext satsolver)
+TARGET_LINK_LIBRARIES(mergesolv toolstuff satsolverext satsolver -lgnurx)
 
 ADD_EXECUTABLE(findfileconflicts findfileconflicts.c)
-TARGET_LINK_LIBRARIES(findfileconflicts satsolverext satsolver ${RPMDB_LIBRARY})
+TARGET_LINK_LIBRARIES(findfileconflicts satsolverext satsolver ${RPMDB_LIBRARY} -ldb -lgnurx)
 
 install(TARGETS
     mergesolv
     dumpsolv
-    susetags2solv
     helix2solv
-    rpmmd2solv
     rpmdb2solv
     rpms2solv
     updateinfoxml2solv
     deltainfoxml2solv
     repomdxml2solv
     DESTINATION ${BIN_INSTALL_DIR})
-
-install(PROGRAMS
-   repo2solv.sh
-   DESTINATION ${BIN_INSTALL_DIR})
--- tools/common_write.c
+++ tools/common_write.c
@@ -252,7 +252,7 @@
       for (i = 0; i < nlanguages; i++)
         {
 	  sprintf(fn, "%s.%s.solv", basename, languages[i]);
-	  if (!(fp = fopen(fn, "w")))
+	  if (!(fp = fopen(fn, "wb")))
 	    {
 	      perror(fn);
 	      exit(1);
@@ -265,7 +265,7 @@
       if (has_DU)
 	{
 	  sprintf(fn, "%s.DU.solv", basename);
-	  if (!(fp = fopen(fn, "w")))
+	  if (!(fp = fopen(fn, "wb")))
 	    {
 	      perror(fn);
 	      exit(1);
@@ -278,18 +278,18 @@
       if (has_FL)
 	{
 	  sprintf(fn, "%s.FL.solv", basename);
-	  if (!(fp = fopen(fn, "w")))
+	  if (!(fp = fopen(fn, "wb")))
 	    {
 	      perror(fn);
 	      exit(1);
 	    }
 	  write_info(repo, fp, keyfilter_FL, 0, info, fn);
 	  fclose(fp);
 	  kd.haveexternal = 1;
 	}
       /* write everything else */
       sprintf(fn, "%s.solv", basename);
-      if (!(fp = fopen(fn, "w")))
+      if (!(fp = fopen(fn, "wb")))
 	{
 	  perror(fn);
 	  exit(1);
@@ -308,7 +308,7 @@
   if (attrname)
     {
       test_separate = 1;
-      FILE *fp = fopen(attrname, "w");
+      FILE *fp = fopen(attrname, "wb");
       write_info(repo, fp, keyfilter_attr, 0, info, attrname);
       fclose(fp);
       kd.haveexternal = 1;
--- tools/dumpsolv.c
+++ tools/dumpsolv.c
@@ -187,7 +187,7 @@
   if (!location || !with_attr)
     return 0;
   fprintf (stderr, "Loading SOLV file %s\n", location);
-  fp = fopen (location, "r");
+  fp = fopen (location, "rb");
   if (!fp)
     {
       perror(location);
@@ -269,7 +269,7 @@
 	    }
       else
 	{
-	  if (freopen (argv[0], "r", stdin) == 0)
+	  if (freopen (argv[0], "rb", stdin) == 0)
 	    {
 	      perror(argv[0]);
 	      exit(1);
--- tools/rpmdb2solv.c
+++ tools/rpmdb2solv.c
@@ -96,7 +96,7 @@
 	usage(1);
       }
   
-  if (outfile && !freopen(outfile, "w", stdout))
+  if (outfile && !freopen(outfile, "wb", stdout))
     {
       perror(outfile);
       exit(1);
@@ -113,7 +113,7 @@
   if (refname)
     {
       FILE *fp;
-      if ((fp = fopen(refname, "r")) == NULL)
+      if ((fp = fopen(refname, "rb")) == NULL)
         {
           perror(refname);
         }
--- applayer/tests/CMakeLists.txt
+++ applayer/tests/CMakeLists.txt
@@ -7,4 +7,4 @@
 SET( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Werror" )
 
 ADD_EXECUTABLE( applayer applayer.c )
-TARGET_LINK_LIBRARIES( applayer appsatsolver satsolver )
+TARGET_LINK_LIBRARIES( applayer appsatsolver satsolver -lgnurx)
openSUSE Build Service is sponsored by