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