protected static bool WrapIfTooLong(ref StringSlice text, int lineLen) { if (text.Length < lineLen) { return(false); } var ret = new StringBuilder(text.Length + Environment.NewLine.Length * text.Length / lineLen); for (var idx = 0; idx < text.Length;) { var len = Math.Min(lineLen, text.Length - idx); text.SubString(idx, len).Append(ret); ret.AppendLine(); idx += len; } text = new StringSlice(ret.ToString()); return(true); }
public int TO_INT(StringSlice str, int idx, int len) { StringSlice tmp = str.SubString(idx, len); return(ParseInt(tmp.Buffer, tmp.StartIndex, tmp.Length)); }
public static int EnumLines(StringSlice txt, Func <StringSlice, int, bool> callback) { int currentIdx = 0; bool lastWasR = false; int currentStart = 0; for (int i = 0; i < txt.Length; ++i) { bool yieldLine = false; int newCurrentStart = currentStart; int currentEnd = 0; switch (txt[i]) { case '\r': if (lastWasR) { yieldLine = true; newCurrentStart = i; currentEnd = i - 1; } lastWasR = true; break; case '\n': yieldLine = true; if (lastWasR) { currentEnd = i - 1; } else { currentEnd = i; } lastWasR = false; newCurrentStart = i + 1; break; default: if (lastWasR) { yieldLine = true; newCurrentStart = i; currentEnd = i - 1; } lastWasR = false; break; } if (yieldLine) { if (callback != null) { if (!callback(txt.SubString(currentStart, currentEnd - currentStart), currentIdx)) { return(currentIdx + 1); } } ++currentIdx; currentStart = newCurrentStart; } } if (lastWasR) { if (callback != null) { if (!callback(txt.SubString(currentStart, txt.Length - currentStart - 1), currentIdx)) { return(currentIdx + 1); } } ++currentIdx; } else { if (callback != null) { callback(txt.SubString(currentStart, txt.Length - currentStart), currentIdx); } } return(currentIdx + 1); }