Implement fetching of cloud log items via range requests.
[bluesky.git] / bluesky / util.c
index 4e8b011..e7514fc 100644 (file)
@@ -292,3 +292,23 @@ const BlueSkyRangesetItem *bluesky_rangeset_lookup(BlueSkyRangeset *rangeset,
     else
         return NULL;
 }
+
+/* Look up the first rangeset item starting at or following the given address.
+ * Can be used to iterate through a rangeset. */
+const BlueSkyRangesetItem *bluesky_rangeset_lookup_next(BlueSkyRangeset *rangeset, uint64_t offset)
+{
+    GSequenceIter *i;
+    i = g_sequence_search(rangeset->seq, &offset, compare64, NULL);
+    i = g_sequence_iter_prev(i);
+    if (g_sequence_iter_is_end(i))
+        return NULL;
+    BlueSkyRangesetItem *item = (BlueSkyRangesetItem *)g_sequence_get(i);
+    if (item->start < offset) {
+        i = g_sequence_iter_next(i);
+        if (g_sequence_iter_is_end(i))
+            item = NULL;
+        else
+            item = (BlueSkyRangesetItem *)g_sequence_get(i);
+    }
+    return item;
+}