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 ULONG Len1, ULONG Len2, ULONG 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 ULONG newLen = Len1 + Len2;
00063
00064
00065
00066
00067 JStringData* sd = pData;
00068
00069 if ( newLen > 0 ) {
00070 pData = new JStringData( newLen + LenExtra );
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 } else {
00085 pData = strNull;
00086 }
00087
00088 sd->Dec();
00089 }
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100 void JString::Append(const char* s, ULONG Len ) {
00101
00102 if ( s == NULL || *s == (char)NULL ) return;
00103
00104 ULONG newSize = pData->length + Len;
00105
00106 if ( pData == strNull || pData->nbRefs > 1 || newSize > pData->bufferSize )
00107 {
00108
00109
00110
00111
00112
00113
00114 Add(pData->data, s, pData->length, Len );
00115
00116 } else {
00117
00118
00119
00120
00121
00122 memcpy( (pData->data + pData->length), s, Len);
00123
00124 assert( (pData->length + Len ) <= (pData->bufferSize) );
00125 pData->length = newSize;
00126 pData->data[ pData->length ] = '\0';
00127 }
00128 }
00129
00130 const JString& JString::operator=( const JString& src ) {
00131 if ( this != &src && pData != src.pData ) {
00132 JStringData* sd = pData;
00133 pData = src.pData;
00134 src.pData->Inc();
00135
00136
00137 sd->Dec();
00138 }
00139 return *this;
00140 }
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160 const JString& JString::operator=(const char* s) {
00161 if ( s == NULL || *s == (char)NULL ) {
00162 if ( pData != NULL ) pData->Dec();
00163 pData = strNull;
00164 } else {
00165 JStringData* sd = pData;
00166 pData = new JStringData( s );
00167 sd->Dec();
00168 }
00169 return *this;
00170 }
00171
00172 const JString& JString::operator=(char ch) {
00173 JStringData* sd = pData;
00174
00175 if ( ch == '\0' || ch == (char)NULL ) {
00176 pData = strNull;
00177 } else {
00178 pData = new JStringData( ch, 1 );
00179 }
00180
00181
00182 sd->Dec();
00183 return *this;
00184 }
00185
00186 JString operator+(const JString& S1, const JString& S2) {
00187 JString* s = new JString();
00188
00189 if ( S1.pData == strNull ) {
00190
00191 s->pData = S2.pData;
00192
00193 S2.pData->Inc();
00194
00195
00196
00197 } else if ( S2.pData == strNull ) {
00198
00199 s->pData = S1.pData;
00200 S1.pData->Inc();
00201 } else {
00202
00203
00204
00205 S1.pData->data[ S1.pData->length ] = '\0';
00206 S2.pData->data[ S2.pData->length ] = '\0';
00207
00208 s->Add( S1.pData->data, S2.pData->data,
00209 S1.pData->length, S2.pData->length );
00210 }
00211
00212 assert( s->pData->data[s->pData->length] == '\0');
00213 return *s;
00214 }
00215
00216 JString operator+(const JString& S1, const char* s2) {
00217 JString* s = new JString();
00218
00219 if ( s2 == NULL || *s2 == (char)NULL ) {
00220 s->pData = S1.pData;
00221 } else if ( S1.pData == strNull ) {
00222 s->pData = new JStringData( s2 );
00223 } else {
00224 S1.pData->data[ S1.pData->length ] = '\0';
00225
00226 ULONG Len = strlen( s2 );
00227 s->Add( S1.pData->data, s2, S1.pData->length, Len );
00228 }
00229
00230 assert( s->pData->data[s->pData->length] == '\0');
00231 return *s;
00232 }
00233
00234 JString operator+(const char* s1, const JString& S2) {
00235 JString* s = new JString();
00236
00237 if ( s1 == NULL || *s1 == (char)NULL ) {
00238 s->pData = S2.pData;
00239 } else if ( S2.pData == strNull ) {
00240 s->pData = new JStringData( s1 );
00241 } else {
00242 ULONG Len = strlen( s1 );
00243 s->Add( s1, S2.pData->data, Len, S2.pData->length );
00244 }
00245
00246 assert( s->pData->data[s->pData->length] == '\0');
00247
00248 return *s;
00249 }
00250
00251 JString operator+(const JString& S1, char c) {
00252 JString* s = new JString();
00253 char s2[2] = { c, '\0' };
00254
00255 if ( c == '\0' || c == (char)NULL ) {
00256 s->pData = S1.pData;
00257 } else if ( S1.pData == strNull ) {
00258 s->pData = new JStringData( c );
00259 } else {
00260 S1.pData->data[ S1.pData->length ] = '\0';
00261 s->Add( S1.pData->data, s2, S1.pData->length, 1 );
00262 }
00263
00264 assert( s->pData->data[s->pData->length] == '\0');
00265 return *s;
00266 }
00267
00268 JString operator+(char c, const JString& S2 ) {
00269 JString* s = new JString();
00270 char s1[2] = { c, '\0' };
00271
00272 if ( c == '\0' || c == (char)NULL ) {
00273 s->pData = S2.pData;
00274 } else if ( S2.pData == strNull ) {
00275 s->pData = new JStringData( c );
00276 } else {
00277 s->Add( s1, S2.pData->data, 1, S2.pData->length );
00278 }
00279
00280 assert( s->pData->data[s->pData->length] == '\0');
00281
00282 return *s;
00283 }
00284
00285 #endif