2020-04-07 23:01:21 +00:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"bufio"
|
|
|
|
"fmt"
|
|
|
|
"os"
|
|
|
|
|
|
|
|
"tildegit.org/andinus/grus/lexical"
|
|
|
|
)
|
|
|
|
|
|
|
|
func grus() {
|
|
|
|
if len(os.Args) == 1 {
|
|
|
|
fmt.Println("Usage: grus <word> <dictionaries>")
|
|
|
|
os.Exit(1)
|
|
|
|
}
|
|
|
|
|
2020-04-08 10:11:58 +00:00
|
|
|
version := "v0.2.1"
|
2020-04-07 23:01:21 +00:00
|
|
|
|
|
|
|
if os.Args[1] == "version" {
|
|
|
|
fmt.Printf("Grus %s\n", version)
|
|
|
|
os.Exit(0)
|
|
|
|
}
|
|
|
|
|
|
|
|
dicts := []string{
|
|
|
|
"/usr/local/share/dict/words",
|
2020-04-07 23:41:14 +00:00
|
|
|
"/usr/local/share/dict/web2",
|
2020-04-07 23:01:21 +00:00
|
|
|
"/usr/share/dict/words",
|
2020-04-07 23:41:14 +00:00
|
|
|
"/usr/share/dict/web2",
|
2020-04-07 23:01:21 +00:00
|
|
|
"/usr/share/dict/special/4bsd",
|
|
|
|
"/usr/share/dict/special/math",
|
|
|
|
}
|
|
|
|
|
|
|
|
// User has specified dictionaries, prepend them to dicts
|
|
|
|
// list.
|
|
|
|
if len(os.Args) >= 3 {
|
|
|
|
dicts = append(os.Args[2:], dicts...)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Check if user has asked to search in all dictionaries.
|
|
|
|
searchAll := false
|
|
|
|
searchAllEnv := os.Getenv("GRUS_SEARCH_ALL")
|
|
|
|
if searchAllEnv == "true" ||
|
|
|
|
searchAllEnv == "1" {
|
|
|
|
searchAll = true
|
|
|
|
}
|
|
|
|
|
|
|
|
// Check if user wants anagrams.
|
|
|
|
anagrams := false
|
|
|
|
anagramsEnv := os.Getenv("GRUS_ANAGRAMS")
|
|
|
|
if anagramsEnv == "true" ||
|
|
|
|
anagramsEnv == "1" {
|
|
|
|
anagrams = true
|
|
|
|
}
|
|
|
|
|
2020-04-08 10:11:58 +00:00
|
|
|
// Check if user wants to print dictionary path.
|
|
|
|
printPath := false
|
|
|
|
printPathEnv := os.Getenv("GRUS_PRINT_PATH")
|
|
|
|
if printPathEnv == "true" ||
|
|
|
|
printPathEnv == "1" {
|
|
|
|
printPath = true
|
|
|
|
}
|
|
|
|
|
2020-04-07 23:01:21 +00:00
|
|
|
for _, dict := range dicts {
|
|
|
|
if _, err := os.Stat(dict); err != nil &&
|
|
|
|
!os.IsNotExist(err) {
|
|
|
|
// Error is not nil & also it's not path
|
|
|
|
// doesn't exist error. We do it this way to
|
|
|
|
// avoid another level of indentation.
|
|
|
|
panic(err)
|
|
|
|
} else if err != nil &&
|
|
|
|
os.IsNotExist(err) {
|
|
|
|
// If file doesn't exist then continue with
|
|
|
|
// next dictionary.
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
2020-04-08 10:11:58 +00:00
|
|
|
// Print path to dictionary if printPath is true.
|
|
|
|
if printPath {
|
|
|
|
fmt.Println(dict)
|
|
|
|
}
|
|
|
|
|
2020-04-07 23:01:21 +00:00
|
|
|
file, err := os.Open(dict)
|
|
|
|
panicOnErr(err)
|
|
|
|
defer file.Close()
|
|
|
|
|
|
|
|
// We use this to record if the word was unjumbled.
|
|
|
|
unjumbled := false
|
|
|
|
|
|
|
|
scanner := bufio.NewScanner(file)
|
|
|
|
for scanner.Scan() {
|
|
|
|
// Filter words by comparing length first &
|
|
|
|
// run lexical.Sort on it only if the length
|
|
|
|
// is equal.
|
|
|
|
if len(scanner.Text()) == len(os.Args[1]) &&
|
|
|
|
lexical.Sort(scanner.Text()) == lexical.Sort(os.Args[1]) {
|
|
|
|
fmt.Println(scanner.Text())
|
|
|
|
// If the user doesn't want anagrams
|
|
|
|
// then exit the program.
|
|
|
|
if !anagrams {
|
|
|
|
os.Exit(0)
|
|
|
|
}
|
|
|
|
unjumbled = true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
panicOnErr(scanner.Err())
|
|
|
|
|
|
|
|
// If word was unjumbled & user hasn't asked to search
|
|
|
|
// in all dictionaries then exit the program otherwise
|
|
|
|
// keep searching in other dictionaries.
|
|
|
|
if unjumbled &&
|
|
|
|
!searchAll {
|
|
|
|
os.Exit(0)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func panicOnErr(err error) {
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
}
|