|
Packit |
1c1d7e |
/******************************************************************************
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
* $Id: config_templ.l,v 1.8 2001/01/01 10:15:16 root Exp $
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
* Copyright (C) 1997-2015 by Dimitri van Heesch.
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
* Permission to use, copy, modify, and distribute this software and its
|
|
Packit |
1c1d7e |
* documentation under the terms of the GNU General Public License is hereby
|
|
Packit |
1c1d7e |
* granted. No representations are made about the suitability of this software
|
|
Packit |
1c1d7e |
* for any purpose. It is provided "as is" without express or implied warranty.
|
|
Packit |
1c1d7e |
* See the GNU General Public License for more details.
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
%option never-interactive
|
|
Packit |
1c1d7e |
%option prefix="config_doxywYY"
|
|
Packit |
1c1d7e |
%{
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*
|
|
Packit |
1c1d7e |
* includes
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
#include "config.h"
|
|
Packit |
1c1d7e |
#include "input.h"
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#include <QString>
|
|
Packit |
1c1d7e |
#include <QVariant>
|
|
Packit |
1c1d7e |
#include <QStack>
|
|
Packit |
1c1d7e |
#include <QTextCodec>
|
|
Packit |
1c1d7e |
#include <QByteArray>
|
|
Packit |
1c1d7e |
#include <QFileInfo>
|
|
Packit |
1c1d7e |
#include <QStringList>
|
|
Packit |
1c1d7e |
#include <QRegExp>
|
|
Packit |
1c1d7e |
#include <QTextStream>
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#define YY_NO_UNISTD_H 1
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#define MAX_INCLUDE_DEPTH 10
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/* -----------------------------------------------------------------
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
* static variables
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
struct ConfigFileState
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
int lineNr;
|
|
Packit |
1c1d7e |
FILE *file;
|
|
Packit |
1c1d7e |
YY_BUFFER_STATE oldState;
|
|
Packit |
1c1d7e |
YY_BUFFER_STATE newState;
|
|
Packit |
1c1d7e |
QString fileName;
|
|
Packit |
1c1d7e |
};
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static const QHash<QString,Input*> *g_options;
|
|
Packit |
1c1d7e |
static FILE *g_file;
|
|
Packit |
1c1d7e |
static QString g_yyFileName;
|
|
Packit |
1c1d7e |
static QString g_includeName;
|
|
Packit |
1c1d7e |
static QVariant g_includePathList;
|
|
Packit |
1c1d7e |
static QStack<ConfigFileState*> g_includeStack;
|
|
Packit |
1c1d7e |
static int g_includeDepth;
|
|
Packit |
1c1d7e |
static QVariant *g_arg;
|
|
Packit |
1c1d7e |
static Input *g_curOption=0;
|
|
Packit |
1c1d7e |
static QString g_elemStr;
|
|
Packit |
1c1d7e |
static QTextCodec *g_codec = QTextCodec::codecForName("UTF-8");
|
|
Packit |
1c1d7e |
static QString g_codecName = QString::fromLatin1("UTF-8");
|
|
Packit |
1c1d7e |
static int g_lastState;
|
|
Packit |
1c1d7e |
static QByteArray g_tmpString;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/* -----------------------------------------------------------------
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
#undef YY_INPUT
|
|
Packit |
1c1d7e |
#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static int yyread(char *buf,int maxSize)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// no file included
|
|
Packit |
1c1d7e |
if (g_includeStack.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return fread(buf,1,maxSize,g_file);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return fread(buf,1,maxSize,g_includeStack.top()->file);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static QString warning_str = QString::fromLatin1("warning: ");
|
|
Packit |
1c1d7e |
static QString error_str = QString::fromLatin1("error: ");
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void config_err(const char *fmt, ...)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QString msg = error_str;
|
|
Packit |
1c1d7e |
msg.append(QString::fromLatin1(fmt));
|
|
Packit |
1c1d7e |
va_list args;
|
|
Packit |
1c1d7e |
va_start(args, fmt);
|
|
Packit |
1c1d7e |
vfprintf(stderr, qPrintable(msg), args);
|
|
Packit |
1c1d7e |
va_end(args);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
void config_warn(const char *fmt, ...)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QString msg = warning_str;
|
|
Packit |
1c1d7e |
msg.append(QString::fromLatin1(fmt));
|
|
Packit |
1c1d7e |
va_list args;
|
|
Packit |
1c1d7e |
va_start(args, fmt);
|
|
Packit |
1c1d7e |
vfprintf(stderr, qPrintable(msg), args);
|
|
Packit |
1c1d7e |
va_end(args);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void substEnvVarsInStrList(QStringList &sl);
|
|
Packit |
1c1d7e |
static void substEnvVarsInString(QString &s);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void checkEncoding()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
Input *option = g_options->value(QString::fromLatin1("DOXYFILE_ENCODING"));
|
|
Packit |
1c1d7e |
if (option && option->value().toString()!=g_codecName)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QTextCodec *newCodec = QTextCodec::codecForName(option->value().toString().toLatin1());
|
|
Packit |
1c1d7e |
if (newCodec)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_codec = newCodec;
|
|
Packit |
1c1d7e |
g_codecName = option->value().toString();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static FILE *tryPath(const QString &path,const QString &fileName)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QString absName=!path.isEmpty() ? path+QString::fromLatin1("/")+fileName : fileName;
|
|
Packit |
1c1d7e |
QFileInfo fi(absName);
|
|
Packit |
1c1d7e |
if (fi.exists() && fi.isFile())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
FILE *f = fopen(absName.toLocal8Bit(),"r");
|
|
Packit |
1c1d7e |
if (f==NULL)
|
|
Packit |
1c1d7e |
config_err("could not open file %s for reading\n",qPrintable(absName));
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
return f;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return NULL;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static FILE *findFile(const QString &fileName)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (QFileInfo(fileName).isAbsolute()) // absolute path
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return tryPath(QString(), fileName);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// relative path, try with include paths in the list
|
|
Packit |
1c1d7e |
QStringList sl = g_includePathList.toStringList();
|
|
Packit |
1c1d7e |
substEnvVarsInStrList(sl);
|
|
Packit |
1c1d7e |
foreach (QString s, sl)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
FILE *f = tryPath(s,fileName);
|
|
Packit |
1c1d7e |
if (f) return f;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
// try cwd if g_includePathList fails
|
|
Packit |
1c1d7e |
return tryPath(QString::fromLatin1("."),fileName);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void readIncludeFile(const QString &incName)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (g_includeDepth==MAX_INCLUDE_DEPTH)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
config_err("maximum include depth (%d) reached, %s is not included. Aborting...\n",
|
|
Packit |
1c1d7e |
MAX_INCLUDE_DEPTH,qPrintable(incName));
|
|
Packit |
1c1d7e |
exit(1);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QString inc = incName;
|
|
Packit |
1c1d7e |
substEnvVarsInString(inc);
|
|
Packit |
1c1d7e |
inc = inc.trimmed();
|
|
Packit |
1c1d7e |
uint incLen = inc.length();
|
|
Packit |
1c1d7e |
if (inc.at(0)==QChar::fromLatin1('"') &&
|
|
Packit |
1c1d7e |
inc.at(incLen-1)==QChar::fromLatin1('"')) // strip quotes
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
inc=inc.mid(1,incLen-2);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
FILE *f = findFile(inc);
|
|
Packit |
1c1d7e |
if (f) // see if the include file can be found
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// For debugging
|
|
Packit |
1c1d7e |
#if SHOW_INCLUDES
|
|
Packit |
1c1d7e |
for (i=0;i
|
|
Packit |
1c1d7e |
msg("@INCLUDE = %s: parsing...\n",qPrintable(inc));
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// store the state of the old file
|
|
Packit |
1c1d7e |
ConfigFileState *fs=new ConfigFileState;
|
|
Packit |
1c1d7e |
fs->oldState=YY_CURRENT_BUFFER;
|
|
Packit |
1c1d7e |
fs->fileName=g_yyFileName;
|
|
Packit |
1c1d7e |
fs->file=f;
|
|
Packit |
1c1d7e |
// push the state on the stack
|
|
Packit |
1c1d7e |
g_includeStack.push(fs);
|
|
Packit |
1c1d7e |
// set the scanner to the include file
|
|
Packit |
1c1d7e |
yy_switch_to_buffer(yy_create_buffer(f, YY_BUF_SIZE));
|
|
Packit |
1c1d7e |
fs->newState=YY_CURRENT_BUFFER;
|
|
Packit |
1c1d7e |
g_yyFileName=inc;
|
|
Packit |
1c1d7e |
g_includeDepth++;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
config_err("@INCLUDE = %s: not found!\n",qPrintable(inc));
|
|
Packit |
1c1d7e |
exit(1);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
%}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
%option nounput
|
|
Packit |
1c1d7e |
%option noyywrap
|
|
Packit |
1c1d7e |
%option yylineno
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
%x Start
|
|
Packit |
1c1d7e |
%x SkipComment
|
|
Packit |
1c1d7e |
%x SkipInvalid
|
|
Packit |
1c1d7e |
%x GetString
|
|
Packit |
1c1d7e |
%x GetStrList
|
|
Packit |
1c1d7e |
%x GetQuotedString
|
|
Packit |
1c1d7e |
%x GetEnvVar
|
|
Packit |
1c1d7e |
%x Include
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
%%
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
<*>\0x0d
|
|
Packit |
1c1d7e |
<Start,GetString,GetStrList,SkipInvalid>"#" { BEGIN(SkipComment); }
|
|
Packit |
1c1d7e |
<Start>[a-z_A-Z][a-z_A-Z0-9]*[ \t]*"=" { QString cmd = g_codec->toUnicode(yytext);
|
|
Packit |
1c1d7e |
cmd=cmd.left(cmd.length()-1).trimmed();
|
|
Packit |
1c1d7e |
g_curOption = g_options->value(cmd);
|
|
Packit |
1c1d7e |
if (g_curOption==0) // oops not known
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
config_warn("ignoring unsupported tag `%s' at line %d, file %s\n",
|
|
Packit |
1c1d7e |
qPrintable(cmd),yylineno,qPrintable(g_yyFileName));
|
|
Packit |
1c1d7e |
BEGIN(SkipInvalid);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else // known tag
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//option->setEncoding(encoding);
|
|
Packit |
1c1d7e |
g_arg = &g_curOption->value();
|
|
Packit |
1c1d7e |
switch(g_curOption->kind())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
case Input::StrList:
|
|
Packit |
1c1d7e |
g_elemStr = QString();
|
|
Packit |
1c1d7e |
*g_arg = QStringList();
|
|
Packit |
1c1d7e |
BEGIN(GetStrList);
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case Input::String:
|
|
Packit |
1c1d7e |
BEGIN(GetString);
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case Input::Int:
|
|
Packit |
1c1d7e |
BEGIN(GetString);
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case Input::Bool:
|
|
Packit |
1c1d7e |
BEGIN(GetString);
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case Input::Obsolete:
|
|
Packit |
1c1d7e |
config_warn("Tag `%s' at line %d of file %s has become obsolete.\n"
|
|
Packit |
1c1d7e |
"To avoid this warning please update your configuration "
|
|
Packit |
1c1d7e |
"file using \"doxygen -u\"\n", qPrintable(cmd),
|
|
Packit |
1c1d7e |
yylineno,qPrintable(g_yyFileName));
|
|
Packit |
1c1d7e |
BEGIN(SkipInvalid);
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<Start>[a-z_A-Z][a-z_A-Z0-9]*[ \t]*"+=" { QString cmd=g_codec->toUnicode(yytext);
|
|
Packit |
1c1d7e |
cmd=cmd.left(cmd.length()-2).trimmed();
|
|
Packit |
1c1d7e |
g_curOption = g_options->value(cmd);
|
|
Packit |
1c1d7e |
if (g_curOption==0) // oops not known
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
config_warn("ignoring unsupported tag `%s' at line %d, file %s\n",
|
|
Packit |
1c1d7e |
yytext,yylineno,qPrintable(g_yyFileName));
|
|
Packit |
1c1d7e |
BEGIN(SkipInvalid);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else // known tag
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
switch(g_curOption->kind())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
case Input::StrList:
|
|
Packit |
1c1d7e |
g_arg = &g_curOption->value();
|
|
Packit |
1c1d7e |
g_elemStr=QString();
|
|
Packit |
1c1d7e |
BEGIN(GetStrList);
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case Input::String:
|
|
Packit |
1c1d7e |
case Input::Int:
|
|
Packit |
1c1d7e |
case Input::Bool:
|
|
Packit |
1c1d7e |
config_warn("operator += not supported for `%s'. Ignoring line at line %d, file %s\n",
|
|
Packit |
1c1d7e |
yytext,yylineno,qPrintable(g_yyFileName));
|
|
Packit |
1c1d7e |
BEGIN(SkipInvalid);
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
case Input::Obsolete:
|
|
Packit |
1c1d7e |
config_warn("Tag `%s' at line %d of file %s has become obsolete.\n"
|
|
Packit |
1c1d7e |
"To avoid this warning please update your configuration "
|
|
Packit |
1c1d7e |
"file using \"doxygen -u\"\n",
|
|
Packit |
1c1d7e |
qPrintable(cmd),yylineno,qPrintable(g_yyFileName));
|
|
Packit |
1c1d7e |
BEGIN(SkipInvalid);
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<Start>"@INCLUDE_PATH"[ \t]*"=" { BEGIN(GetStrList); g_arg=&g_includePathList; *g_arg = QStringList(); g_elemStr=QString(); }
|
|
Packit |
1c1d7e |
/* include a config file */
|
|
Packit |
1c1d7e |
<Start>"@INCLUDE"[ \t]*"=" { BEGIN(Include);}
|
|
Packit |
1c1d7e |
<Include>([^ \"\t\r\n]+)|("\""[^\n\"]+"\"") {
|
|
Packit |
1c1d7e |
readIncludeFile(g_codec->toUnicode(yytext));
|
|
Packit |
1c1d7e |
BEGIN(Start);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<<EOF>> {
|
|
Packit |
1c1d7e |
//printf("End of include file\n");
|
|
Packit |
1c1d7e |
//printf("Include stack depth=%d\n",g_includeStack.count());
|
|
Packit |
1c1d7e |
if (g_includeStack.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("Terminating scanner!\n");
|
|
Packit |
1c1d7e |
yyterminate();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ConfigFileState *fs = g_includeStack.pop();
|
|
Packit |
1c1d7e |
fclose(fs->file);
|
|
Packit |
1c1d7e |
YY_BUFFER_STATE oldBuf = YY_CURRENT_BUFFER;
|
|
Packit |
1c1d7e |
yy_switch_to_buffer( fs->oldState );
|
|
Packit |
1c1d7e |
yy_delete_buffer( oldBuf );
|
|
Packit |
1c1d7e |
g_yyFileName=fs->fileName;
|
|
Packit |
1c1d7e |
delete fs;
|
|
Packit |
1c1d7e |
g_includeDepth--;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
<Start>[a-z_A-Z0-9]+ { config_warn("ignoring unknown tag `%s' at line %d, file %s\n",yytext,yylineno,qPrintable(g_yyFileName)); }
|
|
Packit |
1c1d7e |
<GetString,SkipInvalid>\n { BEGIN(Start); }
|
|
Packit |
1c1d7e |
<GetStrList>\n {
|
|
Packit |
1c1d7e |
if (!g_elemStr.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("elemStr1=`%s'\n",qPrintable(elemStr));
|
|
Packit |
1c1d7e |
*g_arg = QVariant(g_arg->toStringList() << g_elemStr);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
BEGIN(Start);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<GetStrList>[ \t]+ {
|
|
Packit |
1c1d7e |
if (!g_elemStr.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("elemStr2=`%s'\n",qPrintable(elemStr));
|
|
Packit |
1c1d7e |
*g_arg = QVariant(g_arg->toStringList() << g_elemStr);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
g_elemStr = QString();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<GetString>[^ \"\t\r\n]+ {
|
|
Packit |
1c1d7e |
*g_arg = QVariant(g_codec->toUnicode(yytext));
|
|
Packit |
1c1d7e |
checkEncoding();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<GetString,GetStrList,SkipInvalid>"\"" { g_lastState=YY_START;
|
|
Packit |
1c1d7e |
BEGIN(GetQuotedString);
|
|
Packit |
1c1d7e |
g_tmpString="";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<GetQuotedString>"\""|"\n" {
|
|
Packit |
1c1d7e |
// we add a bogus space to signal that the string was quoted. This space will be stripped later on.
|
|
Packit |
1c1d7e |
g_tmpString+=" ";
|
|
Packit |
1c1d7e |
//printf("Quoted String = `%s'\n",qPrintable(tmpString));
|
|
Packit |
1c1d7e |
if (g_lastState==GetString)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
*g_arg = g_codec->toUnicode(g_tmpString);
|
|
Packit |
1c1d7e |
checkEncoding();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
g_elemStr+=g_codec->toUnicode(g_tmpString);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (*yytext=='\n')
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
config_warn("Missing end quote (\") on line %d, file %s\n",yylineno,
|
|
Packit |
1c1d7e |
qPrintable(g_yyFileName));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
BEGIN(g_lastState);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<GetQuotedString>"\\\"" {
|
|
Packit |
1c1d7e |
g_tmpString+='"';
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<GetQuotedString>. { g_tmpString+=*yytext; }
|
|
Packit |
1c1d7e |
<GetStrList>[^ \#\"\t\r\n]+ {
|
|
Packit |
1c1d7e |
g_elemStr+=g_codec->toUnicode(yytext);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
<SkipComment>\n { BEGIN(Start); }
|
|
Packit |
1c1d7e |
<SkipComment>\\[ \r\t]*\n { BEGIN(Start); }
|
|
Packit |
1c1d7e |
<*>\\[ \r\t]*\n { }
|
|
Packit |
1c1d7e |
<*>\n
|
|
Packit |
1c1d7e |
<*>.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
%%
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*@ ----------------------------------------------------------------------------
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void substEnvVarsInString(QString &s)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
static QRegExp re(QString::fromLatin1("\\$\\([a-z_A-Z0-9]+\\)"));
|
|
Packit |
1c1d7e |
if (s.isEmpty()) return;
|
|
Packit |
1c1d7e |
int p=0;
|
|
Packit |
1c1d7e |
int i,l;
|
|
Packit |
1c1d7e |
//printf("substEnvVarInString(%s) start\n",qPrintable(s));
|
|
Packit |
1c1d7e |
while ((i=re.indexIn(s,p))!=-1)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
l = re.matchedLength();
|
|
Packit |
1c1d7e |
//printf("Found environment var s.mid(%d,%d)=`%s'\n",i+2,l-3,qPrintable(s.mid(i+2,l-3)));
|
|
Packit |
1c1d7e |
QString env=g_codec->toUnicode(getenv(s.mid(i+2,l-3).toLatin1()));
|
|
Packit |
1c1d7e |
substEnvVarsInString(env); // recursively expand variables if needed.
|
|
Packit |
1c1d7e |
s = s.left(i)+env+s.right(s.length()-i-l);
|
|
Packit |
1c1d7e |
p=i+env.length(); // next time start at the end of the expanded string
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
s=s.trimmed(); // to strip the bogus space that was added when an argument
|
|
Packit |
1c1d7e |
// has quotes
|
|
Packit |
1c1d7e |
//printf("substEnvVarInString(%s) end\n",qPrintable(s));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void substEnvVarsInStrList(QStringList &sl)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QStringList out;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
foreach (QString result, sl)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// an argument with quotes will have an extra space at the end, so wasQuoted will be TRUE.
|
|
Packit |
1c1d7e |
bool wasQuoted = (result.indexOf(QChar::fromLatin1(' '))!=-1) ||
|
|
Packit |
1c1d7e |
(result.indexOf(QChar::fromLatin1('\t'))!=-1);
|
|
Packit |
1c1d7e |
// here we strip the quote again
|
|
Packit |
1c1d7e |
substEnvVarsInString(result);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//printf("Result %s was quoted=%d\n",qPrintable(result),wasQuoted);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (!wasQuoted) /* as a result of the expansion, a single string
|
|
Packit |
1c1d7e |
may have expanded into a list, which we'll
|
|
Packit |
1c1d7e |
add to sl. If the original string already
|
|
Packit |
1c1d7e |
contained multiple elements no further
|
|
Packit |
1c1d7e |
splitting is done to allow quoted items with spaces! */
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
int l=result.length();
|
|
Packit |
1c1d7e |
int i,p=0;
|
|
Packit |
1c1d7e |
// skip spaces
|
|
Packit |
1c1d7e |
// search for a "word"
|
|
Packit |
1c1d7e |
for (i=0;i
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QChar c=0;
|
|
Packit |
1c1d7e |
// skip until start of new word
|
|
Packit |
1c1d7e |
while (i
|
|
Packit |
1c1d7e |
p=i; // p marks the start index of the word
|
|
Packit |
1c1d7e |
// skip until end of a word
|
|
Packit |
1c1d7e |
while (i
|
|
Packit |
1c1d7e |
c!=QChar::fromLatin1('\t') &&
|
|
Packit |
1c1d7e |
c!=QChar::fromLatin1('"'))) i++;
|
|
Packit |
1c1d7e |
if (i
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (c==QChar::fromLatin1('"')) // word within quotes
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
p=i+1;
|
|
Packit |
1c1d7e |
for (i++;i
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
c=result.at(i);
|
|
Packit |
1c1d7e |
if (c==QChar::fromLatin1('"')) // end quote
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
out += result.mid(p,i-p);
|
|
Packit |
1c1d7e |
p=i+1;
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (c==QChar::fromLatin1('\\')) // skip escaped stuff
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
i++;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (c==QChar::fromLatin1(' ') || c==QChar::fromLatin1('\t')) // separator
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
out += result.mid(p,i-p);
|
|
Packit |
1c1d7e |
p=i+1;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (p!=l) // add the leftover as a string
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
out += result.right(l-p);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else // just goto the next element in the list
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
out += result;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
sl = out;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//--------------------------------------------------------------------------
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bool parseConfig(
|
|
Packit |
1c1d7e |
const QString &fileName,
|
|
Packit |
1c1d7e |
const QHash<QString,Input *> &options
|
|
Packit |
1c1d7e |
)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QHashIterator<QString, Input*> i(options);
|
|
Packit |
1c1d7e |
g_file = fopen(fileName.toLocal8Bit(),"r");
|
|
Packit |
1c1d7e |
if (g_file==NULL) return false;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// reset all values
|
|
Packit |
1c1d7e |
i.toFront();
|
|
Packit |
1c1d7e |
while (i.hasNext())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
i.next();
|
|
Packit |
1c1d7e |
if (i.value())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
i.value()->reset();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// parse config file
|
|
Packit |
1c1d7e |
g_options = &options;
|
|
Packit |
1c1d7e |
g_yyFileName = fileName;
|
|
Packit |
1c1d7e |
g_includeStack.clear();
|
|
Packit |
1c1d7e |
g_includeDepth = 0;
|
|
Packit |
1c1d7e |
config_doxywYYrestart( config_doxywYYin );
|
|
Packit |
1c1d7e |
BEGIN( Start );
|
|
Packit |
1c1d7e |
config_doxywYYlex();
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// update the values in the UI
|
|
Packit |
1c1d7e |
i.toFront();
|
|
Packit |
1c1d7e |
while (i.hasNext())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
i.next();
|
|
Packit |
1c1d7e |
if (i.value())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
//printf("Updating: %s\n",qPrintable(i.key()));
|
|
Packit |
1c1d7e |
i.value()->update();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
printf("Invalid option: %s\n",qPrintable(i.key()));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
fclose(g_file);
|
|
Packit |
1c1d7e |
return true;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void writeStringValue(QTextStream &t,QTextCodec *codec,const QString &s)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QChar c;
|
|
Packit |
1c1d7e |
bool needsEscaping=false;
|
|
Packit |
1c1d7e |
// convert the string back to it original encoding
|
|
Packit |
1c1d7e |
//QByteArray se = codec->fromUnicode(s);
|
|
Packit |
1c1d7e |
t.setCodec(codec);
|
|
Packit |
1c1d7e |
const QChar *p=s.data();
|
|
Packit |
1c1d7e |
if (!s.isEmpty() && !p->isNull())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
while (!(c=*p++).isNull() && !needsEscaping)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
needsEscaping = (c==QChar::fromLatin1(' ') ||
|
|
Packit |
1c1d7e |
c==QChar::fromLatin1('\n') ||
|
|
Packit |
1c1d7e |
c==QChar::fromLatin1('\t') ||
|
|
Packit |
1c1d7e |
c==QChar::fromLatin1('"'));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (needsEscaping)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << "\"";
|
|
Packit |
1c1d7e |
p=s.data();
|
|
Packit |
1c1d7e |
while (!p->isNull())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (*p ==QChar::fromLatin1(' ') &&
|
|
Packit |
1c1d7e |
*(p+1)==QChar::fromLatin1('\0')) break; // skip inserted space at the end
|
|
Packit |
1c1d7e |
if (*p ==QChar::fromLatin1('"')) t << "\\"; // escape quotes
|
|
Packit |
1c1d7e |
t << *p++;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
t << "\"";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
t << s;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|