From 92d564a246da4cfa5c1425e7604ffc95f4ea4e8c Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Sat, 1 Oct 2022 10:32:54 -0700 Subject: [PATCH] macos/foundation: more string funcs --- pkg/macos/foundation.zig | 1 + pkg/macos/foundation/base.zig | 5 +++++ pkg/macos/foundation/string.zig | 35 +++++++++++++++++++++++++++++++-- 3 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 pkg/macos/foundation/base.zig diff --git a/pkg/macos/foundation.zig b/pkg/macos/foundation.zig index 6dff4b8b5..ce969293e 100644 --- a/pkg/macos/foundation.zig +++ b/pkg/macos/foundation.zig @@ -1,4 +1,5 @@ pub usingnamespace @import("foundation/array.zig"); +pub usingnamespace @import("foundation/base.zig"); pub usingnamespace @import("foundation/dictionary.zig"); pub usingnamespace @import("foundation/string.zig"); pub usingnamespace @import("foundation/type.zig"); diff --git a/pkg/macos/foundation/base.zig b/pkg/macos/foundation/base.zig new file mode 100644 index 000000000..b48d6df38 --- /dev/null +++ b/pkg/macos/foundation/base.zig @@ -0,0 +1,5 @@ +pub const ComparisonResult = enum(c_int) { + less = -1, + equal = 0, + greater = 1, +}; diff --git a/pkg/macos/foundation/string.zig b/pkg/macos/foundation/string.zig index a0f0380c3..9414bec4c 100644 --- a/pkg/macos/foundation/string.zig +++ b/pkg/macos/foundation/string.zig @@ -1,6 +1,6 @@ const std = @import("std"); const Allocator = std.mem.Allocator; -const cftype = @import("type.zig"); +const foundation = @import("../foundation.zig"); pub const String = opaque { pub fn createWithBytes( @@ -18,13 +18,24 @@ pub const String = opaque { } pub fn release(self: *String) void { - cftype.CFRelease(self); + foundation.CFRelease(self); } pub fn hasPrefix(self: *String, prefix: *String) bool { return CFStringHasPrefix(self, prefix) == 1; } + pub fn compare( + self: *String, + other: *String, + options: StringComparison, + ) foundation.ComparisonResult { + return @intToEnum( + foundation.ComparisonResult, + CFStringCompare(self, other, @bitCast(c_int, options)), + ); + } + pub extern "c" fn CFStringCreateWithBytes( allocator: ?*anyopaque, bytes: [*]const u8, @@ -33,6 +44,25 @@ pub const String = opaque { is_external: bool, ) ?*String; pub extern "c" fn CFStringHasPrefix(*String, *String) u8; + pub extern "c" fn CFStringCompare(*String, *String, c_int) c_int; +}; + +pub const StringComparison = packed struct { + case_insensitive: bool = false, + _unused_2: bool = false, + backwards: bool = false, + anchored: bool = false, + nonliteral: bool = false, + localized: bool = false, + numerically: bool = false, + diacritic_insensitive: bool = false, + width_insensitive: bool = false, + forced_ordering: bool = false, + _padding: u22 = 0, + + test { + try std.testing.expectEqual(@bitSizeOf(c_int), @bitSizeOf(StringComparison)); + } }; /// https://developer.apple.com/documentation/corefoundation/cfstringencoding?language=objc @@ -63,4 +93,5 @@ test "string" { defer prefix.release(); try testing.expect(str.hasPrefix(prefix)); + try testing.expectEqual(foundation.ComparisonResult.equal, str.compare(str, .{})); }