diff --git a/BeefLibs/corlib/src/String.bf b/BeefLibs/corlib/src/String.bf index 088cfa81..92f9e7fb 100644 --- a/BeefLibs/corlib/src/String.bf +++ b/BeefLibs/corlib/src/String.bf @@ -3025,6 +3025,55 @@ namespace System return sIdStringLiterals[id]; }  + public void Reverse(String strBuffer) + { +  int_strsize originalLength = this.mLength; +  char8* originalPtr = this.Ptr; + +  if (originalLength <= 1) +  { +  strBuffer.Set(.(originalPtr, originalLength)); +  return; +  } + +  char8* tempBuffer = new:this char8[originalLength]* (?); +  defer delete tempBuffer; + +  int_strsize writeIdx = 0; +  int_strsize readPos = originalLength; + +  while (readPos > 0) { +  int_strsize currentReadIdx = readPos - 1; +  int_strsize startIdx = currentReadIdx; +  char8 c = originalPtr[startIdx]; +  int8 len = 1; + +  if (c >= (.)0x80) { +  while (startIdx > 0 && ((uint8)originalPtr[startIdx] & 0xC0) == 0x80) +  startIdx--; + +  var (decodedC32, decodedLen) = UTF8.Decode(originalPtr + startIdx, originalLength - startIdx); + +  if (decodedLen <= 0) { +  len = 1; +  startIdx = currentReadIdx; +  } else { +  len = decodedLen; +  } +  } +  Internal.MemCpy(tempBuffer + writeIdx, originalPtr + startIdx, len); + +  writeIdx += len; +  readPos = startIdx; +  } + +  Runtime.Assert(writeIdx == originalLength); + +  strBuffer.Clear(); +  strBuffer.Reserve(originalLength); +  strBuffer.Append(tempBuffer, originalLength); + } + public struct RawEnumerator : IRefEnumerator, IEnumerator { char8* mPtr;