Doxygen
Loading...
Searching...
No Matches
message.cpp File Reference
#include <cstdio>
#include <cstdlib>
#include <mutex>
#include <atomic>
#include <unordered_set>
#include "config.h"
#include "debug.h"
#include "portable.h"
#include "message.h"
#include "doxygen.h"
#include "fileinfo.h"
#include "dir.h"
#include "md5hash.h"
Include dependency graph for message.cpp:

Go to the source code of this file.

Functions

static bool checkWarnMessage (std::string_view msg)
static void format_warn (const DString &file, int line, const DString &text)
static void handle_warn_as_error ()
static void do_warn (const DString &file, int line, const char *prefix, fmt::string_view fmt, fmt::format_args args)
void msg_ (fmt::string_view fmt, fmt::format_args args)
void warn_ (WarningType type, const DString &file, int line, fmt::string_view fmt, fmt::format_args args)
void warn_uncond_ (fmt::string_view fmt, fmt::format_args args)
void err_ (fmt::string_view fmt, fmt::format_args args)
void err_full_ (const DString &file, int line, fmt::string_view fmt, fmt::format_args args)
void term_ (fmt::string_view fmt, fmt::format_args args)
DString warn_line (const DString &file, int line)
void warn_flush ()
void initWarningFormat ()
void finishWarnExit ()

Variables

static DString g_warnFormat
static DString g_warnLineFormat
static const char * g_warningStr = "warning: "
static const char * g_errorStr = "error: "
static FILE * g_warnFile = stderr
static WARN_AS_ERROR_t g_warnBehavior = WARN_AS_ERROR_t::NO
static DString g_warnlogFile
static bool g_warnlogTemp = false
static std::atomic_bool g_warnStat = false
static std::mutex g_mutex
static std::unordered_set< std::string > g_warnHash

Function Documentation

◆ checkWarnMessage()

bool checkWarnMessage ( std::string_view msg)
static

Definition at line 46 of file message.cpp.

47{
48 return g_warnHash.insert(md5str(msg).str()).second;
49}
DString md5str(const std::string_view &str)
Definition md5hash.h:33
static std::unordered_set< std::string > g_warnHash
Definition message.cpp:42
#define msg(fmt,...)
Definition message.h:94

References g_warnHash, md5str(), and msg.

Referenced by err_(), format_warn(), term_(), and warn_uncond_().

◆ do_warn()

void do_warn ( const DString & file,
int line,
const char * prefix,
fmt::string_view fmt,
fmt::format_args args )
static

Definition at line 116 of file message.cpp.

117{
118 format_warn(file,line,prefix+fmt::vformat(fmt,args));
120}
constexpr auto prefix
Definition anchor.cpp:44
static void format_warn(const DString &file, int line, const DString &text)
Definition message.cpp:51
static void handle_warn_as_error()
Definition message.cpp:95
Definition message.h:144

References format_warn(), handle_warn_as_error(), and prefix.

Referenced by warn_().

◆ err_()

void err_ ( fmt::string_view fmt,
fmt::format_args args )

Definition at line 169 of file message.cpp.

170{
171 {
172 std::unique_lock<std::mutex> lock(g_mutex);
173 if (checkWarnMessage(g_errorStr+fmt::vformat(fmt,args))) fmt::print(g_warnFile,"{}{}",g_errorStr,fmt::vformat(fmt,args));
174 }
176}
static const char * g_errorStr
Definition message.cpp:35
static bool checkWarnMessage(std::string_view msg)
Definition message.cpp:46
static std::mutex g_mutex
Definition message.cpp:41
static FILE * g_warnFile
Definition message.cpp:36

References checkWarnMessage(), g_errorStr, g_mutex, g_warnFile, and handle_warn_as_error().

Referenced by err_fmt().

◆ err_full_()

void err_full_ ( const DString & file,
int line,
fmt::string_view fmt,
fmt::format_args args )

Definition at line 180 of file message.cpp.

181{
182 format_warn(file,line,g_errorStr+fmt::vformat(fmt,args));
183}

References format_warn(), and g_errorStr.

Referenced by err_full_fmt().

◆ finishWarnExit()

void finishWarnExit ( )

Definition at line 289 of file message.cpp.

