114 lines
2.1 KiB
Go

package string
import (
"regexp"
"unicode/utf8"
luajit "git.sharkk.net/Sky/LuaJIT-to-Go"
)
func GetFunctionList() map[string]luajit.GoFunction {
return map[string]luajit.GoFunction{
"string_slice": string_slice,
"string_reverse": string_reverse,
"string_length": string_length,
"string_byte_length": string_byte_length,
"regex_replace": regex_replace,
"string_is_valid_utf8": string_is_valid_utf8,
}
}
func string_slice(s *luajit.State) int {
str := s.ToString(1)
start := int(s.ToNumber(2))
if !utf8.ValidString(str) {
s.PushNil()
s.PushString("invalid UTF-8")
return 2
}
runes := []rune(str)
length := len(runes)
startIdx := max(start-1, 0) // Convert from 1-indexed
if startIdx >= length {
s.PushString("")
return 1
}
endIdx := length
if s.GetTop() >= 3 && !s.IsNil(3) {
end := int(s.ToNumber(3))
if end < 0 {
endIdx = length + end + 1
} else {
endIdx = end
}
if endIdx < 0 {
endIdx = 0
}
if endIdx > length {
endIdx = length
}
}
if startIdx >= endIdx {
s.PushString("")
return 1
}
s.PushString(string(runes[startIdx:endIdx]))
return 1
}
func string_reverse(s *luajit.State) int {
str := s.ToString(1)
if !utf8.ValidString(str) {
s.PushNil()
s.PushString("invalid UTF-8")
return 2
}
runes := []rune(str)
for i, j := 0, len(runes)-1; i < j; i, j = i+1, j-1 {
runes[i], runes[j] = runes[j], runes[i]
}
s.PushString(string(runes))
return 1
}
func string_length(s *luajit.State) int {
str := s.ToString(1)
s.PushNumber(float64(utf8.RuneCountInString(str)))
return 1
}
func string_byte_length(s *luajit.State) int {
str := s.ToString(1)
s.PushNumber(float64(len(str)))
return 1
}
func regex_replace(s *luajit.State) int {
pattern := s.ToString(1)
str := s.ToString(2)
replacement := s.ToString(3)
re, err := regexp.Compile(pattern)
if err != nil {
s.PushString(str)
return 1
}
result := re.ReplaceAllString(str, replacement)
s.PushString(result)
return 1
}
func string_is_valid_utf8(s *luajit.State) int {
str := s.ToString(1)
s.PushBoolean(utf8.ValidString(str))
return 1
}