From 6521c4ebce8a9dcbbc0d137d156a1d9f30be1535 Mon Sep 17 00:00:00 2001 From: Takashi Sawanaka Date: Tue, 12 Sep 2023 08:16:03 +0900 Subject: [PATCH] Add diff_2_buffers_xdiff() function --- Src/xdiff_gnudiff_compat.cpp | 94 ++++++++++++++++++++++++-------------------- Src/xdiff_gnudiff_compat.h | 2 + 2 files changed, 54 insertions(+), 42 deletions(-) diff --git a/Src/xdiff_gnudiff_compat.cpp b/Src/xdiff_gnudiff_compat.cpp index aa0c6da2e..d1f596906 100644 --- a/Src/xdiff_gnudiff_compat.cpp +++ b/Src/xdiff_gnudiff_compat.cpp @@ -54,15 +54,57 @@ static int hunk_func(long start_a, long count_a, long start_b, long count_b, voi return 0; } -struct change * diff_2_files_xdiff (struct file_data filevec[], int* bin_status, int bMoved_blocks_flag, int* bin_file, unsigned xdl_flags) +struct change* diff_2_buffers_xdiff(const char* ptr1, size_t size1, const char* ptr2, size_t size2, unsigned xdl_flags) { - mmfile_t mmfile1 = { 0 }, mmfile2 = { 0 }; change *script = nullptr; xdfenv_t xe; xdchange_t *xscr; xpparam_t xpp = { 0 }; xdemitconf_t xecfg = { 0 }; xdemitcb_t ecb = { 0 }; + mmfile_t mmfile1 = { const_cast(ptr1), static_cast(size1) }; + mmfile_t mmfile2 = { const_cast(ptr2), static_cast(size2) }; + + xpp.flags = xdl_flags; + xecfg.hunk_func = hunk_func; + + if (xdl_diff_modified(&mmfile1, &mmfile2, &xpp, &xecfg, &ecb, &xe, &xscr) == 0) + { + change *prev = nullptr; + for (xdchange_t* xcur = xscr; xcur; xcur = xcur->next) + { + change* e = static_cast(malloc(sizeof(change))); + if (!e) + goto abort; + if (!script) + script = e; + e->line0 = xcur->i1; + e->line1 = xcur->i2; + e->deleted = xcur->chg1; + e->inserted = xcur->chg2; + e->match0 = -1; + e->match1 = -1; + e->trivial = static_cast(xcur->ignore); + e->link = nullptr; + e->ignore = 0; + if (prev) + prev->link = e; + prev = e; + } + + xdl_free_script(xscr); + xdl_free_env(&xe); + } + + return script; + +abort: + return nullptr; +} + +struct change * diff_2_files_xdiff (struct file_data filevec[], int* bin_status, int bMoved_blocks_flag, int* bin_file, unsigned xdl_flags) +{ + change *script = nullptr; if (read_files(filevec, no_details_flag & ~ignore_some_changes, bin_file)) { @@ -138,47 +180,15 @@ struct change * diff_2_files_xdiff (struct file_data filevec[], int* bin_status, } else { - mmfile1.ptr = const_cast(filevec[0].prefix_end); - mmfile1.size = static_cast(filevec[0].suffix_begin - filevec[0].prefix_end); - mmfile2.ptr = const_cast(filevec[1].prefix_end); - mmfile2.size = static_cast(filevec[1].suffix_begin - filevec[1].prefix_end); - - xpp.flags = xdl_flags; - xecfg.hunk_func = hunk_func; - if (xdl_diff_modified(&mmfile1, &mmfile2, &xpp, &xecfg, &ecb, &xe, &xscr) == 0) - { - change *prev = nullptr; - for (xdchange_t* xcur = xscr; xcur; xcur = xcur->next) - { - change* e = static_cast(malloc(sizeof(change))); - if (!e) - goto abort; - if (!script) - script = e; - e->line0 = xcur->i1; - e->line1 = xcur->i2; - e->deleted = xcur->chg1; - e->inserted = xcur->chg2; - e->match0 = -1; - e->match1 = -1; - e->trivial = static_cast(xcur->ignore); - e->link = nullptr; - e->ignore = 0; - if (prev) - prev->link = e; - prev = e; - } - - if (bMoved_blocks_flag) - moved_block_analysis(&script, filevec); - - xdl_free_script(xscr); - xdl_free_env(&xe); - } + script = diff_2_buffers_xdiff( + filevec[0].prefix_end, + filevec[0].suffix_begin - filevec[0].prefix_end, + filevec[1].prefix_end, + filevec[1].suffix_begin - filevec[1].prefix_end, + xdl_flags); + if (bMoved_blocks_flag) + moved_block_analysis(&script, filevec); } return script; - -abort: - return nullptr; } diff --git a/Src/xdiff_gnudiff_compat.h b/Src/xdiff_gnudiff_compat.h index 5dfa542c0..228640da0 100644 --- a/Src/xdiff_gnudiff_compat.h +++ b/Src/xdiff_gnudiff_compat.h @@ -1,5 +1,7 @@ #pragma once class DiffutilsOptions; + unsigned long make_xdl_flags(const DiffutilsOptions& options); +struct change* diff_2_buffers_xdiff(const char* ptr1, size_t size1, const char* ptr2, size_t size2, unsigned xdl_flags); struct change * diff_2_files_xdiff(struct file_data filevec[], int* bin_status, int bMoved_blocks_flag, int* bin_file, unsigned xdl_flags); -- 2.11.0