summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README.md15
-rw-r--r--src/Normalize.zig9
2 files changed, 22 insertions, 2 deletions
diff --git a/README.md b/README.md
index 5d2318e..1069eef 100644
--- a/README.md
+++ b/README.md
@@ -4,11 +4,11 @@ zg provides Unicode text processing for Zig projects.
4 4
5## Unicode Version 5## Unicode Version
6 6
7The Unicode version supported by zg is 15.1.0. 7The Unicode version supported by zg is `15.1.0`.
8 8
9## Zig Version 9## Zig Version
10 10
11The minimum Zig version required is 0.14 dev. 11The minimum Zig version required is `0.14`.
12 12
13## Integrating zg into your Zig Project 13## Integrating zg into your Zig Project
14 14
@@ -325,6 +325,17 @@ test "Normalization" {
325 try expect(try n.eql(allocator, "foϓ", "fo\u{03D2}\u{0301}")); 325 try expect(try n.eql(allocator, "foϓ", "fo\u{03D2}\u{0301}"));
326} 326}
327``` 327```
328The `Result` returned by normalization functions may or may not be copied from the
329inputs given. For example, an all-ASCII input does not need to be a copy, and will
330be a view of the original slice. Calling `result.deinit(allocator)` will only free
331an allocated `Result`, not one which is a view. Thus it is safe to do
332unconditionally.
333
334This does mean that the validity of a `Result` can depend on the original string
335staying in memory. To ensure that your `Result` is always a copy, you may call
336`try result.toOwned(allocator)`, which will only make a copy if one was not
337already made.
338
328 339
329## Caseless Matching via Case Folding 340## Caseless Matching via Case Folding
330 341
diff --git a/src/Normalize.zig b/src/Normalize.zig
index 7b87406..97c2649 100644
--- a/src/Normalize.zig
+++ b/src/Normalize.zig
@@ -220,10 +220,19 @@ test "decompose" {
220} 220}
221 221
222/// Returned from various functions in this namespace. Remember to call `deinit` to free any allocated memory. 222/// Returned from various functions in this namespace. Remember to call `deinit` to free any allocated memory.
223/// Note that normalization functions will not copy what they're given if no normalization is needed, if you
224/// need to ensure that this Result outlasts the given string, call `try result.toOwned(allocator)`. This
225/// will not make a third copy if the Result is already copied from the input.
223pub const Result = struct { 226pub const Result = struct {
224 allocated: bool = false, 227 allocated: bool = false,
225 slice: []const u8, 228 slice: []const u8,
226 229
230 /// Ensures that the slice result is a copy of the input, by making a copy if it was not.
231 pub fn toOwned(result: Result, allocator: mem.Allocator) error{OutOfMemory}!Result {
232 if (result.allocatod) return result;
233 return .{ .allocated = true, .slice = try allocator.dupe(u8, result.slice) };
234 }
235
227 pub fn deinit(self: *const Result, allocator: mem.Allocator) void { 236 pub fn deinit(self: *const Result, allocator: mem.Allocator) void {
228 if (self.allocated) allocator.free(self.slice); 237 if (self.allocated) allocator.free(self.slice);
229 } 238 }