2025-07-14 21:54:09 +08:00

76 lines
2.4 KiB
C#

// ParseStringRunner
namespace Leguar.TotalJSON.Internal {
internal class ParseStringRunner {
private readonly ParseStringSettings settings;
private readonly StringPointer stringPointer;
internal ParseStringRunner(string sourceString, ParseStringSettings settings) {
if (settings==null) {
settings = new ParseStringSettings();
}
this.settings = settings;
stringPointer=new StringPointer(sourceString,settings.ParseStartIndex,this);
}
internal StringPointer getStringPointer() {
return stringPointer;
}
internal bool containsNonWhiteChars() {
return stringPointer.containsNonWhiteChars();
}
internal string getPossiblyFixedNumber(string originalNumber) {
if (settings.FixRoundedFloatingPointMinMaxValues) {
string testNumber = originalNumber.Replace('e','E');
if (testNumber.Equals("3.402823E+38")) { // Rounded float.MaxValue
return "3.40282347E+38"; // Exact float.MaxValue
}
if (testNumber.Equals("-3.402823E+38")) { // Rounded float.MinValue
return "-3.40282347E+38"; // Exact float.MinValue
}
if (testNumber.Equals("1.79769313486232E+308")) { // Rounded double.MaxValue
return "1.7976931348623157E+308"; // Exact double.MaxValue (that doesn't throw OverflowException if read as double)
}
if (testNumber.Equals("-1.79769313486232E+308")) { // Rounded double.MinValue
return "-1.7976931348623157E+308"; // Exact double.MinValue (that doesn't throw OverflowException if read as double)
}
}
return originalNumber;
}
internal bool isAllowNonWhiteCharactersAfterObject() {
return settings.AllowNonWhiteCharactersAfterObject;
}
internal JValue parseValue() {
char chr=stringPointer.getNextNonWhiteChar();
if (chr=='"') {
return JString.zParse(this,false);
} else if (chr=='-' || (chr>='0' && chr<='9')) {
return JNumber.zParse(this,chr);
} else if (chr=='{') {
return JSON.zParse(this,false,false,false);
} else if (chr=='[') {
return JArray.zParse(this,false);
} else if (chr=='t' || chr=='f') {
return JBoolean.zParse(this,(chr=='t'));
} else if (chr=='n') {
return JNull.zParse(this);
} else {
throw ParseException.forInvalidCharacter("Invalid character "+InternalTools.logSafeCharacter(chr)+" when expecting start of any value",this);
}
}
internal string getParseDebugIDForExceptions() {
return settings.DebugIDForExceptions;
}
}
}