- int cmd_required_length = strlen(name_sq) * 2 + strlen(diff_cmd);
-
- if (cmd_size < cmd_required_length) {
- free(cmd);
- cmd_size = cmd_required_length;
- cmd = malloc(cmd_required_length);
- }
- snprintf(cmd, cmd_size, diff_cmd, name_sq, name_sq);
+ char *label_sq = (name != label) ? sq_expand(label) : name_sq;
+ char *diff_arg = reverse ? diff_arg_reverse : diff_arg_forward;
+ int cmd_size = strlen(name_sq) + strlen(label_sq) * 2 +
+ strlen(diff_cmd) + strlen(diff_opts) + strlen(diff_arg);
+ char *cmd = malloc(cmd_size);
+ int next_at;
+
+ fflush(stdout);
+ next_at = snprintf(cmd, cmd_size, diff_cmd, label_sq, label_sq);
+ next_at += snprintf(cmd+next_at, cmd_size-next_at, "%s", diff_opts);
+ next_at += snprintf(cmd+next_at, cmd_size-next_at, diff_arg, name_sq);