summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMatthias Andreas Benkard <code@mail.matthias.benkard.de>2025-08-13 21:28:33 +0200
committerMatthias Andreas Benkard <code@mail.matthias.benkard.de>2025-08-13 21:28:33 +0200
commit7438ec97b41719d743d252d83840d51f4e4d8d04 (patch)
tree0aa17a44a7f0420fc0e8ba02522fc7a78b58be43 /src
parentdfda112f0331b7514bc8cdce5c89b593ffefa9f2 (diff)
Split off paths module.
Diffstat (limited to 'src')
-rw-r--r--src/eval.zig126
-rw-r--r--src/paths.zig125
2 files changed, 129 insertions, 122 deletions
diff --git a/src/eval.zig b/src/eval.zig
index 91c03b0..aeebba3 100644
--- a/src/eval.zig
+++ b/src/eval.zig
@@ -12,6 +12,10 @@ const FileSpec = syntax.FileSpec;
const RedirectType = syntax.RedirectType;
const Redirect = syntax.Redirect;
+const paths = @import("paths.zig");
+const formatDosPath = paths.formatDosPath;
+const convertTo83 = paths.convertTo83;
+
const STDOUT_BUFFER_SIZE: usize = 1024;
const STDERR_BUFFER_SIZE: usize = 1024;
@@ -75,128 +79,6 @@ const InputSource = struct {
}
};
-fn formatDosPath(allocator: Allocator, path: []const u8) ![]const u8 {
- var result = ArrayList(u8).init(allocator);
- defer result.deinit();
-
- // Convert path to DOS format with uppercase drive letter and backslashes
- var converted_path = ArrayList(u8).init(allocator);
- defer converted_path.deinit();
-
- for (path) |ch| {
- if (ch == '/') {
- try converted_path.append('\\');
- } else {
- try converted_path.append(std.ascii.toUpper(ch));
- }
- }
-
- // Split into components and convert each to 8.3 format
- var it = std.mem.splitScalar(u8, converted_path.items, '\\');
- var first = true;
-
- while (it.next()) |component| {
- if (component.len == 0) continue;
-
- if (!first) {
- try result.append('\\');
- }
- first = false;
-
- // Convert component to 8.3 format
- const short_name = try convertTo83(allocator, component);
- defer allocator.free(short_name);
- try result.appendSlice(short_name);
- }
-
- // Ensure it starts with a drive letter if it's an absolute path
- if (result.items.len == 0 or (result.items.len >= 1 and result.items[0] == '\\')) {
- var prefixed = ArrayList(u8).init(allocator);
- defer prefixed.deinit();
- try prefixed.appendSlice("C:");
- if (result.items.len > 0 and result.items[0] != '\\') {
- try prefixed.append('\\');
- }
- try prefixed.appendSlice(result.items);
- return allocator.dupe(u8, prefixed.items);
- }
-
- return allocator.dupe(u8, result.items);
-}
-
-fn convertTo83(allocator: Allocator, filename: []const u8) ![]const u8 {
- // Handle special directories
- if (std.mem.eql(u8, filename, ".") or std.mem.eql(u8, filename, "..")) {
- return allocator.dupe(u8, filename);
- }
-
- // Handle drive letters (like C:)
- if (filename.len == 2 and filename[1] == ':') {
- return allocator.dupe(u8, filename);
- }
-
- // Split filename and extension
- var name_part: []const u8 = filename;
- var ext_part: []const u8 = "";
-
- if (std.mem.lastIndexOf(u8, filename, ".")) |dot_pos| {
- if (dot_pos > 0) { // Don't treat leading dot as extension separator
- name_part = filename[0..dot_pos];
- ext_part = filename[dot_pos + 1 ..];
- }
- }
-
- // Clean name part (remove spaces and invalid chars, convert to uppercase)
- var clean_name = ArrayList(u8).init(allocator);
- defer clean_name.deinit();
-
- for (name_part) |ch| {
- if (std.ascii.isAlphanumeric(ch)) {
- try clean_name.append(std.ascii.toUpper(ch));
- } else if (ch == '-' or ch == '_') {
- try clean_name.append(ch);
- }
- // Skip spaces and other invalid characters
- }
-
- // Clean extension part (max 3 chars, uppercase)
- var clean_ext = ArrayList(u8).init(allocator);
- defer clean_ext.deinit();
-
- for (ext_part) |ch| {
- if (clean_ext.items.len >= 3) break;
- if (std.ascii.isAlphanumeric(ch)) {
- try clean_ext.append(std.ascii.toUpper(ch));
- }
- }
-
- // Build 8.3 filename
- var result = ArrayList(u8).init(allocator);
- defer result.deinit();
-
- if (clean_name.items.len <= 8 and clean_ext.items.len <= 3) {
- // Name fits in 8.3, use as-is
- try result.appendSlice(clean_name.items);
- if (clean_ext.items.len > 0) {
- try result.append('.');
- try result.appendSlice(clean_ext.items);
- }
- } else {
- // Need to abbreviate with ~1
- const max_name_len = if (clean_name.items.len > 6) 6 else clean_name.items.len;
- try result.appendSlice(clean_name.items[0..max_name_len]);
- try result.appendSlice("~1");
-
- if (clean_ext.items.len > 0) {
- try result.append('.');
- const max_ext_len = if (clean_ext.items.len > 3) 3 else clean_ext.items.len;
- try result.appendSlice(clean_ext.items[0..max_ext_len]);
- }
- }
-
- return allocator.dupe(u8, result.items);
-}
-
fn formatDosDateTime(allocator: Allocator, timestamp_secs: i64) ![]const u8 {
const epoch_seconds = @as(u64, @intCast(@max(timestamp_secs, 0)));
const epoch_day = @divFloor(epoch_seconds, std.time.s_per_day);
diff --git a/src/paths.zig b/src/paths.zig
new file mode 100644
index 0000000..b64ff04
--- /dev/null
+++ b/src/paths.zig
@@ -0,0 +1,125 @@
+const std = @import("std");
+const Allocator = std.mem.Allocator;
+const ArrayList = std.ArrayList;
+
+pub fn formatDosPath(allocator: Allocator, path: []const u8) ![]const u8 {
+ var result = ArrayList(u8).init(allocator);
+ defer result.deinit();
+
+ // Convert path to DOS format with uppercase drive letter and backslashes
+ var converted_path = ArrayList(u8).init(allocator);
+ defer converted_path.deinit();
+
+ for (path) |ch| {
+ if (ch == '/') {
+ try converted_path.append('\\');
+ } else {
+ try converted_path.append(std.ascii.toUpper(ch));
+ }
+ }
+
+ // Split into components and convert each to 8.3 format
+ var it = std.mem.splitScalar(u8, converted_path.items, '\\');
+ var first = true;
+
+ while (it.next()) |component| {
+ if (component.len == 0) continue;
+
+ if (!first) {
+ try result.append('\\');
+ }
+ first = false;
+
+ // Convert component to 8.3 format
+ const short_name = try convertTo83(allocator, component);
+ defer allocator.free(short_name);
+ try result.appendSlice(short_name);
+ }
+
+ // Ensure it starts with a drive letter if it's an absolute path
+ if (result.items.len == 0 or (result.items.len >= 1 and result.items[0] == '\\')) {
+ var prefixed = ArrayList(u8).init(allocator);
+ defer prefixed.deinit();
+ try prefixed.appendSlice("C:");
+ if (result.items.len > 0 and result.items[0] != '\\') {
+ try prefixed.append('\\');
+ }
+ try prefixed.appendSlice(result.items);
+ return allocator.dupe(u8, prefixed.items);
+ }
+
+ return allocator.dupe(u8, result.items);
+}
+
+pub fn convertTo83(allocator: Allocator, filename: []const u8) ![]const u8 {
+ // Handle special directories
+ if (std.mem.eql(u8, filename, ".") or std.mem.eql(u8, filename, "..")) {
+ return allocator.dupe(u8, filename);
+ }
+
+ // Handle drive letters (like C:)
+ if (filename.len == 2 and filename[1] == ':') {
+ return allocator.dupe(u8, filename);
+ }
+
+ // Split filename and extension
+ var name_part: []const u8 = filename;
+ var ext_part: []const u8 = "";
+
+ if (std.mem.lastIndexOf(u8, filename, ".")) |dot_pos| {
+ if (dot_pos > 0) { // Don't treat leading dot as extension separator
+ name_part = filename[0..dot_pos];
+ ext_part = filename[dot_pos + 1 ..];
+ }
+ }
+
+ // Clean name part (remove spaces and invalid chars, convert to uppercase)
+ var clean_name = ArrayList(u8).init(allocator);
+ defer clean_name.deinit();
+
+ for (name_part) |ch| {
+ if (std.ascii.isAlphanumeric(ch)) {
+ try clean_name.append(std.ascii.toUpper(ch));
+ } else if (ch == '-' or ch == '_') {
+ try clean_name.append(ch);
+ }
+ // Skip spaces and other invalid characters
+ }
+
+ // Clean extension part (max 3 chars, uppercase)
+ var clean_ext = ArrayList(u8).init(allocator);
+ defer clean_ext.deinit();
+
+ for (ext_part) |ch| {
+ if (clean_ext.items.len >= 3) break;
+ if (std.ascii.isAlphanumeric(ch)) {
+ try clean_ext.append(std.ascii.toUpper(ch));
+ }
+ }
+
+ // Build 8.3 filename
+ var result = ArrayList(u8).init(allocator);
+ defer result.deinit();
+
+ if (clean_name.items.len <= 8 and clean_ext.items.len <= 3) {
+ // Name fits in 8.3, use as-is
+ try result.appendSlice(clean_name.items);
+ if (clean_ext.items.len > 0) {
+ try result.append('.');
+ try result.appendSlice(clean_ext.items);
+ }
+ } else {
+ // Need to abbreviate with ~1
+ const max_name_len = if (clean_name.items.len > 6) 6 else clean_name.items.len;
+ try result.appendSlice(clean_name.items[0..max_name_len]);
+ try result.appendSlice("~1");
+
+ if (clean_ext.items.len > 0) {
+ try result.append('.');
+ const max_ext_len = if (clean_ext.items.len > 3) 3 else clean_ext.items.len;
+ try result.appendSlice(clean_ext.items[0..max_ext_len]);
+ }
+ }
+
+ return allocator.dupe(u8, result.items);
+}