+static int
+make_fragment (int fd, char *offstr, char *mapstr)
+{
+ int i;
+ off_t displ = get_size (offstr, 1);
+
+ file_length += displ;
+
+ if (!mapstr || !*mapstr)
+ {
+ mkhole (fd, displ);
+ return 1;
+ }
+ else if (*mapstr == '=')
+ {
+ off_t n = get_size (mapstr + 1, 1);
+
+ switch (pattern)
+ {
+ case DEFAULT_PATTERN:
+ for (i = 0; i < block_size; i++)
+ buffer[i] = i & 255;
+ break;
+
+ case ZEROS_PATTERN:
+ memset (buffer, 0, block_size);
+ break;
+ }
+
+ if (lseek (fd, displ, SEEK_CUR) == -1)
+ error (EXIT_FAILURE, errno, "lseek");
+
+ for (; n; n--)
+ {
+ if (write (fd, buffer, block_size) != block_size)
+ error (EXIT_FAILURE, errno, "write");
+ file_length += block_size;
+ }
+ }
+ else
+ {
+ file_length += block_size * strlen (mapstr);
+ mksparse (fd, displ, mapstr);
+ }
+ return 0;
+}
+