+/*
+ * Utility function to fill a buffer buf of size len with the pattern defined
+ * for this instance. We start each copying from the offset where we left the
+ * previous one.
+ *
+ * Note that performance is important: amtapetype uses this very source and
+ * source-random.c to determine whether a tape device uses compression, and
+ * expects the two to run about the same speed. This is why this is a byte
+ * loop and does not use mempcy() and friends: the random source is also byte
+ * per byte.
+ */
+
+static void fill_buffer_with_pattern(XferSourcePattern *self, char *buf,
+ size_t len)
+{
+ char *src = self->pattern, *dst = buf;
+ size_t plen = self->pattern_buffer_length, offset = self->current_offset;
+ size_t pos = 0;
+
+ src += offset;
+
+ while (pos < len) {
+ *dst++ = *src++;
+ pos++, offset++;
+
+ if (G_LIKELY(offset < plen))
+ continue;
+
+ offset = 0;
+ src = self->pattern;
+ }
+
+ self->current_offset = offset;
+}
+