diff options
author | bpc2003 <wpesfriendnva@gmail.com> | 2025-05-26 11:03:48 -0400 |
---|---|---|
committer | bpc2003 <wpesfriendnva@gmail.com> | 2025-05-26 11:03:48 -0400 |
commit | e7aa9e6e78f712d2db095af99813f669b1cefe15 (patch) | |
tree | 5a28f9b485ed00c3956e0cf43b72e0a5f1c5b69e | |
parent | 6dfd54fcdf17ce732efa14e9c629f804115436fd (diff) |
Get started on string tests
-rw-r--r-- | cmds/cmds.go | 2 | ||||
-rw-r--r-- | cmds/test.go | 87 |
2 files changed, 69 insertions, 20 deletions
diff --git a/cmds/cmds.go b/cmds/cmds.go index f5b0081..bc521dd 100644 --- a/cmds/cmds.go +++ b/cmds/cmds.go @@ -2,6 +2,7 @@ package cmds import ( + "fmt" "strings" "gosh/global" @@ -37,6 +38,7 @@ func Eval(cmd string) error { break case "test", "[": global.ReturnCode = test(args) + fmt.Println(global.ReturnCode) break case "exit": if err := exit(args); err != nil { diff --git a/cmds/test.go b/cmds/test.go index 77534a3..98e182f 100644 --- a/cmds/test.go +++ b/cmds/test.go @@ -1,9 +1,11 @@ package cmds import ( + "fmt" "os" "os/user" "strconv" + "strings" "syscall" ) @@ -12,62 +14,107 @@ func test(args []string) int { return 1 } - fi, err := os.Lstat(args[2]) + if strings.HasPrefix(args[1], "-") { + return genTest(args[1:]) + } else { + n, err := strconv.Atoi(args[1]) + if err != nil { + return testString(args[1:]) + } else { + fmt.Println(n) + } + } + return 1 +} + +func testString(args []string) int { + ret := 1 + switch args[1] { + case "=": + if args[0] == args[2] { + ret = 0 + } + break + case "!=": + if args[0] != args[2] { + ret = 0 + } + break + } + return ret +} + +func genTest(args []string) int { + ret := 1 + switch args[0] { + case "-n": + if len(args[1]) > 0 { + return 0 + } + break + case "-z": + if len(args[1]) == 0 { + return 0 + } + break + } + + fi, err := os.Lstat(args[1]) c, _ := user.Current() if err != nil { - return 1 + return ret } + s := fi.Sys().(*syscall.Stat_t) - switch args[1] { + switch args[0] { case "-e": - return 0 + ret = 0 + break case "-f": if !fi.IsDir() { - return 0 + ret = 0 } break case "-d": if fi.IsDir() { - return 0 + ret = 0 } break case "-r": - if fi.Mode().Perm() & 0400 != 0 { - return 0 + if fi.Mode().Perm()&0400 != 0 { + ret = 0 } break case "-w": - if fi.Mode().Perm() & 0200 != 0 { - return 0 + if fi.Mode().Perm()&0200 != 0 { + ret = 0 } break case "-x": - if fi.Mode().Perm() & 0100 != 0 { - return 0 + if fi.Mode().Perm()&0100 != 0 { + ret = 0 } break case "-S": if fi.Size() > 0 { - return 0 + ret = 0 } break case "-L": - if fi.Mode() & os.ModeSymlink != 0 { - return 0 + if fi.Mode()&os.ModeSymlink != 0 { + ret = 0 } break case "-O": - s := fi.Sys().(*syscall.Stat_t) if c.Uid == strconv.Itoa(int(s.Uid)) { - return 0 + ret = 0 } break case "-G": - s := fi.Sys().(*syscall.Stat_t) if c.Gid == strconv.Itoa(int(s.Gid)) { - return 0 + ret = 0 } break } - return 1 + return ret } |