1 /* 2 This file is part of Konsole, an X terminal. 3 Copyright (C) 2000 by Stephan Kulow <coolo@kde.org> 4 5 Rewritten for QT4 by e_k <e_k at users.sourceforge.net>, Copyright (C)2008 6 7 This program is free software; you can redistribute it and/or modify 8 it under the terms of the GNU General Public License as published by 9 the Free Software Foundation; either version 2 of the License, or 10 (at your option) any later version. 11 12 This program is distributed in the hope that it will be useful, 13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 GNU General Public License for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with this program; if not, write to the Free Software 19 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 20 02110-1301 USA. 21 */ 22 23 #ifndef BLOCKARRAY_H 24 #define BLOCKARRAY_H 25 26 #include <unistd.h> 27 28 //#error Do not use in KDE 2.1 29 30 #define BlockSize (1 << 12) 31 #define ENTRIES ((BlockSize - sizeof(size_t) )) 32 33 namespace Konsole { 34 35 struct Block { 36 unsigned char data[ENTRIES] = {}; 37 size_t size = 0; 38 }; 39 40 41 class BlockArray { 42 public: 43 /** 44 * Creates a history file for holding 45 * maximal size blocks. If more blocks 46 * are requested, then it drops earlier 47 * added ones. 48 */ 49 BlockArray(); 50 51 /// destructor 52 ~BlockArray(); 53 54 /** 55 * adds the Block at the end of history. 56 * This may drop other blocks. 57 * 58 * The ownership on the block is transfered. 59 * An unique index number is returned for accessing 60 * it later (if not yet dropped then) 61 * 62 * Note, that the block may be dropped completely 63 * if history is turned off. 64 */ 65 size_t append(Block * block); 66 67 /** 68 * gets the block at the index. Function may return 69 * 0 if the block isn't available any more. 70 * 71 * The returned block is strictly readonly as only 72 * maped in memory - and will be invalid on the next 73 * operation on this class. 74 */ 75 const Block * at(size_t index); 76 77 /** 78 * reorders blocks as needed. If newsize is null, 79 * the history is emptied completely. The indices 80 * returned on append won't change their semantic, 81 * but they may not be valid after this call. 82 */ 83 bool setHistorySize(size_t newsize); 84 85 size_t newBlock(); 86 87 Block * lastBlock() const; 88 89 /** 90 * Convenient function to set the size in KBytes 91 * instead of blocks 92 */ 93 bool setSize(size_t newsize); 94 len()95 size_t len() const { 96 return length; 97 } 98 99 bool has(size_t index) const; 100 getCurrent()101 size_t getCurrent() const { 102 return current; 103 } 104 105 private: 106 void unmap(); 107 void increaseBuffer(); 108 void decreaseBuffer(size_t newsize); 109 110 size_t size; 111 // current always shows to the last inserted block 112 size_t current; 113 size_t index; 114 115 Block * lastmap; 116 size_t lastmap_index; 117 Block * lastblock; 118 119 int ion; 120 size_t length; 121 122 }; 123 124 } 125 126 #endif 127