dvd-sector-copy.c: Sink debugging spew to the end of the `switch' arm.
[dvdrip] / dvd-sector-copy.c
index 73e068a..c6b4c19 100644 (file)
@@ -743,8 +743,8 @@ static ssize_t find_good_sector(secaddr *pos_inout, secaddr end,
     step = (step_factor - 1)*(bad_hi - bad_lo);
     if (step < step_min) step = step_min;
     if (step_max && step > step_max) step = step_max;
-    if (step > end - bad_hi) step = end - bad_hi;
-    pos = bad_hi + step - 1;
+    step += bad_hi - bad_lo;
+    if (step > end - bad_lo) step = end - bad_lo;
     want = run_length_wanted(pos, step, end);
     n = recovery_read(&r, pos, want);
 #ifdef DEBUG
@@ -777,16 +777,16 @@ static ssize_t find_good_sector(secaddr *pos_inout, secaddr end,
     if (n == want) good = pos;
     else bad_hi = pos + n + 1;
   }
-  recovered(bad_lo, bad_hi); *pos_inout = bad_hi;
-  if (bad_hi < r.pos + r.start || r.pos + r.end <= bad_hi)
+  recovered(bad_lo, good); *pos_inout = good;
+  if (good < r.pos + r.start || r.pos + r.end <= good)
     n = 0;
   else {
-    n = r.pos + r.end - bad_hi;
-    rearrange_sectors(&r, 0, bad_hi - r.pos, n);
+    n = r.pos + r.end - good;
+    rearrange_sectors(&r, 0, good - r.pos, n);
   }
 #ifdef DEBUG
   show_recovery_buffer_map(&r, "returning %zd good sectors at %"PRIuSEC"",
-                          n, bad_hi);
+                          n, good);
 #endif
   return (n);
 }
@@ -842,7 +842,6 @@ static void emit(secaddr start, secaddr end)
          bail("failed to open %s %u",
               id_part(file->id) ? "title" : "menu",
               id_title(file->id));
-       progress_update(&progress);
        break;
       default:
        abort();
@@ -854,6 +853,7 @@ static void emit(secaddr start, secaddr end)
     progress_additem(&progress, &file_progress);
   }
 
+  progress_update(&progress);
   pos = start;
   while (pos < end) {
     want = end - pos; if (want > BUFSECTORS) want = BUFSECTORS;
@@ -903,6 +903,7 @@ int main(int argc, char *argv[])
 #define f_fixup 4u
 #define f_stats 8u
 #define f_checkid 16u
+#define f_retry 32u
 #define f_write 256u
 
   set_prog(argv[0]);
@@ -946,7 +947,7 @@ int main(int argc, char *argv[])
          else
            bail("unknown bad blocks parameter `%s'", p);
          if (!*p) break;
-         else if (*p != ',') bail("unexpected junk in parameters");
+         if (*p != ',') bail("unexpected junk in parameters");
          p++;
        }
 #undef SKIP_PREFIX
@@ -960,7 +961,7 @@ int main(int argc, char *argv[])
        i = 0; last = -1;
        for (;;) {
          buf_rewind(&buf); if (read_line(fp, &buf)) break;
-         p = buf.p; i++;
+         i++; p = buf.p;
          while (ISSPACE(*p)) p++;
          if (!*p || *p == '#') continue;
          if (parse_range(p, 0, &start, &end) ||
@@ -978,6 +979,7 @@ int main(int argc, char *argv[])
        }
        if (ferror(fp))
          bail_syserr(errno, "failed to read ranges file `%s'", optarg);
+       f |= f_retry;
        break;
       case 'X':
        fp = fopen(optarg, "r");
@@ -992,8 +994,10 @@ int main(int argc, char *argv[])
          if (parse_range(p, 0, &start, &end) ||
              (last <= SECLIMIT && start < last))
            bail("bad range `%s' at `%s' line %zu", buf.p, optarg, i);
-         if (start < end)
-           { VEC_PUSH(bad, &badblocks); bad->start = start; bad->end = end; }
+         if (start < end) {
+           VEC_PUSH(bad, &badblocks);
+           bad->start = start; bad->end = end;
+         }
        }
        if (ferror(fp))
          bail_syserr(errno, "failed to read bad-blocks file `%s'", optarg);
@@ -1005,7 +1009,7 @@ int main(int argc, char *argv[])
       case 'c': f |= f_continue; break;
       case 'i': f |= f_checkid; break;
       case 'r':
