- bring back dataiterator_match for now (to be removed again)
[platform/upstream/libsolv.git] / src / repopack.h
1 /*
2  * Copyright (c) 2007, Novell Inc.
3  *
4  * This program is licensed under the BSD license, read LICENSE.BSD
5  * for further information
6  */
7
8 /* pack/unpack functions for key data */
9
10 #ifndef SATSOLVER_REPOPACK_H
11 #define SATSOLVER_REPOPACK_H
12
13 static inline unsigned char *
14 data_read_id(unsigned char *dp, Id *idp)
15 {
16   Id x = 0;
17   unsigned char c;
18   for (;;)
19     {
20       c = *dp++;
21       if (!(c & 0x80))
22         {
23           *idp = (x << 7) ^ c;
24           return dp;
25         }
26       x = (x << 7) ^ c ^ 128;
27     }
28 }
29
30 static inline unsigned char *
31 data_read_ideof(unsigned char *dp, Id *idp, int *eof)
32 {
33   Id x = 0;
34   unsigned char c;
35   for (;;)
36     {
37       c = *dp++;
38       if (!(c & 0x80))
39         {
40           if (c & 0x40)
41             {
42               c ^= 0x40;
43               *eof = 0;
44             }
45           else
46             *eof = 1;
47           *idp = (x << 6) ^ c;
48           return dp;
49         }
50       x = (x << 7) ^ c ^ 128;
51     }
52 }
53
54 static inline unsigned char *
55 data_read_u32(unsigned char *dp, unsigned int *nump)
56 {
57   *nump = (dp[0] << 24) | (dp[1] << 16) | (dp[2] << 8) | dp[3];
58   return dp + 4;
59 }
60
61 static inline unsigned char *
62 data_fetch(unsigned char *dp, KeyValue *kv, Repokey *key)
63 {
64   kv->eof = 1;
65   if (!dp)
66     return 0;
67   switch (key->type)
68     {
69     case REPOKEY_TYPE_VOID:
70       return dp;
71     case REPOKEY_TYPE_CONSTANT:
72       kv->num = key->size;
73       return dp;
74     case REPOKEY_TYPE_CONSTANTID:
75       kv->id = key->size;
76       return dp;
77     case REPOKEY_TYPE_STR:
78       kv->str = (const char *)dp;
79       return dp + strlen(kv->str) + 1;
80     case REPOKEY_TYPE_ID:
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_IDARRAY:
97       return data_read_ideof(dp, &kv->id, &kv->eof);
98     case REPOKEY_TYPE_DIRSTRARRAY:
99       dp = data_read_ideof(dp, &kv->id, &kv->eof);
100       kv->str = (const char *)dp;
101       return dp + strlen(kv->str) + 1;
102     case REPOKEY_TYPE_DIRNUMNUMARRAY:
103       dp = data_read_id(dp, &kv->id);
104       dp = data_read_id(dp, &kv->num);
105       return data_read_ideof(dp, &kv->num2, &kv->eof);
106     case REPOKEY_TYPE_FIXARRAY:
107       dp = data_read_id(dp, &kv->num);
108       return data_read_id(dp, &kv->id);
109     case REPOKEY_TYPE_FLEXARRAY:
110       return data_read_id(dp, &kv->num);
111     default:
112       return 0;
113     }
114 }
115
116 static inline unsigned char *
117 data_skip(unsigned char *dp, int type)
118 {
119   unsigned char x;
120   switch (type)
121     {
122     case REPOKEY_TYPE_VOID:
123     case REPOKEY_TYPE_CONSTANT:
124     case REPOKEY_TYPE_CONSTANTID:
125       return dp;
126     case REPOKEY_TYPE_ID:
127     case REPOKEY_TYPE_NUM:
128     case REPOKEY_TYPE_DIR:
129       while ((*dp & 0x80) != 0)
130         dp++;
131       return dp + 1;
132     case REPOKEY_TYPE_U32:
133       return dp + 4;
134     case REPOKEY_TYPE_MD5:
135       return dp + SIZEOF_MD5;
136     case REPOKEY_TYPE_SHA1:
137       return dp + SIZEOF_SHA1;
138     case REPOKEY_TYPE_SHA256:
139       return dp + SIZEOF_SHA256;
140     case REPOKEY_TYPE_IDARRAY:
141     case REPOKEY_TYPE_REL_IDARRAY:
142       while ((*dp & 0xc0) != 0)
143         dp++;
144       return dp + 1;
145     case REPOKEY_TYPE_STR:
146       while ((*dp) != 0)
147         dp++;
148       return dp + 1;
149     case REPOKEY_TYPE_DIRSTRARRAY:
150       for (;;)
151         {
152           while ((*dp & 0x80) != 0)
153             dp++;
154           x = *dp++;
155           while ((*dp) != 0)
156             dp++;
157           dp++;
158           if (!(x & 0x40))
159             return dp;
160         }
161     case REPOKEY_TYPE_DIRNUMNUMARRAY:
162       for (;;)
163         {
164           while ((*dp & 0x80) != 0)
165             dp++;
166           dp++;
167           while ((*dp & 0x80) != 0)
168             dp++;
169           dp++;
170           while ((*dp & 0x80) != 0)
171             dp++;
172           if (!(*dp & 0x40))
173             return dp + 1;
174           dp++;
175         }
176     default:
177       return 0;
178     }
179 }
180
181 static inline unsigned char *
182 data_skip_verify(unsigned char *dp, int type, int maxid, int maxdir)
183 {
184   Id id;
185   int eof;
186
187   switch (type)
188     {
189     case REPOKEY_TYPE_VOID:
190     case REPOKEY_TYPE_CONSTANT:
191     case REPOKEY_TYPE_CONSTANTID:
192       return dp;
193     case REPOKEY_TYPE_NUM:
194       while ((*dp & 0x80) != 0)
195         dp++;
196       return dp + 1;
197     case REPOKEY_TYPE_U32:
198       return dp + 4;
199     case REPOKEY_TYPE_MD5:
200       return dp + SIZEOF_MD5;
201     case REPOKEY_TYPE_SHA1:
202       return dp + SIZEOF_SHA1;
203     case REPOKEY_TYPE_SHA256:
204       return dp + SIZEOF_SHA256;
205     case REPOKEY_TYPE_ID:
206       dp = data_read_id(dp, &id);
207       if (id >= maxid)
208         return 0;
209       return dp;
210     case REPOKEY_TYPE_DIR:
211       dp = data_read_id(dp, &id);
212       if (id >= maxdir)
213         return 0;
214       return dp;
215     case REPOKEY_TYPE_IDARRAY:
216       for (;;)
217         {
218           dp = data_read_ideof(dp, &id, &eof);
219           if (id >= maxid)
220             return 0;
221           if (eof)
222             return dp;
223         }
224     case REPOKEY_TYPE_STR:
225       while ((*dp) != 0)
226         dp++;
227       return dp + 1;
228     case REPOKEY_TYPE_DIRSTRARRAY:
229       for (;;)
230         {
231           dp = data_read_ideof(dp, &id, &eof);
232           if (id >= maxdir)
233             return 0;
234           while ((*dp) != 0)
235             dp++;
236           dp++;
237           if (eof)
238             return dp;
239         }
240     case REPOKEY_TYPE_DIRNUMNUMARRAY:
241       for (;;)
242         {
243           dp = data_read_id(dp, &id);
244           if (id >= maxdir)
245             return 0;
246           while ((*dp & 0x80) != 0)
247             dp++;
248           dp++;
249           while ((*dp & 0x80) != 0)
250             dp++;
251           if (!(*dp & 0x40))
252             return dp + 1;
253           dp++;
254         }
255     default:
256       return 0;
257     }
258 }
259
260 unsigned char *data_skip_key(Repodata *data, unsigned char *dp, Repokey *key);
261
262 #endif  /* SATSOLVER_REPOPACK */