/************************************************************************** ** parser.cpp ** ------------------- ** begin : Sun Aug 4 15:05:35 2002 ** copyright : (C) 2002-2004 Otto Bruggeman ** email : otto.bruggeman@home.nl ** ***************************************************************************/ /*************************************************************************** ** ** 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 #include "parser.h" #include "cvsdiffparser.h" #include "diffparser.h" #include "perforceparser.h" #include "diffmodel.h" using namespace Diff2; Parser::Parser( const KompareModelList* list ) : m_list( list ) { } Parser::~Parser() { } int Parser::cleanUpCrap( TQStringList& diffLines ) { TQStringList::Iterator it = diffLines.begin(); int nol = 0; TQString noNewLine( "\\ No newline" ); for ( ; it != diffLines.end(); ++it ) { if ( (*it).startsWith( noNewLine ) ) { it = diffLines.remove( it ); // correcting the advance of the iterator because of the remove --it; TQString temp( *it ); temp.truncate( temp.tqfind( '\n' ) ); *it = temp; ++nol; } } return nol; } DiffModelList* Parser::parse( TQStringList& diffLines ) { /* Basically determine the generator then call the parse method */ ParserBase* parser; m_generator = determineGenerator( diffLines ); int nol = cleanUpCrap( diffLines ); kdDebug(8101) << "Cleaned up " << nol << " line(s) of crap from the diff..." << endl; switch( m_generator ) { case Kompare::CVSDiff : kdDebug(8101) << "It is a CVS generated diff..." << endl; parser = new CVSDiffParser( m_list, diffLines ); break; case Kompare::Diff : kdDebug(8101) << "It is a diff generated diff..." << endl; parser = new DiffParser( m_list, diffLines ); break; case Kompare::Perforce : kdDebug(8101) << "It is a Perforce generated diff..." << endl; parser = new PerforceParser( m_list, diffLines ); break; default: // Nothing to delete, just leave... return 0L; } m_format = parser->format(); DiffModelList* modelList = parser->parse(); if ( modelList ) { kdDebug(8101) << "Modelcount: " << modelList->count() << endl; DiffModelListIterator modelIt = modelList->begin(); DiffModelListIterator mEnd = modelList->end(); for ( ; modelIt != mEnd; ++modelIt ) { kdDebug(8101) << "Hunkcount: " << (*modelIt)->hunkCount() << endl; kdDebug(8101) << "Diffcount: " << (*modelIt)->differenceCount() << endl; } } delete parser; return modelList; } enum Kompare::Generator Parser::determineGenerator( const TQStringList& diffLines ) { // Shit have to duplicate some code with this method and the ParserBase derived classes TQString cvsDiff ( "Index: " ); TQString perforceDiff( "==== " ); TQStringList::ConstIterator it = diffLines.begin(); TQStringList::ConstIterator linesEnd = diffLines.end(); while ( it != linesEnd ) { if ( ( *it ).startsWith( cvsDiff ) ) { kdDebug(8101) << "Diff is a CVSDiff" << endl; return Kompare::CVSDiff; } else if ( ( *it ).startsWith( perforceDiff ) ) { kdDebug(8101) << "Diff is a Perforce Diff" << endl; return Kompare::Perforce; } ++it; } kdDebug(8101) << "We'll assume it is a diff Diff" << endl; // For now we'll assume it is a diff file diff, later we might // try to really determine if it is a diff file diff. return Kompare::Diff; }