#include "bbstring.h" #include "bbarray.h" bbString::Rep bbString::_nullRep; int bbString::utf8Length()const{ const bbChar *p=data(); const bbChar *e=p+length(); int n=0; while( psize ) sz=size; for( int i=0;isize ) sz=size; for( int i=0;iend ) break; *dst++=0xc0 | (c>>6); *dst++=0x80 | (c & 0x3f); }else{ if( dst+3>end ) break; *dst++=0xe0 | (c>>12); *dst++=0x80 | ((c>>6) & 0x3f); *dst++=0x80 | (c & 0x3f); } } if( dst_sz ){ free( _tmp ); _tmp=(char*)malloc( _sz=sz ); } for( int i=0;idata; while( len-- ){ int c=*p++; if( c & 0x80 ){ if( (c & 0xe0)==0xc0 ){ c=((c & 0x1f)<<6) | (p[0] & 0x3f); p+=1; }else if( (c & 0xf0)==0xe0 ){ c=((c & 0x0f)<<12) | ((p[0] & 0x3f)<<6) | (p[1] & 0x3f); p+=2; } } *d++=c; } return rep; } bbString bbString::fromAsciiData( const void *data,int size ){ if( !data || size<=0 ) return bbString(); return bbString( (const char*)data,size ); } bbString bbString::fromUtf8Data( const void *data,int size ){ if( !data || size<=0 ) return bbString(); const char *p=(const char*)data; const char *e=p+size; int len=0; while( p!=e ){ int c=*p++; if( c & 0x80 ){ if( (c & 0xe0)==0xc0 ){ if( p==e || (p[0] & 0xc0)!=0x80 ) break; p+=1; }else if( (c & 0xf0)==0xe0 ){ if( p==e || p+1==e || (p[0] & 0xc0)!=0x80 || (p[1] & 0xc0)!=0x80 ) break; p+=2; }else{ break; } } len+=1; } p=(const char*)data; Rep *rep=Rep::alloc( len ); bbChar *d=rep->data; while( len-- ){ int c=*p++; if( c & 0x80 ){ if( (c & 0xe0)==0xc0 ){ c=((c & 0x1f)<<6) | (p[0] & 0x3f); p+=1; }else if( (c & 0xf0)==0xe0 ){ c=((c & 0x0f)<<12) | ((p[0] & 0x3f)<<6) | (p[1] & 0x3f); p+=2; } } *d++=c; } return rep; } bbArray *bbString::split( bbString sep )const{ if( !sep.length() ){ bbArray *bits=bbArray::create( length() ); for( int i=0;iat(i)=bbString( &data()[i],1 ); } return bits; } int i=0,i2,n=1; while( (i2=find( sep,i ))!=-1 ){ ++n; i=i2+sep.length(); } bbArray *bits=bbArray::create( n ); if( n==1 ){ bits->at(0)=*this; return bits; } i=0;n=0; while( (i2=find( sep,i ))!=-1 ){ bits->at(n++)=slice( i,i2 ); i=i2+sep.length(); } bits->at(n)=slice( i ); return bits; } bbString bbString::join( bbArray *bits )const{ if( bits->length()==0 ) return bbString(); if( bits->length()==1 ) return bits->at(0); int len=length() * (bits->length()-1); for( int i=0;ilength();++i ) len+=bits->at(i).length(); Rep *rep=Rep::alloc( len ); bbChar *p=rep->data; p=t_memcpy( p,bits->at(0).data(),bits->at(0).length() ); for( int i=1;ilength();++i ){ p=t_memcpy( p,data(),length() ); p=t_memcpy( p,bits->at(i).data(),bits->at(i).length() ); } return rep; }