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 case REPOKEY_TYPE_DELETED:
00130 return dp;
00131 case REPOKEY_TYPE_ID:
00132 case REPOKEY_TYPE_NUM:
00133 case REPOKEY_TYPE_DIR:
00134 while ((*dp & 0x80) != 0)
00135 dp++;
00136 return dp + 1;
00137 case REPOKEY_TYPE_U32:
00138 return dp + 4;
00139 case REPOKEY_TYPE_MD5:
00140 return dp + SIZEOF_MD5;
00141 case REPOKEY_TYPE_SHA1:
00142 return dp + SIZEOF_SHA1;
00143 case REPOKEY_TYPE_SHA256:
00144 return dp + SIZEOF_SHA256;
00145 case REPOKEY_TYPE_IDARRAY:
00146 case REPOKEY_TYPE_REL_IDARRAY:
00147 while ((*dp & 0xc0) != 0)
00148 dp++;
00149 return dp + 1;
00150 case REPOKEY_TYPE_STR:
00151 while ((*dp) != 0)
00152 dp++;
00153 return dp + 1;
00154 case REPOKEY_TYPE_BINARY:
00155 {
00156 Id len;
00157 dp = data_read_id(dp, &len);
00158 return dp + len;
00159 }
00160 case REPOKEY_TYPE_DIRSTRARRAY:
00161 for (;;)
00162 {
00163 while ((*dp & 0x80) != 0)
00164 dp++;
00165 x = *dp++;
00166 while ((*dp) != 0)
00167 dp++;
00168 dp++;
00169 if (!(x & 0x40))
00170 return dp;
00171 }
00172 case REPOKEY_TYPE_DIRNUMNUMARRAY:
00173 for (;;)
00174 {
00175 while ((*dp & 0x80) != 0)
00176 dp++;
00177 dp++;
00178 while ((*dp & 0x80) != 0)
00179 dp++;
00180 dp++;
00181 while ((*dp & 0x80) != 0)
00182 dp++;
00183 if (!(*dp & 0x40))
00184 return dp + 1;
00185 dp++;
00186 }
00187 default:
00188 return 0;
00189 }
00190 }
00191
00192 static inline unsigned char *
00193 data_skip_verify(unsigned char *dp, int type, int maxid, int maxdir)
00194 {
00195 Id id;
00196 int eof;
00197
00198 switch (type)
00199 {
00200 case REPOKEY_TYPE_VOID:
00201 case REPOKEY_TYPE_CONSTANT:
00202 case REPOKEY_TYPE_CONSTANTID:
00203 case REPOKEY_TYPE_DELETED:
00204 return dp;
00205 case REPOKEY_TYPE_NUM:
00206 while ((*dp & 0x80) != 0)
00207 dp++;
00208 return dp + 1;
00209 case REPOKEY_TYPE_U32:
00210 return dp + 4;
00211 case REPOKEY_TYPE_MD5:
00212 return dp + SIZEOF_MD5;
00213 case REPOKEY_TYPE_SHA1:
00214 return dp + SIZEOF_SHA1;
00215 case REPOKEY_TYPE_SHA256:
00216 return dp + SIZEOF_SHA256;
00217 case REPOKEY_TYPE_ID:
00218 dp = data_read_id(dp, &id);
00219 if (id >= maxid)
00220 return 0;
00221 return dp;
00222 case REPOKEY_TYPE_DIR:
00223 dp = data_read_id(dp, &id);
00224 if (id >= maxdir)
00225 return 0;
00226 return dp;
00227 case REPOKEY_TYPE_IDARRAY:
00228 for (;;)
00229 {
00230 dp = data_read_ideof(dp, &id, &eof);
00231 if (id >= maxid)
00232 return 0;
00233 if (eof)
00234 return dp;
00235 }
00236 case REPOKEY_TYPE_STR:
00237 while ((*dp) != 0)
00238 dp++;
00239 return dp + 1;
00240 case REPOKEY_TYPE_DIRSTRARRAY:
00241 for (;;)
00242 {
00243 dp = data_read_ideof(dp, &id, &eof);
00244 if (id >= maxdir)
00245 return 0;
00246 while ((*dp) != 0)
00247 dp++;
00248 dp++;
00249 if (eof)
00250 return dp;
00251 }
00252 case REPOKEY_TYPE_DIRNUMNUMARRAY:
00253 for (;;)
00254 {
00255 dp = data_read_id(dp, &id);
00256 if (id >= maxdir)
00257 return 0;
00258 while ((*dp & 0x80) != 0)
00259 dp++;
00260 dp++;
00261 while ((*dp & 0x80) != 0)
00262 dp++;
00263 if (!(*dp & 0x40))
00264 return dp + 1;
00265 dp++;
00266 }
00267 default:
00268 return 0;
00269 }
00270 }
00271
00272 #endif