You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kmymoney/kmymoney2/mymoney/mymoneyutils.cpp

344 lines
7.8 KiB

/***************************************************************************
mymoneyutils.cpp - description
-------------------
begin : Tue Jan 29 2002
copyright : (C) 2000-2002 by Michael Edwardes
email : mte@users.sourceforge.net
Javier Campos Morales <javi_c@users.sourceforge.net>
Felix Rodriguez <frodriguez@users.sourceforge.net>
John C <thetacoturtle@users.sourceforge.net>
Thomas Baumgart <ipwizard@users.sourceforge.net>
Kevin Tambascio <ktambascio@users.sourceforge.net>
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <iostream>
#include "mymoneyutils.h"
#include "mymoneyaccount.h"
#include <cstdio>
#include <cstdarg>
#include <cstdlib>
#include <tqregexp.h>
#ifdef _CHECK_MEMORY
#undef new
#undef _CheckMemory_Leak
#undef _CheckMemory_FreeAll
_CheckMemory chkmem;
bool enable=false;
_CheckMemoryEntry::_CheckMemoryEntry(void *p, int line, size_t size, const char *file)
: m_p(p), m_line(line), m_size(size), m_file(file)
{
}
_CheckMemoryEntry::_CheckMemoryEntry()
: m_p(0), m_line(0), m_size(0)
{
}
/////////////////////////////////////////////////////////////////////////////////////////
_CheckMemory::_CheckMemory()
{
outfunc = (_CheckMemoryOutFunc *)NULL;
}
_CheckMemory::_CheckMemory(_CheckMemoryOutFunc *out)
{
outfunc = out;
}
_CheckMemory::~_CheckMemory()
{
}
_CheckMemoryOutFunc *_CheckMemory::SetOutFunc(_CheckMemoryOutFunc *out)
{
_CheckMemoryOutFunc *old;
old = outfunc;
outfunc = out;
return old;
}
void _CheckMemory::Output(const char *fmt,...)
{
va_list args;
char buf[128];
va_start(args,fmt);
if(outfunc) {
vsprintf(buf,fmt,args);
outfunc(buf);
}
else {
vfprintf(stderr,fmt,args);
putc('\n', stderr);
}
va_end(args);
}
int _CheckMemory::TableCount(void)
{
return table.size();
}
bool _CheckMemory::CheckMemoryLeak(bool freeall)
{
bool d = false;
size_t total = 0;
int freec = 0;
CheckMemoryTable::ConstIterator it;
for(it = table.begin(); it != table.end(); ++it) {
if((*it).pointer() != 0) {
total += (*it).size();
freec++;
if(d == false) {
Output("CheckMemory++: CheckMemoryLeak: Memory leak detected!");
Output("Position |Size(bytes) |Allocated at");
d=true;
}
if(d==true)
Output("%p |%-13d|%s:%d",(*it).pointer(),(int)(*it).size(),(*it).file(),(*it).line());
}
}
if(d == true)
Output("You have forgotten to free %d object(s), %d bytes of memory.",freec, (int)total);
else
Output("CheckMemory++: CheckMemoryLeak: No memory leak detected.");
if(freeall == true)
FreeAll();
return true;
}
void _CheckMemory::FreeAll()
{
size_t total=0;
int freec=0;
CheckMemoryTable::Iterator it;
for(it = table.begin(); it != table.end(); it = table.begin()) {
if((*it).pointer() != 0) {
total += (*it).size();
freec++;
Output("CheckMemory++: FreeAll: freed %d bytes of memory at %p.",(int)(*it).size(),(*it).pointer());
free((*it).pointer());
}
table.remove(it);
}
Output("CheckMemory++: FreeAll: Totally freed %d objects, %d bytes of memory.",freec,(int)total);
}
void _CheckMemory_Init(_CheckMemoryOutFunc *out)
{
if(enable!=true) {
chkmem.Restart();
chkmem.SetOutFunc(out);
enable=true;
}
}
void _CheckMemory_End()
{
if(enable!=false) {
chkmem.Restart();
chkmem.SetOutFunc(NULL);
enable=false;
}
}
/////////////////////////////////////////////////////////////////////////////////////////
void *operator new(size_t s,const char *file,int line) throw()
{
void *p = malloc(s);
if(p == NULL) throw;
if(enable==true) {
_CheckMemoryEntry entry(p, line, s, file);
chkmem.table[p] = entry;
}
return p;
}
void * operator new [] (size_t s,const char *file,int line) throw()
{
void *p = malloc(s);
if(p == NULL) throw;
if(enable==true) {
_CheckMemoryEntry entry(p, line, s, file);
chkmem.table[p] = entry;
}
return p;
}
void operator delete(void *p) throw()
{
if(enable==true) {
CheckMemoryTable::Iterator it;
it = chkmem.table.find(p);
if(it != chkmem.table.end()) {
chkmem.table.remove(it);
}
}
free(p);
}
void operator delete [] (void *p) throw()
{
if(enable==true) {
CheckMemoryTable::Iterator it;
it = chkmem.table.find(p);
if(it != chkmem.table.end()) {
chkmem.table.remove(it);
}
}
free(p);
}
#endif // _CHECK_MEMORY
TQString MyMoneyUtils::getFileExtension(TQString strFileName)
{
TQString strTemp;
if(!strFileName.isEmpty())
{
//find last . delminator
int nLoc = strFileName.findRev('.');
if(nLoc != -1)
{
strTemp = strFileName.right(strFileName.length() - (nLoc + 1));
return strTemp.upper();
}
}
return strTemp;
}
int MyMoneyTracer::m_indentLevel = 0;
int MyMoneyTracer::m_onoff = 0;
MyMoneyTracer::MyMoneyTracer(const char* name)
{
if(m_onoff) {
TQRegExp exp("(.*)::(.*)");
if(exp.search(name) != -1) {
m_className = exp.cap(1);
m_memberName = exp.cap(2);
} else {
m_className = TQString(name);
m_memberName = TQString();
}
TQString indent;
indent.fill(' ', m_indentLevel);
std::cerr << indent.latin1() << "ENTER: " << m_className.latin1() << "::" << m_memberName.latin1() << std::endl;
}
m_indentLevel += 2;
}
MyMoneyTracer::MyMoneyTracer(const TQString& className, const TQString& memberName) :
m_className(className),
m_memberName(memberName)
{
if(m_onoff) {
TQString indent;
indent.fill(' ', m_indentLevel);
std::cerr << indent.latin1() << "ENTER: " << m_className.latin1() << "::" << m_memberName.latin1() << std::endl;
}
m_indentLevel += 2;
}
MyMoneyTracer::~MyMoneyTracer()
{
m_indentLevel -= 2;
if(m_onoff) {
TQString indent;
indent.fill(' ', m_indentLevel);
std::cerr << indent.latin1() << "LEAVE: " << m_className.latin1() << "::" << m_memberName.latin1() << std::endl;
}
}
void MyMoneyTracer::printf(const char *format, ...) const
{
if(m_onoff) {
va_list args;
va_start(args, format);
TQString indent;
indent.fill(' ', m_indentLevel);
std::cerr << indent.latin1();
vfprintf(stderr,format,args);
putc('\n', stderr);
va_end(args);
}
}
void MyMoneyTracer::onOff(int onOff)
{
m_onoff = onOff;
}
void MyMoneyTracer::on(void)
{
m_onoff = 1;
}
void MyMoneyTracer::off(void)
{
m_onoff = 0;
}
TQString dateToString(const TQDate& date)
{
if(!date.isNull() && date.isValid())
return date.toString(TQt::ISODate);
return TQString::null;
}
TQDate stringToDate(const TQString& str)
{
if(str.length()) {
TQDate date = TQDate::fromString(str, TQt::ISODate);
if(!date.isNull() && date.isValid())
return date;
}
return TQDate();
}
TQString TQStringEmpty(const TQString& val)
{
if(!val.isEmpty())
return TQString(val);
return TQString::null;
}
unsigned long extractId(const TQString& txt)
{
int pos;
unsigned long rc = 0;
pos = txt.find(TQRegExp("\\d+"), 0);
if(pos != -1) {
rc = txt.mid(pos).toLong();
}
return rc;
}