예제 #1
0
 internal CharacterLookup(int mc, int clo, IMemoryOwner <char> m, MemoryHandle h, CharacterType *cl)
 {
     MinimumCharacter = mc;
     CharLookupOffset = clo;
     Memory           = m;
     Handle           = h;
     CharLookup       = cl;
 }
예제 #2
0
        internal unsafe void Initialize(
            CharacterLookup preAllocLookup,
            char?escapeStartChar,
            char?escapeChar,
            ReadRowEnding rowEndings,
            ReadHeader hasHeaders,
            bool readingComments,
            bool skipLeadingWhitespace,
            bool skipTrailingWhitespace
            )
        {
            CharacterLookup = preAllocLookup;
            CharLookup      = (CharacterType *)preAllocLookup.Memory;
            RowEndings      = rowEndings;
            HasHeaders      = hasHeaders;

            switch (HasHeaders)
            {
            case ReadHeader.Always:
                CurrentState = State.Header_Start;
                break;

            case ReadHeader.Never:
                CurrentState = State.Record_Start;
                break;

            default:
                Throw.InvalidOperationException($"Unexpected {nameof(ReadHeader)}: {HasHeaders}");
                break;
            }

            TransitionMatrix =
                GetTransitionMatrix(
                    RowEndings,
                    escapeStartChar.HasValue && escapeStartChar == escapeChar,
                    readingComments,
                    skipLeadingWhitespace,
                    skipTrailingWhitespace,
#if DEBUG
                    out TransitionMatrixMemoryOffset
#else
                    out _
#endif
                    );
        }
예제 #3
0
        internal static unsafe CharacterLookup MakeCharacterLookup(
            Options options,
            out int neededSize
            )
        {
            var escapeStartChar     = options.EscapedValueStartAndEnd;
            var valueSeparatorChar  = options.ValueSeparator[0];
            var valueSepIsMultiChar = options.ValueSeparator.Length > 1;
            var escapeChar          = options.EscapedValueEscapeCharacter;
            var commentChar         = options.CommentCharacter;

            var whitespaceSpecial = options.WhitespaceTreatment != WhitespaceTreatments.Preserve;

            var minimumCharacter =
                Math.Min(
                    Math.Min(
                        Math.Min(
                            Math.Min(
                                Math.Min(escapeStartChar ?? char.MaxValue, valueSeparatorChar),
                                escapeChar ?? char.MaxValue
                                ),
                            commentChar ?? char.MaxValue
                            ),
                        '\r'
                        ),
                    '\n'
                    );
            var maxChar =
                Math.Max(
                    Math.Max(
                        Math.Max(
                            Math.Max(
                                Math.Max(escapeStartChar ?? char.MinValue, valueSeparatorChar),
                                escapeChar ?? char.MinValue
                                ),
                            commentChar ?? char.MinValue
                            ),
                        '\r'
                        ),
                    '\n'
                    );

            if (whitespaceSpecial)
            {
                foreach (var c in WhitespaceCharacters)
                {
                    maxChar          = Math.Max(maxChar, c);
                    minimumCharacter = Math.Min(minimumCharacter, c);
                }
            }

            neededSize = (maxChar - minimumCharacter) + 1;

            var charLookupArr = GC.AllocateArray <char>(neededSize, pinned: true);

            // this is a no-op, because RuleCache is on the pinned heap
            fixed(char *charLookupPtr = charLookupArr)
            {
                CharacterType *charLookup = (CharacterType *)charLookupPtr;

                for (var i = 0; i < neededSize; i++)
                {
                    var c = (char)(minimumCharacter + i);

                    CharacterType cType;
                    if (c == escapeStartChar)
                    {
                        cType = CharacterType.EscapeStartAndEnd;
                    }
                    else if (c == escapeChar)
                    {
                        cType = CharacterType.Escape;
                    }
                    else if (c == valueSeparatorChar)
                    {
                        if (valueSepIsMultiChar)
                        {
                            cType = CharacterType.MaybeValueSeparator;
                        }
                        else
                        {
                            cType = CharacterType.ValueSeparator;
                        }
                    }
                    else if (c == '\r')
                    {
                        cType = CharacterType.CarriageReturn;
                    }
                    else if (c == '\n')
                    {
                        cType = CharacterType.LineFeed;
                    }
                    else if (commentChar != null && c == commentChar)
                    {
                        cType = CharacterType.CommentStart;
                    }
                    else if (whitespaceSpecial && Array.IndexOf(WhitespaceCharacters, c) != -1)
                    {
                        cType = CharacterType.Whitespace;
                    }
                    else
                    {
                        cType = CharacterType.Other;
                    }

                    charLookup[i] = cType;
                }

                // need to capture the array so it isn't GC'd
                return(new CharacterLookup(minimumCharacter, neededSize, charLookupArr, charLookupPtr));
            }
        }
예제 #4
0
 internal void Deconstruct(out int minimumCharacter, out int charLookupOffset, out IMemoryOwner <char> memory, out MemoryHandle handle, out CharacterType *charLookup)
 {
     minimumCharacter = MinimumCharacter;
     charLookupOffset = CharLookupOffset;
     memory           = Memory;
     handle           = Handle;
     charLookup       = CharLookup;
 }