1 /* 2 This file is part of the Okteta Kasten module, made within the KDE community. 3 4 SPDX-FileCopyrightText: 2008-2009 Friedrich W. H. Kossebau <kossebau@kde.org> 5 6 SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 7 */ 8 9 #include "andbytearrayfilter.hpp" 10 11 // Okteta core 12 #include <Okteta/AbstractByteArrayModel> 13 // KF 14 #include <KLocalizedString> 15 AndByteArrayFilter()16AndByteArrayFilter::AndByteArrayFilter() 17 : AbstractByteArrayFilter( 18 i18nc("name of the filter; it does a logic AND operation", 19 "operand AND data")) 20 {} 21 22 AndByteArrayFilter::~AndByteArrayFilter() = default; 23 parameterSet()24AbstractByteArrayFilterParameterSet* AndByteArrayFilter::parameterSet() { return &mParameterSet; } 25 filter(Okteta::Byte * result,Okteta::AbstractByteArrayModel * model,const Okteta::AddressRange & range) const26bool AndByteArrayFilter::filter(Okteta::Byte* result, 27 Okteta::AbstractByteArrayModel* model, const Okteta::AddressRange& range) const 28 { 29 const QByteArray operand = mParameterSet.operand(); 30 const int operandSize = operand.size(); 31 32 if (mParameterSet.alignAtEnd()) { 33 const int behindLastResult = range.width(); 34 int r = behindLastResult; 35 Okteta::Address m = range.nextBehindEnd(); 36 int nextBlockEnd = r - FilteredByteCountSignalLimit; 37 38 while (m > range.start()) { 39 int o = operandSize; 40 while (m > range.start() && o > 0) { 41 result[(r--) - 1] = model->byte((m--) - 1) & operand[(o--) - 1]; 42 } 43 44 if (r <= nextBlockEnd) { 45 nextBlockEnd -= FilteredByteCountSignalLimit; 46 emit filteredBytes(behindLastResult - r); 47 } 48 } 49 } else { 50 int r = 0; 51 Okteta::Address m = range.start(); 52 int nextBlockEnd = FilteredByteCountSignalLimit; 53 54 while (m <= range.end()) { 55 int o = 0; 56 while (m <= range.end() && o < operandSize) { 57 result[r++] = model->byte(m++) & operand[o++]; 58 } 59 60 if (r >= nextBlockEnd) { 61 nextBlockEnd += FilteredByteCountSignalLimit; 62 emit filteredBytes(r); 63 } 64 } 65 } 66 67 return true; 68 } 69