Serenity Operating System
at master 72 lines 1.8 kB view raw
1/* 2 * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org> 3 * 4 * SPDX-License-Identifier: BSD-2-Clause 5 */ 6 7#include <AK/DeprecatedString.h> 8#include <AK/Types.h> 9 10#include "Parser.h" 11 12void Parser::write(StringView data) 13{ 14 for (size_t i = 0; i < data.length(); i++) { 15 u8 ch = data[i]; 16 17 switch (m_state) { 18 case State::Free: 19 switch (ch) { 20 case IAC: 21 m_state = State::ReadCommand; 22 break; 23 case '\r': 24 if (on_data) 25 on_data("\n"sv); 26 break; 27 case '\0': 28 case '\n': 29 // Ignore. 30 break; 31 default: 32 if (on_data) 33 on_data(StringView(&ch, 1)); 34 break; 35 } 36 break; 37 case State::ReadCommand: 38 switch (ch) { 39 case IAC: { 40 m_state = State::Free; 41 if (on_data) 42 on_data("\xff"sv); 43 break; 44 } 45 case CMD_WILL: 46 case CMD_WONT: 47 case CMD_DO: 48 case CMD_DONT: 49 m_command = ch; 50 m_state = State::ReadSubcommand; 51 break; 52 default: 53 m_state = State::Error; 54 if (on_error) 55 on_error(); 56 break; 57 } 58 break; 59 case State::ReadSubcommand: { 60 auto command = m_command; 61 m_command = 0; 62 m_state = State::Free; 63 if (on_command) 64 on_command({ command, ch }); 65 break; 66 } 67 case State::Error: 68 // ignore everything 69 break; 70 } 71 } 72}