diff options
Diffstat (limited to 'addon/configgen')
-rw-r--r-- | addon/configgen/Makefile.in | 42 | ||||
-rw-r--r-- | addon/configgen/config_templ.h | 37 | ||||
-rw-r--r-- | addon/configgen/config_templ.l | 729 | ||||
-rw-r--r-- | addon/configgen/configgen.cpp | 1530 | ||||
-rw-r--r-- | addon/configgen/configgen.pro.in | 20 | ||||
-rw-r--r-- | addon/configgen/qtbc.h | 43 |
6 files changed, 2401 insertions, 0 deletions
diff --git a/addon/configgen/Makefile.in b/addon/configgen/Makefile.in new file mode 100644 index 0000000..aa8dd7a --- /dev/null +++ b/addon/configgen/Makefile.in @@ -0,0 +1,42 @@ +# +# +# +# Copyright (C) 1997-2000 by Dimitri van Heesch. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation under the terms of the GNU General Public License is hereby +# granted. No representations are made about the suitability of this software +# for any purpose. It is provided "as is" without express or implied warranty. +# See the GNU General Public License for more details. +# + +CFGGEN_DIR = bin + +all: Makefile.configgen config.h config.l + $(MAKE) -f Makefile.configgen $@ + +Makefile.configgen: configgen.pro + $(PERL) $(TMAKE) configgen.pro >Makefile.configgen + +config.h: $(CFGGEN_DIR)/configgen config_templ.h + $(CFGGEN_DIR)/configgen config_templ.h >config.h + +config.l: $(CFGGEN_DIR)/configgen config_templ.l + $(CFGGEN_DIR)/configgen config_templ.l >config.l + +$(CFGGEN_DIR)/configgen: Makefile.configgen configgen.cpp + $(MAKE) -f Makefile.configgen + +tmake: + $(PERL) $(TMAKE) configgen.pro >Makefile.configgen + +install: + $(CP) config.l config.h ../../src + +clean: Makefile.configgen + $(MAKE) -f Makefile.configgen clean + +distclean: clean + $(RM) config.cpp config.h config.l Makefile.configgen + +FORCE: diff --git a/addon/configgen/config_templ.h b/addon/configgen/config_templ.h new file mode 100644 index 0000000..f895bab --- /dev/null +++ b/addon/configgen/config_templ.h @@ -0,0 +1,37 @@ +/****************************************************************************** + * + * $Id$ + * + * Copyright (C) 1997-2000 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + */ + +#ifndef CONFIG_H +#define CONFIG_H + +#ifndef DOXYWIZARD +#include "qtbc.h" +#endif +#include <qstrlist.h> +#include <qfile.h> + +extern void parseConfig(const QCString &config); +extern void writeTemplateConfig(QFile *f,bool shortList); +extern void checkConfig(); +extern void configStrToVal(); +extern void substituteEnvironmentVars(); + +struct Config +{ + static void init(); + +#CONFIG Header +}; + +#endif diff --git a/addon/configgen/config_templ.l b/addon/configgen/config_templ.l new file mode 100644 index 0000000..a86156c --- /dev/null +++ b/addon/configgen/config_templ.l @@ -0,0 +1,729 @@ +/****************************************************************************** + * + * $Id$ + * + * Copyright (C) 1997-2000 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + */ + +%{ + +/* + * includes + */ +#include <stdio.h> +#include <stdlib.h> +#include <iostream.h> +#include <assert.h> +#include <ctype.h> + +#include <qfileinfo.h> +#include <qdir.h> +#include <qtextstream.h> +#include <qregexp.h> + +#include "config.h" +#include "version.h" + +#ifdef DOXYWIZARD +#include <stdarg.h> +void err(const char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + vfprintf(stderr, fmt, args); + va_end(args); +} +void warn(const char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + vfprintf(stderr, fmt, args); + va_end(args); +} +#else +#include "doxygen.h" +#include "message.h" +#include "pre.h" +#include "version.h" +#include "language.h" +#endif + +#define YY_NEVER_INTERACTIVE 1 +#define YY_NO_UNPUT + +/* ----------------------------------------------------------------- + * + * exported variables + */ + +#CONFIG Config + +/* ----------------------------------------------------------------- + * + * static variables + */ + +static const char * inputString; +static int inputPosition; +static int yyLineNr; +static QCString tmpString; +static QCString * s=0; +static bool * b=0; +static QStrList * l=0; +static int lastState; +static QCString elemStr; +//static QCString tabSizeString; +//static QCString colsInAlphaIndexString; +#CONFIG Static + +/* ----------------------------------------------------------------- + */ +#undef YY_INPUT +#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size); + +static int yyread(char *buf,int max_size) +{ + int c=0; + while( c < max_size && inputString[inputPosition] ) + { + *buf = inputString[inputPosition++] ; + c++; buf++; + } + return c; +} + +%} + +%option noyywrap + +%x Start +%x SkipComment +%x GetString +%x GetBool +%x GetStrList +%x GetQuotedString +%x GetEnvVar + +%% + +<*>\0x0d +<Start,GetString,GetStrList,GetBool>"#" { BEGIN(SkipComment); } +#CONFIG Rules +<Start>[a-z_A-Z0-9]+ { err("Warning: ignoring unknown tag `%s' at line %d\n",yytext,yyLineNr); } +<GetString,GetBool>\n { yyLineNr++; BEGIN(Start); } +<GetStrList>\n { + yyLineNr++; + if (!elemStr.isEmpty()) + { + //printf("elemStr1=`%s'\n",elemStr.data()); + l->append(elemStr); + } + BEGIN(Start); + } +<GetStrList>[ \t]+ { + if (!elemStr.isEmpty()) + { + //printf("elemStr2=`%s'\n",elemStr.data()); + l->append(elemStr); + } + elemStr.resize(0); + } +<GetString>[^ \"\t\r\n]+ { (*s)+=yytext; } +<GetString,GetStrList>"\"" { lastState=YY_START; + BEGIN(GetQuotedString); + tmpString.resize(0); + } + /* +<GetString,GetStrList,GetQuotedString>"\$\(" { + //printf(">> Enter env\n"); + lastEnvState=YY_START; + BEGIN(GetEnvVar); + } +<GetEnvVar>[a-z_A-Z0-9]+")" { + yytext[yyleng-1]='\0'; + const char *env=getenv(yytext); + int i; + int l=strlen(env); + //printf("env name=`%s' text=`%s'\n",yytext,env); + for (i=l-1;i>=0;i--) unput(env[i]); + BEGIN(lastEnvState); + } + */ +<GetQuotedString>"\""|"\n" { + //printf("Quoted String = `%s'\n",tmpString.data()); + if (lastState==GetString) + (*s)+=tmpString; + else + elemStr+=tmpString; + if (*yytext=='\n') + { + err("Warning: Missing end quote (\") on line %d\n",yyLineNr); + yyLineNr++; + } + BEGIN(lastState); + } +<GetQuotedString>"\\\"" { + tmpString+='"'; + } +<GetQuotedString>. { tmpString+=*yytext; } +<GetBool>[a-zA-Z]+ { + QCString bs=yytext; + bs=bs.upper(); + if (bs=="YES") + *b=TRUE; + else if (bs=="NO") + *b=FALSE; + else + { + *b=FALSE; + warn("Warning: Invalid value `%s' for " + "boolean tag in line %d; use YES or NO\n", + bs.data(),yyLineNr); + } + } +<GetStrList>[^ \#\"\t\r\n]+ { + elemStr+=yytext; + } +<SkipComment>\n { yyLineNr++; BEGIN(Start); } +<SkipComment>\\[ \r\t]*\n { yyLineNr++; BEGIN(Start); } +<*>\\[ \r\t]*\n { yyLineNr++; } +<*>. +<*>\n { yyLineNr++ ; } + +%% + +/*@ ---------------------------------------------------------------------------- + */ + + +void dumpConfig() +{ +#CONFIG Dump +} + +void Config::init() +{ +#CONFIG Init +} + +static void writeBoolValue(QTextStream &t,bool v) +{ + if (v) t << "YES"; else t << "NO"; +} + +static void writeIntValue(QTextStream &t,int i) +{ + t << i; +} + +static void writeStringValue(QTextStream &t,QCString &s) +{ + const char *p=s.data(); + char c; + bool hasBlanks=FALSE; + if (p) + { + while ((c=*p++)!=0 && !hasBlanks) hasBlanks = (c==' ' || c=='\n' || c=='\t'); + if (hasBlanks) + t << "\"" << s << "\""; + else + t << s; + } +} + +static void writeStringList(QTextStream &t,QStrList &l) +{ + const char *p = l.first(); + bool first=TRUE; + while (p) + { + char c; + const char *s=p; + bool hasBlanks=FALSE; + while ((c=*p++)!=0 && !hasBlanks) hasBlanks = (c==' ' || c=='\n' || c=='\t'); + if (!first) t << " "; + first=FALSE; + if (hasBlanks) t << "\"" << s << "\""; else t << s; + p = l.next(); + if (p) t << " \\" << endl; + } +} + +void writeTemplateConfig(QFile *f,bool sl) +{ + QTextStream t(f); +#ifdef DOXYWIZARD + t << "# Doxygen configuration generated by Doxywizard version " << versionString << endl; +#else + t << "# Doxyfile " << versionString << endl << endl; +#endif + if (!sl) + { + t << "# This file describes the settings to be used by doxygen for a project\n"; + t << "#\n"; + t << "# All text after a hash (#) is considered a comment and will be ignored\n"; + t << "# The format is:\n"; + t << "# TAG = value [value, ...]\n"; + t << "# Values that contain spaces should be placed between quotes (\" \")\n"; + } +#CONFIG Template +} + +void configStrToVal() +{ + if (tabSizeString.isEmpty()) + { + Config::tabSize=8; + } + else + { + bool ok; + int ts = tabSizeString.toInt(&ok); + if (!ok || ts<1 || ts>16) + { + warn("Warning: argument of TAB_SIZE is not a valid number, using tab size of 8 spaces!\n"); + ts=8; + } + Config::tabSize = ts; + } + + if (colsInAlphaIndexString.isEmpty()) + { + Config::colsInAlphaIndex=5; + } + else + { + bool ok; + int cols = colsInAlphaIndexString.toInt(&ok); + if (!ok || cols<1 || cols>20) + { + warn("Warning: argument of COLS_IN_ALPHA_INDEX is not a valid number in the range [1..20]!\n" + "Using the default of 5 columns!\n"); + cols = 5; + } + Config::colsInAlphaIndex=cols; + } +} + +static void substEnvVarsInString(QCString &s) +{ + QRegExp re("\\$([a-z_A-Z0-9]+)"); + int p=0; + int i,l; + //printf("substEnvVarInString(%s) start\n",s.data()); + while ((i=re.match(s,p,&l))!=-1) + { + //printf("Found environment var s.mid(%d,%d)=`%s'\n",i+2,l-3,s.mid(i+2,l-3).data()); + QCString env=getenv(s.mid(i+2,l-3)); + substEnvVarsInString(env); // recursively expand variables if needed. + s = s.left(i)+env+s.right(s.length()-i-l); + p=i+l; + } + //printf("substEnvVarInString(%s) end\n",s.data()); +} + +static void substEnvVarsInStrList(QStrList &sl) +{ + char *s = sl.first(); + while (s) + { + QCString result(s); + substEnvVarsInString(result); + + int l=result.length(); + int i,p=0; + // skip spaces + // search for a "word" + for (i=0;i<l;i++) + { + char c; + // skip until start of new word + for (;i<l && ((c=result.at(i))==' ' || c=='\t');i++) + p=i; // p marks the start index of the word + // skip until end of a word + for (;i<l && ((c=result.at(i))!=' ' && c!='\t' && c!='"');i++); + if (i<l) // not at the end of the string + { + if (c=='"') // word within quotes + { + p=i+1; + for (i++;i<l;i++) + { + c=result.at(i); + if (c=='"') // end quote + { + // replace the string in the list and go to the next item. + sl.insert(sl.at(),result.mid(p,i-p)); // insert new item before current item. + sl.next(); // current item is now the old item + p=i+1; + break; + } + else if (c=='\\') // skip escaped stuff + { + i++; + } + } + } + else if (c==' ' || c=='\t') // separator + { + // replace the string in the list and go to the next item. + sl.insert(sl.at(),result.mid(p,i-p)); // insert new item before current item. + sl.next(); // current item is now the old item + p=i+1; + } + } + } + if (p!=l) // add the leftover as a string + { + // replace the string in the list and go to the next item. + sl.insert(sl.at(),result.right(l-p)); // insert new item before current item. + sl.next(); // current item is now the old item + } + + // remove the old unexpanded string from the list + i=sl.at(); + sl.remove(); // current item index changes if the last element is removed. + if (sl.at()==i) // not last item + s = sl.current(); + else // just removed last item + s = 0; + } +} + + +void substituteEnvironmentVars() +{ +#CONFIG Substenv +} + +void checkConfig() +{ + //if (!projectName.isEmpty()) + //{ + // projectName[0]=toupper(projectName[0]); + //} + + + // set default man page extension if non is given by the user + if (Config::manExtension.isEmpty()) + { + Config::manExtension=".3"; + } + + Config::paperType = Config::paperType.lower().stripWhiteSpace(); + if (Config::paperType.isEmpty()) + { + Config::paperType = "a4wide"; + } + if (Config::paperType!="a4" && Config::paperType!="a4wide" && Config::paperType!="letter" && + Config::paperType!="legal" && Config::paperType!="executive") + { + err("Error: Unknown page type specified"); + } + + Config::outputLanguage=Config::outputLanguage.stripWhiteSpace(); + if (Config::outputLanguage.isEmpty()) + { + Config::outputLanguage = "English"; +#ifndef DOXYWIZARD + setTranslator("English"); +#endif + } + else + { +#ifndef DOXYWIZARD + if (!setTranslator(Config::outputLanguage)) + { + err("Error: Output language %s not supported! Using English instead.\n", + Config::outputLanguage.data()); + } +#endif + } + + // Test to see if output directory is valid + if (Config::outputDir.isEmpty()) + Config::outputDir=QDir::currentDirPath(); + else + { + QDir dir(Config::outputDir); + if (!dir.exists()) + { + dir.setPath(QDir::currentDirPath()); + if (!dir.mkdir(Config::outputDir)) + { + err("Error: tag OUTPUT_DIRECTORY: Output directory `%s' does not " + "exist and cannot be created\n",Config::outputDir.data()); + exit(1); + } + else if (!Config::quietFlag) + { + err("Notice: Output directory `%s' does not exist. " + "I have created it for you.\n", Config::outputDir.data()); + } + dir.cd(Config::outputDir); + } + Config::outputDir=dir.absPath(); + } + + if (Config::htmlOutputDir.isEmpty() && Config::generateHtml) + { + Config::htmlOutputDir=Config::outputDir+"/html"; + } + else if (Config::htmlOutputDir && Config::htmlOutputDir[0]!='/') + { + Config::htmlOutputDir.prepend(Config::outputDir+'/'); + } + QDir htmlDir(Config::htmlOutputDir); + if (Config::generateHtml && !htmlDir.exists() && + !htmlDir.mkdir(Config::htmlOutputDir)) + { + err("Could not create output directory %s\n",Config::htmlOutputDir.data()); + exit(1); + } + + if (Config::latexOutputDir.isEmpty() && Config::generateLatex) + { + Config::latexOutputDir=Config::outputDir+"/latex"; + } + else if (Config::latexOutputDir && Config::latexOutputDir[0]!='/') + { + Config::latexOutputDir.prepend(Config::outputDir+'/'); + } + QDir latexDir(Config::latexOutputDir); + if (Config::generateLatex && !latexDir.exists() && + !latexDir.mkdir(Config::latexOutputDir)) + { + err("Could not create output directory %s\n",Config::latexOutputDir.data()); + exit(1); + } + + if (Config::rtfOutputDir.isEmpty() && Config::generateRTF) + { + Config::rtfOutputDir=Config::outputDir+"/rtf"; + } + else if (Config::rtfOutputDir && Config::rtfOutputDir[0]!='/') + { + Config::rtfOutputDir.prepend(Config::outputDir+'/'); + } + QDir rtfDir(Config::rtfOutputDir); + if (Config::generateRTF && !rtfDir.exists() && + !rtfDir.mkdir(Config::rtfOutputDir)) + { + err("Could not create output directory %s\n",Config::rtfOutputDir.data()); + exit(1); + } + + if (Config::manOutputDir.isEmpty() && Config::generateMan) + { + Config::manOutputDir=Config::outputDir+"/man"; + } + else if (Config::manOutputDir && Config::manOutputDir[0]!='/') + { + Config::manOutputDir.prepend(Config::outputDir+'/'); + } + QDir manDir(Config::manOutputDir); + if (Config::generateMan && !manDir.exists() && + !manDir.mkdir(Config::manOutputDir)) + { + err("Could not create output directory %s\n",Config::manOutputDir.data()); + exit(1); + } + + // Test to see if HTML header is valid + if (!Config::headerFile.isEmpty()) + { + QFileInfo fi(Config::headerFile); + if (!fi.exists()) + { + err("Error: tag HTML_HEADER: header file `%s' " + "does not exist\n",Config::headerFile.data()); + exit(1); + } + } + // Test to see if HTML footer is valid + if (!Config::footerFile.isEmpty()) + { + QFileInfo fi(Config::footerFile); + if (!fi.exists()) + { + err("Error: tag HTML_FOOTER: footer file `%s' " + "does not exist\n",Config::footerFile.data()); + exit(1); + } + } + // Test to see if LaTeX header is valid + if (!Config::latexHeaderFile.isEmpty()) + { + QFileInfo fi(Config::latexHeaderFile); + if (!fi.exists()) + { + err("Error: tag LATEX_HEADER: header file `%s' " + "does not exist\n",Config::latexHeaderFile.data()); + exit(1); + } + } + // check include path + char *s=Config::includePath.first(); + while (s) + { + QFileInfo fi(s); + if (!fi.exists()) err("Warning: tag INCLUDE_PATH: include path `%s' " + "does not exist\n",s); +#ifndef DOXYWIZARD + addSearchDir(fi.absFilePath()); +#endif + s=Config::includePath.next(); + } + // check input + if (Config::inputSources.count()==0) + { + err("Error: tag INPUT: no input files specified after the INPUT tag.\n"); + exit(1); + } + else + { + s=Config::inputSources.first(); + while (s) + { + QFileInfo fi(s); + if (!fi.exists()) + { + err("Error: tag INPUT: input source `%s' does not exist\n",s); + exit(1); + } + s=Config::inputSources.next(); + } + } + + // add default pattern if needed + if (Config::filePatternList.count()==0) + { + Config::filePatternList.append("*"); + } + + // add default pattern if needed + if (Config::examplePatternList.count()==0) + { + Config::examplePatternList.append("*"); + } + + // add default pattern if needed + //if (Config::imagePatternList.count()==0) + //{ + // Config::imagePatternList.append("*"); + //} + + // more checks needed if and only if the search engine is enabled. + if (Config::searchEngineFlag) + { + // check cgi name + if (Config::cgiName.isEmpty()) + { + err("Error: tag CGI_NAME: no cgi script name after the CGI_NAME tag.\n"); + exit(1); + } + // check cgi URL + if (Config::cgiURL.isEmpty()) + { + err("Error: tag CGI_URL: no URL to cgi directory specified.\n"); + exit(1); + } + else if (Config::cgiURL.left(7)!="http://") + { + err("Error: tag CGI_URL: URL to cgi directory is invalid (must " + "start with http://).\n"); + exit(1); + } + // check documentation URL + if (Config::docURL.isEmpty()) + { + Config::docURL = Config::outputDir.copy().prepend("file://").append("html"); + } + else if (Config::docURL.left(7)!="http://" && Config::docURL.left(7)!="file://") + { + err("Error: tag DOC_URL: URL to documentation is invalid or " + "not absolute.\n"); + exit(1); + } + // check absolute documentation path + if (Config::docAbsPath.isEmpty()) + { + Config::docAbsPath = Config::outputDir+"/html"; + } + else if (Config::docAbsPath[0]!='/' && Config::docAbsPath[1]!=':') + { + err("Error: tag DOC_ABSPATH: path is not absolute!\n"); + exit(1); + } + // check path to doxysearch + if (Config::binAbsPath.isEmpty()) + { + err("Error: tag BIN_ABSPATH: no absolute path to doxysearch " + "specified.\n"); + exit(1); + } + else if (Config::binAbsPath[0]!='/' && Config::binAbsPath[1]!=':') + { + err("Error: tag BIN_ABSPATH: path is not absolute!\n"); + exit(1); + } + + // check perl path + bool found=FALSE; + if (Config::perlPath.isEmpty()) + { + QFileInfo fi; + fi.setFile("/usr/bin/perl"); + if (fi.exists()) + { + Config::perlPath="/usr/bin/perl"; + found=TRUE; + } + else + { + fi.setFile("/usr/local/bin/perl"); + if (fi.exists()) + { + Config::perlPath="/usr/local/bin/perl"; + found=TRUE; + } + } + } + if (!found) + { + QFileInfo fi(Config::perlPath); + if (!fi.exists()) + { + warn("Warning: tag PERL_PATH: perl interpreter not found at default or" + "user specified (%s) location\n", + Config::perlPath.data()); + } + } + } + +#if defined(_WIN32) + if (Config::haveDotFlag) _putenv("DOTFONTPATH=."); +#endif + +} + +void parseConfig(const QCString &s) +{ + inputString = s; + inputPosition = 0; + yyLineNr = 1; + configYYrestart( configYYin ); + BEGIN( Start ); + configYYlex(); +} + +//extern "C" { // some bogus code to keep the compiler happy +// int configYYwrap() { return 1 ; } +//} diff --git a/addon/configgen/configgen.cpp b/addon/configgen/configgen.cpp new file mode 100644 index 0000000..553db76 --- /dev/null +++ b/addon/configgen/configgen.cpp @@ -0,0 +1,1530 @@ +/****************************************************************************** + * + * + * + * Copyright (C) 2000 by Joerg Baumann & Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * All output generated with Doxygen is not covered by this license. + * + */ + +// includes + +#include "qtbc.h" +#include <qtextstream.h> +#include <qfile.h> +#include <qlist.h> +#include <qdict.h> +#include <qstringlist.h> + +#include <stdio.h> + +static QString spaces=" "; + +void init(); // defined below + +// Iterate over all options calling the spezified method +#define FORALL(x) \ +{\ + ConfigOption *co=ConfigOption::optionList.first();\ + while (co)\ + {\ + co->x;\ + co=ConfigOption::optionList.next();\ + }\ +} + +/*! convert a normal string \a s into a string that can be embedded in C code. + * The \a prefix string will be placed before each string line and the + * \a postfix string will be placed after each string. + */ +static void stringToC(QTextStream &t,QCString &s, + const char *prefix,const char *postfix) +{ + int i=0,l=s.length(); + bool eol=TRUE; + for (i=0;i<l;i++) + { + char c; + switch ((c=s[i])) + { + case '\n': + t << postfix << endl; + eol=TRUE; + break; + case '\\': + case '"': + if (eol) t << prefix; + t << "\\" << (char)c; + eol=FALSE; + break; + default: + if (eol) t << prefix; + eol=FALSE; + t << (char)c; + break; + } + } + if (!eol) t << postfix << endl; +} + +class ConfigBool; + +/*! baseclass for options */ +class ConfigOption +{ + public: + static QList<ConfigOption> optionList; + static QDict<ConfigOption> optionDict; + QCString getVarName() const { return varName; } + + virtual ~ConfigOption() {} + + virtual void printHeader(QTextStream &t) + { + t << " static " << type << " " << varName + << "; // " << shortDesc << endl; + } + virtual void printStatic(QTextStream &) {} + virtual void printConfig(QTextStream &t) + { + t << type << " Config::" << varName; + if (!defaultValue.isEmpty()) t << " = \"" << defaultValue << "\""; + t << ";" << endl; + } + virtual void printRules(QTextStream &) + { + } + virtual void printDump(QTextStream &) + { + } + virtual void printCheck(QTextStream &t) + { + // FIXME + if (!check.isEmpty()) t << check << endl; + } + virtual void printInit(QTextStream &t) + { + t << " Config::" << varName << " = " + << defaultValue << ";" << endl; + } + virtual void printTemplate(QTextStream &t) + { + t << " if (!sl)" << endl; + t << " {" << endl; + t << " t << \"\\n\";" << endl; + stringToC(t,longDesc," t << \"# ","\\n\";"); + t << " t << \"\\n\";" << endl; + t << " }" << endl; + t << " t << \"" << cfgName << " = \";" << endl; + t << " " << writeFunc << "(t,Config::" << varName << ");" << endl; + t << " t << \"\\n\";" << endl; + } + virtual void printSubstEnv(QTextStream &) {} + virtual void printWidgets(QTextStream &,int) = 0; + virtual void addDependency(ConfigOption *) + { + fprintf(stderr,"Error: dependency add for non boolean option!\n"); + } + void setDependsOn(ConfigBool *b) { depends=b; } + + protected: + ConfigOption(const char * var,const char * cfg,const char * value, + const char * short_,const char * long_,const char * type_, + const char * type2_,const char * writeFunc_ + ): + varName(var), cfgName(cfg), defaultValue(value), shortDesc(short_), + longDesc(long_), type(type_), type2(type2_), writeFunc(writeFunc_) + { + if (optionDict.find(var)!=0) + { + fprintf(stderr,"Error: configuration variable found more than once!\n"); + } + else + { + optionList.append(this); + optionDict.insert(var,this); + } + depends=0; + } + + void tclQuote(QTextStream &t,const char *s) + { + t << "{"; + for (const char *p=s;*p!=0;p++) + { + if (strchr("{}",*p)) t << '\\'; + t << (*p); + } + t << "} "; + } + + QCString varName; // name as in Config::name + QCString cfgName; // name as in cfgfile + QCString defaultValue; // default value + QCString shortDesc; // short description + QCString longDesc; // long description + QCString type,type2; // + QCString writeFunc; // + QCString check; // + ConfigBool *depends; +}; + +QList<ConfigOption> ConfigOption::optionList; +QDict<ConfigOption> ConfigOption::optionDict; + +void addDependency(const char *src,const char *dst) +{ + ConfigOption *sopt = ConfigOption::optionDict.find(src); + ConfigOption *dopt = ConfigOption::optionDict.find(dst); + if (!sopt) + { + fprintf(stderr,"Error: option %s not defined!\n",src); + } + if (!dopt) + { + fprintf(stderr,"Error: option %s not defined!\n",dst); + } + dopt->addDependency(sopt); + sopt->setDependsOn((ConfigBool *)dopt); +} + + +class ConfigInfo : public ConfigOption +{ + public: + ConfigInfo(const char *var,const char * short_) + : ConfigOption(var,"","",short_,"","","","") {} + static void add(const char *var,const char * short_); + void printHeader(QTextStream &) {} + void printConfig(QTextStream &) {} + void printRules(QTextStream &) {} + virtual void printTemplate(QTextStream &t) + { + t << " if (!sl)" << endl; + t << " {" << endl; + t << " t << \"\\n\";" << endl; + t << " }" << endl; + t << " t << \"#---------------------------------------------------------------------------\\n\";" << endl; + t << " t << \"# " << shortDesc << "\\n\";" << endl; + t << " t << \"#---------------------------------------------------------------------------\\n\";" << endl; + } + virtual void printInit(QTextStream &) {} + virtual void printDump(QTextStream &t) + { + t << " printf(\"# " << shortDesc << "\\n\");" << endl; + } + virtual void printWidgets(QTextStream &t,int pass) + { + switch(pass) + { + case 0: + t << " PageWidget *" << varName << " = new PageWidget( tab, \"" + << varName << "\" );" << endl; + break; + case 1: + t << " " << varName << "->addStretch(1);" << endl; + break; + default: + break; + } + } + QCString getVarName() { return varName; } +}; + +class ConfigList : public ConfigOption +{ + public: + enum WidgetType { String, File, Dir, FileAndDir }; + ConfigList(ConfigInfo *parent,const char * var,const char * cfg,const char * value, + const char * short_,const char * long_, WidgetType w) + : ConfigOption(var,cfg,value,short_,long_,"QStrList","List","writeStringList"), + m_parent(parent), + m_widgetType(w) + { + } + static void add(const char * var,const char * cfg,const char * value, + const char * short_,const char * long_,WidgetType w=String); + virtual void printRules(QTextStream &t) + { + t << "<Start>\"" << cfgName << "\"[ \\t]*\"=\""; + t << spaces.left(22-cfgName.length()); + t << "{ BEGIN(GetStrList); l=&Config::" << varName; + t << "; l->clear(); elemStr=\"\"; }" << endl; + } + virtual void printInit(QTextStream &t) + { + t << " Config::" << varName; + if (!defaultValue.isEmpty()) + { + t << " = \"" << defaultValue << "\""; + } + else + { + t << ".clear()"; + } + t << ";" << endl; + } + virtual void printDump(QTextStream &t) + { + t << " {" << endl; + t << " char *is=Config::" << varName << ".first();" << endl; + t << " while (is)" << endl; + t << " {" << endl; + t << " printf(\"" << varName << "=`%s'\\n\",is);" << endl; + t << " is=Config::" << varName << ".next();" << endl; + t << " }" << endl; + t << " }" << endl; + } + virtual void printSubstEnv(QTextStream &t) + { + t << " substEnvVarsInStrList( Config::" << varName << " );" << endl; + } + virtual void printWidgets(QTextStream &t,int pass) + { + switch (pass) + { + case 0: + { + t << " " << varName << " = new InputStrList( \"" << cfgName + << "\", " << m_parent->getVarName() << ", Config::" << varName; + if (m_widgetType!=String) + { + t << ","; + switch(m_widgetType) + { + case File: t << "InputStrList::ListFile"; break; + case Dir: t << "InputStrList::ListDir"; break; + case FileAndDir: t << "InputStrList::ListFileDir"; break; + default: break; + } + } + t << " );" << endl; + t << " QWhatsThis::add(" << varName << ", " << endl; + stringToC(t,longDesc," \"","\""); + t << " );" << endl; + t << " connect(" << varName + << ",SIGNAL(changed()),this,SIGNAL(changed()));" << endl; + } + break; + case 2: + { + t << " InputStrList *" << varName << ";" << endl; + } + break; + case 5: + { + t << " " << varName << "->init();" << endl; + } + break; + default: + break; + } + } + private: + ConfigInfo *m_parent; + WidgetType m_widgetType; +}; + +class ConfigString : public ConfigOption +{ + public: + enum WidgetType { String, File, Dir }; + ConfigString(ConfigInfo *parent, const char * var,const char * cfg,const char * value, + const char * short_,const char * long_, WidgetType w + ) + : ConfigOption(var,cfg,value,short_,long_, + "QCString","String","writeStringValue" + ), + m_parent(parent), + m_widgetType(w) + { + } + + static void add(const char * var,const char * cfg,const char * value, + const char * short_,const char * long_,WidgetType w=String); + static void addFixedValue(const char *var, const char *value); + + virtual void printRules(QTextStream &t) + { + t << "<Start>\"" << cfgName << "\"[ \\t]*\"=\""; + t << spaces.left(22-cfgName.length()); + t << "{ BEGIN(GetString); s=&Config::" << varName; + t << "; s->resize(0); }" << endl; + } + virtual void printInit(QTextStream &t) + { + t << " Config::" << varName; + if (!defaultValue.isEmpty()) t << " = \"" << defaultValue << "\""; + else t << ".resize(0)"; + t << ";" << endl; + } + virtual void printDump(QTextStream &t) + { + t << " printf(\"" << varName << "=`%s'\\n\",Config::" << varName << ".data());" << endl; + } + virtual void printSubstEnv(QTextStream &t) + { + t << " substEnvVarsInString( Config::" << varName << " );" << endl; + } + virtual void printWidgets(QTextStream &t,int pass) + { + switch (pass) + { + case 0: + { + t << " " << varName << " = new InputString( \"" << cfgName + << "\", " << m_parent->getVarName() << ", Config::" << varName; + if (m_widgetType!=String || m_values.count()>0) + { + t << ","; + switch (m_widgetType) + { + case File: + t << "InputString::StringFile"; + break; + case Dir: + t << "InputString::StringDir"; + break; + default: + t << "InputString::StringFixed"; + break; + } + } + + t << " );" << endl; + t << " QWhatsThis::add(" << varName << ", " << endl; + stringToC(t,longDesc," \"","\""); + t << " );" << endl; + t << " connect(" << varName + << ",SIGNAL(changed()),this,SIGNAL(changed()));" << endl; + if (m_values.count()>0) + { + for ( QStringList::Iterator it = m_values.begin(); it != m_values.end(); ++it ) + { + t << " " << varName << "->addValue(\"" << (*it) << "\");" << endl; + } + } + } + break; + case 2: + { + t << " InputString *" << varName << ";" << endl; + } + break; + case 5: + { + t << " " << varName << "->init();" << endl; + } + break; + default: + break; + } + } + void addValue(const char *val) + { + m_values.append(val); + } + private: + ConfigInfo *m_parent; + WidgetType m_widgetType; + QStringList m_values; +}; + +class ConfigInt : public ConfigOption +{ + public: + ConfigInt(ConfigInfo *parent,const char * var,const char * cfg,const char * value, + const char * short_,const char * long_,int minVal,int maxVal) + : ConfigOption(var,cfg,value,short_,long_,"int ","Int","writeIntValue"), + m_parent(parent), m_minVal(minVal), m_maxVal(maxVal) + { + } + static void add(const char * var,const char * cfg,const char * value, + const char * short_,const char * long_,int minVal,int maxVal); + virtual void printConfig(QTextStream &t) + { + t << type << " Config::" << varName; + if (!defaultValue.isEmpty()) t << " = " << defaultValue; + t << ";" << endl; + } + virtual void printRules(QTextStream &t) + { + t << "<Start>\"" << cfgName << "\"[ \\t]*\"=\""; + t << spaces.left(22-cfgName.length()); + t << "{ BEGIN(GetString); s=&" << varName; + t << "String; s->resize(0); }" << endl; + } + virtual void printStatic(QTextStream &t) + { + t << "static QCString " << varName << "String;" << endl; + } + virtual void printDump(QTextStream &t) + { + t << " printf(\"" << varName << "=`%d'\\n\",Config::" << varName << ");" << endl; + } + virtual void printWidgets(QTextStream &t,int pass) + { + switch (pass) + { + case 0: + { + t << " " << varName << " = new InputInt( \"" << cfgName + << "\", " << m_parent->getVarName() << ", Config::" + << varName << "," << m_minVal << "," << m_maxVal << " );" << endl; + t << " QWhatsThis::add(" << varName << ", " << endl; + stringToC(t,longDesc," \"","\""); + t << " );" << endl; + t << " connect(" << varName + << ",SIGNAL(changed()),this,SIGNAL(changed()));" << endl; + } + break; + case 2: + { + t << " InputInt *" << varName << ";" << endl; + } + break; + case 5: + { + t << " " << varName << "->init();" << endl; + } + break; + default: + break; + } + } + private: + ConfigInfo *m_parent; + int m_minVal; + int m_maxVal; +}; + +class ConfigBool : public ConfigOption +{ + public: + ConfigBool(ConfigInfo *parent,const char * var,const char * cfg,const char * value, + const char * short_,const char * long_) + : ConfigOption(var,cfg,value,short_,long_,"bool ","Bool","writeBoolValue"), + m_parent(parent) {} + static void add(const char * var,const char * cfg,const char * value, + const char * short_,const char * long_); + virtual void printConfig(QTextStream &t) + { + t << type << " Config::" << varName; + if (!defaultValue.isEmpty()) t << " = " << defaultValue; + t << ";" << endl; + } + virtual void printRules(QTextStream &t) + { + t << "<Start>\"" << cfgName << "\"[ \\t]*\"=\""; + t << spaces.left(22-cfgName.length()); + t << "{ BEGIN(GetBool); b=&Config::" << varName; + t << "; }" << endl; + } + virtual void printDump(QTextStream &t) + { + t << " printf(\"" << varName << "=`%d'\\n\",Config::" << varName << ");" << endl; + } + virtual void printWidgets(QTextStream &t,int pass) + { + switch (pass) + { + case 0: + { + t << " " << varName << " = new InputBool( \"" << cfgName + << "\", " << m_parent->getVarName() << ", Config::" << varName << " );" << endl; + t << " QWhatsThis::add(" << varName << ", " << endl; + stringToC(t,longDesc," \"","\""); + t << " );" << endl; + t << " connect(" << varName + << ",SIGNAL(changed()),this,SIGNAL(changed()));" << endl; + if (dependencies.count()>0) + { + t << " connect(" << varName << ",SIGNAL(toggled(bool)),SLOT(" + << varName << "Toggle(bool)));" << endl; + } + } + break; + case 1: + { + if (dependencies.count()>0) + { + t << " " << varName << "Toggle(Config::" << varName << ");" << endl; + } + } + break; + case 2: + { + t << " InputBool *" << varName << ";" << endl; + } + break; + case 3: + { + if (dependencies.count()>0) + { + t << " void " << varName << "Toggle(bool);" << endl; + } + } + break; + case 4: + { + if (dependencies.count()>0) + { + t << "void ConfigFile::" << varName << "Toggle(bool state)" << endl; + t << "{" << endl; + ConfigOption *o=dependencies.first(); + while (o) + { + t << " " << o->getVarName() << "->setEnabled(state);" << endl; + o=dependencies.next(); + } + t << "}" << endl << endl; + } + } + break; + case 5: + { + t << " " << varName << "->init();" << endl; + } + default: + break; + } + } + virtual void addDependency(ConfigOption *o) + { + dependencies.append(o); + } + private: + ConfigInfo *m_parent; + QList<ConfigOption> dependencies; +}; + +static ConfigInfo *g_lastConfigInfo; + +void ConfigList::add(const char * var,const char * cfg,const char * value, + const char * short_,const char * long_,WidgetType w) +{ + ConfigOption* o=new ConfigList(g_lastConfigInfo,var,cfg,value,short_,long_,w); + ASSERT(o!=0); + ASSERT(g_lastConfigInfo!=0); + //optionList.append(o); +} + +void ConfigString::add(const char * var,const char * cfg,const char * value, + const char * short_,const char * long_,WidgetType w) +{ + ConfigOption* o=new ConfigString(g_lastConfigInfo,var,cfg,value,short_,long_,w); + ASSERT(o!=0); + ASSERT(g_lastConfigInfo!=0); + //optionList.append(o); +} + +void ConfigInt::add(const char * var,const char * cfg,const char * value, + const char * short_,const char * long_,int minVal, int maxVal) +{ + ConfigOption* o=new ConfigInt(g_lastConfigInfo,var,cfg,value, + short_,long_,minVal,maxVal); + ASSERT(o!=0); + ASSERT(g_lastConfigInfo!=0); + //optionList.append(o); +} + +void ConfigBool::add(const char * var,const char * cfg,const char * value, + const char * short_,const char * long_) +{ + ConfigOption* o=new ConfigBool(g_lastConfigInfo,var,cfg,value,short_,long_); + ASSERT(o!=0); + ASSERT(g_lastConfigInfo!=0); + //optionList.append(o); +} + +void ConfigInfo::add(const char * var,const char * short_) +{ + g_lastConfigInfo =new ConfigInfo(var,short_); + ASSERT(g_lastConfigInfo!=0); + //optionList.append(g_lastConfigInfo); +} + +void ConfigString::addFixedValue(const char *var, const char *value) +{ + ConfigString *cs = (ConfigString *)optionDict[var]; + if (cs==0) + { + fprintf(stderr,"ConfigString::addFixedValue: unknown variable %s\n",var); + } + else + { + cs->addValue(value); + } +} + + +int main(int argc,char * argv[]) +{ + // check arguments + if (argc!=2) + { + fprintf(stderr,"usage: %s config-template\n",argv[0]); + exit(1); + } + + init(); // create options + QFile ctfile(argv[1]); + + // open template file + if (!ctfile.open(IO_ReadOnly)) + { + fprintf(stderr,"Error: couldnīt open file %s\n",argv[1]); + exit(1); + } + const int maxLineLen=10000; + char buf[maxLineLen]; + + + QFile f; + f.open(IO_WriteOnly,stdout); + QTextStream t(&f); + + // process template file + while (!ctfile.atEnd()) + { + ctfile.readLine(buf,maxLineLen-1); + if (QCString("#CONFIG Config\n" )==buf) FORALL(printConfig(t)) + else if (QCString("#CONFIG Static\n" )==buf) FORALL(printStatic(t)) + else if (QCString("#CONFIG Rules\n" )==buf) FORALL(printRules(t)) + else if (QCString("#CONFIG Dump\n" )==buf) FORALL(printDump(t)) + else if (QCString("#CONFIG Init\n" )==buf) FORALL(printInit(t)) + else if (QCString("#CONFIG Template\n")==buf) FORALL(printTemplate(t)) + else if (QCString("#CONFIG Check\n" )==buf) FORALL(printCheck(t)) + else if (QCString("#CONFIG Header\n" )==buf) FORALL(printHeader(t)) + else if (QCString("#CONFIG Substenv\n")==buf) FORALL(printSubstEnv(t)) + else if (QCString("#CONFIG Widgets0\n" )==buf) FORALL(printWidgets(t,0)) + else if (QCString("#CONFIG Widgets1\n" )==buf) FORALL(printWidgets(t,1)) + else if (QCString("#CONFIG WidgetVars\n" )==buf) FORALL(printWidgets(t,2)) + else if (QCString("#CONFIG WidgetSlots\n" )==buf) FORALL(printWidgets(t,3)) + else if (QCString("#CONFIG WidgetSlotImpl\n" )==buf) FORALL(printWidgets(t,4)) + else if (QCString("#CONFIG WidgetInit\n" )==buf) FORALL(printWidgets(t,5)) + else t << buf; + } + ctfile.close(); + return 0; +} + +void init() +{ + // option definitions + //----------------------------------------------------------------------------------------------- + ConfigInfo::add("General","General configuration options"); + //----------------------------------------------------------------------------------------------- + + ConfigString::add("projectName", + "PROJECT_NAME", + "", + "the name of the project", + "The PROJECT_NAME tag is a single word (or a sequence of words surrounded \n" + "by quotes) that should identify the project. " + ); + ConfigString::add("projectNumber", + "PROJECT_NUMBER", + "", + "the number of the project", + "The PROJECT_NUMBER tag can be used to enter a project or revision number. \n" + "This could be handy for archiving the generated documentation or \n" + "if some version control system is used.\n" + ); + ConfigString::add("outputDir", + "OUTPUT_DIRECTORY", + "", + "the global output directory", + "The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) \n" + "base path where the generated documentation will be put. \n" + "If a relative path is entered, it will be relative to the location \n" + "where doxygen was started. If left blank the current directory will be used.\n", + ConfigString::Dir + ); + ConfigString::add("outputLanguage", + "OUTPUT_LANGUAGE", + "English", + "the output language", + "The OUTPUT_LANGUAGE tag is used to specify the language in which all \n" + "documentation generated by doxygen is written. Doxygen will use this \n" + "information to generate all constant output in the proper language. \n" + "The default language is English, other supported languages are: \n" + "Dutch, French, Italian, Czech, Swedish, German, Finnish, Japanese, \n" + "Spanish and Russian\n" + ); + ConfigString::addFixedValue("outputLanguage","English"); + ConfigString::addFixedValue("outputLanguage","Dutch"); + ConfigString::addFixedValue("outputLanguage","French"); + ConfigString::addFixedValue("outputLanguage","Italian"); + ConfigString::addFixedValue("outputLanguage","Czech"); + ConfigString::addFixedValue("outputLanguage","Swedish"); + ConfigString::addFixedValue("outputLanguage","German"); + ConfigString::addFixedValue("outputLanguage","Russian"); + ConfigString::addFixedValue("outputLanguage","Japanese"); + ConfigString::addFixedValue("outputLanguage","Finnish"); + ConfigString::addFixedValue("outputLanguage","Spanish"); + ConfigBool::add( "quietFlag", + "QUIET", + "FALSE", + "generate progress messages flag", + "The QUIET tag can be used to turn on/off the messages that are generated \n" + "by doxygen. Possible values are YES and NO. If left blank NO is used. \n" + ); + ConfigBool::add( "warningFlag", + "WARNINGS", + "TRUE", + "generate warnings flag", + "The WARNINGS tag can be used to turn on/off the warning messages that are \n" + "generated by doxygen. Possible values are YES and NO. If left blank \n" + "NO is used. \n" + ); + ConfigBool::add( "noIndexFlag", + "DISABLE_INDEX", + "FALSE", + "generate condensed index flag", + "The DISABLE_INDEX tag can be used to turn on/off the condensed index at \n" + "top of each HTML page. The value NO (the default) enables the index and \n" + "the value YES disables it. \n" + ); + ConfigBool::add( "extractAllFlag", + "EXTRACT_ALL", + "FALSE", + "gererate docs for all classes flag", + "If the EXTRACT_ALL tag is set to YES all classes and functions will be \n" + "included in the documentation, even if no documentation was available. \n" + ); + ConfigBool::add( "extractPrivateFlag", + "EXTRACT_PRIVATE", + "FALSE", + "generate docs for private members flag", + "If the EXTRACT_PRIVATE tag is set to YES all private members of a class \n" + "will be included in the documentation. \n" + ); + ConfigBool::add( "hideMemberFlag", + "HIDE_UNDOC_MEMBERS", + "FALSE", + "hide undocumented members.", + "If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all \n" + "undocumented members inside documented classes or files. \n" + ); + ConfigBool::add( "hideClassFlag", + "HIDE_UNDOC_CLASSES", + "FALSE", + "hide undocumented members.", + "If the HIDE_UNDOC_CLASSESS tag is set to YES, Doxygen will hide all \n" + "undocumented classes. \n" + ); + ConfigBool::add( "briefMemDescFlag", + "BRIEF_MEMBER_DESC", + "TRUE", + "enable `inline' brief member descr.", + "If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will \n" + "include brief member descriptions after the members that are listed in \n" + "the file and class documentation (similar to JavaDoc). \n" + "Set to NO to disable this. \n" + ); + ConfigBool::add( "repeatBriefFlag", + "REPEAT_BRIEF", + "TRUE", + "repeat brief descriptions.", + "If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend \n" + "the brief description of a member or function before the detailed description. \n" + "Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the \n" + "brief descriptions will be completely suppressed. \n" + ); + ConfigBool::add( "alwaysDetailsFlag", + "ALWAYS_DETAILED_SEC", + "FALSE", + "show details description even if there is only a brief description?", + "If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then \n" + "Doxygen will generate a detailed section even if there is only a brief \n" + "description. \n" + ); + ConfigBool::add( "fullPathNameFlag", + "FULL_PATH_NAMES", + "FALSE", + "using full path name in output", + "If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full \n" + "path before files name in the file list and in the header files. If set \n" + "to NO the shortest path that makes the file name unique will be used. \n" + ); + ConfigList::add( "stripFromPath", + "STRIP_FROM_PATH", + "", + "list of candidates to strip from the file path", + "If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag \n" + "can be used to strip a user defined part of the path. Stripping is \n" + "only done if one of the specified strings matches the left-hand part of \n" + "the path. \n" + ); + addDependency("stripFromPath","fullPathNameFlag"); + ConfigBool::add( "internalDocsFlag", + "INTERNAL_DOCS", + "FALSE", + "determines what happens to internal docs.", + "The INTERNAL_DOCS tag determines if documentation \n" + "that is typed after a \\internal command is included. If the tag is set \n" + "to NO (the default) then the documentation will be excluded. \n" + "Set it to YES to include the internal documentation. \n" + ); + ConfigBool::add( "classDiagramFlag", + "CLASS_DIAGRAMS", + "TRUE", + "enable the generation of class diagrams.", + "If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will \n" + "generate a class diagram (in Html and LaTeX) for classes with base or \n" + "super classes. Setting the tag to NO turns the diagrams off. \n" + ); + ConfigBool::add( "sourceBrowseFlag", + "SOURCE_BROWSER", + "FALSE", + "include source code in documentation.", + "If the SOURCE_BROWSER tag is set to YES then a list of source files will \n" + "be generated. Documented entities will be cross-referenced with these sources. \n" + ); + ConfigBool::add( "inlineSourceFlag", + "INLINE_SOURCES", + "FALSE", + "inline the definition bodies in the docs?", + "Setting the INLINE_SOURCES tag to YES will include the body \n" + "of functions and classes directly in the documentation. \n" + ); + ConfigBool::add( "stripCommentsFlag", + "STRIP_CODE_COMMENTS", + "TRUE", + "strip special comments from code fragments?", + "Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct \n" + "doxygen to hide any special comment blocks from generated source code \n" + "fragments. Normal C and C++ comments will always remain visible. \n" + ); + ConfigBool::add( "caseSensitiveNames", + "CASE_SENSE_NAMES", + "FALSE", + "determines if output can be mixed case.", + "If the CASE_SENSE_NAMES tag is set to NO (the default) then Doxygen \n" + "will only generate file names in lower case letters. If set to \n" + "YES upper case letters are also allowed. This is useful if you have \n" + "classes or files whose names only differ in case and if your file system \n" + "supports case sensitive file names. \n" + ); + ConfigBool::add( "verbatimHeaderFlag", + "VERBATIM_HEADERS", + "TRUE", + "enable/disable generation of verb headers.", + "If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen \n" + "will generate a verbatim copy of the header file for each class for \n" + "which an include is specified. Set to NO to disable this. \n" + ); + ConfigBool::add( "showIncFileFlag", + "SHOW_INCLUDE_FILES", + "TRUE", + "show include file in file documentation?", + "If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen \n" + "will put list of the files that are included by a file in the documentation \n" + "of that file. \n" + ); + ConfigBool::add( "autoBriefFlag", + "JAVADOC_AUTOBRIEF", + "TRUE", + "javadoc comments behaves as Qt comments.", + "If the JAVADOC_AUTOBRIEF tag is set to YES (the default) then Doxygen \n" + "will interpret the first line (until the first dot) of a JavaDoc-style \n" + "comment as the brief description. If set to NO, the Javadoc-style will \n" + "behave just like the Qt-style comments. \n" + ); + ConfigBool::add( "inheritDocsFlag", + "INHERIT_DOCS", + "TRUE", + "inheritance of documentation enabled?", + "If the INHERIT_DOCS tag is set to YES (the default) then an undocumented \n" + "member inherits the documentation from any documented member that it \n" + "reimplements. \n" + ); + ConfigBool::add( "inlineInfoFlag", + "INLINE_INFO", + "TRUE", + "show info about inline members?", + "If the INLINE_INFO tag is set to YES (the default) then a tag [inline] \n" + "is inserted in the documentation for inline members. \n" + ); + ConfigBool::add( "sortMembersFlag", + "SORT_MEMBER_DOCS", + "TRUE", + "sort members alphabetically?", + "If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen \n" + "will sort the (detailed) documentation of file and class members \n" + "alphabetically by member name. If set to NO the members will appear in \n" + "declaration order. \n" + ); + ConfigInt::add( "tabSize", + "TAB_SIZE", + "8", + "number of spaces in a tab", + "The TAB_SIZE tag can be used to set the number of spaces in a tab. \n" + "Doxygen uses this value to replace tabs by spaces in code fragments. \n", + 1,16 + ); + ConfigList::add( "sectionFilterList", + "ENABLED_SECTIONS", + "", + "list of section filters that are enabled", + "The ENABLE_SECTIONS tag can be used to enable conditional \n" + "documentation sections, marked by \\if sectionname ... \\endif. \n" + ); + //----------------------------------------------------------------------------------------------- + ConfigInfo::add( "Input","configuration options related to the input files"); + //----------------------------------------------------------------------------------------------- + ConfigList::add( "inputSources", + "INPUT", + "", + "list of input files", + "The INPUT tag can be used to specify the files and/or directories that contain \n" + "documented source files. You may enter file names like \"myfile.cpp\" or \n" + "directories like \"/usr/src/myproject\". Separate the files or directories \n" + "with spaces. \n", + ConfigList::FileAndDir + ); + ConfigList::add( "filePatternList", + "FILE_PATTERNS", + "", + "list of file patterns", + "If the value of the INPUT tag contains directories, you can use the \n" + "FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp \n" + "and *.h) to filter out the source-files in the directories. If left \n" + "blank all files are included. \n" + ); + ConfigBool::add( "recursiveFlag", + "RECURSIVE", + "FALSE", + "scan directories recursively", + "The RECURSIVE tag can be used to turn specify whether or not subdirectories \n" + "should be searched for input files as well. Possible values are YES and NO. \n" + "If left blank NO is used. \n" + ); + ConfigList::add( "excludeSources", + "EXCLUDE", + "", + "list of files to exclude from the input", + "The EXCLUDE tag can be used to specify files and/or directories that should \n" + "excluded from the INPUT source files. This way you can easily exclude a \n" + "subdirectory from a directory tree whose root is specified with the INPUT tag. \n", + ConfigList::FileAndDir + ); + ConfigList::add( "excludePatternList", + "EXCLUDE_PATTERNS", + "", + "list of patterns to exclude from input", + "If the value of the INPUT tag contains directories, you can use the \n" + "EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude \n" + "certain files from those directories. \n" + ); + ConfigList::add( "examplePath", + "EXAMPLE_PATH", + "", + "list of example paths", + "The EXAMPLE_PATH tag can be used to specify one or more files or \n" + "directories that contain example code fragments that are included (see \n" + "the \\include command). \n", + ConfigList::Dir + ); + ConfigList::add( "examplePatternList", + "EXAMPLE_PATTERNS", + "", + "list of example patterns", + "If the value of the EXAMPLE_PATH tag contains directories, you can use the \n" + "EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp \n" + "and *.h) to filter out the source-files in the directories. If left \n" + "blank all files are included. \n" + ); + ConfigList::add( "imagePath", + "IMAGE_PATH", + "", + "list of image paths", + "The IMAGE_PATH tag can be used to specify one or more files or \n" + "directories that contain image that are included in the documentation (see \n" + "the \\image command). \n", + ConfigList::Dir + ); + ConfigString::add("inputFilter", + "INPUT_FILTER", + "", + "a filter command that is applied to input files", + "The INPUT_FILTER tag can be used to specify a program that doxygen should \n" + "invoke to filter for each input file. Doxygen will invoke the filter program \n" + "by executing (via popen()) the command <filter> <input-file>, where <filter> \n" + "is the value of the INPUT_FILTER tag, and <input-file> is the name of an \n" + "input file. Doxygen will then use the output that the filter program writes \n" + "to standard output. \n", + ConfigString::File + ); + + //----------------------------------------------------------------------------------------------- + ConfigInfo::add( "Index","configuration options related to the alphabetical class index"); + //----------------------------------------------------------------------------------------------- + + ConfigBool::add( "alphaIndexFlag", + "ALPHABETICAL_INDEX", + "FALSE", + "should an alphabetical index be generated?", + "If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index \n" + "of all compounds will be generated. Enable this if the project \n" + "contains a lot of classes, structs, unions or interfaces. \n" + ); + ConfigInt::add( "colsInAlphaIndex", + "COLS_IN_ALPHA_INDEX", + "5", + "number of columns in the alphabetical index", + "If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then \n" + "the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns \n" + "in which this list will be split (can be a number in the range [1..20]) \n", + 1,20 + ); + ConfigList::add( "ignorePrefixList", + "IGNORE_PREFIX", + "", + "list of prefixes to ignore for the alphabetical index", + "In case all classes in a project start with a common prefix, all \n" + "classes will be put under the same header in the alphabetical index. \n" + "The IGNORE_PREFIX tag can be used to specify one or more prefixes that \n" + "should be ignored while generating the index headers. \n" + ); + //----------------------------------------------------------------------------------------------- + ConfigInfo::add( "HTML","configuration options related to the HTML output"); + //----------------------------------------------------------------------------------------------- + ConfigBool::add( "generateHtml", + "GENERATE_HTML", + "TRUE", + "generate HTML output", + "If the GENERATE_HTML tag is set to YES (the default) Doxygen will \n" + "generate HTML output. \n" + ); + ConfigString::add("htmlOutputDir", + "HTML_OUTPUT", + "html", + "the directory to put the HTML files", + "The HTML_OUTPUT tag is used to specify where the HTML docs will be put. \n" + "If a relative path is entered the value of OUTPUT_DIRECTORY will be \n" + "put in front of it. If left blank `html' will be used as the default path. \n", + ConfigString::Dir + ); + addDependency("htmlOutputDir","generateHtml"); + ConfigString::add("headerFile", + "HTML_HEADER", + "", + "the name of the personal HTML header", + "The HTML_HEADER tag can be used to specify a personal HTML header for \n" + "each generated HTML page. If it is left blank doxygen will generate a \n" + "standard header.\n", + ConfigString::File + ); + addDependency("headerFile","generateHtml"); + ConfigString::add("footerFile", + "HTML_FOOTER", + "", + "the name of the personal HTML footer", + "The HTML_FOOTER tag can be used to specify a personal HTML footer for \n" + "each generated HTML page. If it is left blank doxygen will generate a \n" + "standard footer.\n", + ConfigString::File + ); + addDependency("footerFile","generateHtml"); + ConfigString::add("htmlStyleSheet", + "HTML_STYLESHEET", + "", + "user defined cascading style sheet", + "The HTML_STYLESHEET tag can be used to specify a user defined cascading \n" + "style sheet that is used by each HTML page. It can be used to \n" + "fine-tune the look of the HTML output. If the tag is left blank doxygen \n" + "will generate a default style sheet \n", + ConfigString::File + ); + addDependency("htmlStyleSheet","generateHtml"); + ConfigBool::add( "htmlAlignMemberFlag", + "HTML_ALIGN_MEMBERS", + "TRUE", + "align members in HTML using tables.", + "If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, \n" + "files or namespaces will be aligned in HTML using tables. If set to \n" + "NO a bullet list will be used. \n" + ); + addDependency("htmlAlignMemberFlag","generateHtml"); + ConfigBool::add( "htmlHelpFlag", + "GENERATE_HTMLHELP", + "FALSE", + "should html help files be generated?", + "If the GENERATE_HTMLHELP tag is set to YES, additional index files \n" + "will be generated that can be used as input for tools like the \n" + "Microsoft HTML help workshop to generate a compressed HTML help file (.chm) \n" + "of the generated HTML documentation. \n" + ); + addDependency("htmlHelpFlag","generateHtml"); + //----------------------------------------------------------------------------------------------- + ConfigInfo::add( "LaTeX","configuration options related to the LaTeX output"); + //----------------------------------------------------------------------------------------------- + ConfigBool::add( "generateLatex", + "GENERATE_LATEX", + "TRUE", + "generate Latex output", + "If the GENERATE_LATEX tag is set to YES (the default) Doxygen will \n" + "generate Latex output. \n" + ); + ConfigString::add("latexOutputDir", + "LATEX_OUTPUT", + "latex", + "the directory to put the Latex files", + "The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. \n" + "If a relative path is entered the value of OUTPUT_DIRECTORY will be \n" + "put in front of it. If left blank `latex' will be used as the default path. \n", + ConfigString::Dir + ); + addDependency("latexOutputDir","generateLatex"); + ConfigBool::add( "compactLatexFlag", + "COMPACT_LATEX", + "FALSE", + "generate compact LaTeX documentation.", + "If the COMPACT_LATEX tag is set to YES Doxygen generates more compact \n" + "LaTeX documents. This may be useful for small projects and may help to \n" + "save some trees in general. \n" + ); + addDependency("compactLatexFlag","generateLatex"); + ConfigString::add("paperType", + "PAPER_TYPE", + "a4wide", + "the page type to generate docs for", + "The PAPER_TYPE tag can be used to set the paper type that is used \n" + "by the printer. Possible values are: a4, a4wide, letter, legal and \n" + "executive. If left blank a4wide will be used. \n" + ); + ConfigString::addFixedValue("paperType","a4"); + ConfigString::addFixedValue("paperType","a4wide"); + ConfigString::addFixedValue("paperType","letter"); + ConfigString::addFixedValue("paperType","legal"); + ConfigString::addFixedValue("paperType","executive"); + addDependency("paperType","generateLatex"); + ConfigList::add( "extraPackageList", + "EXTRA_PACKAGES", + "", + "list of extra LaTeX packages.", + "The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX \n" + "packages that should be included in the LaTeX output. \n" + ); + addDependency("extraPackageList","generateLatex"); + ConfigString::add("latexHeaderFile", + "LATEX_HEADER", + "", + "the name of the personal LaTeX header", + "The LATEX_HEADER tag can be used to specify a personal LaTeX header for \n" + "the generated latex document. The header should contain everything until \n" + "the first chapter. If it is left blank doxygen will generate a \n" + "standard header. Notice: only use this tag if you know what you are doing! \n", + ConfigString::File + ); + addDependency("latexHeaderFile","generateLatex"); + ConfigBool::add( "pdfHyperFlag", + "PDF_HYPERLINKS", + "FALSE", + "generate latex prepared creating hyperlinked pdfs.", + "If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated \n" + "is prepared for conversion to pdf (using ps2pdf). The pdf file will \n" + "contain links (just like the HTML output) instead of page references \n" + "This makes the output suitable for online browsing using a pdf viewer. \n" + ); + addDependency("pdfHyperFlag","generateLatex"); + ConfigBool::add( "latexBatchModeFlag", + "LATEX_BATCHMODE", + "FALSE", + "continue after latex errors?", + "If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\\\batchmode. \n" + "command to the generated LaTeX files. This will instruct LaTeX to keep \n" + "running if errors occur, instead of asking the user for help. \n" + "This option is also used when generating formulas in HTML. \n" + ); + addDependency("latexBatchModeFlag","generateLatex"); + //----------------------------------------------------------------------------------------------- + ConfigInfo::add( "RTF","configuration options related to the RTF output"); + //----------------------------------------------------------------------------------------------- + ConfigBool::add( "generateRTF", + "GENERATE_RTF", + "FALSE", + "generate RTF flag", + "If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output \n" + "For now this is experimental and is disabled by default. The RTF output \n" + "is optimised for Word 97 and may not look too pretty with other readers \n" + "or editors.\n" + ); + ConfigString::add("rtfOutputDir", + "RTF_OUTPUT", + "rtf", + "the directory to put the RTF files", + "The RTF_OUTPUT tag is used to specify where the RTF docs will be put. \n" + "If a relative path is entered the value of OUTPUT_DIRECTORY will be \n" + "put in front of it. If left blank `rtf' will be used as the default path. \n", + ConfigString::Dir + ); + addDependency("rtfOutputDir","generateRTF"); + ConfigBool::add( "compactRTFFlag", + "COMPACT_RTF", + "FALSE", + "generate more compact RTF", + "If the COMPACT_RTF tag is set to YES Doxygen generates more compact \n" + "RTF documents. This may be useful for small projects and may help to \n" + "save some trees in general. \n" + ); + addDependency("compactRTFFlag","generateRTF"); + ConfigBool::add( "rtfHyperFlag", + "RTF_HYPERLINKS", + "FALSE", + "generate hyper links in RTF", + "If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated \n" + "will contain hyperlink fields. The RTF file will \n" + "contain links (just like the HTML output) instead of page references. \n" + "This makes the output suitable for online browsing using a WORD or other. \n" + "programs which support those fields. \n" + "Note: wordpad (write) and others do not support links. \n" + ); + addDependency("rtfHyperFlag","generateRTF"); + //----------------------------------------------------------------------------------------------- + ConfigInfo::add( "Man","configuration options related to the man page output"); + //----------------------------------------------------------------------------------------------- + ConfigBool::add( "generateMan", + "GENERATE_MAN", + "TRUE", + "generate Man pages", + "If the GENERATE_MAN tag is set to YES (the default) Doxygen will \n" + "generate man pages \n" + ); + ConfigString::add("manOutputDir", + "MAN_OUTPUT", + "man", + "the directory to put the man pages", + "The MAN_OUTPUT tag is used to specify where the man pages will be put. \n" + "If a relative path is entered the value of OUTPUT_DIRECTORY will be \n" + "put in front of it. If left blank `man' will be used as the default path. \n", + ConfigString::Dir + ); + addDependency("manOutputDir","generateMan"); + ConfigString::add("manExtension", + "MAN_EXTENSION", + ".3", + "extension the man page files", + "The MAN_EXTENSION tag determines the extension that is added to \n" + "the generated man pages (default is the subroutine's section .3) \n" + ); + addDependency("manExtension","generateMan"); + //----------------------------------------------------------------------------------------------- + ConfigInfo::add( "Preprocessor","Configuration options related to the preprocessor "); + //----------------------------------------------------------------------------------------------- + ConfigBool::add( "preprocessingFlag", + "ENABLE_PREPROCESSING", + "TRUE", + "enable preprocessing", + "If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will \n" + "evaluate all C-preprocessor directives found in the sources and include \n" + "files. \n" + ); + ConfigBool::add( "macroExpansionFlag", + "MACRO_EXPANSION", + "FALSE", + "expand macros in the source.", + "If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro \n" + "names in the source code. If set to NO (the default) only conditional \n" + "compilation will be performed. \n" + ); + addDependency("macroExpansionFlag","preprocessingFlag"); + ConfigBool::add( "searchIncludeFlag", + "SEARCH_INCLUDES", + "TRUE", + "search for included files", + "If the SEARCH_INCLUDES tag is set to YES (the default) the includes files \n" + "in the INCLUDE_PATH (see below) will be search if a #include is found. \n" + ); + addDependency("searchIncludeFlag","preprocessingFlag"); + ConfigList::add( "includePath", + "INCLUDE_PATH", + "", + "list of include paths", + "The INCLUDE_PATH tag can be used to specify one or more directories that \n" + "contain include files that are not input files but should be processed by \n" + "the preprocessor. \n", + ConfigList::Dir + ); + addDependency("includePath","preprocessingFlag"); + ConfigList::add( "predefined", + "PREDEFINED", + "", + "list of predefined macro names.", + "The PREDEFINED tag can be used to specify one or more macro names that \n" + "are defined before the preprocessor is started (similar to the -D option of \n" + "gcc). The argument of the tag is a list of macros of the form: name \n" + "or name=definition (no spaces). If the definition and the = are \n" + "omitted =1 is assumed. \n" + ); + addDependency("predefined","preprocessingFlag"); + ConfigBool::add( "onlyPredefinedFlag", + "EXPAND_ONLY_PREDEF", + "FALSE", + "expand only predefined macros", + "If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES \n" + "then the macro expansion is limited to the macros specified with the \n" + "PREDEFINED tag. \n" + ); + addDependency("onlyPredefinedFlag","preprocessingFlag"); + //----------------------------------------------------------------------------------------------- + ConfigInfo::add( "External","Configuration::addtions related to external references "); + //----------------------------------------------------------------------------------------------- + ConfigList::add( "tagFileList", + "TAGFILES", + "", + "list of tag files", + "The TAGFILES tag can be used to specify one or more tagfiles. \n", + ConfigList::File + ); + ConfigString::add("genTagFile", + "GENERATE_TAGFILE", + "", + "the tag file to generate", + "When a file name is specified after GENERATE_TAGFILE, doxygen will create \n" + "a tag file that is based on the input files it reads. \n", + ConfigString::File + ); + ConfigBool::add( "allExtFlag", + "ALLEXTERNALS", + "FALSE", + "include all external classes flag", + "If the ALLEXTERNALS tag is set to YES all external classes will be listed \n" + "in the class index. If set to NO only the inherited external classes \n" + "will be listed. \n" + ); + ConfigString::add("perlPath", + "PERL_PATH", + "/usr/bin/perl", + "the absolute path to perl", + "The PERL_PATH should be the absolute path and name of the perl script \n" + "interpreter (i.e. the result of `which perl'). \n", + ConfigString::Dir + ); + //----------------------------------------------------------------------------------------------- + ConfigInfo::add( "Dot","Configuration options related to the dot tool "); + //----------------------------------------------------------------------------------------------- + ConfigBool::add( "haveDotFlag", + "HAVE_DOT", + "FALSE", + "indicates wether or not dot is present", + "If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is \n" + "available from the path. This tool is part of Graphviz, a graph visualization \n" + "toolkit from AT&T and Lucent Bell Labs. The other options in this section \n" + "have no effect if this option is set to NO (the default) \n" + ); + ConfigBool::add( "collGraphFlag", + "COLLABORATION_GRAPH", + "TRUE", + "collaboration graph", + "If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen \n" + "will generate a graph for each documented class showing the direct and \n" + "indirect implementation dependencies (inheritance, containment, and \n" + "class references variables) of the class with other documented classes. \n" + ); + addDependency("collGraphFlag","haveDotFlag"); + ConfigBool::add( "includeGraphFlag", + "INCLUDE_GRAPH", + "TRUE", + "include graph", + "If the ENABLE_PREPROCESSING, INCLUDE_GRAPH, and HAVE_DOT tags are set to \n" + "YES then doxygen will generate a graph for each documented file showing \n" + "the direct and indirect include dependencies of the file with other \n" + "documented files. \n" + ); + addDependency("includeGraphFlag","haveDotFlag"); + ConfigBool::add( "gfxHierarchyFlag", + "GRAPHICAL_HIERARCHY", + "TRUE", + "flag to enable graphical hierarchy", + "If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen \n" + "will graphical hierarchy of all classes instead of a textual one. \n" + ); + addDependency("gfxHierarchyFlag","haveDotFlag"); + + //----------------------------------------------------------------------------------------------- + ConfigInfo::add( "Search","Configuration::addtions related to the search engine "); + //----------------------------------------------------------------------------------------------- + ConfigBool::add( "searchEngineFlag", + "SEARCHENGINE", + "FALSE", + "generate search engine flag", + "The SEARCHENGINE tag specifies whether or not a search engine should be \n" + "used. If set to NO the values of all tags below this one will be ignored. \n" + ); + ConfigString::add("cgiName", + "CGI_NAME", + "search.cgi", + "the name of the CGI binary", + "The CGI_NAME tag should be the name of the CGI script that \n" + "starts the search engine (doxysearch) with the correct parameters. \n" + "A script with this name will be generated by doxygen. \n" + ); + addDependency("cgiName","searchEngineFlag"); + ConfigString::add("cgiURL", + "CGI_URL", + "", + "the absolute URL to the CGI binary", + "The CGI_URL tag should be the absolute URL to the directory where the \n" + "cgi binaries are located. See the documentation of your http daemon for \n" + "details. \n" + ); + addDependency("cgiURL","searchEngineFlag"); + ConfigString::add("docURL", + "DOC_URL", + "", + "the absolute URL to the documentation", + "The DOC_URL tag should be the absolute URL to the directory where the \n" + "documentation is located. If left blank the absolute path to the \n" + "documentation, with file:// prepended to it, will be used. \n" + ); + addDependency("docURL","searchEngineFlag"); + ConfigString::add("docAbsPath", + "DOC_ABSPATH", + "", + "the absolute path to the documentation", + "The DOC_ABSPATH tag should be the absolute path to the directory where the \n" + "documentation is located. If left blank the directory on the local machine \n" + "will be used. \n", + ConfigString::Dir + ); + addDependency("docAbsPath","searchEngineFlag"); + ConfigString::add("binAbsPath", + "BIN_ABSPATH", + "/usr/local/bin/", + "the absolute path to the doxysearch", + "The BIN_ABSPATH tag must point to the directory where the doxysearch binary \n" + "is installed. \n", + ConfigString::Dir + ); + addDependency("binAbsPath","searchEngineFlag"); + ConfigList::add( "extDocPathList", + "EXT_DOC_PATHS", + "", + "list of external doc. directories.", + "The EXT_DOC_PATHS tag can be used to specify one or more paths to \n" + "documentation generated for other projects. This allows doxysearch to search \n" + "the documentation for these projects as well. \n", + ConfigList::Dir + ); + addDependency("extDocPathList","searchEngineFlag"); + + // The IMAGE_PATTERNS tag is now officially obsolete. + //----------------------------------------------------------------------------------------------- + //ConfigInfo::add("not used"); + //----------------------------------------------------------------------------------------------- + //ConfigList::add("imagePatternList", + // "IMAGE_PATTERNS", + // "", + // "list of image paths", + // "donīt know\n"); +} diff --git a/addon/configgen/configgen.pro.in b/addon/configgen/configgen.pro.in new file mode 100644 index 0000000..26b9c51 --- /dev/null +++ b/addon/configgen/configgen.pro.in @@ -0,0 +1,20 @@ +# +# +# +# Copyright (C) 1997-2000 by Dimitri van Heesch. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation under the terms of the GNU General Public License is hereby +# granted. No representations are made about the suitability of this software +# for any purpose. It is provided "as is" without express or implied warranty. +# See the GNU General Public License for more details. +# +# TMake project file for configgen + +TEMPLATE = app.t +CONFIG = console qt warn_on $extraopts +HEADERS = +SOURCES = configgen.cpp +win32:INCLUDEPATH += . +TARGET = bin/configgen +OBJECTS_DIR = obj diff --git a/addon/configgen/qtbc.h b/addon/configgen/qtbc.h new file mode 100644 index 0000000..d03672f --- /dev/null +++ b/addon/configgen/qtbc.h @@ -0,0 +1,43 @@ +/****************************************************************************** + * + * $Id$ + * + * Copyright (C) 1997-2000 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * Documents produced by Doxygen are derivative works derived from the + * input used in their production; they are not affected by this license. + * + */ + +#ifndef QTBC_H +#define QTBC_H + +/*! This file contains some hacks to make Doxygen work with + * Qt version 2.00 and Qt version 1.xx + */ + +#include <qglobal.h> + +#if QT_VERSION >= 200 + +#define GCI QCollection::Item + +#include <qcstring.h> +#include <qstring.h> +inline QCString convertToQCString(const QString &s) { return s.local8Bit(); } + +#else /* QT_VERSION < 200 */ + +#include <qstring.h> +#define QCString QString +inline QCString convertToQCString(const QCString &s) { return s; } + +#endif + +#endif |