aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Buland <eichlan@xagasoft.com>2019-11-11 05:01:29 -0800
committerMike Buland <eichlan@xagasoft.com>2019-11-11 05:01:29 -0800
commit96759377ae8a4394d325747f597fe5b60afabf6e (patch)
treedd2daea517d126edb782924cf6003b5ae24cbe50
parentd5098782e5645d39b5e92f150e187e7194ef055a (diff)
downloadlibbu++-96759377ae8a4394d325747f597fe5b60afabf6e.tar.gz
libbu++-96759377ae8a4394d325747f597fe5b60afabf6e.tar.bz2
libbu++-96759377ae8a4394d325747f597fe5b60afabf6e.tar.xz
libbu++-96759377ae8a4394d325747f597fe5b60afabf6e.zip
Working on TextBuilder & Text.
Seriously thinking about changing Text to just use full codepoints. It would be much less work, more reliable and predictable, easier to use, but would use twice the memory.
-rw-r--r--src/unstable/blobbuilder.cpp2
-rw-r--r--src/unstable/textbuilder.cpp281
-rw-r--r--src/unstable/textbuilder.h78
-rw-r--r--src/unstable/textcodec.cpp17
-rw-r--r--src/unstable/textcodec.h41
-rw-r--r--src/unstable/textcodecutf8.cpp25
-rw-r--r--src/unstable/textcodecutf8.h26
7 files changed, 469 insertions, 1 deletions
diff --git a/src/unstable/blobbuilder.cpp b/src/unstable/blobbuilder.cpp
index 43c0779..fd62cb0 100644
--- a/src/unstable/blobbuilder.cpp
+++ b/src/unstable/blobbuilder.cpp
@@ -93,7 +93,7 @@ Bu::BlobBuilderCore::BlobBuilderCore( const Bu::BlobBuilderCore &rSrc ) :
93 pLast( 0 ), 93 pLast( 0 ),
94 iLength( rSrc.iLength ) 94 iLength( rSrc.iLength )
95{ 95{
96 96 throw Bu::ExceptionBase("Not yet implemented.");
97} 97}
98 98
99Bu::BlobBuilderCore::~BlobBuilderCore() 99Bu::BlobBuilderCore::~BlobBuilderCore()
diff --git a/src/unstable/textbuilder.cpp b/src/unstable/textbuilder.cpp
index 73271f8..af4dbac 100644
--- a/src/unstable/textbuilder.cpp
+++ b/src/unstable/textbuilder.cpp
@@ -5,4 +5,285 @@
5 * terms of the license contained in the file LICENSE. 5 * terms of the license contained in the file LICENSE.
6 */ 6 */
7 7
8#include "bu/textbuilder.h"
9
10#include "bu/exceptionbase.h"
11#include "bu/text.h"
12
13#define PAGE_SIZE 16
14
15Bu::TextBuilderCore::Chunk::Chunk( const CodePoint *pSrc, int32_t iLength ) :
16 iLength( iLength ),
17 pData( 0 ),
18 pNext( 0 )
19{
20 if( iLength < PAGE_SIZE )
21 {
22 pData = new CodePoint[PAGE_SIZE];
23 }
24 else
25 {
26 pData = new CodePoint[iLength];
27 }
28 memcpy( pData, pSrc, iLength*sizeof(CodePoint) );
29}
30
31Bu::TextBuilderCore::Chunk::~Chunk()
32{
33 delete[] pData;
34 pData = 0;
35 pNext = 0;
36}
37
38void Bu::TextBuilderCore::Chunk::append( const Bu::CodePoint *&pSrc,
39 int32_t &iLength )
40{
41 if( this->iLength >= PAGE_SIZE )
42 {
43 // This chink is full, just return.
44 return;
45 }
46 int32_t iCopy = PAGE_SIZE-this->iLength;
47 if( iCopy > iLength )
48 {
49 iCopy = iLength;
50 }
51 memcpy( pData+this->iLength, pSrc, iCopy*sizeof(Bu::CodePoint) );
52 this->iLength += iCopy;
53 pSrc += iCopy;
54 iLength -= iCopy;
55}
56
57Bu::TextBuilderCore::Chunk *Bu::TextBuilderCore::Chunk::split( int32_t iIndex )
58{
59 if( iIndex == 0 )
60 return NULL;
61
62 if( iIndex >= iLength )
63 return NULL;
64
65 Chunk *pNew = new Chunk( pData+iIndex, iLength-iIndex );
66 iLength -= iIndex;
67 pNew->pNext = pNext;
68 pNext = pNew;
69
70 return pNew;
71}
72
73
74//////
75// TextBuilderCore
76//
77Bu::TextBuilderCore::TextBuilderCore() :
78 pFirst( 0 ),
79 pLast( 0 ),
80 iLength( 0 )
81{
82}
83
84Bu::TextBuilderCore::TextBuilderCore( const TextBuilderCore &rSrc ) :
85 pFirst( 0 ),
86 pLast( 0 ),
87 iLength( rSrc.iLength )
88{
89 throw Bu::ExceptionBase("Not yet implemented.");
90}
91
92Bu::TextBuilderCore::~TextBuilderCore()
93{
94 clear();
95}
96
97void Bu::TextBuilderCore::clear()
98{
99 Chunk *pCur = pFirst;
100 while( pCur )
101 {
102 Chunk *pNext = pCur->pNext;
103 delete pCur;
104 pCur = pNext;
105 }
106 pFirst = pLast = 0;
107 iLength = 0;
108}
109
110void Bu::TextBuilderCore::append( const CodePoint *pSrc, int32_t iLength )
111{
112 this->iLength += iLength;
113 if( pFirst == 0 )
114 {
115 // Nothing in the list, just add a chunk.
116 pFirst = pLast = new Chunk( pSrc, iLength );
117 return;
118 }
119 else if( pLast->iLength < PAGE_SIZE )
120 {
121 // Append to the last chunk first, this will modify pSrc & iLength.
122 pLast->append( pSrc, iLength );
123 }
124
125 // If there's unused data at the end, append it now.
126 if( iLength > 0 )
127 {
128 pLast->pNext = new Chunk( pSrc, iLength );
129 pLast = pLast->pNext;
130 }
131}
132
133void Bu::TextBuilderCore::prepend( const CodePoint *pSrc, int32_t iLength )
134{
135 if( pFirst == 0 )
136 {
137 pFirst = pLast = new Chunk( pSrc, iLength );
138 }
139 else
140 {
141 Chunk *pNew = new Chunk( pSrc, iLength );
142 pNew->pNext = pFirst;
143 pFirst = pNew;
144 }
145 this->iLength += iLength;
146}
147
148void Bu::TextBuilderCore::insert( int32_t iBefore, const CodePoint *pSrc, int32_t iLength )
149{
150 if( iBefore <= 0 )
151 {
152 prepend( pSrc, iLength );
153 return;
154 }
155 if( iBefore >= this->iLength )
156 {
157 append( pSrc, iLength );
158 return;
159 }
160
161 Chunk *pCur = pFirst;
162 while( pCur )
163 {
164 if( iBefore == 0 )
165 {
166 // Insert between chunks, no splitting required.
167 Chunk *pNew = new Chunk( pSrc, iLength );
168 pNew->pNext = pCur->pNext;
169 pCur->pNext = pNew;
170 if( pLast == pCur )
171 pLast = pNew;
172 }
173 if( iBefore < pCur->iLength )
174 {
175 // This is the chunk we need to split.
176 Chunk *pNew = pCur->split( iBefore );
177 if( pLast == pCur )
178 pLast = pNew;
179 continue;
180 }
181 pCur = pCur->pNext;
182 }
183 this->iLength = iLength;
184}
185
186void Bu::TextBuilderCore::set( const CodePoint *pSrc, int32_t iLength )
187{
188 clear();
189 append( pSrc, iLength );
190}
191
192void Bu::TextBuilderCore::copyTo( void *pDestRaw, int32_t iLength )
193{
194
195}
196
197Bu::CodePoint Bu::TextBuilderCore::getAt( int32_t iIndex ) const
198{
199 if( iIndex < 0 || iIndex >= iLength )
200 throw Bu::ExceptionBase("Requested index is out of range.");
201
202 Chunk *pCur = pFirst;
203 while( iIndex >= pCur->iLength )
204 {
205 iIndex -= pCur->iLength;
206 pCur = pCur->pNext;
207 }
208 return pCur->pData[iIndex];
209}
210
211/////
212// TextBuilder
213//
214
215Bu::TextBuilder::TextBuilder()
216{
217}
218
219Bu::TextBuilder::TextBuilder( const Text &rSrc )
220{
221}
222
223Bu::TextBuilder::TextBuilder( const TextBuilder &rSrc ) :
224 Bu::SharedCore<Bu::TextBuilder, Bu::TextBuilderCore>( rSrc )
225{
226}
227
228Bu::TextBuilder::~TextBuilder()
229{
230}
231
232void Bu::TextBuilder::set( const Text &rSrc )
233{
234 _hardCopy();
235 core->set( rSrc.getData(), rSrc.getSize() );
236}
237
238void Bu::TextBuilder::append( const Text &rSrc )
239{
240 _hardCopy();
241}
242
243void Bu::TextBuilder::append( const CodePoint *pSrc, int32_t iLength )
244{
245 _hardCopy();
246}
247
248void Bu::TextBuilder::prepend( const Text &rSrc )
249{
250 _hardCopy();
251}
252
253void Bu::TextBuilder::insert( const Text &rSrc )
254{
255 _hardCopy();
256}
257
258void Bu::TextBuilder::clear()
259{
260 _hardCopy();
261}
262
263int32_t Bu::TextBuilder::getSize() const
264{
265 return core->iLength;
266}
267
268Bu::Text Bu::TextBuilder::getText() const
269{
270 return Text( *this );
271}
272
273Bu::CodePoint Bu::TextBuilder::operator[]( int32_t iIndex ) const
274{
275 return core->getAt( iIndex );
276}
277
278Bu::TextBuilder &Bu::TextBuilder::operator=( const Text &rSrc )
279{
280 set( rSrc );
281 return *this;
282}
283
284Bu::TextBuilder &Bu::TextBuilder::operator==( const Text &rSrc )
285{
286 set( pSrc );
287 return *this;
288}
8 289
diff --git a/src/unstable/textbuilder.h b/src/unstable/textbuilder.h
index 73271f8..22fa653 100644
--- a/src/unstable/textbuilder.h
+++ b/src/unstable/textbuilder.h
@@ -5,4 +5,82 @@
5 * terms of the license contained in the file LICENSE. 5 * terms of the license contained in the file LICENSE.
6 */ 6 */
7 7
8#ifndef BU_TEXT_BUILDER_H
9#define BU_TEXT_BUILDER_H
10
11#include <stdint.h>
12#include "bu/sharedcore.h"
13#include "bu/text.h"
14
15namespace Bu
16{
17 class TextBuilder;
18
19 /** @cond DEVEL */
20 class TextBuilderCore
21 {
22 friend class TextBuilder;
23 friend class SharedCore<TextBuilder, TextBuilderCore>;
24 private:
25 class Chunk
26 {
27 public:
28 Chunk( const CodePoint *pSrc, int32_t iLength );
29 ~Chunk();
30
31 void append( const CodePoint *&pSrc, int32_t &iLength );
32
33 Chunk *split( int32_t iIndex );
34
35 int32_t iLength;
36 CodePoint *pData;
37 Chunk *pNext;
38 };
39
40 TextBuilderCore();
41 TextBuilderCore( const TextBuilderCore &rSrc );
42 virtual ~TextBuilderCore();
43
44 void clear();
45 void append( const CodePoint *pSrc, int32_t iLength );
46 void prepend( const CodePoint *pSrc, int32_t iLength );
47 void insert( int32_t iBefore, const CodePoint *pSrc, int32_t iLength );
48 void set( const CodePoint *pSrc, int32_t iLength );
49 void copyTo( void *pDestRaw, int32_t iLength );
50 CodePoint getAt( int32_t iIndex ) const;
51
52 Chunk *pFirst;
53 Chunk *pLast;
54 int32_t iLength;
55 };
56
57 class TextBuilder : public Bu::SharedCore<TextBuilder, TextBuilderCore>
58 {
59 protected:
60 using SharedCore<TextBuilder, TextBuilderCore>::core;
61 using SharedCore<TextBuilder, TextBuilderCore>::_hardCopy;
62
63 public:
64 TextBuilder();
65 TextBuilder( const Text &rSrc );
66 TextBuilder( const TextBuilder &rSrc );
67 virtual ~TextBuilder();
68
69 void set( const Text &rSrc );
70 void append( const Text &rSrc );
71 void append( const CodePoint *pSrc, int32_t iLength );
72 void prepend( const Text &rSrc );
73 void insert( const Text &rSrc );
74 void clear();
75
76 int32_t getSize() const;
77 Text getText() const;
78 CodePoint operator[]( int32_t iIndex ) const;
79
80 TextBuilder &operator=( const Text &rSrc );
81 TextBuilder &operator==( const Text &rSrc );
82 };
83}
84
85#endif
8 86
diff --git a/src/unstable/textcodec.cpp b/src/unstable/textcodec.cpp
index e69de29..0ac791e 100644
--- a/src/unstable/textcodec.cpp
+++ b/src/unstable/textcodec.cpp
@@ -0,0 +1,17 @@
1/*
2 * Copyright (C) 2007-2019 Xagasoft, All rights reserved.
3 *
4 * This file is part of the libbu++ library and is released under the
5 * terms of the license contained in the file LICENSE.
6 */
7
8#include "bu/textcodec.h"
9
10Bu::TextCodec::TextCodec()
11{
12}
13
14Bu::TextCodec::~TextCodec()
15{
16}
17
diff --git a/src/unstable/textcodec.h b/src/unstable/textcodec.h
index e69de29..6ae392e 100644
--- a/src/unstable/textcodec.h
+++ b/src/unstable/textcodec.h
@@ -0,0 +1,41 @@
1/*
2 * Copyright (C) 2007-2019 Xagasoft, All rights reserved.
3 *
4 * This file is part of the libbu++ library and is released under the
5 * terms of the license contained in the file LICENSE.
6 */
7
8#ifndef TEXT_CODEC_H
9#define TEXT_CODEC_H
10
11#include "bu/text.h"
12#include "bu/blob.h"
13
14namespace Bu
15{
16 class Text;
17 class Blob;
18 class TextBuilder;
19 class BlobBuilder;
20
21 /**
22 * Represents a textual format and the routines to convert from that
23 * format to unicode code points and vica versa.
24 */
25 class TextCodec
26 {
27 public:
28 TextCodec();
29 virtual ~TextCodec();
30
31// virtual Blob encode( const Text &rSource );
32// virtual Text decode( const Blob &rSource, int32_t &rBytesUsed );
33
34 virtual void encode( BlobBuilder &rTarget, const Text &rSource )=0;
35 virtual int32_t decode( TextBuilder &rTarget, const Blob &rSource )=0;
36
37 private:
38 };
39};
40
41#endif
diff --git a/src/unstable/textcodecutf8.cpp b/src/unstable/textcodecutf8.cpp
index e69de29..ce4e0a2 100644
--- a/src/unstable/textcodecutf8.cpp
+++ b/src/unstable/textcodecutf8.cpp
@@ -0,0 +1,25 @@
1/*
2 * Copyright (C) 2007-2019 Xagasoft, All rights reserved.
3 *
4 * This file is part of the libbu++ library and is released under the
5 * terms of the license contained in the file LICENSE.
6 */
7
8#include "bu/textcodecutf8.h"
9
10Bu::TextCodecUtf8::TextCodecUtf8()
11{
12}
13
14Bu::TextCodecUtf8::~TextCodecUtf8()
15{
16}
17
18void Bu::TextCodecUtf8::encode( BlobBuilder &rTarget, const Text &rSource )
19{
20}
21
22int32_t Bu::TextCodecUtf8::decode( TextBuilder &rTarget, const Blob &rSource )
23{
24}
25
diff --git a/src/unstable/textcodecutf8.h b/src/unstable/textcodecutf8.h
index e69de29..f565f57 100644
--- a/src/unstable/textcodecutf8.h
+++ b/src/unstable/textcodecutf8.h
@@ -0,0 +1,26 @@
1/*
2 * Copyright (C) 2007-2019 Xagasoft, All rights reserved.
3 *
4 * This file is part of the libbu++ library and is released under the
5 * terms of the license contained in the file LICENSE.
6 */
7
8#ifndef TEXT_CODEC_UTF8_H
9#define TEXT_CODEC_UTF8_H
10
11#include "bu/textcodec.h"
12
13namespace Bu
14{
15 class TextCodecUtf8 : public TextCodec
16 {
17 public:
18 TextCodecUtf8();
19 virtual ~TextCodecUtf8();
20
21 virtual void encode( BlobBuilder &rTarget, const Text &rSource );
22 virtual int32_t decode( TextBuilder &rTarget, const Blob &rSource );
23 };
24}
25
26#endif