/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Script Generator project on Qt Labs. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "fileout.h" #include "reporthandler.h" #include #include bool FileOut::dummy = false; bool FileOut::diff = false; bool FileOut::license = false; #ifdef Q_OS_LINUX const char* colorDelete = "\033[31m"; const char* colorAdd = "\033[32m"; const char* colorInfo = "\033[36m"; const char* colorReset = "\033[0m"; #else const char* colorDelete = ""; const char* colorAdd = ""; const char* colorInfo = ""; const char* colorReset = ""; #endif FileOut::FileOut(QString n): name(n), stream(&tmp), isDone(false) {} static int* lcsLength(QList a, QList b) { const int height = a.size() + 1; const int width = b.size() + 1; int *res = new int[width * height]; for (int row=0; row a, QList b){ { if (type == Unchanged) { if ((end - start) > 9) { for (int i = start; i <= start+2; i++) printf(" %s\n", a[i].data()); printf("%s=\n= %d more lines\n=%s\n", colorInfo, end - start - 6, colorReset); for (int i = end-2; i <= end; i++) printf(" %s\n", a[i].data()); } else for (int i = start; i <= end; i++) printf(" %s\n", a[i].data()); } else if(type == Add) { printf("%s", colorAdd); for (int i = start; i <= end; i++){ printf("+ %s\n", b[i].data()); } printf("%s", colorReset); } else if (type == Delete) { printf("%s", colorDelete); for (int i = start; i <= end; i++) { printf("- %s\n", a[i].data()); } printf("%s", colorReset); } } } }; static QList *unitAppend(QList *res, Type type, int pos) { if (res == 0) { res = new QList; res->append(new Unit(type, pos)); return res; } Unit *last = res->last(); if (last->type == type) { last->end = pos; } else { res->append(new Unit(type, pos)); } return res; } static QList *diffHelper(int *lcs, QList a, QList b, int row, int col) { if (row>0 && col>0 && (a[row-1] == b[col-1])) { return unitAppend(diffHelper(lcs, a, b, row-1, col-1), Unchanged, row-1); } else { int width = b.size()+1; if ((col > 0) && ((row==0) || lcs[width * row + col-1] >= lcs[width * (row-1) + col])) { return unitAppend(diffHelper(lcs, a, b, row, col-1), Add, col-1); } else if((row > 0) && ((col==0) || lcs[width * row + col-1] < lcs[width * (row-1) + col])){ return unitAppend(diffHelper(lcs, a, b, row-1, col), Delete, row-1);; } } delete lcs; return 0; } static void diff(QList a, QList b) { QList *res = diffHelper(lcsLength(a, b), a, b, a.size(), b.size()); for (int i=0; i < res->size(); i++) { Unit *unit = res->at(i); unit->print(a, b); delete(unit); } delete(res); } bool FileOut::done() { Q_ASSERT( !isDone ); isDone = true; bool fileEqual = false; QFile fileRead(name); QFileInfo info(fileRead); stream.flush(); QByteArray original; if (info.exists() && (diff || (info.size() == tmp.size()))) { if ( !fileRead.open(QIODevice::ReadOnly) ) { ReportHandler::warning(QString("failed to open file '%1' for reading") .arg(fileRead.fileName())); return false; } original = fileRead.readAll(); fileRead.close(); fileEqual = (original == tmp); } if( !fileEqual ) { if( !FileOut::dummy ) { QDir dir(info.absolutePath()); if (!dir.mkpath(dir.absolutePath())) { ReportHandler::warning(QString("unable to create directory '%1'") .arg(dir.absolutePath())); return false; } QFile fileWrite(name); if (!fileWrite.open(QIODevice::WriteOnly)) { ReportHandler::warning(QString("failed to open file '%1' for writing") .arg(fileWrite.fileName())); return false; } stream.setDevice(&fileWrite); stream << tmp; } if (diff) { printf("%sFile: %s%s\n", colorInfo, qPrintable(name), colorReset); ::diff(original.split('\n'), tmp.split('\n')); printf("\n"); } return true; } return false; }