Diff clean-up.

This is a long overdue clean-up to the code for parsing and passing
diff options.  It also tightens some constness issues.

Signed-off-by: Junio C Hamano <junkio@cox.net>
diff --git a/diff-files.c b/diff-files.c
index 89eb29b..e8db3d2 100644
--- a/diff-files.c
+++ b/diff-files.c
@@ -11,87 +11,56 @@
 "[<common diff options>] [<path>...]"
 COMMON_DIFF_OPTIONS_HELP;
 
-static int diff_output_format = DIFF_FORMAT_RAW;
-static int diff_line_termination = '\n';
-static int detect_rename = 0;
-static int find_copies_harder = 0;
-static int diff_setup_opt = 0;
-static int diff_score_opt = 0;
-static const char *pickaxe = NULL;
-static int pickaxe_opts = 0;
-static int diff_break_opt = -1;
-static const char *orderfile = NULL;
-static const char *diff_filter = NULL;
+static struct diff_options diff_options;
 static int silent = 0;
 
 static void show_unmerge(const char *path)
 {
-	diff_unmerge(path);
+	diff_unmerge(&diff_options, path);
 }
 
 static void show_file(int pfx, struct cache_entry *ce)
 {
-	diff_addremove(pfx, ntohl(ce->ce_mode), ce->sha1, ce->name, NULL);
+	diff_addremove(&diff_options, pfx, ntohl(ce->ce_mode),
+		       ce->sha1, ce->name, NULL);
 }
 
 static void show_modified(int oldmode, int mode,
 			  const unsigned char *old_sha1, const unsigned char *sha1,
 			  char *path)
 {
-	diff_change(oldmode, mode, old_sha1, sha1, path, NULL);
+	diff_change(&diff_options, oldmode, mode, old_sha1, sha1, path, NULL);
 }
 
-int main(int argc, char **argv)
+int main(int argc, const char **argv)
 {
 	static const unsigned char null_sha1[20] = { 0, };
 	const char **pathspec;
 	const char *prefix = setup_git_directory();
 	int entries, i;
 
+	diff_setup(&diff_options);
 	while (1 < argc && argv[1][0] == '-') {
-		if (!strcmp(argv[1], "-p") || !strcmp(argv[1], "-u"))
-			diff_output_format = DIFF_FORMAT_PATCH;
-		else if (!strcmp(argv[1], "-q"))
+		if (!strcmp(argv[1], "-q"))
 			silent = 1;
 		else if (!strcmp(argv[1], "-r"))
 			; /* no-op */
 		else if (!strcmp(argv[1], "-s"))
 			; /* no-op */
-		else if (!strcmp(argv[1], "-z"))
-			diff_line_termination = 0;
-		else if (!strcmp(argv[1], "--name-only"))
-			diff_output_format = DIFF_FORMAT_NAME;
-		else if (!strcmp(argv[1], "-R"))
-			diff_setup_opt |= DIFF_SETUP_REVERSE;
-		else if (!strncmp(argv[1], "-S", 2))
-			pickaxe = argv[1] + 2;
-		else if (!strncmp(argv[1], "-O", 2))
-			orderfile = argv[1] + 2;
-		else if (!strncmp(argv[1], "--diff-filter=", 14))
-			diff_filter = argv[1] + 14;
-		else if (!strcmp(argv[1], "--pickaxe-all"))
-			pickaxe_opts = DIFF_PICKAXE_ALL;
-		else if (!strncmp(argv[1], "-B", 2)) {
-			if ((diff_break_opt =
-			     diff_scoreopt_parse(argv[1])) == -1)
+		else {
+			int diff_opt_cnt;
+			diff_opt_cnt = diff_opt_parse(&diff_options,
+						      argv+1, argc-1);
+			if (diff_opt_cnt < 0)
+				usage(diff_files_usage);
+			else if (diff_opt_cnt) {
+				argv += diff_opt_cnt;
+				argc -= diff_opt_cnt;
+				continue;
+			}
+			else
 				usage(diff_files_usage);
 		}
-		else if (!strncmp(argv[1], "-M", 2)) {
-			if ((diff_score_opt =
-			     diff_scoreopt_parse(argv[1])) == -1)
-				usage(diff_files_usage);
-			detect_rename = DIFF_DETECT_RENAME;
-		}
-		else if (!strncmp(argv[1], "-C", 2)) {
-			if ((diff_score_opt =
-			     diff_scoreopt_parse(argv[1])) == -1)
-				usage(diff_files_usage);
-			detect_rename = DIFF_DETECT_COPY;
-		}
-		else if (!strcmp(argv[1], "--find-copies-harder"))
-			find_copies_harder = 1;
-		else
-			usage(diff_files_usage);
 		argv++; argc--;
 	}
 
@@ -99,7 +68,7 @@
 	pathspec = get_pathspec(prefix, argv + 1);
 	entries = read_cache();
 
-	if (find_copies_harder && detect_rename != DIFF_DETECT_COPY)
+	if (diff_setup_done(&diff_options) < 0)
 		usage(diff_files_usage);
 
 	/* At this point, if argc == 1, then we are doing everything.
@@ -110,8 +79,6 @@
 		exit(1);
 	}
 
-	diff_setup(diff_setup_opt);
-
 	for (i = 0; i < entries; i++) {
 		struct stat st;
 		unsigned int oldmode;
@@ -141,18 +108,14 @@
 			continue;
 		}
 		changed = ce_match_stat(ce, &st);
-		if (!changed && !find_copies_harder)
+		if (!changed && !diff_options.find_copies_harder)
 			continue;
 		oldmode = ntohl(ce->ce_mode);
 		show_modified(oldmode, DIFF_FILE_CANON_MODE(st.st_mode),
 			      ce->sha1, (changed ? null_sha1 : ce->sha1),
 			      ce->name);
 	}
-	diffcore_std(pathspec, 
-		     detect_rename, diff_score_opt,
-		     pickaxe, pickaxe_opts,
-		     diff_break_opt,
-		     orderfile, diff_filter);
-	diff_flush(diff_output_format, diff_line_termination);
+	diffcore_std(&diff_options);
+	diff_flush(&diff_options);
 	return 0;
 }