290{
291 fflush(stdout);
292 if (g_warnBehavior == WARN_AS_ERROR_t::FAIL_ON_WARNINGS_PRINT && g_warnlogFile != "-")
293 {
295 g_warnFile = nullptr;
296 }
297 if (g_warnStat && g_warnBehavior == WARN_AS_ERROR_t::FAIL_ON_WARNINGS_PRINT && g_warnlogFile != "-")
298 {
299
300 std::ifstream warnFile = Portable::openInputStream(g_warnlogFile);
301 if (!warnFile.is_open())
302 {
303 g_warnFile = stderr;
304 err("Cannot open warnings file '{}' for reading\n",g_warnlogFile);
305 }
306 else
307 {
308 std::string line;
309 while (getline(warnFile,line))
310 {
311 fmt::print(stderr,"{}\n",line);
312 }
313 warnFile.close();
314 }
315 }
316
318
319 if (g_warnStat && (g_warnBehavior == WARN_AS_ERROR_t::FAIL_ON_WARNINGS ||
320 g_warnBehavior == WARN_AS_ERROR_t::FAIL_ON_WARNINGS_PRINT))
321 {
322 exit(1);
323 }
324}
static bool g_warnlogTemp
Definition message.cpp:39
static std::atomic_bool g_warnStat
Definition message.cpp:40
static WARN_AS_ERROR_t g_warnBehavior
Definition message.cpp:37
static DString g_warnlogFile
Definition message.cpp:38
#define err(fmt,...)
Definition message.h:127
std::ifstream openInputStream(const DString &name, bool binary=false, bool openAtEnd=false)
Definition portable.cpp:676
void unlink(const DString &fileName)
Definition portable.cpp:544
int fclose(FILE *f)
Definition portable.cpp:369

References err, Portable::fclose(), g_warnBehavior, g_warnFile, g_warnlogFile, g_warnlogTemp, g_warnStat, Portable::openInputStream(), and Portable::unlink().

Referenced by generateOutput().

◆ format_warn()

void format_warn ( const DString & file,
int line,
const DString & text )
static

Definition at line 51 of file message.cpp.

52{
53 DString fileSubst = file.empty() ? "<unknown>" : file;
54 DString lineSubst; lineSubst.setNum(line);
55 DString versionSubst;
56 // substitute markers by actual values
57 DString msgText =
63 "$file",fileSubst
64 ),
65 "$line",lineSubst
66 ),
67 "$version",versionSubst
68 ),
69 "$text",text
70 );
71 if (g_warnBehavior == WARN_AS_ERROR_t::YES)
72 {
73 msgText += " (warning treated as error, aborting now)";
74 }
75 msgText += '\n';
76
77 {
78 std::unique_lock<std::mutex> lock(g_mutex);
79 // print resulting message
80 if (checkWarnMessage(msgText.view())) fwrite(msgText.data(),1,msgText.length(),g_warnFile);
81 }
82 if (g_warnBehavior == WARN_AS_ERROR_t::YES)
83 {
84 if (g_warnFile != stderr && !Config_getBool(QUIET))
85 {
86 msg("See '{}' for the reason of termination.\n",g_warnlogFile);
87 }
88 exit(1);
89 }
90 g_warnStat = true;
91}
A String class for use with Doxygen wrapping std::string and adding some additional functionality off...
Definition dstring.h:88
DString & setNum(short n)
Definition dstring.h:556
bool empty() const
Returns true iff the string is empty (std::string compatible alias for isEmpty()).
Definition dstring.h:152
std::string_view view() const
Definition dstring.h:166
const char * data() const
Returns a pointer to the contents of the string in the form of a 0-terminated C string.
Definition dstring.h:161
size_t length() const
Returns the length of the string, not counting the 0-terminator.
Definition dstring.h:155
#define Config_getBool(name)
Definition config.h:33
DString substitute(const DString &s, const DString &src, const DString &dst)
substitute all occurrences of src in s by dst
Definition dstring.cpp:481
static DString g_warnFormat
Definition message.cpp:32

References checkWarnMessage(), Config_getBool, DString::data(), DString::empty(), g_mutex, g_warnBehavior, g_warnFile, g_warnFormat, g_warnlogFile, g_warnStat, DString::length(), msg, DString::setNum(), substitute(), and DString::view().

Referenced by do_warn(), and err_full_().

◆ handle_warn_as_error()

void handle_warn_as_error ( )
static

Definition at line 95 of file message.cpp.

96{
97 if (g_warnBehavior == WARN_AS_ERROR_t::YES)
98 {
99 {
100 std::unique_lock<std::mutex> lock(g_mutex);
101 DString msgText = " (warning treated as error, aborting now)\n";
102 fwrite(msgText.data(),1,msgText.length(),g_warnFile);
103 if (g_warnFile != stderr && !Config_getBool(QUIET))
104 {
105 // cannot use `msg` due to the mutex
106 fprintf(stdout,"See '%s' for the reason of termination.\n",qPrint(g_warnlogFile));
107 }
108 }
109 exit(1);
110 }
111 g_warnStat = true;
112}
const char * qPrint(const char *s)
Definition dstring.h:787

References Config_getBool, DString::data(), g_mutex, g_warnBehavior, g_warnFile, g_warnlogFile, g_warnStat, DString::length(), and qPrint().

Referenced by do_warn(), err_(), and warn_uncond_().

