2 * Copyright (c) 2007, Novell Inc.
4 * This program is licensed under the BSD license, read LICENSE.BSD
5 * for further information
8 /* pack/unpack functions for key data */
10 #ifndef LIBSOLV_REPOPACK_H
11 #define LIBSOLV_REPOPACK_H
13 static inline unsigned char *
14 data_read_id(unsigned char *dp, Id *idp)
25 *idp = dp[0] << 7 ^ dp[1] ^ 0x4000;
30 *idp = dp[0] << 14 ^ dp[1] << 7 ^ dp[2] ^ 0x204000;
35 *idp = dp[0] << 21 ^ dp[1] << 14 ^ dp[2] << 7 ^ dp[3] ^ 0x10204000;
38 x = dp[0] << 28 ^ dp[1] << 21 ^ dp[2] << 14 ^ dp[3] << 7 ^ dp[4] ^ 0x10204000;
53 x = (x << 7) ^ (c ^ 128);
57 static inline unsigned char *
58 data_read_num64(unsigned char *dp, unsigned int *low, unsigned int *high)
60 unsigned long long int x;
71 *low = dp[0] << 7 ^ dp[1] ^ 0x4000;
76 *low = dp[0] << 14 ^ dp[1] << 7 ^ dp[2] ^ 0x204000;
81 *low = dp[0] << 21 ^ dp[1] << 14 ^ dp[2] << 7 ^ dp[3] ^ 0x10204000;
86 *low = dp[0] << 28 ^ dp[1] << 21 ^ dp[2] << 14 ^ dp[3] << 7 ^ dp[4] ^ 0x10204000;
87 *high = (dp[0] ^ 0x80) >> 4;
90 x = (unsigned long long)(dp[0] ^ 0x80) << 28 ^ (unsigned int)(dp[1] << 21 ^ dp[2] << 14 ^ dp[3] << 7 ^ dp[4] ^ 0x10204000);
102 x = (x << 7) ^ (c ^ 128);
106 static inline unsigned char *
107 data_read_ideof(unsigned char *dp, Id *idp, int *eof)
126 x = (x << 7) ^ c ^ 128;
130 static inline unsigned char *
131 data_read_u32(unsigned char *dp, unsigned int *nump)
133 *nump = (dp[0] << 24) | (dp[1] << 16) | (dp[2] << 8) | dp[3];
137 static inline unsigned char *
138 data_fetch(unsigned char *dp, KeyValue *kv, Repokey *key)
145 case REPOKEY_TYPE_VOID:
147 case REPOKEY_TYPE_CONSTANT:
151 case REPOKEY_TYPE_CONSTANTID:
154 case REPOKEY_TYPE_STR:
155 kv->str = (const char *)dp;
156 return dp + strlen(kv->str) + 1;
157 case REPOKEY_TYPE_ID:
158 case REPOKEY_TYPE_DIR:
159 return data_read_id(dp, &kv->id);
160 case REPOKEY_TYPE_NUM:
161 return data_read_num64(dp, &kv->num, &kv->num2);
162 case REPOKEY_TYPE_U32:
164 return data_read_u32(dp, &kv->num);
165 case REPOKEY_TYPE_MD5:
166 kv->str = (const char *)dp;
167 return dp + SIZEOF_MD5;
168 case REPOKEY_TYPE_SHA1:
169 kv->str = (const char *)dp;
170 return dp + SIZEOF_SHA1;
171 case REPOKEY_TYPE_SHA256:
172 kv->str = (const char *)dp;
173 return dp + SIZEOF_SHA256;
174 case REPOKEY_TYPE_BINARY:
175 dp = data_read_id(dp, (Id *)&kv->num);
176 kv->str = (const char *)dp;
178 case REPOKEY_TYPE_IDARRAY:
179 return data_read_ideof(dp, &kv->id, &kv->eof);
180 case REPOKEY_TYPE_DIRSTRARRAY:
181 dp = data_read_ideof(dp, &kv->id, &kv->eof);
182 kv->str = (const char *)dp;
183 return dp + strlen(kv->str) + 1;
184 case REPOKEY_TYPE_DIRNUMNUMARRAY:
185 dp = data_read_id(dp, &kv->id);
186 dp = data_read_id(dp, (Id *)&kv->num);
187 return data_read_ideof(dp, (Id *)&kv->num2, &kv->eof);
188 case REPOKEY_TYPE_FIXARRAY:
189 dp = data_read_id(dp, (Id *)&kv->num);
190 return data_read_id(dp, &kv->id);
191 case REPOKEY_TYPE_FLEXARRAY:
192 return data_read_id(dp, (Id *)&kv->num);
198 static inline unsigned char *
199 data_skip(unsigned char *dp, int type)
204 case REPOKEY_TYPE_VOID:
205 case REPOKEY_TYPE_CONSTANT:
206 case REPOKEY_TYPE_CONSTANTID:
207 case REPOKEY_TYPE_DELETED:
209 case REPOKEY_TYPE_ID:
210 case REPOKEY_TYPE_NUM:
211 case REPOKEY_TYPE_DIR:
212 while ((*dp & 0x80) != 0)
215 case REPOKEY_TYPE_U32:
217 case REPOKEY_TYPE_MD5:
218 return dp + SIZEOF_MD5;
219 case REPOKEY_TYPE_SHA1:
220 return dp + SIZEOF_SHA1;
221 case REPOKEY_TYPE_SHA256:
222 return dp + SIZEOF_SHA256;
223 case REPOKEY_TYPE_IDARRAY:
224 case REPOKEY_TYPE_REL_IDARRAY:
225 while ((*dp & 0xc0) != 0)
228 case REPOKEY_TYPE_STR:
232 case REPOKEY_TYPE_BINARY:
235 dp = data_read_id(dp, (Id *)&len);
238 case REPOKEY_TYPE_DIRSTRARRAY:
241 while ((*dp & 0x80) != 0)
250 case REPOKEY_TYPE_DIRNUMNUMARRAY:
253 while ((*dp & 0x80) != 0)
256 while ((*dp & 0x80) != 0)
259 while ((*dp & 0x80) != 0)
270 static inline unsigned char *
271 data_skip_verify(unsigned char *dp, int type, int maxid, int maxdir)
278 case REPOKEY_TYPE_VOID:
279 case REPOKEY_TYPE_CONSTANT:
280 case REPOKEY_TYPE_CONSTANTID:
281 case REPOKEY_TYPE_DELETED:
283 case REPOKEY_TYPE_NUM:
284 while ((*dp & 0x80) != 0)
287 case REPOKEY_TYPE_U32:
289 case REPOKEY_TYPE_MD5:
290 return dp + SIZEOF_MD5;
291 case REPOKEY_TYPE_SHA1:
292 return dp + SIZEOF_SHA1;
293 case REPOKEY_TYPE_SHA256:
294 return dp + SIZEOF_SHA256;
295 case REPOKEY_TYPE_ID:
296 dp = data_read_id(dp, &id);
300 case REPOKEY_TYPE_DIR:
301 dp = data_read_id(dp, &id);
305 case REPOKEY_TYPE_IDARRAY:
308 dp = data_read_ideof(dp, &id, &eof);
314 case REPOKEY_TYPE_STR:
318 case REPOKEY_TYPE_BINARY:
321 dp = data_read_id(dp, (Id *)&len);
324 case REPOKEY_TYPE_DIRSTRARRAY:
327 dp = data_read_ideof(dp, &id, &eof);
336 case REPOKEY_TYPE_DIRNUMNUMARRAY:
339 dp = data_read_id(dp, &id);
342 while ((*dp & 0x80) != 0)
345 while ((*dp & 0x80) != 0)
356 #endif /* LIBSOLV_REPOPACK */