From a01f21552806cc9b83f646ee1826853a6acfe468 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 11:32:04 +0900 Subject: [PATCH] mkdir --- CHANGELOG.md | 1 + Makefile | 2 + mkdir/Makefile | 13 +++++++ mkdir/mkdir.zig | 99 +++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 115 insertions(+) create mode 100644 mkdir/Makefile create mode 100644 mkdir/mkdir.zig diff --git a/CHANGELOG.md b/CHANGELOG.md index 8c1c0bb..0366f8a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ * catを追加 * cpを追加 * lsを追加 +* mkdirを追加(完了) * pwdを追加(完了) * rmを追加(完了) * touchを追加 diff --git a/Makefile b/Makefile index 47c16d4..bfd69f1 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 mkdir && make && mv mkdir ../bin && rm -rf mkdir.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 .. @@ -21,6 +22,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/mkdir chmod 755 ${DESTDIR}${PREFIX}/bin/pwd chmod 755 ${DESTDIR}${PREFIX}/bin/rm chmod 755 ${DESTDIR}${PREFIX}/bin/touch diff --git a/mkdir/Makefile b/mkdir/Makefile new file mode 100644 index 0000000..746c1fc --- /dev/null +++ b/mkdir/Makefile @@ -0,0 +1,13 @@ +NAME=mkdir +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/mkdir/mkdir.zig b/mkdir/mkdir.zig new file mode 100644 index 0000000..0e1a60f --- /dev/null +++ b/mkdir/mkdir.zig @@ -0,0 +1,99 @@ +const std = @import("std"); +const fs = std.fs; +const io = std.io; + +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("使用法: mkdir [OPTION]... DIRECTORY...\n", .{}); + try stdout.print("ディレクトリが存在しない場合に、ディレクトリを作成します。\n\n", .{}); + try stdout.print("-p ディレクトリが存在していてもエラーを返さない。\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("mkdir (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 fname = std.ArrayList([]const u8).init(alloc); + defer fname.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 fname.append(arg); + } + } + + var isoya: bool = false; + + for (option.items) |i| { + if (i == 'h') { + try help(); + return; + } + if (i == 'v') { + try ver(); + return; + } + if (i == 'p') { + isoya = true; + } + } + + if (fname.items.len == 0) { + try help(); + return; + } + + for (fname.items) |item| { + if (isoya) { + var tmp_path = std.ArrayList(u8).init(alloc); + defer tmp_path.deinit(); + + var it = std.mem.split(u8, item, "/"); + while (it.next()) |comp| { + _ = try tmp_path.appendSlice(comp); + _ = try tmp_path.append('/'); + const tmp_path_str = tmp_path.items; + _ = fs.cwd().makeDir(tmp_path_str) catch |err| switch (err) { + error.PathAlreadyExists => {}, + else => |e| return e, + }; + } + } else { + try fs.cwd().makeDir(item); + } + } +}