diff options
author | Dimitri van Heesch <dimitri@stack.nl> | 2015-06-20 21:51:05 (GMT) |
---|---|---|
committer | Dimitri van Heesch <dimitri@stack.nl> | 2015-06-20 21:51:05 (GMT) |
commit | f63d9ed958d2c06717434e1a90e6417cf2d60f6b (patch) | |
tree | 0bd2fb98598d2c87971eb041429b58bf9afee831 /addon | |
parent | dfe93f9fde39167eae2aeeab929641a9c56cc916 (diff) | |
download | Doxygen-f63d9ed958d2c06717434e1a90e6417cf2d60f6b.zip Doxygen-f63d9ed958d2c06717434e1a90e6417cf2d60f6b.tar.gz Doxygen-f63d9ed958d2c06717434e1a90e6417cf2d60f6b.tar.bz2 |
Various minor changes
- made copying doc and example files a target
- fixed bug using temparary in the wizard.
- Added faq question about extension mapping
Diffstat (limited to 'addon')
-rw-r--r-- | addon/doxywizard/config.l | 555 | ||||
-rw-r--r-- | addon/doxywizard/config_doxyw.l | 10 |
2 files changed, 7 insertions, 558 deletions
diff --git a/addon/doxywizard/config.l b/addon/doxywizard/config.l deleted file mode 100644 index 177e8d4..0000000 --- a/addon/doxywizard/config.l +++ /dev/null @@ -1,555 +0,0 @@ -/****************************************************************************** - * - * $Id: config_templ.l,v 1.8 2001/01/01 10:15:16 root Exp $ - * - * Copyright (C) 1997-2015 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 "config.h" -#include "input.h" -#include <QtCore> - -#define MAX_INCLUDE_DEPTH 10 - - -/* ----------------------------------------------------------------- - * - * static variables - */ - -struct ConfigFileState -{ - int lineNr; - FILE *file; - YY_BUFFER_STATE oldState; - YY_BUFFER_STATE newState; - QString fileName; -}; - -static const QHash<QString,Input*> *g_options; -static FILE *g_file; -static QString g_yyFileName; -static QString g_includeName; -static QVariant g_includePathList; -static QStack<ConfigFileState*> g_includeStack; -static int g_includeDepth; -static QVariant *g_arg; -static Input *g_curOption=0; -static QString g_elemStr; -static QTextCodec *g_codec = QTextCodec::codecForName("UTF-8"); -static QString g_codecName = QString::fromAscii("UTF-8"); -static int g_lastState; -static QByteArray g_tmpString; - -/* ----------------------------------------------------------------- - */ -#undef YY_INPUT -#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size); - -static int yyread(char *buf,int maxSize) -{ - // no file included - if (g_includeStack.isEmpty()) - { - return fread(buf,1,maxSize,g_file); - } - else - { - return fread(buf,1,maxSize,g_includeStack.top()->file); - } -} - -void config_err(const char *fmt, ...) -{ - va_list args; - va_start(args, fmt); - vfprintf(stderr, fmt, args); - va_end(args); -} -void config_warn(const char *fmt, ...) -{ - va_list args; - va_start(args, fmt); - vfprintf(stderr, fmt, args); - va_end(args); -} - -static void substEnvVarsInStrList(QStringList &sl); -static void substEnvVarsInString(QString &s); - -static void checkEncoding() -{ - Input *option = g_options->value(QString::fromAscii("DOXYFILE_ENCODING")); - if (option && option->value().toString()!=g_codecName) - { - QTextCodec *newCodec = QTextCodec::codecForName(option->value().toString().toAscii()); - if (newCodec) - { - g_codec = newCodec; - g_codecName = option->value().toString(); - } - } -} - -static FILE *tryPath(const QString &path,const QString &fileName) -{ - QString absName=!path.isEmpty() ? path+QString::fromAscii("/")+fileName : fileName; - QFileInfo fi(absName); - if (fi.exists() && fi.isFile()) - { - FILE *f = fopen(absName.toLocal8Bit(),"r"); - if (f==NULL) - config_err("Error: could not open file %s for reading\n",absName.toLatin1().data()); - else - return f; - } - return NULL; -} - -static FILE *findFile(const QString &fileName) -{ - if (QFileInfo(fileName).isAbsolute()) // absolute path - { - return tryPath(QString(), fileName); - } - - // relative path, try with include paths in the list - QStringList sl = g_includePathList.toStringList(); - substEnvVarsInStrList(sl); - foreach (QString s, sl) - { - FILE *f = tryPath(s,fileName); - if (f) return f; - } - // try cwd if g_includePathList fails - return tryPath(QString::fromAscii("."),fileName); -} - -static void readIncludeFile(const QString &incName) -{ - if (g_includeDepth==MAX_INCLUDE_DEPTH) - { - config_err("Error: maximum include depth (%d) reached, %s is not included. Aborting...\n", - MAX_INCLUDE_DEPTH,qPrintable(incName)); - exit(1); - } - - QString inc = incName; - substEnvVarsInString(inc); - inc = inc.trimmed(); - uint incLen = inc.length(); - if (inc.at(0)==QChar::fromAscii('"') && - inc.at(incLen-1)==QChar::fromAscii('"')) // strip quotes - { - inc=inc.mid(1,incLen-2); - } - - FILE *f = findFile(inc); - if (f) // see if the include file can be found - { - // For debugging -#if SHOW_INCLUDES - for (i=0;i<includeStack.count();i++) msg(" "); - msg("@INCLUDE = %s: parsing...\n",inc.toLatin1().data()); -#endif - - // store the state of the old file - ConfigFileState *fs=new ConfigFileState; - fs->oldState=YY_CURRENT_BUFFER; - fs->fileName=g_yyFileName; - fs->file=f; - // push the state on the stack - g_includeStack.push(fs); - // set the scanner to the include file - yy_switch_to_buffer(yy_create_buffer(f, YY_BUF_SIZE)); - fs->newState=YY_CURRENT_BUFFER; - g_yyFileName=inc; - g_includeDepth++; - } - else - { - config_err("Error: @INCLUDE = %s: not found!\n",inc.toLatin1().data()); - exit(1); - } -} - - -%} - -%option nounput -%option noyywrap -%option yylineno - -%x Start -%x SkipComment -%x SkipInvalid -%x GetString -%x GetStrList -%x GetQuotedString -%x GetEnvVar -%x Include - -%% - -<*>\0x0d -<Start,GetString,GetStrList,SkipInvalid>"#" { BEGIN(SkipComment); } -<Start>[a-z_A-Z][a-z_A-Z0-9]*[ \t]*"=" { QString cmd = g_codec->toUnicode(yytext); - cmd=cmd.left(cmd.length()-1).trimmed(); - g_curOption = g_options->value(cmd); - if (g_curOption==0) // oops not known - { - config_err("Warning: ignoring unsupported tag `%s' at line %d, file %s\n", - qPrintable(cmd),yylineno,qPrintable(g_yyFileName)); - BEGIN(SkipInvalid); - } - else // known tag - { - //option->setEncoding(encoding); - g_arg = &g_curOption->value(); - switch(g_curOption->kind()) - { - case Input::StrList: - g_elemStr = QString(); - *g_arg = QStringList(); - BEGIN(GetStrList); - break; - case Input::String: - BEGIN(GetString); - break; - case Input::Int: - BEGIN(GetString); - break; - case Input::Bool: - BEGIN(GetString); - break; - case Input::Obsolete: - config_err("Warning: Tag `%s' at line %d of file %s has become obsolete.\n" - "To avoid this warning please update your configuration " - "file using \"doxygen -u\"\n", qPrintable(cmd), - yylineno,qPrintable(g_yyFileName)); - BEGIN(SkipInvalid); - break; - } - } - } -<Start>[a-z_A-Z][a-z_A-Z0-9]*[ \t]*"+=" { QString cmd=g_codec->toUnicode(yytext); - cmd=cmd.left(cmd.length()-2).trimmed(); - g_curOption = g_options->value(cmd); - if (g_curOption==0) // oops not known - { - config_err("Warning: ignoring unsupported tag `%s' at line %d, file %s\n", - yytext,yylineno,qPrintable(g_yyFileName)); - BEGIN(SkipInvalid); - } - else // known tag - { - switch(g_curOption->kind()) - { - case Input::StrList: - g_arg = &g_curOption->value(); - g_elemStr=QString(); - BEGIN(GetStrList); - break; - case Input::String: - case Input::Int: - case Input::Bool: - config_err("Warning: operator += not supported for `%s'. Ignoring line at line %d, file %s\n", - yytext,yylineno,qPrintable(g_yyFileName)); - BEGIN(SkipInvalid); - break; - case Input::Obsolete: - config_err("Warning: Tag `%s' at line %d of file %s has become obsolete.\n" - "To avoid this warning please update your configuration " - "file using \"doxygen -u\"\n", - qPrintable(cmd),yylineno,qPrintable(g_yyFileName)); - BEGIN(SkipInvalid); - break; - } - } - } -<Start>"@INCLUDE_PATH"[ \t]*"=" { BEGIN(GetStrList); g_arg=&g_includePathList; *g_arg = QStringList(); g_elemStr=QString(); } - /* include a config file */ -<Start>"@INCLUDE"[ \t]*"=" { BEGIN(Include);} -<Include>([^ \"\t\r\n]+)|("\""[^\n\"]+"\"") { - readIncludeFile(g_codec->toUnicode(yytext)); - BEGIN(Start); - } -<<EOF>> { - //printf("End of include file\n"); - //printf("Include stack depth=%d\n",g_includeStack.count()); - if (g_includeStack.isEmpty()) - { - //printf("Terminating scanner!\n"); - yyterminate(); - } - else - { - ConfigFileState *fs = g_includeStack.pop(); - fclose(fs->file); - YY_BUFFER_STATE oldBuf = YY_CURRENT_BUFFER; - yy_switch_to_buffer( fs->oldState ); - yy_delete_buffer( oldBuf ); - g_yyFileName=fs->fileName; - delete fs; - g_includeDepth--; - } - } - -<Start>[a-z_A-Z0-9]+ { config_err("Warning: ignoring unknown tag `%s' at line %d, file %s\n",yytext,yylineno,qPrintable(g_yyFileName)); } -<GetString,SkipInvalid>\n { BEGIN(Start); } -<GetStrList>\n { - if (!g_elemStr.isEmpty()) - { - //printf("elemStr1=`%s'\n",elemStr.toLatin1().data()); - *g_arg = QVariant(g_arg->toStringList() << g_elemStr); - } - BEGIN(Start); - } -<GetStrList>[ \t]+ { - if (!g_elemStr.isEmpty()) - { - //printf("elemStr2=`%s'\n",elemStr.toLatin1().data()); - *g_arg = QVariant(g_arg->toStringList() << g_elemStr); - } - g_elemStr = QString(); - } -<GetString>[^ \"\t\r\n]+ { - *g_arg = QVariant(g_codec->toUnicode(yytext)); - checkEncoding(); - } -<GetString,GetStrList,SkipInvalid>"\"" { g_lastState=YY_START; - BEGIN(GetQuotedString); - g_tmpString=""; - } -<GetQuotedString>"\""|"\n" { - // we add a bogus space to signal that the string was quoted. This space will be stripped later on. - g_tmpString+=" "; - //printf("Quoted String = `%s'\n",tmpString.toLatin1().data()); - if (g_lastState==GetString) - { - *g_arg = g_codec->toUnicode(g_tmpString); - checkEncoding(); - } - else - { - g_elemStr+=g_codec->toUnicode(g_tmpString); - } - if (*yytext=='\n') - { - config_err("Warning: Missing end quote (\") on line %d, file %s\n",yylineno, - qPrintable(g_yyFileName)); - } - BEGIN(g_lastState); - } -<GetQuotedString>"\\\"" { - g_tmpString+='"'; - } -<GetQuotedString>. { g_tmpString+=*yytext; } -<GetStrList>[^ \#\"\t\r\n]+ { - g_elemStr+=g_codec->toUnicode(yytext); - } -<SkipComment>\n { BEGIN(Start); } -<SkipComment>\\[ \r\t]*\n { BEGIN(Start); } -<*>\\[ \r\t]*\n { } -<*>\n -<*>. - -%% - -/*@ ---------------------------------------------------------------------------- - */ - -static void substEnvVarsInString(QString &s) -{ - static QRegExp re(QString::fromAscii("\\$\\([a-z_A-Z0-9]+\\)")); - if (s.isEmpty()) return; - int p=0; - int i,l; - //printf("substEnvVarInString(%s) start\n",s.toLatin1().data()); - while ((i=re.indexIn(s,p))!=-1) - { - l = re.matchedLength(); - //printf("Found environment var s.mid(%d,%d)=`%s'\n",i+2,l-3,s.mid(i+2,l-3).toLatin1().data()); - QString env=g_codec->toUnicode(getenv(s.mid(i+2,l-3).toLatin1())); - substEnvVarsInString(env); // recursively expand variables if needed. - s = s.left(i)+env+s.right(s.length()-i-l); - p=i+env.length(); // next time start at the end of the expanded string - } - s=s.trimmed(); // to strip the bogus space that was added when an argument - // has quotes - //printf("substEnvVarInString(%s) end\n",s.toLatin1().data()); -} - -static void substEnvVarsInStrList(QStringList &sl) -{ - QStringList out; - - foreach (QString result, sl) - { - // an argument with quotes will have an extra space at the end, so wasQuoted will be TRUE. - bool wasQuoted = (result.indexOf(QChar::fromAscii(' '))!=-1) || - (result.indexOf(QChar::fromAscii('\t'))!=-1); - // here we strip the quote again - substEnvVarsInString(result); - - //printf("Result %s was quoted=%d\n",result.toLatin1().data(),wasQuoted); - - if (!wasQuoted) /* as a result of the expansion, a single string - may have expanded into a list, which we'll - add to sl. If the original string already - contained multiple elements no further - splitting is done to allow quoted items with spaces! */ - { - int l=result.length(); - int i,p=0; - // skip spaces - // search for a "word" - for (i=0;i<l;i++) - { - QChar c=0; - // skip until start of new word - while (i<l && ((c=result.at(i))==QChar::fromAscii(' ') || c==QChar::fromAscii('\t'))) i++; - p=i; // p marks the start index of the word - // skip until end of a word - while (i<l && ((c=result.at(i))!=QChar::fromAscii(' ') && - c!=QChar::fromAscii('\t') && - c!=QChar::fromAscii('"'))) i++; - if (i<l) // not at the end of the string - { - if (c==QChar::fromAscii('"')) // word within quotes - { - p=i+1; - for (i++;i<l;i++) - { - c=result.at(i); - if (c==QChar::fromAscii('"')) // end quote - { - out += result.mid(p,i-p); - p=i+1; - break; - } - else if (c==QChar::fromAscii('\\')) // skip escaped stuff - { - i++; - } - } - } - else if (c==QChar::fromAscii(' ') || c==QChar::fromAscii('\t')) // separator - { - out += result.mid(p,i-p); - p=i+1; - } - } - } - if (p!=l) // add the leftover as a string - { - out += result.right(l-p); - } - } - else // just goto the next element in the list - { - out += result; - } - } - sl = out; -} - -//-------------------------------------------------------------------------- - -bool parseConfig( - const QString &fileName, - const QHash<QString,Input *> &options - ) -{ - QHashIterator<QString, Input*> i(options); - g_file = fopen(fileName.toLocal8Bit(),"r"); - if (g_file==NULL) return false; - - // reset all values - i.toFront(); - while (i.hasNext()) - { - i.next(); - if (i.value()) - { - i.value()->reset(); - } - } - - // parse config file - g_options = &options; - g_yyFileName = fileName; - g_includeStack.clear(); - g_includeDepth = 0; - configrestart( configin ); - BEGIN( Start ); - configlex(); - - // update the values in the UI - i.toFront(); - while (i.hasNext()) - { - i.next(); - if (i.value()) - { - //printf("Updating: %s\n",qPrintable(i.key())); - i.value()->update(); - } - else - { - printf("Invalid option: %s\n",qPrintable(i.key())); - } - } - fclose(g_file); - return true; -} - -void writeStringValue(QTextStream &t,QTextCodec *codec,const QString &s) -{ - QChar c; - bool needsEscaping=FALSE; - // convert the string back to it original encoding - //QByteArray se = codec->fromUnicode(s); - t.setCodec(codec); - const QChar *p=s.data(); - if (!s.isEmpty() && !p->isNull()) - { - while (!(c=*p++).isNull() && !needsEscaping) - { - needsEscaping = (c==QChar::fromAscii(' ') || - c==QChar::fromAscii('\n') || - c==QChar::fromAscii('\t') || - c==QChar::fromAscii('"')); - } - if (needsEscaping) - { - t << "\""; - p=s.data(); - while (!p->isNull()) - { - if (*p ==QChar::fromAscii(' ') && - *(p+1)==QChar::fromAscii('\0')) break; // skip inserted space at the end - if (*p ==QChar::fromAscii('"')) t << "\\"; // escape quotes - t << *p++; - } - t << "\""; - } - else - { - t << s; - } - } -} - diff --git a/addon/doxywizard/config_doxyw.l b/addon/doxywizard/config_doxyw.l index 3e1c59f..829f807 100644 --- a/addon/doxywizard/config_doxyw.l +++ b/addon/doxywizard/config_doxyw.l @@ -79,16 +79,20 @@ static QString error_str = QString::fromAscii("error: "); void config_err(const char *fmt, ...) { + QString msg = error_str; + msg.append(QString::fromAscii(fmt)); va_list args; va_start(args, fmt); - vfprintf(stderr, qPrintable(error_str.append(QString::fromAscii(fmt))), args); - va_end(args); + vfprintf(stderr, qPrintable(msg), args); + va_end(args); } void config_warn(const char *fmt, ...) { + QString msg = warning_str; + msg.append(QString::fromAscii(fmt)); va_list args; va_start(args, fmt); - vfprintf(stderr, qPrintable(warning_str.append(QString::fromAscii(fmt))), args); + vfprintf(stderr, qPrintable(msg), args); va_end(args); } |