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