pkg/macos: start core foundation bindings

This commit is contained in:
Mitchell Hashimoto
2022-09-30 14:03:37 -07:00
parent a3d9dad726
commit ab4491a45d
6 changed files with 92 additions and 0 deletions

24
pkg/macos/build.zig Normal file
View File

@@ -0,0 +1,24 @@
const std = @import("std");
const builtin = @import("builtin");
pub const pkg = std.build.Pkg{
.name = "macos",
.source = .{ .path = thisDir() ++ "/main.zig" },
};
fn thisDir() []const u8 {
return std.fs.path.dirname(@src().file) orelse ".";
}
pub const Options = struct {};
pub fn link(
b: *std.build.Builder,
step: *std.build.LibExeObjStep,
opt: Options,
) !*std.build.LibExeObjStep {
_ = opt;
const lib = b.addStaticLibrary("macos", null);
step.linkFramework("CoreFoundation");
return lib;
}

6
pkg/macos/foundation.zig Normal file
View File

@@ -0,0 +1,6 @@
pub usingnamespace @import("foundation/string.zig");
pub usingnamespace @import("foundation/type.zig");
test {
@import("std").testing.refAllDecls(@This());
}

View File

@@ -0,0 +1,54 @@
const std = @import("std");
const Allocator = std.mem.Allocator;
const cftype = @import("type.zig");
pub const String = opaque {
pub fn createWithBytes(
bs: []const u8,
encoding: StringEncoding,
external: bool,
) Allocator.Error!*String {
return CFStringCreateWithBytes(
null,
bs.ptr,
bs.len,
@enumToInt(encoding),
external,
) orelse Allocator.Error.OutOfMemory;
}
pub fn release(self: *String) void {
cftype.CFRelease(self);
}
pub extern "c" fn CFStringCreateWithBytes(
allocator: ?*anyopaque,
bytes: [*]const u8,
numBytes: usize,
encooding: u32,
is_external: bool,
) ?*String;
};
/// https://developer.apple.com/documentation/corefoundation/cfstringencoding?language=objc
pub const StringEncoding = enum(u32) {
invalid = 0xffffffff,
mac_roman = 0,
windows_latin1 = 0x0500,
iso_latin1 = 0x0201,
nextstep_latin = 0x0B01,
ascii = 0x0600,
unicode = 0x0100,
utf8 = 0x08000100,
non_lossy_ascii = 0x0BFF,
utf16_be = 0x10000100,
utf16_le = 0x14000100,
utf32 = 0x0c000100,
utf32_be = 0x18000100,
utf32_le = 0x1c000100,
};
test "string" {
const str = try String.createWithBytes("hello world", .ascii, false);
defer str.release();
}

View File

@@ -0,0 +1 @@
pub extern "c" fn CFRelease(*anyopaque) void;

5
pkg/macos/main.zig Normal file
View File

@@ -0,0 +1,5 @@
pub const foundation = @import("foundation.zig");
test {
@import("std").testing.refAllDecls(@This());
}