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 }