@@ -15,6 +15,17 @@ pub const Diff = struct {
1515
1616 operation : Operation ,
1717 text : []const u8 ,
18+
19+ pub fn format (value : Diff , _ : anytype , _ : anytype , writer : anytype ) ! void {
20+ try writer .print ("({s}, \" {s}\" )" , .{
21+ switch (value .operation ) {
22+ .equal = > "" ,
23+ .insert = > "+" ,
24+ .delete = > "-" ,
25+ },
26+ value .text ,
27+ });
28+ }
1829};
1930
2031/// Number of microseconds to map a diff before giving up (0 for infinity).
@@ -82,8 +93,8 @@ fn diffInternal(
8293 // Trim off common suffix (speedup).
8394 common_length = diffCommonSuffix (before , after );
8495 var common_suffix = before [before .len - common_length .. ];
85- trimmed_before = trimmed_before [0 .. before .len - common_length ];
86- trimmed_after = trimmed_after [0 .. after .len - common_length ];
96+ trimmed_before = trimmed_before [0 .. trimmed_before .len - common_length ];
97+ trimmed_after = trimmed_after [0 .. trimmed_after .len - common_length ];
8798
8899 // Compute the diff on the middle block.
89100 diffs = try dmp .diffCompute (allocator , before , after , check_lines , deadline );
@@ -261,7 +272,7 @@ fn diffHalfMatchInternal(
261272 i : usize ,
262273) DiffError ! HalfMatchResult {
263274 // Start with a 1/4 length Substring at position i as a seed.
264- const seed = long_text [i .. long_text .len / 4 ];
275+ const seed = long_text [i .. i + long_text .len / 4 ];
265276 var j : isize = -1 ;
266277
267278 var best_common = std .ArrayListUnmanaged (u8 ){};
@@ -278,8 +289,8 @@ fn diffHalfMatchInternal(
278289 var suffix_length = diffCommonSuffix (long_text [0.. i ], short_text [0.. @intCast (usize , j )]);
279290 if (best_common .items .len < suffix_length + prefix_length ) {
280291 best_common .items .len = 0 ;
281- try best_common .appendSlice (allocator , short_text [@intCast (usize , j - @intCast (isize , suffix_length )).. suffix_length ]);
282- try best_common .appendSlice (allocator , short_text [@intCast (usize , j ).. prefix_length ]);
292+ try best_common .appendSlice (allocator , short_text [@intCast (usize , j - @intCast (isize , suffix_length )) .. @intCast ( usize , j - @intCast ( isize , suffix_length )) + suffix_length ]);
293+ try best_common .appendSlice (allocator , short_text [@intCast (usize , j ) .. @intCast ( usize , j ) + prefix_length ]);
283294
284295 best_long_text_a = long_text [0 .. i - suffix_length ];
285296 best_long_text_b = long_text [i + prefix_length .. ];
@@ -323,10 +334,10 @@ fn diffBisect(
323334 }
324335 v1 .items [v_offset + 1 ] = 0 ;
325336 v2 .items [v_offset + 1 ] = 0 ;
326- var delta = before .len - after .len ;
337+ var delta = @intCast ( isize , before .len ) - @intCast ( isize , after .len ) ;
327338 // If the total number of characters is odd, then the front path will
328339 // collide with the reverse path.
329- var front = (delta % 2 != 0 );
340+ var front = (@mod ( delta , 2 ) != 0 );
330341 // Offsets for start and end of k loop.
331342 // Prevents mapping of space beyond the grid.
332343 var k1start : usize = 0 ;
@@ -364,7 +375,7 @@ fn diffBisect(
364375 // Ran off the bottom of the graph.
365376 k1start += 2 ;
366377 } else if (front ) {
367- var k2_offset : isize = @intCast (isize , v_offset + delta ) - k1 ;
378+ var k2_offset : isize = @intCast (isize , v_offset ) + delta - k1 ;
368379 if (k2_offset >= 0 and k2_offset < v_length and v2 .items [@intCast (usize , k2_offset )] != -1 ) {
369380 // Mirror x2 onto top-left coordinate system.
370381 var x2 : isize = @intCast (isize , before .len ) - v2 .items [@intCast (usize , k2_offset )];
@@ -399,7 +410,7 @@ fn diffBisect(
399410 // Ran off the top of the graph.
400411 k2start += 2 ;
401412 } else if (! front ) {
402- var k1_offset : isize = @intCast (isize , v_offset + delta ) - k2 ;
413+ var k1_offset : isize = @intCast (isize , v_offset ) + delta - k2 ;
403414 if (k1_offset >= 0 and k1_offset < v_length and v1 .items [@intCast (usize , k1_offset )] != -1 ) {
404415 var x1 : isize = v1 .items [@intCast (usize , k1_offset )];
405416 var y1 : isize = @intCast (isize , v_offset ) + x1 - k1_offset ;
@@ -438,7 +449,7 @@ fn diffBisectSplit(
438449 // Compute both diffs serially.
439450 var diffs = try dmp .diffInternal (allocator , text1a , text2a , false , deadline );
440451 var diffsb = try dmp .diffInternal (allocator , text1b , text2b , false , deadline );
441- defer diffs .deinit (allocator );
452+ defer diffsb .deinit (allocator );
442453
443454 try diffs .appendSlice (allocator , diffsb .items );
444455 return diffs ;
@@ -654,8 +665,8 @@ fn diffCleanupMerge(allocator: std.mem.Allocator, diffs: *std.ArrayListUnmanaged
654665 std .mem .copy (u8 , nt , diffs .items [ii ].text );
655666 std .mem .copy (u8 , nt [diffs .items [ii ].text .len .. ], text_insert .items [0.. common_length ]);
656667
657- diffs .items [ii ].text = nt ;
658668 allocator .free (diffs .items [ii ].text );
669+ diffs .items [ii ].text = nt ;
659670 } else {
660671 // diffs.Insert(0, new Diff(Operation.EQUAL,
661672 // text_insert.Substring(0, common_length)));
@@ -698,9 +709,9 @@ fn diffCleanupMerge(allocator: std.mem.Allocator, diffs: *std.ArrayListUnmanaged
698709 std .mem .copy (u8 , nt , diffs .items [pointer - 1 ].text );
699710 std .mem .copy (u8 , nt [diffs .items [pointer - 1 ].text .len .. ], diffs .items [pointer ].text );
700711
712+ // allocator.free(diffs.items[pointer - 1].text);
701713 diffs .items [pointer - 1 ].text = nt ;
702- allocator .free (diffs .items [pointer - 1 ].text );
703- allocator .free (diffs .items [pointer ].text );
714+ // allocator.free(diffs.items[pointer].text);
704715
705716 // try diffs.items[pointer - 1].text.append(allocator, diffs.items[pointer].text.items);
706717 _ = diffs .orderedRemove (pointer );
@@ -743,8 +754,8 @@ fn diffCleanupMerge(allocator: std.mem.Allocator, diffs: *std.ArrayListUnmanaged
743754 });
744755 const p1t = try std .mem .concat (allocator , u8 , &.{ diffs .items [pointer - 1 ].text , diffs .items [pointer + 1 ].text });
745756
746- allocator .free (diffs .items [pointer ].text );
747- allocator .free (diffs .items [pointer + 1 ].text );
757+ // allocator.free(diffs.items[pointer].text);
758+ // allocator.free(diffs.items[pointer + 1].text);
748759
749760 diffs .items [pointer ].text = pt ;
750761 diffs .items [pointer + 1 ].text = p1t ;
@@ -763,8 +774,8 @@ fn diffCleanupMerge(allocator: std.mem.Allocator, diffs: *std.ArrayListUnmanaged
763774 diffs .items [pointer + 1 ].text ,
764775 });
765776
766- allocator .free (diffs .items [pointer - 1 ].text );
767- allocator .free (diffs .items [pointer ].text );
777+ // allocator.free(diffs.items[pointer - 1].text);
778+ // allocator.free(diffs.items[pointer].text);
768779
769780 diffs .items [pointer - 1 ].text = pm1t ;
770781 diffs .items [pointer ].text = pt ;
@@ -1179,10 +1190,29 @@ fn diffCommonOverlap(text1_in: []const u8, text2_in: []const u8) usize {
11791190 }
11801191}
11811192
1193+ // pub fn main() void {
1194+ // var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
1195+ // defer arena.deinit();
1196+
1197+ // var bruh = default.diff(arena.allocator(), "Hello World.", "Goodbye World.", true);
1198+ // std.log.err("{any}", .{bruh});
1199+ // }
1200+
11821201test {
11831202 var arena = std .heap .ArenaAllocator .init (std .testing .allocator );
11841203 defer arena .deinit ();
11851204
1186- var bruh = default .diff (arena .allocator (), "Hello World." , "Goodbye World." , true );
1187- std .log .err ("{any}" , .{bruh });
1205+ var bruh = try default .diff (arena .allocator (), "Hello World." , "Goodbye World." , true );
1206+ try diffCleanupSemantic (arena .allocator (), & bruh );
1207+ for (bruh .items ) | b | {
1208+ std .log .err ("{any}" , .{b });
1209+ }
1210+
1211+ // for (bruh.items) |b| {
1212+ // std.log.err("{s} {s}", .{ switch (b.operation) {
1213+ // .equal => "",
1214+ // .insert => "+",
1215+ // .delete => "-",
1216+ // }, b.text });
1217+ // }
11881218}
0 commit comments