parent
1f8a28c041
commit
9acf8cb5b5
@ -0,0 +1,3 @@ |
||||
module git.learnjsthehardway.com/learn-code-the-hard-way/go-coreutils/od |
||||
|
||||
go 1.24.2 |
@ -0,0 +1,73 @@ |
||||
package main |
||||
|
||||
import ( |
||||
"fmt" |
||||
"os" |
||||
"flag" |
||||
"log" |
||||
"bufio" |
||||
) |
||||
|
||||
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) |
||||
} |
||||
|
||||
type Opts struct { |
||||
Width int |
||||
Filenames []string |
||||
Hex bool |
||||
Octal bool |
||||
Format string |
||||
} |
||||
|
||||
func parse_opts() (Opts) { |
||||
var opts Opts |
||||
|
||||
flag.IntVar(&opts.Width, "w", 16, "Width of output grid") |
||||
flag.BoolVar(&opts.Hex, "x", false, "Output hex bytes") |
||||
flag.BoolVar(&opts.Octal, "o", false, "Output octal bytes") |
||||
|
||||
flag.Parse() |
||||
|
||||
if flag.NArg() == 0 { |
||||
log.Fatal("USAGE: od [files]") |
||||
os.Exit(1) |
||||
} |
||||
|
||||
if opts.Hex { |
||||
opts.Format = "%0.2x " |
||||
} else { |
||||
opts.Format = "%0.3o " |
||||
} |
||||
|
||||
opts.Filenames = flag.Args() |
||||
return opts |
||||
} |
||||
|
||||
func main() { |
||||
opts := parse_opts() |
||||
|
||||
for _, filename := range opts.Filenames { |
||||
reader, err := os.Open(filename) |
||||
defer reader.Close() |
||||
if err != nil { Fail(err, "can't open: %s", filename) } |
||||
|
||||
buf := bufio.NewReader(reader) |
||||
count := buf.Size() |
||||
|
||||
fmt.Printf("%0.8o ", 0); |
||||
|
||||
for index := 0; index < count; index++ { |
||||
data, err := buf.ReadByte() |
||||
if err != nil { break } |
||||
fmt.Printf(opts.Format, data); |
||||
|
||||
if (index + 1) % opts.Width == 0 { |
||||
fmt.Print("\n") |
||||
fmt.Printf("%0.8o ", index); |
||||
} |
||||
} |
||||
} |
||||
} |
Loading…
Reference in new issue