|
Packit |
1c1d7e |
/******************************************************************************
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
* Copyright (C) 1997-2015 by Dimitri van Heesch.
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
* Permission to use, copy, modify, and distribute this software and its
|
|
Packit |
1c1d7e |
* documentation under the terms of the GNU General Public License is hereby
|
|
Packit |
1c1d7e |
* granted. No representations are made about the suitability of this software
|
|
Packit |
1c1d7e |
* for any purpose. It is provided "as is" without express or implied warranty.
|
|
Packit |
1c1d7e |
* See the GNU General Public License for more details.
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
* Documents produced by Doxygen are derivative works derived from the
|
|
Packit |
1c1d7e |
* input used in their production; they are not affected by this license.
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#include <stdio.h>
|
|
Packit |
1c1d7e |
#include <qdatetime.h>
|
|
Packit |
1c1d7e |
#include "config.h"
|
|
Packit |
1c1d7e |
#include "util.h"
|
|
Packit |
1c1d7e |
#include "debug.h"
|
|
Packit |
1c1d7e |
#include "doxygen.h"
|
|
Packit |
1c1d7e |
#include "portable.h"
|
|
Packit |
1c1d7e |
#include "filedef.h"
|
|
Packit |
1c1d7e |
#include "message.h"
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static QCString outputFormat;
|
|
Packit |
1c1d7e |
static const char *warning_str = "warning: ";
|
|
Packit |
1c1d7e |
static const char *error_str = "error: ";
|
|
Packit |
1c1d7e |
//static int warnFormatOrder; // 1 = $file,$line,$text
|
|
Packit |
1c1d7e |
// // 2 = $text,$line,$file
|
|
Packit |
1c1d7e |
// // 3 = $line,$text,$file
|
|
Packit |
1c1d7e |
// // 4 = $file,$text,$line
|
|
Packit |
1c1d7e |
// // 5 = $text,$file,$line
|
|
Packit |
1c1d7e |
// // 6 = $line,$file,$text
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static FILE *warnFile = stderr;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void initWarningFormat()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// int filePos = Config_getString(WARN_FORMAT).find("$file");
|
|
Packit |
1c1d7e |
// int linePos = Config_getString(WARN_FORMAT).find("$line");
|
|
Packit |
1c1d7e |
// int textPos = Config_getString(WARN_FORMAT).find("$text");
|
|
Packit |
1c1d7e |
//
|
|
Packit |
1c1d7e |
// // sort items on position (there are 6 cases)
|
|
Packit |
1c1d7e |
// warnFormatOrder = 1;
|
|
Packit |
1c1d7e |
// if (filePos>linePos && filePos>textPos)
|
|
Packit |
1c1d7e |
// {
|
|
Packit |
1c1d7e |
// if (linePos>textPos) // $text,$line,$file
|
|
Packit |
1c1d7e |
// {
|
|
Packit |
1c1d7e |
// warnFormatOrder = 2;
|
|
Packit |
1c1d7e |
// }
|
|
Packit |
1c1d7e |
// else // $line,$text,$file
|
|
Packit |
1c1d7e |
// {
|
|
Packit |
1c1d7e |
// warnFormatOrder = 3;
|
|
Packit |
1c1d7e |
// }
|
|
Packit |
1c1d7e |
// }
|
|
Packit |
1c1d7e |
// else if (filePos
|
|
Packit |
1c1d7e |
// {
|
|
Packit |
1c1d7e |
// if (linePos>textPos) // $file,$text,$line
|
|
Packit |
1c1d7e |
// {
|
|
Packit |
1c1d7e |
// warnFormatOrder = 4;
|
|
Packit |
1c1d7e |
// }
|
|
Packit |
1c1d7e |
// }
|
|
Packit |
1c1d7e |
// else if (filePos<linePos && filePos>textPos) // $text,$file,$line
|
|
Packit |
1c1d7e |
// {
|
|
Packit |
1c1d7e |
// warnFormatOrder = 5;
|
|
Packit |
1c1d7e |
// }
|
|
Packit |
1c1d7e |
// else // $line,$file,$text
|
|
Packit |
1c1d7e |
// {
|
|
Packit |
1c1d7e |
// warnFormatOrder = 6;
|
|
Packit |
1c1d7e |
// }
|
|
Packit |
1c1d7e |
// outputFormat =
|
|
Packit |
1c1d7e |
// substitute(
|
|
Packit |
1c1d7e |
// substitute(
|
|
Packit |
1c1d7e |
// substitute(
|
|
Packit |
1c1d7e |
// Config_getString(WARN_FORMAT),
|
|
Packit |
1c1d7e |
// "$file","%s"
|
|
Packit |
1c1d7e |
// ),
|
|
Packit |
1c1d7e |
// "$text","%s"
|
|
Packit |
1c1d7e |
// ),
|
|
Packit |
1c1d7e |
// "$line","%d"
|
|
Packit |
1c1d7e |
// )+'\n';
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// replace(QRegExp("\\$file"),"%s").
|
|
Packit |
1c1d7e |
// replace(QRegExp("\\$text"),"%s").
|
|
Packit |
1c1d7e |
// replace(QRegExp("\\$line"),"%d")+
|
|
Packit |
1c1d7e |
// '\n';
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
outputFormat = Config_getString(WARN_FORMAT);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (!Config_getString(WARN_LOGFILE).isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
warnFile = portable_fopen(Config_getString(WARN_LOGFILE),"w");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (!warnFile) // point it to something valid, because warn() relies on it
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
warnFile = stderr;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (Config_getBool(WARN_AS_ERROR))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
warning_str = error_str;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void msg(const char *fmt, ...)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (!Config_getBool(QUIET))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (Debug::isFlagSet(Debug::Time))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
printf("%.3f sec: ",((double)Doxygen::runningTime.elapsed())/1000.0);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
va_list args;
|
|
Packit |
1c1d7e |
va_start(args, fmt);
|
|
Packit |
1c1d7e |
vfprintf(stdout, fmt, args);
|
|
Packit |
1c1d7e |
va_end(args);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void format_warn(const char *file,int line,const char *text)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString fileSubst = file==0 ? "<unknown>" : file;
|
|
Packit |
1c1d7e |
QCString lineSubst; lineSubst.setNum(line);
|
|
Packit |
1c1d7e |
QCString textSubst = text;
|
|
Packit |
1c1d7e |
QCString versionSubst;
|
|
Packit |
1c1d7e |
if (file) // get version from file name
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
bool ambig;
|
|
Packit |
1c1d7e |
FileDef *fd=findFileDef(Doxygen::inputNameDict,file,ambig);
|
|
Packit |
1c1d7e |
if (fd)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
versionSubst = fd->getVersion();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
// substitute markers by actual values
|
|
Packit |
1c1d7e |
bool warnAsError = Config_getBool(WARN_AS_ERROR);
|
|
Packit |
1c1d7e |
QCString msgText =
|
|
Packit |
1c1d7e |
substitute(
|
|
Packit |
1c1d7e |
substitute(
|
|
Packit |
1c1d7e |
substitute(
|
|
Packit |
1c1d7e |
substitute(
|
|
Packit |
1c1d7e |
outputFormat,
|
|
Packit |
1c1d7e |
"$file",fileSubst
|
|
Packit |
1c1d7e |
),
|
|
Packit |
1c1d7e |
"$line",lineSubst
|
|
Packit |
1c1d7e |
),
|
|
Packit |
1c1d7e |
"$version",versionSubst
|
|
Packit |
1c1d7e |
),
|
|
Packit |
1c1d7e |
"$text",textSubst
|
|
Packit |
1c1d7e |
);
|
|
Packit |
1c1d7e |
if (warnAsError)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
msgText += " (warning treated as error, aborting now)";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
msgText += '\n';
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// print resulting message
|
|
Packit |
1c1d7e |
fwrite(msgText.data(),1,msgText.length(),warnFile);
|
|
Packit |
1c1d7e |
if (warnAsError)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
exit(1);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void do_warn(bool enabled, const char *file, int line, const char *prefix, const char *fmt, va_list args)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (!enabled) return; // warning type disabled
|
|
Packit |
1c1d7e |
const int bufSize = 40960;
|
|
Packit |
1c1d7e |
char text[bufSize];
|
|
Packit |
1c1d7e |
int l=0;
|
|
Packit |
1c1d7e |
if (prefix)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
qstrncpy(text,prefix,bufSize);
|
|
Packit |
1c1d7e |
l=strlen(prefix);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
vsnprintf(text+l, bufSize-l, fmt, args);
|
|
Packit |
1c1d7e |
text[bufSize-1]='\0';
|
|
Packit |
1c1d7e |
format_warn(file,line,text);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void warn(const char *file,int line,const char *fmt, ...)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
va_list args;
|
|
Packit |
1c1d7e |
va_start(args, fmt);
|
|
Packit |
1c1d7e |
do_warn(Config_getBool(WARNINGS), file, line, warning_str, fmt, args);
|
|
Packit |
1c1d7e |
va_end(args);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void va_warn(const char *file,int line,const char *fmt,va_list args)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
do_warn(Config_getBool(WARNINGS), file, line, warning_str, fmt, args);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void warn_simple(const char *file,int line,const char *text)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (!Config_getBool(WARNINGS)) return; // warning type disabled
|
|
Packit |
1c1d7e |
format_warn(file,line,QCString(warning_str) + text);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void warn_undoc(const char *file,int line,const char *fmt, ...)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
va_list args;
|
|
Packit |
1c1d7e |
va_start(args, fmt);
|
|
Packit |
1c1d7e |
do_warn(Config_getBool(WARN_IF_UNDOCUMENTED), file, line, warning_str, fmt, args);
|
|
Packit |
1c1d7e |
va_end(args);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void warn_doc_error(const char *file,int line,const char *fmt, ...)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
va_list args;
|
|
Packit |
1c1d7e |
va_start(args, fmt);
|
|
Packit |
1c1d7e |
do_warn(Config_getBool(WARN_IF_DOC_ERROR), file, line, warning_str, fmt, args);
|
|
Packit |
1c1d7e |
va_end(args);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void warn_uncond(const char *fmt, ...)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
va_list args;
|
|
Packit |
1c1d7e |
va_start(args, fmt);
|
|
Packit |
1c1d7e |
vfprintf(warnFile, (QCString(warning_str) + fmt).data(), args);
|
|
Packit |
1c1d7e |
va_end(args);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void err(const char *fmt, ...)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
va_list args;
|
|
Packit |
1c1d7e |
va_start(args, fmt);
|
|
Packit |
1c1d7e |
vfprintf(warnFile, (QCString(error_str) + fmt).data(), args);
|
|
Packit |
1c1d7e |
va_end(args);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
extern void err_full(const char *file,int line,const char *fmt, ...)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
va_list args;
|
|
Packit |
1c1d7e |
va_start(args, fmt);
|
|
Packit |
1c1d7e |
do_warn(TRUE, file, line, error_str, fmt, args);
|
|
Packit |
1c1d7e |
va_end(args);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void printlex(int dbg, bool enter, const char *lexName, const char *fileName)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
const char *enter_txt = "entering";
|
|
Packit |
1c1d7e |
const char *enter_txt_uc = "Entering";
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (!enter)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
enter_txt = "finished";
|
|
Packit |
1c1d7e |
enter_txt_uc = "Finished";
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (dbg)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (fileName)
|
|
Packit |
1c1d7e |
fprintf(stderr,"--%s lexical analyzer: %s (for: %s)\n",enter_txt, qPrint(lexName), qPrint(fileName));
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
fprintf(stderr,"--%s lexical analyzer: %s\n",enter_txt, qPrint(lexName));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (fileName)
|
|
Packit |
1c1d7e |
Debug::print(Debug::Lex,0,"%s lexical analyzer: %s (for: %s)\n",enter_txt_uc, qPrint(lexName), qPrint(fileName));
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
Debug::print(Debug::Lex,0,"%s lexical analyzer: %s\n",enter_txt_uc, qPrint(lexName));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|