Main Page   Packages   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   File Members   Search  

C:/temp/src/j2k/Fred/String/StringAt.cpp

Go to the documentation of this file.
00001 #ifndef __J2K__JString_At_CPP__
00002 #define __J2K__JString_At_CPP__
00003 
00004 #include <j2k/Fred/String/String.hpp>
00005 
00006 // TODO:  Check for effects of LOCK functions !
00007 // StrAdd also !
00008 
00009 // Use CopyBeforeWrite();
00010 
00011 JString JString::at( size_t startpos ) {
00012   if ( (long)startpos == -1 ) return JString();
00013   if ( startpos > pData->length ) return JString();
00014   const char* r = pData->data + startpos;
00015   return JString( r );
00016 }
00017 
00018 JString JString::at( const char* s, size_t startpos ) {
00019   if ( (long)startpos == -1 ) return JString();
00020   if ( startpos > pData->length ) return JString();
00021   const char* r = pData->data + startpos;
00022   return JString( strstr( r, s ) );
00023 }
00024 
00025 JString JString::at( const char* s, size_t startpos, size_t length ) {
00026   if ( (long)startpos == -1 ) return JString();
00027   if ( (long)length   == -1 ) length = pData->length;
00028   if ( startpos+length > pData->length ) return JString();
00029   const char* r = pData->data + startpos;
00030   const char* r2 = (const char*)strstr( r, s );
00031 
00032   JStringData* sd = new JStringData( r2, length );  
00033   
00034   return JString( sd );
00035 }
00036 
00037 JString JString::at( size_t startpos, size_t length) {
00038   if ( (long)startpos == -1 ) return JString();
00039   if ( (long)length   == -1 ) length = pData->length;
00040   if ( startpos > pData->length ) return JString();
00041   const char* r = pData->data + startpos;
00042 
00043   JStringData* sd = new JStringData( r, length );  
00044   return JString( sd );
00045 
00046 /** ANDREA ***************************************************
00047 
00048   This is leaking memory. The temporary buffer you allocated
00049   will be abandoned on the free store after having been
00050   used to create the JString object.
00051 
00052   What !?
00053   Oh I see ! =)
00054   I use JStringData to avoid that.
00055 
00056 *************************************************************/
00057 }
00058 
00059 JString& JString::setAt(size_t index, char ch) {
00060   if ( (long)index == -1 ) return *this;
00061   if (index > pData->length) {
00062     index = pData->length;
00063   }
00064   CopyBeforeWrite();
00065   pData->data[index] = ch;
00066   return *this;
00067 }
00068 
00069 JString JString::rtrim( char ch ) const {
00070   // find first single character
00071   // return -1 if not found and index otherwise
00072   for( long l = (long)(pData->length - 1); l >= 0; l-- ) {
00073     if ( pData->data[l] == ch ) {
00074       const char* r = pData->data + l;
00075       size_t length = (size_t)(pData->length) - l;
00076 
00077       JStringData* sd = new JStringData( r, length );
00078 /*
00079       char* c = new char[ length + 1 ];
00080       memcpy( c, r, length );
00081       c[length] = '\0';
00082       return JString( c );
00083 */
00084    return JString( sd );
00085     }
00086   }
00087   return JString();
00088 }
00089 
00090 JString JString::trim( char ch ) const {
00091   // find first single character
00092   // return -1 if not found and index otherwise
00093 
00094   JStringData* sd = new JStringData( pData->length );
00095 
00096 //  char* s  = new char[ pData->length + 1 ];
00097 
00098   size_t p = 0;
00099   for( size_t l = 0; l < pData->length; l++ ) {
00100    if ( pData->data[l] != ch ) {
00101       sd->data[ p++ ] = pData->data[l];
00102     }
00103   }
00104   if ( p == 0 ) {
00105     delete sd;
00106     return JString();
00107   }
00108 
00109   sd->data[ p ] = '\0';
00110   return JString( sd );
00111 }
00112 
00113 JString JString::trimCharset( const char* charset ) const {
00114   // find first single character
00115   // return -1 if not found and index otherwise
00116 
00117   JStringData* sd = new JStringData( pData->length );
00118   // char* s   = new char[ pData->length + 1 ];
00119 
00120   size_t p  = 0;
00121   size_t l  = 0;
00122   size_t m  = 0;
00123   size_t mc = strlen( charset );
00124   BOOL   found = FALSE;
00125 
00126   for( l = 0; l < pData->length; l++ ) {
00127    found = FALSE;
00128    for( m = 0; m < mc; m++ ) {
00129      if ( pData->data[l] == charset[m] ) { 
00130        found == TRUE; 
00131        m = mc; 
00132      }
00133    }
00134 
00135    if ( found == FALSE ) {
00136       sd->data[ p++ ] = pData->data[l];
00137     }
00138   }
00139 
00140   if ( p == 0 ) {
00141     delete sd;
00142     return JString();
00143   }
00144 
00145   sd->data[ p ] = '\0';
00146   return JString( sd );
00147 }
00148 
00149 JString JString::keepCharset( const char* charset ) const {
00150   // find first single character
00151   // return -1 if not found and index otherwise
00152   JStringData* sd = new JStringData( pData->length );
00153 
00154   // char* s   = new char[ pData->length + 1 ];
00155 
00156   size_t p  = 0;
00157   size_t l  = 0;
00158   size_t m  = 0;
00159   size_t mc = strlen( charset );
00160   BOOL   found = FALSE;
00161 
00162   for( l = 0; l < pData->length; l++ ) {
00163    found = FALSE;
00164    for( m = 0; m < mc; m++ ) {
00165      if ( pData->data[l] == charset[m] ) { 
00166        found == TRUE; 
00167        m = mc; 
00168      }
00169    }
00170 
00171    if ( found == TRUE ) {  // Only change from trim
00172       sd->data[ p++ ] = pData->data[l];
00173     }
00174   }
00175 
00176   if ( p == 0 ) {
00177     delete sd;
00178     return JString();
00179   }
00180 
00181   sd->data[ p ] = '\0';
00182   return JString( sd );
00183 }
00184 
00185 #endif

Generated on Sun Oct 14 18:46:29 2001 for Standard J2K Library by doxygen1.2.11.1 written by Dimitri van Heesch, © 1997-2001