repopack.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
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