From beccb551e277bfb3899b8050e4eed2c15b3d2cbb Mon Sep 17 00:00:00 2001 From: Kyle Isom Date: Thu, 10 Apr 2025 01:17:11 -0700 Subject: [PATCH] add minmax --- cmd/minmax/README | 3 +++ cmd/minmax/minmax.go | 53 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 cmd/minmax/README create mode 100644 cmd/minmax/minmax.go diff --git a/cmd/minmax/README b/cmd/minmax/README new file mode 100644 index 0000000..551d21f --- /dev/null +++ b/cmd/minmax/README @@ -0,0 +1,3 @@ +minmax + +A quick tool to calculate minmax codes if needed for uLisp. diff --git a/cmd/minmax/minmax.go b/cmd/minmax/minmax.go new file mode 100644 index 0000000..146b369 --- /dev/null +++ b/cmd/minmax/minmax.go @@ -0,0 +1,53 @@ +package main + +import ( + "flag" + "fmt" + "os" + "strconv" +) + +var kinds = map[string]int{ + "sym": 0, + "tf": 1, + "fn": 2, + "sp": 3, +} + +func dieIf(err error) { + if err == nil { + return + } + fmt.Fprintf(os.Stderr, "[!] %s\n", err) + os.Exit(1) +} + +func usage() { + fmt.Fprintf(os.Stderr, "usage: minmax type min max\n") + fmt.Fprintf(os.Stderr, " type is one of fn, sp, sym, tf\n") + os.Exit(1) +} + +func main() { + flag.Parse() + + if flag.NArg() != 3 { + usage() + } + + kind, ok := kinds[flag.Arg(0)] + if !ok { + usage() + } + + min, err := strconv.Atoi(flag.Arg(1)) + dieIf(err) + + max, err := strconv.Atoi(flag.Arg(2)) + dieIf(err) + + code := kind << 6 + code += (min << 3) + code += max + fmt.Printf("%0o\n", code) +}