search: case-insesitive (ascii) search

pull/9687/head
Mitchell Hashimoto 2025-11-24 20:25:25 -08:00
parent de16e4a92b
commit bb21c3d6b3
No known key found for this signature in database
GPG Key ID: 523D5DC389D273BC
1 changed files with 47 additions and 4 deletions

View File

@ -174,7 +174,7 @@ pub const SlidingWindow = struct {
}; };
// Search the first slice for the needle. // Search the first slice for the needle.
if (std.mem.indexOf(u8, slices[0], self.needle)) |idx| { if (std.ascii.indexOfIgnoreCase(slices[0], self.needle)) |idx| {
return self.highlight( return self.highlight(
idx, idx,
self.needle.len, self.needle.len,
@ -200,8 +200,7 @@ pub const SlidingWindow = struct {
@memcpy(self.overlap_buf[prefix.len..overlap_len], suffix); @memcpy(self.overlap_buf[prefix.len..overlap_len], suffix);
// Search the overlap // Search the overlap
const idx = std.mem.indexOf( const idx = std.ascii.indexOfIgnoreCase(
u8,
self.overlap_buf[0..overlap_len], self.overlap_buf[0..overlap_len],
self.needle, self.needle,
) orelse break :overlap; ) orelse break :overlap;
@ -215,7 +214,7 @@ pub const SlidingWindow = struct {
} }
// Search the last slice for the needle. // Search the last slice for the needle.
if (std.mem.indexOf(u8, slices[1], self.needle)) |idx| { if (std.ascii.indexOfIgnoreCase(slices[1], self.needle)) |idx| {
return self.highlight( return self.highlight(
slices[0].len + idx, slices[0].len + idx,
self.needle.len, self.needle.len,
@ -660,6 +659,50 @@ test "SlidingWindow single append" {
try testing.expect(w.next() == null); try testing.expect(w.next() == null);
} }
test "SlidingWindow single append case insensitive ASCII" {
const testing = std.testing;
const alloc = testing.allocator;
var w: SlidingWindow = try .init(alloc, .forward, "Boo!");
defer w.deinit();
var s = try Screen.init(alloc, .{ .cols = 80, .rows = 24, .max_scrollback = 0 });
defer s.deinit();
try s.testWriteString("hello. boo! hello. boo!");
// We want to test single-page cases.
try testing.expect(s.pages.pages.first == s.pages.pages.last);
const node: *PageList.List.Node = s.pages.pages.first.?;
_ = try w.append(node);
// We should be able to find two matches.
{
const h = w.next().?;
const sel = h.untracked();
try testing.expectEqual(point.Point{ .active = .{
.x = 7,
.y = 0,
} }, s.pages.pointFromPin(.active, sel.start));
try testing.expectEqual(point.Point{ .active = .{
.x = 10,
.y = 0,
} }, s.pages.pointFromPin(.active, sel.end));
}
{
const h = w.next().?;
const sel = h.untracked();
try testing.expectEqual(point.Point{ .active = .{
.x = 19,
.y = 0,
} }, s.pages.pointFromPin(.active, sel.start));
try testing.expectEqual(point.Point{ .active = .{
.x = 22,
.y = 0,
} }, s.pages.pointFromPin(.active, sel.end));
}
try testing.expect(w.next() == null);
try testing.expect(w.next() == null);
}
test "SlidingWindow single append no match" { test "SlidingWindow single append no match" {
const testing = std.testing; const testing = std.testing;
const alloc = testing.allocator; const alloc = testing.allocator;