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 "armv7l", "armv7l:armv6l:armv5tejl:armv5tel:armv5l:armv4tl:armv4l:armv3l",
00035 "armv6l", "armv6l:armv5tejl:armv5tel:armv5l:armv4tl:armv4l:armv3l",
00036 "armv5tejl", "armv5tejl:armv5tel:armv5l:armv4tl:armv4l:armv3l",
00037 "armv5tel", "armv5tel:armv5l:armv4tl:armv4l:armv3l",
00038 "armv5l", "armv5l:armv4tl:armv4l:armv3l",
00039 "armv4tl", "armv4tl:armv4l:armv3l",
00040 "armv4l", "armv4l:armv3l",
00041 "armv3l", "armv3l",
00042 "sh3", "sh3",
00043 "sh4", "sh4",
00044 "sh4a", "sh4a:sh4",
00045 "sparc64v", "sparc64v:sparc64:sparcv9v:sparcv9:sparcv8:sparc",
00046 "sparc64", "sparc64:sparcv9:sparcv8:sparc",
00047 "sparcv9v", "sparcv9v:sparcv9:sparcv8:sparc",
00048 "sparcv9", "sparcv9:sparcv8:sparc",
00049 "sparcv8", "sparcv8:sparc",
00050 "sparc", "sparc",
00051 0
00052 };
00053
00054 void
00055 pool_setarch(Pool *pool, const char *arch)
00056 {
00057 const char *a;
00058 unsigned int score = 0x10001;
00059 size_t l;
00060 char d;
00061 int i;
00062 Id *id2arch;
00063 Id id, lastarch;
00064
00065 pool->id2arch = sat_free(pool->id2arch);
00066 pool->id2color = sat_free(pool->id2color);
00067 if (!arch)
00068 {
00069 pool->lastarch = 0;
00070 return;
00071 }
00072 #ifndef DEBIAN_SEMANTICS
00073 id = ARCH_NOARCH;
00074 #else
00075 id = ARCH_ALL;
00076 #endif
00077 lastarch = id + 255;
00078 id2arch = sat_calloc(lastarch + 1, sizeof(Id));
00079 id2arch[id] = 1;
00080
00081 a = "";
00082 for (i = 0; archpolicies[i]; i += 2)
00083 if (!strcmp(archpolicies[i], arch))
00084 break;
00085 if (archpolicies[i])
00086 a = archpolicies[i + 1];
00087 d = 0;
00088 while (*a)
00089 {
00090 l = strcspn(a, ":=>");
00091 if (l)
00092 {
00093 id = strn2id(pool, a, l, 1);
00094 if (id > lastarch)
00095 {
00096 id2arch = sat_realloc(id2arch, (id + 255 + 1) * sizeof(Id));
00097 memset(id2arch + lastarch + 1, 0, (id + 255 - lastarch) * sizeof(Id));
00098 lastarch = id + 255;
00099 }
00100 if (id2arch[id] == 0)
00101 {
00102 if (d == ':')
00103 score += 0x10000;
00104 else if (d == '>')
00105 score += 0x00001;
00106 id2arch[id] = score;
00107 }
00108 }
00109 a += l;
00110 if ((d = *a++) == 0)
00111 break;
00112 }
00113 pool->id2arch = id2arch;
00114 pool->lastarch = lastarch;
00115 }
00116
00117 unsigned char
00118 pool_arch2color_slow(Pool *pool, Id arch)
00119 {
00120 const char *s;
00121 unsigned char color;
00122
00123 if (arch > pool->lastarch)
00124 return ARCHCOLOR_ALL;
00125 if (!pool->id2color)
00126 pool->id2color = sat_calloc(pool->lastarch + 1, 1);
00127 s = id2str(pool, arch);
00128 if (arch == ARCH_NOARCH || arch == ARCH_ALL)
00129 color = ARCHCOLOR_ALL;
00130 else if (!strcmp(s, "s390x") || strstr(s, "64"))
00131 color = ARCHCOLOR_64;
00132 else
00133 color = ARCHCOLOR_32;
00134 return color;
00135 }
00136