dvd-sector-copy.c: Merge adjacent retry ranges when reading from a file.
authorMark Wooding <mdw@distorted.org.uk>
Wed, 16 Feb 2022 21:19:42 +0000 (21:19 +0000)
committerMark Wooding <mdw@distorted.org.uk>
Wed, 16 Feb 2022 23:29:33 +0000 (23:29 +0000)
dvd-sector-copy.c

index b1f4a53..31677b8 100644 (file)
@@ -645,7 +645,7 @@ int main(int argc, char *argv[])
   uint64_t volsz;
   secaddr pos;
   off_t off;
-  secaddr start, end;
+  secaddr start, end, last;
   const struct event *ev;
   const char *device, *outfile;
   int opt, blksz;
@@ -674,7 +674,7 @@ int main(int argc, char *argv[])
        fp = fopen(optarg, "r");
        if (!fp)
          bail_syserr(errno, "failed to open ranges file `%s'", optarg);
-       i = 0;
+       i = 0; last = -1;
        for (;;) {
          BUF_REWIND(&buf); if (read_line(fp, &buf)) break;
          p = buf.p; i++;
@@ -684,8 +684,13 @@ int main(int argc, char *argv[])
              (last <= SECLIMIT && start < last))
            bail("bad range `%s' at `%s' line %zu", buf.p, optarg, i);
          if (start < end) {
-           put_event(EV_WRITE, 0, start);
-           put_event(EV_STOP, 0, end);
+           if (start == last)
+             eventq.v[eventq.n - 1].pos = end;
+           else {
+             put_event(EV_WRITE, 0, start);
+             put_event(EV_STOP, 0, end);
+           }
+           last = end;
          }
        }
        if (ferror(fp))