repopack.h

Go to the documentation of this file.
00001 /*
00002  * Copyright (c) 2007, Novell Inc.
00003  *
00004  * This program is licensed under the BSD license, read LICENSE.BSD
00005  * for further information
00006  */
00007 
00008 /* pack/unpack functions for key data */
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       return dp;
00130     case REPOKEY_TYPE_ID:
00131     case REPOKEY_TYPE_NUM:
00132     case REPOKEY_TYPE_DIR:
00133       while ((*dp & 0x80) != 0)
00134         dp++;
00135       return dp + 1;
00136     case REPOKEY_TYPE_U32:
00137       return dp + 4;
00138     case REPOKEY_TYPE_MD5:
00139       return dp + SIZEOF_MD5;
00140     case REPOKEY_TYPE_SHA1:
00141       return dp + SIZEOF_SHA1;
00142     case REPOKEY_TYPE_SHA256:
00143       return dp + SIZEOF_SHA256;
00144     case REPOKEY_TYPE_IDARRAY:
00145     case REPOKEY_TYPE_REL_IDARRAY:
00146       while ((*dp & 0xc0) != 0)
00147         dp++;
00148       return dp + 1;
00149     case REPOKEY_TYPE_STR:
00150       while ((*dp) != 0)
00151         dp++;
00152       return dp + 1;
00153     case REPOKEY_TYPE_BINARY:
00154       {
00155         Id len;
00156         dp = data_read_id(dp, &len);
00157         return dp + len;
00158       }
00159     case REPOKEY_TYPE_DIRSTRARRAY:
00160       for (;;)
00161         {
00162           while ((*dp & 0x80) != 0)
00163             dp++;
00164           x = *dp++;
00165           while ((*dp) != 0)
00166             dp++;
00167           dp++;
00168           if (!(x & 0x40))
00169             return dp;
00170         }
00171     case REPOKEY_TYPE_DIRNUMNUMARRAY:
00172       for (;;)
00173         {
00174           while ((*dp & 0x80) != 0)
00175             dp++;
00176           dp++;
00177           while ((*dp & 0x80) != 0)
00178             dp++;
00179           dp++;
00180           while ((*dp & 0x80) != 0)
00181             dp++;
00182           if (!(*dp & 0x40))
00183             return dp + 1;
00184           dp++;
00185         }
00186     default:
00187       return 0;
00188     }
00189 }
00190 
00191 static inline unsigned char *
00192 data_skip_verify(unsigned char *dp, int type, int maxid, int maxdir)
00193 {
00194   Id id;
00195   int eof;
00196 
00197   switch (type)
00198     {
00199     case REPOKEY_TYPE_VOID:
00200     case REPOKEY_TYPE_CONSTANT:
00201     case REPOKEY_TYPE_CONSTANTID:
00202       return dp;
00203     case REPOKEY_TYPE_NUM:
00204       while ((*dp & 0x80) != 0)
00205         dp++;
00206       return dp + 1;
00207     case REPOKEY_TYPE_U32:
00208       return dp + 4;
00209     case REPOKEY_TYPE_MD5:
00210       return dp + SIZEOF_MD5;
00211     case REPOKEY_TYPE_SHA1:
00212       return dp + SIZEOF_SHA1;
00213     case REPOKEY_TYPE_SHA256:
00214       return dp + SIZEOF_SHA256;
00215     case REPOKEY_TYPE_ID:
00216       dp = data_read_id(dp, &id);
00217       if (id >= maxid)
00218         return 0;
00219       return dp;
00220     case REPOKEY_TYPE_DIR:
00221       dp = data_read_id(dp, &id);
00222       if (id >= maxdir)
00223         return 0;
00224       return dp;
00225     case REPOKEY_TYPE_IDARRAY:
00226       for (;;)
00227         {
00228           dp = data_read_ideof(dp, &id, &eof);
00229           if (id >= maxid)
00230             return 0;
00231           if (eof)
00232             return dp;
00233         }
00234     case REPOKEY_TYPE_STR:
00235       while ((*dp) != 0)
00236         dp++;
00237       return dp + 1;
00238     case REPOKEY_TYPE_DIRSTRARRAY:
00239       for (;;)
00240         {
00241           dp = data_read_ideof(dp, &id, &eof);
00242           if (id >= maxdir)
00243             return 0;
00244           while ((*dp) != 0)
00245             dp++;
00246           dp++;
00247           if (eof)
00248             return dp;
00249         }
00250     case REPOKEY_TYPE_DIRNUMNUMARRAY:
00251       for (;;)
00252         {
00253           dp = data_read_id(dp, &id);
00254           if (id >= maxdir)
00255             return 0;
00256           while ((*dp & 0x80) != 0)
00257             dp++;
00258           dp++;
00259           while ((*dp & 0x80) != 0)
00260             dp++;
00261           if (!(*dp & 0x40))
00262             return dp + 1;
00263           dp++;
00264         }
00265     default:
00266       return 0;
00267     }
00268 }
00269 
00270 unsigned char *data_skip_key(Repodata *data, unsigned char *dp, Repokey *key);
00271 
00272 #endif  /* SATSOLVER_REPOPACK */
Generated on Mon Dec 12 11:44:12 2011 for satsolver by  doxygen 1.6.3