Serenity Operating System
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}