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.
tdebase/kdesu/kdesud/lexer.cpp

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;
}
}