Files
newspark110/lib/debug/rs_debug.cpp
Chenwenxuan edac2715f0 init
2024-03-06 14:54:30 +08:00

181 lines
4.9 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/****************************************************************************
**
** This file is part of the LibreCAD project, a 2D CAD program
**
** Copyright (C) 2010 R. van Twisk (librecad@rvt.dds.nl)
** Copyright (C) 2001-2003 RibbonSoft. All rights reserved.
**
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file gpl-2.0.txt included in the
** packaging of this file.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program; if not, write to the Free Software
** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
**
** This copyright notice MUST APPEAR in all copies of the script!
**
**********************************************************************/
#include "rs_debug.h"
#include <iostream>
#include <cstdio>
#include <cstdarg>
#include <QString>
#include <QDateTime>
#include <QDebug>
RS_Debug* RS_Debug::uniqueInstance = nullptr;
void debugHeader(char const* file, char const* func, int line)
{
std::cout<<file<<" : "<<func<<" : line "<<line<<std::endl;
}
/**
* Gets the one and only RS_Debug instance
* (creates a new one on first call only)
*
* @return Pointer to the single instance of this
* singleton class
*/
RS_Debug* RS_Debug::instance() {
if(!uniqueInstance) {
QDateTime now = QDateTime::currentDateTime();
QString nowStr;
nowStr = now.toString("yyyyMMdd_hhmmss");
//QString fName = QString("%1/debug_%2.log")
// .arg(RS_SYSTEM->getHomeDir())
// .arg(nowStr);
// 定义打印日志名称
QString fName = QString("debug_%1.log").arg(nowStr);
uniqueInstance = new RS_Debug;
// 获取日志文件句柄
//uniqueInstance->stream = fopen(fName.latin1(), "wt");
uniqueInstance->stream = stderr;
}
return uniqueInstance;
}
/**
* Deletes the one and only RS_Debug instance.
*/
void
RS_Debug::deleteInstance() {
if (uniqueInstance) {
fclose(uniqueInstance->stream);
delete uniqueInstance;
}
}
/**
* Constructor setting the default debug level.
*/
RS_Debug::RS_Debug()
{
debugLevel = D_DEBUGGING;
}
/**
* Sets the debugging level.
*/
void RS_Debug::setLevel(RS_DebugLevel level) {
if(debugLevel==level) return;
debugLevel = level;
print( D_NOTHING, "RS_DEBUG::setLevel(%d)", level);
print( D_CRITICAL, "RS_DEBUG: Critical");
print( D_ERROR, "RS_DEBUG: Errors");
print( D_WARNING, "RS_DEBUG: Warnings");
print( D_NOTICE, "RS_DEBUG: Notice");
print( D_INFORMATIONAL, "RS_DEBUG: Informational");
print( D_DEBUGGING, "RS_DEBUG: Debugging");
}
/**
* Gets the current debugging level.
*/
RS_Debug::RS_DebugLevel RS_Debug::getLevel() {
return debugLevel;
}
/**
* Prints the given message to stdout.
* 实现把文本字符串写入文件,并且文本字符可以带多个格式参数
*/
void RS_Debug::print(const char* format ...) {
if(debugLevel==D_DEBUGGING) {
// 定义可变参数指针
va_list ap;
// 初始化可变参数指针,指向第一个可变参数
va_start(ap, format);
// 使用参数列表发送格式化输出到流 stream 中
// 参数1这是指向 FILE 对象的指针,该 FILE 对象标识了流
// 参数2这是 C 字符串,包含了要被写入到流 stream 中的文本。它可以包含嵌入的 format 标签format 标签可被随后的附加参数中指定的值替换,并按需求进行格式化。
// 参数3可变参数指针
vfprintf(stream, format, ap);
fprintf(stream, "\n");
va_end(ap);
fflush(stream);
}
}
/**
* Prints the given message to stdout if the current debug level
* is lower then the given level
*
* @param level Debug level.
*/
void RS_Debug::print(RS_DebugLevel level, const char* format ...) {
if(debugLevel>=level) {
va_list ap;
va_start(ap, format);
vfprintf(stream, format, ap);
fprintf(stream, "\n");
va_end(ap);
fflush(stream);
}
}
/**
* Prints a time stamp in the format yyyyMMdd_hhmmss.
*/
void RS_Debug::timestamp() {
QDateTime now = QDateTime::currentDateTime();
QString nowStr;
nowStr = now.toString("yyyyMMdd_hh:mm:ss:zzz ");
fprintf(stream, "%s", nowStr.toLatin1().data());
fprintf(stream, "\n");
fflush(stream);
}
/**
* Prints the unicode for every character in the given string.
*/
void RS_Debug::printUnicode(const QString& text) {
for(auto const& v: text){
print("[%X] %c", v.unicode(), v.toLatin1());
}
}
// EOF