/******************************************************************************
*
*
*
* Copyright (C) 1997-2010 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.
*
*/
#include <stdarg.h>
#include <stdio.h>
#include <qdatetime.h>
#include "config.h"
#include "util.h"
#include "debug.h"
#include "doxygen.h"
static QCString outputFormat;
//static int warnFormatOrder; // 1 = $file,$line,$text
// // 2 = $text,$line,$file
// // 3 = $line,$text,$file
// // 4 = $file,$text,$line
// // 5 = $text,$file,$line
// // 6 = $line,$file,$text
static FILE *warnFile = stderr;
void initWarningFormat()
{
// int filePos = Config_getString("WARN_FORMAT").find("$file");
// int linePos = Config_getString("WARN_FORMAT").find("$line");
// int textPos = Config_getString("WARN_FORMAT").find("$text");
//
// // sort items on position (there are 6 cases)
// warnFormatOrder = 1;
// if (filePos>linePos && filePos>textPos)
// {
// if (linePos>textPos) // $text,$line,$file
// {
// warnFormatOrder = 2;
// }
// else // $line,$text,$file
// {
// warnFormatOrder = 3;
// }
// }
// else if (filePos<linePos && filePos<textPos)
// {
// if (linePos>textPos) // $file,$text,$line
// {
// warnFormatOrder = 4;
// }
// }
// else if (filePos<linePos && filePos>textPos) // $text,$file,$line
// {
// warnFormatOrder = 5;
// }
// else // $line,$file,$text
// {
// warnFormatOrder = 6;
// }
// outputFormat =
// substitute(
// substitute(
// substitute(
// Config_getString("WARN_FORMAT"),
// "$file","%s"
// ),
// "$text","%s"
// ),
// "$line","%d"
// )+'\n';
// replace(QRegExp("\\$file"),"%s").
// replace(QRegExp("\\$text"),"%s").
// replace(QRegExp("\\$line"),"%d")+
// '\n';
outputFormat = Config_getString("WARN_FORMAT");
if (!Config_getString("WARN_LOGFILE").isEmpty())
{
warnFile = fopen(Config_getString("WARN_LOGFILE"),"w");
}
if (!warnFile) // point it to something valid, because warn() relies on it
{
warnFile = stderr;
}
}
void msg(const char *fmt, ...)
{
if (!Config_getBool("QUIET"))
{
if (Debug::isFlagSet(Debug::Time))
{
printf("%.3f sec: ",((double)Doxygen::runningTime.elapsed())/1000.0);
}
va_list args;
va_start(args, fmt);
vfprintf(stdout, fmt, args);
va_end(args);
}
}
static void do_warn(const char *tag, const char *file, int line, const char *fmt, va_list args)
{
if (!Config_getBool(tag)) return; // warning type disabled
char text[40960];
vsprintf(text, fmt, args);
QCString fileSubst = file==0 ? "<unknown>" : file;
QCString lineSubst; lineSubst.setNum(line);
QCString textSubst = text;
QCString versionSubst;
if (file) // get version from file name
{
bool ambig;
FileDef *fd=findFileDef(Doxygen::inputNameDict,file,ambig);
if (fd)
{
versionSubst = fd->getVersion();
}
}
// substitute markers by actual values
QCString msgText =
substitute(
substitute(
substitute(
substitute(
substitute(
outputFormat,
"$file",fileSubst
),
"$text",textSubst
),
"$line",lineSubst
),
"$version",versionSubst
),
"%","%%"
)+'\n';
// print resulting message
fprintf(warnFile,"%s",msgText.data());
}
void warn(const char *file,int line,const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
do_warn("WARNINGS", file, line, fmt, args);
va_end(args);
}
void warn_cont(const char *fmt, ...)
{
if (!Config_getBool("WARNINGS"))
return;
va_list args;
va_start(args, fmt);
vfprintf(warnFile, fmt, args);
va_end(args);
}
void warn_undoc(const char *file,int line,const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
do_warn("WARN_IF_UNDOCUMENTED", file, line, fmt, args);
va_end(args);
}
void warn_doc_error(const char *file,int line,const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
do_warn("WARN_IF_DOC_ERROR", file, line, fmt, args);
va_end(args);
}
void err(const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
vfprintf(warnFile, fmt, args);
va_end(args);
}