satsolver 0.16.3
|
00001 /* 00002 * Copyright (c) 2007, Novell Inc. 00003 * 00004 * This program is licensed under the BSD license, read LICENSE.BSD 00005 * for further information 00006 */ 00007 00008 /* 00009 * poolarch.c 00010 * 00011 * create architecture policies 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