~jan0sch/rig

Showing details for patch d38cfb96036787d39cbdb922a638542ba2f90ba2.
2025-04-05 (Sat), 4:08 PM - Jens Grassel - d38cfb96036787d39cbdb922a638542ba2f90ba2

Panicking during a panic. :-)

Summary of changes
1 files modified with 63 lines added and 31 lines removed
  • src/main.zig with 63 added and 31 removed lines
diff -rN -u old-rig/src/main.zig new-rig/src/main.zig
--- old-rig/src/main.zig	2025-04-19 21:38:56.189663207 +0000
+++ new-rig/src/main.zig	2025-04-19 21:38:56.193663202 +0000
@@ -5,6 +5,7 @@
 
 pub fn main() !void {
     var gpa_alloc = std.heap.GeneralPurposeAllocator(.{}){};
+    defer _ = gpa_alloc.deinit();
     const alloc = gpa_alloc.allocator();
 
     var seed: u64 = undefined;
@@ -29,29 +30,47 @@
     const root_path = if (home != null) home.? else "/usr";
     const local_path = if (home != null) ".local" else "local";
 
-    const forenames = try std.fmt.allocPrint(alloc, "{s}/{s}/{s}/forenames/{s}.txt", .{ root_path, local_path, base_path, country });
-    defer alloc.free(forenames);
-    const surnames = try std.fmt.allocPrint(alloc, "{s}/{s}/{s}/surnames/{s}.txt", .{ root_path, local_path, base_path, country });
-    defer alloc.free(surnames);
-    const zips = try std.fmt.allocPrint(alloc, "{s}/{s}/{s}/zips/{s}.tsv", .{ root_path, local_path, base_path, country });
-    defer alloc.free(zips);
+    const forenames_path = try std.fmt.allocPrint(alloc, "{s}/{s}/{s}/forenames/{s}.txt", .{ root_path, local_path, base_path, country });
+    defer alloc.free(forenames_path);
+    const surnames_path = try std.fmt.allocPrint(alloc, "{s}/{s}/{s}/surnames/{s}.txt", .{ root_path, local_path, base_path, country });
+    defer alloc.free(surnames_path);
+    const zip_codes_path = try std.fmt.allocPrint(alloc, "{s}/{s}/{s}/zips/{s}.tsv", .{ root_path, local_path, base_path, country });
+    defer alloc.free(zip_codes_path);
 
     const stdout_file = std.io.getStdOut().writer();
     var bw = std.io.bufferedWriter(stdout_file);
     const stdout = bw.writer();
 
-    try stdout.print("Looking for {s}, {s}, {s}\n", .{ forenames, surnames, zips });
+    //try stdout.print("Looking for {s}, {s}, {s}\n", .{ forenames_path, surnames_path, zip_codes_path });
 
-    const f_lines = try readData(alloc, forenames);
-    defer f_lines.deinit();
+    const forenames = try readData(alloc, forenames_path);
+    defer forenames.deinit();
+    const forenames_count: u32 = @intCast(forenames.items.len - 1);
+    const forename_index = calculateRandomEntry(random, forenames_count);
+    //try stdout.print("Using forename {d} of {d}.\n", .{ forename_index, forenames_count });
+    const random_forename = forenames.items[forename_index];
+    defer alloc.free(random_forename);
+
+    const surnames = try readData(alloc, surnames_path);
+    defer surnames.deinit();
+    const surnames_count: u32 = @intCast(surnames.items.len - 1);
+    const surname_index = calculateRandomEntry(random, surnames_count);
+    //try stdout.print("Using surname {d} of {d}.\n", .{ surname_index, surnames_count });
+    const random_surname = surnames.items[surname_index];
+    defer alloc.free(random_surname);
+
+    const zip_codes = try readData(alloc, zip_codes_path);
+    defer zip_codes.deinit();
+    const zip_codes_count: u32 = @intCast(zip_codes.items.len - 1);
+    const zip_code_index = calculateRandomEntry(random, zip_codes_count);
+    //try stdout.print("Using zip code {d} of {d}.\n", .{ zip_code_index, zip_codes_count });
+    const random_zip_code = zip_codes.items[zip_code_index];
+    defer alloc.free(random_zip_code);
 
-    const f_max: u32 = @intCast(f_lines.items.len - 1);
-    const f_rand = calculateRandomEntry(random, f_max);
-    std.debug.print("Using forename {d} of {d}.\n", .{ f_rand, f_max });
-
-    const f_name = f_lines.items[1];
-    std.debug.print("n: {s}\n", .{&f_name});
-    //try stdout.print("Got {s}.", .{f_name});
+    const random_address = try alloc.dupe(u8, random_zip_code);
+    std.mem.replaceScalar(u8, random_address, '\t', ' ');
+
+    try stdout.print("{s} {s}, {s}\n", .{random_forename, random_surname, random_address});
 
     try bw.flush(); // don't forget to flush!
 }
@@ -65,19 +84,32 @@
     const file = try fs.openFileAbsolute(path, .{});
     defer file.close();
 
-    const stat = try file.stat();
-    const buffer = try file.readToEndAlloc(allocator, stat.size);
-    defer allocator.free(buffer);
-    var lines = std.mem.split(u8, buffer, "\n");
-    errdefer allocator.free(lines);
-    var result = std.ArrayList([]const u8).init(allocator);
-    errdefer result.deinit();
-    while (lines.next()) |line| {
-        result.append(line) catch |e| {
-            switch (e) {
-                else => std.debug.print("error: {any}", .{e}),
+    var buf_reader = std.io.bufferedReader(file.reader());
+    const reader = buf_reader.reader();
+
+    var lines = std.ArrayList([]const u8).init(allocator);
+    errdefer lines.deinit();
+
+    var line = std.ArrayList(u8).init(allocator);
+    defer line.deinit();
+
+    const writer = line.writer();
+    while (reader.streamUntilDelimiter(writer, '\n', null)) {
+        defer line.clearRetainingCapacity();
+        //std.debug.print("read line: '{s}'\n", .{line.items});
+        const str = try std.fmt.allocPrint(allocator, "{s}", .{line.items});
+        errdefer allocator.free(str);
+        try lines.append(str);
+    } else |e| switch (e) {
+        error.EndOfStream => {
+            if (line.items.len > 0) {
+                //std.debug.print("read line: '{s}'\n", .{line.items});
+                const str = try std.fmt.allocPrint(allocator, "{s}", .{line.items});
+                errdefer allocator.free(str);
+                try lines.append(str);
             }
-        };
+        },
+        else => return e, // Escalate error.
     }
-    return result;
+    return lines;
 }