commit - 77bc4063d431dcbbc3ebf020af460125fee542fe
commit + 90eac7479efe209eac4df46846fb74851d671ef8
blob - 17829097700834511f9f84544d113cbf0d7acb91
blob + 8a5fbac42174d13210c2a2d5ea97001cf95950f4
--- diff.c
+++ diff.c
{
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
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
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
-#include <string.h>
#include "diff_main.h"
#include "debug.h"
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)
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)