From 3f6f94c13be77f0264e0b18f88f166d42e2a8770 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=AB=8F=E8=A8=AA=E5=AD=90?= Date: Sat, 29 Jul 2023 05:28:11 +0900 Subject: [PATCH] =?UTF-8?q?basename=E3=81=A8dirname=E3=82=92=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 2 ++ Makefile | 2 +- basename.zig | 95 ++++++++++++++++++++++++++++++++++++++++++++++++++++ dirname.zig | 87 +++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 185 insertions(+), 1 deletion(-) create mode 100644 basename.zig create mode 100644 dirname.zig diff --git a/CHANGELOG.md b/CHANGELOG.md index 1939281..cc2883e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,3 +12,5 @@ * trueを追加(完了) * falseを追加(完了) * wcを追加(完了) +* basenameを追加(完了) +* dirnameを追加(完了) diff --git a/Makefile b/Makefile index 7714d0a..64ffda8 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ NAME=coreutils VERSION := $(shell cat version.zig | grep "pub const version" | awk '{print $$5}' | sed "s/\"//g" | sed "s/;//") PREFIX=/usr MANPREFIX=${PREFIX}/share/man -PROG=cat cp echo false groups ls mkdir pwd rm touch true wc whoami +PROG=basename cat cp dirname echo false groups ls mkdir pwd rm touch true wc whoami CC=zig build-exe RELEASE=ReleaseSmall diff --git a/basename.zig b/basename.zig new file mode 100644 index 0000000..a0208e1 --- /dev/null +++ b/basename.zig @@ -0,0 +1,95 @@ +const std = @import("std"); +const fs = std.fs; +const io = std.io; + +const version = @import("version.zig").version; + +fn help() !void { + const stdof = io.getStdOut().writer(); + var bw = io.bufferedWriter(stdof); + const stdout = bw.writer(); + + try stdout.print("076 coreutils\n", .{}); + try stdout.print("使用法: basename 名前 [接尾辞]\n", .{}); + try stdout.print("パス名からディレクトリ部分を取り除いた名前を表示します。\n", .{}); + try stdout.print("指定があれば、末尾の接尾辞も取り除きます。\n\n", .{}); + try stdout.print("-h ヘルプを表示\n", .{}); + try stdout.print("-v バージョンを表示\n", .{}); + + try bw.flush(); +} + +fn ver() !void { + const stdof = io.getStdOut().writer(); + var bw = io.bufferedWriter(stdof); + const stdout = bw.writer(); + + try stdout.print("basename (076 coreutils) {s}\n", .{version}); + + try bw.flush(); +} + +pub fn main() !void { + var gpa = std.heap.GeneralPurposeAllocator(.{}){}; + defer _ = gpa.deinit(); + const alloc = gpa.allocator(); + + var option = std.ArrayList(u8).init(alloc); + defer option.deinit(); + + var name = std.ArrayList([]const u8).init(alloc); + defer name.deinit(); + + const args = try std.process.argsAlloc(alloc); + defer std.process.argsFree(alloc, args); + + for (args, 0..) |arg, i| { + if (i == 0) continue; + var m: [1]u8 = [_]u8{'-'}; + if (std.mem.eql(u8, arg[0..1], m[0..])) { + for (arg, 0..) |a, j| { + if (j == 0) continue; + try option.append(a); + } + } else { + try name.append(arg); + } + } + + for (option.items) |i| { + if (i == 'h') { + try help(); + return; + } + if (i == 'v') { + try ver(); + return; + } + } + + if (name.items.len == 0) { + try help(); + return; + } + + var basename: []const u8 = undefined; + + const stdof = io.getStdOut().writer(); + var bw = io.bufferedWriter(stdof); + const stdout = bw.writer(); + + for (name.items, 0..) |item, i| { + if (i > 1) break; + + if (i == 0) basename = fs.path.basename(item); + if (i == 1) { + if (std.mem.endsWith(u8, basename, item)) { + const end = basename.len - item.len; + basename = basename[0..end]; + } + } + } + + try stdout.print("{s}\n", .{basename}); + try bw.flush(); +} diff --git a/dirname.zig b/dirname.zig new file mode 100644 index 0000000..c45a0d4 --- /dev/null +++ b/dirname.zig @@ -0,0 +1,87 @@ +const std = @import("std"); +const fs = std.fs; +const io = std.io; + +const version = @import("version.zig").version; + +fn help() !void { + const stdof = io.getStdOut().writer(); + var bw = io.bufferedWriter(stdof); + const stdout = bw.writer(); + + try stdout.print("076 coreutils\n", .{}); + try stdout.print("使用法: dirname 名前\n", .{}); + try stdout.print("NAME の最後の / (スラッシュ) 以降の要素 (/ を含む) を削除して表示します。\n", .{}); + try stdout.print("NAME に / が含まれない場合は、(カレントディレクトリを意味する) '.' を表示します。\n\n", .{}); + try stdout.print("-h ヘルプを表示\n", .{}); + try stdout.print("-v バージョンを表示\n", .{}); + + try bw.flush(); +} + +fn ver() !void { + const stdof = io.getStdOut().writer(); + var bw = io.bufferedWriter(stdof); + const stdout = bw.writer(); + + try stdout.print("dirname (076 coreutils) {s}\n", .{version}); + + try bw.flush(); +} + +pub fn main() !void { + var gpa = std.heap.GeneralPurposeAllocator(.{}){}; + defer _ = gpa.deinit(); + const alloc = gpa.allocator(); + + var option = std.ArrayList(u8).init(alloc); + defer option.deinit(); + + var name = std.ArrayList([]const u8).init(alloc); + defer name.deinit(); + + const args = try std.process.argsAlloc(alloc); + defer std.process.argsFree(alloc, args); + + for (args, 0..) |arg, i| { + if (i == 0) continue; + var m: [1]u8 = [_]u8{'-'}; + if (std.mem.eql(u8, arg[0..1], m[0..])) { + for (arg, 0..) |a, j| { + if (j == 0) continue; + try option.append(a); + } + } else { + try name.append(arg); + } + } + + for (option.items) |i| { + if (i == 'h') { + try help(); + return; + } + if (i == 'v') { + try ver(); + return; + } + } + + if (name.items.len == 0) { + try help(); + return; + } + + var dirname: []const u8 = undefined; + + const stdof = io.getStdOut().writer(); + var bw = io.bufferedWriter(stdof); + const stdout = bw.writer(); + + for (name.items) |item| { + dirname = fs.path.dirname(item) orelse ""; + try stdout.print("{s}\n", .{dirname}); + } + + try bw.flush(); +}