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

📄 fstring.h

📁 jedit 一个小型java编译器的源码
💻 H
字号:
/******************************************************************************\
*
*  文件名:    string.h
*  目的:	  定义FString类
*  使用说明:  FString类是一个对字符串进行操作的类,F的用意是指Free
*			  即任何人都可以修改它为己所用。
*			  在保持此程序完整性的情况下,你可以任意传播它。你也可以修改它
*			  来为你服务,如果你要将此程序用于商业目的,请告知我。
*
*  CopyLeft	 2002  张元一
*
*  CopyLeft 是自由软件基金会(FSF)推荐使用的自由软件的标志
*
\******************************************************************************/
#ifndef STRING_H
#define STRING_H
#include<stdio.h>
//定义初始字符缓冲区大小为64K
#define STR_SIZE 64*1024
//若字符超出缓冲区,则增加缓冲区大小,每次增加64K
#define	STR_INCRE	64*1024

#define OPE_INSERT  1
#define OPE_DELETE  2
//一个整形数组类,用于查找字符串
#include "intarray.h"
#include "string.h"
#include "set.h"

class Undo
{
public:
	int pos;
	int length;
	int ope;
	char c;
	SString<0> baker;

	Undo(int p,int len,int op,const char *string,char ch)
	{
		pos=p;
		length=len;
		ope=op;
		if(string==NULL)
			c=ch;
		else
		{
			if(length==1)
				c=string[0];
			else
				baker=SString<0>(string);
		}
	}
	bool operator==(const Undo& u)
	{
		return false;
	}
};
//定义Select类,Selectl类用来代表字符串中被选中的区域
class Select
{
	//选中区域其实位置
	int Start;
	//选中区域结束位置
	int End;
public:
	Select()
	{
		Start=0;
		End=0;
	}
	//清空选区
	void Empty(){Start=End=0;}
	//此函数查询选区是否为空
	bool IsEmpty()
	{
		if(Start!=End)
			return false;
		return true;
	}
	//获得所选区域长度
	int GetLength()
	{
		if(End>=Start)
			return End-Start;
		else
			return Start-End;
	}
	//获得选区其实位置
	int GetStart()
	{
		if(Start<=End)
			return Start;
		else
			return End;
	}
	//获得选区结束位置
	int GetEnd()
	{
		if(Start<=End)
			return End;
		else
			return Start;
	}
	//设置选区其实位置
	void	SetStart(int start){Start=start;}
	//设置选区结束位置
	void    SetEnd(int end){End=end;}
};
//操纵字符串的类
class FString
{
	//要操纵的字符串
	char*	Str;
	//撤销所用的结构体
	set<Undo> undo;
	int Openum;
	//字符串缓冲区大小
	int		BufferSize;
	//当前已存储字符长度
	int		Length;
	//当前字符位置
	int		Cur;
	//覆盖标志
	bool	OvrFlag;
	//当前选中区域
	Select  Sel;

	char *SelChar;
	int  SelLength;

	char *Word;
	int	 WordLength;

	IntArray Line;
	//检查目标字符串是否同源字符串的第N个位置后的字符串匹配
	bool stricmpn(char *str,int start,bool icmp);
	//获得当前行的起始位置
	int  GetCurLineStart();
	//扩大缓冲区
	void	Inflate();
public:
	FString();
	~FString();
	//删除当前字符
	void	Delete(bool=true);
	//删除前一个字符
	void	DeletePrev();
	//删除选中区域字符
	void	DeleteSel(bool=true);

	//清空当前选区
	void	EmptySel(){Sel.Empty();}
	//查找与Str相匹配的字符串,并将结果存储在pos中,num为匹配的字符串个数
	void	Find(char* str,int &num,IntArray &pos);
	//从当前字符处开始查找下一个匹配的字符,并将结果存于pos中
	bool	FindNext(char* str,int &pos,bool icmp);
	//从当前字符出开始查找前一个匹配的字符,并将结果存于pos中
	bool	FindPrev(char* str,int &pos,bool icmp);

