summaryrefslogtreecommitdiff
path: root/src/Normalizer.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/Normalizer.zig')
-rw-r--r--src/Normalizer.zig30
1 files changed, 26 insertions, 4 deletions
diff --git a/src/Normalizer.zig b/src/Normalizer.zig
index c68b2ec..5a26dfa 100644
--- a/src/Normalizer.zig
+++ b/src/Normalizer.zig
@@ -389,6 +389,12 @@ fn nfkdCodePoints(
389 return try dcp_list.toOwnedSlice(); 389 return try dcp_list.toOwnedSlice();
390} 390}
391 391
392fn changesWhenCaseFolded(self: Self, cps: []const u21) bool {
393 return for (cps) |cp| {
394 if (self.norm_data.fold_data.changesWhenCaseFolded(cp)) break true;
395 } else false;
396}
397
392pub fn eqlIgnoreCase( 398pub fn eqlIgnoreCase(
393 self: Self, 399 self: Self,
394 allocator: mem.Allocator, 400 allocator: mem.Allocator,
@@ -397,10 +403,18 @@ pub fn eqlIgnoreCase(
397) !bool { 403) !bool {
398 if (ascii.isAsciiOnly(a) and ascii.isAsciiOnly(b)) return std.ascii.eqlIgnoreCase(a, b); 404 if (ascii.isAsciiOnly(a) and ascii.isAsciiOnly(b)) return std.ascii.eqlIgnoreCase(a, b);
399 405
406 // Process a
400 const nfd_a = try self.nfxdCodePoints(allocator, a, .nfd); 407 const nfd_a = try self.nfxdCodePoints(allocator, a, .nfd);
401 defer allocator.free(nfd_a); 408 defer allocator.free(nfd_a);
402 const cf_nfd_a = try self.caseFold(allocator, nfd_a); 409
403 defer allocator.free(cf_nfd_a); 410 var need_frr_cf_nfd_a = false;
411 var cf_nfd_a: []const u21 = nfd_a;
412 if (self.changesWhenCaseFolded(nfd_a)) {
413 cf_nfd_a = try self.caseFold(allocator, nfd_a);
414 need_frr_cf_nfd_a = true;
415 }
416 defer if (need_frr_cf_nfd_a) allocator.free(cf_nfd_a);
417
404 const nfkd_cf_nfd_a = try self.nfkdCodePoints(allocator, cf_nfd_a); 418 const nfkd_cf_nfd_a = try self.nfkdCodePoints(allocator, cf_nfd_a);
405 defer allocator.free(nfkd_cf_nfd_a); 419 defer allocator.free(nfkd_cf_nfd_a);
406 const cf_nfkd_cf_nfd_a = try self.caseFold(allocator, nfkd_cf_nfd_a); 420 const cf_nfkd_cf_nfd_a = try self.caseFold(allocator, nfkd_cf_nfd_a);
@@ -408,10 +422,18 @@ pub fn eqlIgnoreCase(
408 const nfkd_cf_nfkd_cf_nfd_a = try self.nfkdCodePoints(allocator, cf_nfkd_cf_nfd_a); 422 const nfkd_cf_nfkd_cf_nfd_a = try self.nfkdCodePoints(allocator, cf_nfkd_cf_nfd_a);
409 defer allocator.free(nfkd_cf_nfkd_cf_nfd_a); 423 defer allocator.free(nfkd_cf_nfkd_cf_nfd_a);
410 424
425 // Process b
411 const nfd_b = try self.nfxdCodePoints(allocator, b, .nfd); 426 const nfd_b = try self.nfxdCodePoints(allocator, b, .nfd);
412 defer allocator.free(nfd_b); 427 defer allocator.free(nfd_b);
413 const cf_nfd_b = try self.caseFold(allocator, nfd_b); 428
414 defer allocator.free(cf_nfd_b); 429 var need_frr_cf_nfd_b = false;
430 var cf_nfd_b: []const u21 = nfd_b;
431 if (self.changesWhenCaseFolded(nfd_b)) {
432 cf_nfd_b = try self.caseFold(allocator, nfd_b);
433 need_frr_cf_nfd_b = true;
434 }
435 defer if (need_frr_cf_nfd_b) allocator.free(cf_nfd_b);
436
415 const nfkd_cf_nfd_b = try self.nfkdCodePoints(allocator, cf_nfd_b); 437 const nfkd_cf_nfd_b = try self.nfkdCodePoints(allocator, cf_nfd_b);
416 defer allocator.free(nfkd_cf_nfd_b); 438 defer allocator.free(nfkd_cf_nfd_b);
417 const cf_nfkd_cf_nfd_b = try self.caseFold(allocator, nfkd_cf_nfd_b); 439 const cf_nfkd_cf_nfd_b = try self.caseFold(allocator, nfkd_cf_nfd_b);