◆ initWarningFormat()

void initWarningFormat ( )

Definition at line 231 of file message.cpp.

232{
233 g_warnFormat = Config_getString(WARN_FORMAT);
234 g_warnLineFormat = Config_getString(WARN_LINE_FORMAT);
235 g_warnBehavior = Config_getEnum(WARN_AS_ERROR);
236 g_warnlogFile = Config_getString(WARN_LOGFILE);
237 if (g_warnlogFile.empty() && g_warnBehavior == WARN_AS_ERROR_t::FAIL_ON_WARNINGS_PRINT)
238 {
239 uint32_t pid = Portable::pid();
240 g_warnlogFile.sprintf("doxygen_warnings_temp_%d.tmp",pid);
241 g_warnlogTemp = true;
242 }
243
244 if (!g_warnlogFile.empty())
245 {
246 if (g_warnlogFile == "-")
247 {
248 g_warnFile = stdout;
249 }
250 else
251 {
253 Dir d(fi.dirPath());
254 if (!d.exists() && !d.mkdir(fi.dirPath()))
255 {
256 // point it to something valid, because warn() relies on it
257 g_warnFile = stderr;
258 err("Cannot create directory for '{}', redirecting 'WARN_LOGFILE' output to 'stderr'\n",g_warnlogFile);
259 }
260 else if (!(g_warnFile = Portable::fopen(g_warnlogFile,"w")))
261 {
262 // point it to something valid, because warn() relies on it
263 g_warnFile = stderr;
264 err("Cannot open '{}' for writing, redirecting 'WARN_LOGFILE' output to 'stderr'\n",g_warnlogFile);
265 }
266 }
267 }
268 else
269 {
270 g_warnFile = stderr;
271 }
272 if (g_warnBehavior != WARN_AS_ERROR_t::NO)
273 {
275 }
276
277 // make sure the g_warnFile is closed in case we call exit and it is still open
278 std::atexit([](){
279 if (g_warnFile && g_warnFile!=stderr && g_warnFile!=stdout)
280 {
282 g_warnFile = nullptr;
283 }
284 });
285}
DString & sprintf(const char *format,...)
Definition dstring.cpp:30
const std::string & str() const
Definition dstring.h:649
Class representing a directory in the file system.
Definition dir.h:73
Minimal replacement for QFileInfo.
Definition fileinfo.h:26
#define Config_getString(name)
Definition config.h:32
#define Config_getEnum(name)
Definition config.h:35
static DString g_warnLineFormat
Definition message.cpp:33
static const char * g_warningStr
Definition message.cpp:34
uint32_t pid()
Definition portable.cpp:248
FILE * fopen(const DString &fileName, const DString &mode)
Definition portable.cpp:349

References Config_getEnum, Config_getString, FileInfo::dirPath(), DString::empty(), err, Dir::exists(), Portable::fclose(), Portable::fopen(), g_errorStr, g_warnBehavior, g_warnFile, g_warnFormat, g_warningStr, g_warnLineFormat, g_warnlogFile, g_warnlogTemp, Dir::mkdir(), Portable::pid(), DString::sprintf(), and DString::str().

Referenced by checkConfiguration().

◆ msg_()

void msg_ ( fmt::string_view fmt,
fmt::format_args args )

Definition at line 124 of file message.cpp.

125{
126 if (!Config_getBool(QUIET))
127 {
128 std::unique_lock<std::mutex> lock(g_mutex);
130 {
131 fmt::print("{:.3f} sec: ",(static_cast<double>(Debug::elapsedTime())));
132 }
133 fmt::print("{}",fmt::vformat(fmt,args));
134 }
135}
@ Time
Definition debug.h:36
static bool isFlagSet(const DebugMask mask)
Definition debug.cpp:133
static double elapsedTime()
Definition debug.cpp:201

References Config_getBool, Debug::elapsedTime(), g_mutex, Debug::isFlagSet(), and Debug::Time.

Referenced by msg_fmt().

◆ term_()

void term_ ( fmt::string_view fmt,
fmt::format_args args )

Definition at line 187 of file message.cpp.

188{
189 {
190 std::unique_lock<std::mutex> lock(g_mutex);
191 if (checkWarnMessage(g_errorStr+fmt::vformat(fmt,args))) fmt::print(g_warnFile, "{}{}", g_errorStr, fmt::vformat(fmt,args));
192 if (g_warnFile != stderr)
193 {
194 size_t l = strlen(g_errorStr);
195 for (size_t i=0; i<l; i++) fmt::print(g_warnFile, " ");
196 fmt::print(g_warnFile, "{}\n", "Exiting...");
197 if (!Config_getBool(QUIET))
198 {
199 // cannot use `msg` due to the mutex
200 fmt::print("See '{}' for the reason of termination.\n",g_warnlogFile);
201 }
202 }
203 }
204 exit(1);
205}

