Skip to content

Commit e71e575

Browse files
committed
No longer sefaults
1 parent 11c8387 commit e71e575

1 file changed

Lines changed: 49 additions & 19 deletions

File tree

DiffMatchPatch.zig

Lines changed: 49 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
11821201
test {
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

Comments
 (0)