aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Buland <mbuland@penny-arcade.com>2023-04-24 09:16:32 -0700
committerMike Buland <mbuland@penny-arcade.com>2023-04-24 09:16:32 -0700
commite1115a28535663cfe404791ede5bb7ca70399053 (patch)
treeb9d273abd126e410fb59d39d9c99072149a14c5c
parent44409ec7257cb20ff091079eb55dc7a8d4049cf9 (diff)
downloadlibbu++-e1115a28535663cfe404791ede5bb7ca70399053.tar.gz
libbu++-e1115a28535663cfe404791ede5bb7ca70399053.tar.bz2
libbu++-e1115a28535663cfe404791ede5bb7ca70399053.tar.xz
libbu++-e1115a28535663cfe404791ede5bb7ca70399053.zip
Additions to blob/utfstring for json.
-rw-r--r--src/unstable/blob.cpp47
-rw-r--r--src/unstable/blob.h10
-rw-r--r--src/unstable/settingsdrivertaf.cpp6
-rw-r--r--src/unstable/utfstring.cpp55
-rw-r--r--src/unstable/utfstring.h29
5 files changed, 107 insertions, 40 deletions
diff --git a/src/unstable/blob.cpp b/src/unstable/blob.cpp
index e72e265..23987f3 100644
--- a/src/unstable/blob.cpp
+++ b/src/unstable/blob.cpp
@@ -499,6 +499,26 @@ Bu::Blob::iterator &Bu::Blob::iterator::operator--()
499 return *this; 499 return *this;
500} 500}
501 501
502Bu::Blob::iterator &Bu::Blob::iterator::operator+=( int32_t iDelta )
503{
504 if( bForward )
505 iIndex += iDelta;
506 else
507 iIndex -= iDelta;
508
509 return *this;
510}
511
512Bu::Blob::iterator &Bu::Blob::iterator::operator-=( int32_t iDelta )
513{
514 if( bForward )
515 iIndex -= iDelta;
516 else
517 iIndex += iDelta;
518
519 return *this;
520}
521
502Bu::Blob::iterator Bu::Blob::iterator::operator+( int32_t iDelta ) const 522Bu::Blob::iterator Bu::Blob::iterator::operator+( int32_t iDelta ) const
503{ 523{
504 return iterator( pBlob, iIndex + iDelta, bForward ); 524 return iterator( pBlob, iIndex + iDelta, bForward );
@@ -541,7 +561,8 @@ bool Bu::Blob::iterator::operator!=( const Bu::Blob::const_iterator &rRhs )
541 return pBlob != rRhs.pBlob || iIndex != rRhs.iIndex; 561 return pBlob != rRhs.pBlob || iIndex != rRhs.iIndex;
542} 562}
543 563
544Bu::Blob::iterator &Bu::Blob::iterator::operator=( Bu::Blob::iterator &rRhs ) 564Bu::Blob::iterator &Bu::Blob::iterator::operator=(
565 const Bu::Blob::iterator &rRhs )
545{ 566{
546 pBlob = rRhs.pBlob; 567 pBlob = rRhs.pBlob;
547 iIndex = rRhs.iIndex; 568 iIndex = rRhs.iIndex;
@@ -651,6 +672,26 @@ Bu::Blob::const_iterator &Bu::Blob::const_iterator::operator--()
651 return *this; 672 return *this;
652} 673}
653 674
675Bu::Blob::const_iterator &Bu::Blob::const_iterator::operator+=( int32_t iDelta )
676{
677 if( bForward )
678 iIndex += iDelta;
679 else
680 iIndex -= iDelta;
681
682 return *this;
683}
684
685Bu::Blob::const_iterator &Bu::Blob::const_iterator::operator-=( int32_t iDelta )
686{
687 if( bForward )
688 iIndex -= iDelta;
689 else
690 iIndex += iDelta;
691
692 return *this;
693}
694
654Bu::Blob::const_iterator Bu::Blob::const_iterator::operator+( int32_t iDelta ) 695Bu::Blob::const_iterator Bu::Blob::const_iterator::operator+( int32_t iDelta )
655 const 696 const
656{ 697{
@@ -698,7 +739,7 @@ bool Bu::Blob::const_iterator::operator!=(
698} 739}
699 740
700Bu::Blob::const_iterator &Bu::Blob::const_iterator::operator=( 741Bu::Blob::const_iterator &Bu::Blob::const_iterator::operator=(
701 Bu::Blob::iterator &rRhs ) 742 const Bu::Blob::iterator &rRhs )
702{ 743{
703 pBlob = rRhs.pBlob; 744 pBlob = rRhs.pBlob;
704 iIndex = rRhs.iIndex; 745 iIndex = rRhs.iIndex;
@@ -708,7 +749,7 @@ Bu::Blob::const_iterator &Bu::Blob::const_iterator::operator=(
708} 749}
709 750
710Bu::Blob::const_iterator &Bu::Blob::const_iterator::operator=( 751Bu::Blob::const_iterator &Bu::Blob::const_iterator::operator=(
711 Bu::Blob::const_iterator &rRhs ) 752 const Bu::Blob::const_iterator &rRhs )
712{ 753{
713 pBlob = rRhs.pBlob; 754 pBlob = rRhs.pBlob;
714 iIndex = rRhs.iIndex; 755 iIndex = rRhs.iIndex;
diff --git a/src/unstable/blob.h b/src/unstable/blob.h
index d6c40e3..bda29d6 100644
--- a/src/unstable/blob.h
+++ b/src/unstable/blob.h
@@ -100,6 +100,8 @@ namespace Bu
100 iterator &operator++(); 100 iterator &operator++();
101 iterator &operator--( int32_t ); 101 iterator &operator--( int32_t );
102 iterator &operator--(); 102 iterator &operator--();
103 iterator &operator+=( int32_t iDelta );
104 iterator &operator-=( int32_t iDelta );
103 iterator operator+( int32_t iDelta ) const; 105 iterator operator+( int32_t iDelta ) const;
104 iterator operator-( int32_t iDelta ) const; 106 iterator operator-( int32_t iDelta ) const;
105 bool operator==( const iterator &rRhs ); 107 bool operator==( const iterator &rRhs );
@@ -107,7 +109,7 @@ namespace Bu
107 bool operator!=( const iterator &rRhs ); 109 bool operator!=( const iterator &rRhs );
108 bool operator!=( const const_iterator &rRhs ); 110 bool operator!=( const const_iterator &rRhs );
109 111
110 iterator &operator=( iterator &rRhs ); 112 iterator &operator=( const iterator &rRhs );
111 113
112 private: 114 private:
113 Blob *pBlob; 115 Blob *pBlob;
@@ -136,6 +138,8 @@ namespace Bu
136 const_iterator &operator++(); 138 const_iterator &operator++();
137 const_iterator &operator--( int32_t ); 139 const_iterator &operator--( int32_t );
138 const_iterator &operator--(); 140 const_iterator &operator--();
141 const_iterator &operator+=( int32_t iDelta );
142 const_iterator &operator-=( int32_t iDelta );
139 const_iterator operator+( int32_t iDelta ) const; 143 const_iterator operator+( int32_t iDelta ) const;
140 const_iterator operator-( int32_t iDelta ) const; 144 const_iterator operator-( int32_t iDelta ) const;
141 bool operator==( const iterator &rRhs ); 145 bool operator==( const iterator &rRhs );
@@ -143,8 +147,8 @@ namespace Bu
143 bool operator!=( const iterator &rRhs ); 147 bool operator!=( const iterator &rRhs );
144 bool operator!=( const const_iterator &rRhs ); 148 bool operator!=( const const_iterator &rRhs );
145 149
146 const_iterator &operator=( iterator &rRhs ); 150 const_iterator &operator=( const iterator &rRhs );
147 const_iterator &operator=( const_iterator &rRhs ); 151 const_iterator &operator=( const const_iterator &rRhs );
148 152
149 private: 153 private:
150 const Blob *pBlob; 154 const Blob *pBlob;
diff --git a/src/unstable/settingsdrivertaf.cpp b/src/unstable/settingsdrivertaf.cpp
index 3fd61b3..d99d0ba 100644
--- a/src/unstable/settingsdrivertaf.cpp
+++ b/src/unstable/settingsdrivertaf.cpp
@@ -48,7 +48,7 @@ void Bu::SettingsDriverTaf::init( const Bu::UtfString &sCompany,
48void Bu::SettingsDriverTaf::set( const Bu::UtfString &sKey, 48void Bu::SettingsDriverTaf::set( const Bu::UtfString &sKey,
49 const Bu::UtfString &sValue ) 49 const Bu::UtfString &sValue )
50{ 50{
51 Bu::StringList lPath = sKey.get().split('/'); 51 Bu::StringList lPath = Bu::String(sKey.get()).split('/');
52 Bu::StringList::iterator i = lPath.begin(); 52 Bu::StringList::iterator i = lPath.begin();
53 Bu::StringList::iterator in; 53 Bu::StringList::iterator in;
54 Bu::TafGroup *pGrp = pRoot; 54 Bu::TafGroup *pGrp = pRoot;
@@ -74,7 +74,7 @@ void Bu::SettingsDriverTaf::set( const Bu::UtfString &sKey,
74Bu::UtfString Bu::SettingsDriverTaf::get( const Bu::UtfString &sKey, 74Bu::UtfString Bu::SettingsDriverTaf::get( const Bu::UtfString &sKey,
75 const Bu::UtfString &sValue ) 75 const Bu::UtfString &sValue )
76{ 76{
77 Bu::StringList lPath = sKey.get().split('/'); 77 Bu::StringList lPath = Bu::String(sKey.get()).split('/');
78 Bu::StringList::iterator i = lPath.begin(); 78 Bu::StringList::iterator i = lPath.begin();
79 Bu::StringList::iterator in; 79 Bu::StringList::iterator in;
80 Bu::TafGroup *pGrp = pRoot; 80 Bu::TafGroup *pGrp = pRoot;
@@ -98,5 +98,7 @@ Bu::UtfString Bu::SettingsDriverTaf::get( const Bu::UtfString &sKey,
98 } 98 }
99 i = in; 99 i = in;
100 } 100 }
101
102 return Bu::UtfString();
101} 103}
102 104
diff --git a/src/unstable/utfstring.cpp b/src/unstable/utfstring.cpp
index 21b3f82..6217f80 100644
--- a/src/unstable/utfstring.cpp
+++ b/src/unstable/utfstring.cpp
@@ -8,6 +8,7 @@
8#include "bu/utfstring.h" 8#include "bu/utfstring.h"
9 9
10#include "bu/string.h" 10#include "bu/string.h"
11#include "bu/blob.h"
11#include "bu/stream.h" 12#include "bu/stream.h"
12#include "bu/config.h" 13#include "bu/config.h"
13#include "bu/sio.h" 14#include "bu/sio.h"
@@ -36,11 +37,16 @@ Bu::UtfString::UtfString( const Bu::String &sInput, Encoding eEnc )
36 set( sInput, eEnc ); 37 set( sInput, eEnc );
37} 38}
38 39
39Bu::UtfString::UtfString( const char *sInput, Encoding eEnc ) 40Bu::UtfString::UtfString( const Bu::Blob &sInput, Encoding eEnc )
40{ 41{
41 set( sInput, eEnc ); 42 set( sInput, eEnc );
42} 43}
43 44
45Bu::UtfString::UtfString( const char *sInput, Encoding eEnc )
46{
47 set( Bu::Blob(sInput), eEnc );
48}
49
44Bu::UtfString::~UtfString() 50Bu::UtfString::~UtfString()
45{ 51{
46} 52}
@@ -57,6 +63,11 @@ Bu::UtfString::const_iterator Bu::UtfString::begin() const
57 63
58void Bu::UtfString::set( const Bu::String &sInput, Encoding eEnc ) 64void Bu::UtfString::set( const Bu::String &sInput, Encoding eEnc )
59{ 65{
66 set( sInput, eEnc );
67}
68
69void Bu::UtfString::set( const Bu::Blob &sInput, Encoding eEnc )
70{
60 switch( eEnc ) 71 switch( eEnc )
61 { 72 {
62 case Utf8: 73 case Utf8:
@@ -122,9 +133,9 @@ void Bu::UtfString::append( const UtfString &rSrc )
122 iCharLen += rSrc.iCharLen; 133 iCharLen += rSrc.iCharLen;
123} 134}
124 135
125void Bu::UtfString::setUtf8( const Bu::String &sInput ) 136void Bu::UtfString::setUtf8( const Bu::Blob &sInput )
126{ 137{
127 for( Bu::String::const_iterator i = sInput.begin(); i; i++ ) 138 for( Bu::Blob::const_iterator i = sInput.begin(); i; i++ )
128 { 139 {
129 if( ((int)(uint8_t)*i)&0x80 ) 140 if( ((int)(uint8_t)*i)&0x80 )
130 { 141 {
@@ -145,9 +156,9 @@ void Bu::UtfString::setUtf8( const Bu::String &sInput )
145 } 156 }
146} 157}
147 158
148void Bu::UtfString::setUtf16( const Bu::String &sInput ) 159void Bu::UtfString::setUtf16( const Bu::Blob &sInput )
149{ 160{
150// Bu::String::const_iterator i = sInput.begin(); 161// Bu::Blob::const_iterator i = sInput.begin();
151 if( (uint8_t)*sInput.begin() == 0xFF && 162 if( (uint8_t)*sInput.begin() == 0xFF &&
152 (uint8_t)*(sInput.begin()+1) == 0xFE ) 163 (uint8_t)*(sInput.begin()+1) == 0xFE )
153 { 164 {
@@ -157,9 +168,9 @@ void Bu::UtfString::setUtf16( const Bu::String &sInput )
157 setUtf16be( sInput ); 168 setUtf16be( sInput );
158} 169}
159 170
160void Bu::UtfString::setUtf16be( const Bu::String &sInput ) 171void Bu::UtfString::setUtf16be( const Bu::Blob &sInput )
161{ 172{
162 Bu::String::const_iterator i = sInput.begin(); 173 Bu::Blob::const_iterator i = sInput.begin();
163 if( (uint8_t)*sInput.begin() == 0xFE && 174 if( (uint8_t)*sInput.begin() == 0xFE &&
164 (uint8_t)*(sInput.begin()+1) == 0xFF ) 175 (uint8_t)*(sInput.begin()+1) == 0xFF )
165 176
@@ -184,9 +195,9 @@ void Bu::UtfString::setUtf16be( const Bu::String &sInput )
184 } 195 }
185} 196}
186 197
187void Bu::UtfString::setUtf16le( const Bu::String &sInput ) 198void Bu::UtfString::setUtf16le( const Bu::Blob &sInput )
188{ 199{
189 Bu::String::const_iterator i = sInput.begin(); 200 Bu::Blob::const_iterator i = sInput.begin();
190 if( (uint8_t)*sInput.begin() == 0xFF && 201 if( (uint8_t)*sInput.begin() == 0xFF &&
191 (uint8_t)*(sInput.begin()+1) == 0xFE ) 202 (uint8_t)*(sInput.begin()+1) == 0xFE )
192 { 203 {
@@ -210,9 +221,9 @@ void Bu::UtfString::setUtf16le( const Bu::String &sInput )
210 } 221 }
211} 222}
212 223
213void Bu::UtfString::setUtf32( const Bu::String &sInput ) 224void Bu::UtfString::setUtf32( const Bu::Blob &sInput )
214{ 225{
215 Bu::String::const_iterator i = sInput.begin(); 226 Bu::Blob::const_iterator i = sInput.begin();
216 if( (uint8_t)*i == 0x00 && 227 if( (uint8_t)*i == 0x00 &&
217 (uint8_t)*(++i) == 0x00 && 228 (uint8_t)*(++i) == 0x00 &&
218 (uint8_t)*(++i) == 0xFF && 229 (uint8_t)*(++i) == 0xFF &&
@@ -224,9 +235,9 @@ void Bu::UtfString::setUtf32( const Bu::String &sInput )
224 setUtf32be( sInput ); 235 setUtf32be( sInput );
225} 236}
226 237
227void Bu::UtfString::setUtf32be( const Bu::String &sInput ) 238void Bu::UtfString::setUtf32be( const Bu::Blob &sInput )
228{ 239{
229 Bu::String::const_iterator i = sInput.begin(); 240 Bu::Blob::const_iterator i = sInput.begin();
230 if( (uint8_t)*i == 0x00 && 241 if( (uint8_t)*i == 0x00 &&
231 (uint8_t)*(++i) == 0x00 && 242 (uint8_t)*(++i) == 0x00 &&
232 (uint8_t)*(++i) == 0xFE && 243 (uint8_t)*(++i) == 0xFE &&
@@ -250,9 +261,9 @@ void Bu::UtfString::setUtf32be( const Bu::String &sInput )
250 } 261 }
251} 262}
252 263
253void Bu::UtfString::setUtf32le( const Bu::String &sInput ) 264void Bu::UtfString::setUtf32le( const Bu::Blob &sInput )
254{ 265{
255 Bu::String::const_iterator i = sInput.begin(); 266 Bu::Blob::const_iterator i = sInput.begin();
256 if( (uint8_t)*i == 0x00 && 267 if( (uint8_t)*i == 0x00 &&
257 (uint8_t)*(++i) == 0x00 && 268 (uint8_t)*(++i) == 0x00 &&
258 (uint8_t)*(++i) == 0xFF && 269 (uint8_t)*(++i) == 0xFF &&
@@ -443,12 +454,12 @@ int Bu::UtfString::writePoint( Bu::Stream &sOut, const Bu::UtfChar &c,
443 454
444int32_t Bu::UtfString::toInt32( int iRadix ) const 455int32_t Bu::UtfString::toInt32( int iRadix ) const
445{ 456{
446 return strtol( get().getStr(), NULL, iRadix ); 457 return strtol( get().getData(), NULL, iRadix );
447} 458}
448 459
449int64_t Bu::UtfString::toInt64( int iRadix ) const 460int64_t Bu::UtfString::toInt64( int iRadix ) const
450{ 461{
451 return strtoll( get().getStr(), NULL, iRadix ); 462 return strtoll( get().getData(), NULL, iRadix );
452} 463}
453 464
454void Bu::UtfString::writeUtf8( Bu::Stream &sOut ) const 465void Bu::UtfString::writeUtf8( Bu::Stream &sOut ) const
@@ -626,7 +637,7 @@ bool Bu::UtfString::operator==( const Bu::UtfString &rhs ) const
626 return aData == rhs.aData; 637 return aData == rhs.aData;
627} 638}
628 639
629bool Bu::UtfString::operator==( const Bu::String &rhs ) const 640bool Bu::UtfString::operator==( const Bu::Blob &rhs ) const
630{ 641{
631 // Nieve comparison 642 // Nieve comparison
632 if( aData.getSize() != rhs.getSize() ) 643 if( aData.getSize() != rhs.getSize() )
@@ -718,11 +729,11 @@ bool Bu::UtfString::operator>=( const Bu::UtfString &rhs ) const
718 return false; 729 return false;
719} 730}
720 731
721Bu::String Bu::UtfString::get( Encoding eEnc ) const 732Bu::Blob Bu::UtfString::get( Encoding eEnc ) const
722{ 733{
723 Bu::MemBuf mb; 734 Bu::MemBuf mb;
724 write( mb, eEnc ); 735 write( mb, eEnc );
725 return mb.getString(); 736 return Bu::Blob( mb.getString().getStr(), mb.getString().getSize() );
726} 737}
727 738
728void Bu::UtfString::debug() const 739void Bu::UtfString::debug() const
@@ -745,9 +756,9 @@ void Bu::UtfString::debug() const
745 sio << sio.nl; 756 sio << sio.nl;
746} 757}
747/* 758/*
748void Bu::UtfString::debugUtf8( const Bu::String &sUtf8 ) 759void Bu::UtfString::debugUtf8( const Bu::Blob &sUtf8 )
749{ 760{
750 for( Bu::String::const_iterator i = sUtf8.begin(); i; i++ ) 761 for( Bu::Blob::const_iterator i = sUtf8.begin(); i; i++ )
751 { 762 {
752 if( i != sUtf8.begin() ) 763 if( i != sUtf8.begin() )
753 sio << ", "; 764 sio << ", ";
diff --git a/src/unstable/utfstring.h b/src/unstable/utfstring.h
index 5a72948..3c64a75 100644
--- a/src/unstable/utfstring.h
+++ b/src/unstable/utfstring.h
@@ -72,6 +72,7 @@ namespace Bu
72 72
73 UtfString(); 73 UtfString();
74 UtfString( const Bu::String &sInput, Encoding eEnc=Utf8 ); 74 UtfString( const Bu::String &sInput, Encoding eEnc=Utf8 );
75 UtfString( const Bu::Blob &sInput, Encoding eEnc=Utf8 );
75 UtfString( const char *sInput, Encoding eEnc=Utf8 ); 76 UtfString( const char *sInput, Encoding eEnc=Utf8 );
76 virtual ~UtfString(); 77 virtual ~UtfString();
77 78
@@ -182,6 +183,14 @@ namespace Bu
182 * string literals in code. 183 * string literals in code.
183 */ 184 */
184 void set( const Bu::String &sInput, Encoding eEnc=Utf8 ); 185 void set( const Bu::String &sInput, Encoding eEnc=Utf8 );
186
187 /**
188 * Set the value of the entire string based on the given input and
189 * encoding. The default encoding is Utf8, which is compatible with
190 * 7-bit ascii, so it's a great choice for setting UtfStrings from
191 * string literals in code.
192 */
193 void set( const Bu::Blob &bInput, Encoding eEnc=Utf8 );
185 194
186 /** 195 /**
187 * This encodes the UtfString in the given encoding and outputs it to 196 * This encodes the UtfString in the given encoding and outputs it to
@@ -204,10 +213,10 @@ namespace Bu
204 213
205 /** 214 /**
206 * This encodes the UtfString in the given encoding and returns it as 215 * This encodes the UtfString in the given encoding and returns it as
207 * a binary Bu::String. Like write, this also includes the proper BOM 216 * a binary Bu::Blob. Like write, this also includes the proper BOM
208 * at the begining. 217 * at the begining.
209 */ 218 */
210 Bu::String get( Encoding eEnc=Utf8 ) const; 219 Bu::Blob get( Encoding eEnc=Utf8 ) const;
211 220
212 void debug() const; 221 void debug() const;
213 222
@@ -228,7 +237,7 @@ namespace Bu
228 UtfChar nextChar( int &iIndex ) const; 237 UtfChar nextChar( int &iIndex ) const;
229 238
230 bool operator==( const Bu::UtfString &rhs ) const; 239 bool operator==( const Bu::UtfString &rhs ) const;
231 bool operator==( const Bu::String &rhs ) const; 240 bool operator==( const Bu::Blob &rhs ) const;
232 bool operator==( const char *rhs ) const; 241 bool operator==( const char *rhs ) const;
233 UtfString &operator+=( const Bu::UtfString &rhs ); 242 UtfString &operator+=( const Bu::UtfString &rhs );
234 UtfString &operator+=( const UtfChar &rhs ); 243 UtfString &operator+=( const UtfChar &rhs );
@@ -241,13 +250,13 @@ namespace Bu
241 private: 250 private:
242 void append16( uint16_t i ) { aData.append( i ); } 251 void append16( uint16_t i ) { aData.append( i ); }
243 252
244 void setUtf8( const Bu::String &sInput ); 253 void setUtf8( const Bu::Blob &sInput );
245 void setUtf16( const Bu::String &sInput ); 254 void setUtf16( const Bu::Blob &sInput );
246 void setUtf16be( const Bu::String &sInput ); 255 void setUtf16be( const Bu::Blob &sInput );
247 void setUtf16le( const Bu::String &sInput ); 256 void setUtf16le( const Bu::Blob &sInput );
248 void setUtf32( const Bu::String &sInput ); 257 void setUtf32( const Bu::Blob &sInput );
249 void setUtf32be( const Bu::String &sInput ); 258 void setUtf32be( const Bu::Blob &sInput );
250 void setUtf32le( const Bu::String &sInput ); 259 void setUtf32le( const Bu::Blob &sInput );
251 260
252 void writeUtf8( Bu::Stream &sOut ) const; 261 void writeUtf8( Bu::Stream &sOut ) const;
253 void writeUtf16be( Bu::Stream &sOut ) const; 262 void writeUtf16be( Bu::Stream &sOut ) const;