References checkWarnMessage(), Config_getBool, g_errorStr, g_mutex, g_warnFile, and g_warnlogFile.

Referenced by term_fmt().

◆ warn_()

void warn_ ( WarningType type,
const DString & file,
int line,
fmt::string_view fmt,
fmt::format_args args )

Definition at line 139 of file message.cpp.

140{
141 bool enabled = false;
142 switch (type)
143 {
144 case WarningType::Generic: enabled = Config_getBool(WARNINGS); break;
145 case WarningType::Undocumented: enabled = Config_getBool(WARN_IF_UNDOCUMENTED); break;
146 case WarningType::IncompleteDoc: enabled = Config_getBool(WARN_IF_INCOMPLETE_DOC); break;
147 case WarningType::DocError: enabled = Config_getBool(WARN_IF_DOC_ERROR); break;
148 case WarningType::Layout: enabled = Config_getBool(WARN_LAYOUT_FILE); break;
149 }
150 if (enabled)
151 {
152 do_warn(file, line, g_warningStr, fmt, args);
153 }
154}
static void do_warn(const DString &file, int line, const char *prefix, fmt::string_view fmt, fmt::format_args args)
Definition message.cpp:116
@ IncompleteDoc
Definition message.h:29
@ Undocumented
Definition message.h:28

References Config_getBool, do_warn(), DocError, g_warningStr, Generic, IncompleteDoc, Layout, and Undocumented.

Referenced by warn_fmt().

◆ warn_flush()

void warn_flush ( )

Definition at line 224 of file message.cpp.

225{
226 fflush(g_warnFile);
227}

References g_warnFile.

Referenced by Statistics::end().

◆ warn_line()

DString warn_line ( const DString & file,
int line )

Definition at line 209 of file message.cpp.

210{
211 DString fileSubst = file.empty() ? "<unknown>" : file;
212 DString lineSubst; lineSubst.setNum(line);
213 return substitute(
216 "$file",fileSubst
217 ),
218 "$line",lineSubst
219 );
220}

References DString::empty(), g_warnLineFormat, DString::setNum(), and substitute().

Referenced by addMemberFunction(), checkPageRelations(), computePageRelations(), and findGlobalMember().

◆ warn_uncond_()

void warn_uncond_ ( fmt::string_view fmt,
fmt::format_args args )

Definition at line 158 of file message.cpp.

159{
160 {
161 std::unique_lock<std::mutex> lock(g_mutex);
162 if (checkWarnMessage(g_errorStr+fmt::vformat(fmt,args))) fmt::print(g_warnFile,"{}{}",g_warningStr,vformat(fmt,args));
163 }
165}

References checkWarnMessage(), g_errorStr, g_mutex, g_warnFile, g_warningStr, and handle_warn_as_error().

Referenced by warn_uncond_fmt().

Variable Documentation

◆ g_errorStr

const char* g_errorStr = "error: "
static

Definition at line 35 of file message.cpp.

Referenced by err_(), err_full_(), initWarningFormat(), term_(), and warn_uncond_().

◆ g_mutex

std::mutex g_mutex
static

Definition at line 41 of file message.cpp.

Referenced by err_(), format_warn(), handle_warn_as_error(), msg_(), term_(), and warn_uncond_().

◆ g_warnBehavior

WARN_AS_ERROR_t g_warnBehavior = WARN_AS_ERROR_t::NO
static

Definition at line 37 of file message.cpp.

Referenced by finishWarnExit(), format_warn(), handle_warn_as_error(), and initWarningFormat().

◆ g_warnFile

FILE* g_warnFile = stderr
static

◆ g_warnFormat

DString g_warnFormat
static

Definition at line 32 of file message.cpp.

Referenced by format_warn(), and initWarningFormat().

◆ g_warnHash

std::unordered_set<std::string> g_warnHash
static

Definition at line 42 of file message.cpp.

Referenced by checkWarnMessage().

◆ g_warningStr

const char* g_warningStr = "warning: "
static

Definition at line 34 of file message.cpp.

Referenced by initWarningFormat(), warn_(), and warn_uncond_().

◆ g_warnLineFormat

DString g_warnLineFormat
static

Definition at line 33 of file message.cpp.

Referenced by initWarningFormat(), and warn_line().

◆ g_warnlogFile

DString g_warnlogFile
static

◆ g_warnlogTemp

bool g_warnlogTemp = false
static

Definition at line 39 of file message.cpp.

Referenced by finishWarnExit(), and initWarningFormat().

◆ g_warnStat

std::atomic_bool g_warnStat = false
static

Definition at line 40 of file message.cpp.

Referenced by finishWarnExit(), format_warn(), and handle_warn_as_error().