00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #include <stdio.h>
00015 #include <stdlib.h>
00016 #include <string.h>
00017
00018 #include "pool.h"
00019 #include "poolid.h"
00020 #include "poolarch.h"
00021 #include "util.h"
00022
00023 const char *archpolicies[] = {
00024 "x86_64", "x86_64:i686:i586:i486:i386",
00025 "i686", "i686:i586:i486:i386",
00026 "i586", "i586:i486:i386",
00027 "i486", "i486:i386",
00028 "i386", "i386",
00029 "s390x", "s390x:s390",
00030 "s390", "s390",
00031 "ia64", "ia64:i686:i586:i486:i386",
00032 "ppc64", "ppc64:ppc",
00033 "ppc", "ppc",
00034 "armv6l", "armv6l:armv5tejl:armv5tel:armv5l:armv4tl:armv4l:armv3l",
00035 "armv5tejl", "armv5tejl:armv5tel:armv5l:armv4tl:armv4l:armv3l",
00036 "armv5tel", "armv5tel:armv5l:armv4tl:armv4l:armv3l",
00037 "armv5l", "armv5l:armv4tl:armv4l:armv3l",
00038 "armv4tl", "armv4tl:armv4l:armv3l",
00039 "armv4l", "armv4l:armv3l",
00040 "armv3l", "armv3l",
00041 "sh3", "sh3",
00042 "sh4", "sh4",
00043 "sh4a", "sh4a:sh4",
00044 "sparc64v", "sparc64v:sparc64:sparcv9v:sparcv9:sparcv8:sparc",
00045 "sparc64", "sparc64:sparcv9:sparcv8:sparc",
00046 "sparcv9v", "sparcv9v:sparcv9:sparcv8:sparc",
00047 "sparcv9", "sparcv9:sparcv8:sparc",
00048 "sparcv8", "sparcv8:sparc",
00049 "sparc", "sparc",
00050 0
00051 };
00052
00053 void
00054 pool_setarch(Pool *pool, const char *arch)
00055 {
00056 const char *a;
00057 unsigned int score = 0x10001;
00058 size_t l;
00059 char d;
00060 int i;
00061 Id *id2arch;
00062 Id id, lastarch;
00063
00064 pool->id2arch = sat_free(pool->id2arch);
00065 pool->id2color = sat_free(pool->id2color);
00066 if (!arch)
00067 {
00068 pool->lastarch = 0;
00069 return;
00070 }
00071 #ifndef DEBIAN_SEMANTICS
00072 id = ARCH_NOARCH;
00073 #else
00074 id = ARCH_ALL;
00075 #endif
00076 lastarch = id + 255;
00077 id2arch = sat_calloc(lastarch + 1, sizeof(Id));
00078 id2arch[id] = 1;
00079
00080 a = "";
00081 for (i = 0; archpolicies[i]; i += 2)
00082 if (!strcmp(archpolicies[i], arch))
00083 break;
00084 if (archpolicies[i])
00085 a = archpolicies[i + 1];
00086 d = 0;
00087 while (*a)
00088 {
00089 l = strcspn(a, ":=>");
00090 if (l)
00091 {
00092 id = strn2id(pool, a, l, 1);
00093 if (id > lastarch)
00094 {
00095 id2arch = sat_realloc(id2arch, (id + 255 + 1) * sizeof(Id));
00096 memset(id2arch + lastarch + 1, 0, (id + 255 - lastarch) * sizeof(Id));
00097 lastarch = id + 255;
00098 }
00099 if (id2arch[id] == 0)
00100 {
00101 if (d == ':')
00102 score += 0x10000;
00103 else if (d == '>')
00104 score += 0x00001;
00105 id2arch[id] = score;
00106 }
00107 }
00108 a += l;
00109 if ((d = *a++) == 0)
00110 break;
00111 }
00112 pool->id2arch = id2arch;
00113 pool->lastarch = lastarch;
00114 }
00115
00116 unsigned char
00117 pool_arch2color_slow(Pool *pool, Id arch)
00118 {
00119 const char *s;
00120 unsigned char color;
00121
00122 if (arch > pool->lastarch)
00123 return ARCHCOLOR_ALL;
00124 if (!pool->id2color)
00125 pool->id2color = sat_calloc(pool->lastarch + 1, 1);
00126 s = id2str(pool, arch);
00127 if (arch == ARCH_NOARCH || arch == ARCH_ALL)
00128 color = ARCHCOLOR_ALL;
00129 else if (!strcmp(s, "s390x") || strstr(s, "64"))
00130 color = ARCHCOLOR_64;
00131 else
00132 color = ARCHCOLOR_32;
00133 return color;
00134 }
00135