Blame addon/doxywizard/config_doxyw.l

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