	//取得当前字符
	char	GetChar(int index);
	//取得指定行列处的字符
	char	GetChar(int line,int column);
	//获取总长度
	int		GetLength(){return Length;}
	//获得当前行号
	int		GetLine();
	//获得行起始位置
	int     GetLineStart(int line);
	//获得当前光标位置
	int		GetCur(){return Cur;}
	//获得pos所处列号
	int		GetColumn(int pos);
	//获得pos所处的行号
	int		GetLine(int pos);
	//获得当前列号
	int		GetColumn();
	int		GetColumnPos();
	//获得当前光标所处列位置
	int		GetPos();
	//获得制定行列的字符所处位置
	int		GetPos(int line,int column);
	//获得总行数
	int		GetTotalLine();
	//获得制定行的字符个数
	int		GetLineWidth(int line);
	//获得最宽行的字符个数
	int		GetMaxLineWidth();
	//获得缓冲区总字符数
	int		GetTotalByte();

	//插入一个字符串到缓冲区
	void	Insert(char	*str,bool=true);
	//插入一个字符到缓冲区
	void	Insert(char c,bool=true);
	//初始化缓冲区
	void	InitBuffer()
	{
		Length=Cur=0;
		undo.empty();
		Sel.Empty();
		Openum=0;
		Line.Clear();
		Line.Add(0);
		Line.Add(Length);
	}
	//检查第line行第column列字符是否在选区中
	bool    IsInSelection(int line,int column);
	//检查选区是否为空
	bool	IsSelEmpty(){return Sel.IsEmpty();}

	//将当前位置移至缓冲区末尾
	void	MoveToEnd();
	//将当前位置移至缓冲区开始
	void	MoveToStart();

	//将当前位置移至指定行
	bool	MoveToLine(int line);
	//将当前位置前移一个字符
	bool	MoveToNext();
	//将当前位置移至下一行
	bool	MoveToNextLine();
	//将当前位置后移一个字符
	bool	MoveToPrevious();
	//将当前位置移至上一行
	bool	MoveToPreviousLine();
	//将当前位置移至指定位置
	bool	MoveToPos(int pos);
	//将当前是位置移至指定行列处
	bool	MoveToPos(int line,int column);

	//将当前选区起始处移至指定位置
	bool	MoveSelStart(int start);
	//将当前选区起始处移至指定行列处
	bool	MoveSelStart(int line,int column);
	//将当前选区结束处移至指定位置
	bool	MoveSelEnd(int line,int column);
	//将当前选区结束移至指定行列处
	bool	MoveSelEnd(int end);
	//获得所选区域大小
	int		GetSelLength(){return Sel.GetLength();}
	//获得当前选区内字符串
	char*	GetSelect();

	//用目标字符串替换缓冲区中所有同源字符串匹配的字符串
	bool	ReplaceAll(char* strSrc,char* strDest,bool icmp);
	//用目标字符串替换缓冲区中指定位置的同源字符串匹配的字符串
	bool	Replace(char* strSrc,char* strDest,int pos,bool icmp);

	//将文件内容读入缓冲区
	void	ReadFile(FILE *fp);
	//将缓冲区中字符存入文件
	bool    SaveFile(char* filename);

	char*	GetSelectWord(int line,int column);
	//选区当前位置处单词
	void	SelectWord();
	//选取指定位置处单词
	void    SelectWord(int line,int column);
	//选区全部
	void	SelectAll()
	{
		MoveSelStart(0);
		MoveSelEnd(Length);
	}
	//撤销
	void Ud();
	//重做
	void Rd();

	bool CanUndo()
	{
		if(Openum>0)
			return true;
		return false;
	}
	bool CanRedo()
	{
		if(Openum<undo.length())
			return true;
		return false;
	}

	void SetLine();
};

#endif

⌨️ 快捷键说明

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