kolibrios/programs/develop/libraries/menuetlibc/include/string

254 lines
6.6 KiB
Plaintext
Raw Normal View History

#ifndef _STRING_INCLUDED
#define _STRING_INCLUDED
#include <stdlib.h>
#include <string.h>
namespace std
{
class string
{
char* data;
public:
string() {data=(char*)malloc(1);data[0]=0;}
string(const char* a)
{
int len=strlen(a)+1;
data=(char*)malloc(len);
memcpy(data,a,len);
}
string(char c)
{
data=(char*)malloc(2);
data[0]=c;data[1]=0;
}
string(const string& s)
{
unsigned sz = s.size()+1;
data=(char*)malloc(sz);
memcpy(data,s.c_str(),sz);
}
~string() {free(data);}
string& operator=(const char* s)
{free(data);unsigned len=strlen(s)+1;data=(char*)malloc(len);
memcpy(data,s,len);return *this;}
string& operator=(const string& s)
{free(data);unsigned len=s.size()+1;data=(char*)malloc(len);
memcpy(data,s.c_str(),len);return *this;}
const char* c_str() const {return data;}
char& operator[](unsigned pos) {return data[pos];}
char operator[](unsigned pos) const {return data[pos];}
unsigned size() const {return strlen(data);}
unsigned length() const {return size();}
bool operator==(const char* str2) const {return !strcmp(data,str2);}
bool operator==(const string& str2) const {return !strcmp(data,str2.data);}
int compare(const char* str2) {return strcmp(data,str2);}
bool operator!=(const char* str2) const {return (bool)strcmp(data,str2);}
string& replace(unsigned p0,unsigned n0,const string& str)
{
unsigned sz = str.size();
char* newdata=(char*)malloc(size()+1+sz-n0);
memcpy(newdata,data,p0);
memcpy(newdata+p0,str.c_str(),sz);
memcpy(newdata+p0+sz,data+p0+n0,size()+1-p0-n0);
free(data);
data=newdata;
return *this;
}
string& insert(size_t posl,const string& str)
{ return replace(posl,0,str); }
string& operator+=(char c)
{
unsigned sz=size();
data=(char*)realloc(data,sz+2);
data[sz]=c;data[sz+1]=0;
return *this;
}
string& operator+=(const string& s)
{
unsigned mysz=size();
unsigned ssz=s.size();
data=(char*)realloc(data,mysz+1+ssz);
memcpy(data+mysz,s.c_str(),ssz+1);
return *this;
}
// friend string operator+(const string& s1, const char* s2);
// friend string operator+(const char* s1, const string& s2);
string& assign(const string& str, unsigned pos, unsigned n)
{
unsigned len=strlen(str.data);
if (pos>len)
pos=len;
if (n>len||pos+n>len)
n=len-pos;
char* d=(char*)malloc(n+1);
memcpy(d,str.c_str()+pos,n);
d[n]=0;
free(data);
data=d;
return *this;
}
string& assign(const char* s)
{
free(data);
unsigned sz=strlen(s)+1;
data=(char*)malloc(sz);
memcpy(data,s,sz);
return *this;
}
string& assign(const string& str)
{ return assign(str.data); }
size_t find_first_of(const char* str, size_t pos=0) const
{
const char* p = data;
while (pos)
{
if (!*p)
return npos;
p++;
pos--;
}
while (*p)
{
if (strchr(str,*p))
return p-data;
p++;
}
return npos;
}
size_t find_first_of(const string& str, size_t pos=0) const
{ return find_first_of(str.data, pos); }
size_t find_first_not_of(const char* str, size_t pos=0) const
{
const char* p = data;
while (pos)
{
if (!*p)
return npos;
p++;
pos--;
}
while (*p)
{
if (!strchr(str,*p))
return p-data;
p++;
}
return npos;
}
size_t find_first_not_of(const string& str, size_t pos=0) const
{ return find_first_not_of(str.data, pos); }
size_t find_last_not_of(const char* str, size_t pos=npos) const
{
const char* p = data;
while (pos)
{
if (!*p)
{
p--;
break;
}
p++;
pos--;
}
for (;;)
{
if (p<data)
return npos;
if (!strchr(str,*p))
return p-data;
p--;
}
}
size_t find_last_not_of(const string& str, size_t pos=npos) const
{ return find_last_not_of(str.data, pos); }
class iterator
{
char* cur;
public:
iterator(char* c):cur(c) {}
iterator(const iterator& i):cur(i.cur) {}
iterator& operator++() {++cur;return *this;}
iterator operator++(int) {iterator tmp(*this);++cur;return tmp;}
bool operator==(iterator it) {return cur==it.cur;}
bool operator!=(iterator it) {return cur!=it.cur;}
char& operator*() {return *cur;}
};
iterator begin() {return iterator(data);}
iterator end() {return iterator(data+strlen(data));}
// void erase() {free(data);data=(char*)malloc(1);data[0]=0;}
string& erase(unsigned p0=0, unsigned n=(unsigned)-1)
{
unsigned sz=size();
if (n>sz-p0) n=sz-p0;
char* d=(char*)malloc(sz+1-n);
memcpy(d,data,p0);
memcpy(d+p0,data+p0+n,sz+1-n-p0);
free(data);
data=d;
return *this;
}
typedef unsigned size_type;
static const size_type npos=(size_type)-1;
size_type find(const char* s, size_type pos=0) const
{
char* p=strstr(data+pos,s);
if (!p) return npos;
return p-data;
}
size_type find(char c, size_type pos=0) const
{
char* p=strchr(data+pos,c);
if (!p) return npos;
return p-data;
}
size_type rfind(char c, size_type pos=npos) const
{
size_type len=strlen(data);
if (pos>len)
pos=len;
while (pos--)
if (data[pos]==c)
return pos;
return npos;
}
string substr(unsigned pos=0,unsigned n=npos)
{
string res(data+pos);
if (n<res.size()) res.erase(n);
return res;
}
void clear(void)
{
data[0]=0;
}
bool empty(void) const
{
return (data[0]==0);
}
void _toupper(void)
{ strupr(data); }
void _tolower(void)
{ strlwr(data); }
};
}
inline std::string operator+(const std::string& s1, const char* s2)
{
std::string res(s1);
res += s2;
return res;
}
inline std::string operator+(const char* s1, const std::string& s2)
{
std::string res(s1);
res += s2;
return res;
}
inline std::string operator+(const std::string& s1, const std::string& s2)
{
std::string res(s1);
res += s2;
return res;
}
#endif