-       start = 0; end = -1;
+       start = 0; end = -1; f |= f_retry;
        if (parse_range(optarg, PRF_HYPHEN, &start, &end))
          bail("bad range `%s'", optarg);
        if (start < end) {
@@ -1020,8 +1024,6 @@ int main(int argc, char *argv[])
   if (argc - optind != 2) f |= f_bogus;
   if (f&f_bogus) { usage(stderr); exit(2); }
 
-  setlocale(LC_ALL, "");
-  progress_init(&progress);
   device = argv[optind]; outfile = argv[optind + 1];
 
   if (badblocks.n) {
@@ -1035,6 +1037,8 @@ int main(int argc, char *argv[])
 #endif
   }
 
+  setlocale(LC_ALL, "");
+  progress_init(&progress);
   if (open_dvd(device, O_RDONLY, &dvdfd, &dvd)) exit(2);
 
   blksz = SECTORSZ; volsz = device_size(dvdfd, device, &blksz);
@@ -1063,8 +1067,9 @@ int main(int argc, char *argv[])
     if (off < 0)
       bail_syserr(errno, "failed to seek to end of output file `%s'",
                  outfile);
-    put_event(EV_WRITE, 0, off/SECTORSZ);
-  } else if (!eventq.n && !(f&f_fixup))
+    put_event(EV_WRITE, 0, off/SECTORSZ); f |= f_retry;
+  }
+  if (!(f&(f_retry | f_fixup)))
     put_event(EV_WRITE, 0, 0);
 
   /* It's fast enough just to check everything. */
@@ -1079,8 +1084,6 @@ int main(int argc, char *argv[])
   for (i = 0, limit = 0; i < filetab.n; i++)
     if (filetab.v[i].end > limit) limit = filetab.v[i].end;
 
-  if (end > limit) end = limit;
-
 #ifdef DEBUG
   printf("\n;; files:\n");
   for (i = 0; i < filetab.n; i++) {
@@ -1093,8 +1096,7 @@ int main(int argc, char *argv[])
 
   qsort(eventq.v, eventq.n, sizeof(struct event), compare_event);
 
-  f &= ~f_write; start = 0;
-  for (i = 0; i < eventq.n; i++) {
+  for (i = 0, f &= ~f_write, start = 0; i < eventq.n; i++) {
     ev = &eventq.v[i];
     switch (ev->ev) {
       case EV_WRITE:
@@ -1113,20 +1115,19 @@ int main(int argc, char *argv[])
 #ifdef DEBUG
   dump_eventq("initial");
 #endif
-  f &= ~f_write; start = 0;
-  for (i = 0; i < eventq.n; i++) {
+  for (i = 0, f &= ~f_write, start = last = 0; i < eventq.n; i++) {
     ev = &eventq.v[i];
     if (ev->ev == EV_WRITE) { start = ev->pos; f |= f_write; }
     if (ev->pos >= limit) break;
     if (ev->ev == EV_STOP) { nsectors += ev->pos - start; f &= ~f_write; }
-    if (f&f_fixup) start = ev->pos;
+    if (f&f_fixup) last = ev->pos;
   }
   eventq.n = i;
 #ifdef DEBUG
   dump_eventq("trimmed");
 #endif
   if (f&f_fixup) {
-    put_event(EV_WRITE, 0, start);
+    put_event(EV_WRITE, 0, last);
     f |= f_write;
   }
   if (f&f_write) {
@@ -1151,8 +1152,7 @@ int main(int argc, char *argv[])
 #ifdef DEBUG
   printf("\n;; event sweep:\n");
 #endif
-  f &= ~f_write;
-  for (pos = 0, i = 0; i < eventq.n; i++) {
+  for (pos = 0, i = 0, f &= ~f_write; i < eventq.n; i++) {
     ev = &eventq.v[i];
     if (ev->pos > pos) {
       if (f&f_write) emit(pos, ev->pos);
@@ -1178,11 +1178,11 @@ int main(int argc, char *argv[])
                      "failed to seek to resume position "
                      "(sector %"PRIuSEC") in output file `%s'",
                      ev->pos, outfile);
+       f |= f_write;
 #ifdef DEBUG
        progress_clear(&progress);
        printf(";; %8"PRIuSEC": begin write\n", pos);
 #endif
-       f |= f_write;
        break;
       case EV_STOP:
        f &= ~f_write;