protected virtual ProcessCharResult ProcessControlChar(char ch) { if (ch == ControlCode.LF || ch == ControlCode.VT) //Vertical TabはLFと等しい { LineFeedRule rule = GetTerminalSettings().LineFeedRule; if (rule == LineFeedRule.Normal || rule == LineFeedRule.LFOnly) { if (rule == LineFeedRule.LFOnly) //LFのみの動作であるとき { DoCarriageReturn(); } DoLineFeed(); } return(ProcessCharResult.Processed); } else if (ch == ControlCode.CR) { LineFeedRule rule = GetTerminalSettings().LineFeedRule; if (rule == LineFeedRule.Normal || rule == LineFeedRule.CROnly) { DoCarriageReturn(); if (rule == LineFeedRule.CROnly) { DoLineFeed(); } } return(ProcessCharResult.Processed); } else if (ch == ControlCode.BEL) { this.IndicateBell(); return(ProcessCharResult.Processed); } else if (ch == ControlCode.BS) { //行頭で、直前行の末尾が継続であった場合行を戻す if (_manipulator.CaretColumn == 0) { TerminalDocument doc = GetDocument(); int line = doc.CurrentLineNumber - 1; if (line >= 0 && doc.FindLineOrEdge(line).EOLType == EOLType.Continue) { doc.InvalidatedRegion.InvalidateLine(doc.CurrentLineNumber); doc.CurrentLineNumber = line; if (doc.CurrentLine == null) { _manipulator.Clear(doc.TerminalWidth); } else { _manipulator.Load(doc.CurrentLine, doc.CurrentLine.DisplayLength - 1); //NOTE ここはCharLengthだったが同じだと思って改名した } doc.InvalidatedRegion.InvalidateLine(doc.CurrentLineNumber); } } else { _manipulator.BackCaret(); } return(ProcessCharResult.Processed); } else if (ch == ControlCode.HT) { _manipulator.CaretColumn = GetNextTabStop(_manipulator.CaretColumn); return(ProcessCharResult.Processed); } else if (ch == ControlCode.SO) { return(ProcessCharResult.Processed); //以下2つはCharDecoderの中で処理されているはずなので無視 } else if (ch == ControlCode.SI) { return(ProcessCharResult.Processed); } else if (ch == ControlCode.NUL) { return(ProcessCharResult.Processed); //null charは無視 !!CR NULをCR LFとみなす仕様があるが、CR LF CR NULとくることもあって難しい } else { //Debug.WriteLine("Unknown char " + (int)ch); //適当なグラフィック表示ほしい return(ProcessCharResult.Unsupported); } }
protected virtual ProcessCharResult ProcessControlChar(char ch) { if (ch == '\n' || ch == 0xB) //Vertical TabはLFと等しい { LineFeedRule rule = GetConnection().Param.LineFeedRule; if (rule == LineFeedRule.Normal || rule == LineFeedRule.LFOnly) { if (rule == LineFeedRule.LFOnly) //LFのみの動作であるとき { DoCarriageReturn(); } DoLineFeed(); } return(ProcessCharResult.Processed); } else if (ch == '\r') { LineFeedRule rule = GetConnection().Param.LineFeedRule; if (rule == LineFeedRule.Normal || rule == LineFeedRule.CROnly) { DoCarriageReturn(); if (rule == LineFeedRule.CROnly) { DoLineFeed(); } } return(ProcessCharResult.Processed); } else if (ch == 0x07) { _tag.Receiver.IndicateBell(); return(ProcessCharResult.Processed); } else if (ch == 0x08) { //行頭で、直前行の末尾が継続であった場合行を戻す if (_manipulator.CaretColumn == 0) { TerminalDocument doc = GetDocument(); int line = doc.CurrentLineNumber - 1; if (line >= 0 && doc.FindLineOrEdge(line).EOLType == EOLType.Continue) { doc.InvalidateLine(doc.CurrentLineNumber); doc.CurrentLineNumber = line; if (doc.CurrentLine == null) { _manipulator.Clear(GetConnection().TerminalWidth); } else { _manipulator.Load(doc.CurrentLine, doc.CurrentLine.CharLength - 1); } doc.InvalidateLine(doc.CurrentLineNumber); } } else { _manipulator.BackCaret(); } return(ProcessCharResult.Processed); } else if (ch == 0x09) { _manipulator.CaretColumn = GetNextTabStop(_manipulator.CaretColumn); return(ProcessCharResult.Processed); } else if (ch == 0x0E) { return(ProcessCharResult.Processed); //以下2つはCharDecoderの中で処理されているはずなので無視 } else if (ch == 0x0F) { return(ProcessCharResult.Processed); } else if (ch == 0x00) { return(ProcessCharResult.Processed); //null charは無視 !!CR NULをCR LFとみなす仕様があるが、CR LF CR NULとくることもあって難しい } else { //Debug.WriteLine("Unknown char " + (int)ch); //適当なグラフィック表示ほしい return(ProcessCharResult.Unsupported); } }