commit ac2eeeffef0b2071f39513685c4b6d594a30416d from: Neels Hofmeyr date: Sun Sep 20 14:13:07 2020 UTC myers: error handling from diff_atoms_same() commit - b3fb46867c2efc085c584bd336b9dca9cf26a161 commit + ac2eeeffef0b2071f39513685c4b6d594a30416d blob - c164f2277b98e6aadeed4c94b4479e596473d531 blob + f56135e983c75dc1d4d176da40de71623e9d95b9 --- lib/diff_myers.c +++ lib/diff_myers.c @@ -209,14 +209,16 @@ struct diff_box { * meeting_snake: resulting meeting point, if any. * Return true when a meeting point has been identified. */ -static bool -diff_divide_myers_forward(struct diff_data *left, struct diff_data *right, +static int +diff_divide_myers_forward(bool *found_midpoint, + struct diff_data *left, struct diff_data *right, int *kd_forward, int *kd_backward, int d, struct diff_box *meeting_snake) { int delta = (int)right->atoms.len - (int)left->atoms.len; int k; int x; + *found_midpoint = false; debug("-- %s d=%d\n", __func__, d); @@ -304,9 +306,8 @@ diff_divide_myers_forward(struct diff_data *left, stru &left->atoms.head[x], &right->atoms.head[ xk_to_y(x, k)]); - if (r) { - abort(); // TODO: error handling - } + if (r) + return r; if (!same) break; x++; @@ -462,14 +463,15 @@ diff_divide_myers_forward(struct diff_data *left, stru debug_dump_myers_graph(left, right, NULL, kd_forward, d, kd_backward, d-1); - return true; + *found_midpoint = true; + return 0; } } } debug_dump_myers_graph(left, right, NULL, kd_forward, d, kd_backward, d-1); - return false; + return 0; } /* Do one backwards step in the "divide and conquer" graph traversal. @@ -494,14 +496,17 @@ diff_divide_myers_forward(struct diff_data *left, stru * meeting_snake: resulting meeting point, if any. * Return true when a meeting point has been identified. */ -static bool -diff_divide_myers_backward(struct diff_data *left, struct diff_data *right, +static int +diff_divide_myers_backward(bool *found_midpoint, + struct diff_data *left, struct diff_data *right, int *kd_forward, int *kd_backward, int d, struct diff_box *meeting_snake) { int delta = (int)right->atoms.len - (int)left->atoms.len; int c; int x; + + *found_midpoint = false; debug("-- %s d=%d\n", __func__, d); @@ -602,9 +607,8 @@ diff_divide_myers_backward(struct diff_data *left, str &left->atoms.head[x-1], &right->atoms.head[ xc_to_y(x, c, delta)-1]); - if (r) { - abort(); // TODO: error handling - } + if (r) + return r; if (!same) break; x--; @@ -738,13 +742,14 @@ diff_divide_myers_backward(struct diff_data *left, str debug_dump_myers_graph(left, right, NULL, kd_forward, d, kd_backward, d); - return true; + *found_midpoint = true; + return 0; } } } debug_dump_myers_graph(left, right, NULL, kd_forward, d, kd_backward, d); - return false; + return 0; } /* Myers "Divide et Impera": tracing forwards from the start and backwards from @@ -789,11 +794,20 @@ diff_algo_myers_divide(const struct diff_algo_config * struct diff_box mid_snake = {}; bool found_midpoint = false; for (d = 0; d <= (max/2); d++) { + int r; debug("-- d=%d\n", d); - found_midpoint = diff_divide_myers_forward(left, right, kd_forward, kd_backward, d, &mid_snake); + r = diff_divide_myers_forward(&found_midpoint, left, right, + kd_forward, kd_backward, d, + &mid_snake); + if (r) + return r; if (found_midpoint) break; - found_midpoint = diff_divide_myers_backward(left, right, kd_forward, kd_backward, d, &mid_snake); + r = diff_divide_myers_backward(&found_midpoint, left, right, + kd_forward, kd_backward, d, + &mid_snake); + if (r) + return r; if (found_midpoint) break; }