- bring back dataiterator_match for now (to be removed again)
[platform/upstream/libsolv.git] / src / poolarch.c
1 /*
2  * Copyright (c) 2007, Novell Inc.
3  *
4  * This program is licensed under the BSD license, read LICENSE.BSD
5  * for further information
6  */
7
8 /*
9  * poolarch.c
10  * 
11  * create architecture policies
12  */
13
14 #include <stdio.h>
15 #include <stdlib.h>
16 #include <string.h>
17
18 #include "pool.h"
19 #include "poolid.h"
20 #include "poolarch.h"
21 #include "util.h"
22
23 const char *archpolicies[] = {
24   "x86_64", "x86_64:i686:i586:i486:i386",
25   "i686",   "i686:i586:i486:i386",
26   "i586",   "i586:i486:i386",
27   "i486",   "i486:i386",
28   "i386",   "i386",
29   "s390x",  "s390x:s390",
30   "s390",   "s390",
31   "ia64",   "ia64:i686:i586:i486:i386",
32   "ppc64",  "ppc64:ppc",
33   "ppc",    "ppc",
34   0
35 };
36
37 void
38 pool_setarch(Pool *pool, const char *arch)
39 {
40   const char *a;
41   char buf[256];
42   unsigned int score = 0x10001;
43   size_t l;
44   char d;
45   int i;
46   Id *id2arch;
47   Id id, lastarch;
48   
49   pool->id2arch = sat_free(pool->id2arch);
50   if (!arch)
51     {
52       pool->lastarch = 0;
53       return;
54     }
55   id = ARCH_NOARCH;
56   lastarch = id + 255;
57   id2arch = sat_calloc(lastarch + 1, sizeof(Id));
58   id2arch[id] = 1;
59
60   a = "";
61   for (i = 0; archpolicies[i]; i += 2)
62     if (!strcmp(archpolicies[i], arch))
63       break;
64   if (archpolicies[i])
65     a = archpolicies[i + 1];
66   d = 0;
67   while (*a)
68     {
69       l = strcspn(a, ":=>");
70       if (l && l < sizeof(buf) - 1)
71         {
72           strncpy(buf, a, l);
73           buf[l] = 0;
74           id = str2id(pool, buf, 1);
75           if (id > lastarch)
76             {
77               id2arch = sat_realloc(id2arch, (id + 255 + 1) * sizeof(Id));
78               memset(id2arch + lastarch + 1, 0, (id + 255 - lastarch) * sizeof(Id));
79               lastarch = id + 255;
80             }
81           if (id2arch[id] == 0)
82             {
83               if (d == ':')
84                 score += 0x10000;
85               else if (d == '>')
86                 score += 0x00001;
87               id2arch[id] = score;
88             }
89         }
90       a += l;
91       if ((d = *a++) == 0)
92         break;
93     }
94   pool->id2arch = id2arch;
95   pool->lastarch = lastarch;
96 }