29.07.2011 - fundamental new

This commit is contained in:
peri4
2011-07-29 08:17:24 +04:00
parent b21a0496cd
commit 29190ea465
49 changed files with 4704 additions and 1052 deletions

View File

@@ -1,14 +1,46 @@
#include "pistring.h"
void PIString::appendFromChars(const char * c, int s) {
int sz;
wchar_t wc;
for (int i = 0; i < s; ++i) {
if (isascii(c[i])) {
push_back(PIChar(c[i]));
continue;
}
sz = mbtowc(&wc, &c[i], 4);
switch (sz) {
case 4:
push_back(PIChar(*(int*)&(c[i])));
i += 3;
continue;
case 3:
push_back(PIChar(*(int*)&(c[i])));
back().ch &= 0xFFFFFF;
i += 2;
continue;
case 2:
push_back(PIChar(*(short * )&(c[i])));
++i;
continue;
default:
push_back(PIChar(c[i]));
break;
}
}
}
PIString & PIString::operator +=(const char * str) {
uint i = 0;
while (str[i] != '\0') push_back(str[i++]);
int l = 0;
while (str[l] != '\0') ++l;
appendFromChars(str, l);
return *this;
}
PIString & PIString::operator +=(const string & str) {
PIString & PIString::operator +=(const wstring & str) {
uint l = str.size();
for (uint i = 0; i < l; ++i) push_back(str[i]);
return *this;
@@ -22,13 +54,6 @@ PIString & PIString::operator +=(const PIString & str) {
}
PIString & PIString::operator +=(const PIByteArray & ba) {
uint l = ba.size();
for (uint i = 0; i < l; ++i) push_back(ba[i]);
return *this;
}
bool PIString::operator ==(const PIString & str) const {
uint l = str.size();
if (size() != l) return false;
@@ -49,6 +74,32 @@ bool PIString::operator !=(const PIString & str) const {
}
bool PIString::operator <(const PIString & str) const {
uint l = str.size();
if (size() < l) return true;
if (size() > l) return false;
for (uint i = 0; i < l; ++i) {
if (str[i] == at(i)) continue;
if (str[i] < at(i)) return true;
else return false;
}
return false;
}
bool PIString::operator >(const PIString & str) const {
uint l = str.size();
if (size() < l) return false;
if (size() > l) return true;
for (uint i = 0; i < l; ++i) {
if (str[i] == at(i)) continue;
if (str[i] < at(i)) return false;
else return true;
}
return false;
}
PIString PIString::mid(const int start, const int len) const {
PIString str;
int s = start, l = len;
@@ -82,24 +133,12 @@ PIString & PIString::cutMid(const int start, const int len) {
else {
if (l > length() - s)
l = length() - s;
remove(s, s + l);
remove(s, l);
}
return *this;
}
PIString PIString::trimmed() const {
int st = 0, fn = 0;
for (int i = 0; i < length(); ++i)
if (at(i) != ' ' && at(i) != '\t')
{st = i; break;}
for (int i = length() - 1; i >= 0; --i)
if (at(i) != ' ' && at(i) != '\t')
{fn = i; break;}
return mid(st, fn - st + 1);
}
PIString & PIString::trim() {
int st = 0, fn = 0;
for (int i = 0; i < length(); ++i)
@@ -113,9 +152,53 @@ PIString & PIString::trim() {
}
PIStringList PIString::split(const PIString & delim) {
PIString ts(*this);
PIString PIString::trimmed() const {
int st = 0, fn = 0;
for (int i = 0; i < length(); ++i)
if (at(i) != ' ' && at(i) != '\t')
{st = i; break;}
for (int i = length() - 1; i >= 0; --i)
if (at(i) != ' ' && at(i) != '\t')
{fn = i; break;}
return mid(st, fn - st + 1);
}
PIString & PIString::replace(int from, int count, const PIString & with) {
if (count < length() - from) remove(from, count);
else remove(from, length() - from);
uint c = with.length();
for (uint i = 0; i < c; ++i) insert(from + i, with[i]);
return *this;
}
PIString & PIString::replace(const PIString & what, const PIString & with, bool * ok) {
int s = find(what);
if (s >= 0) replace(s, what.length(), with);
if (ok != 0) *ok = (s >= 0);
return *this;
}
PIString & PIString::replaceAll(const PIString & what, const PIString & with) {
bool ok = true;
while (ok) replace(what, with, &ok);
return *this;
}
PIString & PIString::insert(int index, const PIString & str) {
uint c = str.length();
for (uint i = 0; i < c; ++i) insert(index + i, str[i]);
return *this;
}
PIStringList PIString::split(const PIString & delim) const {
PIStringList sl;
if (isEmpty() || delim.isEmpty()) return sl;
PIString ts(*this);
int ci = ts.find(delim);
while (ci >= 0) {
sl << ts.left(ci);
@@ -127,7 +210,7 @@ PIStringList PIString::split(const PIString & delim) {
}
int PIString::find(const char str, const int start) {
int PIString::find(const char str, const int start) const {
for (int i = start; i < length(); ++i)
if (at(i) == str)
return i;
@@ -135,7 +218,7 @@ int PIString::find(const char str, const int start) {
}
int PIString::find(const PIString str, const int start) {
int PIString::find(const PIString str, const int start) const {
int l = str.length();
for (int i = start; i < length() - l + 1; ++i)
if (mid(i, l) == str)
@@ -144,7 +227,7 @@ int PIString::find(const PIString str, const int start) {
}
int PIString::findLast(const char str, const int start) {
int PIString::findLast(const char str, const int start) const {
for (int i = length() - 1; i >= start; --i)
if (at(i) == str)
return i;
@@ -152,7 +235,7 @@ int PIString::findLast(const char str, const int start) {
}
int PIString::findLast(const PIString str, const int start) {
int PIString::findLast(const PIString str, const int start) const {
int l = str.length();
for (int i = length() - l; i >= start; --i)
if (mid(i, l) == str)
@@ -164,7 +247,7 @@ int PIString::findLast(const PIString str, const int start) {
PIString PIString::toUpperCase() const {
PIString str(*this);
int l = str.size();
for (int i = 0; i < l; ++i) str[i] = chrUpr(str[i]);
for (int i = 0; i < l; ++i) str[i] = str[i].toUpper();
return str;
}
@@ -172,11 +255,78 @@ PIString PIString::toUpperCase() const {
PIString PIString::toLowerCase() const {
PIString str(*this);
int l = str.size();
for (int i = 0; i < l; ++i) str[i] = chrLwr(str[i]);
for (int i = 0; i < l; ++i) str[i] = str[i].toLower();
return str;
}
string PIString::convertToStd() const {
string s;
if (size() > 0) {
for (int i = 0; i < length(); ++i) {
if (at(i).isAscii())
s.push_back(at(i).toAscii());
else {
s.push_back(at(i).toCharPtr()[0]);
s.push_back(at(i).toCharPtr()[1]);
}
}
}
return s;
}
char PIString::toChar() const {
PIString s(toNativeDecimalPoints());
char v;
sscanf(s.data(), "%c", &v);
return v;
}
short PIString::toShort() const {
PIString s(trimmed().toNativeDecimalPoints());
int i;
short v;
if (s.left(2) == "0x") {sscanf(s.data(), "%x", &i); return (short)i;}
if (s.left(1) == "0") {sscanf(s.data(), "%o", &i); return (short)i;}
sscanf(s.data(), "%hd", &v);
return v;
}
int PIString::toInt() const {
PIString s(trimmed().toNativeDecimalPoints());
int v;
if (s.left(2) == "0x") {sscanf(s.data(), "%x", &v); return v;}
if (s.left(1) == "0") {sscanf(s.data(), "%o", &v); return v;}
sscanf(s.data(), "%d", &v);
return v;
}
long PIString::toLong() const {
PIString s(trimmed().toNativeDecimalPoints());
int i;
long v;
if (s.left(2) == "0x") {sscanf(s.data(), "%x", &i); return (long)i;}
if (s.left(1) == "0") {sscanf(s.data(), "%o", &i); return (long)i;}
sscanf(s.data(), "%ld", &v);
return v;
}
llong PIString::toLLong() const {
PIString s(trimmed().toNativeDecimalPoints());
int i;
llong v;
if (s.left(2) == "0x") {sscanf(s.data(), "%x", &i); return (llong)i;}
if (s.left(1) == "0") {sscanf(s.data(), "%o", &i); return (llong)i;}
sscanf(s.data(), "%Ld", &v);
return v;
}
char chrUpr(char c) {
if (c >= 'a' && c <= 'z') return c + 'A' - 'a';
//if (c >= 'а' && c <= 'я') return c + 'А' - 'а';
@@ -189,3 +339,25 @@ char chrLwr(char c) {
//if (c >= 'А' && c <= 'Я') return c + 'а' - 'А';
return c;
}
PIStringList& PIStringList::removeDuplicates() {
PIStringList l;
PIString s;
bool ae;
for (uint i = 0; i < size(); ++i) {
ae = false;
s = at(i);
for (uint j = 0; j < l.size(); ++j) {
if (s != l[j]) continue;
ae = true; break;
}
if (!ae) {
l << s;
continue;
}
remove(i);
--i;
}
return *this;
}