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 /* pack/unpack functions for key data */ 00009 00010 #ifndef SATSOLVER_REPOPACK_H 00011 #define SATSOLVER_REPOPACK_H 00012 00013 static inline unsigned char * 00014 data_read_id(unsigned char *dp, Id *idp) 00015 { 00016 Id x = 0; 00017 unsigned char c; 00018 for (;;) 00019 { 00020 c = *dp++; 00021 if (!(c & 0x80)) 00022 { 00023 *idp = (x << 7) ^ c; 00024 return dp; 00025 } 00026 x = (x << 7) ^ c ^ 128; 00027 } 00028 } 00029 00030 static inline unsigned char * 00031 data_read_ideof(unsigned char *dp, Id *idp, int *eof) 00032 { 00033 Id x = 0; 00034 unsigned char c; 00035 for (;;) 00036 { 00037 c = *dp++; 00038 if (!(c & 0x80)) 00039 { 00040 if (c & 0x40) 00041 { 00042 c ^= 0x40; 00043 *eof = 0; 00044 } 00045 else 00046 *eof = 1; 00047 *idp = (x << 6) ^ c; 00048 return dp; 00049 } 00050 x = (x << 7) ^ c ^ 128; 00051 } 00052 } 00053 00054 static inline unsigned char * 00055 data_read_u32(unsigned char *dp, unsigned int *nump) 00056 { 00057 *nump = (dp[0] << 24) | (dp[1] << 16) | (dp[2] << 8) | dp[3]; 00058 return dp + 4; 00059 } 00060 00061 static inline unsigned char * 00062 data_fetch(unsigned char *dp, KeyValue *kv, Repokey *key) 00063 { 00064 kv->eof = 1; 00065 if (!dp) 00066 return 0; 00067 switch (key->type) 00068 { 00069 case REPOKEY_TYPE_VOID: 00070 return dp; 00071 case REPOKEY_TYPE_CONSTANT: 00072 kv->num = key->size; 00073 return dp; 00074 case REPOKEY_TYPE_CONSTANTID: 00075 kv->id = key->size; 00076 return dp; 00077 case REPOKEY_TYPE_STR: 00078 kv->str = (const char *)dp; 00079 return dp + strlen(kv->str) + 1; 00080 case REPOKEY_TYPE_ID: 00081 case REPOKEY_TYPE_DIR: 00082 return data_read_id(dp, &kv->id); 00083 case REPOKEY_TYPE_NUM: 00084 return data_read_id(dp, &kv->num); 00085 case REPOKEY_TYPE_U32: 00086 return data_read_u32(dp, (unsigned int *)&kv->num); 00087 case REPOKEY_TYPE_MD5: 00088 kv->str = (const char *)dp; 00089 return dp + SIZEOF_MD5; 00090 case REPOKEY_TYPE_SHA1: 00091 kv->str = (const char *)dp; 00092 return dp + SIZEOF_SHA1; 00093 case REPOKEY_TYPE_SHA256: 00094 kv->str = (const char *)dp; 00095 return dp + SIZEOF_SHA256; 00096 case REPOKEY_TYPE_BINARY: 00097 dp = data_read_id(dp, &kv->num); 00098 kv->str = (const char *)dp; 00099 return dp + kv->num; 00100 case REPOKEY_TYPE_IDARRAY: 00101 return data_read_ideof(dp, &kv->id, &kv->eof); 00102 case REPOKEY_TYPE_DIRSTRARRAY: 00103 dp = data_read_ideof(dp, &kv->id, &kv->eof); 00104 kv->str = (const char *)dp; 00105 return dp + strlen(kv->str) + 1; 00106 case REPOKEY_TYPE_DIRNUMNUMARRAY: 00107 dp = data_read_id(dp, &kv->id); 00108 dp = data_read_id(dp, &kv->num); 00109 return data_read_ideof(dp, &kv->num2, &kv->eof); 00110 case REPOKEY_TYPE_FIXARRAY: 00111 dp = data_read_id(dp, &kv->num); 00112 return data_read_id(dp, &kv->id); 00113 case REPOKEY_TYPE_FLEXARRAY: 00114 return data_read_id(dp, &kv->num); 00115 default: 00116 return 0; 00117 } 00118 } 00119 00120 static inline unsigned char * 00121 data_skip(unsigned char *dp, int type) 00122 { 00123 unsigned char x; 00124 switch (type) 00125 { 00126 case REPOKEY_TYPE_VOID: 00127 case REPOKEY_TYPE_CONSTANT: 00128 case REPOKEY_TYPE_CONSTANTID: 00129 return dp; 00130 case REPOKEY_TYPE_ID: 00131 case REPOKEY_TYPE_NUM: 00132 case REPOKEY_TYPE_DIR: 00133 while ((*dp & 0x80) != 0) 00134 dp++; 00135 return dp + 1; 00136 case REPOKEY_TYPE_U32: 00137 return dp + 4; 00138 case REPOKEY_TYPE_MD5: 00139 return dp + SIZEOF_MD5; 00140 case REPOKEY_TYPE_SHA1: 00141 return dp + SIZEOF_SHA1; 00142 case REPOKEY_TYPE_SHA256: 00143 return dp + SIZEOF_SHA256; 00144 case REPOKEY_TYPE_IDARRAY: 00145 case REPOKEY_TYPE_REL_IDARRAY: 00146 while ((*dp & 0xc0) != 0) 00147 dp++; 00148 return dp + 1; 00149 case REPOKEY_TYPE_STR: 00150 while ((*dp) != 0) 00151 dp++; 00152 return dp + 1; 00153 case REPOKEY_TYPE_BINARY: 00154 { 00155 Id len; 00156 dp = data_read_id(dp, &len); 00157 return dp + len; 00158 } 00159 case REPOKEY_TYPE_DIRSTRARRAY: 00160 for (;;) 00161 { 00162 while ((*dp & 0x80) != 0) 00163 dp++; 00164 x = *dp++; 00165 while ((*dp) != 0) 00166 dp++; 00167 dp++; 00168 if (!(x & 0x40)) 00169 return dp; 00170 } 00171 case REPOKEY_TYPE_DIRNUMNUMARRAY: 00172 for (;;) 00173 { 00174 while ((*dp & 0x80) != 0) 00175 dp++; 00176 dp++; 00177 while ((*dp & 0x80) != 0) 00178 dp++; 00179 dp++; 00180 while ((*dp & 0x80) != 0) 00181 dp++; 00182 if (!(*dp & 0x40)) 00183 return dp + 1; 00184 dp++; 00185 } 00186 default: 00187 return 0; 00188 } 00189 } 00190 00191 static inline unsigned char * 00192 data_skip_verify(unsigned char *dp, int type, int maxid, int maxdir) 00193 { 00194 Id id; 00195 int eof; 00196 00197 switch (type) 00198 { 00199 case REPOKEY_TYPE_VOID: 00200 case REPOKEY_TYPE_CONSTANT: 00201 case REPOKEY_TYPE_CONSTANTID: 00202 return dp; 00203 case REPOKEY_TYPE_NUM: 00204 while ((*dp & 0x80) != 0) 00205 dp++; 00206 return dp + 1; 00207 case REPOKEY_TYPE_U32: 00208 return dp + 4; 00209 case REPOKEY_TYPE_MD5: 00210 return dp + SIZEOF_MD5; 00211 case REPOKEY_TYPE_SHA1: 00212 return dp + SIZEOF_SHA1; 00213 case REPOKEY_TYPE_SHA256: 00214 return dp + SIZEOF_SHA256; 00215 case REPOKEY_TYPE_ID: 00216 dp = data_read_id(dp, &id); 00217 if (id >= maxid) 00218 return 0; 00219 return dp; 00220 case REPOKEY_TYPE_DIR: 00221 dp = data_read_id(dp, &id); 00222 if (id >= maxdir) 00223 return 0; 00224 return dp; 00225 case REPOKEY_TYPE_IDARRAY: 00226 for (;;) 00227 { 00228 dp = data_read_ideof(dp, &id, &eof); 00229 if (id >= maxid) 00230 return 0; 00231 if (eof) 00232 return dp; 00233 } 00234 case REPOKEY_TYPE_STR: 00235 while ((*dp) != 0) 00236 dp++; 00237 return dp + 1; 00238 case REPOKEY_TYPE_DIRSTRARRAY: 00239 for (;;) 00240 { 00241 dp = data_read_ideof(dp, &id, &eof); 00242 if (id >= maxdir) 00243 return 0; 00244 while ((*dp) != 0) 00245 dp++; 00246 dp++; 00247 if (eof) 00248 return dp; 00249 } 00250 case REPOKEY_TYPE_DIRNUMNUMARRAY: 00251 for (;;) 00252 { 00253 dp = data_read_id(dp, &id); 00254 if (id >= maxdir) 00255 return 0; 00256 while ((*dp & 0x80) != 0) 00257 dp++; 00258 dp++; 00259 while ((*dp & 0x80) != 0) 00260 dp++; 00261 if (!(*dp & 0x40)) 00262 return dp + 1; 00263 dp++; 00264 } 00265 default: 00266 return 0; 00267 } 00268 } 00269 00270 unsigned char *data_skip_key(Repodata *data, unsigned char *dp, Repokey *key); 00271 00272 #endif /* SATSOLVER_REPOPACK */