+static void diffcore_apply_filter(const char *filter)
+{
+ int i;
+ struct diff_queue_struct *q = &diff_queued_diff;
+ struct diff_queue_struct outq;
+ outq.queue = NULL;
+ outq.nr = outq.alloc = 0;
+
+ if (!filter)
+ return;
+
+ if (strchr(filter, 'A')) {
+ /* All-or-none */
+ int found;
+ for (i = found = 0; !found && i < q->nr; i++) {
+ struct diff_filepair *p = q->queue[i];
+ if (((p->status == 'M') &&
+ ((p->score && strchr(filter, 'B')) ||
+ (!p->score && strchr(filter, 'M')))) ||
+ ((p->status != 'M') && strchr(filter, p->status)))
+ found++;
+ }
+ if (found)
+ return;
+
+ /* otherwise we will clear the whole queue
+ * by copying the empty outq at the end of this
+ * function, but first clear the current entries
+ * in the queue.
+ */
+ for (i = 0; i < q->nr; i++)
+ diff_free_filepair(q->queue[i]);
+ }
+ else {
+ /* Only the matching ones */
+ for (i = 0; i < q->nr; i++) {
+ struct diff_filepair *p = q->queue[i];
+ if (((p->status == 'M') &&
+ ((p->score && strchr(filter, 'B')) ||
+ (!p->score && strchr(filter, 'M')))) ||
+ ((p->status != 'M') && strchr(filter, p->status)))
+ diff_q(&outq, p);
+ else
+ diff_free_filepair(p);
+ }
+ }
+ free(q->queue);
+ *q = outq;
+}
+
+void diffcore_std(const char **paths,
+ int detect_rename, int rename_score,
+ const char *pickaxe, int pickaxe_opts,
+ int break_opt,
+ const char *orderfile,
+ const char *filter)
+{
+ if (paths && paths[0])
+ diffcore_pathspec(paths);
+ if (break_opt != -1)
+ diffcore_break(break_opt);
+ if (detect_rename)
+ diffcore_rename(detect_rename, rename_score);
+ if (break_opt != -1)
+ diffcore_merge_broken();
+ if (pickaxe)
+ diffcore_pickaxe(pickaxe, pickaxe_opts);
+ if (orderfile)
+ diffcore_order(orderfile);
+ diff_resolve_rename_copy();
+ diffcore_apply_filter(filter);
+}
+
+
+void diffcore_std_no_resolve(const char **paths,
+ const char *pickaxe, int pickaxe_opts,
+ const char *orderfile,
+ const char *filter)
+{
+ if (paths && paths[0])
+ diffcore_pathspec(paths);
+ if (pickaxe)
+ diffcore_pickaxe(pickaxe, pickaxe_opts);
+ if (orderfile)
+ diffcore_order(orderfile);
+ diffcore_apply_filter(filter);
+}
+