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()16 AndByteArrayFilter::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()24 AbstractByteArrayFilterParameterSet* AndByteArrayFilter::parameterSet() { return &mParameterSet; }
25 
filter(Okteta::Byte * result,Okteta::AbstractByteArrayModel * model,const Okteta::AddressRange & range) const26 bool 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