public static GonObject LoadFromBuffer(string buffer) { string str = "{" + buffer + "}"; List <string> Tokens = Tokenize(str); GonTokenStream ts = new GonTokenStream(); ts.current = 0; ts.Tokens = Tokens; return(LoadFromTokens(ts)); }
static GonObject LoadFromTokens(GonTokenStream Tokens) { GonObject ret = new GonObject(); if (Tokens.Peek() == "{") { //read object ret.Type = FieldType.OBJECT; Tokens.Consume(); //consume '{' while (Tokens.Peek() != "}") { string name = Tokens.Read(); ret.Children_Array.Add(LoadFromTokens(Tokens)); ret.Children_Map[name] = (int)ret.Children_Array.Count() - 1; ret.Children_Array[ret.Children_Array.Count() - 1].Name = name; if (Tokens.error) { throw new GonException("GON ERROR: missing a '}' somewhere"); } } Tokens.Consume(); //consume '}' return(ret); } else if (Tokens.Peek() == "[") { //read array ret.Type = FieldType.ARRAY; Tokens.Consume(); //consume '[' while (Tokens.Peek() != "]") { ret.Children_Array.Add(LoadFromTokens(Tokens)); if (Tokens.error) { throw new GonException("GON ERROR: missing a ']' somewhere"); return(null); } } Tokens.Consume(); //consume ']' return(ret); } else { //read data value ret.Type = FieldType.STRING; ret.String_Data = Tokens.Read(); //if string data can be converted to a number, do so if (ret.String_Data.All(Char.IsDigit)) { ret.Int_Data = Convert.ToInt32(ret.String_Data); ret.Type = FieldType.NUMBER; } /*char* endptr; * ret.int_data = strtol(ret.string_data.c_str(), &endptr, 0); * if (*endptr == 0) * { * ret.type = FieldType.NUMBER; * }*/ if (IsStringFloat(ret.String_Data)) { ret.Float_Data = Convert.ToDouble(ret.String_Data); ret.Type = FieldType.NUMBER; } /*ret.float_data = strtod(ret.string_data.c_str(), &endptr); * if (*endptr == 0) * { * ret.type = FieldType.NUMBER; * }*/ //if string data can be converted to a bool or null, convert if (ret.String_Data == "null") { ret.Type = FieldType.NULLGON; } if (ret.String_Data == "true") { ret.Type = FieldType.BOOL; ret.Bool_Data = true; } if (ret.String_Data == "false") { ret.Type = FieldType.BOOL; ret.Bool_Data = false; } return(ret); } }