📄 fstring.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 + -