support SOLVER_FLAG_DUP_ALLOW* flags in solver_set_flags and bindings
[platform/upstream/libsolv.git] / src / repopack.h
index 14e3bd8..d75e61a 100644 (file)
@@ -7,14 +7,42 @@
 
 /* pack/unpack functions for key data */
 
-#ifndef SATSOLVER_REPOPACK_H
-#define SATSOLVER_REPOPACK_H
+#ifndef LIBSOLV_REPOPACK_H
+#define LIBSOLV_REPOPACK_H
 
 static inline unsigned char *
 data_read_id(unsigned char *dp, Id *idp)
 {
-  Id x = 0;
+  Id x;
   unsigned char c;
+  if (!(dp[0] & 0x80))
+    {
+      *idp = dp[0];
+      return dp + 1;
+    }
+  if (!(dp[1] & 0x80))
+    {
+      *idp = dp[0] << 7 ^ dp[1] ^ 0x4000;
+      return dp + 2;
+    }
+  if (!(dp[2] & 0x80))
+    {
+      *idp = dp[0] << 14 ^ dp[1] << 7 ^ dp[2] ^ 0x204000;
+      return dp + 3;
+    }
+  if (!(dp[3] & 0x80))
+    {
+      *idp = dp[0] << 21 ^ dp[1] << 14 ^ dp[2] << 7 ^ dp[3] ^ 0x10204000;
+      return dp + 4;
+    }
+  x = dp[0] << 28 ^ dp[1] << 21 ^ dp[2] << 14 ^ dp[3] << 7 ^ dp[4] ^ 0x10204000;
+  if (!(dp[4] & 0x80))
+    {
+      *idp = x;
+      return dp + 5;
+    }
+  x ^= 80;
+  dp += 5;
   for (;;)
     {
       c = *dp++;
@@ -23,7 +51,56 @@ data_read_id(unsigned char *dp, Id *idp)
           *idp = (x << 7) ^ c;
           return dp;
         }
-      x = (x << 7) ^ c ^ 128;
+      x = (x << 7) ^ (c ^ 128);
+    }
+}
+
+static inline unsigned char *
+data_read_num64(unsigned char *dp, unsigned int *low, unsigned int *high)
+{
+  unsigned long long int x;
+  unsigned char c;
+
+  *high = 0;
+  if (!(dp[0] & 0x80))
+    {
+      *low = dp[0];
+      return dp + 1;
+    }
+  if (!(dp[1] & 0x80))
+    {
+      *low = dp[0] << 7 ^ dp[1] ^ 0x4000;
+      return dp + 2;
+    }
+  if (!(dp[2] & 0x80))
+    {
+      *low = dp[0] << 14 ^ dp[1] << 7 ^ dp[2] ^ 0x204000;
+      return dp + 3;
+    }
+  if (!(dp[3] & 0x80))
+    {
+      *low = dp[0] << 21 ^ dp[1] << 14 ^ dp[2] << 7 ^ dp[3] ^ 0x10204000;
+      return dp + 4;
+    }
+  if (!(dp[4] & 0x80))
+    {
+      *low = dp[0] << 28 ^ dp[1] << 21 ^ dp[2] << 14 ^ dp[3] << 7 ^ dp[4] ^ 0x10204000;
+      *high = (dp[0] ^ 0x80) >> 4;
+      return dp + 5;
+    }
+  x = (unsigned long long)(dp[0] ^ 0x80) << 28 ^ (unsigned int)(dp[1] << 21 ^ dp[2] << 14 ^ dp[3] << 7 ^ dp[4] ^ 0x10204080);
+  dp += 5;
+  for (;;)
+    {
+      c = *dp++;
+      if (!(c & 0x80))
+       {
+         x = (x << 7) ^ c;
+         *low = x;
+         *high = x >> 32;
+         return dp;
+       }
+      x = (x << 7) ^ (c ^ 128);
     }
 }
 
@@ -69,6 +146,7 @@ data_fetch(unsigned char *dp, KeyValue *kv, Repokey *key)
     case REPOKEY_TYPE_VOID:
       return dp;
     case REPOKEY_TYPE_CONSTANT:
+      kv->num2 = 0;
       kv->num = key->size;
       return dp;
     case REPOKEY_TYPE_CONSTANTID:
