76 lines
2.4 KiB
C#
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;
|
|
}
|
|
|
|
}
|
|
|
|
}
|