#ifndef BEFUN
#define oopr(msg,flag) {puts(msg);return flag;}
#define oor(msg) {puts(msg);return;}
#define oope(msg,flag) {perror(msg);return flag;}
#endif
class String ... {
private:
char *str;
int len;
public:
String(char *);
~String();
void operator =(String &);
void operator +=(String &);
bool operator ==(String &);
char * subStr(int,int);
int find(char,int);
bool ins(char *,int);
bool del(int,int);
void match(char *,int *);
void show();
void free();
void replace(char *);
int find(char *,int *);
int find(char *);
} ;
bool String::ins( char * ch, int index) ... {
if(index<0 || index>len) oopr("ins err: parameter error",false);
char *temp;
int chlen=strlen(ch);
temp=new char[len+chlen+1];
if(temp==NULL) oopr("ins err: parameter error",false);
memcpy(temp,str,index);
memcpy(temp+index,ch,chlen);
memcpy(temp+index+chlen,str+index,len-index);
chlen=len+chlen;
temp[chlen]=0;
free();
len=chlen;
str=temp;
return true;
}
int String::find( char c, int index) ... {
for(int i=index-1;i<len;i++)
if(str[i]==c) return i+1;
return -1;
}
char * String::subStr( int index, int count) ... {
if(index<1 || index>count || index>count || index+count>len+1) oopr("substr err, parameter error",NULL);
char *temp=new char[count+1];
if(!temp) oopr("substr err: no enough memery",NULL);
memcpy(temp,str+index-1,count);
temp[count]=0;
return temp;
}
bool String::del( int index, int count) ... {
if(index<0 || index>count || index>count || index+count>len) oopr("substr err, parameter error",NULL);
int chlen=len-count;
char *temp=new char[chlen+1];
if(!temp) oopr("del err: no enough memery",false);
memcpy(temp,str,index);
memcpy(temp+index,str+index+count,len-index-count);
temp[chlen]=0;
free();
len=chlen;
str=temp;
return true;
}
void String:: operator += (String & s) ... {
char *temp=new char[len+s.len+1];
if(temp==NULL) return;
if(!strcpy(temp,str)) return;
if(!strcat(temp,s.str)) return;
int l=len;
free();
str=temp;
len=l+s.len;
}
void String:: operator = (String & s) ... {
if(s==*this) return;
char *temp;
temp=new char[s.len+1];
if(!temp) return;
if(!strcpy(temp,s.str)) return;
free();
str=temp;
len=s.len;
}
bool String:: operator == (String & s) ... {
if(len!=s.len) return false;
if(strcmp(str,s.str)) return false;
return true;
}
void String::free() ... {
len=0;
delete [] str;
str=NULL;
}
String:: ~ String() ... {
free();
}
void String::show() ... {
cout<<"len= "<<len<<" "<<str<<endl;
}
String::String( char * chr) ... {
if(chr==NULL) return;
str=new char[strlen(chr)+1];
if(str==NULL) oor("no enough memery");
len=strlen(chr);
strcpy(str,chr);
}
void String::match( char * chr, int * pre) ... {
int i,k,loc,len;
len=strlen(chr);
pre[0]=-1;
for(i=1;i<len;i++)...{
k=i-1;
while(1)...{
loc=pre[k];
if(chr[i]==chr[loc+1]) ...{pre[i]=loc+1;break;}
else if(loc==-1) ...{pre[i]=-1;break;}
else ...{k=loc;}
}
}
for(i=0;i<len;i++)
if(pre[i]==-1) pre[i]=0;
#ifdef MATCH
for(i=0;i<len;i++)
cout<<i<<" ";
cout<<endl;
for(i=0;i<len;i++)
cout<<chr[i]<<" ";
cout<<endl;
for(i=0;i<len;i++)
cout<<pre[i]<<" ";
cout<<endl;
#endif
}
int String::find( char * chr, int * pre) ... {
int chrlen,i,loc;
chrlen=strlen(chr);
for(i=loc=0;i<len && loc<chrlen;i++)...{
if(str[i]==chr[loc]) loc++;
else ...{if(loc!=0) --i;;loc=pre[loc];}
}
if(loc==chrlen) return i-chrlen+1;
return -1;
}
int String::find( char * chr) ... {
int *pre,result;
pre=new int[strlen(chr)];
match(chr,pre);
result=find(chr,pre);
return result;
}
void String::replace( char * chr) ... {
int *pre,loc,bef,chrlen;
char *tmp=str,*buf;
chrlen=strlen(chr);
pre=new int[chrlen];
buf=new char[len];
match(chr,pre);
bef=0;
while((loc=find(chr,pre))!=-1)...{
--loc;
memcpy(buf+bef,str,loc);
buf[bef+loc]=0;
bef+=loc;
str+=loc+chrlen;
len-=loc+chrlen;
}
strcpy(buf+bef,str);
len=strlen(buf)+1;
str=new char[len];
strcpy(str,buf);
str[len-1]=0;
delete [] buf;
}