You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
135 lines
2.3 KiB
135 lines
2.3 KiB
/* vi: ts=8 sts=4 sw=4
|
|
*
|
|
* This file is part of the KDE project, module kdesu.
|
|
* Copyright (C) 1999,2000 Geert Jansen <jansen@kde.org>
|
|
*
|
|
* lexer.cpp: A lexer for the kdesud protocol. See kdesud.cpp for a
|
|
* description of the protocol.
|
|
*/
|
|
|
|
#include <ctype.h>
|
|
#include <qcstring.h>
|
|
#include "lexer.h"
|
|
|
|
|
|
Lexer::Lexer(const QCString &input)
|
|
{
|
|
m_Input = input;
|
|
in = 0;
|
|
}
|
|
|
|
Lexer::~Lexer()
|
|
{
|
|
// Erase buffers
|
|
m_Input.fill('x');
|
|
m_Output.fill('x');
|
|
}
|
|
|
|
QCString &Lexer::lval()
|
|
{
|
|
return m_Output;
|
|
}
|
|
|
|
/*
|
|
* lex() is the lexer. There is no end-of-input check here so that has to be
|
|
* done by the caller.
|
|
*/
|
|
|
|
int Lexer::lex()
|
|
{
|
|
char c;
|
|
|
|
c = m_Input[in++];
|
|
m_Output.fill('x');
|
|
m_Output.resize(0);
|
|
|
|
while (1)
|
|
{
|
|
// newline?
|
|
if (c == '\n')
|
|
return '\n';
|
|
|
|
// No control characters
|
|
if (iscntrl(c))
|
|
return Tok_none;
|
|
|
|
if (isspace(c))
|
|
while (isspace(c = m_Input[in++]));
|
|
|
|
// number?
|
|
if (isdigit(c))
|
|
{
|
|
m_Output += c;
|
|
while (isdigit(c = m_Input[in++]))
|
|
m_Output += c;
|
|
in--;
|
|
return Tok_num;
|
|
}
|
|
|
|
// quoted string?
|
|
if (c == '"')
|
|
{
|
|
c = m_Input[in++];
|
|
while ((c != '"') && !iscntrl(c)) {
|
|
// handle escaped characters
|
|
if (c == '\\')
|
|
m_Output += m_Input[in++];
|
|
else
|
|
m_Output += c;
|
|
c = m_Input[in++];
|
|
}
|
|
if (c == '"')
|
|
return Tok_str;
|
|
return Tok_none;
|
|
}
|
|
|
|
// normal string
|
|
while (!isspace(c) && !iscntrl(c))
|
|
{
|
|
m_Output += c;
|
|
c = m_Input[in++];
|
|
}
|
|
in--;
|
|
|
|
// command?
|
|
if (m_Output.length() <= 4)
|
|
{
|
|
if (m_Output == "EXEC")
|
|
return Tok_exec;
|
|
if (m_Output == "PASS")
|
|
return Tok_pass;
|
|
if (m_Output == "DEL")
|
|
return Tok_delCmd;
|
|
if (m_Output == "PING")
|
|
return Tok_ping;
|
|
if (m_Output == "EXIT")
|
|
return Tok_exit;
|
|
if (m_Output == "STOP")
|
|
return Tok_stop;
|
|
if (m_Output == "SET")
|
|
return Tok_set;
|
|
if (m_Output == "GET")
|
|
return Tok_get;
|
|
if (m_Output == "HOST")
|
|
return Tok_host;
|
|
if (m_Output == "SCHD")
|
|
return Tok_sched;
|
|
if (m_Output == "PRIO")
|
|
return Tok_prio;
|
|
if (m_Output == "DELV")
|
|
return Tok_delVar;
|
|
if (m_Output == "DELG")
|
|
return Tok_delGroup;
|
|
if (m_Output == "DELS")
|
|
return Tok_delSpecialKey;
|
|
if (m_Output == "GETK")
|
|
return Tok_getKeys;
|
|
if (m_Output == "CHKG")
|
|
return Tok_chkGroup;
|
|
}
|
|
|
|
return Tok_str;
|
|
}
|
|
}
|
|
|