5128eecc9f 2011-02-23 kinaba: //--- K.I.LIB --- 5128eecc9f 2011-02-23 kinaba: // kl_str.cpp : string classes for K.I.LIB 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: #include "stdafx.h" 5128eecc9f 2011-02-23 kinaba: #include "kilib.h" 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: //------------------------ 2byte文字処理用 ----------------------// 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: char kiStr::st_lb[256]; 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: void kiStr::init() 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: st_lb[0] = 0; 5128eecc9f 2011-02-23 kinaba: for( int c=1; c!=256; c++ ) 5128eecc9f 2011-02-23 kinaba: st_lb[c] = (::IsDBCSLeadByte(c) ? 2 : 1); 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: //-------------------------- コピー系色々 ------------------------// 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: kiStr::kiStr( int start_size ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: (m_pBuf = new char[ m_ALen = start_size ])[0] = '\0'; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: kiStr::kiStr( const char* s, int min_size ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: int slen = ki_strlen(s) + 1; 5128eecc9f 2011-02-23 kinaba: m_ALen = ( slen < min_size ) ? min_size : slen; 5128eecc9f 2011-02-23 kinaba: ki_memcpy( m_pBuf=new char[m_ALen], s, slen ); 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: kiStr::kiStr( const kiStr& s ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: ki_memcpy( m_pBuf=new char[m_ALen=s.m_ALen], s.m_pBuf, m_ALen=s.m_ALen ); 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: kiStr& kiStr::operator = ( const kiStr& s ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: if( this != &s ) 5128eecc9f 2011-02-23 kinaba: *this = (const char*)s; 5128eecc9f 2011-02-23 kinaba: return *this; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: kiStr& kiStr::operator = ( const char* s ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: int slen = ki_strlen( s ) + 1; 5128eecc9f 2011-02-23 kinaba: int len = this->len(); 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: if( m_ALen < slen || s <= m_pBuf+len || m_pBuf <= s+slen ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: char* tmp = new char[ m_ALen = ( m_ALen>slen ? m_ALen : slen) ]; 5128eecc9f 2011-02-23 kinaba: ki_memcpy( tmp, s, slen ); 5128eecc9f 2011-02-23 kinaba: delete [] m_pBuf; 5128eecc9f 2011-02-23 kinaba: m_pBuf = tmp; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: else 5128eecc9f 2011-02-23 kinaba: ki_memcpy( m_pBuf, s, slen ); 5128eecc9f 2011-02-23 kinaba: return *this; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: kiStr& kiStr::operator += ( const char* s ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: int slen = ki_strlen( s ) + 1; 5128eecc9f 2011-02-23 kinaba: int len = this->len(); 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: if( m_ALen < len+slen+1 5128eecc9f 2011-02-23 kinaba: || ( s <= m_pBuf && m_pBuf <= s+len ) 5128eecc9f 2011-02-23 kinaba: || ( m_pBuf <= s && s <= m_pBuf+slen ) ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: char* tmp = new char[ m_ALen = ( m_ALen>slen+len+1 ? m_ALen : slen+len+1) ]; 5128eecc9f 2011-02-23 kinaba: ki_memcpy( tmp, m_pBuf, len ); 5128eecc9f 2011-02-23 kinaba: delete [] m_pBuf; 5128eecc9f 2011-02-23 kinaba: m_pBuf = tmp; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: ki_memcpy( m_pBuf+len, s, slen+1 ); 5128eecc9f 2011-02-23 kinaba: return *this; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: kiStr& kiStr::operator += ( char c ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: int len = this->len(); 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: if( m_ALen < len+2 ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: char* tmp = new char[ m_ALen=len+20 ]; 5128eecc9f 2011-02-23 kinaba: ki_memcpy( tmp, m_pBuf, len ); 5128eecc9f 2011-02-23 kinaba: delete [] m_pBuf; 5128eecc9f 2011-02-23 kinaba: m_pBuf = tmp; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: m_pBuf[len]=c, m_pBuf[len+1]='\0'; 5128eecc9f 2011-02-23 kinaba: return *this; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: kiStr& kiStr::setInt( int n, bool cm ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: if( n==0 ) 5128eecc9f 2011-02-23 kinaba: m_pBuf[0] = '0', m_pBuf[1] = '\0'; 5128eecc9f 2011-02-23 kinaba: else 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: bool minus = (n<0); 5128eecc9f 2011-02-23 kinaba: if( minus ) 5128eecc9f 2011-02-23 kinaba: n= -n; 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: char tmp[30]; 5128eecc9f 2011-02-23 kinaba: tmp[29]='\0'; 5128eecc9f 2011-02-23 kinaba: int i; 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: for( i=28; i>=0; i-- ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: if( cm && (29-i)%4==0 ) 5128eecc9f 2011-02-23 kinaba: tmp[i--] = ','; 5128eecc9f 2011-02-23 kinaba: tmp[i] = '0' + n%10; 5128eecc9f 2011-02-23 kinaba: n /= 10; 5128eecc9f 2011-02-23 kinaba: if( n==0 ) 5128eecc9f 2011-02-23 kinaba: break; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: if( minus ) 5128eecc9f 2011-02-23 kinaba: tmp[--i] = '-'; 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: (*this) = tmp+i; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: return (*this); 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: //-------------------------- 文字列処理全般 ------------------------// 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: kiStr::~kiStr() 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: delete [] m_pBuf; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: kiStr::operator const char*() const 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: return m_pBuf; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: bool kiStr::operator == ( const char* s ) const 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: return 0==ki_strcmp( m_pBuf, s ); 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: bool kiStr::isSame( const char* s ) const 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: return 0==ki_strcmpi( m_pBuf, s ); 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: int kiStr::len() const 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: return ki_strlen( m_pBuf ); 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: //-------------------------- ユーティリティー ------------------------// 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: kiStr& kiStr::loadRsrc( UINT id ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: ::LoadString( GetModuleHandle(NULL), id, m_pBuf, m_ALen ); 5128eecc9f 2011-02-23 kinaba: return *this; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: void kiPath::beSpecialPath( int nPATH ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: switch( nPATH ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: case Win: ::GetWindowsDirectory( m_pBuf, m_ALen ); break; 5128eecc9f 2011-02-23 kinaba: case Sys: ::GetSystemDirectory( m_pBuf, m_ALen ); break; 5128eecc9f 2011-02-23 kinaba: case Tmp: ::GetTempPath( m_ALen, m_pBuf ); break; 5128eecc9f 2011-02-23 kinaba: case Cur: ::GetCurrentDirectory( m_ALen, m_pBuf ); break; 5128eecc9f 2011-02-23 kinaba: case Exe_name: 5128eecc9f 2011-02-23 kinaba: ::GetModuleFileName( NULL, m_pBuf, m_ALen );break; 5128eecc9f 2011-02-23 kinaba: case Exe: 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: ::GetModuleFileName( NULL, m_pBuf, m_ALen ); 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: char* m=NULL; 5128eecc9f 2011-02-23 kinaba: for( char *p=m_pBuf; *p!='\0'; p=next(p) ) 5128eecc9f 2011-02-23 kinaba: if( *p=='\\' ) 5128eecc9f 2011-02-23 kinaba: m = p; 5128eecc9f 2011-02-23 kinaba: if( m ) 5128eecc9f 2011-02-23 kinaba: *m='\0'; 5128eecc9f 2011-02-23 kinaba: break; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: default: 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: *m_pBuf = '\0'; 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: LPITEMIDLIST il; 5128eecc9f 2011-02-23 kinaba: if( NOERROR!=::SHGetSpecialFolderLocation( NULL, nPATH, &il ) ) 5128eecc9f 2011-02-23 kinaba: return; 5128eecc9f 2011-02-23 kinaba: ::SHGetPathFromIDList( il, m_pBuf ); 5128eecc9f 2011-02-23 kinaba: app()->shellFree( il ); 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: void kiPath::beBackSlash( bool add ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: char* last = m_pBuf; 5128eecc9f 2011-02-23 kinaba: for( char* p=m_pBuf; *p!='\0'; p=next(p) ) 5128eecc9f 2011-02-23 kinaba: last=p; 5128eecc9f 2011-02-23 kinaba: if( *last=='\\' || *last=='/' ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: if( !add ) 5128eecc9f 2011-02-23 kinaba: *last = '\0'; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: else if( add && last!=m_pBuf ) 5128eecc9f 2011-02-23 kinaba: *this += '\\'; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: bool kiPath::beDirOnly() 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: char* lastslash = m_pBuf-1; 5128eecc9f 2011-02-23 kinaba: for( char* p=m_pBuf; *p; p=next(p) ) 5128eecc9f 2011-02-23 kinaba: if( *p=='\\' || *p=='/' ) 5128eecc9f 2011-02-23 kinaba: lastslash = p; 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: *(lastslash+1) = '\0'; 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: return (lastslash+1 != m_pBuf); 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: void kiPath::beShortPath() 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: ::GetShortPathName( m_pBuf, m_pBuf, m_ALen ); 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: void kiPath::mkdir() 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: for( char *p=m_pBuf; *p; p=kiStr::next(p) ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: if( (*p!='\\' && *p!='/') || (p-m_pBuf<=4) ) 5128eecc9f 2011-02-23 kinaba: continue; 5128eecc9f 2011-02-23 kinaba: *p = '\0'; 5128eecc9f 2011-02-23 kinaba: if( !kiSUtil::exist(m_pBuf) ) 5128eecc9f 2011-02-23 kinaba: if( ::CreateDirectory( m_pBuf, NULL ) ) 5128eecc9f 2011-02-23 kinaba: ::SHChangeNotify( SHCNE_MKDIR,SHCNF_PATH,(const void*)m_pBuf,NULL ); 5128eecc9f 2011-02-23 kinaba: *p = '\\'; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: void kiPath::remove() 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: if( !kiSUtil::exist(*this) ) 5128eecc9f 2011-02-23 kinaba: return; 5128eecc9f 2011-02-23 kinaba: if( !kiSUtil::isdir(*this) ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: ::DeleteFile(*this); 5128eecc9f 2011-02-23 kinaba: return; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: // buf == filename with no last '\\' 5128eecc9f 2011-02-23 kinaba: kiPath buf(*this); 5128eecc9f 2011-02-23 kinaba: buf.beBackSlash(false); 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: kiPath tmp(buf); 5128eecc9f 2011-02-23 kinaba: WIN32_FIND_DATA fd; 5128eecc9f 2011-02-23 kinaba: kiFindFile find; 5128eecc9f 2011-02-23 kinaba: find.begin( tmp += "\\*" ); 5128eecc9f 2011-02-23 kinaba: while( find.next( &fd ) ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: tmp = buf; 5128eecc9f 2011-02-23 kinaba: tmp += '\\'; 5128eecc9f 2011-02-23 kinaba: tmp += fd.cFileName; 5128eecc9f 2011-02-23 kinaba: tmp.remove(); 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: find.close(); 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: ::RemoveDirectory( buf ); 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: void kiPath::getBody( kiStr& str ) const 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: char *p=const_cast<char*>(name()),*x,c; 5128eecc9f 2011-02-23 kinaba: for( x=p; *x; x=next(x) ) 5128eecc9f 2011-02-23 kinaba: if( *x=='.' ) 5128eecc9f 2011-02-23 kinaba: break; 5128eecc9f 2011-02-23 kinaba: c=*x, *x='\0'; 5128eecc9f 2011-02-23 kinaba: str=p; 5128eecc9f 2011-02-23 kinaba: *x=c; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: const char* kiPath::name( const char* str ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: const char* ans = str - 1; 5128eecc9f 2011-02-23 kinaba: for( const char* p=str; *p; p=next(p) ) 5128eecc9f 2011-02-23 kinaba: if( *p=='\\' || *p=='/' ) 5128eecc9f 2011-02-23 kinaba: ans = p; 5128eecc9f 2011-02-23 kinaba: return (ans+1); 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: const char* kiPath::ext( const char* str ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: const char *ans = NULL, *p; 5128eecc9f 2011-02-23 kinaba: for( p=name(str); *p; p=next(p) ) 5128eecc9f 2011-02-23 kinaba: if( *p=='.' ) 5128eecc9f 2011-02-23 kinaba: ans = p; 5128eecc9f 2011-02-23 kinaba: return ans ? (ans+1) : p; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: const char* kiPath::ext_all( const char* str ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: const char* p; 5128eecc9f 2011-02-23 kinaba: for( p=name(str); *p; p=next(p) ) 5128eecc9f 2011-02-23 kinaba: if( *p=='.' ) 5128eecc9f 2011-02-23 kinaba: return (p+1); 5128eecc9f 2011-02-23 kinaba: return p; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: void kiPath::body( const char* str, char* buf ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: char *n=const_cast<char*>(kiPath::name(str)),*x; 5128eecc9f 2011-02-23 kinaba: for( x=n; *x; x=next(x) ) 5128eecc9f 2011-02-23 kinaba: if( *x=='.' ) 5128eecc9f 2011-02-23 kinaba: break; 5128eecc9f 2011-02-23 kinaba: memcpy( buf, str, x-n ); 5128eecc9f 2011-02-23 kinaba: buf[x-n]='\0'; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: UINT kiPath::getDriveType() const 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: char* p; 5128eecc9f 2011-02-23 kinaba: for( p=m_pBuf; *p=='\\'; p=next(p) ); 5128eecc9f 2011-02-23 kinaba: for( p=m_pBuf; *p && *p!='\\'; p=next(p) ); 5128eecc9f 2011-02-23 kinaba: char c=*(++p);*p='\0'; 5128eecc9f 2011-02-23 kinaba: UINT ans=::GetDriveType( m_pBuf ); 5128eecc9f 2011-02-23 kinaba: *p=c; return ans; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: bool kiPath::endwithyen( const char* str ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: for( const char *p=str,*last=str; *p; p=next(p) ) 5128eecc9f 2011-02-23 kinaba: last=p; 5128eecc9f 2011-02-23 kinaba: return ( *last=='\\' || *last=='/' ); 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: