public Obj ReadString() { Debug.Assert(NextIs('"')); int len = 0; char[] chars = new char[32]; Read(); for ( ; ;) { int ch = Read(); Check(Miscellanea.IsBMPCodePoint(ch)); if (ch == '\\') { ch = Read(); if (ch == '\\' | ch == '"') { // Nothing to do here } else if (ch == 'n') { ch = '\n'; } else if (ch == 't') { ch = '\t'; } else { Check(IsHex(ch)); //## THIS ACTUALLY FAILS ONE CHARACTER AHEAD int d3 = HexDigitValue(ch); int d2 = HexDigitValue(ReadHex()); int d1 = HexDigitValue(ReadHex()); int d0 = HexDigitValue(ReadHex()); ch = (char)(4096 * d3 + 256 * d2 + 16 * d1 + d0); } } else if (ch == '"') { break; } if (len >= chars.Length) { chars = Array.Extend(chars, 2 * chars.Length); } chars[len++] = (char)ch; } return(Builder.CreateString(chars, len)); }
private bool IsSyntacticSugaredString(TaggedObj tagObj) { Obj obj = tagObj.GetInnerObj(); if (tagObj.GetTagId() != Cell.Runtime.SymbObj.StringSymbId | !obj.IsIntSeq()) { return(false); } int len = obj.GetSize(); for (int i = 0; i < len; i++) { if (!Miscellanea.IsBMPCodePoint(obj.GetLongAt(i))) { return(false); } } return(true); }