From e8f20958908000798d33c3362b9d129f4bb57e22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=AB=8F=E8=A8=AA=E5=AD=90?= Date: Sun, 9 Jul 2023 06:47:46 +0900 Subject: [PATCH] pwd --- CHANGELOG.md | 1 + Makefile | 2 ++ pwd/Makefile | 13 +++++++++ pwd/pwd.zig | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 91 insertions(+) create mode 100644 pwd/Makefile create mode 100644 pwd/pwd.zig diff --git a/CHANGELOG.md b/CHANGELOG.md index f7ca2b0..8c1c0bb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,5 +2,6 @@ * catを追加 * cpを追加 * lsを追加 +* pwdを追加(完了) * rmを追加(完了) * touchを追加 diff --git a/Makefile b/Makefile index 748be86..47c16d4 100644 --- a/Makefile +++ b/Makefile @@ -8,6 +8,7 @@ all: cd cat && make && mv cat ../bin && rm -rf cat.o && cd .. cd cp && make && mv cp ../bin && rm -rf cp.o && cd .. cd ls && make && mv ls ../bin && rm -rf ls.o && cd .. + cd pwd && make && mv pwd ../bin && rm -rf pwd.o && cd .. cd rm && make && mv rm ../bin && rm -rf rm.o && cd .. cd touch && make && mv touch ../bin && rm -rf touch.o && cd .. @@ -20,6 +21,7 @@ install: all chmod 755 ${DESTDIR}${PREFIX}/bin/cat chmod 755 ${DESTDIR}${PREFIX}/bin/cp chmod 755 ${DESTDIR}${PREFIX}/bin/ls + chmod 755 ${DESTDIR}${PREFIX}/bin/pwd chmod 755 ${DESTDIR}${PREFIX}/bin/rm chmod 755 ${DESTDIR}${PREFIX}/bin/touch #mkdir -p ${DESTDIR}${MANPREFIX}/man1 diff --git a/pwd/Makefile b/pwd/Makefile new file mode 100644 index 0000000..e0e663c --- /dev/null +++ b/pwd/Makefile @@ -0,0 +1,13 @@ +NAME=pwd +VERSION := $(shell cat ../Makefile | grep "VERSION=" | sed 's/VERSION=//') +SRC=${NAME}.zig +CC=zig build-exe +RELEASE=ReleaseSmall + +all: + ${CC} ${SRC} -O ${RELEASE} --name ${NAME} + +clean: + rm -f ${NAME} ${NAME}.o + +.PHONY: all clean diff --git a/pwd/pwd.zig b/pwd/pwd.zig new file mode 100644 index 0000000..23cbb9a --- /dev/null +++ b/pwd/pwd.zig @@ -0,0 +1,75 @@ +const std = @import("std"); +const io = std.io; +const os = std.os; +const fs = std.fs; + +const version = "1.0.0"; + +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("使用法: pwd\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("pwd (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(); + + 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); + } + } + } + + for (option.items) |i| { + if (i == 'h') { + try help(); + return; + } + if (i == 'v') { + try ver(); + return; + } + } + + var buf: [fs.MAX_PATH_BYTES]u8 = undefined; + const cwd = fs.cwd(); + const path = try cwd.realpath(".", &buf); + + const stdof = io.getStdOut().writer(); + var bw = io.bufferedWriter(stdof); + const stdout = bw.writer(); + + try stdout.print("{s}\n", .{std.mem.trim(u8, path, "\x00")}); + try bw.flush(); +}