@@ -81,28 +159,42 @@ data_fetch(unsigned char *dp, KeyValue *kv, Repokey *key)
     case REPOKEY_TYPE_DIR:
       return data_read_id(dp, &kv->id);
     case REPOKEY_TYPE_NUM:
-      return data_read_id(dp, &kv->num);
+      return data_read_num64(dp, &kv->num, &kv->num2);
     case REPOKEY_TYPE_U32:
-      return data_read_u32(dp, (unsigned int *)&kv->num);
+      kv->num2 = 0;
+      return data_read_u32(dp, &kv->num);
     case REPOKEY_TYPE_MD5:
+      kv->num = 0;     /* not stringified yet */
       kv->str = (const char *)dp;
       return dp + SIZEOF_MD5;
     case REPOKEY_TYPE_SHA1:
+      kv->num = 0;     /* not stringified yet */
       kv->str = (const char *)dp;
       return dp + SIZEOF_SHA1;
     case REPOKEY_TYPE_SHA256:
+      kv->num = 0;     /* not stringified yet */
       kv->str = (const char *)dp;
       return dp + SIZEOF_SHA256;
+    case REPOKEY_TYPE_BINARY:
+      dp = data_read_id(dp, (Id *)&kv->num);
+      kv->str = (const char *)dp;
+      return dp + kv->num;
     case REPOKEY_TYPE_IDARRAY:
       return data_read_ideof(dp, &kv->id, &kv->eof);
     case REPOKEY_TYPE_DIRSTRARRAY:
       dp = data_read_ideof(dp, &kv->id, &kv->eof);
+      kv->num = 0;     /* not stringified yet */
       kv->str = (const char *)dp;
       return dp + strlen(kv->str) + 1;
     case REPOKEY_TYPE_DIRNUMNUMARRAY:
       dp = data_read_id(dp, &kv->id);
-      dp = data_read_id(dp, &kv->num);
-      return data_read_ideof(dp, &kv->num2, &kv->eof);
+      dp = data_read_id(dp, (Id *)&kv->num);
+      return data_read_ideof(dp, (Id *)&kv->num2, &kv->eof);
+    case REPOKEY_TYPE_FIXARRAY:
+      dp = data_read_id(dp, (Id *)&kv->num);
+      return data_read_id(dp, &kv->id);
+    case REPOKEY_TYPE_FLEXARRAY:
+      return data_read_id(dp, (Id *)&kv->num);
     default:
       return 0;
     }
@@ -117,6 +209,7 @@ data_skip(unsigned char *dp, int type)
     case REPOKEY_TYPE_VOID:
     case REPOKEY_TYPE_CONSTANT:
     case REPOKEY_TYPE_CONSTANTID:
+    case REPOKEY_TYPE_DELETED:
       return dp;
     case REPOKEY_TYPE_ID:
     case REPOKEY_TYPE_NUM:
@@ -141,6 +234,12 @@ data_skip(unsigned char *dp, int type)
       while ((*dp) != 0)
         dp++;
       return dp + 1;
+    case REPOKEY_TYPE_BINARY:
+      {
+       unsigned int len;
+       dp = data_read_id(dp, (Id *)&len);
+       return dp + len;
+      }
     case REPOKEY_TYPE_DIRSTRARRAY:
       for (;;)
         {
@@ -184,6 +283,7 @@ data_skip_verify(unsigned char *dp, int type, int maxid, int maxdir)
     case REPOKEY_TYPE_VOID:
     case REPOKEY_TYPE_CONSTANT:
     case REPOKEY_TYPE_CONSTANTID:
+    case REPOKEY_TYPE_DELETED:
       return dp;
     case REPOKEY_TYPE_NUM:
       while ((*dp & 0x80) != 0)
@@ -220,6 +320,12 @@ data_skip_verify(unsigned char *dp, int type, int maxid, int maxdir)
       while ((*dp) != 0)
         dp++;
       return dp + 1;
+    case REPOKEY_TYPE_BINARY:
+      {
+       unsigned int len;
+       dp = data_read_id(dp, (Id *)&len);
+       return dp + len;
+      }
     case REPOKEY_TYPE_DIRSTRARRAY:
       for (;;)
         {
@@ -252,4 +358,4 @@ data_skip_verify(unsigned char *dp, int type, int maxid, int maxdir)
     }
 }
 
-#endif /* SATSOLVER_REPOPACK */
+#endif /* LIBSOLV_REPOPACK */