summaryrefslogtreecommitdiffstats
path: root/src/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.cpp')
-rw-r--r--src/main.cpp236
1 files changed, 236 insertions, 0 deletions
diff --git a/src/main.cpp b/src/main.cpp
new file mode 100644
index 0000000..6e19b58
--- /dev/null
+++ b/src/main.cpp
@@ -0,0 +1,236 @@
+/***************************************************************************
+ main.cpp - Where everything starts.
+ -------------------
+ begin : Don Jul 11 12:31:29 CEST 2002
+ copyright : (C) 2002-2007 by Joachim Eibl
+ email : 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. *
+ * *
+ ***************************************************************************/
+
+#include <kcmdlineargs.h>
+#include <kaboutdata.h>
+#include <klocale.h>
+#include "kdiff3_shell.h"
+#include <kstandarddirs.h>
+#include "version.h"
+#include <qtextcodec.h>
+#include <qfile.h>
+#include <qtextstream.h>
+#include <vector>
+
+#ifdef KREPLACEMENTS_H
+#include "optiondialog.h"
+#endif
+#include "common.h"
+
+static const char *description =
+ I18N_NOOP("Tool for Comparison and Merge of Files and Directories");
+
+static KCmdLineOptions options[] =
+{
+ { "m", 0, 0 },
+ { "merge", I18N_NOOP("Merge the input."), 0 },
+ { "b", 0, 0 },
+ { "base file", I18N_NOOP("Explicit base file. For compatibility with certain tools."), 0 },
+ { "o", 0, 0 },
+ { "output file", I18N_NOOP("Output file. Implies -m. E.g.: -o newfile.txt"), 0 },
+ { "out file", I18N_NOOP("Output file, again. (For compatibility with certain tools.)"), 0 },
+ { "auto", I18N_NOOP("No GUI if all conflicts are auto-solvable. (Needs -o file)"), 0 },
+ { "qall", I18N_NOOP("Don't solve conflicts automatically. (For compatibility...)"), 0 },
+ { "L1 alias1", I18N_NOOP("Visible name replacement for input file 1 (base)."), 0 },
+ { "L2 alias2", I18N_NOOP("Visible name replacement for input file 2."), 0 },
+ { "L3 alias3", I18N_NOOP("Visible name replacement for input file 3."), 0 },
+ { "L", 0, 0 },
+ { "fname alias", I18N_NOOP("Alternative visible name replacement. Supply this once for every input."), 0 },
+ { "cs string", I18N_NOOP("Override a config setting. Use once for every setting. E.g.: --cs \"AutoAdvance=1\""), 0 },
+ { "confighelp", I18N_NOOP("Show list of config settings and current values."), 0 },
+ { "config file", I18N_NOOP("Use a different config file."), 0 }
+};
+static KCmdLineOptions options2[] =
+{
+ { "+[File1]", I18N_NOOP("file1 to open (base, if not specified via --base)"), 0 },
+ { "+[File2]", I18N_NOOP("file2 to open"), 0 },
+ { "+[File3]", I18N_NOOP("file3 to open"), 0 }
+};
+
+
+void initialiseCmdLineArgs(std::vector<KCmdLineOptions>& vOptions, QStringList& ignorableOptions)
+{
+ vOptions.insert( vOptions.end(), options, (KCmdLineOptions*)((char*)options+sizeof(options)));
+ QString configFileName = KStandardDirs().findResource("config","kdiff3rc");
+ QFile configFile( configFileName );
+ if ( configFile.open( IO_ReadOnly ) )
+ {
+ QTextStream ts( &configFile );
+ while(!ts.atEnd())
+ {
+ QString line = ts.readLine();
+ if ( line.startsWith("IgnorableCmdLineOptions=") )
+ {
+ int pos = line.find('=');
+ if (pos>=0)
+ {
+ QString s = line.mid(pos+1);
+ QStringList sl = QStringList::split( '|', s );
+ if (!sl.isEmpty())
+ {
+ ignorableOptions = QStringList::split( ';', sl.front() );
+ for (QStringList::iterator i=ignorableOptions.begin(); i!=ignorableOptions.end(); ++i)
+ {
+ KCmdLineOptions ignoreOption;
+ (*i).remove('-');
+ if (!(*i).isEmpty())
+ {
+ ignoreOption.name = (*i).latin1();
+ ignoreOption.description = I18N_NOOP("Ignored. (User defined.)");
+ ignoreOption.def = 0;
+ vOptions.push_back(ignoreOption);
+ }
+ }
+ }
+ }
+ break;
+ }
+ }
+ }
+ vOptions.insert(vOptions.end(),options2,(KCmdLineOptions*)((char*)options2+sizeof(options2)));
+
+ KCmdLineOptions last = KCmdLineLastOption;
+ vOptions.push_back(last);
+ KCmdLineArgs::addCmdLineOptions( &vOptions[0] ); // Add our own options.
+}
+
+
+#ifdef _WIN32
+#include <process.h>
+// This command checks the comm
+static bool isOptionUsed(const QString& s, int argc, char* argv[])
+{
+ for(int j=0; j<argc; ++j )
+ {
+ if( "-"+s == argv[j] || "--"+s==argv[j] )
+ {
+ return true;
+ }
+ }
+ return false;
+}
+#endif
+
+
+
+int main(int argc, char *argv[])
+{
+#ifdef _WIN32
+ /* KDiff3 can be used as replacement for the text-diff and merge tool provided by
+ Clearcase. This is experimental and so far has only been tested under Windows.
+
+ There are two ways to use KDiff3 with clearcase
+ - The file lib/mgrs/map contains the list of compare/merge tasks on one side and
+ the tool on the other. Originally this contains only clearcase tools, but you can
+ edit this file and put kdiff3 there instead. (Recommended method)
+ - Exchange the original program with KDiff3: (Hackish, no fine control)
+ 1. In the Clearcase "bin"-directory rename "cleardiffmrg.exe" to "cleardiffmrg_orig.exe".
+ 2. Copy kdiff3.exe into that "bin"-directory and rename it to "cleardiffmrg.exe".
+ (Also copy the other files that are needed by KDiff3 there.)
+ Now when a file comparison or merge is done by Clearcase then of course KDiff3 will be
+ run instead.
+ If the commandline contains the option "-directory" then KDiff3 can't do it but will
+ run "cleardiffmrg_orig.exe" instead.
+ */
+
+ // Write all args into a temporary file. Uncomment this for debugging purposes.
+ /*
+ FILE* f = fopen("c:\\t.txt","w");
+ for(int i=0; i< argc; ++i)
+ fprintf(f,"Arg %d: %s\n", i, argv[i]);
+
+ // Call orig cleardiffmrg.exe to see what result it returns.
+ int result=0;
+ result = ::_spawnvp(_P_WAIT , "C:\\Programme\\Rational\\ClearCase\\bin\\cleardiffmrg.exe", argv );
+ fprintf(f,"Result: %d\n", result );
+ fclose(f);
+ return result;
+ */
+
+ // KDiff3 can replace cleardiffmrg from clearcase. But not all functions.
+ if ( isOptionUsed( "directory", argc,argv ) )
+ {
+ return ::_spawnvp(_P_WAIT , "cleardiffmrg_orig", argv );
+ }
+
+#endif
+ //QApplication::setColorSpec( QApplication::ManyColor ); // Grab all 216 colors
+
+ KAboutData aboutData( "kdiff3", I18N_NOOP("KDiff3"),
+ VERSION, description, KAboutData::License_GPL,
+ "(c) 2002-2007 Joachim Eibl", 0, "http://kdiff3.sourceforge.net/", "joachim.eibl" "@" "gmx.de");
+ aboutData.addAuthor("Joachim Eibl",0, "joachim.eibl" "@" "gmx.de");
+ aboutData.addCredit("Eike Sauer", "Bugfixes, Debian package maintainer" );
+ aboutData.addCredit("Sebastien Fricker", "Windows installer" );
+ aboutData.addCredit("Stephan Binner", "i18n-help", "binner" "@" "kde.org" );
+ aboutData.addCredit("Stefan Partheymueller", "Clipboard-patch" );
+ aboutData.addCredit("David Faure", "KIO-Help", "faure" "@" "kde.org" );
+ aboutData.addCredit("Bernd Gehrmann", "Class CvsIgnoreList from Cervisia" );
+ aboutData.addCredit("Andre Woebbeking", "Class StringMatcher" );
+ aboutData.addCredit("Michael Denio", "Directory Equality-Coloring patch");
+ aboutData.addCredit("Manfred Koehler", "Fix for slow startup on Windows");
+ aboutData.addCredit("Sergey Zorin", "Diff Ext for Windows");
+ aboutData.addCredit("Paul Eggert, Mike Haertel, David Hayes, Richard Stallman, Len Tower", "GNU-Diffutils");
+ aboutData.addCredit("Tino Boellsterling, Timothy Mee", "Intensive test, use and feedback");
+ aboutData.addCredit("Michael Schmidt", "Mac support");
+
+ aboutData.addCredit(I18N_NOOP("+ Many thanks to those who reported bugs and contributed ideas!"));
+
+ KCmdLineArgs::init( argc, argv, &aboutData );
+ std::vector<KCmdLineOptions> vOptions;
+ QStringList ignorableOptions;
+ initialiseCmdLineArgs(vOptions, ignorableOptions);
+
+ KApplication app;
+
+#ifdef KREPLACEMENTS_H
+ QString locale;
+
+ locale = app.config()->readEntry("Language", "Auto");
+ int spacePos = locale.find(' ');
+ if (spacePos>0) locale = locale.left(spacePos);
+ QTranslator kdiff3Translator( 0 );
+ QTranslator qtTranslator( 0 );
+ if (locale != "en_orig")
+ {
+ if ( locale == "Auto" || locale.isEmpty() )
+ locale = QTextCodec::locale();
+
+ QString translationDir = getTranslationDir();
+ kdiff3Translator.load( QString("kdiff3_")+locale, translationDir );
+ app.installTranslator( &kdiff3Translator );
+
+ qtTranslator.load( QString("qt_")+locale, translationDir );
+ app.installTranslator( &qtTranslator );
+ }
+#endif
+
+ if (app.isRestored())
+ {
+ RESTORE(KDiff3Shell);
+ }
+ else
+ {
+ new KDiff3Shell();
+ }
+
+ int retVal = app.exec();
+ return retVal;
+}
+
+// Suppress warning with --enable-final
+#undef VERSION