⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 string.cpp

📁 jedit 一个小型java编译器的源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/******************************************************************************\
*
*  文件名:    String.cpp
*  目的:	  FString类的实现文件,关于函数用法,请参见string.h
*  使用说明:  FString类是一个对字符串进行操作的类,F的用意是指Free
*			  即任何人都可以修改它为己所用。
*			  在保持此程序完整性的情况下,你可以任意传播它。你也可以修改它
*			  来为你服务,如果你要将此程序用于商业目的,请告知我。
*
*  CopyLeft	 2002  张元一
*
*  CopyLeft 是自由软件基金会(FSF)推荐使用的自由软件的标志
*
\******************************************************************************/
#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);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -