From 9412f1b0745072382beff9fed65e3a1092ef2372 Mon Sep 17 00:00:00 2001 From: "Zed A. Shaw" Date: Sun, 3 Aug 2025 10:53:09 -0400 Subject: [PATCH] First coreutil started, cat. --- cat/go.mod | 3 +++ cat/main.go | 43 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 cat/go.mod create mode 100644 cat/main.go diff --git a/cat/go.mod b/cat/go.mod new file mode 100644 index 0000000..12ddddb --- /dev/null +++ b/cat/go.mod @@ -0,0 +1,3 @@ +module git.learnjsthehardway.com/learn-code-the-hard-way/go-coreutils/cat + +go 1.24.2 diff --git a/cat/main.go b/cat/main.go new file mode 100644 index 0000000..79318bd --- /dev/null +++ b/cat/main.go @@ -0,0 +1,43 @@ +package main + +import ( + "fmt" + "flag" + "os" + "log" + "strings" +) + +func Fail(err error, format string, v ...any) { + err_format := fmt.Sprintf("ERROR: %v; %s", err, format) + log.Printf(err_format, v...) + os.Exit(1) +} + +func main() { + var number bool + + flag.BoolVar(&number, "n", false, "Number all nonempty output lines, starting with 1") + flag.BoolVar(&number, "number", false, "Number all nonempty output lines, starting with 1") + flag.Parse() + + if flag.NArg() < 1 { + log.Fatal("USAGE: cat [-n/--number] file0 [fileN]") + os.Exit(1) + } + + filename := flag.Arg(0) + in_file, err := os.ReadFile(filename) + + if err != nil { Fail(err, "cannot open %s:", filename) } + + if(number) { + count := 1 + for line := range strings.Lines(string(in_file)) { + fmt.Printf("%0.4d: %s", count, line) + count++ + } + } else { + fmt.Print(string(in_file)) + } +}