summaryrefslogtreecommitdiffstats
path: root/src/common.cpp
diff options
context:
space:
mode:
authortpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2010-02-10 01:27:27 +0000
committertpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2010-02-10 01:27:27 +0000
commit76718abdb2138623102398a10f3228e576dd0ae8 (patch)
treeddb098baac9689b9e661a41c2a28a8a23ef246d4 /src/common.cpp
downloadkdiff3-76718abdb2138623102398a10f3228e576dd0ae8.tar.gz
kdiff3-76718abdb2138623102398a10f3228e576dd0ae8.zip
Added abandoned KDE3 version of kdiff3
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/applications/kdiff3@1088041 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'src/common.cpp')
-rw-r--r--src/common.cpp341
1 files changed, 341 insertions, 0 deletions
diff --git a/src/common.cpp b/src/common.cpp
new file mode 100644
index 0000000..a05920e
--- /dev/null
+++ b/src/common.cpp
@@ -0,0 +1,341 @@
+/***************************************************************************
+ * Copyright (C) 2004-2007 by Joachim Eibl *
+ * joachim.eibl at gmx.de *
+ * *
+ * 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. *
+ * *
+ * 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 Steet, Fifth Floor, Boston, MA 02110-1301, USA. *
+ ***************************************************************************/
+
+#include "common.h"
+#include <map>
+#include <qfont.h>
+#include <qcolor.h>
+#include <qsize.h>
+#include <qpoint.h>
+#include <qstringlist.h>
+#include <qtextstream.h>
+
+ValueMap::ValueMap()
+{
+}
+
+ValueMap::~ValueMap()
+{
+}
+
+void ValueMap::save( QTextStream& ts )
+{
+ std::map<QString,QString>::iterator i;
+ for( i=m_map.begin(); i!=m_map.end(); ++i)
+ {
+ QString key = i->first;
+ QString val = i->second;
+ ts << key << "=" << val << "\n";
+ }
+}
+
+QString ValueMap::getAsString()
+{
+ QString result;
+ std::map<QString,QString>::iterator i;
+ for( i=m_map.begin(); i!=m_map.end(); ++i)
+ {
+ QString key = i->first;
+ QString val = i->second;
+ result += key + "=" + val + "\n";
+ }
+ return result;
+}
+
+void ValueMap::load( QTextStream& ts )
+{
+ while ( !ts.eof() )
+ { // until end of file...
+ QString s = ts.readLine(); // line of text excluding '\n'
+ int pos = s.find('=');
+ if( pos > 0 ) // seems not to have a tag
+ {
+ QString key = s.left(pos);
+ QString val = s.mid(pos+1);
+ m_map[key] = val;
+ }
+ }
+}
+/*
+void ValueMap::load( const QString& s )
+{
+ int pos=0;
+ while ( pos<(int)s.length() )
+ { // until end of file...
+ int pos2 = s.find('=', pos);
+ int pos3 = s.find('\n', pos2 );
+ if (pos3<0)
+ pos3=s.length();
+ if( pos2 > 0 ) // seems not to have a tag
+ {
+ QString key = s.mid(pos, pos2-pos);
+ QString val = s.mid(pos2+1, pos3-pos2-1);
+ m_map[key] = val;
+ }
+ pos = pos3;
+ }
+}
+*/
+
+// safeStringJoin and safeStringSplit allow to convert a stringlist into a string and back
+// safely, even if the individual strings in the list contain the separator character.
+QString safeStringJoin(const QStringList& sl, char sepChar, char metaChar )
+{
+ // Join the strings in the list, using the separator ','
+ // If a string contains the separator character, it will be replaced with "\,".
+ // Any occurances of "\" (one backslash) will be replaced with "\\" (2 backslashes)
+
+ assert(sepChar!=metaChar);
+
+ QString sep;
+ sep += sepChar;
+ QString meta;
+ meta += metaChar;
+
+ QString safeString;
+
+ QStringList::const_iterator i;
+ for (i=sl.begin(); i!=sl.end(); ++i)
+ {
+ QString s = *i;
+ s.replace(meta, meta+meta); // "\" -> "\\"
+ s.replace(sep, meta+sep); // "," -> "\,"
+ if ( i==sl.begin() )
+ safeString = s;
+ else
+ safeString += sep + s;
+ }
+ return safeString;
+}
+
+// Split a string that was joined with safeStringJoin
+QStringList safeStringSplit(const QString& s, char sepChar, char metaChar )
+{
+ assert(sepChar!=metaChar);
+ QStringList sl;
+ // Miniparser
+ int i=0;
+ int len=s.length();
+ QString b;
+ for(i=0;i<len;++i)
+ {
+ if ( i+1<len && s[i]==metaChar && s[i+1]==metaChar ){ b+=metaChar; ++i; }
+ else if ( i+1<len && s[i]==metaChar && s[i+1]==sepChar ){ b+=sepChar; ++i; }
+ else if ( s[i]==sepChar ) // real separator
+ {
+ sl.push_back(b);
+ b="";
+ }
+ else { b+=s[i]; }
+ }
+ if ( !b.isEmpty() )
+ sl.push_back(b);
+
+ return sl;
+}
+
+
+
+static QString numStr(int n)
+{
+ QString s;
+ s.setNum( n );
+ return s;
+}
+
+static QString subSection( const QString& s, int idx, char sep )
+{
+ int pos=0;
+ while( idx>0 )
+ {
+ pos = s.find( sep, pos );
+ --idx;
+ if (pos<0) break;
+ ++pos;
+ }
+ if ( pos>=0 )
+ {
+ int pos2 = s.find( sep, pos );
+ if ( pos2>0 )
+ return s.mid(pos, pos2-pos);
+ else
+ return s.mid(pos);
+ }
+
+ return "";
+}
+
+static int num( QString& s, int idx )
+{
+ return subSection( s, idx, ',').toInt();
+}
+
+void ValueMap::writeEntry(const QString& k, const QFont& v )
+{
+ m_map[k] = v.family() + "," + QString::number(v.pointSize()) + "," + (v.bold() ? "bold" : "normal");
+}
+
+void ValueMap::writeEntry(const QString& k, const QColor& v )
+{
+ m_map[k] = numStr(v.red()) + "," + numStr(v.green()) + "," + numStr(v.blue());
+}
+
+void ValueMap::writeEntry(const QString& k, const QSize& v )
+{
+ m_map[k] = numStr(v.width()) + "," + numStr(v.height());
+}
+
+void ValueMap::writeEntry(const QString& k, const QPoint& v )
+{
+ m_map[k] = numStr(v.x()) + "," + numStr(v.y());
+}
+
+void ValueMap::writeEntry(const QString& k, int v )
+{
+ m_map[k] = numStr(v);
+}
+
+void ValueMap::writeEntry(const QString& k, bool v )
+{
+ m_map[k] = numStr(v);
+}
+
+void ValueMap::writeEntry(const QString& k, const QString& v )
+{
+ m_map[k] = v;
+}
+
+void ValueMap::writeEntry(const QString& k, const char* v )
+{
+ m_map[k] = v;
+}
+
+void ValueMap::writeEntry(const QString& k, const QStringList& v, char separator )
+{
+ m_map[k] = safeStringJoin(v, separator);
+}
+
+
+QFont ValueMap::readFontEntry(const QString& k, QFont* defaultVal )
+{
+ QFont f = *defaultVal;
+ std::map<QString,QString>::iterator i = m_map.find( k );
+ if ( i!=m_map.end() )
+ {
+ f.setFamily( subSection( i->second, 0, ',' ) );
+ f.setPointSize( subSection( i->second, 1, ',' ).toInt() );
+ f.setBold( subSection( i->second, 2, ',' )=="bold" );
+ //f.fromString(i->second);
+ }
+
+ return f;
+}
+
+QColor ValueMap::readColorEntry(const QString& k, QColor* defaultVal )
+{
+ QColor c= *defaultVal;
+ std::map<QString,QString>::iterator i = m_map.find( k );
+ if ( i!=m_map.end() )
+ {
+ QString s = i->second;
+ c = QColor( num(s,0),num(s,1),num(s,2) );
+ }
+
+ return c;
+}
+
+QSize ValueMap::readSizeEntry(const QString& k, QSize* defaultVal )
+{
+ QSize size = defaultVal ? *defaultVal : QSize(600,400);
+ std::map<QString,QString>::iterator i = m_map.find( k );
+ if ( i!=m_map.end() )
+ {
+
+ QString s = i->second;
+ size = QSize( num(s,0),num(s,1) );
+ }
+
+ return size;
+}
+
+QPoint ValueMap::readPointEntry(const QString& k, QPoint* defaultVal)
+{
+ QPoint point = defaultVal ? *defaultVal : QPoint(0,0);
+ std::map<QString,QString>::iterator i = m_map.find( k );
+ if ( i!=m_map.end() )
+ {
+ QString s = i->second;
+ point = QPoint( num(s,0),num(s,1) );
+ }
+
+ return point;
+}
+
+bool ValueMap::readBoolEntry(const QString& k, bool bDefault )
+{
+ bool b = bDefault;
+ std::map<QString,QString>::iterator i = m_map.find( k );
+ if ( i!=m_map.end() )
+ {
+ QString s = i->second;
+ b = (bool)num(s,0);
+ }
+
+ return b;
+}
+
+int ValueMap::readNumEntry(const QString& k, int iDefault )
+{
+ int ival = iDefault;
+ std::map<QString,QString>::iterator i = m_map.find( k );
+ if ( i!=m_map.end() )
+ {
+ QString s = i->second;
+ ival = num(s,0);
+ }
+
+ return ival;
+}
+
+QString ValueMap::readEntry(const QString& k, const QString& sDefault )
+{
+ QString sval = sDefault;
+ std::map<QString,QString>::iterator i = m_map.find( k );
+ if ( i!=m_map.end() )
+ {
+ sval = i->second;
+ }
+
+ return sval;
+}
+
+QStringList ValueMap::readListEntry(const QString& k, const QStringList& defaultVal, char separator )
+{
+ QStringList strList;
+
+ std::map<QString,QString>::iterator i = m_map.find( k );
+ if ( i!=m_map.end() )
+ {
+ strList = safeStringSplit( i->second, separator );
+ return strList;
+ }
+ else
+ return defaultVal;
+}