diff --git a/echo.zig b/echo.zig index 18064fa..ee288b6 100644 --- a/echo.zig +++ b/echo.zig @@ -13,12 +13,66 @@ fn help() !void { try stdout.print("使用法: echo\n", .{}); try stdout.print("文章を表示\n\n", .{}); try stdout.print("-n ニューラインを見逃す\n", .{}); + try stdout.print("-e バックスラッシュエスケープ\n", .{}); try stdout.print("-h ヘルプを表示\n", .{}); try stdout.print("-v バージョンを表示\n", .{}); try bw.flush(); } +fn parseEscape(text: [1024]u8) [1024]u8 { + var i: usize = 0; + var output: [1024]u8 = undefined; + var output_len: usize = 0; + + while (i < text.len) { + if (text[i] == '\\') { + i += 1; + if (i < text.len) { + if (text[i] == 'n') { + output[output_len] = '\n'; + output_len += 1; + } else if (text[i] == 't') { + output[output_len] = '\t'; + output_len += 1; + } else if (text[i] == 'r') { + output[output_len] = '\r'; + output_len += 1; + } else if (text[i] == 'e') { + if (i + 1 < text.len and text[i + 1] == '[') { + output[output_len] = '\x1B'; + output_len += 1; + i += 1; + while (i < text.len and text[i] != 'm') { + output[output_len] = text[i]; + output_len += 1; + i += 1; + } + if (i < text.len) { + output[output_len] = text[i]; + output_len += 1; + } + } + } else { + output[output_len] = '\\'; + output_len += 1; + output[output_len] = text[i]; + output_len += 1; + } + + output_len += 1; + } + } else { + output[output_len] = text[i]; + output_len += 1; + } + + i += 1; + } + + return output; +} + pub fn main() !void { var gpa = std.heap.GeneralPurposeAllocator(.{}){}; defer _ = gpa.deinit(); @@ -48,6 +102,7 @@ pub fn main() !void { } var isnonl = false; + var isescp = false; for (option.items) |i| { if (i == 'h') { try help(); @@ -60,12 +115,19 @@ pub fn main() !void { if (i == 'n') { isnonl = true; } + if (i == 'e') { + isescp = true; + } } const stdof = io.getStdOut().writer(); var bw = io.bufferedWriter(stdof); const stdout = bw.writer(); + if (isescp) { + text = parseEscape(text); + } + if (isnonl) { try stdout.print("{s}", .{text[0..text_len]}); } else {