public unsafe string Translate(int clilocNum, string arg = "", bool capitalize = false) { string baseCliloc = GetString(clilocNum); if (baseCliloc == null) { return(null); } if (arg == null) { arg = ""; } var roChars = arg.AsSpan(); // get count of valid args int i = 0; int totalArgs = 0; int trueStart = -1; for (; i < roChars.Length; ++i) { if (roChars[i] != '\t') { if (trueStart == -1) { trueStart = i; } } else if (trueStart >= 0) { ++totalArgs; } } if (trueStart == -1) { trueStart = 0; } // store index locations Point *locations = stackalloc Point[++totalArgs]; i = trueStart; for (int j = 0; i < roChars.Length; ++i) { if (roChars[i] == '\t') { locations[j].X = trueStart; locations[j].Y = i; trueStart = i + 1; ++j; } } bool has_arguments = totalArgs - 1 > 0; locations[totalArgs - 1].X = trueStart; locations[totalArgs - 1].Y = i; ValueStringBuilder sb = new ValueStringBuilder(baseCliloc.AsSpan()); { int index, pos = 0; while (pos < sb.Length) { int poss = pos; pos = sb.RawChars.Slice(pos, sb.Length - pos).IndexOf('~'); if (pos == -1) { break; } pos += poss; int pos2 = sb.RawChars.Slice(pos + 1, sb.Length - (pos + 1)).IndexOf('~'); if (pos2 == -1) //non valid arg { break; } pos2 += pos + 1; index = sb.RawChars.Slice(pos + 1, pos2 - (pos + 1)).IndexOf('_'); if (index == -1) { //there is no underscore inside the bounds, so we use all the part to get the number of argument index = pos2; } else { index += pos + 1; } int start = pos + 1; int max = index - start; int count = 0; for (; count < max; count++) { if (!char.IsNumber(sb.RawChars[start + count])) { break; } } if (!int.TryParse(sb.RawChars.Slice(start, count).ToString(), out index)) { return($"MegaCliloc: error for {clilocNum}"); } --index; var a = index < 0 || index >= totalArgs?string.Empty.AsSpan() : arg.AsSpan().Slice(locations[index].X, locations[index].Y - locations[index].X); if (a.Length > 1) { if (a[0] == '#') { if (int.TryParse(a.Slice(1).ToString(), out int id1)) { var ss = GetString(id1); if (string.IsNullOrEmpty(ss)) { a = string.Empty.AsSpan(); } else { a = ss.AsSpan(); } } } else if (has_arguments && int.TryParse(a.ToString(), out int clil)) { if (_entries.TryGetValue(clil, out string value) && !string.IsNullOrEmpty(value)) { a = value.AsSpan(); } } } sb.Remove(pos, pos2 - pos + 1); sb.Insert(pos, a); if (index >= 0 && index < totalArgs) { pos += a.Length /*locations[index].Y - locations[index].X*/; } } baseCliloc = sb.ToString(); sb.Dispose(); if (capitalize) { baseCliloc = StringHelper.CapitalizeAllWords(baseCliloc); } return(baseCliloc); } }