mirror of
https://github.com/danbulant/Cosmos
synced 2026-05-19 20:39:01 +00:00
303 lines
11 KiB
C#
303 lines
11 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using Cosmos.IL2CPU.Plugs;
|
|
|
|
namespace Cosmos.Core.Plugs {
|
|
//TODO: Move this and other FCL plugs to Cosmos.Plugs assembly. some plugs like Console need hardware
|
|
// but these generics ones should be moved, this does not depend on kernel
|
|
[Plug(Target=typeof(string))]
|
|
public class StringImpl {
|
|
/*public int IndexOf(char c)
|
|
{
|
|
// TODO: We can't get 'this'
|
|
//string me = ToString();
|
|
//for (int i = 0; i < me.Length; i++)
|
|
//{
|
|
// if (me[i] == c)
|
|
// return i;
|
|
//}
|
|
return -1;
|
|
}*/
|
|
|
|
public static string Concat(string aStrA, string aStrB) {
|
|
char[] xChars = new char[aStrA.Length + aStrB.Length];
|
|
int xPos = 0;
|
|
for (int i = 0; i < aStrA.Length; i++) {
|
|
xChars[xPos++] = aStrA[i];
|
|
}
|
|
for (int i = 0; i < aStrB.Length; i++) {
|
|
xChars[xPos++] = aStrB[i];
|
|
}
|
|
return new global::System.String(xChars);
|
|
}
|
|
|
|
public static string Concat(string aStrA,
|
|
string aStrB,
|
|
string aStrC) {
|
|
if (aStrA == null) {
|
|
aStrA = string.Empty;
|
|
}
|
|
if (aStrB == null) {
|
|
aStrB = string.Empty;
|
|
}
|
|
if (aStrC == null) {
|
|
aStrC = string.Empty;
|
|
}
|
|
char[] xChars = new char[aStrA.Length + aStrB.Length + aStrC.Length];
|
|
int xPos = 0;
|
|
for (int i = 0; i < aStrA.Length; i++) {
|
|
xChars[xPos++] = aStrA[i];
|
|
}
|
|
for (int i = 0; i < aStrB.Length; i++) {
|
|
xChars[xPos++] = aStrB[i];
|
|
}
|
|
for (int i = 0; i < aStrC.Length; i++) {
|
|
xChars[xPos++] = aStrC[i];
|
|
}
|
|
|
|
return new global::System.String(xChars);
|
|
}
|
|
|
|
public static string Concat(string aStrA,
|
|
string aStrB,
|
|
string aStrC,
|
|
string aStrD) {
|
|
if (aStrA == null) {
|
|
aStrA = string.Empty;
|
|
}
|
|
if (aStrB == null) {
|
|
aStrB = string.Empty;
|
|
}
|
|
if (aStrC == null) {
|
|
aStrC = string.Empty;
|
|
}
|
|
if (aStrD == null) {
|
|
aStrD = string.Empty;
|
|
}
|
|
char[] xChars = new char[aStrA.Length + aStrB.Length + aStrC.Length + aStrD.Length];
|
|
int xPos = 0;
|
|
for (int i = 0; i < aStrA.Length; i++) {
|
|
xChars[xPos++] = aStrA[i];
|
|
}
|
|
for (int i = 0; i < aStrB.Length; i++) {
|
|
xChars[xPos++] = aStrB[i];
|
|
}
|
|
for (int i = 0; i < aStrC.Length; i++) {
|
|
xChars[xPos++] = aStrC[i];
|
|
}
|
|
for (int i = 0; i < aStrD.Length; i++) {
|
|
xChars[xPos++] = aStrD[i];
|
|
}
|
|
return new global::System.String(xChars);
|
|
}
|
|
|
|
public static bool Contains(string aThis, string value) {
|
|
if (aThis.IndexOf(value) != -1)
|
|
return true;
|
|
else
|
|
return false;
|
|
}
|
|
|
|
public static int IndexOf(string aThis, string aSubStr, int aStart, int aLength, StringComparison aComparison) {
|
|
int xEndIdx = aStart + aLength;
|
|
for (int i = aStart; i < xEndIdx; i++) {
|
|
bool xFound = true;
|
|
for (int j = 0; j < aSubStr.Length; j++) {
|
|
if (aThis[i + j] != aSubStr[j]) {
|
|
xFound = false;
|
|
break;
|
|
}
|
|
}
|
|
if (xFound) {
|
|
return i;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
public static bool EndsWith(string aThis, string aSubStr, bool aIgnoreCase, System.Globalization.CultureInfo aCulture) {
|
|
return EndsWith(aThis, aSubStr, StringComparison.CurrentCulture);
|
|
}
|
|
|
|
public static bool EndsWith(string aThis, string aSubStr, StringComparison aComparison) {
|
|
if (aSubStr == null)
|
|
throw new ArgumentNullException("aSubStr");
|
|
|
|
if (aThis == aSubStr)
|
|
return true;
|
|
|
|
if (aSubStr.Length == 0)
|
|
return true;
|
|
|
|
int xLastIdx = aThis.Length - aSubStr.Length;
|
|
for (int i = 0; i < aSubStr.Length; i++) {
|
|
if (aThis[xLastIdx + i] != aSubStr[i]) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
// System.Int32 System.String.IndexOf(System.String, System.Int32, System.Int32, System.StringComparison)
|
|
|
|
public static bool Equals(string aThis, string aThat, StringComparison aComparison) {
|
|
#warning TODO: implement
|
|
return EqualsHelper(aThis,
|
|
aThat);
|
|
}
|
|
|
|
public static bool EqualsHelper(string aStrA,
|
|
string aStrB) {
|
|
return aStrA.CompareTo(aStrB) == 0;
|
|
}
|
|
|
|
private static bool CharArrayContainsChar(char[] aArray,
|
|
char aChar) {
|
|
for (int i = 0; i < aArray.Length; i++) {
|
|
if (aArray[i] == aChar) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public static int IndexOf(string aThis,
|
|
string aValue) {
|
|
return aThis.IndexOf(aValue, 0, aThis.Length, StringComparison.CurrentCulture);
|
|
}
|
|
|
|
public static int IndexOf(string aThis,
|
|
char aSeparator,
|
|
int aStartIndex,
|
|
int aCount) {
|
|
int xEndIdx = aStartIndex + aCount;
|
|
for (int i = aStartIndex; i < xEndIdx; i++) {
|
|
if (aThis[i] == aSeparator) {
|
|
return i;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
public static int IndexOfAny(string aThis,
|
|
char[] aSeparators,
|
|
int aStartIndex,
|
|
int aLength) {
|
|
int xResult = -1;
|
|
for (int i = 0; i < aSeparators.Length; i++) {
|
|
var xValue = aThis.IndexOf(aSeparators[i],
|
|
aStartIndex,
|
|
aLength);
|
|
if (xValue < xResult || xResult == -1) {
|
|
xResult = xValue;
|
|
}
|
|
}
|
|
return xResult;
|
|
}
|
|
|
|
public static string Insert(string aThis, int aStartPos, string aValue) {
|
|
return aThis.Substring(0, aStartPos) + aValue + aThis.Substring(aStartPos);
|
|
}
|
|
|
|
public static int LastIndexOf(string aThis, char aChar, int aStartIndex, int aCount) {
|
|
return LastIndexOfAny(aThis, new char[] { aChar }, aStartIndex, aCount);
|
|
}
|
|
|
|
public static int LastIndexOfAny(string aThis,
|
|
char[] aChars,
|
|
int aStartIndex,
|
|
int aCount) {
|
|
for (int i = 0; i < aCount; i++) {
|
|
if (CharArrayContainsChar(aChars,
|
|
aThis[aStartIndex - i])) {
|
|
return aStartIndex - i;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
public static int nativeCompareOrdinalEx(string aStrA, int aIndexA, string aStrB, int aIndexB, int aCount) {
|
|
//Just a basic implementation
|
|
if (aStrA == aStrB)
|
|
return 0;
|
|
else
|
|
return -1;
|
|
}
|
|
|
|
public static string Replace(string aThis, char oldChar, char newChar) {
|
|
string nString = "";
|
|
for (int i = 0; i < aThis.Length; i++) {
|
|
if (aThis[i] == oldChar)
|
|
nString += newChar.ToString();
|
|
else
|
|
nString += aThis[i];
|
|
}
|
|
|
|
return nString;
|
|
}
|
|
|
|
public static bool StartsWith(string aThis, string aSubStr, StringComparison aComparison) {
|
|
return StartsWith(aThis, aSubStr, true, null);
|
|
}
|
|
|
|
public static bool StartsWith(string aThis, string aSubStr, bool aIgnoreCase, System.Globalization.CultureInfo aCulture) {
|
|
for (int i = 0; i < aSubStr.Length; i++) {
|
|
if (aThis[i] != aSubStr[i])
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
public static string Substring(string aThis,
|
|
int aStartIndex,
|
|
int aCount) {
|
|
var xChars = new char[aCount];
|
|
for (int i = 0; i < aCount; i++) {
|
|
xChars[i] = aThis[aStartIndex + i];
|
|
}
|
|
return new string(xChars);
|
|
}
|
|
|
|
public static string Remove(string aThis, int aStart, int aCount) {
|
|
return aThis.Substring(0, aStart) + aThis.Substring(aStart + aCount, aThis.Length - (aStart + aCount));
|
|
}
|
|
|
|
public static string Replace(string aThis, string oldValue, string newValue) {
|
|
while (aThis.IndexOf(oldValue) != -1) {
|
|
int xIndex = aThis.IndexOf(oldValue);
|
|
aThis = aThis.Remove(xIndex, oldValue.Length);
|
|
aThis = aThis.Insert(xIndex, newValue);
|
|
}
|
|
return aThis;
|
|
}
|
|
|
|
public static string ToLower(string aThis, System.Globalization.CultureInfo aCulture) {
|
|
return ChangeCasing(aThis, 65, 90, 32);
|
|
}
|
|
|
|
public static string ToUpper(string aThis, System.Globalization.CultureInfo aCulture) {
|
|
return ChangeCasing(aThis, 97, 122, -32);
|
|
}
|
|
|
|
public static string ToUpper(string aThis)
|
|
{
|
|
return ChangeCasing(aThis, 97, 122, -32);
|
|
}
|
|
|
|
private static string ChangeCasing(string aValue, int lowerAscii, int upperAscii, int offset) {
|
|
char[] xChars = new char[aValue.Length];
|
|
|
|
for (int i = 0; i < aValue.Length; i++) {
|
|
int xAsciiCode = (int)aValue[i];
|
|
if ((xAsciiCode <= upperAscii) && (xAsciiCode >= lowerAscii))
|
|
xChars[i] = (char)(xAsciiCode + offset);
|
|
else
|
|
xChars[i] = aValue[i];
|
|
}
|
|
|
|
return new string(xChars);
|
|
}
|
|
}
|
|
}
|