?? string.cpp
字號(hào):
/******************************************************************************\
*
* 文件名: String.cpp
* 目的: FString類的實(shí)現(xiàn)文件,關(guān)于函數(shù)用法,請參見string.h
* 使用說明: FString類是一個(gè)對字符串進(jìn)行操作的類,F(xiàn)的用意是指Free
* 即任何人都可以修改它為己所用。
* 在保持此程序完整性的情況下,你可以任意傳播它。你也可以修改它
* 來為你服務(wù),如果你要將此程序用于商業(yè)目的,請告知我。
*
* CopyLeft 2002 張?jiān)?*
* CopyLeft 是自由軟件基金會(huì)(FSF)推薦使用的自由軟件的標(biāo)志
*
\******************************************************************************/
#include <malloc.h>
#include <assert.h>
#include <string.h>
#include <stdio.h>
#include <math.h>
#include "fstring.h"
FString::FString()
{
SelChar=NULL;
SelLength=0;
Word=NULL;
WordLength=0;
Length=0;
Line.Add(0);
Line.Add(Length);
BufferSize=STR_SIZE;
Str=(char*)malloc(BufferSize);
assert(Str);
Cur=0;
Openum=0;
OvrFlag=false;
}
FString::~FString()
{
free(Str);
Str=0;
BufferSize=0;
Length=0;
Cur=0;
OvrFlag=false;
if(SelChar)
free(SelChar);
if(Word)
free(Word);
SelLength=0;
}
void FString::Delete(bool UndoFlag)
{
char c[3];
int i;
if(Length==0)
return;
if(Cur==Length)
return;
if(*(Str+Cur)>=-95&&*(Str+Cur)<=-2)
{
c[0]=*(Str+Cur);
c[1]=*(Str+Cur+1);
c[2]='\0';
for(i=Cur;i<Length-2;i++)
*(Str+i)=*(Str+i+2);
Length-=2;
if(UndoFlag)
{
undo.SetMax(Openum);
Openum++;
undo.add(Undo(Cur,2,OPE_DELETE,c,0));
}
}
else
{
c[0]=*(Str+Cur);
for(i=Cur;i<Length-1;i++)
*(Str+i)=*(Str+i+1);
Length--;
if(UndoFlag)
{
undo.SetMax(Openum);
Openum++;
undo.add(Undo(Cur,1,OPE_DELETE,0,c[0]));
}
}
SetLine();
}
void FString::DeletePrev()
{
int i;
char c[3];
if(Length==0||Cur==0)
return;
Cur--;
undo.SetMax(Openum);
if(*(Str+Cur)>=-95&&*(Str+Cur)<=-2)
{
Cur--;
c[0]=*(Str+Cur);
c[1]=*(Str+Cur+1);
c[2]='\0';
for(i=Cur;i<Length-2;i++)
*(Str+i)=*(Str+i+2);
Length-=2;
SetLine();
undo.add(Undo(Cur,2,OPE_DELETE,c,0));
return;
}
c[0]=*(Str+Cur);
for(i=Cur;i<Length-1;i++)
*(Str+i)=*(Str+i+1);
Length--;
undo.add(Undo(Cur,1,OPE_DELETE,0,c[0]));
Openum++;
SetLine();
}
void FString::DeleteSel(bool UndoFlag)
{
int SelLength;
int i;
SelLength=Sel.GetLength();
if(SelLength==0)
return;
Cur=Sel.GetStart();
if(UndoFlag)
{
undo.SetMax(Openum);
Openum++;
undo.add(Undo(Cur,Sel.GetLength(),OPE_DELETE,GetSelect(),0));
}
for(i=Cur;i<Length-SelLength;i++)
*(Str+i)=*(Str+i+SelLength);
Length-=SelLength;
Sel.Empty();
SetLine();
}
void FString::Find(char *str,int &num,IntArray &pos)
{
int i;
num=0;
pos.Clear();
for(i=0;i<Length;)
{
if(stricmpn(str,i,false))
{
num++;
pos.Add(i);
}
if(*(Str+i)>=-95&&*(Str+i)<=-2)
i+=2;
else
i++;
}
}
bool FString::FindNext(char *str,int &pos,bool icmp)
{
int i;
for(i=Cur+1;i<Length;)
{
if(stricmpn(str,i,icmp))
{
pos=i;
return true;
}
if(*(Str+i)>=-95&&*(Str+i)<=-2)
i+=2;
else
i++;
}
for(i=0;i<=Cur;)
{
if(stricmpn(str,i,icmp))
{
pos=i;
return true;
}
if(*(Str+i)>=-95&&*(Str+i)<=-2)
i+=2;
else
i++;
}
return false;
}
bool FString::FindPrev(char *str,int &pos,bool icmp)
{
int i;
for(i=Cur;i>=0;)
{
if(stricmpn(str,i,icmp))
{
pos=i;
return true;
}
if(*(Str+i)>=-95&&*(Str+i)<=-2)
i-=2;
else
i--;
}
for(i=Length-1;i>Cur;)
{
if(stricmpn(str,i,icmp))
{
pos=i;
return true;
}
if(*(Str+i)>=-95&&*(Str+i)<=-2)
i-=2;
else
i--;
}
return false;
}
char FString::GetChar(int line,int column)
{
if(Str==0)
return 0;
int Index;
Index=GetLineStart(line)+column-1;
if(Index<0&&Index>=Length)
return 0;
return *(Str+Index);
}
char FString::GetChar(int index)
{
if(Str==0)
return 0;
if(index<0&&index>=Length)
return 0;
return *(Str+index);
}
int FString::GetColumn()
{
int Column=1;
int i;
for(i=0;i<Cur;)
{
if(*(Str+i)!=0x0a)
Column++;
else
Column=1;
if(*(Str+i)>=-95&&*(Str+i)<=-2)
i+=2;
else
i++;
}
return Column;
}
int FString::GetColumnPos()
{
int Column=1;
int i;
for(i=0;i<Line.GetLength();i++)
{
if(Cur>=Line.Get(i)&&Cur<Line.Get(i+1))
{
break;
}
}
for(i=Line.Get(i);i<Line.Get(i+1);i++)
{
Column++;
}
return Column;
}
int FString::GetColumn(int pos)
{
if(pos<0||pos>Length)
return 0;
int Column=1;
int i;
for(i=0;i<Line.GetLength();i++)
{
if(Cur>=Line.Get(i)&&Cur<Line.Get(i+1))
{
break;
}
}
for(i=Line.Get(i);i<Line.Get(i+1);)
{
Column++;
if(*(Str+i)>=-95&&*(Str+i)<=-2)
i+=2;
else
i++;
}
return Column;
}
int FString::GetPos()
{
int Pos=1;
int i;
for(i=0;i<Cur;i++)
{
if(*(Str+i)!=0x0a)
Pos++;
else
Pos=1;
}
return Pos;
}
int FString::GetLine(int pos)
{
int i;
for(i=0;i<Line.GetLength();i++)
{
if(pos>=Line.Get(i)&&pos<Line.Get(i+1))
{
break;
}
}
return i;
}
int FString::GetLineStart(int line)
{
return Line.Get(line-1);
}
int FString::GetLine()
{
int i;
if(Cur==Length)
return Line.GetLength()-1;
for(i=0;i<Line.GetLength();i++)
{
if(Cur>=Line.Get(i)&&Cur<Line.Get(i+1))
{
break;
}
}
return i+1;
}
int FString::GetCurLineStart()
{
int i;
for(i=0;i<Line.GetLength();i++)
{
if(Cur>=Line.Get(i)&&Cur<Line.Get(i+1))
{
break;
}
}
return Line.Get(i);
}
int FString::GetLineWidth(int line)
{
return (Line.Get(line)-Line.Get(line-1)+1);
}
int FString::GetMaxLineWidth()
{
int i;
int MaxWidth=1;
int Width;
for(i=1;i<=GetTotalLine();i++)
{
Width=GetLineWidth(i);
if(Width>MaxWidth) MaxWidth=Width;
}
return MaxWidth;
}
int FString::GetPos(int line,int column)
{
int Column=0;
for(int i=Line.Get(line-1);i<=Line.Get(line);i++)
{
Column++;
if(column==Column)
return i;
}
return 0;
}
int FString::GetTotalLine()
{
// int i;
// int Line=1;
// for(i=0;i<Length;i++)
// if(*(Str+i)==0x0a)
// Line++;
return Line.GetLength()-1;
}
int FString::GetTotalByte()
{
int TotalByte=0;
for(int i=1;i<GetTotalLine();i++)
TotalByte+=GetLineWidth(i);
return TotalByte;
}
char* FString::GetSelect()
{
if(SelLength<Sel.GetLength())
SelLength=Sel.GetLength();
SelChar=(char*)realloc(SelChar,SelLength+1);
for(int i=Sel.GetStart();i<Sel.GetEnd();i++)
*(SelChar+(i-Sel.GetStart()))=*(Str+i);
*(SelChar+(i-Sel.GetStart()))='\0';
return SelChar;
}
char* FString::GetSelectWord(int line,int column)
{
int i;
int Pos=GetPos(line,column);
int SelStart,SelEnd;
for(i=Pos;i>=0;i--)
if(*(Str+i)<-95||
(*(Str+i)>-2&&*(Str+i)<0x41)||
(*(Str+i)>0x5a&&*(Str+i)<0x61)
||*(Str+i)>0x7a)
{
if(*(Str+i)!='_')
break;
}
SelStart=i+1;
for(i=Pos;i<Length;i++)
if(*(Str+i)<-95||
(*(Str+i)>-2&&*(Str+i)<0x41)||
(*(Str+i)>0x5a&&*(Str+i)<0x61)
||*(Str+i)>0x7a)
{
if(*(Str+i)!='_')
break;
}
SelEnd=i;
if(*(Str+Pos)<-95||
(*(Str+Pos)>-2&&*(Str+Pos)<0x41)||
(*(Str+Pos)>0x5a&&*(Str+Pos)<0x61)
||*(Str+Pos)>0x7a)
{
if(*(Str+Pos)!='_')
{
SelStart=Pos;
SelEnd=Pos+1;
}
}
if(WordLength<SelEnd-SelStart)
{
WordLength=SelEnd-SelStart;
Word=(char*)realloc(Word,WordLength+1);
}
for(i=SelStart;i<SelEnd;i++)
*(Word+(i-SelStart))=*(Str+i);
*(Word+(i-SelStart))='\0';
return Word;
}
void FString::Inflate()
{
char* newStr;
BufferSize+=STR_INCRE;
newStr=(char*)realloc(Str,BufferSize);
assert(newStr);
Str=newStr;
}
void FString::Insert(char c,bool UndoFlag)
{
if(Length==BufferSize)
Inflate();
for(int i=Length;i>Cur;i--)
*(Str+i)=*(Str+i-1);
*(Str+Cur)=c;
if(UndoFlag)
{
undo.SetMax(Openum);
undo.add(Undo(Cur,1,OPE_INSERT,0,c));
Openum++;
}
Cur++;
Length++;
SetLine();
}
void FString::Insert(char* str,bool UndoFlag)
{
int StrLen;
int i;
StrLen=strlen(str);
while(Length+StrLen>BufferSize) Inflate();
for(i=Length+StrLen-1;i>Cur+StrLen-1;i--)
*(Str+i)=*(Str+i-StrLen);
for(i=0;i<StrLen;i++)
*(Str+Cur+i)=*(str+i);
if(UndoFlag)
{
undo.SetMax(Openum);
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -