diff --git a/cat.zig b/cat.zig index 00fce73..98d81c0 100644 --- a/cat.zig +++ b/cat.zig @@ -13,8 +13,12 @@ fn help() !void { try stdout.print("使用法: cat [オプション]... [ファイル]...\n", .{}); try stdout.print("ファイル (複数可) の内容を結合して標準出力に出力します。\n\n", .{}); try stdout.print("ファイルの指定がない場合や FILE が - の場合, 標準入力から読み込みを行います。\n\n", .{}); + try stdout.print("-b カッコの行列以外、全ての行に行番号を付ける\n", .{}); //try stdout.print("-c 色\n", .{}); + try stdout.print("-m 全部は1行列に表示する\n", .{}); try stdout.print("-n 全ての行に行番号を付ける\n", .{}); + try stdout.print("-s カッコの行列を見逃す\n", .{}); + try stdout.print("-u 不使用\n", .{}); try stdout.print("-h ヘルプを表示\n", .{}); try stdout.print("-v バージョンを表示\n", .{}); @@ -58,8 +62,12 @@ pub fn main() !void { } } + var isnun: bool = false; var iscol: bool = false; + var isone: bool = false; var isnum: bool = false; + var issqz: bool = false; + var line_number: usize = 0; for (option.items) |i| { if (i == 'h') { @@ -70,12 +78,21 @@ pub fn main() !void { try ver(); return; } + if (i == 'b') { + isnun = true; + } if (i == 'c') { iscol = true; } + if (i == 'd') { + isone = true; + } if (i == 'n') { isnum = true; } + if (i == 's') { + issqz = true; + } } if (fname.items.len == 0) { @@ -89,9 +106,24 @@ pub fn main() !void { var buf: [1024]u8 = undefined; while (true) { - const br = try file.read(buf[0..]); - if (br == 0) break; - try io.getStdOut().writer().writeAll(buf[0..br]); + const result = try file.reader().readUntilDelimiterOrEof(buf[0..], '\n') orelse break; + if (issqz and std.mem.trimRight(u8, result, "\n\r").len == 0) continue; + const stripped = std.mem.trim(u8, result, " \n\t\r"); + + if (isone) { + try io.getStdOut().writer().writeAll(stripped); + } else { + if (isnum or (isnun and stripped.len != 0)) { + line_number += 1; + try io.getStdOut().writer().print(" {:3} | ", .{line_number}); + } else if (isnum) { + line_number += 1; + try io.getStdOut().writer().print(" {:3} | ", .{line_number}); + } + + try io.getStdOut().writer().writeAll(result); + try io.getStdOut().writer().print("\n", .{}); + } } } }