Esempio n. 1
0
        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));
        }
Esempio n. 2
0
        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);
        }