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 }