📄 nstring.h
字号:
else
{
// a match, advance to next character
++thisIndex;
}
}
nString trimmedString(&(this->Get()[thisIndex]));
return trimmedString;
}
//------------------------------------------------------------------------------
/**
Returns a new string, which is this string, stripped on the right side
by all characters in the char set.
*/
inline
nString
nString::TrimRight(const char* charSet) const
{
ASSERT(charSet);
if (this->IsEmpty())
{
return *this;
}
int charSetLen = strlen(charSet);
int thisIndex = this->strLen - 1;
bool stopped = false;
while (!stopped && (thisIndex < this->strLen))
{
int charSetIndex;
bool match = false;
for (charSetIndex = 0; charSetIndex < charSetLen; charSetIndex++)
{
if ((*this)[thisIndex] == charSet[charSetIndex])
{
// a match
match = true;
break;
}
}
if (!match)
{
// stop if no match
stopped = true;
}
else
{
// a match, advance to next character
--thisIndex;
}
}
nString trimmedString;
trimmedString.Set(this->Get(), thisIndex + 1);
return trimmedString;
}
//------------------------------------------------------------------------------
/**
Trim both sides of a string.
*/
inline
nString
nString::Trim(const char* charSet) const
{
return this->TrimLeft(charSet).TrimRight(charSet);
}
//------------------------------------------------------------------------------
/**
Substitute every occurance of origStr with substStr.
*/
inline
nString
nString::Substitute(const char* matchStr, const char* substStr) const
{
ASSERT(matchStr && substStr);
const char* ptr = this->Get();
int matchStrLen = strlen(matchStr);
nString dest;
// walk original string for occurances of str
const char* occur;
while ((occur = strstr(ptr, matchStr)))
{
// append string fragment until match
dest.AppendRange(ptr, occur - ptr);
// append replacement string
dest.Append(substStr);
// adjust source pointer
ptr = occur + matchStrLen;
}
dest.Append(ptr);
return dest;
}
//------------------------------------------------------------------------------
/**
Returns content as integer.
*/
inline
int
nString::AsInt() const
{
const char* ptr = this->Get();
return atoi(ptr);
}
//------------------------------------------------------------------------------
/**
Returns content as float.
*/
inline
float
nString::AsFloat() const
{
const char* ptr = this->Get();
return float(atof(ptr));
}
//------------------------------------------------------------------------------
/**
This converts an UTF-8 string to 8-bit-ANSI. Note that only characters
in the range 0 .. 255 are converted, all other characters will be converted
to a question mark.
For conversion rules see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
*/
inline
void
nString::UTF8toANSI()
{
uchar* src = (uchar*) this->Get();
uchar* dst = src;
uchar c;
while ((c = *src++))
{
if (c >= 0x80)
{
if ((c & 0xE0) == 0xC0)
{
// a 2 byte sequence with 11 bits of information
ushort wide = ((c & 0x1F) << 6) | (*src++ & 0x3F);
if (wide > 0xff)
{
c = '?';
}
else
{
c = (uchar) wide;
}
}
else if ((c & 0xF0) == 0xE0)
{
// a 3 byte sequence with 16 bits of information
c = '?';
src += 2;
}
else if ((c & 0xF8) == 0xF0)
{
// a 4 byte sequence with 21 bits of information
c = '?';
src += 3;
}
else if ((c & 0xFC) == 0xF8)
{
// a 5 byte sequence with 26 bits of information
c = '?';
src += 4;
}
else if ((c & 0xFE) == 0xFC)
{
// a 6 byte sequence with 31 bits of information
c = '?';
src += 5;
}
}
*dst++ = c;
}
*dst = 0;
}
//------------------------------------------------------------------------------
/**
Convert contained ANSI string to UTF-8 in place.
*/
inline
void
nString::ANSItoUTF8()
{
ASSERT(!this->IsEmpty());
int bufSize = this->Length() * 2 + 1;
char* buffer = new char[bufSize];
char* dstPtr = buffer;
const char* srcPtr = this->Get();
unsigned char c;
while ((c = *srcPtr++))
{
// note: this only covers the 2 cases that the character
// is between 0 and 127 and between 128 and 255
if (c < 128)
{
*dstPtr++ = c;
}
else
{
*dstPtr++ = 192 + (c / 64);
*dstPtr++ = 128 + (c % 64);
}
}
*dstPtr = 0;
this->Set(buffer);
delete[] buffer;
}
//------------------------------------------------------------------------------
/**
Converts backslashes to slashes.
*/
inline
void
nString::ConvertBackslashes()
{
char* ptr = (char*) this->Get();
int i;
for (i = 0; i <= this->strLen; i++)
{
if (ptr[i] == '\\')
{
ptr[i] = '/';
}
}
}
//------------------------------------------------------------------------------
/**
@return pointer to extension (without the dot), or 0
*/
inline
const char*
nString::GetExtension() const
{
const char* str = this->Get();
const char* ext = strrchr(str, '.');
if (ext)
{
ext++;
if (ext[0] != 0)
{
return ext;
}
}
return 0;
}
//------------------------------------------------------------------------------
/**
Returns true if file extension matches.
@param ext extension string (without the dot)
@return true if extension matches
*/
inline
bool
nString::CheckExtension(const char* ext) const
{
ASSERT(ext);
const char* extStr = this->GetExtension();
if (0 == extStr)
{
return false;
}
return (0 == (strcmp(ext, extStr)));
}
//------------------------------------------------------------------------------
/**
Remove the file extension.
*/
inline
void
nString::StripExtension()
{
char* ext = (char*) this->GetExtension();
if (ext)
{
ext[-1] = 0;
}
}
//------------------------------------------------------------------------------
/**
Get a pointer to the last directory separator.
*/
inline
char*
nString::GetLastSlash() const
{
char* s = (char*) this->Get();
char* lastSlash = strrchr(s, '/');
if (0 == lastSlash) lastSlash = strrchr(s, '\\');
if (0 == lastSlash) lastSlash = strrchr(s, ':');
return lastSlash;
}
//------------------------------------------------------------------------------
/**
Return a nString object containing the part after the last
path separator.
*/
inline
nString
nString::ExtractFileName() const
{
nString pathString;
char* lastSlash = this->GetLastSlash();
if (lastSlash)
{
pathString = &(lastSlash[1]);
}
else
{
pathString = this->Get();
}
return pathString;
}
//------------------------------------------------------------------------------
/**
秦寸 巩磊凯捞 箭磊肺 备己 登菌绰瘤 八荤 茄促-肯
*/
inline
bool
nString::IsNumberic()
{
int len=this->Length();
nString str=this->Get();
for(int i=0;i<len;i++)
{
if(isdigit(str[i])==0)
{
return false;
}
}
return true;
}
//------------------------------------------------------------------------------
/**
Return a nString object containing the last directory of the path, i.e.
a category.
- 17-Feb-04 floh fixed a bug when the path ended with a slash
*/
inline
nString
nString::ExtractLastDirName() const
{
nString pathString(*this);
char* lastSlash = pathString.GetLastSlash();
// special case if path ends with a slash
if (lastSlash)
{
if (0 == lastSlash[1])
{
*lastSlash = 0;
lastSlash = pathString.GetLastSlash();
}
char* secLastSlash = 0;
if (0 != lastSlash)
{
*lastSlash = 0; // cut filename
secLastSlash = pathString.GetLastSlash();
if (secLastSlash)
{
*secLastSlash = 0;
return nString(secLastSlash+1);
}
}
}
return "";
}
//------------------------------------------------------------------------------
/**
Return a nString object containing the part before the last
directory separator.
NOTE: I left my fix in that returns the last slash (or colon), this was
necessary to tell if a dirname is a normal directory or an assign.
- 17-Feb-04 floh fixed a bug when the path ended with a slash
*/
inline
nString
nString::ExtractDirName() const
{
nString pathString(*this);
char* lastSlash = pathString.GetLastSlash();
// special case if path ends with a slash
if (lastSlash)
{
if (0 == lastSlash[1])
{
*lastSlash = 0;
lastSlash = pathString.GetLastSlash();
}
if (lastSlash)
{
*++lastSlash = 0;
}
}
return pathString;
}
//------------------------------------------------------------------------------
/**
Return a path string object which contains of the complete path
up to the last slash. Returns an empty string if there is no
slash in the path.
*/
inline
nString
nString::ExtractToLastSlash() const
{
nString pathString(*this);
char* lastSlash = pathString.GetLastSlash();
if (lastSlash)
{
lastSlash[1] = 0;
}
else
{
pathString = "";
}
return pathString;
}
//------------------------------------------------------------------------------
/**
*/
/*
inline
bool
nString::MatchPattern(const nString& pattern) const
{
return n_strmatch(this->Get(), pattern.Get());
}
*/
//------------------------------------------------------------------------------
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -