summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbpc2003 <wpesfriendnva@gmail.com>2025-05-26 11:03:48 -0400
committerbpc2003 <wpesfriendnva@gmail.com>2025-05-26 11:03:48 -0400
commite7aa9e6e78f712d2db095af99813f669b1cefe15 (patch)
tree5a28f9b485ed00c3956e0cf43b72e0a5f1c5b69e
parent6dfd54fcdf17ce732efa14e9c629f804115436fd (diff)
Get started on string tests
-rw-r--r--cmds/cmds.go2
-rw-r--r--cmds/test.go87
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
}