OSDN Git Service

Add diff_2_buffers_xdiff() function
authorTakashi Sawanaka <sdottaka@users.sourceforge.net>
Mon, 11 Sep 2023 23:16:03 +0000 (08:16 +0900)
committerTakashi Sawanaka <sdottaka@users.sourceforge.net>
Mon, 11 Sep 2023 23:16:03 +0000 (08:16 +0900)
Src/xdiff_gnudiff_compat.cpp
Src/xdiff_gnudiff_compat.h

index aa0c6da..d1f5969 100644 (file)
@@ -54,15 +54,57 @@ static int hunk_func(long start_a, long count_a, long start_b, long count_b, voi
        return 0;\r
 }\r
 \r
-struct change * diff_2_files_xdiff (struct file_data filevec[], int* bin_status, int bMoved_blocks_flag, int* bin_file, unsigned xdl_flags)\r
+struct change* diff_2_buffers_xdiff(const char* ptr1, size_t size1, const char* ptr2, size_t size2, unsigned xdl_flags)\r
 {\r
-       mmfile_t mmfile1 = { 0 }, mmfile2 = { 0 };\r
        change *script = nullptr;\r
        xdfenv_t xe;\r
        xdchange_t *xscr;\r
        xpparam_t xpp = { 0 };\r
        xdemitconf_t xecfg = { 0 };\r
        xdemitcb_t ecb = { 0 };\r
+       mmfile_t mmfile1 = { const_cast<char*>(ptr1), static_cast<long>(size1) };\r
+       mmfile_t mmfile2 = { const_cast<char*>(ptr2), static_cast<long>(size2) };\r
+\r
+       xpp.flags = xdl_flags;\r
+       xecfg.hunk_func = hunk_func;\r
+\r
+       if (xdl_diff_modified(&mmfile1, &mmfile2, &xpp, &xecfg, &ecb, &xe, &xscr) == 0)\r
+       {\r
+               change *prev = nullptr;\r
+               for (xdchange_t* xcur = xscr; xcur; xcur = xcur->next)\r
+               {\r
+                       change* e = static_cast<change*>(malloc(sizeof(change)));\r
+                       if (!e)\r
+                               goto abort;\r
+                       if (!script)\r
+                               script = e;\r
+                       e->line0 = xcur->i1;\r
+                       e->line1 = xcur->i2;\r
+                       e->deleted = xcur->chg1;\r
+                       e->inserted = xcur->chg2;\r
+                       e->match0 = -1;\r
+                       e->match1 = -1;\r
+                       e->trivial = static_cast<char>(xcur->ignore);\r
+                       e->link = nullptr;\r
+                       e->ignore = 0;\r
+                       if (prev)\r
+                               prev->link = e;\r
+                       prev = e;\r
+               }\r
+\r
+               xdl_free_script(xscr);\r
+               xdl_free_env(&xe);\r
+       }\r
+\r
+       return script;\r
+\r
+abort:\r
+       return nullptr;\r
+}\r
+\r
+struct change * diff_2_files_xdiff (struct file_data filevec[], int* bin_status, int bMoved_blocks_flag, int* bin_file, unsigned xdl_flags)\r
+{\r
+       change *script = nullptr;\r
 \r
        if (read_files(filevec, no_details_flag & ~ignore_some_changes, bin_file))\r
        {\r
@@ -138,47 +180,15 @@ struct change * diff_2_files_xdiff (struct file_data filevec[], int* bin_status,
        }\r
        else\r
        {\r
-               mmfile1.ptr = const_cast<char*>(filevec[0].prefix_end);\r
-               mmfile1.size = static_cast<long>(filevec[0].suffix_begin - filevec[0].prefix_end);\r
-               mmfile2.ptr = const_cast<char*>(filevec[1].prefix_end);\r
-               mmfile2.size = static_cast<long>(filevec[1].suffix_begin - filevec[1].prefix_end);\r
-\r
-               xpp.flags = xdl_flags;\r
-               xecfg.hunk_func = hunk_func;\r
-               if (xdl_diff_modified(&mmfile1, &mmfile2, &xpp, &xecfg, &ecb, &xe, &xscr) == 0)\r
-               {\r
-                       change *prev = nullptr;\r
-                       for (xdchange_t* xcur = xscr; xcur; xcur = xcur->next)\r
-                       {\r
-                               change* e = static_cast<change*>(malloc(sizeof(change)));\r
-                               if (!e)\r
-                                       goto abort;\r
-                               if (!script)\r
-                                       script = e;\r
-                               e->line0 = xcur->i1;\r
-                               e->line1 = xcur->i2;\r
-                               e->deleted = xcur->chg1;\r
-                               e->inserted = xcur->chg2;\r
-                               e->match0 = -1;\r
-                               e->match1 = -1;\r
-                               e->trivial = static_cast<char>(xcur->ignore);\r
-                               e->link = nullptr;\r
-                               e->ignore = 0;\r
-                               if (prev)\r
-                                       prev->link = e;\r
-                               prev = e;\r
-                       }\r
-\r
-                       if (bMoved_blocks_flag)\r
-                               moved_block_analysis(&script, filevec);\r
-\r
-                       xdl_free_script(xscr);\r
-                       xdl_free_env(&xe);\r
-               }\r
+               script = diff_2_buffers_xdiff(\r
+                       filevec[0].prefix_end,\r
+                       filevec[0].suffix_begin - filevec[0].prefix_end,\r
+                       filevec[1].prefix_end,\r
+                       filevec[1].suffix_begin - filevec[1].prefix_end,\r
+                       xdl_flags);\r
+               if (bMoved_blocks_flag)\r
+                       moved_block_analysis(&script, filevec);\r
        }\r
 \r
        return script;\r
-\r
-abort:\r
-       return nullptr;\r
 }\r
index 5dfa542..228640d 100644 (file)
@@ -1,5 +1,7 @@
 #pragma once\r
 \r
 class DiffutilsOptions;\r
+\r
 unsigned long make_xdl_flags(const DiffutilsOptions& options);\r
+struct change* diff_2_buffers_xdiff(const char* ptr1, size_t size1, const char* ptr2, size_t size2, unsigned xdl_flags);\r
 struct change * diff_2_files_xdiff(struct file_data filevec[], int* bin_status, int bMoved_blocks_flag, int* bin_file, unsigned xdl_flags);\r