File indexing completed on 2024-05-19 05:07:24
0001 /* 0002 SPDX-FileCopyrightText: 2010 Thomas Baumgart <tbaumgart@kde.org> 0003 SPDX-FileCopyrightText: 2017-2018 Łukasz Wojniłowicz <lukasz.wojnilowicz@gmail.com> 0004 SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 #include "mymoneytracer.h" 0008 0009 #include <iostream> 0010 #include <cstdio> 0011 #include <cstdarg> 0012 0013 // ---------------------------------------------------------------------------- 0014 // QT Includes 0015 0016 #include <QRegularExpression> 0017 0018 // ---------------------------------------------------------------------------- 0019 // KDE Includes 0020 0021 // ---------------------------------------------------------------------------- 0022 // Project Includes 0023 0024 class MyMoneyTracerPrivate 0025 { 0026 Q_DISABLE_COPY(MyMoneyTracerPrivate) 0027 0028 public: 0029 MyMoneyTracerPrivate() 0030 { 0031 } 0032 0033 QString m_className; 0034 QString m_memberName; 0035 0036 static int m_indentLevel; 0037 static int m_onoff; 0038 }; 0039 0040 int MyMoneyTracerPrivate::m_indentLevel = 0; 0041 int MyMoneyTracerPrivate::m_onoff = 0; 0042 0043 MyMoneyTracer::MyMoneyTracer(const char* name) : 0044 d_ptr(new MyMoneyTracerPrivate) 0045 { 0046 static const QRegularExpression classMethodExp("(.*)::(.*)"); 0047 0048 Q_D(MyMoneyTracer); 0049 if (d->m_onoff) { 0050 const auto classAndMethod(classMethodExp.match(name)); 0051 if (classAndMethod.hasMatch()) { 0052 d->m_className = classAndMethod.captured(1); 0053 d->m_memberName = classAndMethod.captured(2); 0054 } else { 0055 d->m_className = QString(name); 0056 d->m_memberName.clear(); 0057 } 0058 QString indent; 0059 indent.fill(' ', d->m_indentLevel); 0060 std::cerr << qPrintable(indent) << "ENTER: " << qPrintable(d->m_className) << "::" << qPrintable(d->m_memberName) << std::endl; 0061 } 0062 d->m_indentLevel += 2; 0063 } 0064 0065 MyMoneyTracer::MyMoneyTracer(const QString& className, const QString& memberName) : 0066 d_ptr(new MyMoneyTracerPrivate) 0067 { 0068 Q_D(MyMoneyTracer); 0069 d->m_className = className; 0070 d->m_memberName = memberName; 0071 if (d->m_onoff) { 0072 QString indent; 0073 indent.fill(' ', d->m_indentLevel); 0074 std::cerr << qPrintable(indent) << "ENTER: " << qPrintable(d->m_className) << "::" << qPrintable(d->m_memberName) << std::endl; 0075 } 0076 d->m_indentLevel += 2; 0077 } 0078 0079 MyMoneyTracer::~MyMoneyTracer() 0080 { 0081 Q_D(MyMoneyTracer); 0082 d->m_indentLevel -= 2; 0083 if (d->m_onoff) { 0084 QString indent; 0085 indent.fill(' ', d->m_indentLevel); 0086 std::cerr << qPrintable(indent) << "LEAVE: " << qPrintable(d->m_className) << "::" << qPrintable(d->m_memberName) << std::endl; 0087 } 0088 delete d; 0089 } 0090 0091 void MyMoneyTracer::printf(const char *format, ...) const 0092 { 0093 Q_D(const MyMoneyTracer); 0094 if (d->m_onoff) { 0095 va_list args; 0096 va_start(args, format); 0097 QString indent; 0098 indent.fill(' ', d->m_indentLevel); 0099 std::cerr << qPrintable(indent); 0100 0101 vfprintf(stderr, format, args); 0102 putc('\n', stderr); 0103 va_end(args); 0104 } 0105 } 0106 0107 void MyMoneyTracer::onOff(int onOff) 0108 { 0109 MyMoneyTracerPrivate::m_onoff = onOff; 0110 } 0111 0112 void MyMoneyTracer::on() 0113 { 0114 MyMoneyTracerPrivate::m_onoff = 1; 0115 } 0116 0117 void MyMoneyTracer::off() 0118 { 0119 MyMoneyTracerPrivate::m_onoff = 0; 0120 }