Blame src/message.cpp

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