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 SATSOLVER_REPOPACK_H
11 #define SATSOLVER_REPOPACK_H
13 static inline unsigned char *
14 data_read_id(unsigned char *dp, Id *idp)
26 x = (x << 7) ^ c ^ 128;
30 static inline unsigned char *
31 data_read_ideof(unsigned char *dp, Id *idp, int *eof)
50 x = (x << 7) ^ c ^ 128;
54 static inline unsigned char *
55 data_read_u32(unsigned char *dp, unsigned int *nump)
57 *nump = (dp[0] << 24) | (dp[1] << 16) | (dp[2] << 8) | dp[3];
61 static inline unsigned char *
62 data_fetch(unsigned char *dp, KeyValue *kv, Repokey *key)
69 case REPOKEY_TYPE_VOID:
71 case REPOKEY_TYPE_CONSTANT:
74 case REPOKEY_TYPE_CONSTANTID:
77 case REPOKEY_TYPE_STR:
78 kv->str = (const char *)dp;
79 return dp + strlen(kv->str) + 1;
81 case REPOKEY_TYPE_DIR:
82 return data_read_id(dp, &kv->id);
83 case REPOKEY_TYPE_NUM:
84 return data_read_id(dp, &kv->num);
85 case REPOKEY_TYPE_U32:
86 return data_read_u32(dp, (unsigned int *)&kv->num);
87 case REPOKEY_TYPE_MD5:
88 kv->str = (const char *)dp;
89 return dp + SIZEOF_MD5;
90 case REPOKEY_TYPE_SHA1:
91 kv->str = (const char *)dp;
92 return dp + SIZEOF_SHA1;
93 case REPOKEY_TYPE_SHA256:
94 kv->str = (const char *)dp;
95 return dp + SIZEOF_SHA256;
96 case REPOKEY_TYPE_BINARY:
97 dp = data_read_id(dp, &kv->num);
98 kv->str = (const char *)dp;
100 case REPOKEY_TYPE_IDARRAY:
101 return data_read_ideof(dp, &kv->id, &kv->eof);
102 case REPOKEY_TYPE_DIRSTRARRAY:
103 dp = data_read_ideof(dp, &kv->id, &kv->eof);
104 kv->str = (const char *)dp;
105 return dp + strlen(kv->str) + 1;
106 case REPOKEY_TYPE_DIRNUMNUMARRAY:
107 dp = data_read_id(dp, &kv->id);
108 dp = data_read_id(dp, &kv->num);
109 return data_read_ideof(dp, &kv->num2, &kv->eof);
110 case REPOKEY_TYPE_FIXARRAY:
111 dp = data_read_id(dp, &kv->num);
112 return data_read_id(dp, &kv->id);
113 case REPOKEY_TYPE_FLEXARRAY:
114 return data_read_id(dp, &kv->num);
120 static inline unsigned char *
121 data_skip(unsigned char *dp, int type)
126 case REPOKEY_TYPE_VOID:
127 case REPOKEY_TYPE_CONSTANT:
128 case REPOKEY_TYPE_CONSTANTID:
130 case REPOKEY_TYPE_ID:
131 case REPOKEY_TYPE_NUM:
132 case REPOKEY_TYPE_DIR:
133 while ((*dp & 0x80) != 0)
136 case REPOKEY_TYPE_U32:
138 case REPOKEY_TYPE_MD5:
139 return dp + SIZEOF_MD5;
140 case REPOKEY_TYPE_SHA1:
141 return dp + SIZEOF_SHA1;
142 case REPOKEY_TYPE_SHA256:
143 return dp + SIZEOF_SHA256;
144 case REPOKEY_TYPE_IDARRAY:
145 case REPOKEY_TYPE_REL_IDARRAY:
146 while ((*dp & 0xc0) != 0)
149 case REPOKEY_TYPE_STR:
153 case REPOKEY_TYPE_BINARY:
156 dp = data_read_id(dp, &len);
159 case REPOKEY_TYPE_DIRSTRARRAY:
162 while ((*dp & 0x80) != 0)
171 case REPOKEY_TYPE_DIRNUMNUMARRAY:
174 while ((*dp & 0x80) != 0)
177 while ((*dp & 0x80) != 0)
180 while ((*dp & 0x80) != 0)
191 static inline unsigned char *
192 data_skip_verify(unsigned char *dp, int type, int maxid, int maxdir)
199 case REPOKEY_TYPE_VOID:
200 case REPOKEY_TYPE_CONSTANT:
201 case REPOKEY_TYPE_CONSTANTID:
203 case REPOKEY_TYPE_NUM:
204 while ((*dp & 0x80) != 0)
207 case REPOKEY_TYPE_U32:
209 case REPOKEY_TYPE_MD5:
210 return dp + SIZEOF_MD5;
211 case REPOKEY_TYPE_SHA1:
212 return dp + SIZEOF_SHA1;
213 case REPOKEY_TYPE_SHA256:
214 return dp + SIZEOF_SHA256;
215 case REPOKEY_TYPE_ID:
216 dp = data_read_id(dp, &id);
220 case REPOKEY_TYPE_DIR:
221 dp = data_read_id(dp, &id);
225 case REPOKEY_TYPE_IDARRAY:
228 dp = data_read_ideof(dp, &id, &eof);
234 case REPOKEY_TYPE_STR:
238 case REPOKEY_TYPE_DIRSTRARRAY:
241 dp = data_read_ideof(dp, &id, &eof);
250 case REPOKEY_TYPE_DIRNUMNUMARRAY:
253 dp = data_read_id(dp, &id);
256 while ((*dp & 0x80) != 0)
259 while ((*dp & 0x80) != 0)
270 unsigned char *data_skip_key(Repodata *data, unsigned char *dp, Repokey *key);
272 #endif /* SATSOLVER_REPOPACK */