Package: quinn-diff
Version: 0.67
Severity: normal
Tags: patch

quinn-diff should support architecture wildcards just as support for them have
been implemented in dpkg and sbuild.

Here's a patch that will allow quinn-diff to support a Packages-arch-specific
that has entries that include architecture wildcards.

-- System Information:
Debian Release: squeeze/sid
  APT prefers unstable
  APT policy: (500, 'unstable'), (1, 'experimental')
Architecture: amd64 (x86_64)

Kernel: Linux 2.6.31-1-amd64 (SMP w/2 CPU cores)
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash

Versions of packages quinn-diff depends on:
ii  libc6                         2.10.2-2   GNU C Library: Shared libraries
ii  libglib2.0-0                  2.22.3-1   The GLib library of C routines

Versions of packages quinn-diff recommends:
ii  debianutils                   3.2.2      Miscellaneous utilities specific t
ii  lftp                          4.0.2-1    Sophisticated command-line FTP/HTT

quinn-diff suggests no packages.

-- no debconf information
diff --git a/src/utils.c b/src/utils.c
index 3cbd674..08e7ffa 100644
--- a/src/utils.c
+++ b/src/utils.c
@@ -287,20 +287,322 @@ xstrdup (const char *s)
 boolean
 in_arch_list(const char *arch_list, const char *arch)
 {
-  char **archs;
-  int i;
-
-  if ((archs = g_strsplit(arch_list," ",0)) != NULL)
+  /* Overview of strings to match:
+   * any
+   * <cpu>
+   * any-any
+   * any-<cpu>
+   * <kernel>-any
+   * <kernel>-<cpu>
+   * any-any-any
+   * any-any-<cpu>
+   * any-<kernel>-any
+   * any-<kernel>-<cpu>
+   * <system>-any-any
+   * <system>-any-<cpu>
+   * <system>-<kernel>-any
+   * <system>-<kernel>-<cpu>
+   */
+
+  char *archs = strdup(arch_list);
+  char *archtok = strtok(archs, " ");
+
+  while (archtok != NULL)
+  {
+    /* Traditional comparison. Search for exact strings or "any"
+     * any
+     * <cpu>
+     * any-any
+     * <kernel>-<cpu>
+     * any-any-any
+     * <system>-<kernel>-<cpu>
+     */
+    if (!strcmp(archtok,arch) || !strcmp(archtok,"any") ||
+	!strcmp(archtok,"any-any") || !strcmp(archtok,"any-any-any"))
     {
-      for ( i = 0 ; archs[i] ; i++ )
-	{
-	  if (!strcmp(archs[i],arch))
-	    {
-	      g_strfreev(archs);
-	      return TRUE;
-	    }
-	}
-      g_strfreev(archs);
+      free(archs);
+      return TRUE;
+    }
+
+    /* Match from variable 'arch' with the use of triplets
+     * '<system>-<kernel>-<cpu>' */
+    int first = 0, second = 0;
+    char *temp = strchr(arch, '-');
+    if (temp != NULL) {
+      first = temp - arch;
+      temp = strchr(temp + 1, '-');
+      if (temp != NULL) {
+	second = temp - arch;
+      }
     }
+
+    /* Search for matches when Packages arch given <cpu>:
+     * linux-any
+     * linux-<cpu>
+     * any-<cpu>
+     * any-linux-any
+     * any-linux-<cpu>
+     */
+    if ((first == 0) && (first == second)) {
+      int size = strlen("any-linux-") + strlen(arch) + 1;
+      char *wildcard = malloc(size);
+      if (wildcard == NULL) {
+        fubar (SYSERR, "in_arch_list: failed to allocate memory for wildcard.");
+      }
+
+      /* linux-any, linux-<cpu>, any-linux-any */
+      sprintf(wildcard, "linux-%s", arch);
+      if (!strcmp(archtok,"linux-any") || !strcmp(archtok,wildcard) ||
+	  !strcmp(archtok,"any-linux-any")) {
+	free(archs);
+	free(wildcard);
+	return TRUE;
+      }
+
+      /* any-<cpu> */
+      sprintf(wildcard, "any-%s", arch);
+      if (!strcmp(archtok,wildcard)) {
+	free(archs);
+	free(wildcard);
+	return TRUE;
+      }
+
+      /* any-linux-<cpu> */
+      sprintf(wildcard, "any-linux-%s", arch);
+      if (!strcmp(archtok,wildcard)) {
+	free(archs);
+	free(wildcard);
+	return TRUE;
+      }
+
+      free(wildcard);
+    }
+
+    /* Search for matches when Packages arch given is <kernel>-<cpu>:
+     * any-<cpu>
+     * <kernel>-any
+     * any-any-<cpu>
+     * any-<kernel>-any
+     * any-<kernel>-<cpu>
+     */
+    if ((first > 0) && (second == 0)) {
+      char *cpu = strdup(arch+first+1);
+      char *kernel = strdup(arch);
+      kernel[first] = '\0';
+
+      /* any-<cpu>, any-any-<cpu> */
+      unsigned int size = strlen("any-any-") + strlen(cpu) + 1;
+      char *wildcard = malloc(size);
+      if (wildcard == NULL) {
+        fubar (SYSERR, "in_arch_list: failed to allocate memory for wildcard.");
+      }
+      sprintf(wildcard, "any-%s", cpu);
+      if (!strcmp(archtok,wildcard)) {
+	free(archs);
+	free(cpu);
+	free(kernel);
+	free(wildcard);
+	return TRUE;
+      }
+      sprintf(wildcard, "any-any-%s", cpu);
+      if (!strcmp(archtok,wildcard)) {
+	free(archs);
+	free(cpu);
+	free(kernel);
+	free(wildcard);
+	return TRUE;
+      }
+
+      /* <kernel>-any, any-<kernel>-any */
+      size = strlen("any-") + strlen(kernel) + strlen("-any") + 1;
+      wildcard = (char*)realloc(wildcard, size);
+      if (wildcard == NULL) {
+        fubar (SYSERR,
+	  "in_arch_list: failed to reallocate memory for wildcard.");
+      }
+      sprintf(wildcard, "%s-any", kernel);
+      if (!strcmp(archtok,wildcard)) {
+	free(archs);
+	free(cpu);
+	free(kernel);
+	free(wildcard);
+	return TRUE;
+      }
+      sprintf(wildcard, "any-%s-any", kernel);
+      if (!strcmp(archtok,wildcard)) {
+	free(archs);
+	free(cpu);
+	free(kernel);
+	free(wildcard);
+	return TRUE;
+      }
+
+      /* any-<kernel>-<cpu> */
+      size = strlen("any-") + strlen(kernel) + strlen(cpu) + 1;
+      wildcard = (char*)realloc(wildcard, size);
+      if (wildcard == NULL) {
+        fubar (SYSERR,
+	  "in_arch_list: failed to reallocate memory for wildcard.");
+      }
+      sprintf(wildcard, "any-%s-%s", kernel, cpu);
+      if (!strcmp(archtok,wildcard)) {
+	free(archs);
+	free(cpu);
+	free(kernel);
+	free(wildcard);
+	return TRUE;
+      }
+
+      free(cpu);
+      free(kernel);
+      free(wildcard);
+    }
+
+    /* Search for matches when Pakages arch given is <system>-<kernel>-<cpu>:
+     * any-<cpu>
+     * <kernel>-any
+     * any-any-<cpu>
+     * any-<kernel>-any
+     * any-<kernel>-<cpu>
+     * <system>-any-any
+     * <system>-any-<cpu>
+     * <system>-<kernel>-any
+     */
+    if ((first > 0) && (second > first)) {
+      char *cpu = strdup(arch+second+1);
+      char *kernel = strdup(arch+first+1);
+      kernel[strlen(arch)-second] = '\0';
+      char *system = strdup(arch);
+      system[first] = '\0';
+
+      /* any-<cpu>, any-any-<cpu> */
+      unsigned int size = strlen("any-any-") + strlen(cpu) + 1;
+      char *wildcard = malloc(size);
+      if (wildcard == NULL) {
+        fubar (SYSERR, "in_arch_list: failed to allocate memory for wildcard.");
+      }
+      sprintf(wildcard, "any-%s", cpu);
+      if (!strcmp(archtok,wildcard)) {
+	free(archs);
+	free(cpu);
+	free(kernel);
+	free(system);
+	free(wildcard);
+	return TRUE;
+      }
+      sprintf(wildcard, "any-any-%s", cpu);
+      if (!strcmp(archtok,wildcard)) {
+	free(archs);
+	free(cpu);
+	free(kernel);
+	free(system);
+	free(wildcard);
+	return TRUE;
+      }
+
+      /* <kernel>-any, any-<kernel>-any */
+      size = strlen("any-") + strlen(kernel) + strlen("-any") + 1;
+      wildcard = (char*)realloc(wildcard, size);
+      if (wildcard == NULL) {
+        fubar (SYSERR,
+	  "in_arch_list: failed to reallocate memory for wildcard.");
+      }
+      sprintf(wildcard, "%s-any", kernel);
+      if (!strcmp(archtok,wildcard)) {
+	free(archs);
+	free(cpu);
+	free(kernel);
+	free(system);
+	free(wildcard);
+	return TRUE;
+      }
+      sprintf(wildcard, "any-%s-any", kernel);
+      if (!strcmp(archtok,wildcard)) {
+	free(archs);
+	free(cpu);
+	free(kernel);
+	free(system);
+	free(wildcard);
+	return TRUE;
+      }
+
+      /* any-<kernel>-<cpu> */
+      size = strlen("any-") + strlen(kernel) + strlen("-") + strlen(cpu) + 1;
+      wildcard = (char*)realloc(wildcard, size);
+      if (wildcard == NULL) {
+        fubar (SYSERR,
+	  "in_arch_list: failed to reallocate memory for wildcard.");
+      }
+      sprintf(wildcard, "any-%s-%s", kernel, cpu);
+      if (!strcmp(archtok,wildcard)) {
+	free(archs);
+	free(cpu);
+	free(kernel);
+	free(system);
+	free(wildcard);
+	return TRUE;
+      }
+
+      /* <system>-any-any */
+      size = strlen(system) + strlen("-any-any") + 1;
+      wildcard = (char*)realloc(wildcard, size);
+      if (wildcard == NULL) {
+        fubar (SYSERR,
+	  "in_arch_list: failed to reallocate memory for wildcard.");
+      }
+      sprintf(wildcard, "%s-any-any", system);
+      if (!strcmp(archtok,wildcard)) {
+	free(archs);
+	free(cpu);
+	free(kernel);
+	free(system);
+	free(wildcard);
+	return TRUE;
+      }
+
+      /* <system>-any-<cpu> */
+      size = strlen(system) + strlen("-any-") + strlen(cpu) + 1;
+      wildcard = (char*)realloc(wildcard, size);
+      if (wildcard == NULL) {
+        fubar (SYSERR,
+	  "in_arch_list: failed to reallocate memory for wildcard.");
+      }
+      sprintf(wildcard, "%s-any-%s", system, cpu);
+      if (!strcmp(archtok,wildcard)) {
+	free(archs);
+	free(cpu);
+	free(kernel);
+	free(system);
+	free(wildcard);
+	return TRUE;
+      }
+
+      /* <system>-<kernel>-any */
+      size = strlen(system) + strlen("-") + strlen(kernel) + strlen("-any") + 1;
+      wildcard = (char*)realloc(wildcard, size);
+      if (wildcard == NULL) {
+        fubar (SYSERR,
+	  "in_arch_list: failed to reallocate memory for wildcard.");
+      }
+      sprintf(wildcard, "%s-%s-any", system, kernel);
+      if (!strcmp(archtok,wildcard)) {
+	free(archs);
+	free(cpu);
+	free(kernel);
+	free(system);
+	free(wildcard);
+	return TRUE;
+      }
+
+      free(cpu);
+      free(kernel);
+      free(system);
+      free(wildcard);
+    }
+
+    /* Go on to the next architecture in the list */
+    archtok = strtok(NULL, " ");
+  }
+  free(archs);
   return FALSE;
 }

Reply via email to