summaryrefslogtreecommitdiff
path: root/compareDlg.cpp
diff options
context:
space:
mode:
authorTobias Klauser <tklauser@distanz.ch>2008-10-08 19:22:25 +0200
committerTobias Klauser <tklauser@xenon.tklauser.home>2008-10-08 19:22:25 +0200
commit2a441ecbea378da1a2cdea969c48bb7d9e547135 (patch)
tree63e071a86374ad86615c67f4c75534c4df8b6ab3 /compareDlg.cpp
parent226f961c4b7fef115ae2c7950abe0e1973efc6a4 (diff)
Import new upstream release 0.42
Diffstat (limited to 'compareDlg.cpp')
-rw-r--r--compareDlg.cpp297
1 files changed, 0 insertions, 297 deletions
diff --git a/compareDlg.cpp b/compareDlg.cpp
deleted file mode 100644
index f8621f3..0000000
--- a/compareDlg.cpp
+++ /dev/null
@@ -1,297 +0,0 @@
-/* $Id: compareDlg.cpp,v 1.8 2006/11/05 04:42:43 ganzhorn Exp $
- * This file is part of lfhex.
- * Copyright (C) 2006 Salem Ganzhorn <eyekode@yahoo.com>
- *
- * 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 version 2.
- *
- * 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 Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-
-#include <QLabel>
-#include <QLineEdit>
-#include <QCheckBox>
-#include <qlayout.h>
-#include <qpushbutton.h>
-#include <QToolBar>
-#include <qtoolbutton.h>
-#include <QFileDialog>
-#include <qwidget.h>
-#include <qapplication.h>
-#include <qmessagebox.h>
-#include <qcombobox.h>
-#include <qtabwidget.h>
-#include <QBitmap>
-#include <QVBoxLayout>
-
-#include "compareDlg.hpp"
-#include "offsetConstraint.hpp"
-#include "hexGui.hpp"
-#include "reader.hpp"
-#include "box.hpp"
-
-// icon images:
-#include "img/prev.xbm"
-#include "img/next.xbm"
-#include "img/last.xbm"
-#include "img/first.xbm"
-#include "img/exit.xbm"
-
-//extern QApplication * qApp;
-
-CompareDlg::CompareDlg(const char *file0,
- const char *file1,
- QWidget*parent)
- : QMainWindow(parent)
-{
- tabLayout = new QTabWidget(this);
- setCentralWidget(tabLayout);
-
- QWidget *options = new QWidget(tabLayout);
- QVBoxLayout *optionLayout = new QVBoxLayout(options);
-
- optionLayout->setMargin(3);
- optionLayout->setSpacing(2);
-
- // setup alignment entries:
- offsetConstraint = new OffsetConstraint(options);
- offsetConstraint->setTitle( "Constrain offset to X*n+Y" );
- optionLayout->addWidget(offsetConstraint);
- // setup cursor offsets
- diffOffsets = new QCheckBox("Allow different file offsets",options);
- optionLayout->addWidget(diffOffsets);
- // add a dummy strechable widget for alignment.
- optionLayout->addStretch(1);
- connect(diffOffsets,SIGNAL(stateChanged(int)),
- this,SLOT(setAllowDiffOffsets(int)));
- diffOffsets->setChecked(false);
- setAllowDiffOffsets(false);
-
- // setup toolbar
- QToolBar *tools = new QToolBar(this);
-/* FIXME new QToolButton(QBitmap::fromData(QSize(exit_width,exit_height),exit_bits),
- "Exit","",qApp,SLOT(quit()),tools);
- tools->addSeparator();
- new QToolButton(QBitmap(first_width,first_height,first_bits,true),
- "First Difference","",this,SLOT(first()),tools);
- new QToolButton(QBitmap(prev_width,prev_height,prev_bits,true),
- "Previous Difference","?",
- this,SLOT(prev()),tools);
- new QToolButton(QBitmap(next_width,next_height,next_bits,true),
- "Next Difference","foo",
- this,SLOT(next()),tools);
- new QToolButton(QBitmap(last_width,last_height,last_bits,true),
- "Last Difference","",this,SLOT(last()),tools);
-*/
- // setup compare section
- vbox* view = new vbox(tabLayout);
-
- hexGui[0] = new HexGui(view);
- hexGui[1] = new HexGui(view);
- reader[0] = hexGui[0]->reader();
- reader[1] = hexGui[1]->reader();
-
- if( file0 )
- hexGui[0]->open(file0);
- if( file1 )
- hexGui[1]->open(file1);
-
- tabLayout->addTab(view,"&Compare");
- tabLayout->addTab(options,"&Options");
- addToolBar(tools);
- // request a size large enough for both hexEditors
- resize(500,500);
- setWindowTitle("Compare dialog");
-}
-
-bool CompareDlg::enabled()
-{
- if( reader[0]->is_open() && reader[1]->is_open() ) {
- // check to see if modified!!!
- if( hexGui[0]->isModified() || hexGui[1]->isModified() ) {
- QMessageBox::critical(this,PROGRAM_STRING,
- "Error, cannot use comparison"
- " functions on modified buffers.");
- return false;
- }
- return true;
- }
-
- return false;
-}
-// public slots
-void CompareDlg::setAllowDiffOffsets(int state)
-{
- // diffOffsets->setChecked(state);
-}
-
-bool CompareDlg::first()
-{
- if( !enabled() )
- return false;
-
- // see Compare::last() for description of concept
- off_t offset = offsetConstraint->next(0);
- hexGui[0]->gotoOffset(offset);
- hexGui[1]->gotoOffset(offset);
- if( prev() )
- return true;
- hexGui[0]->gotoOffset(0);
- hexGui[1]->gotoOffset(0);
- return next();
-}
-
-bool CompareDlg::last()
-{
- if( !enabled() )
- return false;
-
- // look at lastidx 's previous's next range
- // prev(x) is garranteed to not contain x, and next(prev(x)) will contain x
- off_t min_size_decr = min( reader[0]->size()-1,
- reader[1]->size()-1 );
- off_t offset = offsetConstraint->prev( min_size_decr );
- hexGui[0]->gotoOffset(offset);
- hexGui[1]->gotoOffset(offset);
- if( next() )
- return true;
- hexGui[0]->gotoOffset( min_size_decr );
- hexGui[1]->gotoOffset( min_size_decr );
- return prev();
-}
-
-bool CompareDlg::prev()
-{
- if( !enabled() )
- return false;;
- // find previous diff
- off_t offset[2];
- offset[0] = hexGui[0]->offset();
- offset[1] = (diffOffsets->isChecked()) ? hexGui[1]->offset() : offset[0];
-
- if( offsetConstraint->getStride() > 1 ) {
- off_t stop[2];
- off_t pos[2];
- for( pos[0] = offset[0] = offsetConstraint->prev(offset[0]),
- pos[1] = offset[1] = offsetConstraint->prev(offset[1]);
- offset[0] >= 0 && offset[1] >= 0;
- pos[0] = offset[0] = offsetConstraint->prev(offset[0]),
- pos[1] = offset[1] = offsetConstraint->prev(offset[1])) {
-
- // calculate stop
- stop[0] = offset[0]+offsetConstraint->getStride();
- stop[1] = offset[1]+offsetConstraint->getStride();
-
- // ignore lookups on less than a full stride length
- // this would only happen if the file size is less than the stride
- if( stop[0] > reader[0]->size() || stop[1] > reader[1]->size() )
- return false;
-
- while( pos[0] < stop[0] ) {
- if( (*reader[0])[pos[0]++] != (*reader[1])[pos[1]++] ) {
- // we have a difference
- hexGui[0]->setSelection(offset[0],stop[0]);
- hexGui[1]->setSelection(offset[1],stop[1]);
- hexGui[0]->gotoOffset(offset[0]);
- hexGui[1]->gotoOffset(offset[1]);
- return true;
- }
- }
- }
- } else {
- // just go one char at a time
-
- // make sure we are not past the eof of the second buffer
- if( offset[1] >= reader[1]->size() )
- return false;
- if( offset[0] <= 0 || offset[1] <= 0 )
- return false;
- do {
- offset[0]--;
- offset[1]--;
-
- if( (*reader[0])[offset[0]] != (*reader[1])[offset[1]] ) {
- hexGui[0]->gotoOffset(offset[0]);
- hexGui[1]->gotoOffset(offset[1]);
- hexGui[0]->setSelection(offset[0],offset[0]+1);
- hexGui[1]->setSelection(offset[1],offset[1]+1);
- return true;
- }
- } while( offset[0] > 0 && offset[1] > 0 );
- }
- return false;
-}
-
-bool CompareDlg::next()
-{
- // find next diff
- if( !enabled() )
- return false;
-
- off_t offset[2];
- offset[0] = hexGui[0]->offset();
- offset[1] = (diffOffsets->isChecked()) ? hexGui[1]->offset() : offset[0];
-
- off_t size[2];
- size[0] = reader[0]->size();
- size[1] = reader[1]->size();
-
- if( offsetConstraint->getStride() > 1 ) {
- off_t stop[2];
- off_t pos[2];
- for( pos[0] = offset[0] = offsetConstraint->next(offset[0]),
- pos[1] = offset[1] = offsetConstraint->next(offset[1]);
- offset[0] < size[0] && offset[1] < size[1];
- pos[0] = offset[0] = offsetConstraint->next( offset[0] ),
- pos[1] = offset[1] = offsetConstraint->next( offset[1] )) {
- // compare from offset to offset+stride()
- stop[0] = offset[0]+offsetConstraint->getStride();
- stop[1] = offset[1]+offsetConstraint->getStride();
- // if this will go past the bounds of the files, then the difference
- // does not matter, ignore it.
- if( stop[0] > size[0] || stop[1] > size[1] ) {
- return false;
- }
-
- while( pos[0] < stop[0] ) {
- if( (*reader[0])[pos[0]++] != (*reader[1])[pos[1]++] ) {
- // we have a difference
- hexGui[0]->setSelection(offset[0],stop[0]);
- hexGui[1]->setSelection(offset[1],stop[1]);
- hexGui[0]->gotoOffset(offset[0]);
- hexGui[1]->gotoOffset(offset[1]);
- return true; // bail out of fn
- }
- }
- }
- } else {
- // just go one at a time
- if( offset[0] >= size[0] || offset[1] >= size[1] )
- return false;
- if( offset[0] < 0 || offset[1] < 0 )
- return false;
- offset[0]++;
- offset[1]++;
- while( offset[0] < size[0] && offset[1] < size[1] ) {
- // don't compare the one we are on
- if( (*reader[0])[offset[0]] != (*reader[1])[offset[1]] ) {
- hexGui[0]->gotoOffset(offset[0]);
- hexGui[1]->gotoOffset(offset[1]);
- hexGui[0]->setSelection(offset[0],offset[0]+1);
- hexGui[1]->setSelection(offset[1],offset[1]+1);
- return true;
- }
- offset[0]++;
- offset[1]++;
- }
- }
- return false;
-}