Commit Diff


commit - 77bc4063d431dcbbc3ebf020af460125fee542fe
commit + 90eac7479efe209eac4df46846fb74851d671ef8
blob - 17829097700834511f9f84544d113cbf0d7acb91
blob + 8a5fbac42174d13210c2a2d5ea97001cf95950f4
--- diff.c
+++ diff.c
@@ -114,20 +114,24 @@ diffreg(char *file1, char *file2, int flags, int conte
 {
 	char *str1, *str2;
 	struct stat st1, st2;
-	struct diff_input_info info = {
-		.left_path = file1,
-		.right_path = file2,
-	};
+	struct diff_input_info info;
 
 	str1 = mmapfile(file1, &st1);
 	str2 = mmapfile(file2, &st2);
 
+	info = (struct diff_input_info) {
+		.left_path = file1,
+		.left_buffer = str1,
+		.left_size = st1.st_size,
+		.right_path = file2,
+		.right_buffer = str2,
+		.right_size = st2.st_size,
+	};
+
 	if (flags & F_UNIFIED)
-		diff_unidiff(stdout, &diff_config, &info, str1, st1.st_size,
-		    str2, st2.st_size, context);
+		diff_unidiff(stdout, &diff_config, &info, context);
 	else
-		diff_plain(stdout, &diff_config, &info, str1, st1.st_size,
-		    str2, st2.st_size);
+		diff_plain(stdout, &diff_config, &info);
 
 	munmap(str1, st1.st_size);
 	munmap(str2, st2.st_size);
blob - f86788bf0db4651a1769f4abf4bbb9c04e11e60d
blob + 2af135b66a21409f60158b61d17612fdbaf53cb7
--- diff_main.h
+++ diff_main.h
@@ -356,14 +356,16 @@ void diff_result_free(struct diff_result *result);
 struct diff_input_info {
 	const char *arbitrary_info;
 	const char *left_path;
+	const char *left_buffer;
+	off_t left_size;
 	const char *right_path;
+	const char *right_buffer;
+	off_t right_size;
 };
 
 enum diff_rc diff_plain(FILE *dest, const struct diff_config *diff_config,
-			const struct diff_input_info *info,
-			const char *left, int left_len, const char *right, int right_len);
+			const struct diff_input_info *info);
 
 enum diff_rc diff_unidiff(FILE *dest, const struct diff_config *diff_config,
 			  const struct diff_input_info *info,
-			  const char *left, int left_len, const char *right, int right_len,
 			  unsigned int context_lines);
blob - c1bb9102eea8d902ba0d018a47e4ba4ae1a2f631
blob + 5f5769aa7ddcab3c2cb38ad4156cc8e208647fd4
--- diff_output.c
+++ diff_output.c
@@ -23,7 +23,6 @@
 #include <stdbool.h>
 #include <stdint.h>
 #include <stdio.h>
-#include <string.h>
 
 #include "diff_main.h"
 #include "debug.h"
@@ -103,15 +102,18 @@ diff_output_plain(FILE *dest, const struct diff_input_
 
 enum diff_rc
 diff_plain(FILE *dest, const struct diff_config *diff_config,
-    const struct diff_input_info *info,
-    const char *left, int left_len, const char *right, int right_len)
+    const struct diff_input_info *info)
 {
 	struct diff_result *result;
+	int left_len, right_len;
 	enum diff_rc rc;
 
-	left_len = left_len < 0 ? strlen(left) : left_len;
-	right_len = right_len < 0 ? strlen(right) : right_len;
-	result = diff_main(diff_config, left, left_len, right, right_len);
+	left_len = info->left_size;
+	right_len = info->right_size;
+	if (left_len < 0 || right_len < 0)
+		return DIFF_RC_EINVAL;
+	result = diff_main(diff_config, info->left_buffer, left_len,
+	    info->right_buffer, right_len);
 	if (!result)
 		return DIFF_RC_EINVAL;
 	if (result->rc != DIFF_RC_OK)
@@ -345,16 +347,18 @@ diff_output_unidiff(FILE *dest, const struct diff_inpu
 
 enum diff_rc
 diff_unidiff(FILE *dest, const struct diff_config *diff_config,
-    const struct diff_input_info *info,
-    const char *left, int left_len, const char *right, int right_len,
-    unsigned int context_lines)
+    const struct diff_input_info *info, unsigned int context_lines)
 {
 	struct diff_result *result;
+	int left_len, right_len;
 	enum diff_rc rc;
 
-	left_len = left_len < 0 ? strlen(left) : left_len;
-	right_len = right_len < 0 ? strlen(right) : right_len;
-	result = diff_main(diff_config, left, left_len, right, right_len);
+	left_len = info->left_size;
+	right_len = info->right_size;
+	if (left_len < 0 || right_len < 0)
+		return DIFF_RC_EINVAL;
+	result = diff_main(diff_config, info->left_buffer, left_len,
+	    info->right_buffer, right_len);
 	if (!result)
 		return DIFF_RC_EINVAL;
 	if (result->rc != DIFF_RC_OK)