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;
54 x = (x << 7) ^ (c ^ 128);
58 static inline unsigned char *
59 data_read_num64(unsigned char *dp, unsigned int *low, unsigned int *high)
61 unsigned long long int x;
72 *low = dp[0] << 7 ^ dp[1] ^ 0x4000;
77 *low = dp[0] << 14 ^ dp[1] << 7 ^ dp[2] ^ 0x204000;
82 *low = dp[0] << 21 ^ dp[1] << 14 ^ dp[2] << 7 ^ dp[3] ^ 0x10204000;
87 *low = dp[0] << 28 ^ dp[1] << 21 ^ dp[2] << 14 ^ dp[3] << 7 ^ dp[4] ^ 0x10204000;
88 *high = (dp[0] ^ 0x80) >> 4;
91 x = (unsigned long long)(dp[0] ^ 0x80) << 28 ^ (unsigned int)(dp[1] << 21 ^ dp[2] << 14 ^ dp[3] << 7 ^ dp[4] ^ 0x10204080);
103 x = (x << 7) ^ (c ^ 128);
107 static inline unsigned char *
108 data_read_ideof(unsigned char *dp, Id *idp, int *eof)
127 x = (x << 7) ^ c ^ 128;
131 static inline unsigned char *
132 data_fetch(unsigned char *dp, KeyValue *kv, Repokey *key)
139 case REPOKEY_TYPE_VOID:
140 case REPOKEY_TYPE_DELETED:
142 case REPOKEY_TYPE_CONSTANT:
146 case REPOKEY_TYPE_CONSTANTID:
149 case REPOKEY_TYPE_STR:
150 kv->str = (const char *)dp;
151 return dp + strlen(kv->str) + 1;
152 case REPOKEY_TYPE_ID:
153 case REPOKEY_TYPE_DIR:
154 return data_read_id(dp, &kv->id);
155 case REPOKEY_TYPE_NUM:
156 return data_read_num64(dp, &kv->num, &kv->num2);
157 case REPOKEY_TYPE_MD5:
158 kv->num = 0; /* not stringified yet */
159 kv->str = (const char *)dp;
160 return dp + SIZEOF_MD5;
161 case REPOKEY_TYPE_SHA1:
162 kv->num = 0; /* not stringified yet */
163 kv->str = (const char *)dp;
164 return dp + SIZEOF_SHA1;
165 case REPOKEY_TYPE_SHA224:
166 kv->num = 0; /* not stringified yet */
167 kv->str = (const char *)dp;
168 return dp + SIZEOF_SHA224;
169 case REPOKEY_TYPE_SHA256:
170 kv->num = 0; /* not stringified yet */
171 kv->str = (const char *)dp;
172 return dp + SIZEOF_SHA256;
173 case REPOKEY_TYPE_SHA384:
174 kv->num = 0; /* not stringified yet */
175 kv->str = (const char *)dp;
176 return dp + SIZEOF_SHA384;
177 case REPOKEY_TYPE_SHA512:
178 kv->num = 0; /* not stringified yet */
179 kv->str = (const char *)dp;
180 return dp + SIZEOF_SHA512;
181 case REPOKEY_TYPE_BINARY:
182 dp = data_read_id(dp, (Id *)&kv->num);
183 kv->str = (const char *)dp;
185 case REPOKEY_TYPE_IDARRAY:
186 return data_read_ideof(dp, &kv->id, &kv->eof);
187 case REPOKEY_TYPE_DIRSTRARRAY:
188 dp = data_read_ideof(dp, &kv->id, &kv->eof);
189 kv->num = 0; /* not stringified yet */
190 kv->str = (const char *)dp;
191 return dp + strlen(kv->str) + 1;
192 case REPOKEY_TYPE_DIRNUMNUMARRAY:
193 dp = data_read_id(dp, &kv->id);
194 dp = data_read_id(dp, (Id *)&kv->num);
195 return data_read_ideof(dp, (Id *)&kv->num2, &kv->eof);
196 case REPOKEY_TYPE_FIXARRAY:
197 case REPOKEY_TYPE_FLEXARRAY:
200 dp = data_read_id(dp, (Id *)&kv->num); /* number of elements */
202 return 0; /* illegal */
204 if (!kv->entry || key->type == REPOKEY_TYPE_FLEXARRAY)
205 dp = data_read_id(dp, &kv->id); /* schema */
206 kv->str = (const char *)dp;
213 static inline unsigned char *
214 data_skip(unsigned char *dp, int type)
219 case REPOKEY_TYPE_VOID:
220 case REPOKEY_TYPE_CONSTANT:
221 case REPOKEY_TYPE_CONSTANTID:
222 case REPOKEY_TYPE_DELETED:
224 case REPOKEY_TYPE_ID:
225 case REPOKEY_TYPE_NUM:
226 case REPOKEY_TYPE_DIR:
227 while ((*dp & 0x80) != 0)
230 case REPOKEY_TYPE_MD5:
231 return dp + SIZEOF_MD5;
232 case REPOKEY_TYPE_SHA1:
233 return dp + SIZEOF_SHA1;
234 case REPOKEY_TYPE_SHA224:
235 return dp + SIZEOF_SHA224;
236 case REPOKEY_TYPE_SHA256:
237 return dp + SIZEOF_SHA256;
238 case REPOKEY_TYPE_SHA384:
239 return dp + SIZEOF_SHA384;
240 case REPOKEY_TYPE_SHA512:
241 return dp + SIZEOF_SHA512;
242 case REPOKEY_TYPE_IDARRAY:
243 case REPOKEY_TYPE_REL_IDARRAY:
244 while ((*dp & 0xc0) != 0)
247 case REPOKEY_TYPE_STR:
251 case REPOKEY_TYPE_BINARY:
254 dp = data_read_id(dp, (Id *)&len);
257 case REPOKEY_TYPE_DIRSTRARRAY:
260 while ((*dp & 0x80) != 0)
269 case REPOKEY_TYPE_DIRNUMNUMARRAY:
272 while ((*dp & 0x80) != 0)
275 while ((*dp & 0x80) != 0)
278 while ((*dp & 0x80) != 0)
289 #endif /* LIBSOLV_REPOPACK */