1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-26 19:48:01 +02:00
Beef/tatus

61 lines
2.5 KiB
Text
Raw Normal View History

2025-04-04 17:17:37 +03:00
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<char8*>, IEnumerator<char8>
{
char8* mPtr;