Files

59 lines
1.5 KiB
Zig

const std = @import("std");
const Self = @This();
fh: std.fs.File,
dat: []u8,
buf: []u8,
perc: u8 = 0,
pub fn init(self: *Self, alloc: std.mem.Allocator) !void {
self.fh = try std.fs.openFileAbsolute("/proc/meminfo", .{ .mode = .read_only });
errdefer self.fh.close();
self.dat = try alloc.alloc(u8, 256);
errdefer alloc.free(self.dat);
self.buf = try alloc.alloc(u8, 256);
errdefer alloc.free(self.buf);
}
pub fn update(self: *Self) ![]const u8 {
try self.fh.seekTo(0);
var br = std.io.bufferedReader(self.fh.reader());
const reader = br.reader();
var total: u32 = undefined;
var free: u32 = undefined;
var avail: u32 = undefined;
for (0..3) |_| {
const line = try reader.readUntilDelimiterOrEof(self.dat, '\n');
var tokens = std.mem.tokenizeAny(u8, line.?, ": ");
const label = tokens.next().?;
const value = try std.fmt.parseInt(u32, tokens.next().?, 10);
if (std.mem.eql(u8, label, "MemTotal")) {
total = value;
} else if (std.mem.eql(u8, label, "MemFree")) {
free = value;
} else if (std.mem.eql(u8, label, "MemAvailable")) {
avail = value;
}
}
const perc_used: u8 = @intCast(@divFloor(1 + 2 * 100 * (total - avail), 2 * total));
return try std.fmt.bufPrint(
self.buf,
"mem: {d: >2}%",
.{perc_used},
);
}
pub fn deinit(self: Self, alloc: std.mem.Allocator) void {
self.fh.close();
alloc.free(self.dat);
alloc.free(self.buf);
}