40 lines
1.3 KiB
Zig
40 lines
1.3 KiB
Zig
const std = @import("std");
|
|
const c_iokit = @cImport(@cInclude("IOKit/IOKitLib.h"));
|
|
|
|
/// Converts a CFTypeRef casted to CFStringRef to a Zig string.
|
|
pub fn cfTypeRefToZigString(allocator: std.mem.Allocator, cf_type_ref: c_iokit.CFTypeRef) ![]u8 {
|
|
const cf_string: c_iokit.CFStringRef = @ptrFromInt(@intFromPtr(cf_type_ref));
|
|
|
|
const length = c_iokit.CFStringGetLength(cf_string);
|
|
const max_size = c_iokit.CFStringGetMaximumSizeForEncoding(length, c_iokit.kCFStringEncodingUTF8) + 1;
|
|
const max_size_usize = @as(usize, @intCast(max_size));
|
|
|
|
const buffer = try allocator.alloc(u8, max_size_usize);
|
|
errdefer allocator.free(buffer);
|
|
|
|
if (c_iokit.CFStringGetCString(cf_string, buffer.ptr, @as(c_iokit.CFIndex, @intCast(buffer.len)), c_iokit.kCFStringEncodingUTF8) == c_iokit.FALSE) {
|
|
return error.StringConversionFailed;
|
|
}
|
|
|
|
var actual_len: usize = 0;
|
|
while (actual_len < buffer.len and buffer[actual_len] != 0) {
|
|
actual_len += 1;
|
|
}
|
|
|
|
return allocator.realloc(buffer, actual_len);
|
|
}
|
|
|
|
pub fn countEntries(dir_path: []const u8) !usize {
|
|
var dir = try std.fs.openDirAbsolute(dir_path, .{ .iterate = true });
|
|
defer dir.close();
|
|
|
|
var count: usize = 0;
|
|
var iter = dir.iterate();
|
|
|
|
while (try iter.next()) |_| {
|
|
count += 1;
|
|
}
|
|
|
|
return count;
|
|
}
|