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

Generated on Mon Dec 15 17:56:24 2014 for satsolver by  doxygen 1.5.6