Exemple #1
0
        internal static void AnsiParser_ControlSequence_InsertBlank(ControlSequenceCommand command, long[] param)
        {
            var dispatched = 0;
            var events     = new AnsiParserEvents
            {
                InsertBlank = (count) =>
                {
                    ++dispatched;
                    Assert.Equal(param.AsSpan().Optional(0).GetValueOrDefault(1), count);
                }
            };

            var sut = new AnsiParser(events: events);

            sut.OnControlSequenceCommand(command, default, param);
Exemple #2
0
        public void OnControlSequenceCommand(ControlSequenceCommand command, ReadOnlySpan <byte> intermediates, ReadOnlySpan <long> parameters, IgnoredData ignored = default)
        {
            var priv = intermediates.Optional(0).GetValueOrDefault(0) == '?';

            long?row, column;

            switch (command)
            {
            case ControlSequenceCommand.InsertBlank:
                _events.InsertBlank?.Invoke(parameters.Optional(0).GetValueOrDefault(1));
                break;

            case ControlSequenceCommand.MoveUp:
                _events.MoveUp?.Invoke(parameters.Optional(0).GetValueOrDefault(1), false);
                break;

            case ControlSequenceCommand.RepeatPrecedingCharacter:
                if (_precedingChar.HasValue)
                {
                    var count = parameters.Optional(0).GetValueOrDefault(1);
                    var c     = _precedingChar.Value;
                    ReadOnlySpan <char> chr = MapCharacters(MemoryMarshal.CreateReadOnlySpan(ref c, 1));
                    for (var i = 0; i < count; i++)
                    {
                        _events.Input?.Invoke(chr);
                    }
                }
                break;

            case ControlSequenceCommand.MoveDown1:
            case ControlSequenceCommand.MoveDown2:
                _events.MoveDown?.Invoke(parameters.Optional(0).GetValueOrDefault(1), false);
                break;

            case ControlSequenceCommand.IdentifyTerminal:
                _events.IdentifyTerminal?.Invoke();
                break;

            case ControlSequenceCommand.MoveForward1:
            case ControlSequenceCommand.MoveForward2:
                _events.MoveForward?.Invoke(parameters.Optional(0).GetValueOrDefault(1), false);
                break;

            case ControlSequenceCommand.MoveBackward:
                _events.MoveBackward?.Invoke(parameters.Optional(0).GetValueOrDefault(1), false);
                break;

            case ControlSequenceCommand.MoveDownAndCr:
                _events.MoveDown?.Invoke(parameters.Optional(0).GetValueOrDefault(1), true);
                break;

            case ControlSequenceCommand.MoveUpAndCr:
                _events.MoveUp?.Invoke(parameters.Optional(0).GetValueOrDefault(1), true);
                break;

            case ControlSequenceCommand.ClearTabulation:
                var tabClearMode = (TabulationClearMode)parameters.Optional(0).GetValueOrDefault(0);
                _events.ClearTabulation?.Invoke(tabClearMode);
                break;

            case ControlSequenceCommand.GotoColumn1:
            case ControlSequenceCommand.GotoColumn2:
                column = parameters.Optional(0).GetValueOrDefault(1) - 1;
                _events.Goto?.Invoke(column: column);
                break;

            case ControlSequenceCommand.Goto1:
            case ControlSequenceCommand.Goto2:
                column = parameters.Optional(0).GetValueOrDefault(1) - 1;
                row    = parameters.Optional(1).GetValueOrDefault(1) - 1;
                _events.Goto?.Invoke(column, row);
                break;

            case ControlSequenceCommand.MoveForwardTabs:
                _events.MoveForward?.Invoke(parameters.Optional(0).GetValueOrDefault(1), true);
                break;

            case ControlSequenceCommand.ClearScreen:
                var clearScreenMode = (ClearMode)parameters.Optional(0).GetValueOrDefault(0);
                _events.ClearScreen?.Invoke(clearScreenMode);
                break;

            case ControlSequenceCommand.ClearLine:
                var clearLineMode = (LineClearMode)parameters.Optional(0).GetValueOrDefault(0);
                _events.ClearLine?.Invoke(clearLineMode);
                break;

            case ControlSequenceCommand.ScrollUp:
                _events.ScrollUp?.Invoke(parameters.Optional(0).GetValueOrDefault(1));
                break;

            case ControlSequenceCommand.ScrollDown:
                _events.ScrollDown?.Invoke(parameters.Optional(0).GetValueOrDefault(1));
                break;

            case ControlSequenceCommand.InsertBlankLines:
                _events.InsertBlankLines?.Invoke(parameters.Optional(0).GetValueOrDefault(1));
                break;

            case ControlSequenceCommand.UnsetMode:
                for (var i = 0; i < parameters.Length; i++)
                {
                    _events.UnsetMode?.Invoke((Mode)parameters[i]);
                }
                break;

            case ControlSequenceCommand.DeleteLines:
                _events.DeleteLines?.Invoke(parameters.Optional(0).GetValueOrDefault(1));
                break;

            case ControlSequenceCommand.EraseChars:
                _events.EraseCharacters?.Invoke(parameters.Optional(0).GetValueOrDefault(1));
                break;

            case ControlSequenceCommand.DeleteChars:
                _events.DeleteCharacters?.Invoke(parameters.Optional(0).GetValueOrDefault(1));
                break;

            case ControlSequenceCommand.MoveBackwardTabs:
                _events.MoveBackward?.Invoke(parameters.Optional(0).GetValueOrDefault(1), true);
                break;

            case ControlSequenceCommand.GotoLine:
                _events.Goto?.Invoke(line: parameters.Optional(0).GetValueOrDefault(1) - 1);
                break;

            case ControlSequenceCommand.SetMode:
                for (var i = 0; i < parameters.Length; i++)
                {
                    _events.SetMode?.Invoke((Mode)parameters[i]);
                }
                break;

            case ControlSequenceCommand.TerminalAttribute:
                if (parameters.Length == 0)
                {
                    _events.TerminalAttribute?.Invoke(
                        TerminalAttribute.Reset);
                    break;
                }

                for (var i = 0; i < parameters.Length; i++)
                {
                    var index = parameters[i];

                    if (index < 30)
                    {
                        _events.TerminalAttribute?.Invoke(
                            (TerminalAttribute)index);
                        continue;
                    }

                    if (index == 38 || index == 48)
                    {
                        var consumed = TryParseColor(parameters.Slice(i), out NamedColor? ix, out Color? color);
                        if (consumed == 0)
                        {
                            break;
                        }
                        _events.TerminalAttribute?.Invoke(
                            (TerminalAttribute)index, index: ix, color: color);
                        i += consumed;
                        continue;
                    }

                    if (index == 39)
                    {
                        _events.TerminalAttribute?.Invoke(
                            TerminalAttribute.SetForeground, index: NamedColor.Foreground);
                        continue;
                    }

                    if (index < 40)
                    {
                        var ix = (NamedColor)(index - 30);
                        _events.TerminalAttribute?.Invoke(
                            TerminalAttribute.SetForeground, index: ix);
                        continue;
                    }

                    if (index == 49)
                    {
                        _events.TerminalAttribute?.Invoke(
                            TerminalAttribute.SetBackground, index: NamedColor.Background);
                        continue;
                    }

                    if (index < 50)
                    {
                        var ix = (NamedColor)(index - 40);
                        _events.TerminalAttribute?.Invoke(
                            TerminalAttribute.SetForeground, index: ix);
                        continue;
                    }

                    if (index < 90)
                    {
                        continue;
                    }

                    if (index < 100)
                    {
                        var ix = (NamedColor)(index - 90 + (int)NamedColor.BrightBlack);
                        _events.TerminalAttribute?.Invoke(
                            TerminalAttribute.SetForeground, index: ix);
                        continue;
                    }

                    if (index < 108)
                    {
                        var ix = (NamedColor)(index - 100 + (int)NamedColor.BrightBlack);
                        _events.TerminalAttribute?.Invoke(
                            TerminalAttribute.SetBackground, index: ix);
                        continue;
                    }
                }
                break;

            case ControlSequenceCommand.DeviceStatus:
                _events.DeviceStatus?.Invoke(parameters.Optional(0).GetValueOrDefault(0));
                break;

            case ControlSequenceCommand.SetScrollingRegion:
                if (priv)
                {
                    break;
                }
                _events.SetScrollingRegion?.Invoke(
                    parameters.Optional(0) - 1,
                    parameters.Optional(1) - 1);
                break;

            case ControlSequenceCommand.SaveCursorPosition:
                _events.SaveCursorPosition?.Invoke();
                break;

            case ControlSequenceCommand.RestoreCursorPosition:
                _events.RestoreCursorPosition?.Invoke();
                break;

            case ControlSequenceCommand.SetCursorStyle:
                switch (parameters.Optional(0).GetValueOrDefault(0))
                {
                case 0: _events.SetCursorStyle?.Invoke(default); break;

                case 1:
                case 2: _events.SetCursorStyle?.Invoke(CursorStyle.Block); break;

                case 3:
                case 4: _events.SetCursorStyle?.Invoke(CursorStyle.Underline); break;

                case 5:
                case 6: _events.SetCursorStyle?.Invoke(CursorStyle.Beam); break;
                }
                break;
            }
        }