00001 #ifndef __J2K__JString_Add_CPP__
00002 #define __J2K__JString_Add_CPP__
00003
00004 #include <j2k/Fred/String/String.hpp>
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 void JString::CopyBeforeWrite() {
00027 if ( pData == strNull || pData->nbRefs > 1 || pData->lock != 0 ) {
00028 JStringData* sd = pData;
00029 pData = new JStringData( *sd );
00030 sd->Dec();
00031 }
00032
00033 #ifdef __J2K__DEBUG
00034 else {
00035 printf("Data is unique, so no copy was made !\n");
00036 }
00037 #endif
00038
00039 }
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053 void JString::Add( const char* s1, const char* s2,
00054 size_t Len1, size_t Len2, size_t LenExtra )
00055 {
00056
00057
00058
00059 if ( s1 == NULL || *s2 == (char)NULL ) { Len1 = 0; }
00060 if ( s2 == NULL || *s2 == (char)NULL ) { Len2 = 0; }
00061
00062 size_t newLen = Len1 + Len2;
00063
00064
00065
00066 JStringData* sd = pData;
00067
00068 pData = new JStringData( newLen + LenExtra );
00069
00070
00071
00072 if ( Len1 > 0 ) { memcpy( pData->data, s1, Len1 ); }
00073 if ( Len2 > 0 ) { memcpy( pData->data + Len1, s2, Len2 ); }
00074
00075 pData->length = newLen;
00076 pData->data[ newLen ] = '\0';
00077
00078
00079
00080
00081
00082
00083
00084 sd->Dec();
00085 }
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096 void JString::Append(const char* s, size_t Len ) {
00097
00098 if ( s == NULL || *s == (char)NULL ) return;
00099
00100 size_t newSize = pData->length + Len;
00101
00102 if ( pData == strNull || pData->nbRefs > 1 || newSize > pData->bufferSize )
00103 {
00104
00105
00106
00107
00108
00109
00110 Add(pData->data, s, pData->length, Len );
00111
00112 } else {
00113
00114
00115
00116
00117
00118 memcpy( (pData->data + pData->length), s, Len);
00119
00120 assert( (pData->length + Len ) <= (pData->bufferSize) );
00121 pData->length = newSize;
00122 pData->data[ pData->length ] = '\0';
00123 }
00124 }
00125
00126 const JString& JString::operator=( const JString& src ) {
00127 if ( this != &src && pData != src.pData ) {
00128 JStringData* sd = pData;
00129 pData = src.pData;
00130 src.pData->Inc();
00131
00132
00133 sd->Dec();
00134 }
00135 return *this;
00136 }
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156 const JString& JString::operator=(const char* s) {
00157 if ( s == NULL || *s == (char)NULL ) {
00158 if ( pData != NULL ) pData->Dec();
00159 pData = strNull;
00160 } else {
00161 JStringData* sd = pData;
00162 pData = new JStringData( s );
00163 sd->Dec();
00164 }
00165 return *this;
00166 }
00167
00168 const JString& JString::operator=(char ch) {
00169 JStringData* sd = pData;
00170
00171 if ( ch == '\0' || ch == (char)NULL ) {
00172 pData = strNull;
00173 } else {
00174 pData = new JStringData( ch, 1 );
00175 }
00176
00177
00178 sd->Dec();
00179 return *this;
00180 }
00181
00182 JString operator+(const JString& S1, const JString& S2) {
00183 JString* s = new JString();
00184
00185 if ( S1.pData == strNull ) {
00186
00187 s->pData = S2.pData;
00188
00189 S2.pData->Inc();
00190
00191
00192
00193 } else if ( S2.pData == strNull ) {
00194
00195 s->pData = S1.pData;
00196 S1.pData->Inc();
00197 } else {
00198
00199
00200
00201 S1.pData->data[ S1.pData->length ] = '\0';
00202 S2.pData->data[ S2.pData->length ] = '\0';
00203
00204 s->Add( S1.pData->data, S2.pData->data,
00205 S1.pData->length, S2.pData->length );
00206 }
00207
00208 assert( s->pData->data[s->pData->length] == '\0');
00209 return *s;
00210 }
00211
00212 JString operator+(const JString& S1, const char* s2) {
00213 JString* s = new JString();
00214
00215 if ( s2 == NULL || *s2 == (char)NULL ) {
00216 s->pData = S1.pData;
00217 } else if ( S1.pData == strNull ) {
00218 s->pData = new JStringData( s2 );
00219 } else {
00220 S1.pData->data[ S1.pData->length ] = '\0';
00221
00222 size_t Len = strlen( s2 );
00223 s->Add( S1.pData->data, s2, S1.pData->length, Len );
00224 }
00225
00226 assert( s->pData->data[s->pData->length] == '\0');
00227 return *s;
00228 }
00229
00230 JString operator+(const char* s1, const JString& S2) {
00231 JString* s = new JString();
00232
00233 if ( s1 == NULL || *s1 == (char)NULL ) {
00234 s->pData = S2.pData;
00235 } else if ( S2.pData == strNull ) {
00236 s->pData = new JStringData( s1 );
00237 } else {
00238 size_t Len = strlen( s1 );
00239 s->Add( s1, S2.pData->data, Len, S2.pData->length );
00240 }
00241
00242 assert( s->pData->data[s->pData->length] == '\0');
00243
00244 return *s;
00245 }
00246
00247 JString operator+(const JString& S1, char c) {
00248 JString* s = new JString();
00249 char s2[2] = { c, '\0' };
00250
00251 if ( c == '\0' || c == (char)NULL ) {
00252 s->pData = S1.pData;
00253 } else if ( S1.pData == strNull ) {
00254 s->pData = new JStringData( c );
00255 } else {
00256 S1.pData->data[ S1.pData->length ] = '\0';
00257 s->Add( S1.pData->data, s2, S1.pData->length, 1 );
00258 }
00259
00260 assert( s->pData->data[s->pData->length] == '\0');
00261 return *s;
00262 }
00263
00264 JString operator+(char c, const JString& S2 ) {
00265 JString* s = new JString();
00266 char s1[2] = { c, '\0' };
00267
00268 if ( c == '\0' || c == (char)NULL ) {
00269 s->pData = S2.pData;
00270 } else if ( S2.pData == strNull ) {
00271 s->pData = new JStringData( c );
00272 } else {
00273 s->Add( s1, S2.pData->data, 1, S2.pData->length );
00274 }
00275
00276 assert( s->pData->data[s->pData->length] == '\0');
00277
00278 return *s;
00279 }
00280
00281 #endif