1/* vi: ts=8 sts=4 sw=4
2
3 This file is part of the KDE project, module kdesu.
4 SPDX-FileCopyrightText: 1999, 2000 Geert Jansen <jansen@kde.org>
5
6 lexer.cpp: A lexer for the kdesud protocol. See kdesud.cpp for a
7 description of the protocol.
8*/
9
10#include "lexer.h"
11
12#include <ctype.h>
13
14Lexer::Lexer(const QByteArray &input)
15{
16 m_Input = input;
17 in = 0;
18}
19
20Lexer::~Lexer()
21{
22 // Erase buffers
23 m_Input.fill(c: 'x');
24 m_Output.fill(c: 'x');
25}
26
27QByteArray &Lexer::lval()
28{
29 return m_Output;
30}
31
32/*
33 * lex() is the lexer. There is no end-of-input check here so that has to be
34 * done by the caller.
35 */
36
37int Lexer::lex()
38{
39 char c;
40
41 c = m_Input[in++];
42 m_Output.fill(c: 'x');
43 m_Output.resize(size: 0);
44
45 while (1) {
46 // newline?
47 if (c == '\n') {
48 return '\n';
49 }
50
51 // No control characters
52 if (iscntrl(c)) {
53 return Tok_none;
54 }
55
56 if (isspace(c)) {
57 while (isspace(c = m_Input[in++])) {
58 ;
59 }
60 }
61
62 // number?
63 if (isdigit(c)) {
64 m_Output += c;
65 while (isdigit(c = m_Input[in++])) {
66 m_Output += c;
67 }
68 in--;
69 return Tok_num;
70 }
71
72 // quoted string?
73 if (c == '"') {
74 c = m_Input[in++];
75 while ((c != '"') && !iscntrl(c)) {
76 // handle escaped characters
77 if (c == '\\') {
78 c = m_Input[in++];
79 if (iscntrl(c)) {
80 return Tok_none;
81 }
82 if (c == '^') {
83 c = m_Input[in++];
84 if ((c == '"') || iscntrl(c)) {
85 return Tok_none;
86 }
87 m_Output += c - '@';
88 } else {
89 m_Output += c;
90 }
91 } else {
92 m_Output += c;
93 }
94 c = m_Input[in++];
95 }
96 if (c == '"') {
97 return Tok_str;
98 }
99 return Tok_none;
100 }
101
102 // normal string
103 while (!isspace(c) && !iscntrl(c)) {
104 m_Output += c;
105 c = m_Input[in++];
106 }
107 in--;
108
109 // command?
110 if (m_Output.length() <= 4) {
111 if (m_Output == "EXEC") {
112 return Tok_exec;
113 }
114 if (m_Output == "PASS") {
115 return Tok_pass;
116 }
117 if (m_Output == "DEL") {
118 return Tok_delCmd;
119 }
120 if (m_Output == "PING") {
121 return Tok_ping;
122 }
123 if (m_Output == "EXIT") {
124 return Tok_exit;
125 }
126 if (m_Output == "STOP") {
127 return Tok_stop;
128 }
129 if (m_Output == "SET") {
130 return Tok_set;
131 }
132 if (m_Output == "GET") {
133 return Tok_get;
134 }
135 if (m_Output == "HOST") {
136 return Tok_host;
137 }
138 if (m_Output == "SCHD") {
139 return Tok_sched;
140 }
141 if (m_Output == "PRIO") {
142 return Tok_prio;
143 }
144 if (m_Output == "DELV") {
145 return Tok_delVar;
146 }
147 if (m_Output == "DELG") {
148 return Tok_delGroup;
149 }
150 if (m_Output == "DELS") {
151 return Tok_delSpecialKey;
152 }
153 if (m_Output == "GETK") {
154 return Tok_getKeys;
155 }
156 if (m_Output == "CHKG") {
157 return Tok_chkGroup;
158 }
159 }
160
161 return Tok_str;
162 }
163}
164

source code of kdesu/src/kdesud/lexer.cpp